Inspiration

The van life movement has exploded in recent years, with an estimated $\sim 3.1$ million Americans living full-time in converted vans, RVs, and campers. Yet existing dating and social apps aren't built for people whose zip code changes every week. We asked ourselves: what if connection wasn't tied to a fixed location, but to a shared lifestyle?

VanHitch was born from the idea that nomads deserve a platform that understands their world — one where distance is fluid, community is everything, and "nearby" might mean parked at the same trailhead tonight.

What it does

VanHitch is an all-in-one dating and social platform designed specifically for van lifers and digital nomads. Key features include:

  • Dating — A swipe-based matching system that understands nomadic lifestyles, not just static locations
  • Traveler Discovery — Find nearby van lifers using geohash-based proximity search, whether you're at a campground, trailhead, or rest stop.
  • Travel Plan Intersections — Share your upcoming route and get notified when other travelers' paths cross yours.
  • Community Feed — Post updates, share van builds, ask for advice, and stay connected with the nomad community.
  • Real-Time Messaging — Chat with matches, friends, and fellow travelers.
  • Marketplace — Buy, sell, and trade van life gear and services within the community.
  • Events — Discover and organize van life meetups, campouts, and gatherings.

How we built it

We chose Flutter for cross-platform reach (Android & iOS from a single codebase) and Firebase as our serverless backend to move fast without managing infrastructure. The app follows Clean Architecture with three distinct layers:

  • Data Layer — Firebase integrations, DTOs with type-safe Firestore withConverter for compile-time safety.
  • Domain Layer — Pure business logic, use cases, and repository interfaces.
  • Presentation Layer — UI powered by Riverpod for state management and GoRouter for declarative routing with auth guards.

We used geohashing to encode $(\text{lat}, \text{lng})$ pairs into sortable strings, enabling efficient proximity queries without expensive geo-computations. Admin tooling built in TypeScript seeds $\sim 300$ test users with realistic profiles, vans, travel plans, and social connections for development and demos.

Challenges we ran into

Real-time state synchronization was our biggest hurdle. With multiple stream providers feeding into screen ViewModels, we hit edge cases where Riverpod's autoDispose lifecycle and cached stream data caused infinite loading states on screen re-entry. We developed a defensive pattern of seeding initial state from cached values and guarding loading flags with null checks.

Travel plan intersections required computing overlap between users' planned routes. Efficiently matching $n$ users' geohash-encoded travel windows against each other pushed us to think carefully about query design within Firestore's document-oriented constraints.

Balancing glass morphism aesthetics with usability — our frosted-glass UI looked stunning but hurt readability on plain backgrounds. We learned to reserve the effect for image-backed surfaces and lean on Material 3 defaults everywhere else.

Accomplishments that we're proud of

  • Built a full-featured social and dating platform with real-time messaging, swiping, friend systems, community posts, marketplace, and events — all from a single Flutter codebase.
  • Designed a geohash-based discovery system that efficiently finds nearby travelers without costly geo-queries.
  • Implemented a travel intersection algorithm that notifies users when their future routes overlap with other nomads.
  • Maintained clean architecture throughout — every feature flows through proper data, domain, and presentation layers with type-safe Firestore converters and a consistent Result pattern for error handling.
  • Created a robust seed system that generates $\sim 300$ interconnected test users with realistic profiles, vans, travel plans, conversations, and social graphs.

What we learned

  • Geohashing as a practical technique for location-based queries in NoSQL databases.
  • The importance of the Result pattern over raw exceptions for predictable error handling across async boundaries.
  • How Riverpod's lifecycle interacts with cached streams — and the subtle bugs that emerge when you assume fresh state on screen re-entry.
  • Designing data models that work within Firestore's constraints while keeping the domain layer database-agnostic.
  • That UI polish matters, but accessibility and readability must always come first.

What's next for VanHitch

  • Map View — An interactive map showing nearby van lifers, campgrounds, and points of interest in real time.
  • Trip Planning — Collaborative route planning where friends can build and share road trip itineraries together.
  • Van Build Showcase — A dedicated gallery for users to document their van conversion journeys with before/after photos.
  • Safety Features — Check-in system and trusted contacts for solo travelers.
  • Offline Support — Caching and offline-first architecture for areas with no cell signal — because van life doesn't stop when the bars drop.
  • Web App — Expanding beyond mobile with a Flutter web build for planning trips from a laptop.

Built With

Share this project:

Updates