← All case studies
Full-stack · self-hosted

Homebase

Our household's own Todoist, built test-first with a local AI model writing the screens.

Role
Product, architecture and an AI-assisted build pipeline
Stack
Kotlin · Ktor · PostgreSQL · React · TypeScript · Tailwind
Status
In daily use by our household
Screens

The real app, with made-up data and placeholder names.

Homebase Today view on desktop with overdue, today and done counts, family filters, tonight's meal and tasks grouped by list
Today on desktop: counts, filters, tonight's meal.
Homebase Today view on a phone with a bottom tab bar and a new task button
The same view on a phone.
A Kitchen refresh project with Plan, Buy and Do sections, sub-tasks, labels and assignees
A project with sections and sub-tasks.
Medications screen with a running-low banner and morning, bedtime and as-needed doses
Medications: doses by time of day, refill warning.
01

The problem

Our family ran on a commercial to-do app. It couldn't feed our kitchen wall display, didn't know about meals or medications, and kept our lists on someone else's server.

I wanted one place for tasks, shopping, chores, the meal plan and medication doses, shared by the household and shown on the wall, and a way to build it quickly without giving up on quality.

02

What I built

A full task managerLists in folders, sections, labels, saved filters, subtasks, repeats, reminders, comments, Today, Upcoming, Inbox, search and live updates.
A drop-in for TodoistA Todoist import and a Todoist-compatible API, so our existing lists and habits moved over instead of starting from scratch.
Meals and medicationsA meal library and weekly plan, freezer stock, groceries generated from the plan, and medication doses with history, refills and alerts.
On the kitchen wallPlugins for the Home Screens wall display show tasks, meals and medication doses, through a separate wall API.
03

How it works

The app itself is a straightforward three-tier system. What is unusual is how the screens get built: each one is a small step whose test is written first, and a local AI model writes the code until that test passes.

The app

Phones & laptopsReact 19 · TypeScript · Tailwind
  • Material-style shell
  • Live updates
Ktor APIKotlin · Exposed
  • Households, lists, tasks
  • Meals and medications
  • Todoist-compatible API
PostgreSQLDocker on a home server
  • Daily backups, kept 14 days

How each screen gets built

Step + testthe spec
  • Proven against a throwaway implementation first
Local modelAider + qwen3-coder
  • Writes the screen
  • Cannot edit the test
check.shtypes + full test suite
  • Pass or fail, nothing in between
Reviewme
  • Look at it, mark it done
04

Key decisions

  1. The test is the specEvery step ships with its test, proven against a working implementation before it is handed over. The model may never edit the test, so a passing step means the screen really does what was asked.
  2. Mistakes become rulesEach new kind of mistake the model makes becomes one line in the conventions file, so it does not make it again.
  3. Compatible on day oneSpeaking the Todoist API meant imports, scripts and habits carried over, instead of asking the family to start from scratch.
  4. Walls get their own keysEach wall display authenticates with its own key against a separate wall API, not with a family member's login.
  5. Boring to runOne Docker Compose file on a home server, a health check, and daily backups kept for two weeks, with restore steps written down.
05

Where it stands

Today

In daily use by our household on phones, laptops and the wall. The server has 66 tests across 14 files.

Next

More wall plugins and the remaining screens, one tested step at a time.

KotlinKtor 3ExposedPostgreSQLReact 19TypeScriptTailwind 4ViteVitestDockerAiderLocal LLM

Have something people will use every day?

I'm happy to walk through any of these projects, including the private ones, in more depth.