Case Study

All Things
Swakopmund

A tourism guide for one of Namibia's most popular coastal towns. Real-time tides and weather, local business listings, activities, events, social media feeds, and push notifications — all in a Flutter mobile app powered by a Laravel API.

Personal Project
Swakopmund, Namibia
Laravel + Flutter
Scroll to explore
The Idea

One app that answers the question every tourist asks: "What's there to do?"

Swakopmund is a small coastal town in Namibia that punches way above its weight as a tourist destination. Sandboarding, skydiving, quad biking, fishing, dolphin cruises — there's a lot going on. But finding out what's happening, what's open, when the tide is right, or where to eat tonight? That information is scattered across Facebook pages, WhatsApp groups, and word of mouth.

All Things Swakopmund puts it all in one place. A Flutter mobile app backed by a Laravel API that aggregates everything a visitor (or local) needs — activities, listings, events, weather, tides, and a social feed — with push notifications to keep them in the loop.

Live Data

Tides, weather, and moon phases — updated automatically.

For a coastal town, the tide table isn't a nice-to-have — it's essential. Fishermen need to know when the tide turns. Tour operators plan around it. Families want to know when the beach is at its best. And everyone wants to know if the weather will cooperate.

The app pulls data from three separate APIs and combines them into a single, beautiful tide table. A tide data provider supplies the high/low tide times and heights. A geolocation service adds sunrise, sunset, moonrise, moonset, and moon phase data. A weather data provider supplies 7-day weather forecasts with temperature, wind, UV index, and precipitation.

All of this is synced automatically by scheduled Laravel commands, stored locally, and served to the app through the API. The app never makes live calls to third-party services — everything is cached on the server, keeping the app fast and the API costs predictable.

The tide table

The tide service combines data from the tide data API and geolocation service into a single response per day — high tides, low tides, heights, sunrise, sunset, moon phase, and illumination percentage. The API exposes two versions: a basic one and an enhanced version that integrates weather data for each day.

Timezone handling is critical — all times are calculated in Africa/Windhoek timezone so tides display correctly for Swakopmund. The sync command fetches 62 days of data ahead, so the table always has two months of future tides available.

Tide push notifications

Users can subscribe to high tide or low tide notifications via push notification topics. The system sends a reminder one hour before each tide event, and another at the exact time.

The notification command uses Laravel's cache to prevent duplicates — so even if the scheduler runs every minute, you only get notified once. It checks the next tide within 24 hours and fires off to the right notification topic.

data-sync
$ artisan tide:sync --days=62
Fetching tide extremes from tide data API...
Fetching astronomy data from geolocation service...
> 62 days of tide data synced
> Moon phases: New Moon, Waxing Crescent, ...
> API credits used: 1 of 100
$ artisan weather:sync --days=7
Fetching forecast from weather API...
> 7-day forecast stored (temp, wind, UV, rain)
$ artisan facebook:sync-posts
> 14 new posts with #wheretogoswakopmund
✓ All data sources synced
Integrations

One app, five external APIs, zero visible complexity.

Behind the simple interface, the backend orchestrates data from five different third-party services. The user just sees tides, weather, and a social feed — they have no idea five separate APIs are being polled, normalised, cached, and served.

Tides

Tide Data API

High and low tide predictions with precise timestamps and water heights. Syncs 62 days ahead so the app always has two months of data ready. One API call costs one credit out of 100 free monthly credits — efficient syncing keeps it free.

Astronomy

Geolocation Service

Astronomy data for Swakopmund — sunrise, sunset, moonrise, moonset, moon phase, and illumination percentage. Combined with tide data so every day in the table shows the full picture.

Weather

Weather API

Professional-grade 7-day weather forecasts — temperature, humidity, wind speed and direction, UV index, cloud cover, precipitation probability, and pressure. Synced daily via a scheduled command.

Social

Social Media API

Pulls posts from the All Things Swakopmund Facebook page, filtered by the #wheretogoswakopmund hashtag. Posts, media, and permalinks are cached locally and served as a social feed in the app.

Notifications

Push Notifications

Push notifications with full OAuth2 JWT authentication, topic-based subscriptions for tide alerts, device token management, and platform-specific configuration for both Android and iOS.

Maps

Google Maps

Every activity, listing, and event has latitude/longitude coordinates. The Flutter app renders interactive Google Maps so users can see exactly where things are and get directions.

The Platform

More than a listing site. It's the digital guide to Swakopmund.

Activities & attractions

Sandboarding, skydiving, dolphin cruises, desert tours — every activity in Swakopmund with descriptions, photo galleries, location maps, pricing info, and direct contact details. Filterable by category with featured activities promoted to the top.

Smart business listings

Local restaurants, shops, accommodations, and services — each with images, amenities, social links, and a schedule system that calculates real-time status. The app knows if a place is open, closing soon (within 60 minutes), or closed — even if the business has different hours on different days or seasonal schedules.

Events calendar

Festivals, markets, live music, community events — all with date ranges, venue info, ticket links, entrance fees, and age group targeting. The API only returns events with future end dates, so the app always shows what's coming up, never what's past.

Social feed

The app pulls posts from the All Things Swakopmund Facebook page, filtered by hashtag. Instead of building a content management system for social updates, we let Facebook be the CMS. Post something with #wheretogoswakopmund and it shows up in the app automatically.

Push notifications

Push notifications with a full implementation — OAuth2 JWT authentication, topic-based subscriptions, device token management, platform-specific config for Android and iOS. Users opt in to tide alerts and get notified an hour before and at the tide time. The admin can also send general announcements to all users.

The Stack

Why these tools.

Laravel

Backend

The API serves 15+ endpoints to the mobile app and powers the admin panel. Scheduled commands handle all the data syncing, the service layer wraps every third-party API, and the ORM manages 24 data models with complex relationships. It's the engine that makes everything tick.

Flutter

Mobile App

Cross-platform mobile app for iOS and Android from a single codebase. Google Maps integration, push notifications, local caching, and a clean architecture. One developer, two platforms, native performance.

Livewire Admin Panel

Admin Panel

The admin dashboard uses 20+ interactive components for managing listings, activities, events, categories, amenities, and push notifications. Complex forms with multi-image upload, multi-select categories, and schedule management — all reactive, no page reloads.

Push Notifications

Notifications

Push notifications with full OAuth2 JWT authentication, topic subscriptions for tide alerts, device token tracking, and Crashlytics for monitoring app stability. The PushNotificationService is 429 lines of production-grade FCM integration.

CloudFront + Image CDN

Media

Images are stored in S3 and served through CloudFront CDN for fast delivery. An image optimization service handles image hosting with upload presets. Two CDN layers ensuring images load fast regardless of where the user is.

Tailwind CSS

Styling

The admin interface and public-facing pages are styled with Tailwind's utility-first approach and a component library. Responsive, consistent, and fast to iterate on.

Laravel
Flutter
PHP
Livewire
Tailwind CSS
Push Notifications
Google Maps
Tide Data API
Weather API
Social Media API
CDN
Image CDN
REST API
Mobile App
Laravel
Flutter
PHP
Livewire
Tailwind CSS
Push Notifications
Google Maps
Tide Data API
Weather API
Social Media API
CDN
Image CDN
REST API
Mobile App

Got a community or destination that deserves its own app?

We build platforms that bring real-time data and local knowledge together. Let's create something people actually want to open.