Hope

The real front end, in your browser.

A calm time tracker for macOS, Windows, iPhone and Apple Watch. This preview runs the desktop app's React front end on an in-memory backend: start a timer, open This Week, edit a record. Nothing is saved.

HopePreviewFull sizeGet the appFeedback

A preview, not the whole app: no menu-bar timer, no desktop cards, no sync, no file dialogs. Those need the desktop build. Found something odd? The Feedback button goes to my inbox.

About

What it is.

  • Tauri 2 + Rust + React on the desktop, native Swift on iPhone and Apple Watch, Supabase in between.
  • About 23K lines and 150 unit tests across Rust, TypeScript and Swift.
  • Desktop installers ship on GitHub; the iPhone and Watch apps run on device. The demo is the real front end with an in-memory backend.
Decisions 4
  1. Pause is not a table. A pause ends the session; resume opens a new one that points back through continues_id.

    Because every statistic stays a plain sum over sessions, and a pause chain is only a UI grouping.

    Cost: the UI walks the chain to draw one bar, and resume is a write, not a flag.

  2. Sync is last-writer-wins on (updated_ms, device_id), a server_seq cursor, and Postgres triggers. No Realtime.

    Because three clients in two languages need one rule they can all implement and test against a fake server, and a five-second pull already shows a watch-started timer on the desktop.

    Cost: a websocket would be faster, and pulls re-read the last 50 sequence numbers to cover concurrent commits.

  3. Class time from an imported timetable stays out of the totals by default.

    Because the ring is about time I chose. A lecture I had to attend is not that.

    Cost: one more setting, and every total on five surfaces has to honor it.

  4. Sub-activities go one level deep through activity.parent_id and take the parent's color.

    Because one level covers Math → homework without turning the picker into a file browser.

    Cost: a third level is a no.