← Back to projects

Personal project · Local-first PWA

Kin

A private household coordination app for lists, routines, handoffs, and chat, with on-device encryption and sync a server can relay but never read.

My role: Creator · Full-stack developer

Choose Start a new household to try Kin with a username and password; no email is needed. Household content is encrypted on your device. Save the recovery key it shows, because Kin cannot reset a lost household.

The problem

Household information gets scattered across memory, texts, calendars, and sticky notes. Most family apps solve that by putting lists, messages, and photos on a company's server in readable form.

The solution

Kin gives a household one calm place for what matters today, what changed, and what someone needs from someone else. Each device keeps the household's history as an encrypted event log; a Rust engine replays it into what you see, and a small Node service relays encrypted events between devices without the keys to read them.

My contributions

  • Wrote the household domain in Rust: canonical events, validation, recurrence, and deterministic replay, compiled to WebAssembly behind a narrow manual ABI.
  • Built the interface from native Web Components and vanilla JavaScript with no frameworks and no npm runtime dependencies.
  • Implemented on-device encryption with Web Crypto and IndexedDB, passkey and password sign-in, recovery keys, and device pairing by QR code.
  • Built a Node.js sync relay on built-in SQLite that stores only encrypted envelopes and routing metadata, runs inside Node's permission model, and supports self-hosting.

Behind the project

A personal project and ZTM Build Fest entry, designed for a tired parent holding a child: add something in a tap, see what needs doing, hand something off, and leave. Kin deliberately has no streaks, scores, or rankings. It froze a stable 1.0 storage and sync format and has continued through v1.6.

Engineering decisions

Privacy is a capability boundary, not a hidden panel. A locked device holds no decrypted data or keys, and unlocking decrypts the full history before Rust replays it. Kin is explicit about its limits: it has not had an independent security audit, and a household whose every unlock path is lost cannot be recovered.

Testing

A single verification gate runs Rust tests (including frozen golden fixtures replayed through the release WebAssembly build), Node tests for the web and server modules, and browser regressions for storage security, passkeys, and household authority. I built the WebAssembly engine and ran the service locally to capture these screens.

Repository
mnichols08/kin-app
Repository updated