Every mile you log
stays yours.
A private GPS journal you run yourself. MapLibre heatmaps, shared adventures, dwell-time analytics, a native Android app, and pushes from GPSLogger, OwnTracks, or anything else that can hit an HTTP endpoint.
- 0
- points logged
- 0
- cities visited
- 0
- km tracked
Field notes on ownership
It never phones home
Your points live in your Postgres, your Docker volume, your S3 bucket. No telemetry, no analytics beacon, no third party. The only server Roamly talks to is the one you started.
Offline where it counts
US points reverse-geocode against bundled Census boundaries with point-in-polygon lookups. No Google, no per-point API call, no rate limit. A town resolves to the place that actually contains the point, rather than whichever city happens to be closest.
Built to run for years
Gated distance that ignores GPS jitter, nightly stat snapshots, Doze-proof capture on Android, idempotent backups. Nothing flashy. It just keeps logging, year after year.
Not another SaaS map widget
Roamly is a full Django app you self-host: map, journals, adventures, diagnostics, an AI you bring yourself, and a native Android client, all in one place.
Map
Speed-gradient tracks, density heatmaps, a day-by-day replay animation, and a "scratch map" of every country and US state you've set foot in. Vector tiles at scale on PostGIS, classic mode on SQLite.
Adventures
Shared journeys with a day-by-day log, a freeform story, and rated places with photos. Every member joins, tracks their own route in its own color on one map, and writes what happened. Share it publicly behind a PIN if you want.
Stats & visits
Distance isn't a raw point-to-point sum: it's resampled, gated against phone-in-pocket drift, and rejects GPS teleports. Dwell time per place goes through the same care, then gets cached in a nightly snapshot so the page loads instantly.
Search & places
Search by place name, date phrase, or radius around a point. Define your own named geofences and get full stats back — top cities, dwell time, a sample track — for each one.
Journals
One entry per day with mood, weather, and up to 20 photos, its map track pulled straight from your own GPS history. Streaks and lifetime totals included.
Diagnostics
A quality-review pass flags bad fixes — impossible speed, altitude spikes, poor accuracy — on a map you can inspect and clean up point by point, plus a coverage timeline for the whole history.
AI Ask
Ask plain-language questions about your own history using any OpenAI-compatible model you point at — read-only tools, your own API key, no vendor lock-in.
Android app
A foreground service with two capture layers: a continuous stream while the phone's awake, and exact alarms that take over once Android's Doze mode suspends everything else. Sync is offline-first, so it catches back up on its own after a dead connection.
Your server
Docker Compose, SQLite or PostgreSQL + PostGIS, S3-compatible backups for data and photos, CSV/GPX/Takeout/OwnTracks/KML import. US points geocode fully offline against Census boundaries — no outbound call.
Live in about two minutes
Docker Compose brings up the database, migrations, and web app. Create an API key, point GPSLogger at your instance, watch points appear.
-
Grab & start
Pull the prebuilt
waxn/roamlyimage. PostGIS and migrations run automatically.curl -O https://raw.githubusercontent.com/waxn/roamly/main/docker-compose.ymldocker compose up -d -
Sign up & API key
Open your instance, create an account, then Settings → API Keys for your phone.
-
Push locations
GPSLogger custom URL or OwnTracks →
/api/push/with your key. Garmin/Strava exports work via CSV import too.curl -X POST localhost:8001/api/push/ \ -H "Authorization: Bearer YOUR_KEY" \ -d '{"device_id":"phone","latitude":45.5,"longitude":-122.6}' -
Explore
Map your history, run geocoding, check visits dwell time, log an adventure, invite your family.
-
Staying current
Updates are just a pull and restart — no git clone, no rebuild.
docker compose pull && docker compose up -d