Daric
Daric is a small, private home for our household. It replaced a handful of apps with one that does exactly what we need, and it is built so that adding a new part takes minutes.
- Type
- Personal
- Status
- Private
- When
- 2026
- Role
- Design and engineering
- Next.js 16
- TypeScript
- Tailwind CSS 4
- Firebase Auth
- Firestore
- Cloud Messaging
- Netlify Functions
- PWA
Decisions worth a look
- Sign-in is locked to two Google accounts. The allowlist is enforced in three places: the browser, the Firestore rules, and the notification API.
- Realtime and offline by default: an item added on one phone appears on the other immediately, and Firestore's local cache keeps it working without signal.
- Notifications are batched, so adding six things sends one push, not six.
- A 6am digest is built per phone: local weather, that person's tasks, today's reminders and birthdays, and nothing at all on an empty day.
- Everything is a module. A new shopping list is one definition and two three-line route files; the tile, import screen, notifications and app shortcut follow from it.
What is in it
- Shared grocery and hardware lists, realtime between both phones.
- Short and long-term tasks, assignable to either of us or to anyone, with an archive that collects finished tasks after a week.
- People: the folks we meet, how we know them, follow-ups with as many reminder days as needed, and per-person sharing (private, view-only or editable).
- A Today page that mirrors the morning digest and can open automatically once a day.
- List import from a tap-to-import link, a JSON or markdown file, or a paste, with duplicates flagged before anything is written.
Adding a new area
The home screen renders whichever modules this device has switched on. A new area is roughly four steps:
- A route under app/.
- A match block in firestore.rules. The catch-all denies anything not explicitly allowed.
- An entry in the module registry, which gives it a tile and a switch in Settings. New modules default to off.
- Optionally, a call to notify the other person when something happens.
Design
The palette and type live in one stylesheet as custom properties, exposed to Tailwind, so a single change updates light and dark mode everywhere. App icons are generated by a script rather than drawn by hand, and a daily photo background makes the cards go frosted automatically.