chetanvashistth I build software.

Building Suno: A Local-First Family App That Syncs Over Your Wi-Fi

A hobby project: a family super-app that runs on the phones already in the house, syncs peer-to-peer over the home Wi-Fi, and needs no account, no cloud, and no permanent server. Here is how it works and why I built it.

This one is a hobby project, not a pitch. It is the app my family actually needs, built the way I think family software should be built — on the phones already in the house, with no account and nobody’s cloud in the middle.

The honest origin story: I had a pile of coordination problems at home, an opinion about how they should be solved, and Claude Code on my side. That was enough reason to build it and open source it.

The problem

Family coordination happens on WhatsApp. One group for grocery lists. Another for reminders. Tasks get buried in chat. Grocery lists get re-typed every week. Reminders get missed.

And every coordination app wants an account. Most of them sync to someone else’s cloud. Some of them are built for teams and feel like overkill for asking your daughter to pick up milk.

I wanted something that worked within the house, on phones already in the house, without any account, any cloud service, or any permanent server.

What Suno is

Suno is a local-first family super-app. A collection of small utilities — grocery, to-do, and more over time — that run on each family member’s phone and sync directly with each other over the home Wi-Fi network. No internet required. No account required.

The guiding principle — local first, offline first

One rule was written into the project from day one:

The network is an occasional synchronization mechanism, not a dependency of the app.

Suno must stay fully useful with internet off, Wi-Fi off, and sync off. If the app only works when something external cooperates, it is not local-first. That principle is the thing every design decision below has to answer to.

What is already live — the Grocery module

The Grocery module is complete and deployed as a PWA on GitHub Pages.

Each family member installs it on their phone. No app store. No account. An HTTPS install straight from a GitHub Pages URL, added to the home screen like a native app.

The grocery list works offline. Data lives in IndexedDB on the device. A base catalog ships with the app — structured for an Indian household, category by category — and the admin can customize it. Members can add items, adjust quantities, and mark things purchased. Done items move to a done view and auto-archive after two days.

The admin/member split is deliberate: one person curates the household catalog and marks items done, and everyone else raises requests. It is a simple division that mirrors how a household actually works.

What is being built next — To-do with delegation

The To-do module is the more interesting one technically.

Each member has their own private to-do list. Personal tasks never leave the device — not even during sync. Only delegated tasks travel.

Delegation is the core feature. A family member can assign a task to another: “Papa, drop me at class at 6 PM today”, “ask Grandma for morning sprouts”, “remind Mother about the evening snacks”. The task text is parsed for time and date, mixed Hindi and English is supported, and if a time is found with no date it defaults to today.

The lifecycle of a delegated task is visible to both sides: pending, accepted or rejected, done, and whether it has synced. Either the person who delegated the task or the person who received it can mark it done.

The To-do module has no admin. It is flat peer-to-peer — every member is equal, and no one manages anyone else’s list.

The interesting technical decisions

Operation log instead of database sync

Suno does not sync databases. It syncs operations — an append-only log of every mutation, each stamped with a globally unique id, a device id, and a logical clock.

During sync, each device sends the operations the other device is missing. Both apply the merged set through a deterministic reducer. The result is the same regardless of the order in which devices exchange operations.

This is what makes peer-to-peer mesh sync safe. If device A syncs with device B, and then device B syncs with device C, device C gets device A’s changes transitively. No fixed coordinator. No owner. Any pair of devices can sync in any order and still converge.

Conflicts are handled by a simple rule: last-write-wins by logical version, and delete is terminal. At this scale, no complex CRDT framework is needed.

Private by default

The sync layer does not ship the whole operation log to every device. Personal to-do tasks are never transmitted. Delegated task operations go only to the two members involved — the person who delegated the task and the person who received it.

The filter happens at the sync layer, not at the application layer. A peer does not receive operations it is not entitled to.

WebRTC for peer-to-peer data exchange

Data moves between devices over WebRTC data channels. Two phones on the same Wi-Fi network establish a direct connection, exchange operations, and close the channel. No relay server touches the family data.

The challenge: a browser PWA cannot discover other devices on the local network on its own. There is no mDNS, no UDP broadcast, no LAN socket. So device discovery sits behind a transport interface with a manual fallback today — two devices can exchange connection codes by hand — and automatic discovery via a small signalling relay is the next step.

When that signalling relay is built, it will carry only the WebRTC handshake. The actual data still flows peer-to-peer.

No secrets in the repository

Family data never touches GitHub. The repository holds only application code and a base catalog. The local database on each phone is never committed.

The future idea — a spare phone as a local server

One idea I am exploring: keep a spare Android phone always on in the house, running Suno, acting as a passive sync hub for the family. Every family member’s phone syncs with the spare phone whenever it is on the same network, and changes propagate across the household without anyone needing to manually sync device to device.

No cloud. No subscription. Just a phone that was already sitting in a drawer.

This does not change the local-first data model. The spare phone is just another peer — it happens to be always present.

Where to find it

The project is open source, and the Grocery module is live and usable today.

#architecture#open-source

← All posts