Full-stack operations hub for planning and running innhopp events. The frontend is a React + TypeScript (Vite) single-page app; the backend is a Go service with PostgreSQL for persistence, RBAC enforcement, and OIDC login.
Create a single source of truth for operational data that keeps the team synchronized across planning, execution, and post-event follow-up while maintaining high standards for safety and customer satisfaction.
- Operations planning for seasons, events, innhopps, manifests, and landing zones.
- Participant roster and event assignments, including crew roles per manifest.
- Logistics tracking for transports, vehicles, accommodations, meals, and ad-hoc logistics items.
- Registration backbone for participant-event lifecycle tracking, payment obligations, and activity history.
- Event-level commercial registration settings including public signup toggles, deadlines, pricing, currency, and confirmation thresholds.
- Public event registration pages by slug that create participant-linked registrations and default payment placeholders.
- Staff registration operations pages for event-level registration lists, status changes, payment updates, and internal notes.
- Safety and compliance fields on events/innhopps (NOTAM, risk assessment, safety precautions).
- RBAC-backed login sessions (OIDC) with seeded roles for core operational duties.
- Automated notifications and campaign email sending.
- Payment provider integrations, waivers, certifications, and health declarations.
- Check-in flows or public driver route pages.
- Analytics dashboards beyond raw data access.
| Role | Primary responsibilities | Data access highlights |
|---|---|---|
| Admin | System configuration, user provisioning, billing, oversight | Full access to all modules and audit logs |
| Staff | Day-to-day ops, customer support, documentation | Manifests, participant records, logistics, support tickets |
| Jump Master | Go/no-go, safety decisions | Mission briefs, weather intel, gear status, incident reports |
| Jump Leader | Leads assigned groups and debriefs | Assigned manifests, readiness, gear allocations, notes |
| Ground Crew | Landing zone readiness, transport, recovery | LZ checklists, transport schedules, real-time updates |
| Driver | Executes transport routes | Transport assignments and schedules |
| Packer | Parachute packing and maintenance logs | Gear assets, packing queues, maintenance notes |
| Participant | Participates in events | Profile, event assignments, schedules |
RBAC ensures each user only sees the modules and actions needed for their duties; sensitive operations are logged for compliance.
- Event planning: Create seasons/events, define innhopps with landing and safety details, and publish manifests.
- Participant coordination: Maintain the roster, attach participants to events, assign crew roles per manifest, and track registrations with status, notes, and payment records.
- Logistics tracking: Capture transports, vehicles, accommodations, meals, and other logistics items per event.
- Build seasons and events, including detailed innhopp plans with landing areas, NOTAM notes, risk mitigation, and hospital/boat coverage metadata.
- Register airfields, attach them to events, and manage manifests with capacity, staff slots, and participant assignments.
- Maintain a participant roster (roles, experience, contacts), add people to events/manifests, and track crew roles such as Jump Master/Leader, Ground Crew, Driver, and Packer.
- Create event registrations for participants, record deposit/balance payment entries, track registration status, and append internal activity notes.
- Configure event registration settings such as public slug, opening windows, balance deadlines, pricing, and minimum registration thresholds.
- Share public
/register/:sluglinks, accept self-serve signups, auto-create or match participant profiles by email, and generate deposit/balance payment placeholders from the event settings. - Open
/events/:eventId/registrationsto filter registrations by status and payment state, then drill into/registrations/:registrationIdto update deadlines, payment records, status, and activity notes. - Coordinate transports, vehicles, accommodations, meals, and other logistics items per operation.
- Authenticate via OIDC (authorization code flow), persist sessions in secure cookies, and enforce role-based permissions seeded on startup (Admin, Staff, Jump Master, Jump Leader, Ground Crew, Driver, Packer, Participant). Set
DEV_ALLOW_ALL=trueto bypass auth locally. - Use the frontend pages for login, events, manifests, participants, logistics, seasons, innhopp details, and airfield details (see
frontend/src/pages/andfrontend/src/components/Layout.tsxfor the routes).
backend/– Go/Chi REST API with OIDC login, session management, RBAC, and PostgreSQL schema bootstrapping (seasons, events, innhopps, manifests, airfields, participants, crew assignments, logistics). Seebackend/README.mdfor full endpoint docs.frontend/– Vite React SPA that consumes the backend APIs; includes a backend-driven Google OIDC login flow and a navigation shell for events/participants/logistics.index.html– Static Google Identity demo for GitHub Pages;events.htmlandevents.cssare legacy static prototypes.
Prereqs: Go 1.22+, Node 18+ (or current LTS), npm, and Docker (for local PostgreSQL).
- Start Postgres (default DB and password match the backend defaults):
docker run --name innhopp-postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=innhopp -p 5432:5432 -d postgres:15- Run the backend:
cd backend
# optional: export DATABASE_URL="postgres://postgres:postgres@localhost:5432/innhopp?sslmode=disable"
# for local dev without OIDC, export DEV_ALLOW_ALL=true
# for localhost Google login, set:
# export OIDC_ISSUER="https://accounts.google.com"
# export OIDC_CLIENT_ID="YOUR_CLIENT_ID.apps.googleusercontent.com"
# export OIDC_CLIENT_SECRET="YOUR_CLIENT_SECRET"
# export OIDC_REDIRECT_URL="http://localhost:8080/api/auth/callback"
# export FRONTEND_URL="http://localhost:5173"
# set SESSION_SECRET to a strong value; SESSION_COOKIE_SECURE=true when using HTTPS
go mod tidy
go run ./...
# health check: http://localhost:8080/api/health- Run the frontend:
cd frontend
# optional: echo "VITE_API_BASE_URL=http://localhost:8080/api" > .env
npm install
npm run dev
# app: http://localhost:5173 (Vite proxies /api to :8080)Backend environment variables:
| Variable | Description | Default |
|---|---|---|
DATABASE_URL |
PostgreSQL connection string | postgres://postgres:postgres@localhost:5432/innhopp?sslmode=disable |
PORT |
HTTP listen port | 8080 |
SESSION_SECRET |
HMAC secret for session cookies | dev-insecure-session-secret (development only) |
SESSION_COOKIE_SECURE |
Set to true to mark cookies as secure |
false |
DEV_ALLOW_ALL |
If true, bypasses auth/RBAC (local use only) |
false |
OIDC_ISSUER |
OIDC issuer URL | – |
OIDC_CLIENT_ID |
OIDC client ID | – |
OIDC_CLIENT_SECRET |
OIDC client secret (if required) | – |
OIDC_REDIRECT_URL |
Redirect URL registered with the OIDC provider | – |
FRONTEND_URL |
Frontend base URL used after successful OIDC callback | – |
Frontend environment variables:
| Variable | Description | Default |
|---|---|---|
VITE_API_BASE_URL |
API base URL; leave empty to use /api (proxied in dev) |
/api |
VITE_GOOGLE_MAPS_API_KEY |
Google Maps API key for route duration features | placeholder value |
- Backend endpoints for seasons, events, innhopps, manifests, airfields, participants, registrations, crew assignments, logistics transports, and auth are documented in
backend/README.md. - Frontend routes include
/login,/register/:slug,/events,/events/:eventId,/events/:eventId/details,/events/:eventId/registrations,/registrations/:registrationId,/events/:eventId/innhopps/:innhoppId,/manifests,/manifests/:manifestId,/participants,/participants/:participantId,/logistics,/airfields/:airfieldId, plus creation flows for seasons, events, manifests, and participants.