Speedsolving timer and stats tracker. WCA-compliant scrambles, analytics, csTimer import and more
704
A self-hosted stats viewer for csTimer exports. Import your csTimer JSON, browse your solve history and see analytics.
Not affiliated with csTimer.
Single-container, no compose required. Pick a password and a long random secret:
docker run -d --name cubestats \
-p 3000:3000 \
-v cubestats-data:/app/data \
-e NUXT_AUTH_PASS='<your-password>' \
-e NUXT_AUTH_SECRET='<a-long-random-string>' \
--restart unless-stopped \
mattyfaz/cubestats:latest
Open http://localhost:3000, log in, then drop a csTimer export onto the Import page.
services:
cubestats:
image: mattyfaz/cubestats:latest
ports:
- 3000:3000
environment:
- NUXT_AUTH_PASS=<your-password> # required — server refuses to boot with "changeme", "admin", or "password"
- NUXT_AUTH_SECRET=<a-long-random-string> # required — must not start with "change-this", "dev-secret", or "changeme"
volumes:
- cubestats-data:/app/data
restart: unless-stopped
volumes:
cubestats-data:
The image is published to Docker Hub and GHCR for linux/amd64 and linux/arm64. Your data lives in the cubestats-data volume — back up cubestats.db from inside it to keep your solves safe.
Requires Node 22+. Database is a local SQLite file — no external services needed.
npm install
cp .env.example .env
# Edit .env — set NUXT_AUTH_PASS / NUXT_AUTH_SECRET to anything
npm run db:migrate # creates data/cubestats.db
npm run dev
| Var | Required | Notes |
|---|---|---|
NUXT_AUTH_PASS | yes | Login password — refuses to start in production with changeme, admin, or password |
NUXT_AUTH_SECRET | yes | HMAC secret for the session cookie — refuses to start in production with placeholder values |
NUXT_DATABASE_PATH | no | SQLite file path. Defaults to data/cubestats.db (locally) or /app/data/cubestats.db (in the docker image) |
APP_PORT | no | Defaults to 3000 |
In csTimer, open the export menu and choose Export. Save the resulting JSON file and drag it onto the Import page in cubestats.
npm run dev # Dev server
npm run build # Production build
npm run preview # Preview production build
npm run test # Vitest watch
npm run test:run # Vitest single run
npm run db:generate # Generate Drizzle migration from schema
npm run db:migrate # Apply migrations
npm run db:studio # Drizzle Studio
See CONTRIBUTING.md. Security issues: see SECURITY.md.
Content type
Image
Digest
sha256:c9ff881c7…
Size
148.7 MB
Last updated
5 months ago
docker pull mattyfaz/cubestats