diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index dbdac9cd5..b46edbe5c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -26,7 +26,7 @@ body: attributes: label: OpenTodo version description: Shown by `opentodo version`, or `version` in `GET /api/v1/auth/status`. - placeholder: v1.0.0 + placeholder: v1.1.0 validations: required: true - type: dropdown diff --git a/CHANGELOG.md b/CHANGELOG.md index e2f8117db..53259d218 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,35 @@ All notable changes to OpenTodo are documented here. The format follows [Keep a Changes since the last release are in [changelog.d/](changelog.d/README.md), one file per change; `make release-prepare` moves them here when a release is cut. +## [1.1.0] - 2026-11-07 + +OpenTodo 1.1.0 brings the first part of a new security wave and a batch of fixes from your reports. A device you sign out with **Sign out everywhere** now deletes its local copy the next time it connects, and sign-in and AI agent limits no longer reset when the server restarts. Long task titles can be shown in full, the iPhone app no longer blurs its top edge, quick add keeps "every other Saturday" when you also say "today", and a repeating task's tracked time starts again with each occurrence. + +### Upgrade notes + +- **Replace the image or the binary and restart; back up first.** Three migrations run at start (`0060`–`0062`: the audit log's hash chain if you skipped 0.24.0, revoked sessions, and saved limit windows). There are no down-migrations. One new synced field, `user_prefs.full_titles`. No new mandatory variable. +- **Update every device that shares an account to 1.1.** A repeat rule that only 1.1 can express (for example "every 2 weeks on Saturday" on a task due on another day) shows as text on a 1.0 device, and completing the task there ends the series. Rules 1.0 can read are still stored in their 1.0 form. +- **APIs and automations keep their 1.0 meaning.** MCP's `tracked_minutes`, the routine `tracked` condition and the filter term `tracked` still count all of a task's time; the new `tracked_minutes_occurrence` field and the `tracked occurrence` filter term give the current occurrence of a repeating task. +- **Behind Pomerium or Google Cloud Run,** point health checks at `/api/v1/health`; the 1.1 phone apps use it automatically. + +### Security + +- **Rate limits and AI agent limits survive a restart.** Sign-in attempts, the account lockout, the other per-address and per-account limits, the AI agent write limits, the device relay's calls and the email sending limits are kept in the server's database as well as in memory. Restarting or upgrading the server no longer gives someone guessing passwords, or an agent that used its day's budget, a fresh start. Checks still run in memory and cost the same. Keys are stored as salted hashes, never as addresses or emails. +- **A revoked device removes its local copy.** After **Sign out everywhere**, or when an admin deactivates or deletes an account, each of its devices removes its tasks, its unsynced changes and its encryption key the next time it connects, and shows "This device was signed out and its data was removed." The server proves the revocation with a key only that device holds, so a forged answer removes nothing. A password change or reset still only signs the other devices out, and a device that never connects again keeps its copy. + +### Added + +- **Show full task titles.** A new switch in **Settings → Appearance** wraps long task titles onto as many lines as they need in lists, on board cards and in Today, instead of cutting them with an ellipsis after two lines (one on a phone). Off by default; it follows your account to every device (#998). +- **The health check is also served at `/api/v1/health`.** Pomerium and Google Cloud Run answer `/healthz` themselves, so behind them the mobile apps said the address was not an OpenTodo server. The Android and iOS apps now check `/api/v1/health` first and fall back to `/healthz` for older servers; point an uptime monitor behind such a proxy at the new route. `/healthz` is unchanged (GitHub issue 1000). + +### Fixed + +- **A repeating task's tracked time starts again with each occurrence.** Completing a repeating task, or skipping a habit, carried its tracked time over to the next date, so the next occurrence started with the old total against its estimate. Rows and the Time tab now count only the current occurrence's entries, and the Time tab adds **All occurrences** with every entry's sum. What scripts, assistants, routines and saved views read keeps its 1.0 meaning, every entry of the task: the assistant's `tracked_minutes`, the routine condition on tracked time and the `tracked` filter terms. The current occurrence is added alongside, as `tracked_minutes_occurrence` on repeating tasks and as the filter term `tracked occurrence` (in the builder, **All occurrences** turned off). Statistics and the CSV export are unchanged. Nothing is rewritten: past entries keep their place. +- **The top of the installed app on an iPhone is no longer blurred.** After a force quit, or once a menu such as the project menu closed, iOS drew its blur over the status bar and the page title below it. The app now keeps a solid strip in the background colour behind the status bar, so iOS shows that colour there instead of the blur (GitHub issue 999). +- **Reminder notifications write dates in the language you chose.** With English picked on a browser in another language, a pushed reminder's due date used that browser's month names (German on a German browser), and so did an unrecognised stored language. The notification now writes the date in the chosen language, with the browser's region of it when it has one (English on a British browser reads 3 Nov), like the app; the browser's locale applies only when no language is stored. +- **"Today and repeat every other Saturday" keeps the Saturday.** Quick add stored "every other Saturday" as `every 2 weeks` from the task's date, so a line with its own date ("today") repeated on that weekday instead, and "and repeat" or "starting" stayed in the title (#1016). Rules can now say `every 2 weeks on saturday`: the date you type is the first occurrence and completing it moves to the next right Saturday. Where `every 2 weeks` means the same, because the task is due on that Saturday, that is what is stored, so OpenTodo 1.0 devices keep reading the rule; a rule only 1.1 can express is shown as text on a 1.0 device, and completing it there ends the series, so update your devices. "and repeat", "repeating", "and then" and their equivalents leave the title with the rule, and "starting tomorrow", "starting 16 Nov" or "from Monday" next to a rule set where the series starts, in all six quick-add languages. The importer reads "every other Monday", and CalDAV serves and reads `FREQ=WEEKLY;INTERVAL=2;BYDAY=SA` (as `every 2 weeks` when the task's date is a Saturday). +- **New project from the sidebar's + menu opens where you can see it.** With many projects, choosing **New project** opened its form under the last project, out of sight, and on a phone the name field did not get the cursor, so the menu item seemed to do nothing. The sidebar now scrolls the form into view and focuses its name field, on phones and desktops alike (#997). + ## [1.0.0] - 2026-11-07 **OpenTodo 1.0.** From this release on, OpenTodo keeps the promises in [Stability and compatibility](docs/stability.md): the API, the sync protocol, the export format and the upgrade path stay compatible within 1.x, and every release upgrades from every earlier one. 1.0 adds no feature. It is the release where the trust work of the last months comes together: a published [threat model, how we verify it and the documented limits](docs/security/), with the hardening they called for (0.23.0 and 0.24.0); an [accessibility statement](docs/accessibility.md) against WCAG 2.2 AA (partial conformance: keyboard and 200% zoom are tested on every core screen, screen-reader passes are still to come); and [performance budgets](docs/performance.md) for a 10,000-task account that pass every night. Getting those budgets to pass made long lists much faster: completing a task in a 2,000-task project on a phone now takes about 100 ms instead of over 200, note search stays quick right after a first sync, and a sync no longer stalls while the database tidies its log. @@ -1419,7 +1448,8 @@ Other known limitations: CalDAV does not translate alarms into reminders (alarms | `0023_e2ee.sql` | `encryption_keys` (the wrapped key record) | | `0024_caldav_orphans.sql` | nothing new: removes `caldav_resources` rows of tasks that were already purged | -[Unreleased]: https://github.com/OpenTodoApp/OpenTodo/compare/v1.0.0...HEAD +[Unreleased]: https://github.com/OpenTodoApp/OpenTodo/compare/v1.1.0...HEAD +[1.1.0]: https://github.com/OpenTodoApp/OpenTodo/compare/v1.0.0...v1.1.0 [1.0.0]: https://github.com/OpenTodoApp/OpenTodo/compare/v0.24.0...v1.0.0 [0.24.0]: https://github.com/OpenTodoApp/OpenTodo/compare/v0.23.0...v0.24.0 [0.23.0]: https://github.com/OpenTodoApp/OpenTodo/compare/v0.22.0...v0.23.0 diff --git a/changelog.d/Added/full-task-titles.md b/changelog.d/Added/full-task-titles.md deleted file mode 100644 index 051d84eae..000000000 --- a/changelog.d/Added/full-task-titles.md +++ /dev/null @@ -1 +0,0 @@ -- **Show full task titles.** A new switch in **Settings → Appearance** wraps long task titles onto as many lines as they need in lists, on board cards and in Today, instead of cutting them with an ellipsis after two lines (one on a phone). Off by default; it follows your account to every device (#998). diff --git a/changelog.d/Added/health-route-alias.md b/changelog.d/Added/health-route-alias.md deleted file mode 100644 index e6d2dbbde..000000000 --- a/changelog.d/Added/health-route-alias.md +++ /dev/null @@ -1 +0,0 @@ -- **The health check is also served at `/api/v1/health`.** Pomerium and Google Cloud Run answer `/healthz` themselves, so behind them the mobile apps said the address was not an OpenTodo server. The Android and iOS apps now check `/api/v1/health` first and fall back to `/healthz` for older servers; point an uptime monitor behind such a proxy at the new route. `/healthz` is unchanged (GitHub issue 1000). diff --git a/changelog.d/Fixed/fix-recurring-tracked-time.md b/changelog.d/Fixed/fix-recurring-tracked-time.md deleted file mode 100644 index 337117451..000000000 --- a/changelog.d/Fixed/fix-recurring-tracked-time.md +++ /dev/null @@ -1 +0,0 @@ -- **A repeating task's tracked time starts again with each occurrence.** Completing a repeating task, or skipping a habit, carried its tracked time over to the next date, so the next occurrence started with the old total against its estimate. Rows and the Time tab now count only the current occurrence's entries, and the Time tab adds **All occurrences** with every entry's sum. What scripts, assistants, routines and saved views read keeps its 1.0 meaning, every entry of the task: the assistant's `tracked_minutes`, the routine condition on tracked time and the `tracked` filter terms. The current occurrence is added alongside, as `tracked_minutes_occurrence` on repeating tasks and as the filter term `tracked occurrence` (in the builder, **All occurrences** turned off). Statistics and the CSV export are unchanged. Nothing is rewritten: past entries keep their place. diff --git a/changelog.d/Fixed/ios-top-blur.md b/changelog.d/Fixed/ios-top-blur.md deleted file mode 100644 index 9316fddf8..000000000 --- a/changelog.d/Fixed/ios-top-blur.md +++ /dev/null @@ -1 +0,0 @@ -- **The top of the installed app on an iPhone is no longer blurred.** After a force quit, or once a menu such as the project menu closed, iOS drew its blur over the status bar and the page title below it. The app now keeps a solid strip in the background colour behind the status bar, so iOS shows that colour there instead of the blur (GitHub issue 999). diff --git a/changelog.d/Fixed/push-date-language.md b/changelog.d/Fixed/push-date-language.md deleted file mode 100644 index afd5cbb0f..000000000 --- a/changelog.d/Fixed/push-date-language.md +++ /dev/null @@ -1 +0,0 @@ -- **Reminder notifications write dates in the language you chose.** With English picked on a browser in another language, a pushed reminder's due date used that browser's month names (German on a German browser), and so did an unrecognised stored language. The notification now writes the date in the chosen language, with the browser's region of it when it has one (English on a British browser reads 3 Nov), like the app; the browser's locale applies only when no language is stored. diff --git a/changelog.d/Fixed/quick-add-weekday-recurrence.md b/changelog.d/Fixed/quick-add-weekday-recurrence.md deleted file mode 100644 index 4cc7aebf4..000000000 --- a/changelog.d/Fixed/quick-add-weekday-recurrence.md +++ /dev/null @@ -1 +0,0 @@ -- **"Today and repeat every other Saturday" keeps the Saturday.** Quick add stored "every other Saturday" as `every 2 weeks` from the task's date, so a line with its own date ("today") repeated on that weekday instead, and "and repeat" or "starting" stayed in the title (#1016). Rules can now say `every 2 weeks on saturday`: the date you type is the first occurrence and completing it moves to the next right Saturday. Where `every 2 weeks` means the same, because the task is due on that Saturday, that is what is stored, so OpenTodo 1.0 devices keep reading the rule; a rule only 1.1 can express is shown as text on a 1.0 device, and completing it there ends the series, so update your devices. "and repeat", "repeating", "and then" and their equivalents leave the title with the rule, and "starting tomorrow", "starting 16 Nov" or "from Monday" next to a rule set where the series starts, in all six quick-add languages. The importer reads "every other Monday", and CalDAV serves and reads `FREQ=WEEKLY;INTERVAL=2;BYDAY=SA` (as `every 2 weeks` when the task's date is a Saturday). diff --git a/changelog.d/Fixed/sidebar-new-project-in-view.md b/changelog.d/Fixed/sidebar-new-project-in-view.md deleted file mode 100644 index e6a2e23eb..000000000 --- a/changelog.d/Fixed/sidebar-new-project-in-view.md +++ /dev/null @@ -1 +0,0 @@ -- **New project from the sidebar's + menu opens where you can see it.** With many projects, choosing **New project** opened its form under the last project, out of sight, and on a phone the name field did not get the cursor, so the menu item seemed to do nothing. The sidebar now scrolls the form into view and focuses its name field, on phones and desktops alike (#997). diff --git a/changelog.d/Security/persistent-limits.md b/changelog.d/Security/persistent-limits.md deleted file mode 100644 index 9876d9880..000000000 --- a/changelog.d/Security/persistent-limits.md +++ /dev/null @@ -1 +0,0 @@ -- **Rate limits and AI agent limits survive a restart.** Sign-in attempts, the account lockout, the other per-address and per-account limits, the AI agent write limits, the device relay's calls and the email sending limits are kept in the server's database as well as in memory. Restarting or upgrading the server no longer gives someone guessing passwords, or an agent that used its day's budget, a fresh start. Checks still run in memory and cost the same. Keys are stored as salted hashes, never as addresses or emails. diff --git a/changelog.d/Security/revoked-device-wipe.md b/changelog.d/Security/revoked-device-wipe.md deleted file mode 100644 index fe8270a60..000000000 --- a/changelog.d/Security/revoked-device-wipe.md +++ /dev/null @@ -1 +0,0 @@ -- **A revoked device removes its local copy.** After **Sign out everywhere**, or when an admin deactivates or deletes an account, each of its devices removes its tasks, its unsynced changes and its encryption key the next time it connects, and shows "This device was signed out and its data was removed." The server proves the revocation with a key only that device holds, so a forged answer removes nothing. A password change or reset still only signs the other devices out, and a device that never connects again keeps its copy. diff --git a/deploy/caprover/README.md b/deploy/caprover/README.md index c0934b579..9b8c24c14 100644 --- a/deploy/caprover/README.md +++ b/deploy/caprover/README.md @@ -4,7 +4,7 @@ A [CapRover](https://caprover.com) one-click app in the v4 format of [`caprover/ | Path | What | | --- | --- | -| [`opentodo.yml`](opentodo.yml) | The app. One service, `$$cap_appname`, from `ghcr.io/opentodoapp/opentodo:$$cap_opentodo_version` (the version field defaults to the latest release, `1.0.0`). `containerHttpPort: '8080'` (CapRover's nginx proxies to it; no published port). The named volume `$$cap_appname-data` on `/data`. Four form fields passed as `OPENTODO_*`: base URL (empty), setup token (generated, `$$cap_gen_random_hex(32)`), open sign-up (`false`), trusted proxies (empty). The message after the install shows the setup token and says how to turn on https and then set the base URL. | +| [`opentodo.yml`](opentodo.yml) | The app. One service, `$$cap_appname`, from `ghcr.io/opentodoapp/opentodo:$$cap_opentodo_version` (the version field defaults to the latest release, `1.1.0`). `containerHttpPort: '8080'` (CapRover's nginx proxies to it; no published port). The named volume `$$cap_appname-data` on `/data`. Four form fields passed as `OPENTODO_*`: base URL (empty), setup token (generated, `$$cap_gen_random_hex(32)`), open sign-up (`false`), trusted proxies (empty). The message after the install shows the setup token and says how to turn on https and then set the base URL. | | `upstream/public/v4/apps/opentodo.yml`, `upstream/public/v4/logos/opentodo.png` | Byte-identical copies at the paths they take in `caprover/one-click-apps`. The logo is `web/public/pwa-512.png` (their validator wants a png named like the app). | | [`upstream/PR.md`](upstream/PR.md) | Pull request title and body, with their checklist. | @@ -53,5 +53,5 @@ CapRover can add other one-click repositories (**One-Click Apps/Databases → 3r ## Tested - Their validator, formatter and build on a copy of `caprover/one-click-apps` with this app added: `npm run validate_apps` (prints "Validated opentodo"), `npm run formatter` ("All matched files use Prettier code style!"), `npm run build` (writes `dist/v4/apps/opentodo` and the list entry). -- The built JSON rendered the way CapRover does (random hex, form defaults, split/join of every id after `$$cap_appname`), then run with Docker in CapRover's order: the placeholder image with the named volume first, then `ghcr.io/opentodoapp/opentodo:1.0.0` with the rendered environment on the same volume. `/data` became 65532-owned, `/healthz` answered ok, the container turned healthy, creating the owner failed without the token and worked with the one from the end message, and the owner survived a restart and a replaced container. +- The built JSON rendered the way CapRover does (random hex, form defaults, split/join of every id after `$$cap_appname`), then run with Docker in CapRover's order: the placeholder image with the named volume first, then `ghcr.io/opentodoapp/opentodo:1.1.0` with the rendered environment on the same volume. `/data` became 65532-owned, `/healthz` answered ok, the container turned healthy, creating the owner failed without the token and worked with the one from the end message, and the owner survived a restart and a replaced container. - Not tested: a real CapRover instance (Swarm, its nginx, Let's Encrypt). Before submitting, run step A.4. diff --git a/deploy/caprover/opentodo.yml b/deploy/caprover/opentodo.yml index ff7d2be05..5dbd132ec 100644 --- a/deploy/caprover/opentodo.yml +++ b/deploy/caprover/opentodo.yml @@ -15,7 +15,7 @@ caproverOneClickApp: variables: - id: $$cap_opentodo_version label: OpenTodo version - defaultValue: '1.0.0' + defaultValue: '1.1.0' description: The image tag of ghcr.io/opentodoapp/opentodo. Releases are listed at https://github.com/OpenTodoApp/OpenTodo/releases validRegex: /^[0-9]+\.[0-9]+(\.[0-9]+)?$/ - id: $$cap_opentodo_base_url diff --git a/deploy/caprover/upstream/public/v4/apps/opentodo.yml b/deploy/caprover/upstream/public/v4/apps/opentodo.yml index ff7d2be05..5dbd132ec 100644 --- a/deploy/caprover/upstream/public/v4/apps/opentodo.yml +++ b/deploy/caprover/upstream/public/v4/apps/opentodo.yml @@ -15,7 +15,7 @@ caproverOneClickApp: variables: - id: $$cap_opentodo_version label: OpenTodo version - defaultValue: '1.0.0' + defaultValue: '1.1.0' description: The image tag of ghcr.io/opentodoapp/opentodo. Releases are listed at https://github.com/OpenTodoApp/OpenTodo/releases validRegex: /^[0-9]+\.[0-9]+(\.[0-9]+)?$/ - id: $$cap_opentodo_base_url diff --git a/deploy/casaos/README.md b/deploy/casaos/README.md index a2c6135ed..3ee9c8648 100644 --- a/deploy/casaos/README.md +++ b/deploy/casaos/README.md @@ -1,6 +1,6 @@ # CasaOS / ZimaOS app store template -[`docker-compose.yml`](docker-compose.yml) is an app for the CasaOS / ZimaOS app store ([IceWhaleTech/CasaOS-AppStore](https://github.com/IceWhaleTech/CasaOS-AppStore)): a Docker Compose file with the store's `x-casaos` metadata. It runs the latest release by version (`ghcr.io/opentodoapp/opentodo:1.0.0`, the store refuses moving tags), publishes the web port 8080 as 8418 on the server, keeps the data in `/DATA/AppData/$AppID/data` on `/data`, and offers the base URL, setup token, sign-up and trusted proxies settings with the catalogue's descriptions. No setting is required. A pinned `busybox` one-shot service (`opentodo-init`) runs `chown -R 65532:65532 /data` before OpenTodo starts, because Docker creates the bind folder owned by root and the image has no shell (the store's OpenClaw app does the same). The facts it shares with the other templates are in [`../deploy.json`](../deploy.json); `make check` keeps them in line ([`../README.md`](../README.md)). +[`docker-compose.yml`](docker-compose.yml) is an app for the CasaOS / ZimaOS app store ([IceWhaleTech/CasaOS-AppStore](https://github.com/IceWhaleTech/CasaOS-AppStore)): a Docker Compose file with the store's `x-casaos` metadata. It runs the latest release by version (`ghcr.io/opentodoapp/opentodo:1.1.0`, the store refuses moving tags), publishes the web port 8080 as 8418 on the server, keeps the data in `/DATA/AppData/$AppID/data` on `/data`, and offers the base URL, setup token, sign-up and trusted proxies settings with the catalogue's descriptions. No setting is required. A pinned `busybox` one-shot service (`opentodo-init`) runs `chown -R 65532:65532 /data` before OpenTodo starts, because Docker creates the bind folder owned by root and the image has no shell (the store's OpenClaw app does the same). The facts it shares with the other templates are in [`../deploy.json`](../deploy.json); `make check` keeps them in line ([`../README.md`](../README.md)). **Status: Submitted: [IceWhaleTech/CasaOS-AppStore#1104](https://github.com/IceWhaleTech/CasaOS-AppStore/pull/1104).** The steps for users, including installing it now as a custom app, are in [docs/self-hosting/casaos.md](../../docs/self-hosting/casaos.md). diff --git a/deploy/casaos/docker-compose.yml b/deploy/casaos/docker-compose.yml index 9212f357d..211bf9aca 100644 --- a/deploy/casaos/docker-compose.yml +++ b/deploy/casaos/docker-compose.yml @@ -13,7 +13,7 @@ services: source: /DATA/AppData/$AppID/data target: /data opentodo: - image: ghcr.io/opentodoapp/opentodo:1.0.0 + image: ghcr.io/opentodoapp/opentodo:1.1.0 container_name: opentodo depends_on: opentodo-init: @@ -94,10 +94,10 @@ x-casaos: architectures: - amd64 - arm64 - version: "1.0.0" + version: "1.1.0" update_at: "2026-11-07" release_notes: - en_US: "OpenTodo 1.0.0, the first version in this app store. Changes: https://github.com/OpenTodoApp/OpenTodo/blob/main/CHANGELOG.md" + en_US: "OpenTodo 1.1.0, the first version in this app store. Changes: https://github.com/OpenTodoApp/OpenTodo/blob/main/CHANGELOG.md" website: https://open-todo.app repo: https://github.com/OpenTodoApp/OpenTodo support: https://github.com/OpenTodoApp/OpenTodo/issues diff --git a/deploy/casaos/upstream/Apps/OpenTodo/docker-compose.yml b/deploy/casaos/upstream/Apps/OpenTodo/docker-compose.yml index 9212f357d..211bf9aca 100644 --- a/deploy/casaos/upstream/Apps/OpenTodo/docker-compose.yml +++ b/deploy/casaos/upstream/Apps/OpenTodo/docker-compose.yml @@ -13,7 +13,7 @@ services: source: /DATA/AppData/$AppID/data target: /data opentodo: - image: ghcr.io/opentodoapp/opentodo:1.0.0 + image: ghcr.io/opentodoapp/opentodo:1.1.0 container_name: opentodo depends_on: opentodo-init: @@ -94,10 +94,10 @@ x-casaos: architectures: - amd64 - arm64 - version: "1.0.0" + version: "1.1.0" update_at: "2026-11-07" release_notes: - en_US: "OpenTodo 1.0.0, the first version in this app store. Changes: https://github.com/OpenTodoApp/OpenTodo/blob/main/CHANGELOG.md" + en_US: "OpenTodo 1.1.0, the first version in this app store. Changes: https://github.com/OpenTodoApp/OpenTodo/blob/main/CHANGELOG.md" website: https://open-todo.app repo: https://github.com/OpenTodoApp/OpenTodo support: https://github.com/OpenTodoApp/OpenTodo/issues diff --git a/deploy/claude-plugin/upstream/plugins/opentodo/.claude-plugin/plugin.json b/deploy/claude-plugin/upstream/plugins/opentodo/.claude-plugin/plugin.json index 0ec16b86c..d96f81ce1 100644 --- a/deploy/claude-plugin/upstream/plugins/opentodo/.claude-plugin/plugin.json +++ b/deploy/claude-plugin/upstream/plugins/opentodo/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "opentodo", "displayName": "OpenTodo", - "version": "1.0.0", + "version": "1.1.0", "description": "Connect Claude to your own OpenTodo server: read your tasks and, when you allow it, plan and change them, with every change in the task's history and undoable.", "author": { "name": "OpenTodo", diff --git a/deploy/dokploy/blueprints/opentodo/docker-compose.yml b/deploy/dokploy/blueprints/opentodo/docker-compose.yml index deca74afa..f87639bd9 100644 --- a/deploy/dokploy/blueprints/opentodo/docker-compose.yml +++ b/deploy/dokploy/blueprints/opentodo/docker-compose.yml @@ -1,6 +1,6 @@ services: opentodo: - image: ghcr.io/opentodoapp/opentodo:1.0.0 + image: ghcr.io/opentodoapp/opentodo:1.1.0 restart: unless-stopped expose: - 8080 diff --git a/deploy/dokploy/blueprints/opentodo/meta.json b/deploy/dokploy/blueprints/opentodo/meta.json index 333ac4c80..ee5a20dc3 100644 --- a/deploy/dokploy/blueprints/opentodo/meta.json +++ b/deploy/dokploy/blueprints/opentodo/meta.json @@ -1,7 +1,7 @@ { "id": "opentodo", "name": "OpenTodo", - "version": "1.0.0", + "version": "1.1.0", "description": "Open-source, local-first task manager. Works offline and syncs every device from one small container.", "logo": "opentodo.svg", "links": { diff --git a/deploy/dokploy/meta.json b/deploy/dokploy/meta.json index c29a9c335..36741f4b2 100644 --- a/deploy/dokploy/meta.json +++ b/deploy/dokploy/meta.json @@ -2,7 +2,7 @@ { "id": "opentodo", "name": "OpenTodo", - "version": "1.0.0", + "version": "1.1.0", "description": "Open-source, local-first task manager. Works offline and syncs every device from one small container.", "logo": "opentodo.svg", "links": { diff --git a/deploy/dokploy/upstream/blueprints/opentodo/docker-compose.yml b/deploy/dokploy/upstream/blueprints/opentodo/docker-compose.yml index deca74afa..f87639bd9 100644 --- a/deploy/dokploy/upstream/blueprints/opentodo/docker-compose.yml +++ b/deploy/dokploy/upstream/blueprints/opentodo/docker-compose.yml @@ -1,6 +1,6 @@ services: opentodo: - image: ghcr.io/opentodoapp/opentodo:1.0.0 + image: ghcr.io/opentodoapp/opentodo:1.1.0 restart: unless-stopped expose: - 8080 diff --git a/deploy/dokploy/upstream/blueprints/opentodo/meta.json b/deploy/dokploy/upstream/blueprints/opentodo/meta.json index 333ac4c80..ee5a20dc3 100644 --- a/deploy/dokploy/upstream/blueprints/opentodo/meta.json +++ b/deploy/dokploy/upstream/blueprints/opentodo/meta.json @@ -1,7 +1,7 @@ { "id": "opentodo", "name": "OpenTodo", - "version": "1.0.0", + "version": "1.1.0", "description": "Open-source, local-first task manager. Works offline and syncs every device from one small container.", "logo": "opentodo.svg", "links": { diff --git a/deploy/easypanel/README.md b/deploy/easypanel/README.md index 73746ad28..93b64ee75 100644 --- a/deploy/easypanel/README.md +++ b/deploy/easypanel/README.md @@ -4,7 +4,7 @@ An [Easypanel](https://easypanel.io) template in the format of [`easypanel-io/te | File | What it is | | --- | --- | -| [`meta.yaml`](meta.yaml) | The listing (description, instructions, links, benefits, features, tags) and the form: service name (`opentodo`) and image (`ghcr.io/opentodoapp/opentodo:1.0.0`) | +| [`meta.yaml`](meta.yaml) | The listing (description, instructions, links, benefits, features, tags) and the form: service name (`opentodo`) and image (`ghcr.io/opentodoapp/opentodo:1.1.0`) | | [`index.ts`](index.ts) | `generate()`: one app service from that image, the domain `$(EASYPANEL_DOMAIN)` on port 8080, the volume `data` on `/data`, and `OPENTODO_BASE_URL=https://$(PRIMARY_DOMAIN)`, a generated 32-character `OPENTODO_SETUP_TOKEN`, `OPENTODO_ALLOW_SIGNUP=false` and an empty `OPENTODO_TRUSTED_PROXIES` | | `assets/logo.svg` | The logo mark, identical to [`../coolify/opentodo.svg`](../coolify/opentodo.svg) | | `assets/screenshot.png` | [`docs/images/board-light.webp`](../../docs/images/board-light.webp) as PNG | diff --git a/deploy/easypanel/meta.yaml b/deploy/easypanel/meta.yaml index 16ca393e7..9cb4b595b 100644 --- a/deploy/easypanel/meta.yaml +++ b/deploy/easypanel/meta.yaml @@ -26,6 +26,8 @@ changeLog: description: Update to 0.24.0 - date: 2026-11-07 description: Update to 1.0.0 + - date: 2026-11-07 + description: Update to 1.1.0 links: - label: Website url: https://open-todo.app/ @@ -49,7 +51,7 @@ schema: appServiceImage: type: string title: App Service Image - default: ghcr.io/opentodoapp/opentodo:1.0.0 + default: ghcr.io/opentodoapp/opentodo:1.1.0 benefits: - title: Your Tasks, Your Server description: diff --git a/deploy/easypanel/upstream/templates/opentodo/meta.yaml b/deploy/easypanel/upstream/templates/opentodo/meta.yaml index 16ca393e7..9cb4b595b 100644 --- a/deploy/easypanel/upstream/templates/opentodo/meta.yaml +++ b/deploy/easypanel/upstream/templates/opentodo/meta.yaml @@ -26,6 +26,8 @@ changeLog: description: Update to 0.24.0 - date: 2026-11-07 description: Update to 1.0.0 + - date: 2026-11-07 + description: Update to 1.1.0 links: - label: Website url: https://open-todo.app/ @@ -49,7 +51,7 @@ schema: appServiceImage: type: string title: App Service Image - default: ghcr.io/opentodoapp/opentodo:1.0.0 + default: ghcr.io/opentodoapp/opentodo:1.1.0 benefits: - title: Your Tasks, Your Server description: diff --git a/deploy/helm/opentodo/Chart.yaml b/deploy/helm/opentodo/Chart.yaml index cc9405339..fa110fed6 100644 --- a/deploy/helm/opentodo/Chart.yaml +++ b/deploy/helm/opentodo/Chart.yaml @@ -3,8 +3,8 @@ name: opentodo description: Open-source, local-first task manager. Works offline and syncs every device from one small container. type: application # Both follow the OpenTodo release (the chart is published from its v* tag): check with node scripts/deploy-check.mjs. -version: 1.0.0 -appVersion: "1.0.0" +version: 1.1.0 +appVersion: "1.1.0" kubeVersion: ">=1.23.0-0" home: https://open-todo.app icon: https://raw.githubusercontent.com/OpenTodoApp/OpenTodo/main/web/public/pwa-512.png @@ -28,7 +28,7 @@ annotations: url: https://github.com/OpenTodoApp/OpenTodo/issues artifacthub.io/images: | - name: opentodo - image: ghcr.io/opentodoapp/opentodo:1.0.0 + image: ghcr.io/opentodoapp/opentodo:1.1.0 platforms: - linux/amd64 - linux/arm64 diff --git a/deploy/homeassistant/upstream/opentodo/CHANGELOG.md b/deploy/homeassistant/upstream/opentodo/CHANGELOG.md index ef2b8a7a7..ebe104215 100644 --- a/deploy/homeassistant/upstream/opentodo/CHANGELOG.md +++ b/deploy/homeassistant/upstream/opentodo/CHANGELOG.md @@ -2,6 +2,10 @@ The add-on's version is the OpenTodo release it runs. A version with a fourth number, such as `0.12.0.1`, changes only the add-on and runs the same OpenTodo release. OpenTodo's own changes are in its [changelog](https://github.com/OpenTodoApp/OpenTodo/blob/main/CHANGELOG.md). +## 1.1.0 + +- OpenTodo [1.1.0](https://github.com/OpenTodoApp/OpenTodo/releases/tag/v1.1.0). + ## 1.0.0 - OpenTodo [1.0.0](https://github.com/OpenTodoApp/OpenTodo/releases/tag/v1.0.0). diff --git a/deploy/homeassistant/upstream/opentodo/Dockerfile b/deploy/homeassistant/upstream/opentodo/Dockerfile index 1574f897f..15eb1f872 100644 --- a/deploy/homeassistant/upstream/opentodo/Dockerfile +++ b/deploy/homeassistant/upstream/opentodo/Dockerfile @@ -3,7 +3,7 @@ # binary from the released image onto the Home Assistant base image, whose s6 init and bashio # turn the add-on options into OPENTODO_* variables (run.sh). Releases up to 0.14.2 come from # ghcr.io/pixari/opentodo, later ones from ghcr.io/opentodoapp/opentodo (scripts/bump.sh). -ARG OPENTODO_VERSION=1.0.0 +ARG OPENTODO_VERSION=1.1.0 FROM ghcr.io/opentodoapp/opentodo:${OPENTODO_VERSION} AS opentodo FROM ghcr.io/home-assistant/base:3.24 diff --git a/deploy/homeassistant/upstream/opentodo/config.yaml b/deploy/homeassistant/upstream/opentodo/config.yaml index 725c83cbf..9390beb46 100644 --- a/deploy/homeassistant/upstream/opentodo/config.yaml +++ b/deploy/homeassistant/upstream/opentodo/config.yaml @@ -1,6 +1,6 @@ # https://contributors.home-assistant.io/apps/reference/configuration/ name: OpenTodo -version: "1.0.0" +version: "1.1.0" slug: opentodo description: Open-source, local-first task manager. Works offline and syncs every device from one small container. url: https://github.com/OpenTodoApp/opentodo-homeassistant-addons/tree/main/opentodo diff --git a/deploy/runtipi/README.md b/deploy/runtipi/README.md index 48f868dd3..068863389 100644 --- a/deploy/runtipi/README.md +++ b/deploy/runtipi/README.md @@ -5,7 +5,7 @@ Runtipi's official app store ([`runtipi/runtipi-appstore`](https://github.com/ru The app, in Runtipi's native format (Runtipi 4.7.0 or newer): - [`config.json`](config.json): id `opentodo`, port 8400 (the host port when the user opens one), category `utilities`, `exposable` (a domain with https through Runtipi's Traefik), `version` = the release, `tipi_version` (raised on every change users should get), and four optional form fields: base URL, setup token, open sign-up, trusted proxies. -- [`docker-compose.yml`](docker-compose.yml): the `opentodo` service (the key is the app id; `x-runtipi.is_main`, `internal_port: 8080`) with the **release tag** (`ghcr.io/opentodoapp/opentodo:1.0.0`; Runtipi's store test wants the tag to contain `version`), the health check, `${APP_DATA_DIR}/data` on `/data` and the form fields as `OPENTODO_*` with their defaults; and `opentodo-init`, a one-shot `busybox` that runs `chown -R 65532:65532 /data` before OpenTodo starts. Runtipi creates the data folder owned by root and only makes it writable (`chmod a+rwx`) after the first `compose up`, so without it the first start fails with `open /data/opentodo.lock: permission denied`. `restart: "no"` keeps Runtipi's default `unless-stopped` from restarting it after it finishes. +- [`docker-compose.yml`](docker-compose.yml): the `opentodo` service (the key is the app id; `x-runtipi.is_main`, `internal_port: 8080`) with the **release tag** (`ghcr.io/opentodoapp/opentodo:1.1.0`; Runtipi's store test wants the tag to contain `version`), the health check, `${APP_DATA_DIR}/data` on `/data` and the form fields as `OPENTODO_*` with their defaults; and `opentodo-init`, a one-shot `busybox` that runs `chown -R 65532:65532 /data` before OpenTodo starts. Runtipi creates the data folder owned by root and only makes it writable (`chmod a+rwx`) after the first `compose up`, so without it the first start fails with `open /data/opentodo.lock: permission denied`. `restart: "no"` keeps Runtipi's default `unless-stopped` from restarting it after it finishes. - [`metadata/description.md`](metadata/description.md) and [`metadata/logo.jpg`](metadata/logo.jpg) (512×512 JPEG, rendered from the brand mark by `make brand-icons`). **Status: published** as our own app store, [`OpenTodoApp/opentodo-runtipi`](https://github.com/OpenTodoApp/opentodo-runtipi). diff --git a/deploy/runtipi/config.json b/deploy/runtipi/config.json index 68c0e4c6e..fcf01e391 100644 --- a/deploy/runtipi/config.json +++ b/deploy/runtipi/config.json @@ -5,8 +5,8 @@ "exposable": true, "dynamic_config": true, "port": 8400, - "tipi_version": 26, - "version": "1.0.0", + "tipi_version": 27, + "version": "1.1.0", "categories": [ "utilities" ], diff --git a/deploy/runtipi/docker-compose.yml b/deploy/runtipi/docker-compose.yml index 8c5d60744..8341c6117 100644 --- a/deploy/runtipi/docker-compose.yml +++ b/deploy/runtipi/docker-compose.yml @@ -1,6 +1,6 @@ services: opentodo: - image: ghcr.io/opentodoapp/opentodo:1.0.0 + image: ghcr.io/opentodoapp/opentodo:1.1.0 restart: unless-stopped environment: OPENTODO_BASE_URL: ${OPENTODO_BASE_URL:-} diff --git a/deploy/runtipi/upstream/apps/opentodo/config.json b/deploy/runtipi/upstream/apps/opentodo/config.json index 68c0e4c6e..fcf01e391 100644 --- a/deploy/runtipi/upstream/apps/opentodo/config.json +++ b/deploy/runtipi/upstream/apps/opentodo/config.json @@ -5,8 +5,8 @@ "exposable": true, "dynamic_config": true, "port": 8400, - "tipi_version": 26, - "version": "1.0.0", + "tipi_version": 27, + "version": "1.1.0", "categories": [ "utilities" ], diff --git a/deploy/runtipi/upstream/apps/opentodo/docker-compose.yml b/deploy/runtipi/upstream/apps/opentodo/docker-compose.yml index 8c5d60744..8341c6117 100644 --- a/deploy/runtipi/upstream/apps/opentodo/docker-compose.yml +++ b/deploy/runtipi/upstream/apps/opentodo/docker-compose.yml @@ -1,6 +1,6 @@ services: opentodo: - image: ghcr.io/opentodoapp/opentodo:1.0.0 + image: ghcr.io/opentodoapp/opentodo:1.1.0 restart: unless-stopped environment: OPENTODO_BASE_URL: ${OPENTODO_BASE_URL:-} diff --git a/deploy/runtipi/upstream/scripts/__tests__/update-config.test.ts b/deploy/runtipi/upstream/scripts/__tests__/update-config.test.ts index 356e0699b..e7721dab3 100644 --- a/deploy/runtipi/upstream/scripts/__tests__/update-config.test.ts +++ b/deploy/runtipi/upstream/scripts/__tests__/update-config.test.ts @@ -24,9 +24,9 @@ beforeEach(() => { afterEach(() => fs.rmSync(dir, { recursive: true, force: true })); test("a new OpenTodo image raises the version, tipi_version and updated_at", async () => { - fs.writeFileSync(path.join(dir, "docker-compose.yml"), compose("ghcr.io/opentodoapp/opentodo:1.0.0", "busybox:1.37.0")); - const c = await updateAppConfig(path.join(dir, "docker-compose.yml"), "1.0.0", "ghcr.io/opentodoapp/opentodo", 1000); - expect(c.version).toBe("1.0.0"); + fs.writeFileSync(path.join(dir, "docker-compose.yml"), compose("ghcr.io/opentodoapp/opentodo:1.1.0", "busybox:1.37.0")); + const c = await updateAppConfig(path.join(dir, "docker-compose.yml"), "1.1.0", "ghcr.io/opentodoapp/opentodo", 1000); + expect(c.version).toBe("1.1.0"); expect(c.tipi_version).toBe(2); expect(c.updated_at).toBe(1000); }); diff --git a/deploy/truenas/README.md b/deploy/truenas/README.md index 1264bc899..b283ba0db 100644 --- a/deploy/truenas/README.md +++ b/deploy/truenas/README.md @@ -4,8 +4,8 @@ | File | What it is | | --- | --- | -| `app.yaml` | Catalogue metadata: the app's own `version` (a patch bump per release), `app_version` `1.0.0` (the image tag), category productivity, `run_as_context` 568:568, library `2.3.17` and its hash | -| `ix_values.yaml` | The images: `ghcr.io/opentodoapp/opentodo` tag `"1.0.0"`, and TrueNAS's `container-utils` for the permissions container | +| `app.yaml` | Catalogue metadata: the app's own `version` (a patch bump per release), `app_version` `1.1.0` (the image tag), category productivity, `run_as_context` 568:568, library `2.3.17` and its hash | +| `ix_values.yaml` | The images: `ghcr.io/opentodoapp/opentodo` tag `"1.1.0"`, and TrueNAS's `container-utils` for the permissions container | | `questions.yaml` | The install form: Base URL, Setup Token (private), Allow Sign-up, Trusted Proxies, additional variables, user and group (568), Web UI port (30536), storage, labels, resources | | `templates/docker-compose.yaml` | The Jinja template TrueNAS's library renders: user 568:568, health check `/opentodo healthcheck` (the image has no shell or wget), `OPENTODO_ADDR=:`, `OPENTODO_DATA_DIR=/data`, the data mount, and a permissions container that chowns it to the chosen user | | `templates/test_values/basic-values.yaml`, `hostnet-values.yaml` | What their CI renders and starts: a published port (30080), and host networking (30081) with every setting filled in | @@ -14,7 +14,7 @@ TrueNAS apps listen on the port the user chooses (so the **Host Network** option works), which is why the template sets `OPENTODO_ADDR` from it instead of mapping a port to 8080. The default in the form is 30536: the first choice, 30530, clashed with `community/money` in their `.github/scripts/port_validation.py`, so the submission moved it. -The image is pinned to a release (`1.0.0`), not `stable`: `truenas/apps` versions every app by its image tag, and their Renovate bot bumps it. `make check` (`scripts/deploy/truenas.mjs`) fails when the tag is not the latest release in `CHANGELOG.md`, when `app_version` differs from it, and on the shared rules in [`../deploy.json`](../deploy.json). +The image is pinned to a release (`1.1.0`), not `stable`: `truenas/apps` versions every app by its image tag, and their Renovate bot bumps it. `make check` (`scripts/deploy/truenas.mjs`) fails when the tag is not the latest release in `CHANGELOG.md`, when `app_version` differs from it, and on the shared rules in [`../deploy.json`](../deploy.json). **Status: Submitted: [truenas/apps#6240](https://github.com/truenas/apps/pull/6240)** (after the issue [truenas/apps#6239](https://github.com/truenas/apps/issues/6239)). The files here are exactly what was submitted, including `lib_version_hash` and `date_added: '2026-10-24'`. diff --git a/deploy/truenas/opentodo/app.yaml b/deploy/truenas/opentodo/app.yaml index 6d32c283f..ab5ae75c0 100644 --- a/deploy/truenas/opentodo/app.yaml +++ b/deploy/truenas/opentodo/app.yaml @@ -1,4 +1,4 @@ -app_version: 1.0.0 +app_version: 1.1.0 capabilities: [] categories: - productivity @@ -33,4 +33,4 @@ sources: - https://github.com/OpenTodoApp/OpenTodo/pkgs/container/opentodo title: OpenTodo train: community -version: 1.0.9 +version: 1.0.10 diff --git a/deploy/truenas/opentodo/ix_values.yaml b/deploy/truenas/opentodo/ix_values.yaml index bbfb77edc..db383c9b4 100644 --- a/deploy/truenas/opentodo/ix_values.yaml +++ b/deploy/truenas/opentodo/ix_values.yaml @@ -1,7 +1,7 @@ images: image: repository: ghcr.io/opentodoapp/opentodo - tag: "1.0.0" + tag: "1.1.0" container_utils_image: repository: ghcr.io/truenas/containers/container-utils tag: "1.1.2@sha256:6ddfdc314af9d18cfacb836ad266ef0ed91fecaa3686b20be72e464972860c08" diff --git a/deploy/truenas/upstream/ix-dev/community/opentodo/app.yaml b/deploy/truenas/upstream/ix-dev/community/opentodo/app.yaml index 6d32c283f..ab5ae75c0 100644 --- a/deploy/truenas/upstream/ix-dev/community/opentodo/app.yaml +++ b/deploy/truenas/upstream/ix-dev/community/opentodo/app.yaml @@ -1,4 +1,4 @@ -app_version: 1.0.0 +app_version: 1.1.0 capabilities: [] categories: - productivity @@ -33,4 +33,4 @@ sources: - https://github.com/OpenTodoApp/OpenTodo/pkgs/container/opentodo title: OpenTodo train: community -version: 1.0.9 +version: 1.0.10 diff --git a/deploy/truenas/upstream/ix-dev/community/opentodo/ix_values.yaml b/deploy/truenas/upstream/ix-dev/community/opentodo/ix_values.yaml index bbfb77edc..db383c9b4 100644 --- a/deploy/truenas/upstream/ix-dev/community/opentodo/ix_values.yaml +++ b/deploy/truenas/upstream/ix-dev/community/opentodo/ix_values.yaml @@ -1,7 +1,7 @@ images: image: repository: ghcr.io/opentodoapp/opentodo - tag: "1.0.0" + tag: "1.1.0" container_utils_image: repository: ghcr.io/truenas/containers/container-utils tag: "1.1.2@sha256:6ddfdc314af9d18cfacb836ad266ef0ed91fecaa3686b20be72e464972860c08" diff --git a/deploy/umbrel/docker-compose.yml b/deploy/umbrel/docker-compose.yml index a33423031..25f406e98 100644 --- a/deploy/umbrel/docker-compose.yml +++ b/deploy/umbrel/docker-compose.yml @@ -14,7 +14,7 @@ services: PROXY_AUTH_BLACKLIST: "/api/v1/auth/register" web: - image: ghcr.io/opentodoapp/opentodo:1.0.0@sha256:c29d2e469f30304322cae05c57805ef53b751b44ca36d9323aa336c8263a7998 + image: ghcr.io/opentodoapp/opentodo:1.1.0@sha256:c29d2e469f30304322cae05c57805ef53b751b44ca36d9323aa336c8263a7998 # Umbrel creates the app data owned by 1000:1000; OpenTodo's static binary runs as any user. user: "1000:1000" restart: on-failure diff --git a/deploy/umbrel/umbrel-app.yml b/deploy/umbrel/umbrel-app.yml index a9a061c41..2c3e5cecc 100644 --- a/deploy/umbrel/umbrel-app.yml +++ b/deploy/umbrel/umbrel-app.yml @@ -28,7 +28,7 @@ environment: note: Reverse proxies whose X-Forwarded-For is trusted for the visitor's address, such as cloudflare or 192.0.2.0/24. Leave empty unless every request comes through them. category: files name: OpenTodo -version: "1.0.0" +version: "1.1.0" tagline: A to-do app that runs on your own server description: >- OpenTodo is an open-source, local-first task manager. Plan your day, keep projects in order, set reminders and share lists with your family or your team, from your phone and your computer. diff --git a/deploy/umbrel/upstream/opentodo/docker-compose.yml b/deploy/umbrel/upstream/opentodo/docker-compose.yml index a33423031..25f406e98 100644 --- a/deploy/umbrel/upstream/opentodo/docker-compose.yml +++ b/deploy/umbrel/upstream/opentodo/docker-compose.yml @@ -14,7 +14,7 @@ services: PROXY_AUTH_BLACKLIST: "/api/v1/auth/register" web: - image: ghcr.io/opentodoapp/opentodo:1.0.0@sha256:c29d2e469f30304322cae05c57805ef53b751b44ca36d9323aa336c8263a7998 + image: ghcr.io/opentodoapp/opentodo:1.1.0@sha256:c29d2e469f30304322cae05c57805ef53b751b44ca36d9323aa336c8263a7998 # Umbrel creates the app data owned by 1000:1000; OpenTodo's static binary runs as any user. user: "1000:1000" restart: on-failure diff --git a/deploy/umbrel/upstream/opentodo/umbrel-app.yml b/deploy/umbrel/upstream/opentodo/umbrel-app.yml index a9a061c41..2c3e5cecc 100644 --- a/deploy/umbrel/upstream/opentodo/umbrel-app.yml +++ b/deploy/umbrel/upstream/opentodo/umbrel-app.yml @@ -28,7 +28,7 @@ environment: note: Reverse proxies whose X-Forwarded-For is trusted for the visitor's address, such as cloudflare or 192.0.2.0/24. Leave empty unless every request comes through them. category: files name: OpenTodo -version: "1.0.0" +version: "1.1.0" tagline: A to-do app that runs on your own server description: >- OpenTodo is an open-source, local-first task manager. Plan your day, keep projects in order, set reminders and share lists with your family or your team, from your phone and your computer. diff --git a/docs/images/activity-dark.webp b/docs/images/activity-dark.webp index cfb59a217..bfd5a1132 100644 Binary files a/docs/images/activity-dark.webp and b/docs/images/activity-dark.webp differ diff --git a/docs/images/activity-light.webp b/docs/images/activity-light.webp index 192525b71..77ddf924c 100644 Binary files a/docs/images/activity-light.webp and b/docs/images/activity-light.webp differ diff --git a/docs/images/all-projects-dark.webp b/docs/images/all-projects-dark.webp index c2dfb6d79..7101ffd75 100644 Binary files a/docs/images/all-projects-dark.webp and b/docs/images/all-projects-dark.webp differ diff --git a/docs/images/all-projects-light.webp b/docs/images/all-projects-light.webp index a85b887d3..86179ff8c 100644 Binary files a/docs/images/all-projects-light.webp and b/docs/images/all-projects-light.webp differ diff --git a/docs/images/archived-projects-dark.webp b/docs/images/archived-projects-dark.webp index ba441e1db..010357013 100644 Binary files a/docs/images/archived-projects-dark.webp and b/docs/images/archived-projects-dark.webp differ diff --git a/docs/images/archived-projects-light.webp b/docs/images/archived-projects-light.webp index c823ace57..aa90af937 100644 Binary files a/docs/images/archived-projects-light.webp and b/docs/images/archived-projects-light.webp differ diff --git a/docs/images/assistant-chat-dark.webp b/docs/images/assistant-chat-dark.webp index b2cf1f262..44cab3368 100644 Binary files a/docs/images/assistant-chat-dark.webp and b/docs/images/assistant-chat-dark.webp differ diff --git a/docs/images/assistant-chat-light.webp b/docs/images/assistant-chat-light.webp index d865dfd2b..b7f0fbec0 100644 Binary files a/docs/images/assistant-chat-light.webp and b/docs/images/assistant-chat-light.webp differ diff --git a/docs/images/assistant-device-owner-dark.webp b/docs/images/assistant-device-owner-dark.webp index a980fd105..d1fc8aeae 100644 Binary files a/docs/images/assistant-device-owner-dark.webp and b/docs/images/assistant-device-owner-dark.webp differ diff --git a/docs/images/assistant-device-owner-light.webp b/docs/images/assistant-device-owner-light.webp index c4c07945c..a40e2dc3b 100644 Binary files a/docs/images/assistant-device-owner-light.webp and b/docs/images/assistant-device-owner-light.webp differ diff --git a/docs/images/assistant-phone-dark.webp b/docs/images/assistant-phone-dark.webp index 7a7a0f0bd..925bb0de9 100644 Binary files a/docs/images/assistant-phone-dark.webp and b/docs/images/assistant-phone-dark.webp differ diff --git a/docs/images/assistant-phone-light.webp b/docs/images/assistant-phone-light.webp index 970db693f..b6f393147 100644 Binary files a/docs/images/assistant-phone-light.webp and b/docs/images/assistant-phone-light.webp differ diff --git a/docs/images/assistant-review-dark.webp b/docs/images/assistant-review-dark.webp index 45b058ab7..0b8f7f592 100644 Binary files a/docs/images/assistant-review-dark.webp and b/docs/images/assistant-review-dark.webp differ diff --git a/docs/images/assistant-review-light.webp b/docs/images/assistant-review-light.webp index 8a213c86f..54d8aefed 100644 Binary files a/docs/images/assistant-review-light.webp and b/docs/images/assistant-review-light.webp differ diff --git a/docs/images/assistant-settings-dark.webp b/docs/images/assistant-settings-dark.webp index c6e6a4493..72a9890f5 100644 Binary files a/docs/images/assistant-settings-dark.webp and b/docs/images/assistant-settings-dark.webp differ diff --git a/docs/images/assistant-settings-light.webp b/docs/images/assistant-settings-light.webp index f0e7cff4f..a370692d8 100644 Binary files a/docs/images/assistant-settings-light.webp and b/docs/images/assistant-settings-light.webp differ diff --git a/docs/images/board-dark.webp b/docs/images/board-dark.webp index 3b27a4e94..09cbe408d 100644 Binary files a/docs/images/board-dark.webp and b/docs/images/board-dark.webp differ diff --git a/docs/images/board-fold-notes-dark.webp b/docs/images/board-fold-notes-dark.webp index 93c2ad34c..f25e36a83 100644 Binary files a/docs/images/board-fold-notes-dark.webp and b/docs/images/board-fold-notes-dark.webp differ diff --git a/docs/images/board-fold-notes-light.webp b/docs/images/board-fold-notes-light.webp index 7d4664231..22f692fa1 100644 Binary files a/docs/images/board-fold-notes-light.webp and b/docs/images/board-fold-notes-light.webp differ diff --git a/docs/images/board-light.webp b/docs/images/board-light.webp index 842fad3bb..f3e15e035 100644 Binary files a/docs/images/board-light.webp and b/docs/images/board-light.webp differ diff --git a/docs/images/card-activity-dark.webp b/docs/images/card-activity-dark.webp index d1ab5e0a3..547487f08 100644 Binary files a/docs/images/card-activity-dark.webp and b/docs/images/card-activity-dark.webp differ diff --git a/docs/images/card-activity-light.webp b/docs/images/card-activity-light.webp index ac9442fac..a26e41b43 100644 Binary files a/docs/images/card-activity-light.webp and b/docs/images/card-activity-light.webp differ diff --git a/docs/images/card-assistant-chat-dark.webp b/docs/images/card-assistant-chat-dark.webp index 3a09bceb0..11d079d14 100644 Binary files a/docs/images/card-assistant-chat-dark.webp and b/docs/images/card-assistant-chat-dark.webp differ diff --git a/docs/images/card-assistant-chat-light.webp b/docs/images/card-assistant-chat-light.webp index f19a829f6..90ec10b98 100644 Binary files a/docs/images/card-assistant-chat-light.webp and b/docs/images/card-assistant-chat-light.webp differ diff --git a/docs/images/card-board-dark.webp b/docs/images/card-board-dark.webp index 687075d30..7feaa9f6d 100644 Binary files a/docs/images/card-board-dark.webp and b/docs/images/card-board-dark.webp differ diff --git a/docs/images/card-board-light.webp b/docs/images/card-board-light.webp index ce2728a47..e866e5a17 100644 Binary files a/docs/images/card-board-light.webp and b/docs/images/card-board-light.webp differ diff --git a/docs/images/card-comments-dark.webp b/docs/images/card-comments-dark.webp index fb9627ba5..ccc850100 100644 Binary files a/docs/images/card-comments-dark.webp and b/docs/images/card-comments-dark.webp differ diff --git a/docs/images/card-comments-light.webp b/docs/images/card-comments-light.webp index 780f0fc0b..4928dd542 100644 Binary files a/docs/images/card-comments-light.webp and b/docs/images/card-comments-light.webp differ diff --git a/docs/images/card-dashboard-dark.webp b/docs/images/card-dashboard-dark.webp index e2bdc131b..a1563aa41 100644 Binary files a/docs/images/card-dashboard-dark.webp and b/docs/images/card-dashboard-dark.webp differ diff --git a/docs/images/card-dashboard-light.webp b/docs/images/card-dashboard-light.webp index 8e7c6ad18..e1cf7b43b 100644 Binary files a/docs/images/card-dashboard-light.webp and b/docs/images/card-dashboard-light.webp differ diff --git a/docs/images/card-filter-dark.webp b/docs/images/card-filter-dark.webp index 02267399a..ab1e5dbb9 100644 Binary files a/docs/images/card-filter-dark.webp and b/docs/images/card-filter-dark.webp differ diff --git a/docs/images/card-filter-light.webp b/docs/images/card-filter-light.webp index ddac939f4..2012df1da 100644 Binary files a/docs/images/card-filter-light.webp and b/docs/images/card-filter-light.webp differ diff --git a/docs/images/card-import-dark.webp b/docs/images/card-import-dark.webp index d17597a42..153d5f079 100644 Binary files a/docs/images/card-import-dark.webp and b/docs/images/card-import-dark.webp differ diff --git a/docs/images/card-import-light.webp b/docs/images/card-import-light.webp index 18658dbc3..a2a8be421 100644 Binary files a/docs/images/card-import-light.webp and b/docs/images/card-import-light.webp differ diff --git a/docs/images/card-labels-dark.webp b/docs/images/card-labels-dark.webp index 0551c1075..45a763ca0 100644 Binary files a/docs/images/card-labels-dark.webp and b/docs/images/card-labels-dark.webp differ diff --git a/docs/images/card-labels-light.webp b/docs/images/card-labels-light.webp index 3095a109a..fceb88c13 100644 Binary files a/docs/images/card-labels-light.webp and b/docs/images/card-labels-light.webp differ diff --git a/docs/images/card-mobile-today-dark.webp b/docs/images/card-mobile-today-dark.webp index 7b3ca711a..cd6d629ee 100644 Binary files a/docs/images/card-mobile-today-dark.webp and b/docs/images/card-mobile-today-dark.webp differ diff --git a/docs/images/card-mobile-today-light.webp b/docs/images/card-mobile-today-light.webp index ac260d5f7..dc12919bd 100644 Binary files a/docs/images/card-mobile-today-light.webp and b/docs/images/card-mobile-today-light.webp differ diff --git a/docs/images/card-notifications-dark.webp b/docs/images/card-notifications-dark.webp index 7d5753979..cb99f72ec 100644 Binary files a/docs/images/card-notifications-dark.webp and b/docs/images/card-notifications-dark.webp differ diff --git a/docs/images/card-notifications-light.webp b/docs/images/card-notifications-light.webp index ca0d1e380..35bdd6d53 100644 Binary files a/docs/images/card-notifications-light.webp and b/docs/images/card-notifications-light.webp differ diff --git a/docs/images/card-project-list-dark.webp b/docs/images/card-project-list-dark.webp index b3ab1fd00..44fd37841 100644 Binary files a/docs/images/card-project-list-dark.webp and b/docs/images/card-project-list-dark.webp differ diff --git a/docs/images/card-project-list-light.webp b/docs/images/card-project-list-light.webp index ea689fcfa..0c601b074 100644 Binary files a/docs/images/card-project-list-light.webp and b/docs/images/card-project-list-light.webp differ diff --git a/docs/images/card-quick-add-dark.webp b/docs/images/card-quick-add-dark.webp index 792444a1c..501e04c18 100644 Binary files a/docs/images/card-quick-add-dark.webp and b/docs/images/card-quick-add-dark.webp differ diff --git a/docs/images/card-quick-add-light.webp b/docs/images/card-quick-add-light.webp index c379b4eca..23c723fb5 100644 Binary files a/docs/images/card-quick-add-light.webp and b/docs/images/card-quick-add-light.webp differ diff --git a/docs/images/card-settings-dark.webp b/docs/images/card-settings-dark.webp index d1c663a2c..a0b6715c9 100644 Binary files a/docs/images/card-settings-dark.webp and b/docs/images/card-settings-dark.webp differ diff --git a/docs/images/card-settings-light.webp b/docs/images/card-settings-light.webp index 030d1d7ce..b4d61641f 100644 Binary files a/docs/images/card-settings-light.webp and b/docs/images/card-settings-light.webp differ diff --git a/docs/images/card-settings-security-dark.webp b/docs/images/card-settings-security-dark.webp index 3092bcb9b..12bb512ff 100644 Binary files a/docs/images/card-settings-security-dark.webp and b/docs/images/card-settings-security-dark.webp differ diff --git a/docs/images/card-settings-security-light.webp b/docs/images/card-settings-security-light.webp index c30fd3d6d..ffa150178 100644 Binary files a/docs/images/card-settings-security-light.webp and b/docs/images/card-settings-security-light.webp differ diff --git a/docs/images/card-settings-workspaces-dark.webp b/docs/images/card-settings-workspaces-dark.webp index b5762efe2..d85eef485 100644 Binary files a/docs/images/card-settings-workspaces-dark.webp and b/docs/images/card-settings-workspaces-dark.webp differ diff --git a/docs/images/card-settings-workspaces-light.webp b/docs/images/card-settings-workspaces-light.webp index 59c72b7b8..5d2055fca 100644 Binary files a/docs/images/card-settings-workspaces-light.webp and b/docs/images/card-settings-workspaces-light.webp differ diff --git a/docs/images/card-shortcuts-dark.webp b/docs/images/card-shortcuts-dark.webp index 62488d751..e8a4b8705 100644 Binary files a/docs/images/card-shortcuts-dark.webp and b/docs/images/card-shortcuts-dark.webp differ diff --git a/docs/images/card-shortcuts-light.webp b/docs/images/card-shortcuts-light.webp index 187b83dd2..f48f77dee 100644 Binary files a/docs/images/card-shortcuts-light.webp and b/docs/images/card-shortcuts-light.webp differ diff --git a/docs/images/card-signin-dark.webp b/docs/images/card-signin-dark.webp index 26d88a1e1..8ecb2fdd5 100644 Binary files a/docs/images/card-signin-dark.webp and b/docs/images/card-signin-dark.webp differ diff --git a/docs/images/card-signin-light.webp b/docs/images/card-signin-light.webp index b6cd89ced..05bc38cbc 100644 Binary files a/docs/images/card-signin-light.webp and b/docs/images/card-signin-light.webp differ diff --git a/docs/images/card-sync-status-dark.webp b/docs/images/card-sync-status-dark.webp index f47c931fb..c4c295f5e 100644 Binary files a/docs/images/card-sync-status-dark.webp and b/docs/images/card-sync-status-dark.webp differ diff --git a/docs/images/card-sync-status-light.webp b/docs/images/card-sync-status-light.webp index b935cc831..330e1d55e 100644 Binary files a/docs/images/card-sync-status-light.webp and b/docs/images/card-sync-status-light.webp differ diff --git a/docs/images/card-today-dark.webp b/docs/images/card-today-dark.webp index 04015f316..e3786d67c 100644 Binary files a/docs/images/card-today-dark.webp and b/docs/images/card-today-dark.webp differ diff --git a/docs/images/card-today-light.webp b/docs/images/card-today-light.webp index 59ba4baea..984250b9e 100644 Binary files a/docs/images/card-today-light.webp and b/docs/images/card-today-light.webp differ diff --git a/docs/images/card-trash-dark.webp b/docs/images/card-trash-dark.webp index f74e71274..ae05159ca 100644 Binary files a/docs/images/card-trash-dark.webp and b/docs/images/card-trash-dark.webp differ diff --git a/docs/images/card-trash-light.webp b/docs/images/card-trash-light.webp index e4386e395..66e48ddef 100644 Binary files a/docs/images/card-trash-light.webp and b/docs/images/card-trash-light.webp differ diff --git a/docs/images/card-upcoming-dark.webp b/docs/images/card-upcoming-dark.webp index 3f2478a05..23b74d51e 100644 Binary files a/docs/images/card-upcoming-dark.webp and b/docs/images/card-upcoming-dark.webp differ diff --git a/docs/images/card-upcoming-light.webp b/docs/images/card-upcoming-light.webp index 9c902abcb..ef9ecf9c8 100644 Binary files a/docs/images/card-upcoming-light.webp and b/docs/images/card-upcoming-light.webp differ diff --git a/docs/images/card-week-dark.webp b/docs/images/card-week-dark.webp index 69a10fa4c..e4b38f57a 100644 Binary files a/docs/images/card-week-dark.webp and b/docs/images/card-week-dark.webp differ diff --git a/docs/images/card-week-light.webp b/docs/images/card-week-light.webp index 9f3a52a67..f629a0ade 100644 Binary files a/docs/images/card-week-light.webp and b/docs/images/card-week-light.webp differ diff --git a/docs/images/close-day-dark.webp b/docs/images/close-day-dark.webp index c40fc3abe..45cbab141 100644 Binary files a/docs/images/close-day-dark.webp and b/docs/images/close-day-dark.webp differ diff --git a/docs/images/close-day-light.webp b/docs/images/close-day-light.webp index aca0095b9..d76b90523 100644 Binary files a/docs/images/close-day-light.webp and b/docs/images/close-day-light.webp differ diff --git a/docs/images/comments-dark.webp b/docs/images/comments-dark.webp index 9d59331fe..37c50583a 100644 Binary files a/docs/images/comments-dark.webp and b/docs/images/comments-dark.webp differ diff --git a/docs/images/comments-light.webp b/docs/images/comments-light.webp index cb3d216a4..4c43f4c6d 100644 Binary files a/docs/images/comments-light.webp and b/docs/images/comments-light.webp differ diff --git a/docs/images/completed-calendar-dark.webp b/docs/images/completed-calendar-dark.webp index c4e3928e1..7d7ebeffc 100644 Binary files a/docs/images/completed-calendar-dark.webp and b/docs/images/completed-calendar-dark.webp differ diff --git a/docs/images/completed-calendar-light.webp b/docs/images/completed-calendar-light.webp index 27465e096..faaf3bc64 100644 Binary files a/docs/images/completed-calendar-light.webp and b/docs/images/completed-calendar-light.webp differ diff --git a/docs/images/custom-accent-dark.webp b/docs/images/custom-accent-dark.webp index bd988f2e7..ed95460b0 100644 Binary files a/docs/images/custom-accent-dark.webp and b/docs/images/custom-accent-dark.webp differ diff --git a/docs/images/custom-accent-light.webp b/docs/images/custom-accent-light.webp index f95de0f6a..c7830966b 100644 Binary files a/docs/images/custom-accent-light.webp and b/docs/images/custom-accent-light.webp differ diff --git a/docs/images/custom-fields-dark.webp b/docs/images/custom-fields-dark.webp index 740252424..a808dcdf2 100644 Binary files a/docs/images/custom-fields-dark.webp and b/docs/images/custom-fields-dark.webp differ diff --git a/docs/images/custom-fields-light.webp b/docs/images/custom-fields-light.webp index 8b69baea5..a4fbd348b 100644 Binary files a/docs/images/custom-fields-light.webp and b/docs/images/custom-fields-light.webp differ diff --git a/docs/images/dashboard-dark.webp b/docs/images/dashboard-dark.webp index 99ab3696c..c4063de7f 100644 Binary files a/docs/images/dashboard-dark.webp and b/docs/images/dashboard-dark.webp differ diff --git a/docs/images/dashboard-light.webp b/docs/images/dashboard-light.webp index 18b19758d..84a555b9d 100644 Binary files a/docs/images/dashboard-light.webp and b/docs/images/dashboard-light.webp differ diff --git a/docs/images/day-dark.webp b/docs/images/day-dark.webp index abaf104c9..70a12402d 100644 Binary files a/docs/images/day-dark.webp and b/docs/images/day-dark.webp differ diff --git a/docs/images/day-light.webp b/docs/images/day-light.webp index 8c0f5f677..7e8975626 100644 Binary files a/docs/images/day-light.webp and b/docs/images/day-light.webp differ diff --git a/docs/images/demo-signin-dark.webp b/docs/images/demo-signin-dark.webp index 1f5e16444..80411034e 100644 Binary files a/docs/images/demo-signin-dark.webp and b/docs/images/demo-signin-dark.webp differ diff --git a/docs/images/demo-signin-light.webp b/docs/images/demo-signin-light.webp index 81b629aca..80f13b98e 100644 Binary files a/docs/images/demo-signin-light.webp and b/docs/images/demo-signin-light.webp differ diff --git a/docs/images/display-today-dark.webp b/docs/images/display-today-dark.webp index c0b2a1894..cc5419c87 100644 Binary files a/docs/images/display-today-dark.webp and b/docs/images/display-today-dark.webp differ diff --git a/docs/images/display-today-light.webp b/docs/images/display-today-light.webp index 3969ef45a..fffb6ee7e 100644 Binary files a/docs/images/display-today-light.webp and b/docs/images/display-today-light.webp differ diff --git a/docs/images/eisenhower-dark.webp b/docs/images/eisenhower-dark.webp index ee6bcd7a2..7a0c63f6c 100644 Binary files a/docs/images/eisenhower-dark.webp and b/docs/images/eisenhower-dark.webp differ diff --git a/docs/images/eisenhower-light.webp b/docs/images/eisenhower-light.webp index aa93a60c4..ecd424209 100644 Binary files a/docs/images/eisenhower-light.webp and b/docs/images/eisenhower-light.webp differ diff --git a/docs/images/expand-a-row-dark.webp b/docs/images/expand-a-row-dark.webp index a140fdcda..322549bd0 100644 Binary files a/docs/images/expand-a-row-dark.webp and b/docs/images/expand-a-row-dark.webp differ diff --git a/docs/images/expand-a-row-light.webp b/docs/images/expand-a-row-light.webp index ea276e060..1bfc789f6 100644 Binary files a/docs/images/expand-a-row-light.webp and b/docs/images/expand-a-row-light.webp differ diff --git a/docs/images/filter-dark.webp b/docs/images/filter-dark.webp index 4fea9580f..0ec7d7930 100644 Binary files a/docs/images/filter-dark.webp and b/docs/images/filter-dark.webp differ diff --git a/docs/images/filter-light.webp b/docs/images/filter-light.webp index 0bdd2e942..007468afe 100644 Binary files a/docs/images/filter-light.webp and b/docs/images/filter-light.webp differ diff --git a/docs/images/focus-dark.webp b/docs/images/focus-dark.webp index f4b1f2aff..cb8a55658 100644 Binary files a/docs/images/focus-dark.webp and b/docs/images/focus-dark.webp differ diff --git a/docs/images/focus-light.webp b/docs/images/focus-light.webp index a237ef0ae..193e55b99 100644 Binary files a/docs/images/focus-light.webp and b/docs/images/focus-light.webp differ diff --git a/docs/images/frames-dark.webp b/docs/images/frames-dark.webp index bd903373b..93d4f17ff 100644 Binary files a/docs/images/frames-dark.webp and b/docs/images/frames-dark.webp differ diff --git a/docs/images/frames-light.webp b/docs/images/frames-light.webp index 86dd49cb8..c9be91912 100644 Binary files a/docs/images/frames-light.webp and b/docs/images/frames-light.webp differ diff --git a/docs/images/group-and-order-dark.webp b/docs/images/group-and-order-dark.webp index 9ff6e6ba4..8a647d551 100644 Binary files a/docs/images/group-and-order-dark.webp and b/docs/images/group-and-order-dark.webp differ diff --git a/docs/images/group-and-order-light.webp b/docs/images/group-and-order-light.webp index b4419b4bf..8afec4795 100644 Binary files a/docs/images/group-and-order-light.webp and b/docs/images/group-and-order-light.webp differ diff --git a/docs/images/history-dark.webp b/docs/images/history-dark.webp index 2350a1a37..c07b851a6 100644 Binary files a/docs/images/history-dark.webp and b/docs/images/history-dark.webp differ diff --git a/docs/images/history-light.webp b/docs/images/history-light.webp index 26d8da04b..758541116 100644 Binary files a/docs/images/history-light.webp and b/docs/images/history-light.webp differ diff --git a/docs/images/import-anydo-dark.webp b/docs/images/import-anydo-dark.webp index 8dbe0b6e3..cb9034768 100644 Binary files a/docs/images/import-anydo-dark.webp and b/docs/images/import-anydo-dark.webp differ diff --git a/docs/images/import-anydo-light.webp b/docs/images/import-anydo-light.webp index 463f09424..7200ca8b2 100644 Binary files a/docs/images/import-anydo-light.webp and b/docs/images/import-anydo-light.webp differ diff --git a/docs/images/import-apple-reminders-dark.webp b/docs/images/import-apple-reminders-dark.webp index c73e2e6e9..85edf0e72 100644 Binary files a/docs/images/import-apple-reminders-dark.webp and b/docs/images/import-apple-reminders-dark.webp differ diff --git a/docs/images/import-apple-reminders-light.webp b/docs/images/import-apple-reminders-light.webp index b01a9febd..4ea5b2adb 100644 Binary files a/docs/images/import-apple-reminders-light.webp and b/docs/images/import-apple-reminders-light.webp differ diff --git a/docs/images/import-asana-dark.webp b/docs/images/import-asana-dark.webp index 098776073..ac4ef64d4 100644 Binary files a/docs/images/import-asana-dark.webp and b/docs/images/import-asana-dark.webp differ diff --git a/docs/images/import-asana-light.webp b/docs/images/import-asana-light.webp index 58c2a9bef..6a8e52f77 100644 Binary files a/docs/images/import-asana-light.webp and b/docs/images/import-asana-light.webp differ diff --git a/docs/images/import-dark.webp b/docs/images/import-dark.webp index e847ee495..b03e0510b 100644 Binary files a/docs/images/import-dark.webp and b/docs/images/import-dark.webp differ diff --git a/docs/images/import-google-tasks-dark.webp b/docs/images/import-google-tasks-dark.webp index 3163d8cce..c8bef7616 100644 Binary files a/docs/images/import-google-tasks-dark.webp and b/docs/images/import-google-tasks-dark.webp differ diff --git a/docs/images/import-google-tasks-light.webp b/docs/images/import-google-tasks-light.webp index 7fc2c0506..c90707511 100644 Binary files a/docs/images/import-google-tasks-light.webp and b/docs/images/import-google-tasks-light.webp differ diff --git a/docs/images/import-light.webp b/docs/images/import-light.webp index 1769d3ff3..0301f264d 100644 Binary files a/docs/images/import-light.webp and b/docs/images/import-light.webp differ diff --git a/docs/images/import-linear-dark.webp b/docs/images/import-linear-dark.webp index 3615dc9a1..1ef9ae464 100644 Binary files a/docs/images/import-linear-dark.webp and b/docs/images/import-linear-dark.webp differ diff --git a/docs/images/import-linear-light.webp b/docs/images/import-linear-light.webp index 26c82dd7b..a4b992367 100644 Binary files a/docs/images/import-linear-light.webp and b/docs/images/import-linear-light.webp differ diff --git a/docs/images/import-microsoft-todo-dark.webp b/docs/images/import-microsoft-todo-dark.webp index 79dac56c0..28800711c 100644 Binary files a/docs/images/import-microsoft-todo-dark.webp and b/docs/images/import-microsoft-todo-dark.webp differ diff --git a/docs/images/import-microsoft-todo-light.webp b/docs/images/import-microsoft-todo-light.webp index dd6cebca5..706dbbef8 100644 Binary files a/docs/images/import-microsoft-todo-light.webp and b/docs/images/import-microsoft-todo-light.webp differ diff --git a/docs/images/import-things-dark.webp b/docs/images/import-things-dark.webp index 76b9f0ece..b94f7ad63 100644 Binary files a/docs/images/import-things-dark.webp and b/docs/images/import-things-dark.webp differ diff --git a/docs/images/import-things-light.webp b/docs/images/import-things-light.webp index c5616a43c..e99c1a615 100644 Binary files a/docs/images/import-things-light.webp and b/docs/images/import-things-light.webp differ diff --git a/docs/images/import-ticktick-dark.webp b/docs/images/import-ticktick-dark.webp index ae616bb96..98bbcdb42 100644 Binary files a/docs/images/import-ticktick-dark.webp and b/docs/images/import-ticktick-dark.webp differ diff --git a/docs/images/import-ticktick-light.webp b/docs/images/import-ticktick-light.webp index 5bff0cd13..cecd077ef 100644 Binary files a/docs/images/import-ticktick-light.webp and b/docs/images/import-ticktick-light.webp differ diff --git a/docs/images/import-todoist-dark.webp b/docs/images/import-todoist-dark.webp index 8eb19e038..8dcd309d6 100644 Binary files a/docs/images/import-todoist-dark.webp and b/docs/images/import-todoist-dark.webp differ diff --git a/docs/images/import-todoist-light.webp b/docs/images/import-todoist-light.webp index 7de589813..428172277 100644 Binary files a/docs/images/import-todoist-light.webp and b/docs/images/import-todoist-light.webp differ diff --git a/docs/images/import-trello-dark.webp b/docs/images/import-trello-dark.webp index 8812c0587..84dd8dbc1 100644 Binary files a/docs/images/import-trello-dark.webp and b/docs/images/import-trello-dark.webp differ diff --git a/docs/images/import-trello-light.webp b/docs/images/import-trello-light.webp index 75c9846ee..359a7e35b 100644 Binary files a/docs/images/import-trello-light.webp and b/docs/images/import-trello-light.webp differ diff --git a/docs/images/label-menu-dark.webp b/docs/images/label-menu-dark.webp index ee13f6ba7..f040b996f 100644 Binary files a/docs/images/label-menu-dark.webp and b/docs/images/label-menu-dark.webp differ diff --git a/docs/images/label-menu-light.webp b/docs/images/label-menu-light.webp index 74016a668..0dd57ff7a 100644 Binary files a/docs/images/label-menu-light.webp and b/docs/images/label-menu-light.webp differ diff --git a/docs/images/labels-dark.webp b/docs/images/labels-dark.webp index 67417cd65..1ad09d50a 100644 Binary files a/docs/images/labels-dark.webp and b/docs/images/labels-dark.webp differ diff --git a/docs/images/labels-light.webp b/docs/images/labels-light.webp index eb2f69364..a15a22d70 100644 Binary files a/docs/images/labels-light.webp and b/docs/images/labels-light.webp differ diff --git a/docs/images/location-reminders-dark.webp b/docs/images/location-reminders-dark.webp index 44463f17d..aa6486543 100644 Binary files a/docs/images/location-reminders-dark.webp and b/docs/images/location-reminders-dark.webp differ diff --git a/docs/images/location-reminders-light.webp b/docs/images/location-reminders-light.webp index fcdbbe4b8..87b0ec6c4 100644 Binary files a/docs/images/location-reminders-light.webp and b/docs/images/location-reminders-light.webp differ diff --git a/docs/images/locations-dark.webp b/docs/images/locations-dark.webp index 3754d8817..7c8121ff5 100644 Binary files a/docs/images/locations-dark.webp and b/docs/images/locations-dark.webp differ diff --git a/docs/images/locations-light.webp b/docs/images/locations-light.webp index 7421b5ff2..32e8d345a 100644 Binary files a/docs/images/locations-light.webp and b/docs/images/locations-light.webp differ diff --git a/docs/images/loop-dark.webp b/docs/images/loop-dark.webp index 62bc68958..79459346f 100644 Binary files a/docs/images/loop-dark.webp and b/docs/images/loop-dark.webp differ diff --git a/docs/images/loop-light.webp b/docs/images/loop-light.webp index 1e76b837a..690ba16ac 100644 Binary files a/docs/images/loop-light.webp and b/docs/images/loop-light.webp differ diff --git a/docs/images/members-dark.webp b/docs/images/members-dark.webp index 0eb547d71..678f69acf 100644 Binary files a/docs/images/members-dark.webp and b/docs/images/members-dark.webp differ diff --git a/docs/images/members-light.webp b/docs/images/members-light.webp index 63340f513..be6e58e5c 100644 Binary files a/docs/images/members-light.webp and b/docs/images/members-light.webp differ diff --git a/docs/images/mobile-menu-dark.webp b/docs/images/mobile-menu-dark.webp index 142eedce2..c8105f025 100644 Binary files a/docs/images/mobile-menu-dark.webp and b/docs/images/mobile-menu-dark.webp differ diff --git a/docs/images/mobile-menu-light.webp b/docs/images/mobile-menu-light.webp index 4b111280d..b5f9d352e 100644 Binary files a/docs/images/mobile-menu-light.webp and b/docs/images/mobile-menu-light.webp differ diff --git a/docs/images/mobile-today-dark.webp b/docs/images/mobile-today-dark.webp index 25269905f..1996b7d67 100644 Binary files a/docs/images/mobile-today-dark.webp and b/docs/images/mobile-today-dark.webp differ diff --git a/docs/images/mobile-today-light.webp b/docs/images/mobile-today-light.webp index 09392eb43..8c9289531 100644 Binary files a/docs/images/mobile-today-light.webp and b/docs/images/mobile-today-light.webp differ diff --git a/docs/images/next-dark.webp b/docs/images/next-dark.webp index 8c9fefaae..3a4f3998a 100644 Binary files a/docs/images/next-dark.webp and b/docs/images/next-dark.webp differ diff --git a/docs/images/next-light.webp b/docs/images/next-light.webp index d0196ba9a..a88701477 100644 Binary files a/docs/images/next-light.webp and b/docs/images/next-light.webp differ diff --git a/docs/images/notes-dark.webp b/docs/images/notes-dark.webp index afa537a83..f221596c7 100644 Binary files a/docs/images/notes-dark.webp and b/docs/images/notes-dark.webp differ diff --git a/docs/images/notes-light.webp b/docs/images/notes-light.webp index d9b0c5b86..558627452 100644 Binary files a/docs/images/notes-light.webp and b/docs/images/notes-light.webp differ diff --git a/docs/images/notifications-dark.webp b/docs/images/notifications-dark.webp index 02ad334e1..d619a52b5 100644 Binary files a/docs/images/notifications-dark.webp and b/docs/images/notifications-dark.webp differ diff --git a/docs/images/notifications-light.webp b/docs/images/notifications-light.webp index fb34b1c4d..5c0c7c1d5 100644 Binary files a/docs/images/notifications-light.webp and b/docs/images/notifications-light.webp differ diff --git a/docs/images/plan-dark.webp b/docs/images/plan-dark.webp index d7abd9620..ccf64f208 100644 Binary files a/docs/images/plan-dark.webp and b/docs/images/plan-dark.webp differ diff --git a/docs/images/plan-light.webp b/docs/images/plan-light.webp index f86621a4d..8aae21336 100644 Binary files a/docs/images/plan-light.webp and b/docs/images/plan-light.webp differ diff --git a/docs/images/project-completed-dark.webp b/docs/images/project-completed-dark.webp index a85ed2c93..6f02dc922 100644 Binary files a/docs/images/project-completed-dark.webp and b/docs/images/project-completed-dark.webp differ diff --git a/docs/images/project-completed-light.webp b/docs/images/project-completed-light.webp index d5e77da00..df128f8ad 100644 Binary files a/docs/images/project-completed-light.webp and b/docs/images/project-completed-light.webp differ diff --git a/docs/images/project-list-dark.webp b/docs/images/project-list-dark.webp index b49e462ff..d6101dc25 100644 Binary files a/docs/images/project-list-dark.webp and b/docs/images/project-list-dark.webp differ diff --git a/docs/images/project-list-light.webp b/docs/images/project-list-light.webp index a7932f9a4..c8c7c31dc 100644 Binary files a/docs/images/project-list-light.webp and b/docs/images/project-list-light.webp differ diff --git a/docs/images/project-move-dark.webp b/docs/images/project-move-dark.webp index 008f2c704..cef99ca7e 100644 Binary files a/docs/images/project-move-dark.webp and b/docs/images/project-move-dark.webp differ diff --git a/docs/images/project-move-light.webp b/docs/images/project-move-light.webp index cd0245a26..d8c5f247b 100644 Binary files a/docs/images/project-move-light.webp and b/docs/images/project-move-light.webp differ diff --git a/docs/images/quick-add-dark.webp b/docs/images/quick-add-dark.webp index 7e89ad526..a5a05a2e8 100644 Binary files a/docs/images/quick-add-dark.webp and b/docs/images/quick-add-dark.webp differ diff --git a/docs/images/quick-add-light.webp b/docs/images/quick-add-light.webp index f0e39a10e..2ecd29dd3 100644 Binary files a/docs/images/quick-add-light.webp and b/docs/images/quick-add-light.webp differ diff --git a/docs/images/reminders-dark.webp b/docs/images/reminders-dark.webp index f4ec51e7b..1231ec87b 100644 Binary files a/docs/images/reminders-dark.webp and b/docs/images/reminders-dark.webp differ diff --git a/docs/images/reminders-light.webp b/docs/images/reminders-light.webp index bf1da62a5..1dc2a2194 100644 Binary files a/docs/images/reminders-light.webp and b/docs/images/reminders-light.webp differ diff --git a/docs/images/repeat-dark.webp b/docs/images/repeat-dark.webp index abe4496e0..6c2010c03 100644 Binary files a/docs/images/repeat-dark.webp and b/docs/images/repeat-dark.webp differ diff --git a/docs/images/repeat-light.webp b/docs/images/repeat-light.webp index 74560a9ef..31e67b392 100644 Binary files a/docs/images/repeat-light.webp and b/docs/images/repeat-light.webp differ diff --git a/docs/images/repeating-calendar-dark.webp b/docs/images/repeating-calendar-dark.webp index 31c779f4c..473fa91e8 100644 Binary files a/docs/images/repeating-calendar-dark.webp and b/docs/images/repeating-calendar-dark.webp differ diff --git a/docs/images/repeating-calendar-light.webp b/docs/images/repeating-calendar-light.webp index 50d9fb99c..f3376f26c 100644 Binary files a/docs/images/repeating-calendar-light.webp and b/docs/images/repeating-calendar-light.webp differ diff --git a/docs/images/reusable-list-dark.webp b/docs/images/reusable-list-dark.webp index 005bae3cf..5f6aee8ba 100644 Binary files a/docs/images/reusable-list-dark.webp and b/docs/images/reusable-list-dark.webp differ diff --git a/docs/images/reusable-list-light.webp b/docs/images/reusable-list-light.webp index 700079fd1..5abca5055 100644 Binary files a/docs/images/reusable-list-light.webp and b/docs/images/reusable-list-light.webp differ diff --git a/docs/images/reusable-list-menu-dark.webp b/docs/images/reusable-list-menu-dark.webp index f0a53a23c..8ccd58bf6 100644 Binary files a/docs/images/reusable-list-menu-dark.webp and b/docs/images/reusable-list-menu-dark.webp differ diff --git a/docs/images/reusable-list-menu-light.webp b/docs/images/reusable-list-menu-light.webp index 421b624d8..d4bdf7d21 100644 Binary files a/docs/images/reusable-list-menu-light.webp and b/docs/images/reusable-list-menu-light.webp differ diff --git a/docs/images/review-dark.webp b/docs/images/review-dark.webp index ba1b33a2b..c34e9ad1b 100644 Binary files a/docs/images/review-dark.webp and b/docs/images/review-dark.webp differ diff --git a/docs/images/review-light.webp b/docs/images/review-light.webp index eb382b879..ab7d953b9 100644 Binary files a/docs/images/review-light.webp and b/docs/images/review-light.webp differ diff --git a/docs/images/review-walk-dark.webp b/docs/images/review-walk-dark.webp index a18ea31f0..a06427789 100644 Binary files a/docs/images/review-walk-dark.webp and b/docs/images/review-walk-dark.webp differ diff --git a/docs/images/review-walk-light.webp b/docs/images/review-walk-light.webp index 316eadf02..779e49b83 100644 Binary files a/docs/images/review-walk-light.webp and b/docs/images/review-walk-light.webp differ diff --git a/docs/images/row-layouts-dark.webp b/docs/images/row-layouts-dark.webp index 4c0b23983..fbbb1843a 100644 Binary files a/docs/images/row-layouts-dark.webp and b/docs/images/row-layouts-dark.webp differ diff --git a/docs/images/row-layouts-light.webp b/docs/images/row-layouts-light.webp index 4c3399449..1b3a620d7 100644 Binary files a/docs/images/row-layouts-light.webp and b/docs/images/row-layouts-light.webp differ diff --git a/docs/images/rules-dark.webp b/docs/images/rules-dark.webp index de111f625..714dbaa4e 100644 Binary files a/docs/images/rules-dark.webp and b/docs/images/rules-dark.webp differ diff --git a/docs/images/rules-light.webp b/docs/images/rules-light.webp index a76399424..259562970 100644 Binary files a/docs/images/rules-light.webp and b/docs/images/rules-light.webp differ diff --git a/docs/images/settings-dark.webp b/docs/images/settings-dark.webp index 629623493..75693e010 100644 Binary files a/docs/images/settings-dark.webp and b/docs/images/settings-dark.webp differ diff --git a/docs/images/settings-default-reminders-dark.webp b/docs/images/settings-default-reminders-dark.webp index c7b4fee3b..0d709f10e 100644 Binary files a/docs/images/settings-default-reminders-dark.webp and b/docs/images/settings-default-reminders-dark.webp differ diff --git a/docs/images/settings-default-reminders-light.webp b/docs/images/settings-default-reminders-light.webp index e841e3246..ceef72904 100644 Binary files a/docs/images/settings-default-reminders-light.webp and b/docs/images/settings-default-reminders-light.webp differ diff --git a/docs/images/settings-light.webp b/docs/images/settings-light.webp index e51917951..3469e771f 100644 Binary files a/docs/images/settings-light.webp and b/docs/images/settings-light.webp differ diff --git a/docs/images/settings-notification-channels-dark.webp b/docs/images/settings-notification-channels-dark.webp index 516070cea..caf80413e 100644 Binary files a/docs/images/settings-notification-channels-dark.webp and b/docs/images/settings-notification-channels-dark.webp differ diff --git a/docs/images/settings-notification-channels-light.webp b/docs/images/settings-notification-channels-light.webp index 687a18e93..4d07d789e 100644 Binary files a/docs/images/settings-notification-channels-light.webp and b/docs/images/settings-notification-channels-light.webp differ diff --git a/docs/images/settings-notifications-dark.webp b/docs/images/settings-notifications-dark.webp index a7c1e1f58..caf71cf24 100644 Binary files a/docs/images/settings-notifications-dark.webp and b/docs/images/settings-notifications-dark.webp differ diff --git a/docs/images/settings-notifications-light.webp b/docs/images/settings-notifications-light.webp index 01fe616b0..d0c2f7ca2 100644 Binary files a/docs/images/settings-notifications-light.webp and b/docs/images/settings-notifications-light.webp differ diff --git a/docs/images/settings-passkeys-dark.webp b/docs/images/settings-passkeys-dark.webp index 6a5e68c1e..c310624ba 100644 Binary files a/docs/images/settings-passkeys-dark.webp and b/docs/images/settings-passkeys-dark.webp differ diff --git a/docs/images/settings-passkeys-light.webp b/docs/images/settings-passkeys-light.webp index 02e594520..e982f7416 100644 Binary files a/docs/images/settings-passkeys-light.webp and b/docs/images/settings-passkeys-light.webp differ diff --git a/docs/images/settings-security-dark.webp b/docs/images/settings-security-dark.webp index 4257f528e..a156809e2 100644 Binary files a/docs/images/settings-security-dark.webp and b/docs/images/settings-security-dark.webp differ diff --git a/docs/images/settings-security-light.webp b/docs/images/settings-security-light.webp index 2a4eff95f..9b73c50ca 100644 Binary files a/docs/images/settings-security-light.webp and b/docs/images/settings-security-light.webp differ diff --git a/docs/images/settings-workspaces-dark.webp b/docs/images/settings-workspaces-dark.webp index 2f4cd63b0..48a8f0836 100644 Binary files a/docs/images/settings-workspaces-dark.webp and b/docs/images/settings-workspaces-dark.webp differ diff --git a/docs/images/settings-workspaces-light.webp b/docs/images/settings-workspaces-light.webp index 62bf94bee..03ddc909c 100644 Binary files a/docs/images/settings-workspaces-light.webp and b/docs/images/settings-workspaces-light.webp differ diff --git a/docs/images/setup-owner-dark.webp b/docs/images/setup-owner-dark.webp index 88726cab1..6d50f8c11 100644 Binary files a/docs/images/setup-owner-dark.webp and b/docs/images/setup-owner-dark.webp differ diff --git a/docs/images/setup-owner-light.webp b/docs/images/setup-owner-light.webp index 505fd049f..1e32f8a0a 100644 Binary files a/docs/images/setup-owner-light.webp and b/docs/images/setup-owner-light.webp differ diff --git a/docs/images/share-dialog-dark.webp b/docs/images/share-dialog-dark.webp index a2f08d828..a045baebf 100644 Binary files a/docs/images/share-dialog-dark.webp and b/docs/images/share-dialog-dark.webp differ diff --git a/docs/images/share-dialog-light.webp b/docs/images/share-dialog-light.webp index e78f81bd1..5a6b0776e 100644 Binary files a/docs/images/share-dialog-light.webp and b/docs/images/share-dialog-light.webp differ diff --git a/docs/images/shortcuts-dark.webp b/docs/images/shortcuts-dark.webp index 22088e1ad..6458890c6 100644 Binary files a/docs/images/shortcuts-dark.webp and b/docs/images/shortcuts-dark.webp differ diff --git a/docs/images/shortcuts-light.webp b/docs/images/shortcuts-light.webp index 16ad511d1..173f857ec 100644 Binary files a/docs/images/shortcuts-light.webp and b/docs/images/shortcuts-light.webp differ diff --git a/docs/images/sidebar-dark.webp b/docs/images/sidebar-dark.webp index af0fe95e6..8ba6d3d11 100644 Binary files a/docs/images/sidebar-dark.webp and b/docs/images/sidebar-dark.webp differ diff --git a/docs/images/sidebar-light.webp b/docs/images/sidebar-light.webp index f2f25047f..122c32dc9 100644 Binary files a/docs/images/sidebar-light.webp and b/docs/images/sidebar-light.webp differ diff --git a/docs/images/sidebar-schedule-dark.webp b/docs/images/sidebar-schedule-dark.webp index 2e267cf37..c9ff58b08 100644 Binary files a/docs/images/sidebar-schedule-dark.webp and b/docs/images/sidebar-schedule-dark.webp differ diff --git a/docs/images/sidebar-schedule-light.webp b/docs/images/sidebar-schedule-light.webp index 6c496c948..17638fb5a 100644 Binary files a/docs/images/sidebar-schedule-light.webp and b/docs/images/sidebar-schedule-light.webp differ diff --git a/docs/images/signin-dark.webp b/docs/images/signin-dark.webp index bc83dde84..b010a2202 100644 Binary files a/docs/images/signin-dark.webp and b/docs/images/signin-dark.webp differ diff --git a/docs/images/signin-light.webp b/docs/images/signin-light.webp index 71bd2b3e8..e1c6612ec 100644 Binary files a/docs/images/signin-light.webp and b/docs/images/signin-light.webp differ diff --git a/docs/images/slots-dark.webp b/docs/images/slots-dark.webp index 3e06ea6d4..ad7c3fa78 100644 Binary files a/docs/images/slots-dark.webp and b/docs/images/slots-dark.webp differ diff --git a/docs/images/slots-light.webp b/docs/images/slots-light.webp index 669f5402e..34927a41d 100644 Binary files a/docs/images/slots-light.webp and b/docs/images/slots-light.webp differ diff --git a/docs/images/spans-calendar-dark.webp b/docs/images/spans-calendar-dark.webp index ca7f3f150..df71e7cb8 100644 Binary files a/docs/images/spans-calendar-dark.webp and b/docs/images/spans-calendar-dark.webp differ diff --git a/docs/images/spans-calendar-light.webp b/docs/images/spans-calendar-light.webp index 14ba1be46..1b8aa2e17 100644 Binary files a/docs/images/spans-calendar-light.webp and b/docs/images/spans-calendar-light.webp differ diff --git a/docs/images/stats-dark.webp b/docs/images/stats-dark.webp index 6eb787034..e25db5eb2 100644 Binary files a/docs/images/stats-dark.webp and b/docs/images/stats-dark.webp differ diff --git a/docs/images/stats-light.webp b/docs/images/stats-light.webp index 44318ecc4..82905921c 100644 Binary files a/docs/images/stats-light.webp and b/docs/images/stats-light.webp differ diff --git a/docs/images/sync-status-dark.webp b/docs/images/sync-status-dark.webp index 1201870df..f990a0d67 100644 Binary files a/docs/images/sync-status-dark.webp and b/docs/images/sync-status-dark.webp differ diff --git a/docs/images/sync-status-light.webp b/docs/images/sync-status-light.webp index 1604279e9..80d9efac0 100644 Binary files a/docs/images/sync-status-light.webp and b/docs/images/sync-status-light.webp differ diff --git a/docs/images/task-detail-dark.webp b/docs/images/task-detail-dark.webp index 5a0b0424d..e2eb48825 100644 Binary files a/docs/images/task-detail-dark.webp and b/docs/images/task-detail-dark.webp differ diff --git a/docs/images/task-detail-light.webp b/docs/images/task-detail-light.webp index f5ce8202d..9fe81f755 100644 Binary files a/docs/images/task-detail-light.webp and b/docs/images/task-detail-light.webp differ diff --git a/docs/images/task-page-dark.webp b/docs/images/task-page-dark.webp index a1c5eaf57..a45509740 100644 Binary files a/docs/images/task-page-dark.webp and b/docs/images/task-page-dark.webp differ diff --git a/docs/images/task-page-light.webp b/docs/images/task-page-light.webp index 418a01148..2f7d32a95 100644 Binary files a/docs/images/task-page-light.webp and b/docs/images/task-page-light.webp differ diff --git a/docs/images/theme-catalogue-dark.webp b/docs/images/theme-catalogue-dark.webp index 98e144e3a..3cb93a3f4 100644 Binary files a/docs/images/theme-catalogue-dark.webp and b/docs/images/theme-catalogue-dark.webp differ diff --git a/docs/images/theme-catalogue-light.webp b/docs/images/theme-catalogue-light.webp index 7a5bee6cb..287d27115 100644 Binary files a/docs/images/theme-catalogue-light.webp and b/docs/images/theme-catalogue-light.webp differ diff --git a/docs/images/time-zone-dark.webp b/docs/images/time-zone-dark.webp index 9b55db345..e5fa6338a 100644 Binary files a/docs/images/time-zone-dark.webp and b/docs/images/time-zone-dark.webp differ diff --git a/docs/images/time-zone-light.webp b/docs/images/time-zone-light.webp index 98590bf54..dce75f10c 100644 Binary files a/docs/images/time-zone-light.webp and b/docs/images/time-zone-light.webp differ diff --git a/docs/images/today-agenda-dark.webp b/docs/images/today-agenda-dark.webp index f1a4af2fe..ba17ba5f5 100644 Binary files a/docs/images/today-agenda-dark.webp and b/docs/images/today-agenda-dark.webp differ diff --git a/docs/images/today-agenda-light.webp b/docs/images/today-agenda-light.webp index 3d9c07cf5..e10565af1 100644 Binary files a/docs/images/today-agenda-light.webp and b/docs/images/today-agenda-light.webp differ diff --git a/docs/images/today-dark.webp b/docs/images/today-dark.webp index 9f354809b..a77b0311a 100644 Binary files a/docs/images/today-dark.webp and b/docs/images/today-dark.webp differ diff --git a/docs/images/today-light.webp b/docs/images/today-light.webp index f12c4b66e..f919ad67f 100644 Binary files a/docs/images/today-light.webp and b/docs/images/today-light.webp differ diff --git a/docs/images/trash-dark.webp b/docs/images/trash-dark.webp index 8b3d6ed89..39764718d 100644 Binary files a/docs/images/trash-dark.webp and b/docs/images/trash-dark.webp differ diff --git a/docs/images/trash-light.webp b/docs/images/trash-light.webp index 77752c44c..3c36745ba 100644 Binary files a/docs/images/trash-light.webp and b/docs/images/trash-light.webp differ diff --git a/docs/images/triage-dark.webp b/docs/images/triage-dark.webp index 60f261b5e..539c58914 100644 Binary files a/docs/images/triage-dark.webp and b/docs/images/triage-dark.webp differ diff --git a/docs/images/triage-light.webp b/docs/images/triage-light.webp index 12a19707b..a32007558 100644 Binary files a/docs/images/triage-light.webp and b/docs/images/triage-light.webp differ diff --git a/docs/images/upcoming-dark.webp b/docs/images/upcoming-dark.webp index b0e5fe392..55a2444d5 100644 Binary files a/docs/images/upcoming-dark.webp and b/docs/images/upcoming-dark.webp differ diff --git a/docs/images/upcoming-light.webp b/docs/images/upcoming-light.webp index 847330332..9688bdaa6 100644 Binary files a/docs/images/upcoming-light.webp and b/docs/images/upcoming-light.webp differ diff --git a/docs/images/view-menu-dark.webp b/docs/images/view-menu-dark.webp index d5ada52dc..2a9eb8cc1 100644 Binary files a/docs/images/view-menu-dark.webp and b/docs/images/view-menu-dark.webp differ diff --git a/docs/images/view-menu-light.webp b/docs/images/view-menu-light.webp index a8f313078..122861596 100644 Binary files a/docs/images/view-menu-light.webp and b/docs/images/view-menu-light.webp differ diff --git a/docs/images/week-dark.webp b/docs/images/week-dark.webp index cbee10a8c..c7ef69fd2 100644 Binary files a/docs/images/week-dark.webp and b/docs/images/week-dark.webp differ diff --git a/docs/images/week-light.webp b/docs/images/week-light.webp index a89d49f04..f03c7c1e2 100644 Binary files a/docs/images/week-light.webp and b/docs/images/week-light.webp differ diff --git a/docs/images/workspace-switcher-dark.webp b/docs/images/workspace-switcher-dark.webp index 638956b33..f5cc58007 100644 Binary files a/docs/images/workspace-switcher-dark.webp and b/docs/images/workspace-switcher-dark.webp differ diff --git a/docs/images/workspace-switcher-light.webp b/docs/images/workspace-switcher-light.webp index 0abdb6b39..8827a0585 100644 Binary files a/docs/images/workspace-switcher-light.webp and b/docs/images/workspace-switcher-light.webp differ diff --git a/docs/images/workspaces-dark.webp b/docs/images/workspaces-dark.webp index 9cb586937..3404a15a9 100644 Binary files a/docs/images/workspaces-dark.webp and b/docs/images/workspaces-dark.webp differ diff --git a/docs/images/workspaces-light.webp b/docs/images/workspaces-light.webp index 0d7e2962a..cc85cbbff 100644 Binary files a/docs/images/workspaces-light.webp and b/docs/images/workspaces-light.webp differ diff --git a/docs/images/year-calendar-dark.webp b/docs/images/year-calendar-dark.webp index ca005dd73..44e5486ca 100644 Binary files a/docs/images/year-calendar-dark.webp and b/docs/images/year-calendar-dark.webp differ diff --git a/docs/images/year-calendar-light.webp b/docs/images/year-calendar-light.webp index 9f0d78a0d..f98a98c49 100644 Binary files a/docs/images/year-calendar-light.webp and b/docs/images/year-calendar-light.webp differ diff --git a/docs/self-hosting/caliber-node.md b/docs/self-hosting/caliber-node.md index 18e52a6b2..108c5c52b 100644 --- a/docs/self-hosting/caliber-node.md +++ b/docs/self-hosting/caliber-node.md @@ -26,7 +26,7 @@ Other `OPENTODO_*` variables are in the [configuration table](https://github.com ## Updates -The `stable` tag moves with every release. To update, pull the image again (redeploy or restart the app so Caliber Node pulls `stable`). Migrations run on start and there are no down-migrations, so back up first. To stay on one release line, use `ghcr.io/opentodoapp/opentodo:1.0` (or one version, `1.0.0`) instead of `stable`. +The `stable` tag moves with every release. To update, pull the image again (redeploy or restart the app so Caliber Node pulls `stable`). Migrations run on start and there are no down-migrations, so back up first. To stay on one release line, use `ghcr.io/opentodoapp/opentodo:1.1` (or one version, `1.1.0`) instead of `stable`. ## Data and backups diff --git a/docs/self-hosting/caprover.md b/docs/self-hosting/caprover.md index cb307632c..f1760120d 100644 --- a/docs/self-hosting/caprover.md +++ b/docs/self-hosting/caprover.md @@ -29,7 +29,7 @@ Open `http://.`. The first visitor creates the owner | Field | Default | What it does | | --- | --- | --- | -| OpenTodo version | the latest release, for example `1.0.0` | The image tag of `ghcr.io/opentodoapp/opentodo`. | +| OpenTodo version | the latest release, for example `1.1.0` | The image tag of `ghcr.io/opentodoapp/opentodo`. | | Base URL | empty | The https address people open. Leave it empty until https is on (see below). | | Setup token | generated, 32 characters | Asked for when the owner account is created, so a stranger cannot claim a new server first. | | Open sign-up | `false` | `true` lets anyone who can reach the server create an account. | @@ -63,7 +63,7 @@ chown -R 65532:65532 /path/on/the/server ## Updates and backups -The version field picks one release, and CapRover never updates an installed app by itself. To update, open the app's **Deployment** tab and, under **Deploy via ImageName**, enter the new version, for example `ghcr.io/opentodoapp/opentodo:1.0.0`, then deploy. CapRover pulls the image you name each time you deploy, so entering `ghcr.io/opentodoapp/opentodo:stable` instead gets the current release whenever you deploy it again. Migrations run on start. There are no down-migrations, so back up first. Releases are listed on [GitHub](https://github.com/OpenTodoApp/OpenTodo/releases). +The version field picks one release, and CapRover never updates an installed app by itself. To update, open the app's **Deployment** tab and, under **Deploy via ImageName**, enter the new version, for example `ghcr.io/opentodoapp/opentodo:1.1.0`, then deploy. CapRover pulls the image you name each time you deploy, so entering `ghcr.io/opentodoapp/opentodo:stable` instead gets the current release whenever you deploy it again. Migrations run on start. There are no down-migrations, so back up first. Releases are listed on [GitHub](https://github.com/OpenTodoApp/OpenTodo/releases). Back up the volume folder above with your server's backups, or turn on scheduled backups in OpenTodo's **Settings → Server → Backups** (they are written to `backups/` in the same volume, or to S3 or WebDAV). See [Backups](../backups.md). diff --git a/docs/self-hosting/casaos.md b/docs/self-hosting/casaos.md index a63ce9d1b..681f52a3a 100644 --- a/docs/self-hosting/casaos.md +++ b/docs/self-hosting/casaos.md @@ -43,7 +43,7 @@ On the server's address (`http://192.168.1.10:8418`) tasks, projects, sync, shar ## Updates and backups -The app store does not follow moving image tags: the app names one release (for example `ghcr.io/opentodoapp/opentodo:1.0.0`), and the store offers an update once its entry moves to the next release (OpenTodo's maintainers send that change to the store after each release). Migrations run on start and there are no down-migrations, so back up first (see below). A custom install stays on the release it was installed with; to update it, edit the app, change the image tag to the new version and save. +The app store does not follow moving image tags: the app names one release (for example `ghcr.io/opentodoapp/opentodo:1.1.0`), and the store offers an update once its entry moves to the next release (OpenTodo's maintainers send that change to the store after each release). Migrations run on start and there are no down-migrations, so back up first (see below). A custom install stays on the release it was installed with; to update it, edit the app, change the image tag to the new version and save. Back up `/DATA/AppData/opentodo/data` with your usual backup tool (stop the app first for a consistent copy), or turn on scheduled backups in **Settings → Server → Backups** (they are written to `backups/` in the same folder, or to S3 or WebDAV). See [Backups](../backups.md). diff --git a/docs/self-hosting/coolify.md b/docs/self-hosting/coolify.md index 6ebd11682..98fd9a35d 100644 --- a/docs/self-hosting/coolify.md +++ b/docs/self-hosting/coolify.md @@ -37,7 +37,7 @@ What the compose file does for you: - The health check uses the binary itself, so Coolify shows the service as healthy or unhealthy correctly. - `ports:` is ignored by Coolify's proxy routing and only matters for plain Docker. -The compose file pulls the published image `ghcr.io/opentodoapp/opentodo:stable`, which every release moves. Use a release line (`:1.0`) to take only its fixes, or `:latest` to follow `main` with unreleased changes. To build from your fork instead, change `image:` to `build: .` in the compose file; Coolify will build the multi-stage Dockerfile on the server. A build from source reports version `dev`; with the Dockerfile build pack, set **Advanced → Source commit availability** to *Available during build* and it reports `dev+`. +The compose file pulls the published image `ghcr.io/opentodoapp/opentodo:stable`, which every release moves. Use a release line (`:1.1`) to take only its fixes, or `:latest` to follow `main` with unreleased changes. To build from your fork instead, change `image:` to `build: .` in the compose file; Coolify will build the multi-stage Dockerfile on the server. A build from source reports version `dev`; with the Dockerfile build pack, set **Advanced → Source commit availability** to *Available during build* and it reports `dev+`. ## Option B: Dockerfile build pack diff --git a/docs/self-hosting/docker.md b/docs/self-hosting/docker.md index fc7033bc6..d9163d5fd 100644 --- a/docs/self-hosting/docker.md +++ b/docs/self-hosting/docker.md @@ -48,7 +48,7 @@ To add more people, keep sign-up closed and create single-use invitation links i - Data lives in the named volume `opentodo-data`, mounted at `/data`. - Change the host port with `OPENTODO_PORT` in `.env`, and the host address it is published on with `OPENTODO_BIND` (default `0.0.0.0`, every interface, so other devices on your network reach it). Behind a reverse proxy on the same machine, `OPENTODO_BIND=127.0.0.1` is the safer choice: only the proxy reaches the server. That `.env` value is not passed into the container, so the process keeps listening on 8080 and the mapping stays `host:8080`. To move the process, set `OPENTODO_PORT` in the container's own environment and publish that container port (`-p 7610:7610 -e OPENTODO_PORT=7610`). An invalid port stops startup with a message naming the variable. The health check probes the port the process is using. - Every variable in the [configuration reference](configuration.md) can be set in `.env`; the compose file passes them to the container. With `docker run`, pass them with `-e`. -- The compose file pulls `ghcr.io/opentodoapp/opentodo:stable`, which every release moves. To stay on one release line use `:1.0` (its fixes only), to pin one version `:1.0.0`; `:latest` follows the main branch and carries unreleased changes; it reports its version as `dev+`, the commit it was built from. The running version is shown in **Settings → About**, at the bottom of the sign-in screen, at `/healthz` and in the startup log line `opentodo listening`. +- The compose file pulls `ghcr.io/opentodoapp/opentodo:stable`, which every release moves. To stay on one release line use `:1.1` (its fixes only), to pin one version `:1.1.0`; `:latest` follows the main branch and carries unreleased changes; it reports its version as `dev+`, the commit it was built from. The running version is shown in **Settings → About**, at the bottom of the sign-in screen, at `/healthz` and in the startup log line `opentodo listening`. - To build locally instead of pulling: replace `image: ghcr.io/opentodoapp/opentodo:stable` with `build: .`. ## Plain `docker run` diff --git a/docs/self-hosting/dokploy.md b/docs/self-hosting/dokploy.md index 83ef91121..30334f638 100644 --- a/docs/self-hosting/dokploy.md +++ b/docs/self-hosting/dokploy.md @@ -44,7 +44,7 @@ For https, point your own domain at the server and edit the domain in the **Doma ## Updates and backups -The template pins one release, such as `ghcr.io/opentodoapp/opentodo:1.0.0`, because Dokploy's catalogue only accepts fixed versions. A service keeps the version it was created with. To update, change the image tag in the service's compose file to the [new release](https://github.com/OpenTodoApp/OpenTodo/releases) and click **Deploy**; migrations run on start. There are no down-migrations, so back up first. To follow every release without editing, use `ghcr.io/opentodoapp/opentodo:stable` (every release moves it) and add `pull_policy: always` under the image, so **Deploy** fetches the current one. +The template pins one release, such as `ghcr.io/opentodoapp/opentodo:1.1.0`, because Dokploy's catalogue only accepts fixed versions. A service keeps the version it was created with. To update, change the image tag in the service's compose file to the [new release](https://github.com/OpenTodoApp/OpenTodo/releases) and click **Deploy**; migrations run on start. There are no down-migrations, so back up first. To follow every release without editing, use `ghcr.io/opentodoapp/opentodo:stable` (every release moves it) and add `pull_policy: always` under the image, so **Deploy** fetches the current one. Everything OpenTodo stores (the database, attachments and its own backups) is in the named volume `opentodo-data`. Back it up with Dokploy's **Volume Backups** to an S3 destination, or turn on scheduled backups in OpenTodo's **Settings → Server → Backups**. See [Backups](../backups.md). diff --git a/docs/self-hosting/easypanel.md b/docs/self-hosting/easypanel.md index 2a16c571a..fbfcef616 100644 --- a/docs/self-hosting/easypanel.md +++ b/docs/self-hosting/easypanel.md @@ -15,7 +15,7 @@ An OpenTodo template has been submitted to Easypanel's template list ([easypanel ## Install as an app service 1. In a project, click **+ Service → App** and name it `opentodo`. -2. **Source**: choose **Docker Image** and enter `ghcr.io/opentodoapp/opentodo:1.0.0`. +2. **Source**: choose **Docker Image** and enter `ghcr.io/opentodoapp/opentodo:1.1.0`. 3. **Environment**: add ``` @@ -47,6 +47,6 @@ Every other `OPENTODO_*` variable from the [configuration table](https://github. ## Updates and backups -The service names one release (`1.0.0`), never a moving tag, so it changes only when you change it: set the image to the new release under **Source** and **Deploy**. Migrations run on start and there are no down-migrations, so back up first. +The service names one release (`1.1.0`), never a moving tag, so it changes only when you change it: set the image to the new release under **Source** and **Deploy**. Migrations run on start and there are no down-migrations, so back up first. Everything OpenTodo stores is in the `data` volume. Turn on scheduled backups in **Settings → Server → Backups** (written to `backups/` in the same volume, or to S3 or WebDAV) to get copies off the server. See [Backups](../backups.md). diff --git a/docs/self-hosting/podman.md b/docs/self-hosting/podman.md index 1c917d967..d46002092 100644 --- a/docs/self-hosting/podman.md +++ b/docs/self-hosting/podman.md @@ -72,7 +72,7 @@ sudo systemctl enable --now podman-auto-update.timer # as root systemctl --user enable --now podman-auto-update.timer # rootless ``` -`podman auto-update --dry-run` shows what would change. Migrations run on start and there are no down-migrations, so keep backups. To stay on one release line, change the image to `ghcr.io/opentodoapp/opentodo:1.0` (its fixes only) or pin one version, `1.0.0`. +`podman auto-update --dry-run` shows what would change. Migrations run on start and there are no down-migrations, so keep backups. To stay on one release line, change the image to `ghcr.io/opentodoapp/opentodo:1.1` (its fixes only) or pin one version, `1.1.0`. Everything OpenTodo stores is in the volume `systemd-opentodo`; `podman volume inspect systemd-opentodo` shows where it is on disk. Turn on scheduled backups in OpenTodo's **Settings → Server → Backups** (written to `backups/` in the same volume, or to S3 or WebDAV), or stop the service and run `podman volume export systemd-opentodo --output opentodo-data.tar`. See [Backups](../backups.md). diff --git a/docs/self-hosting/render.md b/docs/self-hosting/render.md index b7752d0b8..11884bf7f 100644 --- a/docs/self-hosting/render.md +++ b/docs/self-hosting/render.md @@ -64,7 +64,7 @@ The service uses the `stable` image, which every release moves. Render does not With **Auto Sync** on, a change to the Blueprint file in OpenTodo's repository also redeploys the service; such changes are listed in the [changelog](https://github.com/OpenTodoApp/OpenTodo/blob/main/CHANGELOG.md). -To stay on one release line, set the image to `ghcr.io/opentodoapp/opentodo:1.0` (or one version, `1.0.0`) as the **Image URL** in the service's **Settings**, with **Auto Sync** off (a sync would set `stable` again). +To stay on one release line, set the image to `ghcr.io/opentodoapp/opentodo:1.1` (or one version, `1.1.0`) as the **Image URL** in the service's **Settings**, with **Auto Sync** off (a sync would set `stable` again). ## Data and backups diff --git a/docs/self-hosting/runtipi.md b/docs/self-hosting/runtipi.md index 7457e0370..0d5641ba3 100644 --- a/docs/self-hosting/runtipi.md +++ b/docs/self-hosting/runtipi.md @@ -35,7 +35,7 @@ On a plain http address (`http://192.168.1.10:8400`) tasks, projects, sync, shar ## Updates -The app names one release (`ghcr.io/opentodoapp/opentodo:1.0.0`), not a moving tag. After each release the store repository gets an update with the new version; Runtipi shows it on the app once it refreshes its app stores (**Settings → Update App Stores** does it right away). Click **Update**; migrations run on start. There are no down-migrations, so back up first. Release candidates are never offered. +The app names one release (`ghcr.io/opentodoapp/opentodo:1.1.0`), not a moving tag. After each release the store repository gets an update with the new version; Runtipi shows it on the app once it refreshes its app stores (**Settings → Update App Stores** does it right away). Click **Update**; migrations run on start. There are no down-migrations, so back up first. Release candidates are never offered. ## Data and backups diff --git a/docs/self-hosting/synology.md b/docs/self-hosting/synology.md index 6ae947505..56aed5dd2 100644 --- a/docs/self-hosting/synology.md +++ b/docs/self-hosting/synology.md @@ -95,7 +95,7 @@ Do not set an `https://` address while you open OpenTodo over plain http: the se The project uses the `stable` image, which every release moves. Container Manager shows no update notice for images from `ghcr.io`, so update by hand: **Project → opentodo → Action → Stop**, then **Action → Build**. Because of `pull_policy: always`, the build pulls the current `stable` image and recreates the container; the data folder is kept and migrations run on start. There are no down-migrations, so back up first. If the version at `http://:8080/healthz` did not change, stop the project, choose **Action → Clean**, delete the image under **Image**, and **Build** again. -To stay on one release line, use `ghcr.io/opentodoapp/opentodo:1.0` (or one version, `1.0.0`) as the image. +To stay on one release line, use `ghcr.io/opentodoapp/opentodo:1.1` (or one version, `1.1.0`) as the image. ## Backups diff --git a/docs/self-hosting/truenas.md b/docs/self-hosting/truenas.md index e607b98c1..ddf12fa00 100644 --- a/docs/self-hosting/truenas.md +++ b/docs/self-hosting/truenas.md @@ -21,7 +21,7 @@ OpenTodo is not in the TrueNAS **Apps** catalogue yet: the app has been submitte ```yaml services: opentodo: - image: ghcr.io/opentodoapp/opentodo:1.0.0 + image: ghcr.io/opentodoapp/opentodo:1.1.0 user: "568:568" restart: unless-stopped ports: @@ -62,6 +62,6 @@ On the server's address (`http://192.168.1.10:30536`) tasks, projects, sync, sha ## Updates and backups -The app names one release (`1.0.0`), never a moving tag. With Install via YAML, change the tag in the app's YAML (**Edit**) to the new release and save; TrueNAS pulls it and restarts the app. From the catalogue, TrueNAS shows **Update** on the app when the catalogue has a new version (its maintainers bump it after each OpenTodo release). Migrations run on start and there are no down-migrations, so back up first. +The app names one release (`1.1.0`), never a moving tag. With Install via YAML, change the tag in the app's YAML (**Edit**) to the new release and save; TrueNAS pulls it and restarts the app. From the catalogue, TrueNAS shows **Update** on the app when the catalogue has a new version (its maintainers bump it after each OpenTodo release). Migrations run on start and there are no down-migrations, so back up first. Everything OpenTodo stores is in its dataset (or ixVolume). Protect it with periodic **snapshots** and **replication** or a **Cloud Sync** task, or turn on scheduled backups in **Settings → Server → Backups** (written to `backups/` in the same folder, or to S3 or WebDAV). See [Backups](../backups.md). diff --git a/internal/store/testdata/upgrade/1.1/data.tar.gz b/internal/store/testdata/upgrade/1.1/data.tar.gz new file mode 100644 index 000000000..199692bad Binary files /dev/null and b/internal/store/testdata/upgrade/1.1/data.tar.gz differ diff --git a/internal/store/testdata/upgrade/1.1/export.json b/internal/store/testdata/upgrade/1.1/export.json new file mode 100644 index 000000000..c0fb1ade2 --- /dev/null +++ b/internal/store/testdata/upgrade/1.1/export.json @@ -0,0 +1,305 @@ +{ + "attachments": [ + { + "author_id": "63afe96e-2516-464a-b3a5-97ecd1aada89", + "comment_id": null, + "created_at": 1794059600185, + "deleted_at": null, + "encrypted": false, + "id": "34bac065-5781-47ca-b7d8-5a1f10effea3", + "mime": "text/plain", + "name": "notes.txt", + "sha256": "65bd291e71718822959a61fbd34349420e84e0bb586ed2a551bf9142a229e928", + "size": 46, + "task_id": "86fd802b-12f9-422b-b0e1-400e1b50d6c0", + "uploaded_at": 1794059600185, + "url": null + } + ], + "comments": [ + { + "author_id": "63afe96e-2516-464a-b3a5-97ecd1aada89", + "body": "Use the **sharp** shears.", + "created_at": 1794059600179, + "deleted_at": null, + "edited_at": null, + "id": "60d2248a-a275-4b3f-9a29-50d0328a83ce", + "mentions": [], + "my_reactions": [], + "parent_id": null, + "reactions": { + "check": [], + "eyes": [], + "heart": [], + "party": [], + "question": [], + "thumbs_up": [] + }, + "task_id": "86fd802b-12f9-422b-b0e1-400e1b50d6c0" + }, + { + "author_id": "63afe96e-2516-464a-b3a5-97ecd1aada89", + "body": "Train or car?", + "created_at": 1794059600181, + "deleted_at": null, + "edited_at": null, + "id": "6fe866aa-5930-4da1-a51c-cf89b5489066", + "mentions": [], + "my_reactions": [], + "parent_id": null, + "reactions": { + "check": [], + "eyes": [], + "heart": [], + "party": [], + "question": [], + "thumbs_up": [] + }, + "task_id": "338b12b5-e431-41e5-b75b-5f53bc63a513" + } + ], + "encryption": null, + "exportedAt": "2026-11-07T13:53:20Z", + "fields": [], + "format": "opentodo-export", + "frames": [], + "labels": [ + { + "color": "#16a34a", + "created_at": 1794059600121, + "id": "9b559010-4f99-4071-ad67-2f76bd3bf699", + "name": "Home", + "position": 1794059600121 + }, + { + "color": "#2563eb", + "created_at": 1794059600128, + "id": "6c79bb98-20fa-4a94-8e12-119652c4274a", + "name": "Work", + "position": 1794059600128 + } + ], + "notes": [], + "objectives": [], + "places": [], + "project_prefs": [], + "projects": [ + { + "aisles": false, + "color": "#65a30d", + "created_at": 1794059600130, + "flow_mode": "", + "id": "fac7f0d7-200e-4994-b6e0-ca97a48fb78a", + "name": "Garden", + "position": 1794059600130, + "reusable": false, + "status": "active" + }, + { + "aisles": false, + "color": "#9333ea", + "created_at": 1794059600135, + "flow_mode": "", + "id": "943a0abb-30a6-4fe1-a898-8fbf6d44113e", + "name": "Shared plans", + "owner_id": "63afe96e-2516-464a-b3a5-97ecd1aada89", + "position": 1794059600135, + "reusable": false, + "role": "owner", + "status": "active" + } + ], + "reminders": [ + { + "created_at": 1794059600168, + "deleted_at": null, + "delivered_at": null, + "dismissed_at": null, + "fire_at": 1795255200000, + "id": "c59d7b98-d994-457f-9cb7-fb96c682cc57", + "kind": "relative", + "offset_minutes": 30, + "task_id": "3e4d5f77-8c70-42e1-ac49-98f97eecebf7" + } + ], + "review": [], + "rules": [], + "sections": [ + { + "aisle": null, + "color": null, + "created_at": 1794059600138, + "flow_mode": "", + "icon": null, + "id": "4a91a95f-d401-4184-90f2-cd3d87964d53", + "name": "To do", + "position": 1794059600138, + "project_id": "fac7f0d7-200e-4994-b6e0-ca97a48fb78a" + }, + { + "aisle": null, + "color": null, + "created_at": 1794059600141, + "flow_mode": "", + "icon": null, + "id": "fa24e6d2-e10c-4753-8a4c-b391309c3b09", + "name": "Doing", + "position": 1794059600141, + "project_id": "fac7f0d7-200e-4994-b6e0-ca97a48fb78a" + } + ], + "slots": [], + "tasks": [ + { + "appends": [], + "created_at": 1794059600144, + "description": "Before the frost.\n\n- gloves\n- shears", + "due": { + "date": "2026-11-20" + }, + "energy": null, + "fields": {}, + "id": "86fd802b-12f9-422b-b0e1-400e1b50d6c0", + "labels": [ + "9b559010-4f99-4071-ad67-2f76bd3bf699" + ], + "origin": null, + "position": 1794059600144, + "priority": 1, + "project_id": "fac7f0d7-200e-4994-b6e0-ca97a48fb78a", + "rotation": [], + "section_id": "4a91a95f-d401-4184-90f2-cd3d87964d53", + "sector": null, + "title": "Prune the roses" + }, + { + "appends": [], + "created_at": 1794059600148, + "due": { + "date": "2026-11-21", + "time": "09:30" + }, + "energy": null, + "fields": {}, + "id": "3e4d5f77-8c70-42e1-ac49-98f97eecebf7", + "labels": [ + "9b559010-4f99-4071-ad67-2f76bd3bf699", + "6c79bb98-20fa-4a94-8e12-119652c4274a" + ], + "origin": null, + "position": 1794059600148, + "priority": 2, + "project_id": "fac7f0d7-200e-4994-b6e0-ca97a48fb78a", + "rotation": [], + "section_id": "fa24e6d2-e10c-4753-8a4c-b391309c3b09", + "sector": null, + "title": "Water the raised beds" + }, + { + "appends": [], + "created_at": 1794059600151, + "energy": null, + "fields": {}, + "id": "823e761f-d1f4-415b-a5b3-43160a86f9a7", + "origin": null, + "parent_id": "86fd802b-12f9-422b-b0e1-400e1b50d6c0", + "position": 1794059600151, + "priority": 4, + "project_id": "fac7f0d7-200e-4994-b6e0-ca97a48fb78a", + "rotation": [], + "sector": null, + "title": "Buy gloves" + }, + { + "appends": [], + "created_at": 1794059600154, + "due": { + "date": "2026-11-10" + }, + "energy": null, + "fields": {}, + "id": "4f53e2a8-6750-4300-844e-5f324bc7102a", + "origin": null, + "position": 1794059600154, + "priority": 3, + "recurrence": "every day", + "rotation": [], + "sector": null, + "title": "Check the greenhouse" + }, + { + "appends": [], + "completed_at": 1762000000000, + "completed_by": "63afe96e-2516-464a-b3a5-97ecd1aada89", + "created_at": 1794059600156, + "energy": null, + "fields": {}, + "id": "0a6dc7fa-4f16-482e-ad87-47b1db476324", + "origin": null, + "position": 1794059600156, + "priority": 4, + "rotation": [], + "sector": null, + "title": "Order seeds" + }, + { + "appends": [], + "created_at": 1794059600159, + "deleted_at": 1794059600166, + "energy": null, + "fields": {}, + "id": "eaf5e792-c7d2-44fc-8fee-1b7b9ef3dd09", + "origin": null, + "position": 1794059600159, + "priority": 4, + "rotation": [], + "sector": null, + "title": "Old idea" + }, + { + "appends": [], + "created_at": 1794059600161, + "due": { + "date": "2026-12-01" + }, + "energy": null, + "fields": {}, + "id": "338b12b5-e431-41e5-b75b-5f53bc63a513", + "origin": null, + "position": 1794059600161, + "priority": 2, + "project_id": "943a0abb-30a6-4fe1-a898-8fbf6d44113e", + "rotation": [], + "sector": null, + "title": "Plan the trip" + } + ], + "themes": [], + "time_entries": [ + { + "created_at": 1794059600202, + "deleted_at": null, + "device_id": "server:d368446a", + "ended_at": 1762001800000, + "id": "1d80da00-be67-49ed-bda0-3231d11cb8cf", + "note": "", + "started_at": 1762000000000, + "task_id": "3e4d5f77-8c70-42e1-ac49-98f97eecebf7", + "user_id": "63afe96e-2516-464a-b3a5-97ecd1aada89" + } + ], + "userId": "63afe96e-2516-464a-b3a5-97ecd1aada89", + "user_prefs": [], + "version": 1, + "views": [], + "workspaces": [ + { + "color": "", + "default": true, + "icon": "", + "id": "0be60aa2-8c4a-83cb-a4a2-235ab2d79f16", + "name": "Personal", + "role": "owner" + } + ] +} diff --git a/internal/store/testdata/upgrade/1.1/manifest.json b/internal/store/testdata/upgrade/1.1/manifest.json new file mode 100644 index 000000000..7e23caf34 --- /dev/null +++ b/internal/store/testdata/upgrade/1.1/manifest.json @@ -0,0 +1,73 @@ +{ + "version": "1.1.0", + "source": { + "ref": "HEAD", + "commit": "92ea9241b9403e78c8b0708e3ea8cdfca037d03e", + "built_with": "go1.27.3", + "how": "scripts/release/upgrade-fixture.sh" + }, + "created_at": 1794059600215, + "owner": { + "email": "owner@example.com", + "name": "Owner", + "password": "upgrade fixture password one" + }, + "member": { + "email": "member@example.com", + "name": "Member", + "password": "upgrade fixture password two" + }, + "token": "ot_Jj5kqFGGb6G6ec1eh-4f69eqSltZzhOyh8PiZQ0wWAQ", + "ids": { + "labels": [ + "9b559010-4f99-4071-ad67-2f76bd3bf699", + "6c79bb98-20fa-4a94-8e12-119652c4274a" + ], + "projects": [ + "fac7f0d7-200e-4994-b6e0-ca97a48fb78a", + "943a0abb-30a6-4fe1-a898-8fbf6d44113e" + ], + "sections": [ + "4a91a95f-d401-4184-90f2-cd3d87964d53", + "fa24e6d2-e10c-4753-8a4c-b391309c3b09" + ], + "shared": "943a0abb-30a6-4fe1-a898-8fbf6d44113e", + "tasks": [ + "86fd802b-12f9-422b-b0e1-400e1b50d6c0", + "3e4d5f77-8c70-42e1-ac49-98f97eecebf7", + "823e761f-d1f4-415b-a5b3-43160a86f9a7", + "4f53e2a8-6750-4300-844e-5f324bc7102a", + "0a6dc7fa-4f16-482e-ad87-47b1db476324", + "eaf5e792-c7d2-44fc-8fee-1b7b9ef3dd09", + "338b12b5-e431-41e5-b75b-5f53bc63a513" + ], + "attachment": "34bac065-5781-47ca-b7d8-5a1f10effea3" + }, + "attachment": { + "id": "34bac065-5781-47ca-b7d8-5a1f10effea3", + "sha256": "65bd291e71718822959a61fbd34349420e84e0bb586ed2a551bf9142a229e928", + "size": 46 + }, + "member_encryption": true, + "phone_cursor": 78, + "counts": { + "projects": 2, + "sections": 2, + "labels": 2, + "tasks": 6, + "tasks_with_deleted": 7, + "reminders": 1, + "time_entries": 1, + "members": 2, + "comments": 2, + "attachments": 1 + }, + "ops": 115, + "ops_after_phone_cursor": 37, + "export": { + "format": "opentodo-export", + "version": 1, + "tasks": 7 + }, + "skipped": [] +} diff --git a/web/package-lock.json b/web/package-lock.json index 0c25b5194..d63a5b2ee 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "opentodo-web", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "opentodo-web", - "version": "1.0.0", + "version": "1.1.0", "dependencies": { "dexie": "4.4.7", "dexie-react-hooks": "4.4.0", diff --git a/web/package.json b/web/package.json index 49bad6a43..03b0a0f87 100644 --- a/web/package.json +++ b/web/package.json @@ -1,7 +1,7 @@ { "name": "opentodo-web", "private": true, - "version": "1.0.0", + "version": "1.1.0", "type": "module", "scripts": { "predev": "npm run --silent help",