Open source, local-first life admin for your phone. Track every renewal and expiry — passport, car insurance, MOT, warranties, subscriptions, bills — on one urgency-ordered timeline, get reminded before each one lands, and push any of them to your calendar.
MIT licensed. No account, no server, no subscription. Stage 1 makes zero network calls: every item lives on your device.
- Timeline — items bucketed Overdue → 7 days → 30 days → 90 days → On track, with a date gutter and an urgency dot. Header shows how many land in the next 30 days and your normalized annual recurring spend.
- Manual entry — title, category, provider, date, cadence (one-off → 10-yearly), cost, notes. Recurring items roll their date forward automatically as cycles pass.
- Lead-time reminders — pick beats per item (default 90/30/7/1 days). Scheduled as local notifications, rebuilt on every launch so reboots and cadence rollovers self-heal.
- Calendar export — RFC 5545
.icsgenerated on-device, one item or all of them, withRRULErecurrence and aVALARMper beat. Handed to the OS share sheet. - Own your data — JSON backup export/import, sample docket, wipe.
Planned: Stage 2 document scan + vault + AI field extraction (confirm before save). Stage 3 optional self-hosted sync + household sharing.
Bun workspaces + Turborepo monorepo.
packages/mobile— Expo + React Native + expo-router. This is the whole app in Stage 1.packages/web— Hono + oRPC + Drizzle. Untouched in Stage 1; it's where the optional self-hostable sync server lands in Stage 3.
bun install
bun run dev:mobile # Expo on port 4300Open in Expo Go, or press w for the browser. Notifications and the share sheet are native-only —
they no-op on web so the browser preview still works.
- Storage is a narrow repository (
lib/storage.ts, load/save whole collections over AsyncStorage). Screens never touch persistence directly, so SQLite or a sync engine can drop in behind it without a rewrite. - All date math lives in
lib/dates.tsas pure functions — day deltas, cadence advance with end-of-month clamping, urgency bucketing, cost normalization.YYYY-MM-DDstrings are parsed as local midnight, never throughnew Date(iso), which silently shifts the day west of Greenwich. lib/notifications.tsis the only file that touchesexpo-notifications, and every export no-ops on web.lib/ics.tsgenerates calendar text with proper RFC 5545 escaping and 75-octet line folding.- No native date picker on purpose — a masked text field with relative-date presets works identically on iOS, Android, and web.
See design.md for the design system and task.md for build state.
MIT — see LICENSE.