Work / 2026 – now
Hearth
A household tracker for me and my partner, covering pets, bins, the car, medication, food, shopping and jobs, with an Android home-screen widget and a kitchen tablet view.
- Role
- Solo project. Design, build and hosting.
- Built with
- TypeScript, React, Hono, SQLite, Drizzle, Kotlin, Android

Why I built it
Two busy people, several pets, a car and a lot of “did you already feed the dogs?” Hearth is the one place we both check. It runs our real household, so there’s no public demo, and these screenshots use sample data.
What it does
- Trackers for anything that recurs, like feeding, flea treatments, plant watering, the MOT and insurance. They’re built on four schedule types (interval, daily slots, calendar date and deadline), so adding a new kind of thing to track needs no new code.
- Bin days pulled from the council’s website every night.
- Shared lists for jobs and shopping, recipes and a meal plan, and gift lists that hide who’s buying what.
- Food with expiry dates. Photograph the packaging and the date is read for you, then “use soon” reminders follow.
- Medication reminders that alert the other person if a dose is missed.
- A kitchen tablet view with timers, weather, messages and a clock that dims overnight.
- An Android app with a home-screen widget and notifications.
Engineering
- One source of truth. A single module works out every tracker’s state and reminders, so the widget, notifications and web app always agree. It’s covered by unit tests, part of about 300 across the server.
- Households can’t see each other. A test walks every API route as a user from another household and expects nothing back.
- Medication doses are stored, not calculated. Review rounds found edge cases in reminders worked out on the fly, so each dose became a row, guarded by a seeded invariant test.
- Works without signal. A service worker caches the app and recent data, so the shopping list still opens in a shop with no reception.
- Careful with the camera. Photos are shrunk on the device before upload, the scanner sits behind a Unix socket rather than a network port, and there’s a daily cap per household.
- Backed up. The SQLite database snapshots itself every hour, and those snapshots are backed up to a second machine.

