Festival Platform · Offline-First · Swiss-Hosted

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.
The engineering challenge

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.

Organizers
Organizing committee
Helpers
Service providers
Attendees

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.

Violett theme
Home screen of the SuS Festival App, Violett theme
Home
Blog screen of the SuS Festival App, Violett theme
Blog
Blog post screen of the SuS Festival App, Violett theme
Blog post
FAQ screen of the SuS Festival App, Violett theme
FAQ
Help & emergency screen of the SuS Festival App, Violett theme
Help & emergency
Service providers screen of the SuS Festival App, Violett theme
Service providers
Act detail screen of the SuS Festival App, Violett theme
Act detail
Settings screen of the SuS Festival App, Violett theme
Settings
Classic theme
Home screen of the SuS Festival App, Classic theme
Home
Blog screen of the SuS Festival App, Classic theme
Blog
Blog post screen of the SuS Festival App, Classic theme
Blog post
FAQ screen of the SuS Festival App, Classic theme
FAQ
Help & emergency screen of the SuS Festival App, Classic theme
Help & emergency
Service providers screen of the SuS Festival App, Classic theme
Service providers
Act detail screen of the SuS Festival App, Classic theme
Act detail
Settings screen of the SuS Festival App, Classic theme
Settings
Built with
Offline-first
Expo / React Native
NestJS
PostgreSQL 16
TypeORM
Socket.io
Zod
SQLite offline cache
AES-256-GCM encryption
Caddy + Docker Compose
iOS + Android

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.