Open-source, self-hosted Kahoot-style live quiz — projector-ready, multi-arch (amd64/arm64).
3.8K
Open-source, self-hosted live quiz platform.
Real-time multiplayer · projector-ready · your data stays on your servers.
Website · Live demo · Self-hosting guide · Releases
QuizDock is a Kahoot-style live quiz you run yourself. A host presents a quiz, players join from any device with a PIN or QR code (no account), and answers — weighted by speed and correctness — feed a live leaderboard projected on the big screen. Everything runs on your infrastructure as a single Docker image; the questions, the answers and the results never leave your servers.
https://quizdock-standalone.onrender.com — a public instance in demo mode: enter a name, take the host seat and present one of the sample quizzes; open the join link on your phone to play.
amd64 / arm64), no SaaS, no
tracking, no ads; interface in English, French, Spanish, Simplified and Traditional
Chinese; rebrand name, logo and CSS without a rebuild.Same image, one switch: AUTH_MODE decides who can host.
Local mode — AUTH_MODE=none (default) | OIDC mode — AUTH_MODE=oidc | |
|---|---|---|
| Made for | a classroom, a meeting room, a trusted network | an organisation with an identity provider |
| Setup | none — start the container and play | point the app at your OpenID Connect provider (Keycloak, Authentik, Entra ID, Google…) |
| Who hosts | one host seat: a host signs in with just a name and takes it; released when done | as many hosts as you like, each signing in through your IdP with their own quizzes |
| Host rights | whoever holds the seat | the host role, granted from the IdP |
| Sample quizzes | included | — |
Players never sign in, in either mode. Details: authentication.
QuizDock ships as one image — fchaussin/quizdock
on Docker Hub. NestJS serves the API, the WebSocket and the SPA; PostgreSQL and Redis run
alongside, and a one-shot migrate service applies migrations.
App and database in a single image, nothing else to install:
docker run -p 18080:3000 -v quizdock:/data fchaussin/quizdock:standalone
# open http://localhost:18080
Data persists in the quizdock volume. A deployment shortcut, not a different product:
same AUTH_MODE switch as below. For production, prefer a dedicated database.
quizdock script — recommendedGuided setup, then start, backup, upgrade and admin commands; Docker only:
curl -fsSLO https://raw.githubusercontent.com/quizdock/quiz-dock/main/quizdock && chmod +x quizdock
./quizdock init # name, language, port, auth mode → .env + docker-compose.prod.yml
./quizdock up # open http://localhost:18080
./quizdock doctor # config & connectivity check; later: backup, upgrade <tag>, seat:release…
Every command: docs/self-hosting/cli.md.
curl -O https://raw.githubusercontent.com/quizdock/quiz-dock/main/docker-compose.prod.yml
docker compose -f docker-compose.prod.yml up -d
# open http://localhost:18080
Pin a version with QUIZDOCK_TAG=0.6.0 docker compose -f docker-compose.prod.yml up -d.
From source: git clone https://github.com/quizdock/quiz-dock.git, then the same command
with --build.
Migrations run automatically on every start: pull the new tag and up again.
Back up PostgreSQL first, and don't roll back an image once its migrations ran —
restore the backup instead. With the script: ./quizdock upgrade 0.6.0 (backup → pull →
restart → doctor). Full procedure:
self-hosting → Upgrading.
Copy .env.example to .env and adjust. The settings you are most likely to touch:
| Variable | Default | Purpose |
|---|---|---|
APP_NAME | QuizDock | App name shown in the UI (white-label) |
APP_LANG | en | Instance language: en · fr · es · zh · zh-TW |
APP_LOGO_URL | — | Logo served from elsewhere; empty = look in the mounted branding/ folder |
AUTH_MODE | none | none (local mode) or oidc (any OpenID Connect provider) |
HTTP_PORT | 18080 | Host port for the app |
APP_PUBLIC_URL | — | Public address of the instance, offered first as the invitation address (QR code, join link) |
DEMO_MODE | false | Guards for an instance open to strangers: 5-minute host seat, no uploads, hourly wipe |
Rebrand without rebuilding: set APP_NAME / APP_LANG and drop a logo.<svg|avif|webp|png|jpg|jpeg|gif>
override.css into the mounted branding/ folder (or point APP_LOGO_URL at a logo
hosted elsewhere).📖 Self-hosting guide — every variable, white-labeling and OIDC setup:
docs/self-hosting/.
![]() Quiz builder — 7 question types, slides, backgrounds, scoring rules | ![]() Host console — lobby: PIN, QR code, invitation address, players |
![]() Join — PIN or QR code, nickname & avatar, no account | ![]() Projection — live question on the big screen |
![]() Player — colour tiles to tap, then own result | ![]() Reveal — distribution, explanation, live leaderboard |
More — my quizzes, content slides, the console during a question and at the reveal, the podium, the player's ordering and feedback screens: full gallery.
quiz.json + media/, zipped): back it up, move it between instances, share it — from the app or the operator CLI.no-new-privileges.Backend NestJS + Socket.IO · Prisma 7 / PostgreSQL · Redis (live state) · Frontend React + Vite + shadcn/ui + TanStack · i18next · Packaging single distroless image · Docker Compose. Front/back are kept in sync via an auto-generated OpenAPI client (Orval) and a shared TypeScript WebSocket contract.
Dev runs backend (NestJS, hot-reload) and frontend (Vite) as separate services:
pnpm install
docker compose up -d
# Front: http://localhost:15173 · API: http://localhost:13000 · API docs: http://localhost:13000/api/docs
Design references live in specifications/;
ongoing notes and decisions in docs/
(see the ADRs).
Dependencies and images are scanned on every push, every PR and weekly
(Security workflow):
pnpm audit gates app CVEs, Trivy scans the filesystem and the published image (results in
the Security tab). Point-in-time audits live in
docs/security/; report a
vulnerability via SECURITY.md.
MIT — free to use, modify and redistribute, including for internal self-hosting, provided the copyright notice is kept.
Content type
Image
Digest
sha256:e9b92d581…
Size
150.3 MB
Last updated
1 day ago
docker pull fchaussin/quizdock