-
-
Notifications
You must be signed in to change notification settings - Fork 1
Troubleshooting
A growing list of common breakages and fixes. If your problem isn't here, open an issue with reproduction steps.
The Dockerfile uses node:20-alpine which ships npm 10.8.2; the package-lock.json was generated by a newer npm. Two fixes (the maintainer's repo bumps npm 11 in the Dockerfile already; this guidance applies if you're customizing):
# In webapp/docker/Dockerfile, deps stage:
RUN apk add --no-cache libc6-compat && npm install -g npm@11Or relax npm ci to npm install --no-audit --no-fund (looser; lockfile drift becomes a warning, not an error).
The script uses bash 4-isms (associative arrays, [ ... ]( ... .md)). macOS ships bash 3.2 by default. Install via Homebrew:
brew install bashThen re-run with the new shell:
/usr/local/bin/bash ./setup.shMost common cause: you ran docker compose up -d against the base compose file but you actually need the Traefik override loaded too (the base file has no Traefik labels). Either:
docker compose -f docker-compose.yml -f docker-compose.traefik.yml up -dOr use the helper:
export COMPOSE_FILES="-f docker-compose.yml -f docker-compose.traefik.yml"
./start.sh upIf you're hitting Kinboard directly (no Traefik), check that WEBAPP_PORT in .env matches the URL you're using.
kong.yml still has the placeholder JWTs (REPLACE_WITH_ANON_KEY / REPLACE_WITH_SERVICE_ROLE_KEY). After pasting your Supabase keys into .env, re-run setup.sh — it substitutes them into kong.yml automatically.
Either:
- The DB volume bind path changed when you upgraded to the templated
docker-compose.yml. CheckDATA_DIRin.envmatches your existing data path. (For an existing prod deploy, usewebapp/docker/migrate-prod.shto add the variable safely.) - Cookies are stale. Clear cookies for the site (specifically the
family-storecookie) and rejoin via/join.
- Check that both devices are connected to the same family — Settings → top of page → join code matches
- Open the browser dev tools → Network → WS tab. You should see an open WebSocket to
/realtime/v1/websocket. If it's closed/erroring, the issue is reaching the realtime container — checkkinboard-realtimehealth - If the WS is open but no messages arrive when you edit on the other device, the table may not be in the realtime publication. See Database-Schema → Realtime publication.
Cosmetic. Supabase Storage's healthcheck is over-aggressive upstream and frequently false-positives. As long as recipe-image uploads work, you can ignore it. Issue tracked at https://github.com/supabase/storage/issues.
The redirect URI in Google Cloud Console doesn't match what Kinboard sends. Add:
-
http://localhost:3001/api/google/callback(dev) -
https://<your-domain>/api/google/callback(prod)
…to Authorized redirect URIs in your OAuth client.
- Token has expired (long-lived tokens last 10 years, but if the user was deleted in HA, the token's gone too)
- Kinboard runs HTTPS but HA URL is HTTP (mixed content blocked). Either upgrade HA to HTTPS or run Kinboard on HTTP.
-
cors_allowed_originsin HA config restricts the origin list. Add your Kinboard origin.
Bring! rate-limits credential checks. Wait 5 minutes between attempts. If you've correctly typed your email + password three times and it's still rejected, sign out + back in via the Bring! mobile app to confirm the credentials work; then retry.
WebRTC ICE failure. Check:
-
WEBRTC_LAN_IPin.envmatches your server's LAN IP - UDP 8555 is forwarded through your firewall
-
go2rtc.yamlsubstitutions (CAMERA_USER,CAMERA_PASS, etc.) are filled in
The stream URL has credentials but the browser doesn't accept them. Use the Authentication section in /settings/cameras to set username + password + Digest type. Kinboard's /api/cameras proxy will handle the auth server-side.
- Check the device is subscribed (Settings → Notifications, push toggle is on)
- Check VAPID keys are set in
.env(VAPID_PUBLIC_KEY,VAPID_PRIVATE_KEY) - Some browsers block notifications when the page isn't HTTPS. Run Kinboard over HTTPS for production.
iOS only delivers web push to installed PWAs. Tap Share → Add to Home Screen, then open from the home-screen icon.
Open Task Scheduler → KioskLauncher task → check Last run result. Common results:
-
0x41306— task failed because user wasn't logged on. Confirm AutoLogon is set. -
0x1— script returned nonzero. CheckC:\kiosk.logfor what failed.
EnableDesktopModeAutoInvoke registry key not set, or TabTip.exe isn't running. Re-run kiosk-launcher.bat manually:
C:\kiosk-launcher.batVerify TabTip is in Task Manager. If not, it failed to start — likely Windows blocked it. Run gpedit.msc → Computer Configuration → Administrative Templates → Windows Components → Tablet PC → make sure "Touch Keyboard" isn't disabled.
- Serial cable physically loose
- USB-UART driver missing (CH340 needs a manual driver download from wch.cn; FTDI is built-in)
- Wrong baud rate (LD2410 default is 256000, not 115200)
Check C:\presence-sensor.log — the watchdog message tells you exactly when it last got data.
The Docker build step does next build which runs tsc --noEmit. If you have type errors locally that lint didn't catch (the project uses lint-only as default policy), they surface here.
To preempt this: run npx tsc --noEmit from webapp/ before deploying.
Run from the webapp/docker/ directory of the live deploy, not from your dev machine. The script operates on the .env it sits next to.
If deploy.sh recreated the webapp container with only the base compose file (no Traefik override), Traefik dropped the route. Run migrate-prod.sh on the host to render the Traefik override, then restart with all overlays:
cd webapp/docker
./migrate-prod.sh
docker compose -f docker-compose.yml -f docker-compose.traefik.yml -f docker-compose.override.yml up -d --no-deps webapp- First load fetches a lot of state (events for the next month, todos, shopping items, weather, HA entity states, etc.). Subsequent loads are cached. If chronically slow, profile via the browser dev tools.
- The Mele 4C runs Kinboard fine. Cheaper boxes (Raspberry Pi 4 with browser kiosk) may struggle — the bottleneck is Chromium's React runtime, not the network.
Set Edge to start with limited tab discarding via Group Policy:
HKLM\SOFTWARE\Policies\Microsoft\Edge
AutomaticFullscreenAllowedForUrls = ["[*.]your-kinboard-domain"] (REG_MULTI_SZ)
Or simpler: schedule a daily Edge restart at 03:00 via a separate scheduled task that kills Edge and re-launches it.
Almost always a cookie issue, not actual data loss. Verify the family-store cookie still points at the right family ID:
// browser console
document.cookieIf the cookie is missing, you'll be on /join and creating a new family looks like data loss. The original family's data is still in the DB; rejoin with the original code.
The Postgres container runs as user postgres. pg_dump needs to run inside the container or with credentials:
docker exec -t kinboard-db pg_dump -U postgres -F c postgres > /backups/kinboard.pgdump# Capture the state for an issue report
cd webapp/docker
./start.sh status > /tmp/kinboard-status.txt
docker logs kinboard-webapp --tail 200 > /tmp/kinboard-webapp.log
docker logs kinboard-realtime --tail 100 > /tmp/kinboard-realtime.log
# File an issue with all three attachedKinboard 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