In Active Development

Voyager — Social Travel Platform

Every trip tells a story. Voyager brings those stories to life, stop by stop.

FlutterRiverpod.NET CoreSignalRPostgreSQLAWS S3FirebaseObjectBox
The Problem

Travel sharing is broken. A photo on Instagram, a pin on Google Maps, a message on WhatsApp — but nowhere tells the story of a trip with the depth it deserves. Every stop, every commute, every budget detail is part of that story. Existing apps give you either a photo dump or a map pin. The space between — the actual texture of a journey — gets lost.

The Solution

Voyager is a social platform that tells trips stop by stop. Each stop carries its own photos, descriptions, and context. The commute between stops — 13 transport modes from bus to helicopter — is part of the story. Multi-currency budget tracking, real-time chat, and if you see a route you love? Fork it, make it your own. Every voyage is inherently a template.

Screenshot 1
Screenshot 2
Architecture & Decisions

Flutter mobile client, ASP.NET Core backend, PostgreSQL database, and AWS S3 media storage. Real-time communication via SignalR, offline data via ObjectBox.

System architecture diagram

Why Offline-First Architecture?

The best stops are often where there's no signal. I built custom data hydration logic with ObjectBox so the app works seamlessly even when connectivity drops.

Why S3 Presigned URLs?

Instead of routing media uploads through the server, I let clients upload directly to S3. This reduced server compute costs by 70%.

Why Composable Privacy Layers?

Two independent privacy layers: account-level (public/private) and voyage-level (public/followers-only/private). When composed, a public voyage on a private account is still only visible to approved followers.

Feature Highlights

Stop-by-Stop Voyage Narratives

Each stop carries its own photos, descriptions, and media gallery. Commute details between stops — 13 modes including bus, train, plane, bike, even helicopter — are an integral part of the story.

Voyage Forking

Fork a route you love, customize stops, adjust dates and budget. Link to the original stays, creating discovery chains. No separate template system needed — every voyage is inherently a template.

Real-Time Chat

Low-latency direct and group messaging via SignalR. Share voyages in conversation, with read receipts and delivery status.

Offline Mode

Offline-first architecture with ObjectBox. View voyage details and maps without connectivity — because the best stops are sometimes off the grid.

Challenges & Lessons

Offline Data Hydration Complexity

The biggest challenge was keeping offline data consistent. If a user adds a new stop while offline, uploads photos, and then comes back online — all those changes need to sync with the server in the right order, without conflicts. I wrote the delta sync logic from scratch, and the hardest part was deciding the conflict resolution strategy.

Privacy Layer Composition

Composing two independent privacy layers (account and voyage) created a matrix that needed correct checking on every query. Especially during forking — 'can this user fork this voyage?' depends on account privacy, voyage visibility, AND follow status. I missed some edge cases in the first implementation and only caught them through comprehensive test scenarios.

Outcomes & Impact
V1 Shipped

Fully functional mobile app deployed to production

70%

Server compute cost reduction via S3 presigned URLs

13

Supported transport modes — from walking to helicopter

Clean Rebuild

Voyager Reborn — re-architected from scratch with expanded scope