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.
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.


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

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.
Instead of routing media uploads through the server, I let clients upload directly to S3. This reduced server compute costs by 70%.
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.
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.
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.
Low-latency direct and group messaging via SignalR. Share voyages in conversation, with read receipts and delivery status.
Offline-first architecture with ObjectBox. View voyage details and maps without connectivity — because the best stops are sometimes off the grid.
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.
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.
Fully functional mobile app deployed to production
Server compute cost reduction via S3 presigned URLs
Supported transport modes — from walking to helicopter
Voyager Reborn — re-architected from scratch with expanded scope
Let's talk about your project.
Get in touch