Skip to content

Repository files navigation

OpenDocket

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.

Stage 1 (current)

  • 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 .ics generated on-device, one item or all of them, with RRULE recurrence and a VALARM per 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.

Stack

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.

Run it

bun install
bun run dev:mobile     # Expo on port 4300

Open 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.

Architecture notes

  • 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.ts as pure functions — day deltas, cadence advance with end-of-month clamping, urgency bucketing, cost normalization. YYYY-MM-DD strings are parsed as local midnight, never through new Date(iso), which silently shifts the day west of Greenwich.
  • lib/notifications.ts is the only file that touches expo-notifications, and every export no-ops on web.
  • lib/ics.ts generates 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.

License

MIT — see LICENSE.

About

OpenDocket — open source, local-first life-admin app: renewal timeline, expiry reminders, calendar export. MIT.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages