OpenTodo

OpenTodoAppAGPL-3.0活跃维护

自托管的本地优先待办事项管理器,功能对标商业任务应用,数据完全由自己掌控,无需订阅也不会被平台锁定。

Your tasks, your server. An open-source, local-first task manager you can host yourself. Everything you expect from a commercial task app, without the subscription or the lock-in.

v1.3.0发布于 2026-11-09 08:32 UTC360star +29 / 7 天32fork同步于 2026-11-10 06:04 UTC

怎么上手

从 README 代码块原样提取,可能是其中一种安装方式
docker run -d -p 8080:8080 -v opentodo-data:/data ghcr.io/opentodoapp/opentodo:stable
git clone https://github.com/OpenTodoApp/OpenTodo.git
docker compose up -d
硬件要求按 README 关键词推断
有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

这个项目的说明还在生成中,先参考下面「最近发版」和 README。

最近发版

5 个版本v1.3.0
  1. v1.3.0OpenTodo v1.3.0最新正式版2026-11-09 · 2026-11-09 08:32 UTC

    OpenTodo 1.3.0 gives you more control over what goes where. Calendar sync and CalDAV app passwords can now cover only the workspaces and projects you choose. Upcoming lets you drag a task to another day, deferred tasks stay in their own section, and a section's colour tints its header. Shared routines can email the project's members, and Focus can end with a sound that repeats until you notice it. The in-app assistant works with Anthropic again. The web app now checks the signature of every update, in report-only mode for now: if your server sits behind Cloudflare or another proxy that rewrites pages, read Signed updates before upgrading.

    Security

    • The app checks the code of every update, in report-only mode for now. Every build lists the web app's files with a fingerprint of each in app-manifest.json, and release builds sign the list. An installed app checks who signed an update, that it is not older than the version it runs, and every file, then installs it. For now an update that fails the check is still installed: Settings → About shows the result under App code, with the likely cause, What to do and Copy diagnostics. A later release turns refusal on, after real setups have been seen to pass. If your server is behind Cloudflare or another proxy, turn off Rocket Loader, Auto Minify and anything else that rewrites the app's pages or scripts; Signed updates explains how, and go run github.com/OpenTodoApp/opentodo/cmd/websign@latest verify https://your.server/ checks a server (#970).

    Added

    • A Focus end sound you will not miss. Settings → General → Focus → Sound is now Off, Short or Long. Long plays the end-of-session tone louder, once a second, until you click, tap or press a key, or for ten seconds, and vibrates on phones while haptic feedback is on. It is still generated on the device. A synced user_prefs.focus_alert field holds the length; an older device plays the short tone instead (#1005).
    • Email project members in shared routines. A routine of a shared project can email its members: one plain-text message to each member with a verified address, in their own language, with a link to the run and a link of their own to stop emails from that routine. Each message counts toward the routine's and the person's daily email limits; it needs outgoing email and is never offered on a demo (#741).
    • Choose which workspaces and projects sync to a calendar. A calendar sync connection (Tasks from) and a CalDAV app password (Lists) now cover All, Only the chosen workspaces, projects and Inboxes, or All except them, so work tasks stay out of a personal calendar and a phone's Reminders shows only the lists you pick. Narrowing a connection removes the events OpenTodo wrote for tasks that left it, never your own; CalDAV clients drop the lists outside the choice, and writes to them are refused. A task moved between workspace Inboxes now also leaves the old Inbox in calendar apps (#1006).
    • Drag a task to another day in Upcoming. Drop it under that day's heading: its date moves there, its time stays, and the toast offers Undo. On a touch screen, press and hold the task first (#892).

    Changed

    • Connecting Google Calendar says what went wrong. A sign-in that fails now names the cause (the CalDAV API not enabled, the calendar permission unticked, a refused client, a redirect address that is not the page's, a declined or blocked sign-in) with a link to the fix, and the calendar sync guide walks through the Google Cloud console step by step, with a section for each of these errors and for access that ends after 7 days (#1047).
    • Deferred tasks stay in their section. In a project listed by section, a task with a future start date or parked in Someday no longer leaves for one Later group
  2. v1.2.0OpenTodo v1.2.02026-11-08 · 2026-11-08 11:10 UTC
    查看更新说明

    OpenTodo 1.2.0 makes capturing and finishing tasks quicker. A reminder notification now has a Done button, quick add wraps long titles and takes notes while you add (Shift+Enter, or the notes button on a phone), and the phone's add sheet stays open so you can add several tasks in a row. A task's subtasks can now run one at a time, a task's menu adds a task right below it or under it, and dragging sideways chooses whether a dropped task becomes a subtask. The Android app gets its own store listing for F-Droid, and the iPhone app is on its way to TestFlight.

    Upgrade notes

    • Replace the image or the binary and restart. No migration and no new mandatory variable since 1.1.1. One new synced field, task.flow_mode (subtasks one at a time); a 1.1 device ignores it and shows every subtask as available.
    • Update every device that shares an account so a task's "one at a time" setting is respected everywhere.

    Added

    • Subtasks one at a time. A task with two subtasks or more has One at a time above them on its page: only the first open subtask (with everything under it) is available, and the others wait their turn in Today, Next, filters and for assistants, without setting blockers by hand. Nest it to mix steps in order with steps done together. Through the API and the agent tools it is the task's flow_mode (#1046).
    • Add a task right where it belongs. In a project or the Inbox, a task's menu (right-click, or press and hold on a phone) has Add task below and Add subtask. A line opens exactly where the new task will appear, and it stays open, moving down as you add, so you can write a whole run of steps in place (#1036).
    • The iPhone app is getting ready for TestFlight. CI can now sign the app and upload it to TestFlight without a Mac; a public beta follows once Apple has set up the app, and the App Store after Apple's review. Building it yourself from mobile/ios still works. The author, as copyright holder, allows distributing the iOS app through Apple's App Store and TestFlight. See The iOS app.
    • Write a task's notes while you add it. Press Shift+Enter in quick add, or tap the new notes button in the phone's add sheet, and a Notes field opens under the title; what you write there is saved as the task's notes, links included, and never read as dates or projects (#1035).
    • Long titles wrap in quick add. The box grows onto more lines as you type instead of scrolling sideways, up to five lines, so a long title is easy to read back and edit, on a phone too (#1034).
    • Done on reminder notifications. A reminder notification now offers Done first, then Snooze 10 min and Dismiss, in the Android app and through web push, and completes the task like the app does: a repeating task moves to its next occurrence. In the Android app nothing opens; in the browser an open tab of the app completes it, or the app opens to do so. Works offline and with end-to-end encryption (#967, thanks @kiwikern).

    Changed

    • Drag a task to the level you want. Between two rows of a project or the Inbox, a task now keeps its level while you drag straight up or down, and moving sideways by an indent nests it deeper or brings it out. The drop line starts at that level, so a top-level task can finally go between a long subtree and the next task (#1037).
    • Keep adding from the phone's add sheet. After you add a task with the + button, the sheet stays open with an empty box and the keyboard up, ready for the next one; tap outside it or swipe it down when you are done (#1038).

    Fixed

    • The digest settings error lists every shipped language. It named only six of the seven languages the server can send, leaving out Simplified Chinese; it now lists them all.

    Install

    • Docker: docker run -d -p 8080:8080 -v opentodo:/data ghcr.io/opentodoapp/opentodo:1.2.0
    • Binary: download opentodo-<os>-<arch>
  3. v1.1.1OpenTodo v1.1.12026-11-07 · 2026-11-07 23:37 UTC
    查看更新说明

    A fix release for Apple Reminders and other CalDAV apps: tasks with a time zone, often set by AI assistants, now show and remind at the right time, and the Inbox list is named in your language. Replace the image or the binary and restart; there is no migration.

    Fixed

    • Tasks with a time zone show the right time in Apple Reminders. A task fixed to a time zone (as tasks created through an AI assistant often are) could show in Apple Reminders at another time marked GMT, with its alarm firing at the wrong time. Over CalDAV such a task is now served at its exact moment in UTC, which every app reads the same way, and a repeating one keeps its zone with a standard time zone definition, also in the calendar feed. Changing the time in Apple Reminders keeps the task's time zone, and syncing it back unchanged changes nothing (#1028).
    • The Inbox list in Apple Reminders and other CalDAV apps is named in your language. It was always "Inbox"; it now uses the word the app shows ("Eingang" in German), from the language chosen in Settings, else the one your calendar app asks for (#1029).

    Install

    • Docker: docker run -d -p 8080:8080 -v opentodo:/data ghcr.io/opentodoapp/opentodo:1.1.1
    • Binary: download opentodo-<os>-<arch> below, then run it (data goes to ./data).
    • Command-line client: ot-<os>-<arch>. Browser extension: opentodo-browser-extension-chrome.zip and opentodo-browser-extension-firefox.zip.

    Verify downloads with sha256sum -c SHA256SUMS. Self-hosting guides: docs/self-hosting.

  4. v1.1.0OpenTodo v1.1.02026-11-07 · 2026-11-07 18:39 UTC
    查看更新说明

    OpenTodo 1.1.0 brings the first part of a new security wave and a batch of fixes from your reports. A device you sign out with Sign out everywhere now deletes its local copy the next time it connects, and sign-in and AI agent limits no longer reset when the server restarts. Long task titles can be shown in full, the iPhone app no longer blurs its top edge, quick add keeps "every other Saturday" when you also say "today", and a repeating task's tracked time starts again with each occurrence.

    Upgrade notes

    • Replace the image or the binary and restart; back up first. Three migrations run at start (0060–0062: the audit log's hash chain if you skipped 0.24.0, revoked sessions, and saved limit windows). There are no down-migrations. One new synced field, user_prefs.full_titles. No new mandatory variable.
    • Update every device that shares an account to 1.1. A repeat rule that only 1.1 can express (for example "every 2 weeks on Saturday" on a task due on another day) shows as text on a 1.0 device, and completing the task there ends the series. Rules 1.0 can read are still stored in their 1.0 form.
    • APIs and automations keep their 1.0 meaning. MCP's tracked_minutes, the routine tracked condition and the filter term tracked still count all of a task's time; the new tracked_minutes_occurrence field and the tracked occurrence filter term give the current occurrence of a repeating task.
    • Behind Pomerium or Google Cloud Run, point health checks at /api/v1/health; the 1.1 phone apps use it automatically.

    Security

    • Rate limits and AI agent limits survive a restart. Sign-in attempts, the account lockout, the other per-address and per-account limits, the AI agent write limits, the device relay's calls and the email sending limits are kept in the server's database as well as in memory. Restarting or upgrading the server no longer gives someone guessing passwords, or an agent that used its day's budget, a fresh start. Checks still run in memory and cost the same. Keys are stored as salted hashes, never as addresses or emails.
    • A revoked device removes its local copy. After Sign out everywhere, or when an admin deactivates or deletes an account, each of its devices removes its tasks, its unsynced changes and its encryption key the next time it connects, and shows "This device was signed out and its data was removed." The server proves the revocation with a key only that device holds, so a forged answer removes nothing. A password change or reset still only signs the other devices out, and a device that never connects again keeps its copy.

    Added

    • Show full task titles. A new switch in Settings → Appearance wraps long task titles onto as many lines as they need in lists, on board cards and in Today, instead of cutting them with an ellipsis after two lines (one on a phone). Off by default; it follows your account to every device (#998).
    • The health check is also served at /api/v1/health. Pomerium and Google Cloud Run answer /healthz themselves, so behind them the mobile apps said the address was not an OpenTodo server. The Android and iOS apps now check /api/v1/health first and fall back to /healthz for older servers; point an uptime monitor behind such a proxy at the new route. /healthz is unchanged (GitHub issue 1000).

    Fixed

    • A repeating task's tracked time starts again with each occurrence. Completing a repeating task, or skipping a habit, carried its tracked time over to the next date, so the next occurrence started with the old total against its estimate. Rows and the Time tab now count only the current occurrence's entries, and the Time tab adds All occurrences with every entry's sum. What scripts, assistants, routines and saved views read keeps its 1.0 meaning, every entry of the task: the assistant's tracked_minutes, the routine condition on tracked time and the tracked filter terms. The current occurrence is added alongside, a
  5. v1.0.0OpenTodo v1.0.02026-11-07 · 2026-11-07 05:59 UTC
    查看更新说明

    OpenTodo 1.0. From this release on, OpenTodo keeps the promises in Stability and compatibility: the API, the sync protocol, the export format and the upgrade path stay compatible within 1.x, and every release upgrades from every earlier one. 1.0 adds no feature. It is the release where the trust work of the last months comes together: a published threat model, how we verify it and the documented limits, with the hardening they called for (0.23.0 and 0.24.0); an accessibility statement against WCAG 2.2 AA (partial conformance: keyboard and 200% zoom are tested on every core screen, screen-reader passes are still to come); and performance budgets for a 10,000-task account that pass every night. Getting those budgets to pass made long lists much faster: completing a task in a 2,000-task project on a phone now takes about 100 ms instead of over 200, note search stays quick right after a first sync, and a sync no longer stalls while the database tidies its log.

    Upgrade notes

    • Replace the image or the binary and restart. No migration and no new synced field since 0.24.0, and no new mandatory variable. Any release from 0.1.0 on upgrades directly to 1.0.0, with no version in between (upgrades); back up first, read the upgrade notes of the releases you skip for settings that changed, and upgrade the server before the devices.
    • The server checkpoints its database log in the background. SQLite's write-ahead log (opentodo.db-wal) may now grow to about 16 MB during bursts of writes before it is copied back, and is trimmed when it passes 64 MB; nothing to configure.
    • Release candidates: 1.0.0-rc.1 testers can upgrade in place.

    Changed

    • Completing tasks in a long list is faster, above all on phones. A long list now lets the browser skip whole blocks of about 25 rows far from the screen, instead of deciding for each of 2,000 rows on every frame and every tap; screen readers still find every row in its one list. A completed row now leaves the screen by itself when its animation ends, so the list is drawn once per completion instead of twice. In the 2,000-task project of a 10,000-task account on a slowed phone, completing a task now responds in about 100 ms instead of about 220 ms.
    • Lists, counts and the app badge follow each change instead of starting over. After completing, editing or syncing a task, the list, its groups, the progress and blocked marks, the flow of a project in sequence, Today's closed list, the sidebar's counts and the app badge are now worked out from the tasks that changed rather than from every task, and give exactly what working everything out again gives.
    • Searching notes right after a first sync no longer stalls. The first keys typed into the note search on a phone could wait a quarter of a second while the app finished writing the sync's activity and built its search index; both now run in short pieces between keystrokes, and preparing a note for search is about twice as fast.
    • A sync no longer waits while the database tidies its log. Each time SQLite's write-ahead log reached about 4 MB, the write that filled it also copied the log back into the database before it could answer, and took two to three times as long. A background job now does that copy about a second after changes, beside the writes, and truncates the log once it passes 64 MB. In the 10,000-task account, the slowest pushes of 100 changes dropped from about 47 ms to about 24 ms on a development machine. Durability is unchanged.
    • Less work after completing a task in a long project. After each completion the app no longer counts

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    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

    How it works

    1. Capture

    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

    2. Plan your day

    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

    3. Focus

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

    4. Share

    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

    Highlights

    • 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.

    Explore all features →

    How it compares

    OpenTodoTodoistTickTickThingsSuper 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 · ⚠️ partly, or not documented. Todoist and TickTick have a free plan with limits; Things is a one-time purchase per device type. Based on each product's public information as of November 2026. If an entry is wrong, open an issue with a source.

    Full comparisons →

    Install

    Try it in 30 seconds

    • 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.

    Docker Compose

    git clone https://github.com/OpenTodoApp/OpenTodo.git
    cd OpenTodo
    docker compose up -d
    

    Data 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.

    Single binary

    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+).

    Configuration

    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.

    Privacy

    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).

    Documentation

    Read the docs with screenshots and search at open-todo.app/docs, or in the app under Help. The same pages are in docs/.

    ┌───────────────────────── 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 curl shows 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.

    Help without coding

    1. Star and share. A star on GitHub helps other people find OpenTodo.
    2. Leave feedback in Discussions or on Discord.
    3. Report bugs in issues.
    4. Review a translation. The app speaks seven languages; tell us where a word feels wrong (translating).
    5. Test it on your devices and report back in the call for testers.
    6. Answer questions from other people in Discussions and on Discord.
    7. 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.

    Supporters

    Thank you to everyone who keeps OpenTodo going. Supporters who want to be listed appear here.

    Star History

    License

    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.