OpenTodo 0.11.0 is Precision, a new look for the whole app. Every task is one line with its date, project and labels in aligned columns, pages fill one quiet surface, and colour is kept for what needs you. Today tells you in a sentence what stands out, and each part of that sentence opens what it names. Tasks open as a page, the Inbox keeps the selected task beside the list, Filters become Views with display options, All projects is a table that says which project needs a look, and quick add and Ctrl/⌘+K share one palette. The assistant, Settings, boards, the timeline, the review screens and the phone layout follow the same look, and larger text sizes no longer break the layout. Also new: delivery channels (ntfy, Pushover, Gotify, a signed webhook), a filter builder that needs no query syntax, and a Claude Code plugin for your own server.
Upgrade notes
- One migration, no new environment variables. Replace the image or the binary and restart; migration 0046 (delivery channels) runs on start. There are no down-migrations, so back up first. Upgrade the server before the devices, as for every release.
- Hiding the briefing adds one additive sync field (
briefingin the user's preferences); an older server refuses it as an unknown field and the device keeps its choice. No migration. - Delivery channels add one migration (
0046_notification_channels:notification_channels,notification_deliveries) and a secrets file,<data>/secrets/notification-channels.json, that backups leave out like the other secrets: after a restore, people enter their channel tokens again. No new environment variable. Channels are on by default; the owner can turn them off in Settings → Notifications.
Added
- OpenTodo in Claude Code. A Claude Code plugin connects Claude to your own server's MCP endpoint:
/plugin marketplace add pixari/opentodo-claude, then/plugin install opentodo@opentodo, and enter your server address and an agent token (kept in your system's credential store). Its skills teach Claude to read before changing, use ids rather than titles, show a plan before changing several tasks, pass your time zone and never follow instructions written inside tasks, and add/opentodo:todayand/opentodo:plan-week. The same MCP skill ships with each release asopentodo-mcp-skill.zip. (Use OpenTodo from Claude Code) - Build a filter without typing. The Filter view and saved filters show the query as conditions that read in words (Label is errand, Due on or before tomorrow, Priority is P1), in groups headed All of these or Any of these, with Not on any condition or group and a live count of matching tasks. + Condition picks what to filter on and its value with the app's own pickers. The query text stays under the builder and follows every change both ways, so saved filters still store that text; the Builder button folds it away, remembered per device. (Build a filter without typing)
- Delivery channels: ntfy, Pushover, Gotify and a webhook. Settings → Notifications → Delivery channels sends your reminders, tasks assigned to you, mentions, tasks that are ready to start and task page replies to ntfy, Pushover, Gotify, or any address as a signed JSON message (Apprise and Home Assistant read it as is), up to five channels each with their own events and Send test. Messages say only what happened unless you include task titles, and never name a task with end-to-end encryption. Failed messages are retried for about a day; a channel that keeps failing turns itself off. (#271; Delivery channels)
Changed
- A new, quieter look: Precision, part 1 of 3. The colours are a flatter, darker slate with emerald kept for state and the main action; the sidebar sits on the plain background instead of a tinted one. Lists and controls use 13 px text (notes and help stay at 15 px), rows are 36 px (44 px on touch, 32 px when compact), corners are tighter, and only menus, popovers and dialogs keep a shadow. Every colour pair still meets its contrast minimum in light, dark, high contrast and all eight accents. The layout and the rows follow in the next two parts. (Design system)
- Precision, part 2 of 3: one surface, two kinds of header. Pages fill one content surface beside the sidebar instead of a narrow column, so wide screens are used. Today and Upcoming keep a large title with the date beside it; every other page has a compact one-line header with its title, its details and its actions. Every header starts with a sidebar toggle (also
[). The current page in the sidebar is marked with a quiet grey instead of green, and the sidebar's tooltips teach their shortcuts ("Go to Today · G then T"). (Interface guide) - Precision, part 3 of 3: one line per task. On a wide list every task is one line: the title on the left, and its date, project, labels (or deadline, or sub-task progress), estimate and assignee in aligned columns on the right, so you can scan down a list. As the list narrows (for example with a task open beside it) the columns at the end give way, and a narrow list keeps the title with its details underneath. The repeat mark and the comment and attachment counts sit beside the title. Group headers become quiet filled bars in normal case, the selected and hovered rows use quiet grey surfaces, and a project that hides its completed tasks says how many at the end of the list, with Show. (Interface guide)
- Precision for the board and the timeline. Board columns are bands that run the full height of the page, every column ends with Add a task, and Add a section is a dashed column after the last one. A card shows its name on up to two lines and then one row with the date, estimate and subtask progress (each with its icon), the labels, and the assignee at the end. On the timeline, rows are as tall as the list's and sections are its group bars. Long bars carry the task's name, short ones say how long they are, and a task past its deadline or due day turns red and says how late it is ("2 days late"). Deadlines are diamonds, and today is a green line with Today above it. Week columns read as ranges, such as "20–26 Oct". (Sections and boards, Project timeline)
- Precision: Today tells you what stands out. Under the title, Today says in a sentence what matters: "Three things matter today. Renew the passport is 2 days late, Monday is already full, and Mia answered about Boiler." It names late tasks (in red), a day that is already full (today past your day length, or the first full day of the week, in amber) and replies waiting for you; when nothing stands out it says so with what is planned, and an empty Today reads All done for today. with how tomorrow starts. Upcoming's sentence counts the next seven days, names the full ones and says how tomorrow starts, and the Daily check opens with Today's. Your device works it out from your own tasks, offline, in all six languages; no AI writes it. (The briefing)
- The briefing opens what it names, and can be hidden. Each part of the sentence on Today and Upcoming is a quiet link: a task's name opens the task, "2 tasks are late" selects exactly those tasks in Today's list (ready for the selection bar), "Monday is already full" opens Upcoming at Monday, and replies open your notifications. Hide briefing in the menu of Today or Upcoming hides the sentence on all your devices, keeping the title and the date; Show briefing brings it back. On a narrow Projects table, where the reason beside a project's health is left out, the health word shows it in a tooltip, or under the word on a tap. (The briefing, All projects)
- Precision: quick add and the command bar as one palette. On a computer, Ctrl/⌘+K opens a wider box near the top of the screen. Its results sit under quiet headings, each command shows its keys at the end of its row (G then U), the selected task is named in the field, and a strip at the bottom names the keys and the
+,>and?characters. The mode buttons now show only on phones and touch screens. In Add mode, quick add lists what it understood as rows: When, Project, Label, Priority and Estimate, each with its value or how to set it. Click a row, or move to it with ↓ and press Tab, to edit it in the line. Shift+Enter adds the task and opens it. When the box was opened with q, Esc closes it. On a phone, the add sheet shows plain chips for what it understood, with buttons to start a date, priority, label, estimate or project, and a send button. The same line still gives the same task everywhere. (Quick add) - Precision on the phone. Today and Upcoming keep their large title, the date and the sentence about your day on the page, under a bar that holds only the menu and the page's actions. Every task is one line: its title, and at its end its date, or else the deadline, the assignee's picture or the project's dot; a time comes before the title. The bar at the bottom is Inbox, Today, Upcoming and Search, the current one in white or black rather than green; the menu button at the top left opens the drawer that More used to open. A task's page lists its facts as one card: what is set, Do and Deadline, and More properties for the rest. (Interface guide)
- Filters are now Views, with display options. The sidebar group, the overview and the search box say Views; the page that builds a query is New view (still g f), and a view's header reads Views › name. Under it, one toolbar shows the view's conditions in words (Label is waiting) with Filter; the filter button opens the builder and the query in a panel under it, and the new Display options button sets the layout (List or Board, one column per group), Group by, Order by, whether completed tasks are listed, and which properties the rows show (date, project, labels, estimate, assignee, deadline, start, origin). Each choice is saved to the view and syncs. Save as view names the view in place, keeping the conditions and results in sight, and saves the display options with it. Views live at
/views/…; old/view/…and/filterlinks still work. (Saved views) - The assistant gets a page of its own. Assistant in the sidebar (g then k, until now the Ask screen) is the conversation itself: it greets you by name, puts the message box in the middle and offers three skills to start from (Plan my week, Triage my inbox, Turn an idea into a project); once you ask, the answers fill a centred column and the box moves to the foot, with History and New chat at the top. The message box looks like the comment box on a task, with Skills and the context the question carries (Context: Today, Context: 1 selected task) under the text and a round Send button. Proposed changes come as one card: "3 of 4 selected", each change in words at the right, and Apply 3 changes. Shift+I and Ask on Today still open the assistant beside the page you are on, now in the same style. (Ask, review and undo)
- All projects as a table that says where to look. The Projects page (g then Shift+P) lists your projects as a table, sub-projects still under their parent. Each project shows its health in one word: Late (a deadline has passed), Overdue (open tasks are past their due date), Quiet (nothing changed for a week) or On track. Each also shows its progress, open tasks, next due date (red when it has passed), the people it is shared with, and when it last changed. Health is worked out on your device from those plain rules, offline too, and every device shows the same word. Select a column's header to sort by it. Arrow keys and j / k move between projects, ← and → fold and unfold, and on a phone each project keeps its name and its health. Archived projects move from the bottom of the page to an Archived tab. (All projects)
- Precision: a flat Settings page. From 1024 px Settings has the same compact header as other pages, with a breadcrumb (Settings › Notifications). Beside the page sits a narrow pane with the search field (press
/to jump to it), the groups and one row per section, and the page starts with its title and a line saying what it holds. Sections are no longer cards: each is a small heading, its line, and rows between hairlines. On or off, working or failing now read as a small coloured dot and a word instead of a coloured pill; roles and token scopes keep their labels. Switches are smaller (32 × 18 px, still 44 px to tap on a touch screen), selects draw their own chevron, and controls in a settings row are 32 px tall. Phones keep the list as its own page. The README, the Claude plugin's CLI skill,otand two server error messages now point to Settings → Integrations → AI assistants instead of the old Settings → AI. (Interface guide) - New drawings for empty pages. The six empty and finished states (Inbox zero, an empty Today and Upcoming, a new project, Done for today, the empty Trash) are redrawn as one family. Each sits inside the open loop of OpenTodo's mark, and one small accent leaves through its opening: a paper plane, the sun, a kite, a sprout's leaf, the moon, a drifting leaf. They stand out better in the dark theme and in every colour theme. (Design system)
- A click anywhere on a task row opens it. The title still edits in place or opens the task, as Settings → General → Click a task to says; a click on the rest of the row (its padding, the gaps, the space at its end) now always opens the task, where it used to do nothing. The checkbox, the chevron, the links and the row's actions keep their own clicks, and a drag never opens anything. (Tasks and projects)
- Everything you can click shows the hand. Buttons, menu items, tabs, sidebar entries, suggestions and task rows show the pointing hand with a mouse; disabled controls and draggable calendar blocks keep their own cursor.
- Empty lists without a second "Add a task". An empty Inbox, Today, Upcoming, Anytime, Someday, project, label or place shows its sentence (and its link, such as Open Upcoming) but no button: the quick-add field right above it is the way to add, and q still focuses it. Empty board columns and calendar days keep their Add a task, which adds to that column or day.
- Planned tasks without a project wait at the end of the Inbox. The line under the Inbox title ("3 planned tasks without a project"), which opened Filter, becomes a folded group at the end of the list, Planned, no project, with its count. Open it to see and act on those tasks in place; your device remembers whether it's open. They still don't count as Inbox tasks: the Inbox can reach zero with the group below it, and Process the Inbox leaves them out. Open as filter on the group's header lists them in Filter as before. (Today and Upcoming)
- Settings → Workspaces, clearer. The list of workspaces sits beside the open one, which is marked and named in a header with its member count; on a phone a workspace opens as its own page with Back. Its settings are in tabs: General, Members, Groups and Invites. Members show their avatars. A group opens to rename it, add people by searching their name and remove them, and deleting a group first names the projects that lose access through it. Invite links can be for an admin (owner only) and last 1 hour, 1 day, 7 days or 30 days. (Workspaces)
- Tasks open as a page. Opening a task now shows it full page instead of in a panel beside the list: the top says where it lives and where it sits in the list ("4 / 12"), j and k open the next and previous task, and Esc goes back to the same spot in the list with the task selected. The task's facts sit in a column beside the notes under Schedule, Details, Labels and Project, and one you have not set reads as what sets it ("Set a deadline"), so nothing hides behind an Add menu. Subtasks show their progress, and the comment box has a round Send button. Process the Inbox still opens a task beside its card; on a phone a task opens as a page with Back in the bar. Older links with
?task=still work. (The task page) - Precision: the Inbox keeps the task beside it. On a screen at least 1024 px wide, the Inbox shows the selected task next to the list, ready to edit. Move with j and k, or click a row, and the details follow. Enter opens the task as its page, and Esc clears the selection. With nothing selected, the right side reads No task selected and says how to go on. Each Inbox row now says where its task came from and when, such as "From email · 3 d ago", "From example.org", "From a calendar app" or "Added by an AI assistant". That line replaces the source link at the end of the row; the task itself still has the link. Process is the Inbox's main button, also P, and the header says how many tasks are left to sort ("4 to sort"). Narrower screens keep the plain list. (Process the Inbox)
- Precision for the screens that were not redrawn. Selected rows in the Trash, Labels, Updates, calendar lanes and the timeline, and the current item of the workspace list, time list and the sidebar's footer, are grey like a selected task row instead of green; the bar that says "3 selected" is grey too, and ticked rows keep their green. The weekly review's step header is no longer tinted green. On a phone, a Trash row keeps its name readable and puts Restore and Delete permanently under it, and the Updates feed lines up its project names. The week agenda shows one quiet "Nothing planned." line per empty day instead of seven green buttons, as Plan does.
Fixed
- A larger text size no longer breaks the layout. With the browser's text size above the default, the app could hide the sidebar while still laying out for it (between about 770 and 960 px wide), or open a task into a hidden pane beside the Inbox. The app now switches layouts at the same points as its stylesheet. On a phone with a large text size, All projects puts the health under the project name so the name stays readable, and the Inbox's Process keeps only its icon.
- Bulk labels pick the right way round. Picking a label in the bulk label picker before its checkmarks appeared could add a label every ticked task already had; it now removes it, as the checkmark would have said.
- A project's Completed group reads its count right. Screen readers heard "2 open tasks" for the two completed tasks in a project's Completed group; they now hear "2 completed tasks".
- Timeline notes stay clear. "2 days late" and "1 day" after a short bar no longer run across the today line or off the end of the timeline. (Project timeline)
- Close the day closes the day you started. Opened at 23:59 and finished after midnight, it used to switch to the new day midway: the figures changed, "Tomorrow" moved tasks two days out and the evening was never marked closed. The day is now fixed when the screen opens and stored with the close (an additive
closed_dayfield on the review row; older closes fall back to their time). Carry over takes the unfinished tasks one at a time with their whole title, adds Done already (d), has no checkbox that completes a task by accident, and is applied when you move on, so its step shows a check instead of a count. The last step is now A note for tomorrow morning, with a preview. (Rhythms)
Install
- Docker:
docker run -d -p 8080:8080 -v opentodo:/data ghcr.io/pixari/opentodo:0.11.0 - 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.zipandopentodo-browser-extension-firefox.zip.
Verify downloads with sha256sum -c SHA256SUMS. Self-hosting guides: docs/self-hosting.