Go + Svelte PWA for gate check-in, volunteer scheduling, and department coordination. Offline-first with background sync.
Find a file
2026-03-03 16:21:41 -06:00
docs Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
frontend Added mobile hamburger. 2026-03-03 16:09:43 -06:00
.envrc Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
.gitignore Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
auth.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
auth_test.go Added tests, shift 'delete'. Fixed overnight shifts, sync, error handling. 2026-03-03 13:06:00 -06:00
broker.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
db.go Added tests, shift 'delete'. Fixed overnight shifts, sync, error handling. 2026-03-03 13:06:00 -06:00
db_test.go Added tests, shift 'delete'. Fixed overnight shifts, sync, error handling. 2026-03-03 13:06:00 -06:00
Dockerfile Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
email.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
flake.lock Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
flake.nix Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
go.mod Added tests, shift 'delete'. Fixed overnight shifts, sync, error handling. 2026-03-03 13:06:00 -06:00
go.sum Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
handle_attendees.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
handle_attendees_test.go Added tests, shift 'delete'. Fixed overnight shifts, sync, error handling. 2026-03-03 13:06:00 -06:00
handle_auth.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
handle_departments.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
handle_event.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
handle_import.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
handle_import_test.go Added tests, shift 'delete'. Fixed overnight shifts, sync, error handling. 2026-03-03 13:06:00 -06:00
handle_kiosk.go Added tests, shift 'delete'. Fixed overnight shifts, sync, error handling. 2026-03-03 13:06:00 -06:00
handle_kiosk_test.go Added tests, shift 'delete'. Fixed overnight shifts, sync, error handling. 2026-03-03 13:06:00 -06:00
handle_settings.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
handle_settings_test.go Added tests, shift 'delete'. Fixed overnight shifts, sync, error handling. 2026-03-03 13:06:00 -06:00
handle_shifts.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
handle_shifts_test.go Added tests, shift 'delete'. Fixed overnight shifts, sync, error handling. 2026-03-03 13:06:00 -06:00
handle_sync.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
handle_sync_test.go Added tests, shift 'delete'. Fixed overnight shifts, sync, error handling. 2026-03-03 13:06:00 -06:00
handle_tokens.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
handle_users.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
handle_volunteers.go Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
main.go Added build ID to footer. Added check for client-server mismatch. 2026-03-03 13:38:31 -06:00
Makefile Created make formulae for semver tagging 2026-03-03 16:21:41 -06:00
README.md Created Turnpike, event attendee and volunteer management 2026-03-03 13:05:50 -06:00
testutil_test.go Added tests, shift 'delete'. Fixed overnight shifts, sync, error handling. 2026-03-03 13:06:00 -06:00

Turnpike

Self-hosted event attendee 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

  • Attendee management — CSV import (CrowdWork/Zeffy auto-detected), party-size tracking, search, check-in
  • Volunteer scheduling — departments, shifts with capacity, conflict detection, drag-and-drop reordering
  • Volunteer kiosk — token-authenticated self-service shift signup, no login required
  • Gate check-in — full-screen UI with QR scanner, party check-in ("2/3 checked in"), volunteer dual check-in
  • Schedule board — department leads and coordinators manage shift assignments with conflict awareness
  • Role-based access — admin, coordinator, volunteer lead (department-scoped), gate
  • 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 — send volunteer token links directly or export CSV for bulk email platforms
  • 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: attendee import, user management, SMTP settings, all departments and shifts
coordinator All departments: volunteers, shifts, schedule board. No user management or settings
volunteer_lead Own department only: volunteers and shifts scoped to assigned department
gate Full-screen check-in UI 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, attendee import, volunteer kiosk, gate check-in, schedule board
  • Installation Guide — building, deploying, systemd, Docker, NixOS, reverse proxy, backup

License

CC BY-NC-SA 4.0