A non-touch, mouse-and-keyboard desktop app that reimplements the core functionality of Tasks.org (lists, subtasks, due/start dates, priorities, recurrence, tags) as an Electron + React + TypeScript app, with two-way CalDAV sync so it can share data with your existing Tasks.org mobile setup (DAVx5 / Nextcloud / any Tasks.org-compatible CalDAV server).
Beta software. This project is still in active development and hasn't reached a stable 1.0 yet. Expect rough edges and bugs, and keep a backup of anything important — while sync is two-way, you shouldn't rely on this as the only copy of your tasks until a v1.0 release. Bug reports are welcome on the issue tracker.
Grab the latest build for your platform from the Releases page.
Download tasks-desktop-Setup-x.y.z.exe and run it. It installs per-user (no admin prompt) and
automatically replaces any previously installed version — settings and your task database are kept.
To remove the app: Windows Settings → Apps → Installed apps → Tasks Desktop → Uninstall.
From v0.1.14 onward the Windows app updates itself: it checks this repo's releases on startup, downloads the new version in the background, and offers "Restart to update" in Settings, so you only ever need to download the installer once. (Versions 0.1.9–0.1.13 shipped with a broken update check — if you're on one of those, download and run the latest installer manually once; after that updates are automatic.)
sudo apt install ./tasks-desktop_x.y.z_amd64.debapt resolves the dependencies automatically (plain dpkg -i works too, followed by
sudo apt -f install if it complains). Launch from your app menu, or run tasks-desktop.
Update by installing a newer .deb the same way; remove with sudo apt remove tasks-desktop.
Tasks Desktop is published as a proper Flatpak repository, so you install it once and then
flatpak update (or GNOME Software / KDE Discover) keeps it current automatically:
# install once from the repository (pulls the runtimes it needs from Flathub)
flatpak install --from https://precisioncrab.github.io/tasks-desktop/tasks-desktop.flatpakref
# run it
flatpak run com.arlis.tasksdesktopAfter that it appears in your app menu like any other app. To update:
flatpak updateRemove it with flatpak uninstall com.arlis.tasksdesktop. (If you have a Flathub remote already, the
required runtimes install automatically; if not, the .flatpakref points at Flathub so they're fetched
on first install.)
A standalone .flatpak bundle is also attached to each GitHub release
for offline installs, but the repository above is the recommended path since it's the one that
auto-updates.
Two dmgs are published: arm64 for Apple Silicon (M1 and later) and x64 for Intel Macs — pick the
one matching your machine (About This Mac shows which chip you have). Open it and drag Tasks Desktop
into Applications. The build is not code-signed, so the
first launch will be blocked by Gatekeeper — right-click (or Ctrl-click) the app in Applications and
choose Open, then confirm. This is only needed once. Update by installing a newer .dmg over the old
copy; remove by deleting the app from Applications.
Tasks Desktop syncs tasks & calendars over CalDAV and contacts over CardDAV. Open Settings (the "CalDAV / CardDAV accounts…" button in the sidebar) → Add account and fill in:
- Server URL — CalDAV — the calendars/tasks endpoint.
- CardDAV URL — contacts (optional) — the contacts endpoint. On some servers this is a different address than CalDAV (notably Synology); on others (Nextcloud) it's the same base URL.
- Username and Password / app token.
Click Test connection — it reports how many calendars and address books it found, so you can confirm the URLs before saving. After saving, use the account's Find calendars to link lists, and the Contacts (CardDAV) section to Find address books and link them.
Self-hosted server over HTTPS? NAS boxes (Synology, etc.) usually use a self-signed certificate, which the app rejects by default. If HTTPS gives "fetch failed" but HTTP works, tick Allow self-signed certificates in Settings — only do this for servers you trust on your own network.
Synology serves CalDAV and CardDAV as separate services at different addresses, so enter both.
-
CalDAV (Calendar): open the Synology Calendar app → Settings (gear, top-right) → CalDAV Account. The URL looks like:
http://<nas-ip>:5000/caldav.php/ # or https://<nas-ip>:5001/caldav.php/ over HTTPS -
CardDAV (Contacts): the contacts service is separate and, by default, listens only on the loopback address (port 5555). Give it a reachable HTTPS port first: Control Panel → System → Login Portal → Applications → Synology Contacts → set an HTTPS port (e.g. your DSM HTTPS port, 5001). Then the CardDAV base URL is:
https://<nas-ip>:<https-port>/carddav/ # e.g. https://192.168.50.3:5001/carddav/ -
DSM's HTTPS cert is self-signed, so enable Allow self-signed certificates (see the note above).
Nextcloud auto-discovers calendars and contacts from a single DAV base, so put the same URL in both the Server URL and CardDAV URL fields:
https://<your-nextcloud-host>/remote.php/dav/
(In-app you can also copy the exact addresses: Calendar → Settings, bottom-left → "Copy primary CalDAV
address"; contacts live under /remote.php/dav/addressbooks/users/<user>/.)
Most CalDAV/CardDAV servers auto-discover from a base URL — paste that and the app finds the collections:
- Baïkal:
https://<host>/dav.php/(discovers both calendars and address books). - Radicale:
http://<host>:5232/(orhttp://<host>:5232/<user>/). - Generic / DAVx5-compatible: if a single base URL doesn't discover everything, enter the specific
collection URLs —
.../calendars/<user>/for CalDAV and.../addressbooks/<user>/for CardDAV.
Notes: usernames with spaces can break discovery on some servers — avoid them if possible. Synology doesn't support two-factor auth for third-party CalDAV/CardDAV clients; use your normal password.
- Electron (main process) + Node's built-in
node:sqlitefor local storage (no native compiler required) - React + TypeScript (renderer), built with Vite
tsdavfor CalDAV discovery/sync,ical.jsfor VTODO parsing/generation
cd tasks-desktop
npm installNo native build tools (Visual Studio Build Tools, Python, etc.) are required — storage uses Node's
built-in node:sqlite module instead of a compiled native addon, so this should install cleanly on both
Windows and Linux with just Node and npm.
If node:sqlite isn't available in the Electron version that gets installed (it needs an Electron build
on Node 22.5+), npm install electron@latest to pick up a newer one. If the app still fails to start with
an error mentioning node:sqlite or ERR_UNKNOWN_BUILTIN_MODULE, add --experimental-sqlite to the
electron . command in the dev:electron / start scripts in package.json.
Open two terminals from the project folder:
# terminal 1 — Vite dev server for the renderer
npm run dev
# terminal 2 — compile + launch Electron, pointed at the dev server
npm run dev:electronnpm start # build renderer + electron main, then launch
npm run package # build + bundle as DMG / NSIS installer / deb + flatpak via electron-builder- Lists sidebar (custom lists, "All Tasks", "Today & Overdue"), create/select lists
- Tasks: title, notes, start date, due date, priority (None/High/Medium/Low), tags, recurrence (RRULE, with quick presets for daily/weekly/monthly/yearly plus a custom-RRULE field)
- Subtasks (one level), shown nested under their parent and in the detail panel
- Calendar view: month/week/day views showing tasks and events together, with a tasks/events/both toggle, task display modes (due date, start date, or start→due range), and list/category filters. Double-click or right-click a day or time slot to create an item there; drag a bar to reschedule it (drag an edge to resize)
- Calendar events: create/edit/delete events, including recurring events (whole-series) via the same RRULE presets tasks use — all synced two-way over CalDAV
- Reminders & notifications: multiple reminders per task/event (at time, or minutes/hours/days before), native desktop notifications that jump to the item when clicked, synced as CalDAV VALARMs so Android clients (DAVx5 + Etar, Tasks.org mobile) can fire them too
- Collapsible sidebar and right rail (with re-expand tabs) to give the calendar/list more room
- Search across title/notes/tags, right-click context menu (complete/duplicate/delete), keyboard shortcuts (Ctrl+N new task, Ctrl+Shift+N new list, Ctrl+F search, Ctrl+R sync, N new task, Delete to remove the selected task) — fully mouse/keyboard driven, no touch gestures anywhere
- CalDAV accounts screen: add a server (label, URL, username, password/app-token), test the connection, discover its calendars, and link any local list to a remote calendar
- Two-way sync engine (
electron/caldav.ts): pulls new/changed remote VTODOs/VEVENTs into the local DB, pushes new/changed local tasks and events to the server, and propagates local deletions
- Sync conflicts (same task edited on two devices between syncs) keep the server version on the synced task and preserve the local edits as a "(conflicted copy)" task; there's no merge UI yet.
- Only one level of subtasks is modeled (no infinitely nested subtasks).
- Recurring events are edited as a whole series only (no per-occurrence exceptions), and the calendar grid draws a recurring event on its first occurrence rather than expanding it across every date; the RRULE itself is stored and synced correctly.