-
-
Notifications
You must be signed in to change notification settings - Fork 1
Onboarding
How devices join a family, and how the first family gets created.
When the database has no families, the /join page detects this (via /api/setup/status) and:
- Auto-flips to "Create" mode
- Hides the join/create tab toggle
- Shows a "Welcome — let's set things up" card
You enter a family name, give the device a name, and click Create family. The family is created with a randomly-generated 6-character join_code, the device is registered, and you're redirected to the dashboard at /.
TODO: screenshot of the fresh-install
/joinpage
On the second device, browse to http://<host>:<port>/join. The page shows the join/create tabs because at least one family exists.
- Tap Join family
- Enter the 6-character code (find it under Settings on a connected device — see below)
- Give the new device a friendly name (defaults to "My device")
- Tap Join
The device's hardware fingerprint (browser characteristics) is stored alongside the device row. On future visits to /join, the page recognizes the fingerprint and offers a "Sign back in as Living-room display" shortcut so you don't need to retype the code.
Settings → top of the page. Each family device shows the same join_code.
TODO: screenshot of the join code panel in /settings
A device belongs to exactly one family at a time. To switch families, leave the current one (Settings → Leave family) and join a new one. The local data on that device is cleared (cookies + localStorage); the family's data on the server is unaffected.
There's no hard cap on devices per family. Typical deployments:
- 1 wall-mounted kitchen display
- 2–4 phones (one per adult, optional ones for kids)
- 1–2 tablets (couch / nightstand)
- A dev laptop running
npm run dev
All see the same state. Edits propagate via Supabase Realtime within ~100 ms.
Each row shows:
- Custom device name (editable)
- Online/offline indicator (last_seen within 5 minutes = online)
- "This device" badge for the one you're currently on
- A device ID (8-character truncated UUID, copyable) — needed when configuring the Presence-Sensor
Settings → Leave family at the bottom. The device's row is deleted from the family's devices table; the family itself stays. The local browser state is cleared and you land back on /join.
If the device you're leaving is the last one in the family, the family rows stay in the database. Any other device that has the join code can re-enter and pick up where you left off.
To wipe a fresh-install state:
docker exec -i kinboard-db psql -U postgres -d postgres <<'EOF'
TRUNCATE families CASCADE;
EOFCASCADE removes everything linked: devices, people, calendars, events, todos, shopping_items, etc. The schema and the demo seed (if applied) are unaffected.
- Don't share the join code over the public internet. Anyone with the code + the URL can join your family. The model assumes a trusted LAN. See Security-and-Threat-Model.
-
Don't manually edit the
devicestable unless you know what you're doing. The webapp uses the row's UUID as the active device key in cookies; renaming the row is fine, deleting it logs the device out. -
Don't enable AssignedAccess kiosk mode for the kiosk user account if you want notifications + Edge to coexist — Kinboard's Edge
--kioskflag does the lockdown without the AssignedAccess complications. See Kiosk-Windows-11-Mele-4C.
Kinboard on GitHub · Sponsor · Buy me a coffee · Report a bug · MIT-licensed
Getting started
Operations
Integrations
Kiosk hardware
Built-in features
- Dashboard
- Calendar
- Shopping
- Recipes & meal planning
- Tasks & todos
- Notes
- Birthdays
- School schedule
- Smart home & energy
- Screensaver
- Family members
- Devices
- Notifications
- Themes
Plugins (per-family on/off)
Contributing