Go + Svelte PWA for gate check-in, volunteer scheduling, and department coordination. Offline-first with background sync.
Find a file
2026-03-10 15:14:36 -05:00
docs Set co-leads to confirmed automatically, and updated test and documents. 2026-03-05 17:09:30 -06:00
frontend Rescoped colead role and revised session handling. 2026-03-10 15:14:36 -05:00
.envrc Created Turnpike, event attendee and volunteer management 2026-03-03 18:07:38 -06:00
.gitignore Created Turnpike, event attendee and volunteer management 2026-03-03 18:07:38 -06:00
auth.go Rescoped colead role and revised session handling. 2026-03-10 15:14:36 -05:00
auth_test.go Refactored user/volunteer/participant identity. 2026-03-10 14:14:09 -05:00
broker.go Created Turnpike, event attendee and volunteer management 2026-03-03 18:07:38 -06:00
db.go Rescoped colead role and revised session handling. 2026-03-10 15:14:36 -05:00
db_test.go Refactored user/volunteer/participant identity. 2026-03-10 14:14:09 -05:00
Dockerfile Created Turnpike, event attendee and volunteer management 2026-03-03 18:07:38 -06:00
email.go Established Participants and Tickets model. Migrated concepts. 2026-03-04 11:03:12 -06:00
flake.lock Created Turnpike, event attendee and volunteer management 2026-03-03 18:07:38 -06:00
flake.nix Created Turnpike, event attendee and volunteer management 2026-03-03 18:07:38 -06:00
go.mod Added tests, shift 'delete'. Fixed overnight shifts, sync, error handling. 2026-03-03 18:08:55 -06:00
go.sum Created Turnpike, event attendee and volunteer management 2026-03-03 18:07:38 -06:00
handle_attendees_test.go Refactored user/volunteer/participant identity. 2026-03-10 14:14:09 -05:00
handle_auth.go Refactored user/volunteer/participant identity. 2026-03-10 14:14:09 -05:00
handle_departments.go Created Turnpike, event attendee and volunteer management 2026-03-03 18:07:38 -06:00
handle_event.go Created Turnpike, event attendee and volunteer management 2026-03-03 18:07:38 -06:00
handle_import.go Established Participants and Tickets model. Migrated concepts. 2026-03-04 11:03:12 -06:00
handle_import_test.go Established Participants and Tickets model. Migrated concepts. 2026-03-04 11:03:12 -06:00
handle_kiosk.go Refactored ticket code into kiosk code. 2026-03-05 16:31:08 -06:00
handle_kiosk_test.go Moved properties from Volunteer to Participant. 2026-03-06 07:11:19 -06:00
handle_participants.go Refactored user/volunteer/participant identity. 2026-03-10 14:14:09 -05:00
handle_settings.go Rescoped colead role and revised session handling. 2026-03-10 15:14:36 -05:00
handle_settings_test.go Refactored user/volunteer/participant identity. 2026-03-10 14:14:09 -05:00
handle_shifts.go Rescoped colead role and revised session handling. 2026-03-10 15:14:36 -05:00
handle_shifts_test.go Rescoped colead role and revised session handling. 2026-03-10 15:14:36 -05:00
handle_signup.go Moved properties from Volunteer to Participant. 2026-03-06 07:11:19 -06:00
handle_signup_test.go Moved properties from Volunteer to Participant. 2026-03-06 07:11:19 -06:00
handle_sync.go Cleaned up old Attendees model. Updated tests. 2026-03-04 15:48:16 -06:00
handle_sync_test.go Refactored user/volunteer/participant identity. 2026-03-10 14:14:09 -05:00
handle_tokens.go Established Participants and Tickets model. Migrated concepts. 2026-03-04 11:03:12 -06:00
handle_users.go Refactored user/volunteer/participant identity. 2026-03-10 14:14:09 -05:00
handle_volunteers.go Rescoped colead role and revised session handling. 2026-03-10 15:14:36 -05:00
handle_volunteers_test.go Rescoped colead role and revised session handling. 2026-03-10 15:14:36 -05:00
main.go Refactored user/volunteer/participant identity. 2026-03-10 14:14:09 -05:00
Makefile Removed v prefix from git tag recipes 2026-03-10 13:01:35 -05:00
README.md Updated docs. 2026-03-05 09:51:40 -06:00
testutil_test.go Refactored user/volunteer/participant identity. 2026-03-10 14:14:09 -05:00

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