Skip to content

svenger87/kinboard

Kinboard

A self-hosted family dashboard for the kitchen wall. Calendar · weather · photos · shopping list · smart-home — one screen, every device, real-time sync.

License: MIT CI Docker image Release Stars Issues

Sponsor Buy Me a Coffee


The landing page at kinboard.app has the pitch, screenshots, and install path. The demo at demo.kinboard.app runs the latest tagged release with mock integrations — use join code DEMO01 to load a populated household, or create your own family from scratch. Demo data resets daily.


Kinboard dashboard — kitchen kiosk portrait view

Built for kiosk-style touchscreens but works on any phone, tablet, or browser. Multi-device, multi-person, no cloud account required.


Table of contents


Why

Family logistics are scattered across calendars, chat threads, sticky notes, and "did you check the shopping list?" Kinboard consolidates the daily-driver stuff into one always-on display, so the family knows what's happening without opening apps.

  • Self-hosted. Your data stays on your hardware. No SaaS, no telemetry, no account gating.
  • Real-time. Edit a shopping item on your phone, it appears on the kitchen wall in milliseconds (Supabase Realtime over WebSockets).
  • Offline-tolerant. The shopping list works in the basement supermarket without signal — changes queue locally and replay when the device gets connectivity back.
  • Touch-friendly. Designed for wall-mounted tablets first; mobile and desktop are first-class too.
  • Modular. Pick the integrations you actually use; the rest stay invisible.

Features

Feature Wiki page
Dashboard — clock, today strip, configurable widget grid Dashboard
Calendar — two-way Google Calendar sync, per-person colors, holidays, waste-pickup widgets Calendar
Shopping list — built-in real-time list with offline support + dedicated standalone PWA, optional Bring! sync Shopping
Recipes & meal planning — Chefkoch.de search + schema.org URL import, weekly meal board, recipe-driven shopping Recipes & meals
Tasks & todos — per-person assignment, priorities, daily reminder push Tasks & todos
Notes — quick shared sticky notes for the household Notes
Birthdays — year-ring viz, countdowns, gift-idea tracking Birthdays
School schedule — per-child timetable + auto pack list for tomorrow Schedule
Smart home — Home Assistant entities, room tabs, floating-lights master control Smart home
Energy dashboard — solar / battery / grid live flow + charts Smart home → Energy
Cameras — live WebRTC streams (via go2rtc) Cameras
Pocket money — per-kid virtual accounts with parent-configurable APR, allowance cron, saving goals + parent-approval queue, evolving avatar (5 species × 8 stages) Pocket Money
Photo screensaver — Immich monthly album or Unsplash fallback, presence-aware blanking Screensaver
Weather — current + hourly + radar (OpenWeatherMap) OpenWeatherMap
Web push notifications — shopping items, task assignments, daily todo digest. PWA install required on iOS. Notifications
Multi-device + multi-person — devices join a family with a 6-char code, per-person color coding everywhere Family members, Devices
Monthly themes — colors shift through the year automatically Themes & locales
i18n — English + German, full UI parity Themes & locales

The full wiki has a page for every feature plus integration setup, kiosk hardware reference build, security model, and database schema.


Quick start

You need Docker (with Compose v2), Node.js 20+ (for the VAPID key generator that powers push notifications — setup.sh uses npx; if Node.js is missing, setup completes but push notifications stay disabled), ~2 GB free disk, and ~10 minutes. The bundled docker-compose.yml brings up the Next.js app, a self-hosted Supabase stack, and supporting services.

RAM: the local Next.js build peaks around 4 GB, plus another ~3-4 GB during type-check and static-page generation. On a 4 GB VM you'll need ≥ 8 GB total swap to avoid OOM kills during build (fallocate -l 8G /swapfile && chmod 600 /swapfile && mkswap /swapfile && swapon /swapfile). Or — recommended — skip the build entirely by using the pre-built image at docker-compose.image.yml. That drops bring-up to ~30 sec and needs only ~512 MB at runtime.

If you don't have Docker yet:

curl -fsSL https://get.docker.com | sh

Then bring Kinboard up:

git clone https://github.com/svenger87/kinboard.git
cd kinboard
./setup.sh                # generate random secrets + Supabase JWT keys
cd webapp/docker
./start.sh up             # docker compose up -d

Open http://<server-ip>:3001 (or http://localhost:3001 if local), follow the setup wizard to create your first family, and start adding integrations from /settings.

Push notifications require Node.js for VAPID key generation. If node isn't on PATH when setup.sh runs, push stays disabled (everything else works); install Node.js + re-run ./setup.sh --force later to enable.

Skip the local build by using the pre-built multi-arch image (amd64 + arm64) at ghcr.io/svenger87/kinboard:latest. Drops bring-up to ~30 sec and ~512 MB RAM at runtime instead of 4 GB+ during build. See webapp/docker/docker-compose.image.yml for the overlay.

Updating

./start.sh up reuses the cached image — fast for restarts but won't pick up new code. After pulling source updates, use:

git pull
cd webapp/docker
./start.sh restart    # rebuilds the webapp image + recreates webapp + cron

Hands-off auto-updatecp docker-compose.diun.yml.example docker-compose.diun.yml, run ./setup.sh --non-interactive to fill in the required .env keys (DIUN_WEBHOOK_SECRET, KINBOARD_PROJECT_DIR, COMPOSE_PROJECT_NAME, COMPOSE_FILES), then bring the stack up with -f docker-compose.diun.yml --build added. Diun watches GHCR for new kinboard-webapp digests; when one lands, a webhook fires kinboard-self-update.sh which runs the full upgrade path (git pullsetup.sh --non-interactivecompose pullup -dkong restart if kong.yml changed). Replaces the deprecated Watchtower overlay (Watchtower was archived in 2024 and only handles the image step, missing the surrounding config substitutions). See Self-hosting → Auto-updates for the full setup including the flat-layout migration.

For production self-hosting (Traefik + custom domain + backups + updates), see Self-hosting.


Screenshots

A few highlights from the demo data set — see the wiki for the per-feature pages.

Calendar
Calendar
Energy
Energy dashboard
Home automation
Home automation
Shopping
Shopping
Birthdays
Birthdays
Recipes
Recipes
Meal planning
Meal planning
School schedule
School schedule
Todos
Tasks & todos

A light-mode variant of every screenshot is available with -light suffix (e.g. dashboard-portrait-light.png), and a phone-viewport variant lives in docs/wiki/images/mobile/. The full toolchain that produces them — local docker stack with anonymized prod data + mock HA / Tesla / OpenWeatherMap servers + Playwright capture — lives in docs/wiki/screenshots/.


Integrations

Service Purpose Required?
Supabase (self-hosted) Database + realtime sync Yes (bundled)
OpenWeatherMap Weather forecasts + radar Optional, free tier OK
Google Calendar Two-way calendar sync Optional
Immich Photo screensaver and gallery Optional
Home Assistant Smart-home entities and energy Optional
Bring! Shopping list sync (built-in list works without it) Optional
go2rtc WebRTC camera streams Optional

Niche integrations (Tesla Fleet, Zendure SolarFlow batteries, etc.) ship as opt-in plugins. A plugin authoring guide is in the works.


Tech stack


Reference hardware build

Kinboard is hardware-agnostic — any HDMI display + any small PC works. For people who want a known-good combination, Reference build documents one ~€700 setup with a 27" capacitive touchscreen + a Mele Quieter 4C mini-PC + a custom oak frame, with a complete BOM, wiring, and what didn't work.

For software side of the kiosk install: Windows 11 (Mele 4C) walks through Edge --kiosk mode + the on-screen keyboard, and Linux guidance covers Cage / GNOME / X11 alternatives.


Documentation

The wiki is the source of truth for everything beyond this README:


Status & roadmap

v1.0.0 shipped 2026-05-04 — first tagged public release. Latest: v1.1.0 (2026-05-11). Live demo running the latest tag at demo.kinboard.app (auto-updated via Diun + the self-update webhook; data resets daily). The project is single-maintainer and developed in personal time; expect periodic activity rather than a Big Co cadence. See the CHANGELOG for what's in each release and the RELEASE doc for how releases are cut.

Security model: designed for a trusted home network. Do not expose Kinboard directly to the public internet without putting a reverse proxy and authentication layer in front of it. See Security & threat model and SECURITY.md.

Recently shipped

  • Pocket Money plugin (Piggy) (v1.1.0) — per-kid virtual pocket-money accounts with parent-configurable APR (daily accrual + daily commit), scheduled allowance (weekly / biweekly / every 4 weeks), multi-goal saving queue with image lookup + URL paste + upload, kid-proposed withdrawals routed through a parent-approval inbox, and an evolving kid-facing avatar (5 species × 8 stages, driven off lifetime_saved_cents). Forecast panel on /settings/pocket-money projects balance at 1 / 3 / 6 / 12 months at the current APR + allowance. Fifth registered SurfacePlugin alongside Vehicles + Energy + Cameras + Stonks. See Pocket Money
  • End-to-end auto-update (v1.1.0) — Diun + webhook overlay runs the full upgrade path (git pullsetup.shdocker compose pullup -d → conditional Kong + Diun reload) every time a new image lands on GHCR. Replaces the deprecated Watchtower overlay (archived upstream, missing the config-substitution step). See Self-hosting → Auto-updates
  • Drag-reorder for the bottom navigation (v1.1.0) — per-device localStorage at /settings/navigation; kitchen kiosk, parent's phone, and kids' tablets each keep their own layout
  • Stonks plugin (v1.0.19) — track stocks, ETFs, crypto, indices, and forex pairs in a watchlist with proper TradingView candle charts (1d / 1w / 1m / 3m / 1y / max timeframes). Yahoo Finance is the v1 data driver — no API key required, covers every asset class through one source. Per-ticker detail page, rotating dashboard widget, server-side TTL cache (30s spot quotes, 5min charts) so kiosk auto-refresh doesn't rate-limit. Fourth registered SurfacePlugin alongside Vehicles + Energy + Cameras
  • iCalendar (.ics) feed support (v1.0.19) — read-only calendar feeds via shared .ics URLs. Covers iCloud Family Sharing, Google's "secret iCal address", and most CalDAV providers in one feature. Skips the Google Cloud OAuth setup entirely for read-only use. Manual "Sync now" button + 30-min cron with ETag conditional GETs and recurring-event expansion
  • Energy + Cameras migrated onto the plugin contract (v1.0.18 + v1.0.19) — both surfaces now ship as drivers under the same SurfacePlugin model that Vehicles introduced. Per-family enable/disable at /settings/plugins. The contract is now validated on four concrete surfaces (Vehicles, Energy, Cameras, Stonks)
  • Calendar event reminders via web push (v1.0.17) — family devices subscribed to push receive a notification N minutes before each event starts (configurable on /settings/notifications, default 30 min). All-day events are skipped. Idempotent scheduling — multiple cron ticks scanning the same window don't double-send
  • Country-aware public holidays (v1.0.16) — DE / US / UK / NL / FR. Per-family country picker on /settings/language; existing families default to DE so behaviour is unchanged
  • Pre-built multi-arch (amd64 + arm64) Docker images on ghcr.io — self-hosters skip the build step
  • CI on every PR — ESLint + i18n bundle parity + shellcheck — plus a full E2E smoke run that boots the docker stack with mock integrations and verifies the dashboard against Playwright
  • Public live demo at demo.kinboard.app with mock Home Assistant / Tesla / weather / cameras so visitors see the full UI without configuring real integrations
  • First-run setup wizard at /setup/{people,homeassistant,weather,done} — guides fresh self-hosters through onboarding instead of dropping them on an empty dashboard; dismissible "Finish setting up" banner on the dashboard until completed
  • Interactive setup.sh — prompts for the optional API keys most self-hosters need (OpenWeatherMap, Google Calendar OAuth, maintainer email) at first-run time, with --non-interactive and --advanced flags for automation and power users
  • Device recognition that survives browser/OS updates — fingerprint-history table so a Safari/Chrome bump doesn't strand the device on /join (v1.0.11)
  • Vehicles surface + build-time plugin contract (v1.0.12) — multi-car, multi-vendor /vehicles page. Tesla driver (native UI via Home Assistant Fleet) + Generic-EV driver (any car HA can talk to: VW We Connect, BMW Connected Drive, Polestar, Hyundai BlueLink, OBD2 dongles). First plugin under the SurfacePlugin contract. See Plugin architecture, Vehicles, and the Plugin directory
  • Image-baked migrations (v1.0.12) — schema migrations are baked into the webapp Docker image and applied automatically on container start. Self-hoster updates (via the Diun overlay or any other path) pick up new schema without anyone running start.sh migrate from the host

Up next (no fixed dates)

  • Additional Stonks data drivers — paid sources like Polygon or Tiingo for users wanting higher-resolution intraday + cleaner symbol coverage than Yahoo's unofficial endpoints. The driver contract already leaves room; only API-key plumbing and a settings UI need to land
  • News feed per ticker on the Stonks detail page — Yahoo already returns it via quoteSummary, just needs UI
  • Per-ticker price alerts via the existing notification queue
  • Drag-reorder for the Stonks watchlist (currently creation-order)
  • Additional locales beyond EN + DE (community PRs welcome — see CONTRIBUTING.md)

Contributing

Bug reports, feature requests, translations, and code PRs all welcome. The full guide lives in CONTRIBUTING.md — it covers dev setup, code conventions, the changelog discipline, and the Conventional Commits format. For where to take questions vs. issues vs. discussions, see SUPPORT.md.

Quick orientation:

  • Bugsopen an issue with logs + the route that broke
  • Features — open a GitHub Discussion before a substantial PR
  • Translationswebapp/messages/*.json is the source of truth; PRs adding new locales (FR, ES, IT, NL…) gladly accepted
  • Plugins — the plugin system isn't carved in stone yet; open a discussion to help shape it
  • Security — see SECURITY.md — please don't file public issues for credential / data-access vulnerabilities

CI runs ESLint + i18n bundle parity + shellcheck on every PR. The codebase deliberately doesn't run next build in CI to keep the dev-server experience predictable; production builds happen in the Docker image workflow.


Support development

Kinboard is built and maintained on personal time. If it's useful to your family and you'd like to keep it healthy:

GitHub Sponsors Buy Me a Coffee


Acknowledgements

Kinboard stands on the shoulders of an incredible amount of open-source work:

  • Supabase — the entire self-hosted backend stack (Postgres, Realtime, GoTrue, PostgREST, Storage)
  • Next.js + Vercel — the application framework
  • shadcn/ui — the component primitives. UI quality starts here.
  • Lucide — every icon in the app
  • Framer Motion — the smooth, deliberate transitions
  • next-intl — i18n done right for App Router
  • Home Assistant — the smart-home backbone Kinboard talks to
  • Immich — the photo backend that powers the screensaver
  • Bring! — the shopping list app some of us still want on a phone
  • go2rtc — the camera streaming bridge
  • OpenWeatherMap — weather data
  • Chefkoch.de — recipe search source
  • Faker — anonymized demo data for the screenshot toolchain
  • Playwright — automated screenshot capture

For the specific kiosk hardware combination (display + mini-PC + frame), see Reference build.


License

MIT — see LICENSE.