Repository navigation
The release of habits and a lot more for notes. Habits get a screen of their own, with targets such as "3 times a week" or "8 glasses", a note per day, and tools for assistants, scripts and routines. Notes gain daily notes, templates, files and images, a Markdown source mode, an outline, read-only note pages and routines and webhooks of their own. The app is now in Dutch. The phone and tablet layouts were reworked from row to header, and the Android and iOS apps have reminders on from the start, pull to sync and, on Android, push through UnifiedPush. API and MCP tokens can be limited to chosen workspaces. The image is built with Go 1.27.4, which fixes a crash an HTTP request could cause, so upgrading is recommended.
Upgrade notes
- Replace the image or the binary and restart; back up first. Seven migrations run at start (
0066,0068–0073: workspace-limited tokens and OAuth grants, CalDAV event calendars, a calendar per project in calendar sync, board public links, held note events for webhooks and note pages). There are no down-migrations. No new mandatory variable. - Check
OPENTODO_BASE_URLif you set it. A base URL with a path, such ashttps://example.com/todo/, now stops startup with a message instead of failing behind the proxy: give OpenTodo its own subdomain or port. - Update every device that shares an account. Habit targets and amounts, daily notes, note templates and note attachments are new synced values that a 1.4 device ignores, and a yearly rule such as "every last Sunday of March" shows as text there; completing such a task on an older device ends the series.
- Phone apps ask for notifications. Reminders are now on in the Android and iOS apps unless you turned them off; people who never touched the switch are asked at their next reminder. Existing webhooks receive no note events until they subscribe to them.
- A downgrade fails safe. A token or app limited to chosen workspaces stops working on an older server instead of reaching the whole account.
Security
- Release binaries and the image are built with Go 1.27.4, which fixes GO-2026-6859 (CVE-2026-97054: an HTTP/1 server that limits request bodies with
MaxBytesReader, as OpenTodo does, could crash when a handler read the body while setting a response header).
Added
- A home for habits. A Habits screen (More,
gthenShift+H) lists each habit with its colour, anchor, a thread of the last seven days, how many of the last seven you kept and a check button; Today shows due habits as a strip above its tasks instead of rows. New habit and Make it a habit start one in a single form, a tiny version counts on hard days and shows half filled, past days can be set to done, tiny, skipped or cleared, and Graduate retires a habit that has stuck while keeping its history. A strength score forgives a single miss, and nothing turns red. Settings → Account → How you work → Habits turns all of it off, which hides every habit control and deletes nothing. - Targets and amounts for habits: a habit can be "3 times a week" or "10 times a month" on any days, offered until the period's target is met and never showing a missed day; or a daily amount such as "8 glasses", where the check button adds a step, a day below its amount counts like the tiny version, and two devices adding offline both count. The thread shows the week as one bar or each day by its share;
list_habits,get_habit,log_habit(amount,set_amount),create_tasks,update_tasksand the habits route carry them, and the JSON export holds each device's counts. (habit-targets) - Notes on habits: a habit's own note on its page, and a note per day: after a check-in one quiet "How did it go?" line opens (Enter keeps it, Escape writes nothing), and Note on a past day adds or changes one. Days with a note are marked in the thread and the month grid, and the habit's page lists them under Check-ins. Habits show with the habit mark and "6 of 7" in the
[[picker and in links, Make habits turns a note's check-list lines into habits, and the weekly review's Look back shows each habit's week with its notes. A habit's daily record no longer copies the habit's note (habit-notes). - Habits for assistants, scripts and routines: the server computes a habit's kept, strength and streaks exactly as the apps do; MCP gains
list_habits,get_habitandlog_habit(and habit fields increate_tasksandupdate_tasks);GET /api/v1/habits,GET /api/v1/habits/{id}andPOST /api/v1/habits/{id}/loglet a phone shortcut log a day in one request;ot habits,ot habits showandot habits logdo it from the terminal; the assistant gains Start a habit and How are my habits?, and Turn this into tasks reads check-ins ("ran 5k, skipped stretching"); routines gain Find habits and Log a habit. While Habits is off, the assistant offers none of it. (habits-assistant) - Daily notes: one note per day, the same on every device, turned on in Settings › General › Notes with a project and a template (the built-in Daily, one of yours, or none). Open today's note with
g j, from the command palette, the Notes sidebar or Today's header;[and]move between days, and a day you only look at writes nothing. The routine step Get the daily note outputs a day's note for Add to a note (daily-notes). - Note templates. Mark any note Use as template in its menu, then start new notes from it with From template… next to New note (
Shift+Q) or Use template on the open template.{{date}},{{weekday}},{{time}}and{{title}}are filled in when the note is made, in your date and time format. Five built-in templates ship: Meeting, 1:1, Trip, Weekly review and Daily, in every language.templatein the Notes search lists templates only. Routines gain Create a note from a template, with the starter Monday meeting note. - Files and images in notes. Paste, drop or pick images in a standalone note, and attach files and links from its menu; they are listed below the text, work offline and follow the same limits as task attachments. Turning a note into a task, or moving it to a shared project, takes its files along without uploading them again. REST:
GET|POST /api/v1/notes/{id}/attachments. - Edit a note's Markdown. Any note can switch to its Markdown source with
Ctrl+Shift+M(⌘+Shift+M), Markdown in the/menu or the Markdown button in the note's corner, and back to formatted text. Edits are applied block by block as you pause, so mentions and images you did not touch stay as they are and edits from other devices merge; read-only notes show their source read-only. - Tasks from a note's checklist. In a project note or a standalone note,
Ctrl+Shift+Enter(⌘+Shift+Enter) or Make tasks in the/menu turns the checklist line, or every checklist line of a selection, into tasks read like quick add, in the note's project (the Inbox for a note without one); each line becomes a link to its task. In a task's note Make subtask now takes a selection too. One Undo takes back the tasks and the lines; at most 50 lines at once. A routine's Create tasks can Link back to the note, starting each new task's note with a link to the note its lines came from. - Outline of a long note. A task note, project note or standalone note with three or more headings shows its outline: a column beside a wide note that marks where you are, or an Outline button in the note's corner. Choose a heading to go to it, or press Ctrl+Shift+O (⌘+Shift+O) in the note, then the arrows and Enter; Esc returns to the note.
- Note pages: Publish note page… in a standalone note's menu publishes it as a read-only page anyone with the link can open, without an account, at
/n/<secret>with an optional label and expiry. The page shows the title, when it last changed, the formatted text, images in place and files to download; links to other notes, tasks and projects show as their text. The note's header says Published, with Copy a new link and Revoke. Note pages run on the task page machinery (hashed secrets, private headers, a check on every request, the shared limit of 100 active pages and 20 publishes an hour), work for end-to-end encrypted notes through a key after#in the link (images and files left out), and are refused on a demo instance (note-public-links). - Search operators for notes.
ORin capitals finds either word (ferry OR train),title:andtext:look in one field (title:wifi,text:"oat milk"), andchanged:2026-10-01..2026-10-31keeps notes changed within those days, with This month and Last month among the suggestions. The Notes page,ot notes searchand the assistants'search_notesread queries the same way; a query without operators finds what it found before. - Act on several notes. Tick standalone notes on the Notes page with the task lists' keys (
x,Shift+↓,Ctrl+A,Ctrl/Shift+click) or Select notes, then Move to project (m, reviewed when notes would move into a shared project), Labels (Shift+L), Pin (p), Turn into tasks or Move to Trash, each saved as one change with one Undo. - Sort notes. The ⋯ menu of the Notes page sorts the list by Last changed, Created or Title (numbers in order, untitled notes last); choosing the checked order again reverses it. Pinned notes keep their order, searches keep their ranking, and each device remembers its choice.
- Unlinked mentions. Under Linked references of a note, a task or a project, a folded line counts the notes that name its title without linking to it; open it to see each mention highlighted, and Link turns one into a link, with Undo. Found on your device, offline and with encryption included.
- Routines work with your notes. A routine can start when a note is created, edited (5 minutes after you stop writing) or gets a label, or run on the note you have open (its menu and the command palette have Run routine…). New steps find notes by project, labels, last change or words, create a note, add and remove labels, move, pin or trash notes, and turn a note into a task; Get note text, Add to a note and Clear a note take a note too. Five starters to build on: Weekly review note, Todo label to task, Checkboxes to tasks, Stale reference notes and Journal line.
POST /api/v1/rules/{id}/run, MCPrun_routineandot routine run --notetake a note. On an encrypted account, steps that read a note's text run on your device; label and project steps stay on the server. - Note events for webhooks. A webhook can subscribe to
note.created,note.updatedandnote.deleted(a new Notes group in its events): a note's events wait until it has been unchanged for 5 minutes (at most 30), so one sitting of writing is one delivery with the final text;note.deletedis sent at once. Opt-in: existing webhooks receive nothing new. ot vaultkeeps your notes as Markdown files too: one file per note inNotes/, with its project and labels in the front matter, links that open in Obsidian, and edits on both sides merged line by line. New vaults sync notes; an existing vault starts withot vault notes on(OpenSpec changevault-notes).- The app is available in Dutch (Nederlands). Pick it in Settings → Language and region → Language; dates, reminder notifications, the browser extension, the Android app, the Obsidian plugin and the server's email messages follow along. Quick add understands Dutch too:
Tandarts volgende woensdag om 15 uur,Bellen morgen om half 4 's middags(15:30),Filter vervangen elke 3 dagen na voltooiing,herinner me 30 minuten van tevoren; a two-letter weekday such asmacounts only next to a date, soBel mastays a title. A weekday right before a full date now names that date in every language (Monday, March 3). See Quick add syntax. - A kit for new languages, and community translations.
node scripts/i18n/new-language.mjs <code> "<Name>"scaffolds every file a language needs (the app's catalog, notification texts, the browser extension, the Android app, emails, an empty quick-add vocabulary) without offering it in Settings, andmake i18n-statusshows how far each language is on each of them. A translation that is at least 90 % done and has a named reviewer can ship as a community language: Settings lists it after the others and says that some text is in English. A Translation issue form asks for the language and its reviewer. See Translating OpenTodo. - The Android app can receive reminders by push: with a UnifiedPush app such as ntfy on the phone, Settings → Notifications → Deliver instantly through UnifiedPush subscribes the app on your server like a browser, so a reminder set on another device a minute ago arrives on time with the app closed, without Google services. Off until turned on; the push service sees only an encrypted message, and the reminders scheduled on the phone keep working either way (shell-push, #1344).
- Pull down to sync on a phone or tablet. Pulling a page down from its top syncs now: a small mark follows your finger and turns until the sync is done, and offline it just says so. The iPhone app no longer reloads the whole app on that pull (with an older server it still does) (pull-to-sync, #1342).
- On a phone, a swipe right from the left edge opens the menu, and the iPhone app no longer goes back through page history on that swipe (edge-swipe-menu, #1232).
- API and MCP tokens can be limited to chosen workspaces: Settings → API tokens → New token → Workspaces: Only these, the consent page of an app connected with OAuth,
ot token create --limit-to <workspace>orPOST /api/v1/tokenswithworkspaces. Such a token reads and changes only those workspaces over REST and MCP, its new items land there, and routes over the whole account refuse it withtoken_restricted(token-workspaces, #1227). - Calendar sync can write each project into a calendar of its own: choose A calendar per project under Write to in a connection's Calendars; a sub-project follows its parent, and moving a task to another project moves its event (calsync-project-calendars, #1160).
- A CalDAV app password can show tasks as Events instead of to-dos: the per-project calendars then hold one event per dated open task (multi-day tasks as one all-day event, with the notes and a link to the task); moving, resizing or renaming an event changes the task, and deleting it clears the date (caldav-events, #1230).
- Import iCalendar task files. Settings → Data → Import now reads an
.icsfile of tasks, such as a Nextcloud Tasks export, with the same mapping as CalDAV: titles, notes, dates, priorities, completion, categories as labels, repeat rules and alarms. Subtasks (RELATED-TO) stay subtasks, whatever their order in the file, and the file becomes a project named after the list. (#1201) - Import from Todoist with an API token, no Premium backup needed: Switch from: Todoist → Or import with a Todoist API token. The token is used once and never stored. Comments now join their task's notes in JSON imports (todoist-api-import, #1238).
- Public links can show the project as a Board, a column per section: choose Show as when you create the link. A named link now carries its name at the front of the address, like
/public/party-groceries-otl_…, so links are easy to tell apart (public-link-board, #1281, #1292). - A project board can show its completed tasks: Show completed tasks in the Project menu is now offered on the board too (one setting per project and device for both layouts) and ends the board with a Completed column, folded by default; drop a card there, or press Shift+→ into it, to complete the task, and drag a completed card onto a section to reopen it there (board-completed-column, #1291).
- The Completed view can be narrowed to projects in Display options, grouped by project instead of by day, and searched; its done rows read with a check and a muted title instead of a strikethrough (completed-view-review, #1325).
- Drag a task onto Today in the sidebar to plan it for today, as one change with Undo (drop-on-today, #1328).
- Saved views in the List layout have Display options → Nest subtasks, as Today and Upcoming do: a matching subtask is listed under its matching parent and folds with it (saved-view-nest-subtasks, #1108).
- Saved views and label pages grouped by Project take project-style drops: drop a task in another project's group to move it there (with its subtasks) at that place in the view's order, or, with Nest subtasks on, onto a task to make it a subtask; projects you can only view take no drop, and Undo restores both (#1211).
- Recurring rules for a weekday of one month every year:
every last sunday of march,every 4th thursday of november(also "in March", and in quick add in every language). CalDAV maps them toFREQ=YEARLY;BYMONTH;BYDAYand Todoist imports read them (yearly-weekday-of-month, #1239). - The assistant shows what it read: where an answer read your tasks or projects, a line such as Looked at 3 tasks opens to exactly the tasks or projects the tool returned, so a task a model invents cannot pass as one of yours (assistant-tool-sources, #1317).
- Assistants create labels in any workspace. The MCP tool
create_labeland the agent routePOST /api/v1/labelstake an optionalworkspace_id(a workspace id or name), so a label made for a project in another workspace shows under that workspace's Labels and in its filters; without it the label goes to the default workspace as before. A label of the same name counts only within its workspace, and a label name on a task means the label of the task's workspace (#1222). - An Obsidian origin can link to a heading or block of its note (
file=Plan%23%5Eabc123): the chip reads as the note, opens it at that place, andorigin:search finds it by the note's path (obsidian-anchors, #1287). - Send feedback by email. Something isn't working now also offers Send by email, a message to info@open-todo.app with your text and the few lines the app adds, next to Open on GitHub.
Changed
- A base URL with a path is refused at startup. OpenTodo can't be served below a path such as
https://example.com/todo/; such anOPENTODO_BASE_URLused to start and then fail behind the proxy, and now stops startup with a message saying to give OpenTodo its own subdomain or port. - Reminders are on in the Android and iOS apps from the start, with the task's name. They used to be off until you found the switch in Settings → Notifications. The phone asks to allow notifications when your first reminder is there, not at launch. If you never touched the switch, you are asked at your next reminder after updating; if you turned it off, it stays off. Task names can show on a locked phone: turn them off in Settings → Notifications, or hide notification content in the phone's settings. Encrypted accounts keep the generic text.
- Android asks for exact alarms instead of opening a settings page. When Android refuses them, the app says once that reminders can be a few minutes late, with Allow; the notice stays in Settings → Notifications until you do.
- The apps' background refresh ends when it is done. It ran for a fixed 30 seconds, which cut off a slow sync and wasted battery on a fast one.
- Settings on iPhone names the iPhone's Settings, not Android's.
- A task without a priority now reads as having none. Priority 4, where every task starts, shows as "No priority": a faint Priority in the task panel and "None" in the priority picker, so you can see a task has no priority and choose None to take one away. The stored value stays 4, so filters,
p4and the API are unchanged, and a name you gave level 4 in Settings → Priorities still shows instead. - Settings say what blocks you and save one way. A missing backup, outgoing email that is not configured, two-factor turned off and blocked push notifications show a warning dot on their page and on the section's overview, and a failing webhook shows in red. Switches and choices save as soon as you change them and spring back with the reason if the server refuses. Forms with several fields (attachment limits, focus timer lengths, a workspace's name and colour, outgoing email, single sign-on, speech to text, audit retention) show a save bar with Save and Discard while they have unsaved changes, and leaving the page first asks whether to discard them. Number fields show their unit and allowed range, and choices use one radio style.
- Leaner habits. Today's habits are one quiet line with a link to Habits; rows keep long titles on one line and every row has a check button; a habit opens a page of its own with its facts, numbers and history, and Open as a task for everything else; one lean form for New habit, Make it a habit and Edit adds a colour and a "?" that explains Tiny version and After.
- Touch feels like an app on phones. Tapping no longer flashes the browser's highlight, holding a button, a tab or the menu no longer selects its label, and pulling a list past its top no longer drags or reloads the whole app. Text in tasks, notes and comments is still selected and copied as before, and pinch zoom stays. The iPhone app no longer lifts a preview when you hold a link.
- Bottom sheets on a phone can be dragged away. A menu, a picker or a dialog that opens from the bottom now follows your finger: drag it down by its handle or header (or by its content while that is at the top) and let go to close it, or flick it down; a short drag springs back. Dialogs that ask before something is lost stay put (#1341).
- Task rows on a phone have no Show details arrow, and their controls no longer share touch targets. A tap opens the task; the fold arrow, the checkbox and the grip each take taps in their own 44 px, and the grip sits level with the title. The add field's hint is the short Add a task… on a phone (#1359).
- Task titles take two lines on a phone. A title was cut after about 15 characters beside its time and date; it now wraps onto a second line before it ends with …, as on wider screens. Short titles and the row's controls are unchanged (#1339).
- Titles take two lines on a phone outside the task lists too. The Notes list, the calendar's day lists (Month, Week and Plan), Close the day and the command bar's results cut a title after one line; they now wrap it onto a second before it ends with …, and show it whole with Show full task titles. A note's time and place moved under its title. Wider screens are unchanged (#1351).
- More room for the title on a phone. Help moved from the bar into the page's "…" menu, as its last item, so a project's name and the Inbox's count are cut less. Pages without a menu, such as Settings, keep the Help button.
- A project's name gets more of the phone bar. On a phone the duration filter is in the page's "…" menu on every list, as it already was in the Inbox, and an active filter is a small chip in the bar that clears it with one tap.
- The calendar starts higher on a phone. Previous, Today and Next share one row with the view: tap its name ("Week") to choose Day, Week, Month, Plan or Year. The Calendars toggle moved into the "…" menu. Nothing changes on wider screens.
- Statistics starts higher on a phone. The period is one button with its name ("This week") beside the "…" menu: tap it to choose this week, this month, this quarter, this year or last week. A public list's name takes two lines on a phone before it is cut. Nothing changes on wider screens.
- A project's Timeline reads on a phone. Each task's name sits on its own line above its bar instead of in a narrow column, so names show in full and about ten days fit at once. Rows are tall enough to tap, a tap on a name opens the task, and the hint no longer mentions arrow keys on a device without a keyboard (#1372).
- One-row headers on a tablet. With the sidebar open on a tablet, or a task open beside a list, a page header keeps to one row: Help, Select, Filter, a project's Layout and Share move into the "…" menu as on a phone, Statistics shows the period as one button, and a task's page shows a back arrow with the list's name instead of a cut path. A header's lead line ("3 to sort") now shows in full or not at all.
- On a touch screen the sidebar gives names the room. A project, label, view or favourite no longer shows a ⋯ button on its row: press and hold the row to open its menu (with a keyboard, Tab still reaches the button). The footer shows your name whole or your picture alone, and the sync state as its dot (#1380).
- Taps answer in the app's own colours. On a touch screen the tabs, the add button, menu items, the drawer's rows, a task row and its checkbox show a pressed colour under your finger instead of dimming, and the tab bar's tabs are 56 px tall as designed (they were 44 px on touch) (#1349).
- A due reminder takes less room on a phone or tablet. On a touch screen or in a narrow window the reminder card shows the task and the time on one line each, with Snooze (which opens 10 minutes, 1 hour and tomorrow 09:00) and Dismiss on one row. Several due reminders show one at a time with a count instead of stacking over the page, and after your answer the keyboard focus goes to the next reminder or back to where you were.
- Grouped by project, each project's group header takes the project's colour, as a coloured section's header does; the Inbox stays neutral (project-group-tint, #1210).
- Notes and comments draw
->as an arrow at rest, as task titles do; while you type it stays two characters so the cursor never lands inside it. The saved text is still->(#1278).
Fixed
- Archived projects no longer send reminders. An unfinished task's reminder still fired after its project was archived, in the app, by push, through notification channels and in the mobile app. It now waits like a reminder in the Trash: unarchive the project and it fires again, a missed one once, late.
- The app no longer opens to a blank page now and then in Chromium. The service worker handed the browser its stored copy of a file directly, and Chromium could drop that copy mid-read when the worker cleaned up its memory: one of the app's files failed to load and the page stayed empty with no error. The worker now reads each stored file whole before answering, and a copy it cannot read comes from the server instead (#1363).
- Saving files works in the Android and iOS apps. The recovery key, recovery codes, exports, themes and attachments did nothing when you tapped Download. They now open the phone's save dialog. On Android, files made on the phone need the server updated too.
- Back stays in the Android app. After Back had left the app once, it left the app every time, even from an open task. It now closes what is open first.
- Haptic feedback in the apps. Completing a task and picking up a row give a tap on Android and iPhone; the switch is in Settings → Appearance.
- Face ID unlock works on iPhone, and the reminder notification there offers Done.
- The iPhone status bar stays readable when the app's theme is dark and the phone's appearance is light, or the other way round.
- The Android and iOS apps no longer start on a blank screen. The Android app opens on its icon and the iOS app on its background colour, light or dark with the phone, and both keep that until the page is ready. On a phone, the loading screen already has the top bar and the tab bar in their places, so nothing jumps when your tasks appear.
- Calendar apps sync large accounts quickly, and subtasks follow their parent between lists. A calendar app's sync, a single task's fetch or save and the list of calendars read only what they ask for instead of every task of the account: on 10,000 tasks an incremental sync takes about a millisecond instead of a quarter of a second. Moving a task to another list in a calendar app now takes its subtasks with it, as in the app, and a parent named in another list is kept as the app's own data instead of making the task a subtask across projects.
- Calendar sync works with large calendars. A busy calendar no longer stops with "The calendar server sent more than 4 MB at once": its events are read in smaller time ranges and batches when one answer would be over 4 MB, and a calendar whose list of changes is too large is followed through the events OpenTodo wrote. No answer is read past 4 MB, so the memory bound stays (#1226).
- Calendar sync keeps an event's notes up to date: notes added or changed after the event was written now reach the calendar, and the event links to its task instead of its day. Existing events are written again once after the update (calendar-event-notes, #1231).
- Completing a repeating task no longer slows down with the size of the account. Completing or skipping one read every task on the device to find the series' earlier occurrences; it now reads only the series' own. In an account with 10,000 tasks that took a quarter of a second, and takes about a hundredth now.
- A default reminder when the date and the time are set one after the other. With only "Tasks with a time" set, picking a day for an undated task and then a time added no reminder; the time now adds it, in the app and through the API and agents. The default reminders also moved to their own Reminders page, the first under Settings → Notifications, since every channel delivers them, not only push (#1320).
- Email to task decodes Central European, Cyrillic, Greek, Turkish and Baltic mail (windows-1250, ISO-8859-2, windows-1251, KOI8-R and the others of their families), so Czech, Polish or Russian text no longer turns into
�(#1309). - Signing in from the OpenTodo app shows its confirmation in a browser that knows the web app. In a browser that had opened the web app before, the app's sign-in page was answered by the web app itself instead of the server, so the sign-in sheet showed your tasks and no confirmation. The first sign-in after this update may still show the web app once; close the sheet and try again.
- An account whose address was never confirmed, such as an owner created with the setup token, can confirm it: Profile shows Send a confirmation link, which sends the usual 24-hour link to the current address. A routine's Email me step needs a verified address (confirm-current-email, #1194).
- A confirmation is no longer hidden behind the welcome note. On a new account, the one-time thank-you and the start guide opened on top of a waiting confirmation (connecting an AI app, signing in from the OpenTodo app). They now wait until it is answered.
- Enter applies a move or assignment review, and a routine's proposal, right after it opens. The review arrives a moment after its dialog, and focus stayed on the dialog itself, so Enter did nothing until you tabbed into it.
- Today opens in place. The list no longer moves down a moment after Today or Upcoming opens: the sentence under the title is complete, replies included, when the page is first drawn.
- On a phone, a swipe from the left edge goes back on a page with Back (a task, a note, a nested page) and opens the menu only on top-level pages; the installed web app on iPhone and iPad keeps the system back swipe (edge-swipe-back, #1323).
- An Inbox task's title is no longer cut to a few letters on a landscape phone or a tablet: the source line beside it ("From a calendar app · 5 d ago") takes at most 40 % of the row and 16 rem (#1258).
- A browser or Android System WebView too old for the app (older than Chrome 111, Safari 16.4 or Firefox 128) shows a plain note naming the minimum and what it found, instead of a broken page; the Android guide states the WebView it needs (#1259).
- On a phone, the add button no longer covers Next in the Weekly review. The floating add button stood on the right end of the step's Next button, so a tap there could add a task instead of going on. The review's steps now show no add button, like Close the day; Mind sweep keeps its own add field (phone-fab-clearance, #1368).
- On a phone the calendar's Day and Week reach the tab bar. The grid no longer stops short above the add button, and its last hour scrolls clear of it. Screens without the add button (Statistics, the Trash, the Weekly review) no longer end with an empty band.
- Icons and colours are easier to tap on a phone. The icon picker shows seven larger icons to a row instead of eight small ones, the colour swatches line up with them, and the search field no longer runs to the edges of the sheet. The theme editor's colour picker shows its swatches six to a row. Nothing changes with a mouse (#1369).
- On a phone, a tap just above a task's completion circle no longer shares its touch area with Back. The circle's 44 px target now starts under the bar and reaches down beside the title; the circle has not moved (#1370).
- Phones no longer show keyboard shortcuts nobody can press. On a phone or tablet used by touch alone, menus, sheets, buttons and search fields leave out their key badges, and lines such as "Enter toggles or creates · Esc closes" are gone. They come back as soon as a keyboard, a mouse or a trackpad is used with the device; computers are unchanged, and the cheat sheet still lists every key.
- A tap no longer leaves a tooltip behind. On a phone, tapping the sync dot in the menu left its tooltip over the screen, and Search, Assistant and Ask flashed theirs. Tooltips now appear only for a mouse resting on a button and for focus moved with a keyboard (#1362).
- A picker on a phone no longer opens under the keyboard. The When sheet, the label, assignee, project and icon pickers and other lists with a search field open with their choices in view; tap the field to type. Quick add, comments and rename prompts still open ready to type, and nothing changes with a keyboard attached (#1360).
- A new Send a webhook step in a routine is given the task that triggered it, or the tasks found above it, so a "When a task is due" routine's delivery names its task instead of an empty
task_ids(webhook-step-trigger-task, #1194). websign verify -require-signed -keys <file>passes for a server signed with your own key. It still demanded one of the official keys; with-keysit now requires a signature by one of the given keys.- The iPhone build reaches TestFlight on the first try. At Apple's limit of distribution certificates, a release revoked an old one and was refused a new one straight away (1.4.2); it now asks again a few times with a short pause.
Install
- Docker:
docker run -d -p 8080:8080 -v opentodo:/data ghcr.io/opentodoapp/opentodo:1.5.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.