Van life runs on a single recurring question, usually asked around 4pm with the phone at 20 percent: where am I sleeping tonight, and can my rig actually get there.
Answering it today takes three apps, a Facebook group, and a guess. One app has the campgrounds. Another has the boondocking spots, half of them from 2019. A third has the reviews. None of them know how tall your van is. So you cross-reference, you screenshot, and you still end up rolling into a trailhead at dusk hoping the sign doesn’t say no overnight parking.
Vroam is my attempt to collapse that into one app and an actual plan. It’s a native iOS and Android app, backed by a spatial database I assembled from ten public federal and open data sources, with an AI layer on top that answers plain-language requests like “somewhere quiet about four hours west, off pavement, no snow.”
It is deliberately a trip planning tool, not a navigation app. It helps you decide where to go and what’s there, then hands the driving off to Apple or Google Maps.
This is what it does and how it works.
The problem it solves
There’s a reason nobody has cleanly solved this, and it isn’t lack of interest. The answer is genuinely hard to assemble:
- The data is federated by nature. Legal places to sleep are scattered across BLM, the Forest Service, the Park Service, the Army Corps, Recreation.gov, state park systems, private operators, retail chains that tolerate overnight parking, and an enormous informal tier that exists only in travelers’ heads. There is no single authority to query.
- Legality is a separate dataset from location. Knowing a pull-off exists tells you nothing about whether you’re allowed to sleep there. That answer lives in land management boundaries, which is a different federal dataset with a completely different shape.
- Routing engines assume a sedan. Consumer navigation has no concept of vehicle height, length, or clearance, so it will happily route an 11-foot rig under a 10-foot bridge.
- Structured filters can’t express real intent. “Somewhere quiet, four hours west, off pavement, no snow” is a completely normal request, and no filter menu on earth handles it.
Every one of those sources arrives in a different format with a different definition of what a “site” even is. The hard part was never the app. It was the assembly.
What it does
Eighteen features are built and shipping. They group into the jobs people actually do, in the order they do them.
Find a legal place to sleep
- Layers and filters. The map opens clean. Filters group spots by intent rather than by data source: Sleep (dispersed, campgrounds, parking, community overnight), Services (water, dump, showers), Explore (national parks, airports). You’re never staring at a wall of 100,000 pins.
- Land layers. Shade the map by who manages the ground: BLM, national forest, national park, state, private, wilderness, each with an overnight rule of thumb. This is the real answer to “where can I camp for free.” Dispersed camping isn’t a list of addresses, it’s millions of acres where the rules allow it. Showing the land is more honest and more useful than pretending to have a pin for every pull-off.
- Community spots. Traveler-shared overnight spots, water, dump stations, and showers, each with its own pin color, plus reviews, ratings, amenity tags, and a report-and-resolve moderation loop. Shared spots are visibly marked as unverified.
Know before you go
- Weather. Current conditions and full forecast for the map view or any pin you drop. You’re sleeping in the thing you drove, so this isn’t a nice-to-have.
- Fire, smoke, temperature, and air quality layers. Live temperature forecast with numbers readable straight off the map, active wildfire perimeters, a smoke forecast, and EPA-banded air quality. Drag a time slider to scrub several days out. Wildfire season is the single biggest disruptor of western travel, and seeing smoke three days out changes where you point the van.
- Cell coverage. Shade the map by carrier in their brand colors, with 5G reading stronger than 4G, or drop a pin and the sheet tells you which carriers have signal at that exact spot. Modeled from FCC filings rather than measured signal, and labeled as such.
- What’s nearby. For any pin, the closest grocery, food, coffee, gas, gym, laundromat, water, dump, brewery, with distances. Answers the second question after “where do I sleep,” which is “can I get a shower and groceries near there.”
- Elevation. Total climb and descent for a route, plus a draggable elevation profile. Matters enormously for underpowered rigs and anyone watching fuel or brakes on a mountain pass.
- Airports and parks. Every FAA airport and heliport with code, runway surface, elevation, and fuel, and every National Park Service unit, not just the famous parks: monuments, historic sites, recreation areas, seashores, battlefields.
Plan the drive
- Route preview. Distance, drive time, and multiple stops to any spot, pin, or place, then a one-tap hand-off to Apple or Google Maps to actually drive it.
- The planner. Tell Vroam how long you want to drive or which city to head toward, and it finds spots that fit inside that drive-time window. This is the feature that matches how nomads actually think. Not “route me to X” but “I want to drive about five hours toward Bend, where can I stop.”
- Rig-aware planning. Set height, length, and weight once, and Vroam plans around low clearances and roads your rig has no business on, flagging per-spot fit as Fits, May not fit, or Unknown, verify. The honest “unknown” state is a feature, not a gap. Most spots have no published dimension data, and pretending otherwise would be actively dangerous.
Ask for what you want
- Ask Vroam. Ask anything in plain language: “good tacos near me,” “where can I sleep tonight,” “easy hikes nearby,” “plan Moab to Bend in two nights.” It finds real places, drops them on the map, and can sketch a multi-stop trip with drive times and weather attached to each night. No competitor has this, and it’s the paid anchor.
- Search anywhere. Find a place, business, or address, then route to it or save it. Search a chain and tap “Show on the map” to drop every nearby match at once.
Make it yours
- Drop a pin. Long-press anywhere to get coordinates, elevation, weather, air quality, cell coverage, and the climb of the drive there. Your own knowledge is as valuable as the database, so Vroam keeps it and syncs it.
- Preferences. Turn off nearby categories you never use, and add brand preferences so Vroam always shows the nearest Planet Fitness, Sprouts, or yoga studio even if it’s miles away. Van life routines are intensely personal, and a gym membership is really a shower network.
- Map styles. Switch between a custom Vroam style, Outdoors topographic, and Satellite. Satellite is how experienced boondockers vet a rough access road before committing to it.
The data asset
This is where the actual work lives. Live counts from the production database:
- 45,554 curated sleep spots (34,832 campgrounds, 10,717 overnight parking)
- 33,985 service and overnight spots (25,295 water, 4,248 showers, 2,800 overnight, 1,642 dump)
- 19,073 airports and heliports
- 474 National Park Service units, all unit types
- 293,675 public land polygons, which is the legality layer
- ~99,000 total mapped points, excluding the land polygons
Two numbers I’m careful about, because the temptation to oversell them is real.
There are five dispersed camping pins. That is not the free-camping story and I won’t market it as one. The free-camping story is the 293,675 land polygons, because dispersed camping is a permission over an area, not a list of sites.
And the 33,985 community spots are imported from OpenStreetMap, not contributed by Vroam users. The true traveler-contributed count is still in single digits. The app distinguishes the two in-app, and so should any description of it. What compounds over time isn’t the imported data, it’s the mechanism sitting on top of it: confirmations, ratings, comments, tags, moderation. That part is built and live.
The overnight subset of that layer actually dropped from 6,441 to 2,800 when I re-derived it against stricter legitimacy filters. Losing 57 percent of a headline number was the right call, because a wrong overnight pin is the one that gets somebody knocked on at 2am.
The technology stack
- Swift + SwiftUI + SwiftData — the iOS app, iOS 18 minimum. 154 files, ~20k lines.
- Kotlin + Jetpack Compose + Room + DataStore — the Android app. 97 files, ~11.6k lines.
- Mapbox Maps SDK — map rendering on both platforms, with custom Studio styles plus Outdoors and Satellite, and Mapbox Directions and Matrix for routing and drive-time windows
- Supabase — Postgres with PostGIS, row-level security, auth, and edge functions. 25 reviewed migrations.
- Deno + TypeScript — five edge functions: AI planning, beta access gating, wildfire and smoke queries, coverage lookup, and account deletion
- Anthropic Claude API — Ask Vroam, built on tool use so the model queries the live spatial database, geocodes, routes, and pulls forecasts rather than guessing
- Python 3.12 — the entire ingest layer: geopandas, GeoAlchemy2, SQLAlchemy, rasterio, h3, numpy, Pillow
- GitHub Actions — five scheduled pipelines. NOAA smoke and temperature rasters every three hours, EPA air quality twice daily, plus daily crash and user-report watchers that open GitHub issues so solo triage can’t silently lapse.
- Cloudflare R2 + Workers — raster CDN for the forecast overlays, and hosting for vroam.io
- Sentry — crash reporting on both platforms, with symbolication wired
- Apple MapKit — search completion, geocoding, and nearby POI resolution on iOS
- Astro 5 — the marketing site, with copy-guard tests that fail the build if the site starts claiming things the app doesn’t do
- PyNaCl — sealed-box encryption for the daily off-platform backup of user data
- Sign in with Apple, Google, and email OTP — no account needed to use the map; one is required only to share or review community content
The data sources
Every layer traces back to a citable public source:
- Recreation.gov / RIDB — federal campgrounds
- National Park Service API — all NPS units
- FAA — airports and heliports
- OpenStreetMap / Overpass — campgrounds, parking, water, dump, showers (ODbL, attributed)
- PAD-US — public land boundaries, the legality layer
- FCC Broadband Data Collection — per-carrier cell coverage
- NIFC — active wildfire incidents and perimeters
- NOAA HRRR-Smoke, GFS, HMS, NAQFC — smoke, temperature, plumes, air quality forecasts
- AirNow — air quality observations
- Open-Meteo — weather forecast
None of these is proprietary, and I think it’s important to say that plainly. The moat isn’t access, it’s assembly. Normalizing, deduplicating, classifying, and spatially joining ten sources against land boundaries is a multi-month integration before you’ve written a single screen of app. That’s a real lead, but it’s a lead, not a monopoly.
Two apps, one product
Vroam ships on iOS and Android as two separate native codebases in one repo. Nothing is shared at the client level, which means a schema change is now two client changes, and a brand color change is two edits.
I wrote the parity rule into the repo instructions as a hard constraint: any user-facing change lands on both platforms, or it gets logged as a known gap in the same batch. There is no third option, because a feature that exists on one platform and was never written down is how two apps quietly stop being the same product.
Three divergences are deliberate. Android gets the system back gesture, Material bottom sheets, and Android permission flows, because it should feel like an Android app even while looking almost exactly like the iPhone one. Search providers differ, since Apple’s MapKit doesn’t exist on Android and Google Places has better US small-business coverage. And Sign in with Apple is a native button on iOS and a web flow on Android.
Android currently has the map, filters, spot detail, saved spots with offline-first sync, auth, the rig editor, and settings. The overlays, planner, Ask Vroam, nearby, and weather are still iOS-only. That gap is logged, not hidden.
How I built it
836 commits in three months, solo, across two mobile apps, a Postgres/PostGIS backend, five edge functions, a Python ingest layer, five scheduled data pipelines, and a marketing site.
I built it with Claude Code. Agent-assisted development, but I defined the product, made every architectural call, and reviewed what landed. Same pattern as my other projects: the AI didn’t let me be lazy, it let me ship something with depth in categories I’d otherwise have cut.
What made it work at this size was writing the guardrails down. The repo carries explicit instructions to trace blast radius before editing, to get sign-off before touching shared surfaces (migrations, RLS policies, data models, preference keys, edge functions, build config), and to verify against the live code or database rather than reasoning from what a doc claims is true. Docs drift. Checkmarks lie. That rule exists because I watched both happen.
Two things I found by actually checking:
The AI endpoint was open. Supabase verifies the JWT on edge function calls, which felt like enough. It wasn’t: the anon key ships inside the app binary and is itself a valid JWT, so anyone who pulled it out of the IPA had unlimited Claude calls on my account. I verified it live, an anon-key-only request returned a 200 and burned real tokens. The fix was to require a real signed-in user and meter each one with a daily cap, which also brought forward quota work the monetization plan already needed.
A user-data backup was briefly public. My first backup script reused an upload helper from an older project that publishes deliberately public map tiles. I checked the credential scope carefully. I never checked the destination. A dump containing five user email addresses sat in a public CDN bucket, anonymously fetchable, for about eight minutes before I caught and deleted it. The lesson I rewrote into the repo rules: the question is never just “is my credential scoped,” it’s “who can fetch this URL.” Those are different questions, and only the second one mattered. Backups are now encrypted before they leave Postgres with a public key, so the CI job that writes them can’t read them back.
I’d rather publish both of those than imply I got it right the first time. For an app whose entire community strategy depends on people trusting it with where they sleep, a privacy breach isn’t a bug you patch, it’s the end of the product.
There are 79 test files across the three languages, concentrated on pure logic: the saved-spot reconcile engine, rig fit, unit formatting, EPA breakpoints, raster colormaps, profanity filtering, and brand-color guards.
What Vroam deliberately isn’t
The declined list is as load-bearing as the feature list:
- No turn-by-turn navigation. Apple and Google have already won it, users hand off anyway, and chasing it would mean competing on the one axis where I can’t win. Route preview stays, because that’s planning.
- No push notifications for anything the user didn’t explicitly ask for. It’s a brand pillar, not an oversight.
- No pointing you somewhere you’re not allowed to be. The fastest way to lose access to public land is for enough people to abuse it.
- No weather-aware routing, no tank tracking, no restaurant recommendations. Scope that sounds good in a feature list and dilutes the thing the app is actually for.
Where it is now
Live in external beta on TestFlight since August 2026, past Apple’s Beta App Review, running on a real backend with crash reporting, a working moderation system, and published legal documentation. Pricing is locked at $59/year or $7.99/month with a seven-day trial, benchmarked against the direct competitive comp, and deliberately not switched on yet. The paywall waits until Ask Vroam is dependable enough that I’d be comfortable charging for it.
It is honestly pre-traction. Built product, real data asset, handful of beta testers, zero revenue. That’s a product-and-data story rather than a growth story, and I’d rather describe it that way than dress it up.
Next up is the App Store listing, subscription infrastructure, a data quality pass on the OpenStreetMap tier using road proximity and slope, and closing the Android feature gap. After that, a web planner, expanded cell coverage, and Canada.
It still won’t drive the van for you. That part was never the hard part.