Plan your day without renting your to-do list.
OpenTodo is a free, open-source to-do app you run on your own server or have hosted for you. It works on your phone and your computer, even offline, shares lists with your family or your team, and keeps your data with you.
Try the demo · Install · Docs · Website
Ways to run it: PikaPods (hosted, no server needed) · Docker · Umbrel (coming soon) · Unraid · Home Assistant · Kubernetes (Helm) · Single binary · Android app (APK from GitHub; Google Play and F-Droid coming soon) · all 20 platforms
Type a task the way you say it: Call Sarah next Wed 3pm #work p1 sets the date, time, project and priority. Dictate it, send a page from your phone's share menu, or forward an email. Anything without a home lands in the Inbox. Quick add · Voice · Capture

Today shows what is due and what is still open from earlier. Give tasks an estimate and drag them onto the Day or Week calendar to see whether the day fits. Today · Time blocking

Open one task in Focus and start a Pomodoro, Flowtime or countdown timer. The time is logged to the task. Focus

Share a project with your family or your team as viewer, editor or admin. Assign tasks, comment, and see what changed. Everyone can edit offline. Sharing

- Your data stays yours. Everything lives in one folder on your server. Export it at any time, import it anywhere, and schedule backups, encrypted if you like, to disk, S3 or WebDAV. Backups · Import and export
- Works offline on every device. Each phone and computer keeps a full copy, so the app works with no connection and syncs when it's back. Install the app
- Bring your tasks. Import from Todoist, TickTick, Things, Super Productivity, Microsoft To Do, Apple Reminders and more, with a preview and undo. Import
- Private by design. No telemetry, no analytics, no third-party scripts. Turn on end-to-end encryption and the server holds only ciphertext. Privacy · Encryption
- Bring your own AI, if you want it. Talk to an assistant in the app, or connect the one you already use. Off by default, and every change can be undone. AI
No subscription, no lock-in, no tracking.
| OpenTodo | Todoist | TickTick | Things | Super Productivity | |
|---|---|---|---|---|---|
| Open source | ✅ | ❌ | ❌ | ❌ | ✅ |
| You can host it yourself | ✅ | ❌ | ❌ | ❌ | ✅ |
| Works offline | ✅ | ✅ | ✅ | ✅ | |
| Free, with every feature | ✅ | ❌ | ❌ | ❌ | ✅ |
| No subscription | ✅ | ❌ | ❌ | ✅ | ✅ |
| Optional end-to-end encryption | ✅ | ❌ | ❌ | ❌ | ✅ |
| Shared projects | ✅ | ✅ | ✅ | ❌ | ❌ |
✅ yes · ❌ no ·
-
No install: open the demo and press Try the demo. You get a private copy with sample data, deleted after a few hours.
-
On your machine or server:
docker run -d -p 8080:8080 -v opentodo-data:/data ghcr.io/opentodoapp/opentodo:stable
Open http://localhost:8080. The first visit creates your account. No configuration needed.
git clone https://github.com/OpenTodoApp/OpenTodo.git
cd OpenTodo
docker compose up -dData is kept in the opentodo-data volume. On a server reachable from the internet, finish setup right after starting it, or set OPENTODO_SETUP_CODE=required (the setup code). Behind a reverse proxy, set OPENTODO_BASE_URL=https://todo.example.com.
The image is published for linux/amd64 and linux/arm64. :stable is the latest release, :1.1 follows the 1.1 releases (fixes only), :1.1.1 pins one version, and :latest follows the main branch. Upgrades from any release since 0.1.0 work directly, and nothing you rely on breaks within 1.x (stability). More in Running with Docker.
Download opentodo-<os>-<arch> for Linux, macOS or Windows from the latest release and run it. It serves on port 8080 and keeps its data in ./data. To build from source: make build && ./bin/opentodo (Go 1.26+ and Node 22+).
Nothing is required. Every setting is an optional environment variable with a safe default: see the configuration reference. To add people, keep sign-up closed and send invitation links (managing users).
The self-hosting handbook covers every platform, TLS, backups, upgrades and monitoring. The ot command-line client is in the CLI guide.
The app talks only to your own server: no analytics, crash reporters, update pings or third-party fonts. Two things are on by default and can be turned off: maps for task locations, fetched through your server with no account data, and web push to the service each phone's browser chose. Everything else the server contacts, such as webhooks, backup destinations, single sign-on, email or an AI provider, is something you set up. The audit log never records task content (what is logged).
Read the docs with screenshots and search at open-todo.app/docs, or in the app under Help. The same pages are in docs/.
- Start here: getting started · all user guides
- Self-hosting: handbook · configuration · backups
- Build on it: REST API · CLI · AI and agents · stability
- Project: changelog · roadmap · security
Under the hood
┌───────────────────────── device ─────────────────────────┐ ┌──────────── server ────────────┐
│ React PWA ──► IndexedDB (source of truth) │ │ Go binary + SQLite │
│ │ every edit = field ops {ts, device} │ sync │ ops log (append-only) │
│ └► outbox ──────────────────────────────►├─────►│ fields (last-writer-wins) │
│ ◄─ ops from other devices ◄──────────────┤◄─────┤ REST, CalDAV, email, import │
└──────────────────────────────────────────────────────────┘ │ all write through ops │
└────────────────────────────────┘
- Every change is a small operation that sets one field of one entity, stamped with a hybrid logical clock and the device id.
- Devices apply changes locally first, then sync. The same per-field rule runs everywhere, so all devices agree no matter the order. Notes merge character by character.
- The REST API, CalDAV, email and imports write through the same log, so a task created with
curlshows up on your phone right away. - One Go binary with the web app inside and a single SQLite file. It idles at about 20 MB of memory and runs on a Raspberry Pi.
More in architecture and the sync protocol.
- Star and share. A star on GitHub helps other people find OpenTodo.
- Leave feedback in Discussions or on Discord.
- Report bugs in issues.
- Review a translation. The app speaks seven languages; tell us where a word feels wrong (translating).
- Test it on your devices and report back in the call for testers.
- Answer questions from other people in Discussions and on Discord.
- Sponsor on GitHub Sponsors or buy me a coffee.
To contribute code, read CONTRIBUTING.md: changes that alter behaviour start as an OpenSpec change. Security issues go to the address in SECURITY.md.
Thank you to everyone who keeps OpenTodo going. Supporters who want to be listed appear here.
AGPL-3.0-only. You can run, study, modify and share OpenTodo freely. If you offer a modified version as a network service, you must offer its source under the same license. That is what keeps a self-hosted project from being quietly turned back into a subscription.

