Case Study

Namib Rage

A dual-platform event and lifestyle app for Namibia's premier festival brand. Web admin, public website, and an offline-first Flutter mobile app — all powered by one Laravel backend.

namibrage.com
Namibia
Laravel + Flutter
Scroll to explore
The Client

12 years of festivals. 100+ performers. Where Namibia comes alive.

Namib Rage is a Namibian event curation and experiential design company founded in 2013. They produce multi-sensory gatherings that blend music, motorsport, food, and culture across Namibia — from intimate desert experiences to their flagship Sound of Summer beach festival at Langstrand, Walvis Bay, now in its tenth year.

They needed a platform that could do two things: give their team a powerful admin panel to manage events, performer lineups, schedules, ticket tiers, and content — and give their audience a mobile app that works at a beach festival where cellular signal is unreliable at best. Plus a public website that showcases upcoming events, blog posts, and vendor partnerships.

We built it as a Laravel backend serving both a Livewire-powered website and a Flutter mobile app through a single REST API. The mobile app loads all public content in one bootstrap call and works entirely offline until the next sync. The admin panel handles everything from performer galleries to push notifications.

Event Management

Every festival, from lineup to last track — managed in one place.

The admin panel is the nerve centre. Create an event, set its status (draft, scheduled, published, archived), upload hero images and galleries, then build out everything nested underneath: performer lineups grouped by stage, schedules grouped by day, ticket tiers with pricing and availability, FAQs, info sections, and external links. Every piece of content is managed through relation panels so the data model stays clean and the admin UI stays fast.

Events support featured flags for homepage promotion, location coordinates for map integration, and visibility controls (public vs private). The whole thing publishes instantly to both the website and the mobile app through the API — no separate content entry, no sync delays.

event-setup
# admin creates event
Event: Sound of Summer 2025
Status: published   Featured: true
Location: Langstrand, Walvis Bay
# performer lineup (3 stage groups)
Main Stage: 8 performers   headliner: Zakes Bantwini
Jetty Stage: 6 performers
Studio Stage: 5 performers
# schedule (grouped by day)
Day 1: 12 time slots across 3 stages
# tickets (3 tiers)
General: NAD 330   VIP: NAD 750   Backstage: NAD 2,800
# published
✓ Live on website + mobile API
✓ Push notification queued to all users

Performer lineups

Performers organised into stage groups — Main Stage, Jetty Stage, Studio Stage. Each performer has a profile image, gallery, genre, role, headliner flag, and time slot. The mobile app renders the full lineup with stage-by-stage navigation.

Schedules & stages

Schedules grouped by day and stage. Each slot has a performer, start/end time, and stage assignment. The mobile app shows a tabbed day view so festivalgoers can plan their set list without needing signal.

Ticket tiers

Multiple ticket categories per event — General, VIP, Backstage — each with price, currency, quantity cap, max per person, sold-out flag, and a link to the external ticketing partner. Displayed on both the website and the mobile app.

The Mobile App

Offline-first, because beach festivals have no signal.

The Flutter mobile app is built around one core assumption: when you need it most, you won't have internet. When the app opens it makes a single bootstrap API call that returns every event, blog post, push notification, and site config in one response. That data is cached locally, and the app runs entirely from the cache until the next background refresh.

Five tabs: Home (featured event + upcoming + latest blogs), Events (searchable, filterable list with full detail views), Stories (blog feed), Inbox (push notification history), and Connect (contact and vendor inquiry forms). Event detail is tabbed — Overview, Schedule, Performers, Tickets, Gallery — with everything available offline down to the performer bios and stage maps.

mobile-bootstrap
# app launch — single API call
GET /api/v1/bootstrap
# response payload
events: 3 published (with schedules, performers, tickets)
blogs: 12 posts (with hero images)
push_notifications: 8 sent
site_config: name, tagline, socials, contact
# cached locally
✓ All content available offline
✓ Background refresh in 120s
Next sync: silent, non-blocking

Push notifications

The admin drafts a push notification from the panel — optionally linked to a blog post or event. It goes through a draft, queued, sent workflow. The notification service delivers it to all registered devices, and the Inbox tab in the mobile app keeps a persistent history so users can tap back to the full content any time.

Image galleries

Events and performers each have hero images and multi-image galleries, served via CDN. The mobile app pre-caches hero images during bootstrap and lazy-loads galleries on scroll. Full-screen photo viewer with pinch-to-zoom for the detail views — essential for a brand built on visual identity.

The Website

Same data, same API, different surface.

The public website is a set of Livewire components consuming the same models and media as the API. Home page with a featured event hero, upcoming events grid, and latest blog posts. Event detail pages with the full lineup, schedule, ticket info, FAQs, and image galleries. A blog with published/draft workflow. Contact and vendor inquiry forms that validate, persist, and send email notifications.

Response caching keeps public pages fast — pages are cached for 10 minutes with smart invalidation when content changes in the admin panel. The admin team sees real-time previews; the public sees a fast, CDN-friendly site.

Blog & content

Rich blog posts with hero images and galleries. Published/draft workflow with timestamps. Auto-draft push notifications from blog posts so the team can announce new content to the mobile app with one click from the admin panel.

Contact & vendor forms

Two separate Livewire forms — one for general inquiries, one for vendors and partners. Both validate, store in the database with IP tracking, and send email notifications. The vendor form captures business details so the events team can evaluate partnerships.

Global settings

Site name, tagline, hero text, contact details, and social media links are all configurable from the admin panel — no deploys required. The mobile app pulls the same config via the bootstrap endpoint so branding stays consistent across platforms.

The API

One bootstrap call. Everything the app needs.

The REST API is designed for mobile-first consumption. A single /api/v1/bootstrap endpoint returns events, blogs, push notifications, and site config in one cached response — so the app makes one round trip and has everything it needs. Individual endpoints exist for event detail, blog detail, push history, contact submissions, and vendor inquiries, all returning structured JSON through dedicated resource transformers.

Response caching

The bootstrap endpoint is cached for 120 seconds server-side. Public web pages are cached for 10 minutes. A cache registry handles smart invalidation — when an admin publishes an event or blog post, only the affected cache keys are flushed. The mobile app doesn't care about staleness; it syncs in the background and never blocks the UI.

Admin panel

A full admin dashboard with resource management for events, blogs, users, and push notifications. Nested relation panels for performers, schedules, tickets, FAQs, and info sections. Role-based access, activity logging, and media management with CDN integration — all without writing custom CRUD.

The Stack

Laravel backend, Flutter frontend, one source of truth.

The backend runs Laravel with Livewire for the website, a full admin panel for content management, and a REST API for the mobile app. The Flutter app targets both iOS and Android with an offline-first architecture, push notifications, and map integration. Redis powers caching and queue workers, and all media is served through a CDN.

Laravel
Livewire
Flutter
PHP
Tailwind CSS
MySQL
REST API
Automated Testing
Responsive Design
Offline-first
Laravel
Livewire
Flutter
PHP
Tailwind CSS
MySQL
REST API
Automated Testing
Responsive Design
Offline-first
REST API
Push Notifications
Admin Panel
Redis
CDN
Cloud Storage
Media Library
Permissions
Activity Logging
Maps
REST API
Push Notifications
Admin Panel
Redis
CDN
Cloud Storage
Media Library
Permissions
Activity Logging
Maps

Got an event or lifestyle brand that needs a digital platform?

We build web + mobile platforms that work offline, push notifications to thousands, and give your team full control over content. Let's talk about yours.