github pixari/OpenTodo v0.9.0
OpenTodo v0.9.0

4 hours ago

OpenTodo 0.9.0 is about the time you spend in a task, not only the list of them. Time tracking and a Focus timer log where the hours go, the new Plan view lays out the next two weeks against your day length, and Close the day wraps up today in one batch. Tasks remember where they came from (a page, an email, a GitHub, GitLab, Jira or Linear issue), and assigned GitHub and GitLab issues can arrive as tasks by themselves. Everyday editing got calmer: press g and pause to see where you can go, type # or @ for suggestions, click a title to edit it in place, and read the task panel as four short lines with a When editor in plain words.

Upgrade notes

  • One migration, no new environment variables. Replace the image or the binary and restart; migration 0039 (issue connections) runs on start. There are no down-migrations, so back up first.
  • Sync is additive: new fields (task.origin, view.on_drop, the time_entry entity, user_prefs.day_start, row_detail, favourites and the focus_* settings, and closed_at and tomorrow_note on the review row) are ignored by older apps. Upgrade the server before the devices, as for every release. A task's origin, a time entry's note and the line for tomorrow are encrypted for end-to-end encrypted accounts.
  • Issue import is off until the server owner turns it on; it then makes requests only to the hosts users enter.
  • A click on a task's title now edits it in place on desktop. Settings → General → Keyboard → Click a task to brings back opening the panel on that device.

Security

  • Release binaries and the image are built with Go 1.27.3, which fixes GO-2026-6809 (crypto/x509 trusted compromised intermediate certificates; OpenTodo reaches it through TLS connections such as outgoing email).

Added

  • A spotlight after g. Pause after pressing g and a small card opens in the middle of the screen: it shows g +, waits for the second key as long as you need, and lists every key that can follow there, grouped into views, calendar, review and planning, and tools. Press one, or click it, to go; Esc, the close button, a click outside or a key that is not listed cancels. Typing g t quickly never shows it. (Keyboard shortcuts)

  • # and @ suggest as you type. In quick add and in a task's title, typing # or @ opens a list of your projects or labels under the field, narrowed on any word of the name; arrows move, Enter or Tab picks, Esc closes. When nothing has that name, the last entry creates it. #Home/Docs picks Docs under Home, a #name that matches no project says so in a grey chip instead of staying silently in the title, and a new label reads New label “urgent”. (Quick add)

  • Edit a task where it is. Click a task's title in a list (or press F2) to edit it in place, with its date, priority, labels and project in a quiet bar under it; Enter or a click away saves, Esc cancels, Shift+Enter or the arrow opens the panel. Enter on a selected task, touch screens and narrow windows open the panel as before, and Settings → General → Keyboard → Click a task to brings back the old click on this device. (Tasks and projects)

  • GitHub and GitLab issues as tasks. Connect a GitHub or GitLab account (github.com, gitlab.com or your own instance) with a personal access token in Settings → Integrations → Issues, and the open issues assigned to you, optionally only in some repositories or with some labels, become tasks in the project you choose. They follow the issue: completed when it closes, reopened when it reopens, renamed when it is renamed, while your own edits stand until the issue changes the same thing again; nothing is ever written back. The server owner turns it on (off by default); tokens stay on the server outside the database and its backups and are never shown again; every request goes only to the host you entered, with no redirects followed, and the private-network rule of webhooks applies. Not available for accounts with end-to-end encryption, and refused on the demo. ot issues list|sync and the MCP resource opentodo://integrations/issues show the connections without secrets. No new dependency or environment variable; the server binary grows by about 205 KB and the app's main bundle by about 3.6 KB gzipped (2.3 KB per translation, 3 KB of help). See Issue import.

  • Boards that re-plan what you drop on them. Give a column of a board of filters a rule in Arrange → Rule (add or remove labels, set the priority, the date to today, tomorrow, next week or none, Someday, a project and section, complete or reopen), then drag a card onto it, or select a card and press Shift+→ / Shift+←, to apply the rule as one change with Undo. A bolt marks a column with a rule; a task that still does not match the column's filter stays shown there, marked Not matching, until you leave the board. New board now offers an empty board or the Eisenhower matrix: four filters by priority and date (Urgent and important, Important, not urgent, Urgent, not important, Neither), each with its rule, on a board pinned to Favourites. Rules sync as one additive view.on_drop field, work offline, and are in the views API and the export. (Saved views)

  • Plan the next two weeks. A fourth Calendar mode, Plan (g Shift+C, or Day | Week | Month | Plan in the calendar's header), shows the next 14 days as columns, seven to a row, each with its tasks (time, estimate, priority) and a capacity bar against your day length that counts task estimates, busy meetings from subscribed calendars (overlaps once) and the coming occurrences of repeating tasks, drawn dimmed and read-only. Drag a task onto another day or move it with the arrows; it keeps its time. Choose 7, 14 or 21 days in the page's menu, remembered per device; on a phone the days are listed vertically. Works offline; nothing new is synced.

  • Close the day. A short end-of-day step at the end of Today, on the Loop home's Review move, in the command palette and with g Shift+D: see how the day went (planned, done as Statistics counts it, today's focus), decide once per unfinished task (Tomorrow by default, a day you pick, Someday, or keep it in Today; t p y h on the selected task) and apply it all as one batch that Undo or Ctrl+Z takes back in one step, then leave a line for tomorrow, shown at the top of the next Daily check. Today and the sidebar's Review entry then say Day closed with the time. The personal review record gains two additive fields, closed_at and tomorrow_note; the note is encrypted for an encrypted account.

  • Focus. One task and a large timer at /focus (g Shift+F, Focus on this task in the task panel's menu, or the command palette), taking the first open task of today's focus and moving on to the next when you complete it. Choose Pomodoro (work and breaks with a long break every fourth session, optionally starting each phase on its own), Flowtime (counts up until you stop) or Countdown (a length you pick each time); Space starts and pauses, Enter completes, b takes a break, n moves on. Each stretch of work is logged as a time entry on the task, breaks never are, and when time cannot be logged the timer works the same and writes nothing. An optional break reminder after 90 minutes of continuous work, a generated tone and a notification when a session ends in a background tab are in Settings → General → Focus; the settings sync as additive user_prefs fields, the running timer stays on the device. (Focus)

  • Time tracking. Start and stop a timer on any task (y in a list, the row's actions, the task panel), see it run in the sidebar footer or the phone bar, log past work by hand in the panel's new Time tab, and compare tracked with estimated on rows (35m / 1h), in Today's header and in Statistics. One entry runs at a time, also across devices that started offline. Filter with tracked and tracked > 1h, add spent time in quick add with 30m/2h, export a CSV from Statistics or with ot time export, and use ot time start|stop|log|list, the /api/v1/time-entries routes and the MCP read tool list_time_entries. (Time tracking)

  • Quick add understands ordinal weekdays. second Monday, the 3rd Friday of November, last Friday and every 2nd monday of the month now work, in all six quick-add languages (am zweiten Montag, le 2e lundi de novembre, secondo lunedì, tercer viernes de noviembre, segunda segunda-feira) and in ot add --natural. Before, Dentist second Monday became Dentist second due next Monday. A bare count before a weekday (every 2 Mondays) is not a rule and now stays whole in the title in every language, without a date. (Quick add syntax)

  • My day starts at. If you work past midnight, set when your day really ends in Settings → General → Date and time (midnight by default, or a whole hour up to 06:00). Until then the app still treats it as the previous day: Today keeps its tasks out of Overdue, a task completed at 01:30 counts for the day before in Completed, Statistics, the Loop pulse and the weekly digest, habits keep their streak, and the Daily check and today's focus last until your day start. Due dates and reminders do not change, and the preference syncs to your devices as an additive user_prefs.day_start field. (Dates and times)

  • Tasks remember where they came from. A page saved from the share sheet, the bookmarklet or the extension keeps its link as the task's origin: a chip on the row (quiet in Calm rows) and an Origin chip in the panel open it in a new tab, and a GitHub, GitLab, Jira or Linear issue link reads as the issue (o/r#7, ENG-123), recognised on the device without opening it. Email to task records the Message-ID, the Linear importer the issue identifier, and the Todoist, Things and TickTick importers their source id. Filter with origin, no origin and origin: github; find a task in the command palette by its issue id; set it with ot add --origin-url, origin on the REST API or origin_url in the MCP write tools. The origin travels in exports and webhooks, is encrypted whole for end-to-end encrypted accounts, and syncs as one additive task.origin field. (Capturing pages, Filters)

  • A Discord server for questions and conversation. The welcome note, Settings → About (a new Community row, found by searching "discord" or "community") and the Feedback and support guide link to the OpenTodo Discord server. It is a plain link that opens in a new tab; the app loads nothing from Discord. (Feedback and support)

Changed

  • The task panel reads as four lines. Where (project › section, the parent, the origin), When (the date in the list's words, evening, repeat, the deadline with its countdown, the start, reminders), How (priority, estimate, labels) and Who (assignee, what it waits for, what waits for it). Each part opens its editor next to it with Clear and Done, and clicking it again closes it; Add lists the rest grouped the same way, with Choose files… and Add a link…. A long title wraps to two lines, long notes show eight lines and Show all, and the comment box rests as one line until you click it. (The task panel)
  • A When editor you can read. Choose Today, Tomorrow, This weekend, Next week or No date in one click, each with the date it means; type fri and see "→ Fri 23 Oct" before you press Enter; pick a day in the calendar that is always there; Add time suggests 09:00, 13:00 and 18:00, and the time zone is one quiet line once there is a time. Start offers Today, Tomorrow, Next week and Someday, Deadline offers End of week, End of month and In 2 weeks, and Repeat starts from Every day, Every weekday, Every week on Thursday, Every month on day 22 and Every year, with Custom… for any rule. (Dates and times)
  • A task's title understands what you type into it. Editing a title in the panel or in the list reads only what you typed in this edit: add tomorrow p1 and the task is due tomorrow with priority 1, the title stays as it was, and Undo takes it all back. An old "Review may report" never gains a May date. (Quick add)
  • A compact shortcut sheet. ? shows one line per shortcut, what it does on the left and its keys on the right, with "then" between the keys of a two-step shortcut and "or" between alternatives, in three columns on a wide screen; keys never wrap or run into the text, in the sheet and in Help. (Keyboard shortcuts)
  • A calmer selection. The selected task is marked by a bar at its left edge and a faint tint instead of a grey box with a ring, and a click on any empty part of the list lets go of it and closes the panel.
  • Settings explain themselves in one line. Every settings card, row and notice now says what it does in one line, and a card whose guide says more ends that line with Learn more, which opens the matching guide section beside Settings without leaving the page; the longer explanations moved there, and safety warnings keep a one-line pointer on the card. On the demo, the note at the top of a settings page is one line naming what is disabled, with Learn more to the demo guide. A few long row names became shorter (Sign out here, Week starts on, Invite new people, Changes to my tasks, Small changes without review), and the Focus card's Help row became its Learn more. (Interface guide)
  • Calm task rows. Rows now leave out what the view already says (no "Today" in Today, where the time stands alone; no date under an Upcoming day; no "evening" under This Evening; no Someday chip in Someday; no chip for the label whose view is open), colour only what needs attention (the circle for P1 and P2, the date when it is overdue or timed for today), show labels as coloured dots with the first name and "+2", and move subtask progress, comments and attachments to a faint group at the end of the row that brightens on hover. Settings → Appearance → Rows has Detailed, which restores the previous row with every chip and colour; the choice syncs to your devices like Density. (Work from the list, Settings)
  • Less between you and your first task. The quick add no longer shows a Help link under it; the page header's Help opens the view's guide, which links the quick-add syntax. On the demo the banner is one line at every width, with the sandbox's lifetime from the server, Learn more, Details with the full text, and Dismiss for the browser session; the write-limit notice takes its place while it applies. The first-visit steps leave the Inbox and become a start guide over it, a centred card on a computer and a bottom sheet on a phone, closed for good in any way you close it and shown again from Settings → Account → How you work. Empty views say one sentence and offer one action, with the key in the button's tooltip. (Your first task, Getting started)
  • The Loop home reads in one second. The Open Loops home screen now opens with a capture field, shows the five moves on one rail with a large count each and exactly one move lit as your next move with the page's only button, puts today's focus below with how many of the chosen tasks are done, and says when the loop is closed. A new Loop pulse under the focus shows tasks done this week against last week, how many of the items you caught in the last fourteen days have left the Inbox, the age of the oldest Inbox item and completions per day, all computed on the device with the same definitions as Statistics; nothing is stored or sent. (Open Loops)

Fixed

  • The task panel's conversation no longer jumps. Switching between Comments, Activity, History and Time scrolled the whole panel; the tabs now stay pinned under the header while you read a long thread, switching keeps your place, and comments are spaced as one thread instead of leaving room for hidden buttons.
  • Do on toggles. Clicking the date of a task with its editor open closed and reopened it in the same moment; a second click now closes it.
  • The latest image reports which build it is. Images built from the main branch reported their version as main; they now report dev+<commit>, the commit they were built from, in Settings → About, /healthz and the log. (Docker, #160)
  • No "Open menu" bubble over the menu on phones. Tapping an icon button (such as the menu button) no longer leaves its tooltip on screen, where it covered the first sidebar entry; tooltips still appear on hover and when you move to a button with the keyboard. (#169)

Install

  • Docker: docker run -d -p 8080:8080 -v opentodo:/data ghcr.io/pixari/opentodo:0.9.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.zip.

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

Don't miss a new OpenTodo release

NewReleases is sending notifications on new releases.