Skip to content

Releases: OpenTodoApp/OpenTodo

OpenTodo v0.16.0

Choose a tag to compare

@github-actions github-actions released this 27 Oct 03:44
b2e3384

OpenTodo 0.16.0 is a security release that finishes the internal audit: adding someone to a project or workspace by email now asks them first, unless you already share something with them, and the answer no longer reveals whether an address has an account. Background work now runs when it is due: reminders at their exact time, digests at the chosen hour, deliveries right away. Please read the upgrade note for API clients.

Upgrade notes

  • One migration (0049_member_invitations: the table of membership invitations). No new variable. Back up first, as for every release.
  • API clients that add people by email must handle 202. POST /api/v1/projects/{id}/members and POST /api/v1/workspaces/{id}/members with an email now answer 202 {"pending": true} when the person shares no project or workspace with you yet, and also for an address without an account, which used to answer 404 user_not_found. The person is not a member until they accept, so a script that shares a project and then expects the member list to include the person must wait for the acceptance (or add someone it already shares a project with, which still answers 201). Adding by account id inside a created workspace is unchanged. (Membership invitations)

Security

  • Adding someone by email asks them first. The owner or an admin of any project could add any account on the server by its address, and the project appeared in that person's sidebar without their say; the answer also told whether the address had an account. Someone who already shares a project or workspace with you is still added at once. Anyone else gets an invitation in their notifications and in Settings → Account → Invitations (and by email when outgoing email is on) and becomes a member only by accepting it; an address without an account gets the same answer and the same "waiting for an answer" row, so the share dialog no longer tells which addresses have accounts. Declining keeps the same project from asking again for 14 days. Found in an internal audit. (Roles and assignments)

Changed

  • Background jobs run when their work is due instead of on fixed timers. On a self-hosted server:

    • Web push reminders go out at their firing time instead of up to 30 seconds later.
    • Weekly digests go out at the chosen hour instead of up to 5 minutes later.
    • Calendar fetches, calendar sync, issue polls and webhook retries run at their scheduled time.
    • Queued webhook and notification channel deliveries are sent at once.
    • The audit log, the Trash, old read notifications and the delivery logs are cleaned when an item passes its retention, instead of hourly or daily.
    • An idle server no longer checks the delivery queues every second.

    Self-hosted servers and hosts now run the same job definitions. (Architecture)

  • The share dialog and a workspace's members list show who has not answered yet. Invitations are listed under Waiting for an answer with their role, and can be cancelled. (Roles and assignments, Workspaces)

  • The add-member routes answer 202 for invitations. See the upgrade note above. (API)


Install

  • Docker: docker run -d -p 8080:8080 -v opentodo:/data ghcr.io/opentodoapp/opentodo:0.16.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.zip and opentodo-browser-extension-firefox.zip.

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

OpenTodo v0.15.0

Choose a tag to compare

@github-actions github-actions released this 27 Oct 00:39
c50e290

OpenTodo 0.15.0 moves the project to its own home, the OpenTodoApp organization on GitHub, with the image now at ghcr.io/opentodoapp/opentodo. The Android app signs in behind a login page (Pangolin, Authelia, Authentik, Cloudflare Access) and with single sign-on, inside the app, and targets Android 16 as Google Play requires. ot vault now also syncs TaskNotes task notes, the task panel shows a task's properties first and its notes in full, and a round of fixes for project counts, drag highlights, tab rows and task order.

Upgrade notes

  • Replace the image or the binary and restart. No migrations. Upgrade the server before the devices, as for every release.
  • New image name: ghcr.io/opentodoapp/opentodo. The old name ghcr.io/pixari/opentodo still receives every release through 0.16.x, so nothing breaks; switch your compose file or template when convenient. (Docker)
  • Android app behind a login page: see the new section in the Android app guide for what works and which paths a bypass needs if you prefer one.

Added

  • ot vault syncs TaskNotes task notes. Link the folder where the Obsidian plugin TaskNotes keeps your task notes with ot vault tasknotes <folder>, and every task note becomes an OpenTodo task, so it shows in Today, the calendar and your reminders. Status, priority, scheduled and due dates, tags and contexts, the project link, the estimate, recurrence with completed instances, time entries and the note's text sync both ways with the vault's field-by-field merge. The vault reads your TaskNotes settings, so renamed fields, your own statuses and priorities work. Only the keys whose value changed are rewritten, and the note is matched by an opentodo-id key TaskNotes leaves alone. (Markdown vault, #440)

Changed

  • OpenTodo moved to the OpenTodoApp organization, and the image to ghcr.io/opentodoapp/opentodo. The repository is now github.com/OpenTodoApp/OpenTodo (old links redirect), the image ghcr.io/opentodoapp/opentodo with the same tags, and the Helm chart oci://ghcr.io/opentodoapp/charts/opentodo. The old image ghcr.io/pixari/opentodo and chart oci://ghcr.io/pixari/charts/opentodo keep getting every release through 0.16.x and stop being updated with 0.17.0: replace ghcr.io/pixari/opentodo with ghcr.io/opentodoapp/opentodo where you run OpenTodo, nothing else changes. The Go module is now github.com/OpenTodoApp/opentodo (go install github.com/OpenTodoApp/opentodo/cmd/ot@latest). (Docker)
  • The task panel shows a task's properties first and its notes in full below them, without Show all. Long notes no longer push the project, dates, priority and labels out of view: the panel lists them, the subtasks and the attachments first, then the whole note, which grows with the panel's scrolling. On a task page narrower than 1024 px the facts card now sits above the notes too. (#444, The task page)
  • Plainer words in the start guide and How you work. The start guide now says what Open Loops is before asking how much of it you want. The three choices are now called Simple lists, Lists with method hints and Full Open Loops method (they were Lists only, Companion and Open Loops first), the link reads What is Open Loops?, and the offers explain what a context and the Loop home are. Your choice is kept; nothing else changes. (#433, Set up in ten minutes)
  • The Android app targets Android 16 (API level 36), as Google Play now requires. Nothing changes for users: back navigation already used the system's predictive back, and the app already drew edge to edge.

Fixed

  • The Android app signs in behind a login page and with single sign-on (#471). With the server behind a login wall (Pangolin with Pocket ID, Authelia, Authentik, Cloudflare Access, oauth2-proxy…), or with Sign in with …, the sign-in page opened in the phone's browser, so the app never got the session. The sign-in now happens inside the app, with a bar naming the site you are signing in on and a way back to your server; other links still open in the browser. The first-run screen no longer calls such a server "not an OpenTodo server": it says the server is behind a login page and offers to sign in there. Providers that refuse app web views, such as Google, still can't be used in the app; sign in with a password or passkey there. (The Android app)
  • Deleting or archiving a project names the right number of open tasks. Opened right after the project, before its tasks had loaded, the confirmation could say "0 open tasks". The number is now counted when the confirmation opens.
  • The drop highlight no longer stays on a shared project you can only view. Dragging a task over such a project in the sidebar left its ring on after the drag ended.
  • Tab rows no longer show a stray vertical scrollbar. The task panel's Comments, Activity, History and Time row, and every other tab row, drew a small scrollbar at its right end because the selected tab's underline overflowed the row by one pixel. Tab rows now scroll only sideways. (#445)
  • The side panel no longer flickers when you pick the first task after changing lists (#442). After going to another project, the panel showing "No task selected" vanished for a moment and slid in again when you chose a task; it now stays in place and the task simply replaces the empty pane.
  • Tasks added at the same moment keep their order. Tasks created in the same instant could share one position and then show in any order in a manually ordered list; each now goes after the one before it.

Install

  • Docker: docker run -d -p 8080:8080 -v opentodo:/data ghcr.io/opentodoapp/opentodo:0.15.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.zip and opentodo-browser-extension-firefox.zip.

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

OpenTodo v0.14.2

Choose a tag to compare

@github-actions github-actions released this 26 Oct 17:39
03ada7e

OpenTodo 0.14.2 is the second security release of the internal audit; please upgrade. It narrows what the server can reach on its own network (map proxy, private-target switch), keeps one client from using up a hosted tenant's or the demo's limits, tightens single sign-on linking and password reset, and closes attachment quota and cache gaps. The first-run setup code is now off by default: a fresh server can be set up without reading its log; set OPENTODO_SETUP_CODE=required to keep the code.

Upgrade notes

  • The first-run setup code is now off by default. If you relied on it to protect a fresh server reachable from the internet, set OPENTODO_SETUP_CODE=required; OPENTODO_SETUP_TOKEN works as before. Without either, the first person to open a server with no owner becomes its owner: finish setup right after starting it. (The setup code)

Changed

  • The setup code for a new server is opt-in. A fresh server no longer asks for the one-time code from its log: the first person to open it creates the owner account, and the log says so at every start until then. Set the new optional OPENTODO_SETUP_CODE=required to ask for the code again; OPENTODO_SETUP_TOKEN still works and wins. On a server reachable from the internet, finish setup right after starting it, or set OPENTODO_SETUP_CODE=required. (The setup code)

Security

  • Hosted services: the map proxy no longer reaches the operator's network. On a server that hosts several tenants, a tenant's owner could choose a map provider that made the server fetch addresses on the operator's private network or a cloud metadata service. The map proxy of a hosted tenant now reaches only public addresses. Found in an internal audit. (Host mode)
  • The map provider can no longer point your server at your local network. A self-hosted tile or search server on your network keeps working, but only the two hosts you typed may be local: tile, font and sprite addresses that a provider's style names, and redirects, follow the same rules as a webhook. Found in an internal audit. (Maps)
  • "Allow private network targets" no longer opens cloud metadata and link-local addresses. With the switch on, webhooks, notification channels, calendar subscriptions, issue connections and AI providers still reach your LAN and this machine, but never 169.254.0.0/16, fe80::/10, 0.0.0.0/8 or a cloud metadata address. Webhook test sends and redeliveries are limited to 30 per account per hour. Found in an internal audit. (Webhooks)
  • Hosted services: one client can no longer lock a tenant out. The request limit per minute applied to all of a tenant's traffic, signed in or not, so anyone could use it up and every user of that tenant got "too many requests". It now counts each client address separately. Found in an internal audit. (Host mode)
  • Public demo: the sandbox limit can no longer be held by one party. When the demo is full, the oldest sandbox now makes room for a new visitor after 15 minutes even if it is being kept busy, new sandboxes per IPv6 site (/48) are limited together, and the demo creates at most twice its sandbox limit per hour. Found in an internal audit. (Demo instance)
  • Single sign-on links to an existing account only when its address was confirmed. An address nobody confirmed (set without outgoing email) could catch another person's first sign-on. Accounts whose address was confirmed through an emailed link, or that already signed on with the same address, still link at the first sign-on; others sign in with their password once and link the provider in Settings → Account → Security. Found in an internal audit. (Single sign-on)
  • The setup code, when turned on, is asked for from every other machine. With OPENTODO_SETUP_CODE=required, a browser on the local network no longer skips it: behind Docker's port publishing, a NAT or a rootless container, a visitor from the internet could look local. Only a browser on the server itself, connecting directly, skips it. Behind a reverse proxy, a forged leading X-Forwarded-For entry no longer becomes the client's address. Found in an internal audit. (The setup code)
  • "Forgot password?" no longer reveals which addresses have accounts by its response time. The reset email is now sent after the answer. Found in an internal audit.
  • The attachment total can no longer be exceeded. Undoing the removal of a file is now checked against your total, and several uploads at once share it, so neither can store more than the owner allows. Found in an internal audit. (Attachments)
  • Files no longer stay readable in the browser after signing out. Attachments are now checked with the server each time they are shown, and signing out asks the browser to empty its cache for OpenTodo (on https), so the next person on a shared computer cannot open them. Found in an internal audit.
  • Links from encrypted data open only as web links. A task's source link and a link attachment of an encrypted account open only http and https addresses; anything else is shown without a link. Found in an internal audit.

Fixed

  • The Assistant page shows its title on a phone in every language. On a narrow phone, the page's History and New chat buttons took the whole top bar in French, Spanish, Italian, German and Portuguese, leaving no room for the title. Below tablet width the two buttons now show their icons only, and their names stay available to screen readers.

Install

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

OpenTodo v0.14.1

Choose a tag to compare

@github-actions github-actions released this 26 Oct 16:37
01282ac

OpenTodo 0.14.1 is a security release; please upgrade. It fixes the findings of an internal security audit: a shared project could take over another person's private task if its id was known, a saved view or a crafted email or calendar could slow down or crash the server, and an old session could add a new way to sign in without signing in again. It also makes the sync clock follow newer edits, so a device whose clock runs behind no longer loses its own changes, and fixes a long task scrolling the whole page in the side panel.

Upgrade notes

  • Replace the image or the binary and restart. Upgrade the server before the devices, as for every release.
  • Scripts and API clients may need a different token: changing the owner's webhook, maps, MCP and audit settings now needs an admin token, the email-to-task routes refuse read and agent tokens, and adding a passkey, two-factor authentication or a single sign-on link needs a recent sign-in. (HTTP API)
  • One migration (0048_caldav_resources_per_account): the names calendar apps chose for tasks are now kept per account; each existing name is kept for every account that can see its task. No data is rewritten otherwise and no environment variable changes. Replace the image or the binary and restart; there are no down-migrations, so back up first.
  • Ids that two accounts already share stay as they are. Earlier versions could store one id in two places (through the problem fixed below, or when two accounts imported the same export file). The server now reads and writes the oldest copy each person can see, so nothing is lost and nothing needs repair. To check whether your database has such ids, run SELECT entity, entity_id, group_concat(DISTINCT scope_id) FROM scope_fields WHERE entity IN ('project','task','section','field','comment','attachment','time_entry','rule') GROUP BY entity, entity_id HAVING COUNT(DISTINCT scope_id) > 1; with sqlite3 on a copy of <data>/opentodo.db.

Added

  • n8n nodes. A separate package, installed from npm as n8n-nodes-opentodo once it is released (Settings → Community nodes in a self-hosted n8n), adds an OpenTodo node that creates, reads, changes, completes and deletes tasks, with quick-add syntax if you like, and manages projects, labels and comments, also as a tool for n8n's AI Agent. An OpenTodo Trigger starts a workflow when tasks or projects change: it sets up a webhook in your account, checks every delivery's signature and removes the webhook when the workflow is turned off. It needs an API token and no change on the server. (n8n)

Security

  • A shared project can no longer take over a private task. Someone who shared a project with you and knew the id of one of your private tasks (ids appear in task pages, public links, exports and calendar apps) could create a task with that id in the shared project. Your later edits to the private task then reached that project's members, and they could delete it. Every task, project, section, field, comment, attachment, time entry and automation rule id now names one item on the server: such a write is refused like any other write you may not make, and it reveals nothing about your item. Found in an internal audit. (Sync protocol)
  • Calendar apps of different accounts no longer share resource names. One account's calendar app could rename or drop the name another account's app had given a task they both see, which made items vanish or appear twice in the other person's calendar. Found in an internal audit. (CalDAV)
  • A project can only join your own workspaces. Anyone could mark one of their projects as part of a workspace they did not belong to, which stopped the workspace's owner from deleting it. Such a change is now refused, and values written before are ignored. Found in an internal audit.
  • Adding a way to sign in needs a recent sign-in (found in an internal audit). Adding a passkey, setting up an authenticator app or linking a single sign-on account now asks for your password or a code when you last signed in more than ten minutes ago, like creating an API token already did, and doing one of them no longer counts as a recent sign-in. Before, someone with access to a long-open session could add their own passkey, authenticator app or provider account and keep access after a password change. Scripts that enrol with an admin token are unaffected. (Account security)
  • A saved view can no longer take the server down. A signed-in person, including a visitor of a public demo, could save a view with a specially crafted filter query that crashed the server while checking it, stopping it for everyone (on a hosted server, for every tenant). Filter queries are now limited to 4,096 characters and 64 levels of parentheses and !, in the app and on the server; a longer or deeper query is refused with a message like any other mistake in a query. Queries people write, and every query the filter builder makes, are far below both limits. Found in an internal audit. (Filters)
  • Importing a Things database can no longer tie up the server. A specially prepared file uploaded for a Things import could make the server compute values while reading it, keeping a processor busy or using a lot of memory for each preview. The importer now refuses a file whose Things tables compute their values (Things' own databases never do) and any value over 1 MB, before or while reading it; real Things databases import as before. Found in an internal audit. (Import)
  • An import can no longer reach another account's attached file. Importing a ZIP export that named the id of a file attached in someone else's account could link that file into the importing account, letting it be downloaded there. An import now stores each file itself and refuses one whose id already belongs to a stored file the importing account does not have; the row is listed among the import's errors. Found in an internal audit. (Import)
  • Reading your email-to-task settings no longer creates an address. Before, simply opening the settings (or any token, even a read-only one, reading them) created an active address that accepts mail from anyone. Now the address is created when you turn email to task on, and read-only and assistant tokens can neither see nor create it. Addresses that already exist keep working. (Email to task)
  • The owner's security settings need an admin token. Changing whether webhooks may reach private networks, the map providers, the AI assistant (MCP) switches or audit log retention now takes a signed-in session or an admin API token; a full token is refused, as for the other security settings. (API)
  • Adding people to projects and workspaces by email is limited to 30 attempts per account per hour, so the share dialog cannot be used to find out which accounts exist on the server or to push projects at many people, and each person added to a project is recorded in the audit log as project.member_added. (Sharing)
  • A change made on a device whose clock runs slightly behind no longer loses to the older value it replaces. Devices, ot vault and the server now move their clock past every change they receive, so the next edit is always stamped after the value it overwrites. Before, an edit made shortly after receiving a value from a device or server whose clock was a few seconds ahead (too little for the clock correction to catch) could be silently undone by that older value. With end-to-end encryption this could leave a value, such as a task's origin written by the email inbox, in plaintext on the server, because the device's encrypted rewrite lost to it and was never retried. Found in an internal audit. (Sync protocol)
  • An email can no longer stall email to task. Every message in the mailbox is read before it is matched to an account, and the HTML of a specially written message (tags that never end, or links, marks and lists nested thousands deep) took time or memory that grew with the square of its size: a few hundred kilobytes kept the mail poller busy for minutes, a 10 MB message for hours. Reading HTML now takes time in proportion to its size, nesting deeper than 32 levels is flattened, and the text of a tag that never ends is kept as text. Found by fuzzing. (Email to task)
  • A calendar server can no longer tie up calendar sync or subscriptions. A multistatus answer whose text came in many small pieces between comments, or a DURATION with a very long run of digits, took time that grew with the square of its size. Both are linear now, a duration over nine digits per unit or longer than a century is refused, and a huge one no longer wraps around to a negative length. The same applies to CalDAV requests from your own apps. Found by fuzzing. (Calendar feeds, Calendar sync)

Fixed

  • Names with accents or non-Latin letters are no longer cut in the middle of a character. AP...
Read more

OpenTodo v0.14.0

Choose a tag to compare

@github-actions github-actions released this 26 Oct 08:41
f6cab6a

OpenTodo 0.14.0 brings your calendar and your tasks together. Calendar sync connects the calendar you already use, Google Calendar or any CalDAV service such as iCloud, Fastmail or Nextcloud: your dated tasks appear there as events, and moving or deleting an event changes the task. Today can show the day's calendar events above your tasks, so one page gives the whole day. Also: the Calendar remembers the planning list, and fixes for oversized subtask checkboxes on phones, a flicker when switching tasks in the side panel, and the task page's breadcrumb.

Upgrade notes

  • One migration (0047_calendar_sync: connections, calendars and the links between tasks and events) and a secrets file, <data>/secrets/calendar-sync.json, that backups leave out like the other secrets: after a restore, people reconnect their calendars. Replace the image or the binary and restart. Upgrade the server before the devices, as for every release.
  • Calendar sync is off until the owner turns it on in Settings → Integrations → Calendar sync. Google Calendar also needs the owner's own Google OAuth client; the optional OPENTODO_GOOGLE_CLIENT_ID and OPENTODO_GOOGLE_CLIENT_SECRET (or OPENTODO_GOOGLE_CLIENT_SECRET_FILE) set it from the environment. No variable is required. (Calendar sync)
  • Calendar events in Today is a new user preference field. Devices still on 0.13 ignore it until they update. (Sync protocol)

Added

  • Calendar sync, both ways. Connect the calendar you already use, iCloud, Fastmail, Nextcloud, Synology, Radicale or any CalDAV service with an app password, or Google Calendar, and your dated tasks appear there as events in a calendar you choose. Drag an event to another time, stretch it, rename it or delete it, and the task follows; change the task and the event follows. When both changed, the newer change wins. Other calendars of the same account can be shown in Day and Week. The server owner turns it on under Settings → Integrations → Calendar sync and, for Google, sets up an OAuth client there or with the optional OPENTODO_GOOGLE_CLIENT_ID and OPENTODO_GOOGLE_CLIENT_SECRET. Outlook and Microsoft 365 are not supported yet. (Calendar sync)
  • Calendar events in Today. With a subscribed calendar, Show calendar events in Today's menu lists the day's appointments above your tasks: all-day events first, then timed ones in order with their time, calendar colour and location. Free events are an outline, finished ones are dimmed, and a click shows the details as in Day and Week. Off until you turn it on; the choice follows you to your other devices. (Calendar events in Today)

Changed

  • The Calendar remembers the planning list. Left open, Plan from a list opens again the next time you come to Day, Week, Month or Plan on a wide screen, until you close it. (Place tasks on the calendar)

Fixed

  • Subtask checkboxes are the right size on phones and tablets. On a touch screen the circle beside each subtask grew to the size of the finger target and looked huge. The circle now stays small and only the area you can tap is larger.
  • The side panel no longer flickers when you switch tasks. With tasks opening in a side panel, moving to another task emptied the panel for a moment while the next one loaded, so the list beside it widened and narrowed again. The panel now keeps the previous task until the next one is ready. (The task panel)
  • The task page's breadcrumb leads back. Opened from Today, Upcoming, a label or a view, a task's page now starts its breadcrumb with that list's name as a link, which returns to the list with the task selected, like Esc. Before, it started with the task's project, or with the list's name as plain text when the task had no project. (The task page)

Install

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

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

OpenTodo v0.13.0

Choose a tag to compare

@github-actions github-actions released this 25 Oct 18:04
b980ddb

OpenTodo 0.13.0 is about how you look at your lists. Open tasks in a side panel beside every list instead of on a page, give rows a Detailed layout with the parent task, all labels and a priority you can read without colour, and group and order projects and labels like saved views. Settings opens as short lists of pages, the Calendar's Plan from a list takes a label or a saved view, and a block's top edge now moves its start. Also: the Home Assistant integration and add-on, import into a chosen workspace, and fixes for the planning list, Undo notices, task details and section order.

Upgrade notes

  • No migrations, no new environment variables. Replace the image or the binary and restart. Upgrade the server before the devices, as for every release.
  • Display options and row layouts are new fields on labels, views, project preferences and user preferences. Devices still on 0.12 ignore them until they update, and show their lists as before. (Sync protocol)
  • Settings pages have new addresses, such as /settings/integrations/webhooks. Old addresses, bookmarks and anchors keep working, and the single sign-on return address is updated by itself. (Settings)

Added

  • Home Assistant integration. A separate integration, installed from HACS, shows the Inbox, Today and your projects as Home Assistant to-do lists you can change (with quick-add syntax), counts Today, Earlier and the Inbox, puts dated tasks on a calendar, and fires opentodo_task_* events through a signed webhook it sets up itself; Assist can add to and tick off the lists. It needs a Full access token and no change on the server. (Home Assistant)

  • Home Assistant add-on. On Home Assistant OS or a Supervised installation, add the repository https://github.com/pixari/opentodo-homeassistant-addons, install OpenTodo and open it on port 8080. Options for the base URL, a setup token, open sign-up, trusted proxies and the log level; the data is in the add-on's own folder and in Home Assistant's backups. Images for amd64 and aarch64; each OpenTodo release becomes an add-on update within a day. Home Assistant Container installs run the Docker image instead. (Home Assistant add-on)

  • Import into a workspace. The Import screen has a Workspace choice when you have more than one: it starts with the workspace you have open, everything the import creates goes there, projects and labels are matched by name only inside it, and the preview names it ("12 new projects into Work"). An OpenTodo export keeps its own workspaces unless you pick one. From the terminal, the new ot import <file> --workspace Work runs an import and waits for it (--dry-run shows the preview). (Import formats, #349)

  • Change a task's start from the top of its calendar block. In Day and Week, drag the top edge of a block to start earlier or later while the end stays; the estimate follows, as one change with Undo. Alt+Shift+↑ / ↓ does the same from the keyboard. (Place tasks on the calendar, #355)

  • Open tasks in a side panel. Under Settings → Appearance → Task details, Open tasks can be In a side panel instead of As a page. From 1024 px wide, every list (Inbox, Today, Upcoming, projects, labels, views, Next, Waiting and the others) then keeps the task beside it with its notes, subtasks, attachments and comments. A click on a task, or moving to it with the keyboard, shows it there, and Enter on the task shown opens its page. The panel closes only with its × (or Esc inside it) and stays closed until you open a task again. Drag its left edge to resize it; each device remembers its width. The choice follows your account; phones keep the page, and the page stays the default. (The task page, #365)

Changed

  • Detailed rows, and priority you can tell without colour. Rows can now be Detailed: the title, the parent task, then one line with the date and time, the priority as bars and P1 to P3, the deadline, start, project, estimate, assignee and as many labels as fit, then "+2". Pick it for every list in Settings › Appearance › Task rows, or for one view, project or label in its Display options. One-line rows keep their layout and now show the priority as bars after the title too. (One-line and detailed rows, #367)
  • Group and order projects and labels. A project's list and a label's page now have Display options, like saved views: group by section, due date, priority or label (a label page by project, due date or priority), or not at all, and order by manual order, priority, due date, creation date, deadline or title. Each project and label keeps its own choice on all your devices; in a shared project it is yours only. Dragging a task, or moving it with Alt+↑ / ↓, while another order is shown switches back to manual order. Saved views can now order by deadline too. (Group and order a list, #368)
  • Shorter Settings pages. Account, Appearance, General, Notifications, Capture, Integrations, People and Server now open as a short list of their pages, each row with its state in a word ("Webhooks · 2", "Calendar feeds · Off"), and each page has its own address, such as /settings/integrations/webhooks. The language, date and time and the calendar grid moved from General to a new section, Language and region. Settings search and the command palette open the page that holds a setting, scrolled to it and briefly highlighted. Old links, bookmarks and anchors still open the right page. (Settings)
  • Plan from a label or a saved view. In the Calendar, Plan from a list can now list the tasks of a label or a saved view as well as the Inbox, tasks without a date, earlier tasks or a project. Label this week's tasks "week" and plan from that label. Type in the picker to find the source; this device remembers it. (Place tasks on the calendar, #369)

Fixed

  • A link can be attached to a task that has no attachments yet. The paperclip beside a task's notes and Attach in the task's menu went straight to the file picker, so a link could only be added once the task had a file. The paperclip now offers Choose files… and Add a link…, and the task's menu has Add a link… too. (Attachments, #342)
  • The planning list stays open across the Calendar. After Plan from a list, moving to the previous or next day, week or month, or switching between Day, Week, Month and Plan, closed the list. It now stays open until you close it or leave the Calendar, and Month offers it too. (Place tasks on the calendar, #350)
  • Placing a task from the planning list works with the keyboard. After s on a task in Plan from a list, focus stayed in the list, so Enter started the placement over at its first time and Esc closed the list. The calendar now takes the keys: the arrows move the task, Enter places it and focus moves to the next task in the list, Esc cancels and keeps the list open. (Place tasks on the calendar, #352)
  • The notice after Undo leaves on its own. After Undo in the notice at the bottom of the screen, the "Undone." notice could stay until the page was reloaded. It now leaves after five seconds, and every Undo notice has a close button and closes with Esc while it has focus. (Bulk actions, #348)
  • A task's details show its planned block. After placing a task on the calendar, its details showed only the start time, under Do, next to a Start row that is a different thing (the date a task becomes available). Do now reads like the calendar block, for example Today 12:00–13:30 for a 90-minute estimate. (Place tasks on the calendar, #356)
  • A section in second place can move up. In a project where every task has a section, as after an import, Move up on the second section was disabled as if it were already first, because the list assumed a "No section" group at the top. Move up and Move down now follow the sections themselves. ([Sections and boards](https://github.com/pixari/opentodo/blob/v0.13.0/do...
Read more

OpenTodo v0.12.0

Choose a tag to compare

@github-actions github-actions released this 24 Oct 22:42
ebe8dcb

OpenTodo 0.12.0 builds on Precision. Press → on a task to see its details under the row, without leaving the list. Mention a whole group with @Adults, and filter by workspace with workspace: Home. The comment box gets buttons for mentions and formatting, ot gets shell completion, and end-to-end encrypted accounts can use the assistant from their own device with their own key, when the owner allows it. The briefing links each full day, has a switch in Settings, and the rest of the app now holds up at larger text sizes.

Upgrade notes

  • No migrations, no new environment variables. Replace the image or the binary and restart. Upgrade the server before the devices, as for every release.
  • The assistant for encrypted accounts is off until the owner turns it on in Settings → Assistant. While it is on, the page's Content-Security-Policy lets the app connect to the provider addresses the owner allowed, for every account on the server; turn it off to keep the policy as before. (Assistant on encrypted accounts)
  • Group mentions are stored as group:<id> in the existing mention lists. Devices still on 0.11 ignore those entries until they update; the server notifies the group either way. (Sync protocol)

Added

  • Mention and format from the comment box. The comment box has an @ button that starts a mention (people first, then the workspace's groups), and on a computer a Formatting button that shows a row of bold, italic, link, lists and more. Comments are still stored as Markdown, so the API, ot, MCP and exports see them as before. (Comments and activity)
  • Shell completion for ot. ot completion bash, ot completion zsh or ot completion fish prints a script; install it once and Tab completes commands, flags and fixed values, plus project, label and workspace names, open task ids with their titles, and #project and @label in ot add, read from your profile's server. Offline it still completes commands and flags and prints nothing into your prompt. (Shell completion)
  • Mention a group. In a comment or a task's notes, @Adults mentions a group of the task's workspace: the mention list offers the groups after the people, the group shows as a chip with a group icon, and everyone in the group who can see the task gets one notification naming the group. Nobody outside the project is told, and someone mentioned twice is notified once. (Workspaces)
  • Filter by workspace. workspace: Home (or workspace: "Side projects") matches the tasks of that workspace, and a filter that names a workspace looks at every workspace, so (workspace: Home | workspace: Work) & due = this week lists both from anywhere; the filter builder has a Workspace condition. (Filters)
  • The assistant on encrypted accounts, from your own device. The server cannot read an end-to-end encrypted account, so it never runs the assistant for one. When the owner turns on Let encrypted accounts use the assistant from their own device (off by default), the panel sets the assistant up on this device instead: you choose a provider the owner allows (Anthropic, OpenAI, Google Gemini or a model server such as Ollama at an address the owner listed), a model and your own key, which stays in this browser and is deleted at sign-out. Your device reads its own decrypted tasks and calls the provider directly; the server sees no content and no key, and usage is not reported. Proposals, review, undo and skills work as before. The page's Content-Security-Policy lets the app reach exactly the providers the owner allowed. (Assistant on encrypted accounts)
  • Expand a row in place. Select a task and press →, choose Show details in the row's actions, or tap the arrow at the end of a row on a phone: the task's notes (with Show more), its dates, project, priority, estimate, labels, assignee and what it waits for, its subtasks and its comment and attachment counts open under the row, without leaving the list. Tick subtasks right there; ← or Esc closes the details again. One row at a time, in lists and views (not on boards). (Expand a row)

Changed

  • App store templates match what was submitted. OpenTodo 0.11.0 is submitted to the Umbrel, TrueNAS, CasaOS, Dokploy, Easypanel, Cosmos and Portainer stores. The TrueNAS app's default Web UI port is now 30536 (30530 was taken by another app in the catalogue), and the Dokploy template names a release such as 0.11.0 instead of stable, as Dokploy's catalogue requires; to update a Dokploy service, change its image tag and redeploy. On Umbrel, add OpenTodo to Apple's Calendar or Reminders with the full CalDAV address, because automatic discovery stops at Umbrel's login. (TrueNAS, Dokploy, Umbrel)
  • The briefing links each full day, and has a switch in Settings. When Upcoming says "Friday and Monday are already full", Friday and Monday are now separate links, each opening Upcoming at that day, in every language. Settings → General → Briefing has a Show the briefing switch, the same choice as Hide briefing in the menu of Today and Upcoming, on all your devices. "2 tasks are late" still selects those tasks, ready for the selection bar; Esc clears them. (The briefing)

Fixed

  • Inbox zero is one quiet line when planned tasks are below it. With every task that has no project already scheduled, the Inbox showed the large Inbox zero picture above the "Planned, no project" group and its count; it now shows only the sentence there, and keeps the picture for an Inbox with nothing below it. (Today and Upcoming)

  • The bulk label picker shows the right checkmarks. Opened with L straight after ticking tasks, the label picker showed no checkmarks until it was closed, and none changed after a pick; it now marks the labels every ticked task has as soon as it has read them, and updates after each pick.

  • Larger text sizes on the rest of the app. With the browser's text size at 20 or 24 px, the date picker's month no longer runs off a phone, the Share dialog's email field gets its own line, Settings keeps your name readable beside your role, the command bar's mode buttons wrap instead of overlapping, Statistics shows its figures in one column on a phone, and the Inbox's Process on a phone keeps only its icon so the title fits. Display mode, dialogs and the wide task panel now switch layouts at the same points as the rest of the app.


Install

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

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

OpenTodo v0.11.0

Choose a tag to compare

@github-actions github-actions released this 24 Oct 10:22
a64bf41

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 (briefing in 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:today and /opentodo:plan-week. The same MCP skill ships with each release as opentodo-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 els...
Read more

OpenTodo v0.10.1

Choose a tag to compare

@github-actions github-actions released this 23 Oct 09:36
514dda6

A documentation fix for 0.10.0: nothing changes in the app or the server, and there is no migration.

Fixed

  • The documentation's Workspaces card shows its picture. The docs index linked a thumbnail for the Workspaces guide that 0.10.0 did not ship; the release now carries it, and the docs check refuses a card without its light and dark thumbnails. (Workspaces)

Install

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

OpenTodo v0.10.0

Choose a tag to compare

@github-actions github-actions released this 23 Oct 07:36
4eee0f4

OpenTodo 0.10.0 is a calmer app with room for more people. The interface was redrawn: one quiet task row, a new mark and sidebar, softer colours, motion that marks a completed task, and a phone layout with swipe actions and a task sheet. Workspaces and groups keep work and home apart and share a project with a team in one step. Automation rules let a task change itself, notes and comments share one editor with tables, images, mentions and reactions, and a task page hands one task to someone without an account. Tasks can have a location on a map, your account can live as a Markdown vault for Obsidian, the importer reads six more apps, and the owner can give the server its own name and logo. An early Android app is in the repository, not yet in the stores.

Upgrade notes

  • Six migrations, no mandatory environment variables. Replace the image or the binary and restart; migrations 0040 to 0045 (relay devices, task pages, projects kept away from AI assistants, automation rules, profiles, workspaces) run on start. There are no down-migrations, so back up first. New optional settings: OPENTODO_MAPS, OPENTODO_MAPS_TILES_URL and OPENTODO_MAPS_GEOCODER_URL (maps), OPENTODO_STT_URL and OPENTODO_STT_KEY_FILE (dictation through your own speech service), and OPENTODO_AUTOMATIONS (automation rules). Upgrade the server before the devices, as for every release.
  • Sample tasks and the start guide's checklist add two additive sync fields (sample on tasks, start_checklist in the user's preferences); older servers refuse them as unknown fields and the devices keep their values, older apps show sample tasks as ordinary tasks. No migration.
  • Workspaces add one migration (0045_workspaces: workspaces, workspace_members, workspace_invites, groups, group_members, project_grants) and a column project_members.via, added at startup together with one default workspace per account; every existing member becomes a direct grant. No new variable. Back up first, as for every release. An older server ignores the new tables and column, but devices from this version write workspace_id, which an older server refuses, so downgrade the server only together with the web app.
  • Reactions and mentions in notes are new sync fields (reactions.<account id> on comments, note_mentions on tasks); both stay plaintext with end-to-end encryption. Upgrade the server before the devices: an older server refuses the new fields. No migration.
  • Quick add reads numeric dates in your date format only (breaking). The device-level choice "Numeric dates like 12/11" under Settings → Capture is gone: 12/11 is read day-month or month-day as your date format in Settings → General → Date and time says, and with System or ISO as your language says. A device that had fixed the other order reads such dates differently now; the stored choice is ignored and removed. (Quick add)
  • Profiles add one migration (user_profiles, email_changes); pictures are stored under <data>/avatars and are part of backups.
  • Calendar alarms become reminders. Display alarms set in a CalDAV calendar app turn into OpenTodo reminders the next time the app saves the task, and OpenTodo reminders now appear in calendar apps as alarms. Nothing is converted in bulk; alarms the reminder model cannot express (sound, email, repeating) stay the app's own data.
  • Task pages add one migration (task_pages, task_page_replies, task_page_actions) and two additive comment fields (guest_name, page_id); older apps ignore them. Publishing is refused on a demo instance.
  • Maps are on by default. Task locations show OpenStreetMap maps and search addresses through your server, which fetches from OpenFreeMap (tiles) and Photon (search) with no account data. Set OPENTODO_MAPS=off, or switch off Settings → Server → Maps, to keep the server from making those requests. Tiles are cached under <data>/cache/maps (at most 200 MB, not backed up). (Maps)

Added

  • Your own name and logo. Settings → Server → Branding lets the owner name the server (up to 40 characters) and upload a square logo: the name replaces "OpenTodo" in the browser tab, the installed app's name, the sign-in screen and the sidebar, and the logo becomes the favicon, the touch icon, the installed app's icons and the sidebar mark, rendered by the server in every size from one PNG or JPEG. The sign-in screen then reads "Powered by OpenTodo". Routes GET/PUT /api/v1/settings/branding, PUT/DELETE /api/v1/settings/branding/logo and the public /branding/logo-<size>.png; auth/status carries branding; changes are recorded as settings.changed. (Branding, #234)
  • Profile pictures from your sign-in provider. With the owner's new switch Use profile pictures from … in Settings → People → Single sign-on (off by default), the picture your OpenID Connect provider names becomes your profile picture when you sign in or link the provider: cropped to a square, scaled to 256×256 and re-encoded, so no metadata is kept. A picture you upload yourself is never replaced, one you remove is not fetched again, and a picture that cannot be fetched changes nothing. Uploading a picture was already there, in Settings → Account → Profile. (Single sign-on, #233)
  • An interface audit for contributors. make ux-audit opens every screen and the main overlays of the app at 360, 768 and 1280 px, light and dark, in English and German, and writes a contact sheet with the findings ranked: overflow, target size, focus rings, cut-off text, overlapping controls, layout shift, movement under reduced motion, the interface budget and how fast the Inbox shows from the local copy with the server stopped. CI runs it on every code change and uploads the report. A screen inventory keeps the router, the layout check and the workbench in step, and the workbench's accessibility gate now also checks the focus ring on the core screens. The rarely used screens are in the workbench too (sign-in and the other signed-out screens, the invitations, display mode, the public list, Import, Help, the capture screen, a location's page, the About settings and the project and voice dialogs), each with a visual baseline in both themes at phone and desktop width.
  • Completing a task feels like it. The check fills and pops, the title is struck through and the row folds away while the rows below move up, all within 400 ms; the completion is saved at once, so c on three tasks in a row never waits and the cursor moves on. A repeating task stays and rolls to its next date. Undo during the moment keeps the row in place. Rescheduling, dragging, bulk actions and Undo slide the rows that stay to their new places (up to 40 rows; changes from other devices never move the list). Dialogs fade and scale in from 640 px and leave faster, the phone sheet and the task panel slide, toasts slide up, and menus fade in and close at once. Phones and tablets tick on completion and on a long-press lift, with a Haptic feedback switch in Settings → Appearance that follows your account. With the system's reduced-motion setting only colour and opacity fade; nothing moves or scales.
  • Profile: your picture, name and email. Settings → Account opens with a Profile card. Change your name, add a picture (crop it in a circle with the mouse, touch or the keyboard; the browser turns it into a 256×256 JPEG and the server re-encodes it so no location or other metadata is kept), or change your sign-in email: with outgoing email a link to the new address confirms it and the old address gets a notice, without it the change applies at once after you confirm your password. Pictures show wherever initials did (account menu, comments, assignees, members, history) for people who share a project with you. Accounts that sign in only through single sign-on keep the provider's email. Routes GET/PATCH /api/v1/me/profile, POST/DELETE /api/v1/me/email, POST /api/v1/me/email/confirm, PUT/DELETE /api/v1/me/avatar, GET /api/v1/users/{id}/avatar; audit events account.name_changed, account.email_change_requested, account.email_changed, account.avatar_changed, never with a name, address or picture. The cropper (react-easy-crop 6.2.3, MIT) is a lazy chunk of 7.75 KB gzipped. (API)
  • Dictation through your own speech service. The owner can connect a speech-to-text service that speaks the OpenAI-compatible /v1/audio/transcriptions request, such as Speaches or whisper.cpp, in Settings → Server → Speech to text or with OPENTODO_STT_URL, OPENTODO_STT_MODEL and OPENTODO_STT_KEY_FILE (none required). People then choose This server's speech service in Settings → Capture → Voice capture, after a statement naming the service's host: each phrase is recorded in the browser, sent once through your server and returned as text, and neither keeps the audio or the text. 5 MB and 60 seconds a phrase, 30 a minute per person, requests only to the configured host. (Speech to text)
  • Moments and onboarding. The start guide offers Start with three sample tasks instead of the "Show me around" project: three tasks marked Sample that show the panel, a time with an estimate and a subtask, never counted in Statistics, the Loop pulse or the weekly digest, and removed in one tap with Undo (the panel's notice, the Inbox's menu or the checklist). The guide...
Read more