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.
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.
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 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.
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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.
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 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 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.
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.
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 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.
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.
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.
We build platforms that bring real-time data and local knowledge together. Let's create something people actually want to open.