TO DO
A privacy-first task manager and habit tracker. All data lives in your browser — cloud sync is optional.
Most task managers assume you want to live in their ecosystem. TO DO assumes the opposite — your data is yours, your device is the source of truth, and the network is optional. It’s fully open source.
Local-First Architecture
IndexedDB is the database. The app is fully functional offline from the first load, with a Workbox service worker precaching everything. Sign in with Google to sync across devices via Supabase, or skip auth entirely and run in local-only mode — your data stays on-device either way. Signing out doesn’t delete anything locally, but you’ll need to sign back in to resume sync.
Sync is lightweight: mutations set a pending_sync flag, a debounced queue pushes diffs to Supabase, and pulls run on focus and visibility change. Last-write-wins on conflict, soft deletes propagated to the cloud. No hard deletes, ever.
Features
Three list types cover the main use cases: General for tasks, Daily for habit tracking with RRule-based recurrence and streak calculation, and Shopping for groceries. Lists live in folders, tasks live in groups, and everything is drag-and-drop reorderable. A My Day dashboard surfaces overdue items and today’s schedule in one view.
Customisation is first-class: nine accent colours, system/light/dark theme, six completion sounds synthesised in-browser (no audio files), and a collapsible sidebar. The dynamic favicon tints to the current accent colour.
Stack
React 19 and TypeScript for the UI. Zustand for state — all mutations go through a single store. Framer Motion for transitions. React Router 7 for navigation. Day.js for timezone-aware date logic, RRule for iCalendar recurrence rules. Vitest and Testing Library for the test suite.