ATLAS - RevenueCat Shipyard Hackathon Submission

Project Story

Inspiration

Quin Gable has been a solo woman van lifer for five years. She loves the freedom of the open road, but faces one crushing reality: the dating and social landscape for nomads is essentially broken.

Traditional dating apps assume you're stationary. By the time you match with someone, exchange messages, and plan to meet, you've already moved to the next state. Making friends is a needle-in-a-haystack problem when you're always moving. And finding trusted expertise to help with van conversions is fragmented across Reddit threads, Facebook groups, and word-of-mouth recommendations.

The van life community is tight and protective, especially for women. There's no platform built for them—there's only apps that accidentally work for them.

ATLAS was born from this gap. We asked Quin: what if there was a platform designed specifically for nomads? A place where dating, friend-making, and expert help all exist in one beautiful, trust-enabled space?

What We Built

ATLAS is a production-ready mobile platform combining five core pillars:

  1. Atlas Map — Real-time Snapchat-style pins showing exactly where other van lifers are right now, updated every 60 seconds via Socket.IO
  2. Connect — Tinder-style swipe matching for dating and activity-based friend finding (hiking, climbing, surfing, photography)
  3. Pulse — Instagram-style social feed with ephemeral 24-hour stories and threaded comments
  4. Build — Expert marketplace connecting experienced van builders with newcomers (electrical, solar, plumbing, woodwork)
  5. Trust Layer — Invite-only access, multi-tier verification, privacy controls, and RevenueCat-powered premium subscriptions

The app is production-ready: live backend at 136.114.164.199:8081, real-time WebSocket communication, Google OAuth integration, and a signed Android App Bundle ready for Play Store submission.

How We Built It

Frontend: Flutter 3.10+ with Provider state management. 37+ screens across auth, dating, social, maps, and premium flows. 17 providers manage app state, 14 services handle API communication, and 15 reusable widgets power the UI. Hive caches offline data, Dio + JWT interceptor handles secure API calls, ScreenUtil ensures responsive design across all devices.

Backend: Node.js + Express.js (ES Modules). 11 route files covering auth, users, posts, matches, chat, experts, adventures, stories, premium, invites, and nomad logs. 10 controllers with comprehensive CRUD ops. Socket.IO server manages real-time communication for chat (text/image/location) and live map location broadcasting. Multer + Google Cloud Storage handle file uploads.

Database: MongoDB Atlas with 9 Mongoose collections: User, Post, Match, Message, Adventure, Expert, Story (24h TTL auto-delete), NomadLog, Notification. All structured with relations, indexes, and atomic operations.

Real-Time: Socket.IO bidirectional WebSocket for:

  • Live chat: join_room, send_message, receive_message, typing indicators
  • Live map: join_atlas, location_update, nomad_location (every 60 seconds)

Monetization: RevenueCat SDK (purchases_flutter 9.11.0) powering the entire subscription layer. Single "pro" entitlement gating messaging, posting, stories, expert access, and advanced privacy controls. Monthly and yearly billing plans.

Security: JWT + bcrypt for authentication. Helmet.js for HTTP security headers. express-validator for input validation. All secrets (API keys, Google credentials, RevenueCat keys) injected via --dart-define and .env files, never committed to source control. Invite-only registration ensures community quality.

Challenges We Faced

1. Real-Time Location Accuracy Initially, map pins were flickering/disappearing during zoom. Solution: Implemented intelligent marker caching with setEquals change detection to prevent unnecessary re-renders.

2. Chat Room ID Validation Empty string room IDs caused 500 errors on chat threads. Solution: Added ChatService.getRoomId() with proper null guards and fallback logic.

3. Duplicate Messages in Real-Time Socket.IO was echoing messages back to the sender. Solution: Tracked _currentUserId in MessageProvider to skip socket events from your own user.

4. Google Sign-In Error Code 10 Android builds were failing because we used the wrong Client ID. Solution: Separated Android Client ID, iOS Client ID, and Web Client ID, injected each via environment variables.

5. Story UI Positioning Progress bars were scrolling off-screen during story playback. Solution: Wrapped progress bars in Positioned(top: 0) and set parent to Stack for sticky headers.

6. Permission Gate Flow We had a hardcoded India fallback for location permission denied. Solution: Built a proper multi-state permission gate screen with clear CTAs for "retry", "use app without location", and "go to settings".

7. Environment Secret Leakage Google Maps API key and RevenueCat API key were hardcoded in source files. Solution: Created lib/core/env.dart with String.fromEnvironment() and used --dart-define-from-file=.env at build time. Added .env to .gitignore.

8. Scalability with Socket.IO Broadcasting locations to all users created bottlenecks. Solution: Implemented room-based events (join_atlas room on map tab, leave on exit) to reduce message volume.

What We Learned

  1. Real-Time Architecture Matters — Socket.IO is powerful but requires careful room management and event debouncing to avoid server overload.

  2. Environment Management is Non-Negotiable — Hardcoding secrets is a quick path to security breaches. String.fromEnvironment() + .env files are the way.

  3. Mobile-First Location is Tricky — Permission states, background location updates, and battery optimization all interact in non-obvious ways. Always test on real devices.

  4. RevenueCat Simplifies Monetization — We don't manage billing, refunds, or platform-specific logic. RevenueCat handles it, and we just listen to entitlement changes.

  5. Invite Codes Build Trust — Open registration invites bots and low-quality users. Invite-only access with verification tiers creates a tight, protective community.

  6. Socket.IO + Provider State — Combining real-time events with Flutter's Provider state management requires careful listener lifecycle management. Disconnect on screen exit, re-subscribe on re-entry.


Built With

Languages & Frameworks

  • Flutter 3.10+ (Dart SDK) — Frontend framework with Provider state management
  • Node.js + Express.js (ES Modules) — Backend REST API and Socket.IO server
  • Dart — Frontend logic (~20,000+ LoC)
  • JavaScript — Backend logic (~5,000+ LoC)

Databases & Cloud Services

  • MongoDB Atlas — Cloud-hosted NoSQL database (Mongoose 8.0.3 ODM)
  • Google Cloud Storage — File uploads (profile photos, posts, stories)
  • Firebase Cloud Messaging — Push notifications (future roadmap)

APIs & SDKs

  • RevenueCat — Subscription management (purchases_flutter 9.11.0)
  • Google Maps Flutter — Interactive map rendering
  • Geolocator — Location permissions and GPS tracking
  • Socket.IO — Real-time bidirectional communication
  • Google OAuth — Native Android/iOS authentication via MethodChannels

Frontend Packages (Key)

  • Provider — State management
  • Dio — HTTP client with JWT interceptor
  • Hive — Local caching
  • image_picker — Camera/gallery access
  • image_cropper — Image editing
  • google_maps_flutter — Map rendering
  • ScreenUtil — Responsive scaling
  • permission_handler — Permission management

Backend Packages (Key)

  • Express.js — Web framework
  • Mongoose — MongoDB ODM
  • Socket.IO — WebSocket server
  • Multer — File upload middleware
  • bcrypt — Password hashing
  • jsonwebtoken — JWT authentication
  • Helmet.js — HTTP security headers
  • Morgan — HTTP logging
  • cors — Cross-origin resource sharing

Infrastructure

  • PM2 — Node.js process manager
  • GitHub Actions — CI/CD pipeline (deploy-stage.yml)
  • Docker — Containerization (future deployment)


About the Developer

Sachin Sharma And Arjav Jain — Are Full-stack Flutter/Node.js developer. Built ATLAS from scratch to directly solve Quin Gable's real problem: nomads need a community platform designed for them, not adapted from stationary use cases.

This project represents 14 phases of feature development, production deployment, RevenueCat integration, and Play Store compliance — all built with a focus on real-time communication, community safety, and beautiful UX.


Quin's Quote

"I love living in a van. It's the best thing that I've ever done, but that's the only downside — it's just really difficult to date and meet new people. This app would be a huge win for the nomadic community."

— Quin Gable, RevenueCat Shipyard Hackathon Problem Statement

ATLAS IS that win.

Share this project:

Updates