6 Second Scribbles is a real-time, multiplayer drawing-and-guessing game. One player races through a list of prompts while everyone else guesses what's being drawn, and rooms move through lobby, round, and results states over WebSockets.
A live demo is hosted at 6ss.duinlab.nl.
| The drawer's view | What the guessers see |
|---|---|
![]() |
![]() |
- Frontend — Vue 3, TypeScript, Pinia, Vite, vue-i18n
- Backend — FastAPI, SQLAlchemy, PostgreSQL, Redis
- Tooling — pnpm, uv, just, Docker Compose, Vitest, Playwright, pytest
It's a monorepo: frontend/, backend/, and contracts/ (committed OpenAPI and WebSocket schemas shared by both sides). See docs/architecture.md for how the pieces fit together and docs/adr/ for design decisions.
- Real-time multiplayer rooms over WebSockets
- Full game loop: lobby → drawing → guessing → results
- Guest and registered-user accounts
- Locale-aware prompt categories and guess matching
- Generated client/server contracts
- Unit, integration, and end-to-end tests
- Full mobile support (currently desktop-first)
- Improved handling mid-game user disconnects
Accessibility is checked three ways, all part of CI:
- Static a11y linting. Biome's accessibility rules are enabled (
linter.rules.a11y: "on"inbiome.json) and run withpnpm --dir frontend run lint. This catches markup issues like missing labels, invalid ARIA, and non-interactive elements with click handlers. - axe scans. Playwright +
@axe-core/playwrightscan Home, the Settings panel, and the/__dscomponent-library page against WCAG 2.1 A/AA rule tags, in both light and dark themes. These run frontend-only (no backend) as thea11yCI job; run them locally withjust test-a11y. - Accessibility-tree assertions. The broader Playwright e2e suite locates elements by ARIA role and accessible name (
getByRole, includinggetByRole("alert")), so those flows only pass when the underlying roles and labels are present. Run locally withjust test-e2e(this suite needs the backend stack).
These check specific WCAG A/AA rules — a passing axe run flags no violations of those rules, but it is not a full manual audit and does not certify WCAG AA conformance.
Requires Node 26+, Python 3.14+, pnpm, uv, just, and Docker.
just install # install dependencies
cp backend/.env.example backend/.env.dev
cp frontend/.env.example frontend/.env.local
just dev # Docker services + dev serversjust up runs the full containerized stack; just test, just check, and just format handle testing, linting, and formatting. See the frontend, backend, and contracts docs for more, or CONTRIBUTING.md if you'd like to contribute.
The live demo at 6ss.duinlab.nl runs the self-hosted
Docker Compose stack in compose.prod.yml, started on the
host with just up-prod. Caddy serves the built SPA and proxies /api and /ws
to the backend; PostgreSQL and Redis stay on the internal Docker network. The
only external ingress is a Cloudflare Tunnel (cloudflared, Compose tunnel
profile), so nothing is published directly to the internet. See
docs/architecture.md for the full topology.
Inspired by Six Second Scribbles by Hazel Reynolds, published by Gamely Games, and the solo web version by Oliver Culley de Lange.
Code is released under the MIT License. The original Six Second Scribbles game concept, brand, and card content remain the property of their respective owners.

