OpenTodo 0.4.0

Released on

OpenTodo 0.4.0 makes the app yours to look at and easier to move into. Tasks can have a deadline, separate from the day you plan to work on them, and can wait for a start date, in Someday or for This Evening. Pick light, dark or system mode and one of eight colour themes, and set your own date format, clock and first day of the week. Settings are regrouped into clear sections. Import takes Todoist, Things, TickTick and Linear exports as they are, with a switch guide for each. With the assistant on, an Ask box and built-in skills (plan my week, triage my inbox, break this down) do common jobs. A setup token can protect a fresh public server, and the assistant's Test connection now checks what is on screen.

Upgrade notes

  • Migration 0030 (how often each assistant skill ran, per user and month; no conversation content) is applied automatically at startup. Back up /data before upgrading: there are no down-migrations. No new environment variables are required; OPENTODO_SETUP_TOKEN is optional.
  • Sync: new user_prefs fields (date_format, time_format, week_start, theme_mode, theme_accent), the task fields deadline, start and evening, and the reminder kind deadline are additive; older clients ignore them.
  • Image tags. The release publishes ghcr.io/pixari/opentodo:0.4.0 and :0.4 for linux/amd64 and linux/arm64 (:latest follows main). The Coolify template now follows :0.4; if you use :0.3, change the tag in Edit Compose file and click Deploy.
  • Binary size stays at about 23 MB.

Breaking

  • POST /api/v1/me/assistant/test no longer answers 409 no_own_provider. A member can now test a provider before saving it; with no provider chosen or saved, the route answers 400 invalid_input. Migration: scripts that checked for no_own_provider should check for invalid_input.

Changed

  • New addresses. The website and the documentation moved to open-todo.app (docs at open-todo.app/docs) and the public demo to demo.open-todo.app. In-app Help links, the generated docs' canonical URLs and the Coolify template now point there.
  • Dates and times in your format. Settings → Preferences → Date and time sets the date format (day-month, month-day or ISO), a 12- or 24-hour clock and the first day of the week, once for all your devices; each follows the browser until you choose. Task rows, headings, task details, reminders, comments, history, the Week view and push notifications follow it. Due dates and reminders get new date and time fields that accept what you type in your format (3/11, 2026-11-03, tomorrow, 3pm) and have a calendar you can use from the keyboard. Quick add reads numeric dates in your date format while its own order is automatic, and "next week" starts on your first day of the week. The preferences sync like your other data, work offline and are included in the JSON export. (Settings, Tasks and projects)
  • Settings: grouped into fourteen sections with a clearer layout. Settings opens on your profile card and the sections grouped under You, App, Data and connections and, for the owner and admins, Server. Security, Encryption, Activity, Preferences, Projects, Backups and Access policies now have their own pages. Every panel is a card that leads with its state (for example whether two-factor authentication is on and how many recovery codes are left), with settings as rows, forms that open from a button, and confirmations that say what will be lost. Old links such as /settings/general still work. (Settings)

Added

  • Start dates, Someday and This Evening. A task's new When row (and Shift+N) defers it until a start date: it leaves Today, Upcoming and the counts, waits in its project's Later group, and appears in Today with a Started chip on the day. Someday (n, or someday in quick add) parks a task in the new Someday view (g then o) and clears its due date. This Evening (Shift+E, or tonight in quick add) lists a task below the day's tasks in Today. The new Anytime view (g then n) lists what has no date at all. A due date or deadline that has come always shows a task in Today. Filters gain someday, deferred, evening, no start and start <cmp> <date>; recurring tasks move the start date with the due date; CalDAV carries both as X-OPENTODO-START and X-OPENTODO-EVENING; Things and CSV imports keep them. Sync: two new task fields, start and evening. (Tasks and projects, Views)
  • Deadlines. A task can have a deadline, the day it must be finished by, separate from the day you plan to work on it. Set it in the task panel's new Deadline row, with d on a selected task, or in quick add with deadline friday (Frist, échéance, scadenza, fecha límite, prazo in the other languages). Rows show a countdown (3d, Today, 2d over) that turns amber in the last week and red on the day, after it, or when the task is planned after its deadline. Today lists tasks whose deadline is today or past; Upcoming lists undated tasks under their deadline day. Filters gain deadline <= 3 days and no deadline, reminders can fire before the deadline, recurring tasks move the deadline with the due date, CalDAV serves it as DUE (with the due date as DTSTART), and imports from Todoist, Things, CSV and JSON keep it. Sync: one new task field, deadline (YYYY-MM-DD), and a reminder kind deadline. (Tasks and projects, Filters, Reminders)
  • Themes and dark mode on demand. Settings → Preferences → Appearance sets the mode (System, Light or Dark) and one of eight colour themes (Emerald, Blue, Indigo, Violet, Rose, Orange, Teal, Graphite) for buttons, links, the focus ring and selection. Both follow your account to every device, also offline, apply at once without a reload, and the app opens in your theme without a flash. Priority, warning and error colours and your project and label colours keep their meaning in every theme, and every theme passes the contrast checks in light and dark. The installed app's title bar follows the theme. Sync: two new user_prefs fields, theme_mode and theme_accent. (Settings)
  • Assistant skills and the Ask box. With the assistant on, Today and a new Ask screen (sidebar, or g then k) show an Ask OpenTodo box with example cards, and the assistant panel gains a Skills menu: Turn an idea into a project, Plan my week (within your working day), Weekly review, Triage my inbox and Break this down (also in a task's menu). Each skill uses only the tools it needs, and everything it proposes is reviewed and undoable as before. Pasted notes are kept apart and treated as material, never as instructions. The same skills are served as MCP prompts. While the assistant is off, members see nothing new and the owner one dismissible line. New route GET /api/v1/assistant/skills; turns accept an optional skill and workday. (AI assistant, MCP)
  • Switch from Todoist, Things, TickTick or Linear. Import accepts each app's own export as it is: a Todoist backup ZIP (or one project's CSV), a copy of the Things 3 database, a TickTick CSV backup and a Linear CSV export. Projects, sections or headings, subtasks and checklists, labels, priorities, due dates (Todoist's in six languages, even without a year), recurring tasks, reminders and completed items carry over; projects that were boards open as boards; Linear issues assigned to you stay yours. What OpenTodo cannot hold yet (comments' authors, estimates in points) is named in the preview. Each app has a switch guide. (Switch from Todoist, Things, TickTick, Linear, Import formats)
  • Site bundle for the website. Every release attaches opentodo-site-bundle-<version>.tar.gz: the documentation website, product screenshots, the colour tokens as plain CSS, the icon set as an SVG sprite, the changelog as JSON and a manifest (schema 1) with the version, the import formats it supports and a few measured facts. Every CI run uploads the same bundle as an artefact, so the website can preview unreleased docs. Layout version 1 is described in the bundle's README.md; paths change only in a release that says so, and stay for one more release. make site-bundle builds it locally. Screenshots for the website now live in docs/screenshots/site/, and CI skips the Go, cross-compile and layout jobs for documentation-only pull requests.
  • Server facts in the site bundle. The bundle manifest now lists the image platforms, port, data folder, database, licence and export format (architectures, port, dataDir, database, license, exportFormat, exportFormatVersion), read from the release workflow, the Dockerfile, the export route and LICENSE, so the website can show them for the version it describes. Its icon sprite also carries the Lucide icons the website uses beyond the app's own (web/src/ui/icons/site-icons.json), which the app itself never loads.
  • A setup token protects a fresh server. With OPENTODO_SETUP_TOKEN set, creating the first account requires that token, so a public instance cannot be claimed by whoever opens the URL first. The Coolify template sets it to a secret Coolify generates; copy it from the service's Environment Variables into the setup screen. Unset, nothing changes. (Coolify, Docker)
  • ot mcp: MCP for assistants that only speak stdio. The command-line client bridges an assistant's stdio MCP connection to your server's /mcp endpoint, so clients without HTTP transport can use OpenTodo too. It refuses a token that can make changes unless you pass --allow-full-token, and never weakens --read-only or OPENTODO_READ_ONLY. Thanks to @adity982 for the contribution. (AI assistants (MCP))
  • Icons, menus and a smart picker. Every emoji and symbol that stood in for an icon is now a line icon from one consistent set (Lucide, bundled, no new download). Menus have icons, groups and shortcut hints and work fully with the keyboard (arrow keys, Home and End, typing a letter). The label and assignee pickers show the labels and people you use most on this device first, and find them by the start of any word or by letters in order, ignoring case and accents (“cafe” finds “Café”). Your pick history stays on the device and is cleared when you sign out. (Design system)
  • New visual foundation. Design tokens for colour, type, spacing, radius, elevation and motion in light and dark, the bundled Inter typeface (54 KB, served by your own server, never a font CDN), and refreshed buttons and inputs, keeping OpenTodo's emerald and slate look. Every text colour meets WCAG AA contrast in both themes, checked automatically. Contributors get a component workbench (Storybook, development only) with accessibility and visual-regression checks. (Design system)

Fixed

  • Test connection tests what is on screen. In the assistant settings, Test connection used the last saved settings, so a model id typed but not yet saved was reported as "enter a model id first", and a replaced key was never checked. The owner's and the member's tests now use the provider, model, base URL, key and private-endpoint switch on screen, saved or not, with the same checks as saving, and never save anything. Members can test before saving their own provider. A result disappears when you change what it tested. (AI assistant, API)
  • The assistant says what an encrypted account can do. On an account with end-to-end encryption, the assistant panel, the Ask screen and Settings → AI → Assistant now link to Settings → Encryption, where encryption can be turned off to use the assistant, instead of only saying it is unavailable. (AI assistant)
  • Test notifications prove delivery. Settings → Notifications → Send test notification used to show a notification from the page and always say "sent", even when reminders could never reach the device. It now sends a real push through your server and the push service, shows it even while the app is open, and says Received on this device only when the device confirms it, otherwise accepted, not seen with the operating-system settings to check. A new Delivery check lists each step push needs on the device (permission, service worker, subscription, push service, last test) with a fix for each problem. New route POST /api/v1/push/test (session or full token, 5 per 10 minutes). (Notifications, API)

Downloads and checksums for v0.4.0

Your to-do list, on your own server.

Try the demo in your browser. When you like it, install OpenTodo on your server and import your tasks.

OpenTodo is free and open source, with no paid tier. If it helps you, a star on GitHub helps other people find it, and a coffee helps keep it going.

Buy me a coffee