Back to projects

Building

HomeVault

One place for household inventory and admin, built to keep working even when the WiFi doesn't.

practical / calm / local-first

HV
React NativeExpo SDK 57TypeScriptExpo RouterSQLiteSupabase

Why I built it

HomeVault started as a practical personal app for managing the stuff around the house that's easy to lose track of: inventory, appliances, subscriptions, the boring administration nobody enjoys doing.

I wanted one place for household inventory and everyday household admin, without it turning into its own complicated administration system. A lot of "organizing" apps end up creating more admin than they save. That was the thing to actively avoid.

A major design principle from the start was offline-first. A household inventory app that stops being useful the moment the WiFi drops isn't actually useful: you're standing in the garage or in front of a cupboard, not sitting at a desk with a stable connection.

What it does

HomeVault is a mobile app for tracking household inventory, shopping needs, appliances and subscriptions in one place. It's built offline-first, and designed from the ground up with household sharing in mind, eventually between partners.

Key features

Inventory

  • Create, edit and delete items
  • Track quantities per item
  • Organize household inventory by category

Shopping

  • Shopping list built from actual stock
  • Minimum-stock quantities per item
  • Items surface for shopping automatically once quantity drops below the configured minimum

Appliances

  • Track household appliances
  • Store warranty and appliance details for later reference

Subscriptions

  • Manage recurring household subscriptions in one place

Accounts

  • Account creation and deletion
  • Forgot-password flow
  • Account changes

Household sharing

  • Designed for sharing between household members, e.g. partners

How it works

  1. 1Local app (Expo Router)
  2. 2SQLite (local-first)
  3. 3Sync layer
  4. 4Supabase (auth + Postgres)

Local-first interaction, snapshot pull, last-write-wins

Architecture notes

Local SQLite is the core of the app, not an afterthought layered on top. Every interaction happens against the local database first, so the app never waits on a network round-trip to feel responsive.

Supabase is planned/used underneath for authentication and Postgres-backed synchronization, but it sits behind the local-first experience rather than being the foundation of it. Sync runs on login/app start, when the app returns to the foreground, manually on request, and through online writes where that makes sense.

A household inventory app shouldn't become useless just because connectivity is unavailable or slow. That's the whole point of building it this way instead of the other way around.

Tech stack

React NativeExpo SDK 57TypeScriptExpo RouterSQLiteSupabase

Interesting technical details

Detail

Local-first interaction

Every read and write happens against local SQLite first. The UI never blocks on a network call to feel usable.

Detail

Snapshot pull

Sync pulls a snapshot of household state rather than reconciling incremental diffs, which keeps the conflict model simple to reason about.

Detail

Last-write-wins

Conflicts resolve last-write-wins. For household inventory data, that's a deliberate trade-off: simplicity beats a complex merge strategy here.

Detail

Sync triggers

Synchronization runs on login/app start, on returning to the foreground, on manual request, and via online writes where appropriate.

Challenges & decisions

Decision

Offline-first, not just offline-tolerant

It would have been simpler to build an online app with a cache bolted on for bad connectivity. Making local SQLite the actual source of truth, with sync as a layer behind it rather than the foundation, was the harder but more honest choice for what this app needs to be.

Decision

Quicker than opening a drawer

Good household software has to be quicker than opening a drawer. If checking or updating HomeVault takes longer than just looking at the actual shelf, the app has already failed at its one job. That constraint shapes almost every UI decision.

Current status

Actively being built, not yet publicly released.

  • Core inventory, shopping, appliances and subscriptions flows are in place
  • Account management (creation, deletion, forgot password, account changes) is implemented
  • Supabase-backed authentication and sync are planned/in progress alongside the local SQLite foundation
  • Household sharing between multiple accounts is designed for, not yet fully built

What's next

Building offline-first from day one is more work up front than bolting it on later, but it's the only way the app stays honest about what "works everywhere" actually means. Everything else (sync, sharing, accounts) has to fit around that, not the other way around.

Finish Supabase sync end-to-endHousehold sharing between accountsPublic release