Private, offline maps and navigation: your maps on your phone, nothing else.
MapsCtrl shows OpenStreetMap maps you download once, then works without a connection:
- search places, addresses and coordinates on the phone
- routes by car, bike and on foot, worked out on the phone
- turn-by-turn navigation with spoken directions that name the streets, speed limits and speed camera warnings
No account, no tracking, no map tiles streamed from a server. It only goes online when you start a download, or when you ask for a public transport route.
Part of the Ctrl series by VKNXWorks.
- Offline vector maps of any country or region from download.mapsforge.org, drawn on the phone in MapsCtrl's own style: neutral greys, muted water and green, and violet only for your route, the selected place and your position. Day and night colours follow your phone's dark theme
- Downloads: browse continents, countries and regions, download with progress, check for updates, update and delete, see how much space maps and routing data take, or import a Mapsforge
.mapfile you already have - Offline search by name, address, category and coordinates (decimal, degrees-minutes-seconds or
geo:links), with quick buttons for food, fuel, charging, parking, groceries, hotels, pharmacies, cash, toilets and transport - Place sheet with the category, address, opening hours, phone, website and other OpenStreetMap details, and Route to, Save and Share
- Routes by car, bike and on foot with BRouter, from your position, a place or coordinates you type, or a point you tap on the map. Routing data is downloaded per area, only after MapsCtrl has shown you the size and you agreed
- Turn-by-turn navigation: next-turn card, arrival time, time and distance left, your speed, the speed limit of the road, speed camera warnings, spoken directions with your phone's text-to-speech (offline voices work) and rerouting when you leave the route. The map turns with your direction of travel
- Street names in directions: "Turn left onto Rue Grimaldi", "Take the 2nd exit onto Avenue de la Costa", on the next-turn card and in the voice. The names come from the maps on your phone, so this works offline too
- Public transport with Transitous (online, only when you pick Transit): leave now, depart at or arrive by a time, journeys with walks, lines in their own colours, platforms, changes and delays, and the journey drawn on the map
- Hillshading: shaded hills and mountains, on or off under Map layers. The elevation data is downloaded per map in Downloads, after MapsCtrl has shown you its size, and can be deleted again
- Saved places and tracks, track recording (also with the screen off) and GPX import and export
- Share your ETA with ntfy (off by default): while navigating, your arrival time and the distance left go to an ntfy topic on a server you choose. Never your position
- Opens
geo:links from other apps - Ctrl / Signal look: dark and light, following your phone, one violet accent, Space Grotesk and JetBrains Mono
Not yet: Android Auto, contour lines and live traffic.
- Android 15 or newer, on a 64-bit ARM phone (nearly every phone from the last several years)
- Works on any Android ROM as a normal app: stock Android, LineageOS, GrapheneOS, CalyxOS, /e/OS and the phone makers' own systems. It doesn't need root
- Google-free and de-Googled: no Google Play services, Firebase or Google location library. Your position comes from Android's own location service
- Spoken directions use your phone's text-to-speech engine. Download an offline voice in Android's text-to-speech settings to hear directions without a connection
- Open the latest release on your phone, scroll down to Assets and tap the file that ends in
.apk(for exampleMapsCtrl-v0.3.0.apk). The "Source code" zip and tar.gz files are not the app; you don't need them. - Open it on your phone. Android may ask you to allow installing apps from your browser or file manager.
- Open MapsCtrl, tap Download maps and pick your country or region.
- Updates install over the old version. Your maps, saved places and settings are kept.
Updating from 0.2.0: MapsCtrl 0.3.0 is a new app with a new map format, so download your maps again (see the changelog).
Automatic updates: on your phone, tap the Obtainium button above. Install Obtainium first; the button adds MapsCtrl and installs every new release for you. If the button doesn't open the app, add https://github.com/VoidedKN0X/MapsCtrl in Obtainium by hand. If you use an F-Droid client with the CtrlF-Droid repository, MapsCtrl updates from there as well.
- Maps: tab Downloads, then Add maps. Turn Search data off if you only want to look at the map (it saves about a third of the space).
- Search: tap the search bar. Type a name, a street with a house number, a category such as "pharmacy", or coordinates.
- A place: tap a symbol or name on the map, or long-press anywhere for a pin.
- Route: Route to on a place, choose car, bike or foot. Tap From to start somewhere else than your position. The first route in an area asks to download routing data.
- Public transport: in route planning, pick Transit. Change sets a departure or arrival time; tap a journey to see its walks, lines, platforms and stops.
- Navigate: Start. Tap the speaker to mute, End to stop.
- Hillshading: the layers button on the map. Download terrain data for your maps under Downloads > Terrain data.
- Settings (profile picture, top right): units, map colours, voice, speed limit and camera warnings, public transport, ETA sharing.
-
Open source. All of MapsCtrl's code is in this repo, under the GPL-3.0 licence. Anyone can read it.
-
Built by GitHub, not on a personal computer. Every release on the Releases page is built by the build workflow on GitHub Actions, straight from the code in this repo. Each build also checks that the app has no Google libraries and no permissions it shouldn't have.
-
Always signed with the same key. Android refuses to install an update signed with a different key over MapsCtrl. The SHA-256 fingerprint of MapsCtrl's signing certificate is:
68:77:8C:2C:AF:00:30:9D:95:74:4D:2D:70:F0:7C:EF:2A:9F:D8:5F:F1:0D:B0:D5:B4:78:0E:AB:25:A1:B6:92Advanced users can check it with AppVerifier.
Check a download. Every release is built and published by GitHub Actions, never on a personal computer:
- The release notes end with the APK's SHA-256 checksum. Compare it with
sha256sum MapsCtrl-vX.Y.Z.apk(orGet-FileHashon Windows). - Each release APK has a signed build provenance attestation. With the GitHub CLI,
gh attestation verify MapsCtrl-vX.Y.Z.apk -R VoidedKN0X/MapsCtrlproves it was built by this repo's workflow from the tagged commit. - The signing-certificate fingerprint above stays the same for every release.
Permissions.
| Permission | What MapsCtrl uses it for |
|---|---|
| Internet | Only for downloads you start (maps, search data, routing data, terrain data), public transport routes you ask for (Transitous) and, if you turn it on, ETA sharing to your ntfy server. Search, car/bike/foot routing and navigation work offline. |
| Location (you allow it) | Your position on the map, navigation and track recording. It stays on the phone. MapsCtrl never asks for background location. |
| Foreground service (location) | Keeps navigation and track recording going with the screen off, with a notification while it runs. |
App-internal broadcasts (com.vknxworks.mapsctrl.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION) |
Added by AndroidX so that only MapsCtrl itself can send to its own internal receivers. |
See Privacy for what happens to your data.
Telemetry-free. MapsCtrl has no analytics, crash reporting, usage stats or tracking of any kind, and no account.
MapsCtrl connects to these servers, and only when you start it:
| Server | When | What is sent |
|---|---|---|
download.mapsforge.org |
You open Add maps, download or update a map, or tap Check for updates | A normal HTTPS request for the list or the file. No location, no identifiers; the user agent is only MapsCtrl/<version> |
brouter.de |
A route needs routing data and you tap Download | The same: the list of tiles, then the tiles you agreed to |
elevation-tiles-prod.s3.amazonaws.com |
You tap Download for a map's terrain data (hillshading) | The size check and the elevation tiles you agreed to. No location beyond which 1° tiles you download |
api.transitous.org |
Only when you pick Transit in route planning, and when you change the start, destination or time while it's picked | Your start and destination points (rounded to about 1 m) and the time you chose, nothing else. The user agent names MapsCtrl, its version and this repo's URL, as Transitous asks of apps. To hide Transit completely: Settings > Public transport |
| Your ntfy server | Only with Share my ETA on, while navigating, and for Send a test message | Your destination's name, arrival time and distance left, to the topic you set |
- Search, car/bike/foot routes and navigation run on the phone. MapsCtrl never sends what you search for or where you go; the one exception is a public transport search, which you start yourself and which sends only the two points and the time to Transitous (its privacy policy).
- No map tiles or geocoding from online services, and no car, bike or foot routing from them.
- Your maps, saved places, tracks and settings are stored in MapsCtrl's private storage and can't be read by other apps. Android backups don't include them.
- The Support, Report a bug, Source code and Licence links, and websites on a place sheet, open in your browser only when you tap them.
MapsCtrl is a one-person project by VoidedKN0X (VKNXWorks). Much of the code is written with the help of AI (Claude, by Anthropic). I decide what the app does, review the changes and use the app myself. Every change is listed in the changelog, and you can read every line of code here.
Since 0.3.0 MapsCtrl is written from scratch on its own engine; it is not based on another maps app.
You need Android Studio, or JDK 17 or newer and the Android SDK.
- Clone the repo:
git clone https://github.com/VoidedKN0X/MapsCtrl.git cd MapsCtrl - Build the app:
On Windows, use
./gradlew assembleDebug
gradlew.bat assembleDebug. - The APK is in
app/build/outputs/apk/debug/. Copy it to your phone and install it.
BRouter isn't published on Maven Central, so its routing core is built from source in the brouter/ folder (see brouter/README.md). Unit tests: ./gradlew :app:testDebugUnitTest.
Dependency verification. Every library and build plugin download is checked against the sha256 checksums in gradle/verification-metadata.xml, and the build fails on any mismatch. When you change a dependency, a plugin or the Gradle version, run the Dependency verification metadata workflow (Actions tab, Run workflow), check the diff of the file it prints and commit it in the same push.
MapsCtrl is free and open source. If it's useful to you, you can support development on GitHub Sponsors. Please report bugs and ideas with the bug report and feature request forms. Starring the repo helps too.
Found a security problem? Please don't open a public issue; see SECURITY.md.
Native Android apps for self-hosted services and everyday tools, all with the same design.
| App | What it's for |
|---|---|
| AdCtrl | Control your AdGuard Home DNS server |
| ArrCtrl | Radarr, Sonarr, Prowlarr, Bazarr, qBittorrent, autobrr and Cleanuparr in one app |
| BeamCtrl | TV remote for phones with an IR blaster |
| CallCtrl | Phone app: dialer, call history and in-call screen |
| CameraCtrl | Private camera with RAW (DNG) on every lens |
| ChatCtrl | Matrix chat client for matrix.org and self-hosted Synapse |
| ClockCtrl | Alarms, timers, stopwatch and world clock |
| ContactCtrl | Contacts: browse, edit, import and export |
| CraftyCtrl | Manage Minecraft servers on Crafty Controller |
| DateCtrl | Calendar for the calendars on your phone and your accounts |
| FilesCtrl | File manager with NFS, SMB, SFTP, FTP and WebDAV |
| FrigateCtrl | Watch and review your Frigate NVR cameras |
| GalleryCtrl | Private, offline gallery with an encrypted vault |
| ImmichCtrl | Photos and backup for your Immich server |
| JellyCtrl | Movies, shows, music and Live TV from Jellyfin |
| LijnCtrl | Live De Lijn bus and tram departures |
| LumenCtrl | Private, offline photo and video editor |
| MailCtrl | Email for Gmail and Proton Mail |
| MapsCtrl (this app) | Private, offline maps and navigation |
| MemoCtrl | Notes on your Memos server |
| NaviCtrl | Music player for Navidrome servers |
| PaperCtrl | Scan and browse documents on Paperless-ngx |
| PrintCtrl | Bambu Lab printers through Bambuddy, and Spoolman spools |
| ProxCtrl | Manage your Proxmox VE server |
| RecorderCtrl | Private, offline voice recorder |
| RideCtrl | Offline maintenance, fuel and mod log for your vehicles |
| SeerrCtrl | Request movies and shows on Seerr / Jellyseerr |
| ShutterCtrl | Remote control and photo transfer for Canon cameras |
| SoundCtrl | JBL headphones and speakers, without the account |
| SumCtrl | Offline calculator, unit converter and work tools |
| SynapseCtrl | Administer your Matrix Synapse server |
| TalkCtrl | Cardo intercom settings, radio and updates |
| TapoCtrl | Tapo plugs and bulbs on your home network |
| TextCtrl | Private SMS and MMS messaging |
| TrueCtrl | Monitor and manage your TrueNAS server |
| WakeCtrl | Keep the screen awake, per app or while charging |
| WrtCtrl | Manage your OpenWrt router |
MapsCtrl is licensed under the GNU General Public License v3.0. © VKNXWorks
- Map data: © OpenStreetMap contributors, available under the Open Database License (ODbL). Maps and search data are the Mapsforge files from download.mapsforge.org; routing data is BRouter's from brouter.de; both are made from OpenStreetMap.
- Terrain data for hillshading: Terrain Tiles by Mapzen / Tilezen on AWS Open Data (the "skadi"
.hgttiles), made from SRTM, GMTED2010 and 3DEP (courtesy of the U.S. Geological Survey), ETOPO1 (NOAA), EU-DEM (produced using Copernicus data and information funded by the European Union) and national sources including © Kartverket, © Commonwealth of Australia (Geoscience Australia) 2017, LINZ, Canada's CDEM (Open Government Licence – Canada), INEGI and the UK Environment Agency. The sources are public domain or open licences that allow redistribution with attribution; the full list and wording are in Tilezen's attribution document. - Public transport journeys: Transitous, a free, community-run MOTIS service, from timetables published by transport operators (sources and their licences). MapsCtrl links to the sources from every transit result.
- Mapsforge draws the maps: LGPL-3.0, used unchanged from Maven Central. MapsCtrl's map style (
CtrlRenderTheme) and symbols are its own. - BRouter works out routes: MIT licence. Its routing core and the car, bike and foot profiles are included unchanged in
brouter/andapp/src/main/assets/brouter/(see brouter/LICENSE). - AndroidSVG (Apache 2.0) draws the map symbols. SQLite (public domain), bundled through AndroidX's sqlite-bundled, reads the search data (Android's own SQLite lacks the R-tree and full-text modules it needs). AndroidX, Jetpack Compose, Material 3 and Kotlin libraries are Apache 2.0.
- Fonts, bundled in the app (nothing is downloaded): Space Grotesk and JetBrains Mono, both under the SIL Open Font License 1.1 (FONT-LICENSE-SpaceGrotesk.txt, FONT-LICENSE-JetBrainsMono.txt).
