Family OS is a self-hosted operating system for the most demanding home on earth — the school run and the perimeter drones, the grocery list and the microgrid. Seventy-five modules. One interface. Hardware you own.
Everything below is the product's own design language — a Next.js app that runs on a mini-PC in a closet. What you're seeing is the live component system with seeded demo data, ticking in real time.
Scroll through a Tuesday. The house wakes before you do, empties without a checklist, banks the sun while you're gone, and puts itself to bed after you're asleep.
—
Cameras, thermal, buried perimeter sensors, patrol drones, radar — fused into one live picture of the property. Click a mode and watch the whole estate answer. This is a live demo, drawn frame-by-frame in your browser.
Not a roadmap — routes in the product. Every node below is a real module sharing the same storage engine, the same API conventions, and the same design system. From Allowance to Aviation.
The assistant reads the live state of the home and acts on it. It turns plain sentences into automations. Point it at any OpenAI-compatible endpoint — a local model on your own hardware included — or run it fully offline on built-in heuristics.
Outbound alerts walk a chain until a human acknowledges: push first, then SMS, then a phone call. Quiet hours respected — unless it's a water leak.
Familiar faces and plates get logged, not flagged. Strangers at 2 AM get the full treatment — camera track, drone eyes, and your phone buzzing.
One env var points the assistant at any OpenAI-compatible endpoint — a llama.cpp box in the rack, Ollama on a mini-PC, or a cloud key if you choose. Unset it and everything still works.
Every one of the 75 modules is the same vertical slice: typed domain, Zod at every boundary, file-backed storage you can read with your own eyes, and a provider seam where real hardware plugs in. This is the actual source:
import type { Light, LightStatePatch } from "@/lib/lights/types"; import { mockLightsProvider } from "@/lib/lights/mock-provider"; /** * The control surface every lighting backend implements. The UI and API only * ever talk to this interface, so swapping the mock for a real integration * (Home Assistant, Hue, etc.) is a one-line change in `getLightsProvider()` — * no route or component touches a concrete backend. */ export interface LightsProvider { readonly id: string; listLights(): Promise<Light[]>; getLight(id: string): Promise<Light | null>; setState(id: string, patch: LightStatePatch): Promise<Light | null>; } /** * Resolve the active lighting provider. Today this is always the file-backed * mock. When real hardware is wired up, branch here on a stored config * value (e.g. `lights.provider` in data/) and return the matching impl. */ export function getLightsProvider(): LightsProvider { return mockLightsProvider; }
Versioned JSON on disk — human-readable, diffable, backed up with rsync. No database to babysit.
Every API payload and every file load is schema-validated. Bad data bounces at the door, typed end to end.
Per-person PIN auth with sessions. Every write passes a guard and lands in the activity ledger.
Ring cameras via ring-client-api, Open-Meteo weather, iCal feeds, web-push — behind the same seams as the mocks.
Calendars, cameras, codes, kids' names — file-backed JSON on a machine in your closet. Open it in a text editor. It's yours, legibly.
Off the shelf, Family OS talks to exactly one outside service: the forecast. Connect Ring and it talks to your cameras' account too — your call, your keys.
No accounts, no telemetry, no subscription, no vendor to sunset your hardware. The assistant even runs offline on heuristics — or on a model in your own rack.
Family OS is running today — a private build, on private hardware, for one very demanding property. If you want to see it live, ask.