Go + Svelte PWA for gate check-in, volunteer scheduling, and department coordination. Offline-first with background sync.
| docs | ||
| frontend | ||
| .envrc | ||
| .gitignore | ||
| auth.go | ||
| auth_test.go | ||
| broker.go | ||
| db.go | ||
| db_test.go | ||
| Dockerfile | ||
| email.go | ||
| flake.lock | ||
| flake.nix | ||
| go.mod | ||
| go.sum | ||
| handle_attendees_test.go | ||
| handle_auth.go | ||
| handle_departments.go | ||
| handle_event.go | ||
| handle_import.go | ||
| handle_import_test.go | ||
| handle_kiosk.go | ||
| handle_kiosk_test.go | ||
| handle_participants.go | ||
| handle_settings.go | ||
| handle_settings_test.go | ||
| handle_shifts.go | ||
| handle_shifts_test.go | ||
| handle_signup.go | ||
| handle_signup_test.go | ||
| handle_sso.go | ||
| handle_sync.go | ||
| handle_sync_test.go | ||
| handle_tokens.go | ||
| handle_users.go | ||
| handle_volunteers.go | ||
| handle_volunteers_test.go | ||
| main.go | ||
| Makefile | ||
| README.md | ||
| testutil_test.go | ||
Turnpike
Self-hosted event ticketing and volunteer management. One instance, one event.
Turnpike handles gate check-in, volunteer scheduling, and department coordination for events ranging from a single evening to a multi-day festival. It works offline — gate volunteers can check people in without a network connection and sync when connectivity returns.
Features
- Participant & ticket management — CSV import (CrowdWork/Zeffy auto-detected), search, check-in
- Volunteer scheduling — departments, shifts with capacity, conflict detection, reordering
- Public volunteer signup — self-registration form with email confirmation, auto-participant linking
- Volunteer kiosk — public volunteer flow: signup, email confirmation, code-authenticated shift self-scheduling
- Gate kiosk — full-screen check-in UI with QR scanner for gatekeepers
- Schedule — create shifts, assign volunteers, manage assignments with conflict awareness
- Role-based access — admin, ticketing, staffing, colead (department-scoped), gatekeeper
- Offline-first PWA — installs on phones/tablets, full offline check-in with background sync
- Real-time — check-ins and changes broadcast live via SSE
- SMTP email — volunteer confirmation emails, kiosk link distribution when shift signups open
- Single binary — Go backend embeds the frontend; no runtime dependencies
Tech Stack
- Backend: Go, SQLite (WAL mode), JWT auth
- Frontend: Svelte 5, Dexie (IndexedDB), Vite
- Deployment: single static binary — no CGO, no external database
Quick Start
# Build (frontend + Go binary)
make build
# Run (creates admin user on first startup)
TURNPIKE_ADMIN_USER=admin TURNPIKE_ADMIN_PASSWORD=changeme ./turnpike
Open http://localhost:8180.
See docs/INSTALLATION.md for systemd, Docker, NixOS, and reverse proxy setup.
Configuration
| Flag | Env var | Default | Description |
|---|---|---|---|
--addr |
— | 0.0.0.0:8180 |
Listen address |
--db |
— | turnpike.db |
SQLite database path |
--secret |
TURNPIKE_SECRET |
auto-generated | JWT signing secret (persist across restarts) |
--token-expiry |
— | 24 |
JWT lifetime in hours |
--base-url |
— | — | Public URL for volunteer token links |
--smtp-host |
— | — | SMTP server hostname |
--smtp-port |
— | 587 |
SMTP port (587 = STARTTLS, 465 = implicit TLS) |
--smtp-user |
— | — | SMTP username |
--smtp-password |
— | — | SMTP password |
--smtp-from |
— | — | Sender email address |
--smtp-from-name |
— | — | Sender display name |
| — | TURNPIKE_ADMIN_USER |
— | Bootstrap admin username (first run only) |
| — | TURNPIKE_ADMIN_PASSWORD |
— | Bootstrap admin password (first run only) |
User Roles
| Role | Access |
|---|---|
admin |
Full access: participant import, user management, SMTP settings, all departments and shifts |
ticketing |
Participants, tickets, import. No user management |
staffing |
All departments: volunteers, shifts, schedule. No user management or settings |
colead |
Own department only: volunteers and shifts scoped to assigned department(s) |
gatekeeper |
Full-screen Gate Kiosk with QR scanner. No access to other pages |
See docs/USAGE.md for detailed workflow documentation.
Development
Prerequisites: Nix + direnv, or Go 1.24+ and Node.js 18+ installed manually.
git clone <repo-url>
cd turnpike
direnv allow # activates Go + Node.js via flake.nix
Two-terminal dev setup:
# Terminal 1 — Go API server
go run . --db dev.db
# Terminal 2 — Vite dev server (proxies /api to :8180)
cd frontend && npm install && npm run dev
The Vite dev server runs on :5173 and proxies /api requests to the Go server on :8180.
Documentation
- Usage Guide — event setup, participant import, volunteer signup, volunteer kiosk, gate check-in, schedule
- Installation Guide — building, deploying, systemd, Docker, NixOS, reverse proxy, backup
License
CC BY-NC-SA 4.0