Self-hosting
Schirmziit is one program that serves its own dashboard, plus a Postgres database. No Redis, no message broker, no cloud service.
What you need
- A machine with Docker — a Raspberry Pi 4 is enough.
- An address the child’s phone can reach, with TLS in front (Caddy, Traefik or nginx).
- Roughly 200 MB of storage for the first year of data.
Installation
curl -O https://raw.githubusercontent.com/JorisM/schirmziit/main/deploy/docker-compose.yml
curl -o .env https://raw.githubusercontent.com/JorisM/schirmziit/main/deploy/.env.example
# edit .env: POSTGRES_PASSWORD and PUBLIC_URL
docker compose up -d Reverse proxy and TLS
Schirmziit listens on 127.0.0.1:8080 only. Put a reverse proxy in front to terminate TLS, and set PUBLIC_URL to exactly the address you type in the browser. That address is baked into the pairing QR code: get it wrong and the phone pairs once and then never reports again.
The first account
By default exactly one account may register, and then registration closes. Open the dashboard, create your account, then set ALLOW_REGISTRATION to “off”.
Connecting a phone
Add a child in the dashboard and generate a code. Install the Android app on the child’s phone, allow usage access, and scan the code. From then on the phone reports about every 30 minutes.
Backups
Everything that matters lives in Postgres. A nightly pg_dump of the volume is enough; the dashboard itself holds no state.
Updates
docker compose pull, then docker compose up -d. Database migrations run on startup. Downgrades are not supported, so take a backup first.
When something does not work
- The phone pairs but never reports.
- PUBLIC_URL does not point at the address the phone can reach. Fix it, restart, and generate a new code.
- The dashboard says “not reporting”.
- Check on the phone that usage access is still granted, and allow background updates if the app asks.
- Postgres will not start after an update.
- From Postgres 18 the volume must be mounted at /var/lib/postgresql, not /var/lib/postgresql/data. Our compose file already does this.
- An app shows up as “com.something.app”.
- The phone could not resolve its name. After the next Android app update and one more report, the real name appears.