SuS Festival App
When 10 000 phones hit the same mountain cell tower, mobile internet collapses and cloud-only festival apps go blank. Built for Schwing & Stampf, this iOS, Android, and NestJS platform is offline-first by design, encrypted at rest, and hosted in Switzerland.
Why most festival apps fail exactly when you need them
A mountain festival concentrates thousands of phones into a few hectares of ground. The radio spectrum, the cell-tower backhaul and the Wi-Fi uplink all share the same physical bottleneck — and they all degrade together. Festival software has to be designed for that reality from the first commit.
Cell towers collapse at 10 000 phones
One macro tower handles ~1 000 concurrent data sessions. A mid-sized mountain festival routinely puts 10× that under the same antenna. Throughput drops to dial-up, packets get dropped, and cloud-dependent festival apps show a spinner all weekend.
Wi-Fi backhaul is no rescue either
Even a managed festival Wi-Fi shares the same backhaul uplink. Once line-up updates ping the API at the same second, the bottleneck moves from the air to the cable. Same blank screen.
Most festival apps assume "the cloud works"
They render every screen from a live API call. When the network is degraded, the map is blank, the schedule is blank, the help button is blank. Exactly when attendees and helpers need the app most.
Built for everyone on the festival ground
One app, five roles. Organizers run the event, the organizing committee edits content live, helpers coordinate shifts and alarms, service providers run their own stall pages, and attendees navigate the ground — all without needing a signal at the top of the mountain.
What’s inside
Offline-first by design
Map, timetable, FAQ, blog and POIs ship inside the app and stay readable with zero bars. ETag-based sync only re-downloads what changed, so a 2G burst at sunrise is enough to catch up.
Emergency + support, even degraded
Owner-broadcast panic alerts with delivery audit, one-on-one support threads to helpers, push notifications and a nearby chat room. The emergency tab works without a connection: numbers and SOPs ship with the app.
Encrypted at rest, GDPR-clean
GPS positions, helper phone numbers, refresh tokens and other sensitive rows use AES-256-GCM envelope encryption with a rotatable key. A leaked database dump reveals nothing usable.
Swiss-hosted under FADP / revDSG
Runs in a Swiss datacenter on a self-managed Ubuntu VPS under Swiss data-protection law (FADP / revDSG). No attendee or helper data leaves Switzerland.
Five-role permissions, row-level
Owner, organizing committee, service provider, helper and attendee. Every endpoint enforces the role + ownership rule in the NestJS API, not just the UI.
Owner-editable everything
POIs, blog posts, quick actions, FAQ, landing buttons, UI strings — the organizing team edits them live in-app without needing a developer in the loop.
Service provider stalls
Food, merch and partner vendors run their own page: offerings with sold-out toggles, opening hours, operator bio, gallery and an opt-in map pin.
Reviews + moderation
1–5 star vendor reviews with upvotes, an in-app wordlist NSFW classifier, and a report-into-moderation pipeline owners and moderators run themselves.
Multi-language out of the box
UI strings table plus per-entity translations column. Switch language in-app; content falls back gracefully when a translation is missing.
Lean self-hosted footprint
Single Docker Compose stack with Caddy auto-TLS, NestJS, and PostgreSQL 16. Easily serves ~10 000 festival attendees on a modest VPS or Raspberry Pi 5.
Owner + helper coordination
Hierarchical helper group tree, shift appointments with local 15-minute alarms, shared group todos, and a moderator dashboard — replacing fragmented WhatsApp groups.
Platform modules
Twenty-six backend modules in NestJS, grouped by domain.
Navigation & wayfinding
- •Bundled SVG festival map + affine GPS overlay
- •POIs (stages, toilets, water, first aid)
- •Time-limited GPS sharing between friends
- •Stage definitions + per-stage schedules
Programme
- •Timetable with ETag caching
- •Acts / bands / performers with bios
- •Personal favourites + alarm reminders
- •Per-stage filters
Content & comms
- •Owner blog with WebP images + short MP4 videos
- •FAQ with rich-text answers
- •How-to onboarding steps
- •Home-screen quick actions + landing buttons
- •Push notifications (Expo / FCM / APNs)
Service providers
- •Vendor directory with offerings + tags
- •Operator bio, hours, gallery, contact
- •Opt-in map pin
- •Vendor self-edit with role gating
Community
- •Threaded comments with up-votes
- •Public + nearby chat rooms (Socket.io)
- •1–5 star reviews on vendors
- •User profiles, avatars, connections
Trust & safety
- •Emergency broadcast with delivery audit
- •Support tickets between users and helpers
- •In-process NSFW + profanity classifier
- •Report queue, censor audit log, wordlist admin
Access & identity
- •Invite-code registration
- •JWT access + refresh-token rotation
- •Five user roles, row-level auth
- •Mintable ticket codes per event
Volunteer ops
- •Helper group tree (Gastronomy, Mainbar, …)
- •Shift appointments + 15-min local alarms
- •Shared todos + encrypted responsible contacts
- •In-app support inbox & moderator dashboard
Architecture & production highlights
How the system is architected to keep working smoothly from off-season planning to peak festival weekend.
Built for Schwing & Stampf
Deployed in production at app.schwingundstampf.ch to serve attendees, helpers, vendors, and the organizing committee of the Schwing & Stampf mountain festival.
Single TypeScript monorepo
Expo + React Native (iOS & Android) and NestJS backend share strict Zod validation schemas across workspaces, guaranteeing contract safety between client and server.
SQLite & bytea media pipeline
Server-side sharp and ffmpeg pipelines transcode uploaded images and short videos into compact WebP/MP4 blobs stored in PostgreSQL and cached locally in SQLite on mobile.
Vendor & committee self-service
Service providers edit their own offerings, photos and opening hours in the app, while the organizing committee updates POIs, blog posts, and FAQ entries live on site.
Direct emergency broadcast line
Owner-broadcast alerts with delivery auditing reach every installed device, backed up by offline emergency contacts and standard operating procedures bundled in the binary.
Multi-season lifecycle
Carries off-season community blog updates for hundreds of daily users and scales smoothly to thousands of concurrent attendees over the festival weekend.
How it runs in practice
1
Pre-festival setup & seeding
The organizing committee configures stages, timetable, map anchor points, FAQ, and onboarding steps directly inside the app.
2
Invite-gated onboarding
Attendees, helpers, and service providers register with event invite codes and receive role-scoped access and offline data sync before heading up the mountain.
3
Offline festival operation
Throughout the weekend, the bundled map, personal schedule alarms, helper shift dashboard, and emergency tabs run reliably even when cell towers saturate.
A look inside
Two built-in themes — warm Violett and neutral Classic. Attendees can switch in Settings, and organizers can pin a default per event.
















FAQ
Common technical and operational questions about the platform.
Where is the SuS Festival App used?
It runs in production at app.schwingundstampf.ch for the Schwing & Stampf festival in Switzerland, serving attendees, volunteers (helpers), food & merch vendors, and the organizing committee.
What happens when the cell signal collapses during the festival?
The mobile app keeps working. The festival map, line-up, FAQ, blog, emergency numbers, helper shifts, and personal favourites all live on-device in SQLite. ETag-based sync resumes the moment any connection comes back — even a few seconds of 2G is enough.
How does the festival map GPS overlay work without internet?
The vector festival map is bundled with the app binary. Using ≥3 calibrated geographic anchor points, an affine transformation maps the phone’s foreground GPS coordinates directly onto the SVG pixel space completely offline.
How is sensitive data protected?
GPS positions, helper phone numbers, refresh tokens and other sensitive rows are AES-256-GCM envelope-encrypted with a rotatable key. Passwords use bcrypt with a server-side pepper, and push tokens are scoped and rotatable.
How do vendors and helpers manage their own content and shifts?
Through the five-role permission model. Service providers manage their own stall pages and mark offerings as sold out live; the organizing committee assigns helpers into a group tree with shift appointments, shared todos, and encrypted responsible-person contacts.
See it in action
The live instance for Schwing & Stampf is hosted at app.schwingundstampf.ch. Have questions about the architecture? Reach out via any channel in the footer below.
