-
-
Home — one big tile to start today's outing. 1179x2556, no device frame.
-
Building a route — pick an area and the places you're curious about.
-
The route — map and timeline are two views of the same day, always in sync.
-
Active mode — the whole day reduces to one button: next stop.
-
Routia Pro paywall — powered by RevenueCat. Monthly with a 7-day free trial, or yearly.
-
App icon, 1024x1024, uncropped.
Inspiration
Day trips have a hidden tax: deciding. Where to go, in what order, how long it takes to get there — and once you're out, re-searching Google Maps between every single stop.
Routia was built around one idea: Think less. Travel more. You choose the places; the app quietly handles the visiting order, the timing, and the way there.
Our design rule was blunt: if you have to go back to Google Maps in the middle of your day out, we lost.
What it does
- Pick places, get a route. Choose the shops and spots you're curious about, and Routia lines them up into a one-day route — visiting order and travel times included — on a map and a timeline you can read at a glance.
- "Next stop" is the whole interface for the day. Once you set off, one tap hands you to navigation for the next place. No app-juggling between stops.
- Can't decide? Get a suggestion. Tell Routia the area and your mood, and it proposes a complete route for you.
- Multi-day trips. Group routes into a trip with a day-by-day tab, and run them one day at a time.
- Works without location access. Decline Location Services and everything still works — search for a starting area ("Tokyo Station") and plan from there.
- Save and share. Keep routes for future dates, or share one as an image for meetups and trip planning.
- Fully localized in English and Japanese.
How we built it
Flutter (iOS) with go_router and Riverpod, Google Maps Platform for places/photos/routing, and a Cloudflare Workers + D1 backend proxy so that no API key ever ships in the client. Stop ordering is a Held–Karp dynamic program anchored to your starting point, so the route is genuinely the short way round rather than the order you happened to tap things in. Local state is sqflite + flutter_secure_storage; crash reporting is Sentry with a PII sanitizer that strips coordinates, place names and free text before anything leaves the device.
RevenueCat (purchases_flutter) powers Routia Pro — monthly with a 7-day free trial, and yearly. Entitlements gate features in the client, while the free-tier counters are enforced server-side in the Workers proxy, so the paywall can't be spoofed by clearing app data.
Challenges we ran into
- Designing calm around a map. One accent color is reserved exclusively for the single most important action on screen. Everything else is structure. Restraint turned out to be much harder than adding features.
- Apple review taught us graceful degradation the hard way. An early build hung silently when Location Services were off — a
Futurethat no one ever completed. We rebuilt the location layer so every feature has a no-GPS path, and added regression tests that run the entire flow with location denied. - Residual state was our most expensive bug class. Searching one city and then starting a fresh route could leak the old origin into the new one. We ended up building a regression scenario suite organized by failure mode rather than by feature, and every reported bug had to become a failing scenario before it could be fixed.
- Keeping Google Places data usage inside policy while still caching enough for a smooth timeline.
Accomplishments that we're proud of
Shipping a real, complete free tier — not a crippled demo. Free users get whole, usable routes. And the paywall lists only features that actually exist today.
What we learned
That the valuable half of a travel app isn't discovery, it's execution — the part after you've already decided. Almost everyone builds the first half.
What's next for Routia
Android, real train/transit legs with transfers, shareable route URLs, importing places straight from Google Maps, and collaborative route editing with friends.
Built With
- cloudflare-d1
- cloudflare-workers
- dart
- flutter
- google-maps
- google-places
- ios
- revenuecat
- riverpod
- sentry
- sqlite
- swift