Offline-first mapping and navigation platform for Android + Web
  • TypeScript 93%
  • JavaScript 2.7%
  • CSS 2%
  • Shell 1.2%
  • Kotlin 0.5%
  • Other 0.5%
Find a file
2026-10-28 21:32:58 +00:00
.forgejo/workflows chore(deploy): move host deploy dir to ~/docker/<Category>/<svc> [skip ci] 2026-10-28 21:32:58 +00:00
apps docs: add Android screenshots to README 2026-10-28 18:51:18 +00:00
assets/screenshots/android docs: refresh Android feature screenshots [skip ci] 2026-10-28 19:12:33 +00:00
backend feat!: remove NPRA travel-time traffic before the feed is retired 2026-10-24 11:57:39 +00:00
docs feat: retire Atlas commute surfaces and Android widgets 2026-10-24 16:50:04 +00:00
infrastructure chore(deploy): move host deploy dir to ~/docker/<Category>/<svc> [skip ci] 2026-10-28 21:32:58 +00:00
packages feat: retire Atlas commute surfaces and Android widgets 2026-10-24 16:50:04 +00:00
scripts fix(gate): count the whole tree when there is no upstream 2026-09-28 05:41:46 +00:00
.dockerignore chore(build): halve the gate, make TS builds incremental 2026-08-03 00:03:38 +00:00
.gitignore feat: integrate Garmin courses and activity import 2026-10-03 22:51:16 +00:00
.nvmrc chore: scaffold Atlas monorepo with runnable web map 2026-07-15 09:31:23 +00:00
.prettierignore feat: Valhalla offline routing, GraphHopper decommissioned (v0.8.0) 2026-07-16 18:00:28 +00:00
.prettierrc.json chore: scaffold Atlas monorepo with runnable web map 2026-07-15 09:31:23 +00:00
docker-compose.yml chore(deploy): move host deploy dir to ~/docker/<Category>/<svc> [skip ci] 2026-10-28 21:32:58 +00:00
eslint.config.js feat(transit): pin the commute, not the departure 2026-08-28 06:22:40 +00:00
LICENSE docs: reserve all rights to Atlas [skip ci] 2026-10-28 18:51:43 +00:00
package-lock.json feat(curiosities): Bergen and Stavanger public toilets, dated 2026-09-30 20:30:26 +00:00
package.json fix(dev): watch packages/* so edits reach the running servers 2026-09-28 18:17:25 +00:00
README.md docs: refresh Android feature screenshots [skip ci] 2026-10-28 19:12:33 +00:00
tsconfig.base.json chore(build): halve the gate, make TS builds incremental 2026-08-03 00:03:38 +00:00

Atlas

A self-hosted, offline-first mapping and navigation platform (OsmAnd-inspired) for Android + Web, built on OpenStreetMap data. The web app is also a first-class citizen.

Android screenshots

Explore the map Plan a route Switch map layers Browse collections
Atlas on Android showing the map of central Oslo and map controls Atlas on Android showing a planned route with its distance and travel time Atlas on Android showing the layer quick switcher over the map Atlas on Android showing a collection of saved places and a route in Oslo

Tech stack

  • Monorepo (npm workspaces): apps/web, apps/android, backend/, packages/* (shared TypeScript).
  • Language: TypeScript everywhere — strict mode, ESM.
  • Web: React + Vite, MapLibre GL JS for rendering.
  • Android: React Native (Expo dev-client) + MapLibre Native.
  • Backend: Node 24+, Fastify; serves the built web app same-origin in production.
  • Data: SQLite on clients (native / SQLite-WASM+OPFS in the browser), PostgreSQL+PostGIS on the server for the optional sync backend.

Map tiles

Atlas serves vector tiles. Basemap tiles are pre-built from OpenStreetMap data into PMTiles archives using Planetiler, then rendered client-side by MapLibre GL using an OpenFreeMap Liberty style (Noto Sans glyphs, OFM sprites).

External services

These self-hosted services run alongside the app (see infrastructure/ for their Docker setup):

Service Purpose Notes
Valhalla Routing (driving/cycling/walking/transit)
Photon Search / geocoding Self-hosted, backed by an OSM data import
Planetiler → PMTiles Vector basemap tiles Build-time only — not a running service; output is static PMTiles files served by the backend
PostgreSQL + PostGIS Optional account/sync backend Only enabled when DATABASE_URL and JWT_SECRET are set; unset = anonymous local-only mode

All external services communicate with the backend over a shared Docker network (atlas) and are otherwise decoupled — none of them are required for local development (DATABASE_URL=memory runs a throwaway in-process store in place of Postgres).

Repo structure

apps/web/          React + Vite + MapLibre web client
apps/android/      React Native (Expo) Android client
backend/           Fastify API + static file serving
packages/*/        Shared TypeScript packages (core domain logic, routing, storage, sync, gpx, ...)
infrastructure/     Docker/compose setup for Valhalla, Photon, Postgres, tile builds
.forgejo/workflows/ CI: build -> push -> deploy

License

Copyright (c) 2026 Lars Gjessing. All rights reserved. The source is public for inspection; reuse requires prior written permission. See LICENSE. Third-party components and data, including OpenStreetMap data, retain their own licenses and terms.