ExplorInk
GitHub

Working prototype · active development · open source

A paper map that knows where you are.

ExplorInk is an open-source map for e-ink readers: on foot in a city, on a trail, on a bike, on a motorbike, out of a car window, anywhere you go looking. A map you read by daylight: reflective panel, no backlight to wash out, no battery gone by lunch.

The X4 panel drawing a town: outlined buildings, hatched forest, roads of different widths
real panel buildings, forest and water, 960 ms
  • 4.3″e-ink, 480×800, 220 PPI
  • about 25 hbattery slope on an X4, map open, phone linked
  • 0bytes needed for ground you already have

in the world

Photographs of it in use, not renderings.

A hand in a city square, a cafe table, a bar, a fuel tank, a dashboard, a desk, morning sun through a windscreen. Every one of these is a camera pointed at the panel while somebody was reading it, and what is on the screen is whatever the device was drawing at that moment. Click one for the full photograph.

An e-ink reader held flat in one hand in a sunlit Barcelona square, its panel showing an ExplorInk street map of Ciutat Vella with a position dot, a pin at 12 km and a 500 m scale bar, the arcade and palm trees of the square out of focus behind it
In a hand, in a city, in full sun. Carried on a strap, not mounted to anything.
The same e-ink reader lying on a dark wooden cafe table beside a camera bag, its panel filling the frame with an ExplorInk map of central Barcelona in which every street of the Eixample grid is legible
On a cafe table between two walks. Every street of the grid resolves.
The LilyGo T5 E-Paper S3 Pro held by a black clamp mount on the fuel tank of a parked cruiser, its panel showing an ExplorInk street map with a position marker, pins at the edge and the button labels along the bottom
On a fuel tank, open air. Nothing 3D printed, nothing fitted to the bike.
Xteink X4 in a bar mount on a motorcycle handlebar, chrome headlight and speedometer beside it, the panel showing a city map with the place name and clock along the top
A motorcycle bar, an overcast morning. No backlight and no sun shade.
The LilyGo T5 E-Paper S3 Pro clipped to a car dashboard mount in direct morning sunlight, its panel showing an ExplorInk map with every line legible and no backlight
Sun straight on the glass, frontlight off. Nothing on the screen washes out.
Xteink X4 held on a magnetic car dashboard mount next to the car's own navigation screen, showing a schematic map with a position marker and the button labels
A car dashboard, beside the car’s own navigation screen.
The LilyGo T5 E-Paper S3 Pro standing on a desk with its frontlight on, showing an ExplorInk map of central Bratislava with the Danube across the middle, a position marker, a compass and a scale bar
Our firmware on somebody else’s board. The panel reads warm because the frontlight is on.

The freedom of a paper map, plus a dot that knows where you are. Drop a Camp pin and when it goes off the screen you get an arrow at the edge pointing at it, with 23 km under it.

It does not give directions. No routing, no voice, no rerouting: miss a turn and you notice it the way you would on paper, by looking. What it replaces is the phone as your screen. The phone stays in your pocket, sending its GPS fix over Bluetooth, and stops being the thing you look at.

The map has no edge. No region packs to pick and manage. Switch auto-sync on and moving onto a square nobody has built is the request: the reader asks the phone, the public tile server builds it inside five minutes, and it draws while you keep moving. New ground needs the phone to have signal at that moment. Everything already on the card stays readable with no signal at all, and the reader’s sync screen fills in the squares it noticed were missing while you were out, at home, over a real connection. Both, not one or the other.

It runs today, on real hardware: firmware on three Xteink readers and one development board, the app on the phone in your pocket. Every screen on this page came off a real panel, except the one tagged preview, which says so.

Built on CrossPoint Reader. Map data © OpenStreetMap contributors.

how you use it

Four buttons, and the screen says what they do.

There is no menu tree to learn. The bottom row of the panel always names the four buttons under it, and the names change with the screen you are on. Here is the whole device in the order you meet it. Every frame came off a real panel; click one to see it at full size.

  1. Home screen: a line drawing of mountains with the ExplorInk mark over it, then rows reading Explore, Trips, Group with a LoRa label, Sync, File Transfer and Settings

    01

    Home

    Six rows and nothing live on any of them. Explore is the map, and it is the row you want nearly every time. Group only appears on a reader that carries a radio.

    Up Down move, Select opens

  2. X4 panel drawing a town: outlined buildings with dithered interiors, hatched forest, roads of different widths

    02

    The map, following you

    The phone stays in your pocket and sends its fix over Bluetooth. The marker moves with it and the map itself holds still, because every redraw costs a panel refresh. It only slides when the marker gets near an edge.

    Exit goes back Home

  3. X4 panel at 45 metres per pixel: a road network winding through a large hatched forest area, dots marking villages along the roads, a small position marker near the centre, scale bar showing 5 km

    03

    Zoom, seven rungs

    One metre per pixel at the closest, 45 at the widest. Two small boxes down the side of the panel carry a plus and a minus, so you can tell which button is which without taking your eyes off the map. The scale bar says where you are on the ladder.

    Up zooms in, Down zooms out

  4. X4 panel at 45 metres per pixel with ten place names on it: the nearest town in bold, villages lighter, each name outlined in white over the hatched forest and the road network

    04

    It names what you are looking at

    Pull back and the towns and villages get named, each one outlined in white so the road underneath still reads. Come back in close on the tourist map and the streets get named too, along the street rather than across it.

    Select opens Options

  5. X4 panel showing a city map with a status row along the top: the place name on the left, then the time, a Bluetooth icon with signal bars, and the battery percentage

    05

    The row along the top

    Where you are, the time, the link to the phone with its signal, and the battery. One line, redrawn once a minute, and the refresh is a 36 pixel band across the top rather than the whole panel.

    always on, nothing to press

  6. X4 panel over a dense city of individually drawn buildings: a meet pin, a numbered landmark pin marked 1, a parking pin near the position marker, and a far-off favorite pin shown at the edge as a heart icon reading 1254 km

    06

    Pins, and the one off the screen

    Park here, camp here, meet here. A pin is saved at your position and is still there after a reboot. One that has gone off the panel turns into an arrow at the edge with the distance under it, which is the whole answer to where did I leave the car.

    Select, then Pins

  7. Real X4 Pro framebuffer: a trip picker headed Load a trip, listing three trips with their point counts above a highlighted row, and a first row offering to continue to the map with no trip

    07

    A trip comes from the phone

    Plan the stops in Google Maps, share the link, pick ExplorInk. The app works the road route out from the stops and sends it over. The picker lists what is on the card with the number of points in each.

    Up Down pick, Select loads

  8. Real X4 Pro framebuffer: a town map near Modra with a planned trip drawn as a thick black line running across it and the position marker sitting on that line

    08

    The trip is a line, not a set of orders

    It draws with the map and then it leaves you alone. No turn prompts, no voice, no recalculating. Miss a turn and you notice it the way you would on paper, by looking at where the line went.

    nothing to press, it just draws

  9. X4 panel showing a planned route as a thick black line winding through the Male Karpaty hills, past Malacky, Stupava, Marianka and Svaty Jur

    09

    The whole thing at once

    One row frames the entire trip on one panel, start to finish, whatever rung you were on. It is how you read the shape of a day before you set off, and how you find your way back to it afterwards.

    Select, then Whole trip

  10. X4 panel drawn track-up over a motorway interchange: the north indicator rotated to the upper right, the position marker's arrow pointing up

    10

    Turn the map, or turn yourself

    Track-up puts your direction of travel up the panel and swings the north indicator instead, which is what you want walking an old town. North-up is one row away in the same menu, and that is the one you want reading a valley.

    Select, then Rotation

That is the device. The four screens it also has are a desk job rather than a ride: Sync fills in the squares you walked off the edge of, File Transfer moves files over WiFi, Settings is five tabs, and Group shows the rest of a walking party on a reader with a radio. Install it today, or see every frame we have.

01 · why e-ink

A phone is a bad map when you need it open all day.

The screen washes out in direct sun. It cooks in a mount. The battery you also need for photographs and a phone call is the one running the screen. A motorbike makes every one of those worse and adds vibration, gloves and rain, which is why this started there, and a phone strapped to a bar bag on a long walk fails the same way. E-ink has the opposite properties, and one hard cost you have to design around.

What a day in a mount does to a phoneThe detail
Heat. Apple’s own spec says an iPhone is made for 0 to 35 °C ambient a dark mount in full sun sits above that, and the phone throttles to protect itself (Apple’s note)
Vibration. Apple says it plainly about its own hardware engine vibration can permanently damage the camera’s stabilisation, and the repair is a few hundred euro (Apple’s second note)
Gloves. Capacitive glass does not answer through winter gloves you stop, or you take a hand off the bars
Water. The mount is fine until the charging port is not an adventure riding school names water in the USB charging port as the first thing to die
Battery. The phone is also your camera, wallet and emergency call screen-on navigation is what empties it

Readable in daylight

Reflective panel, no backlight to wash out: it reads by the light already falling on it, the way paper does. Glance, done.

All day, and then some

The panel needs no power to hold a picture: current goes into changing it. The electronics still cost something, so with the map open and a phone linked an Xteink X4 drained 3.9 % an hour, which is about 25 hours on a charge. We quote 10 h+ publicly, because that comes off days out rather than a bench test. Tens of hours, not a phone-screen afternoon.

Slow, and grey

A clean refresh takes 1,684 ms, a fast one 500 ms, both measured on an Xteink X4. Four grey levels cost an extra waveform pass. That rules out a moving map.

So: a still picture

Position, route, surroundings: redrawn rarely, readable at a glance at speed. No rerouting, no voice, no traffic. The route is planned before you leave.

Free, and yours to install today

Firmware for the reader, the app for your phone. Both open source, both a real download, no account.

Download and install

Side by side with a phone, a Beeline and a Garmin, our own gaps included: how it compares. Rain, a dropped link, no phone at all: the FAQ answers those.

The panel numbers, and what they force on the renderer, are on drawing a map on e-ink; the hardware they were measured on is on the hardware page.

who it is for

Made for exploring, honest about each use.

One device, many ways to travel. What they share is the reason for carrying it: you are exploring, not following a line. The status of each use is different, so here it is without the sales gloss.

A city, on foot

The use this is built for now. You walk, you turn on what you see, and the reader says which quarter you are in and where the hotel is. Town, village and quarter names draw on the panel today, and since 0.2.2 so do street names at the two closest zooms of the tourist map. Drinking water is in the Useful places list. A toilet is not on the map yet.

Hiking, and the terrain half is new

Tens of hours on a charge and light in a pocket suit walking well. Contour lines with height numbers, rock faces, path difficulty and waymarked routes are in the map data. Rock faces and named landmarks have been drawn on a real panel. How contour lines read in the hand is still an open question rather than a claim.

Travelling by car, bus or overland

A second screen that does not steal the phone: the map stays open for hours while the phone keeps its charge for the camera and the calls. Abroad it draws from the card with no roaming, and the country you are crossing gets built as you reach it, whenever the phone has signal. Both halves have been run on the road: a thirteen hour day that ended with a Prague to Bratislava drive, and a drive across ground the map did not cover, where two of the four missing squares were built because the reader asked for them and drew a minute later, while it kept moving.

Motorcycle adventure and trail riding

Where the project started, and the mount is solved: dash or bar cradle, gloves on the buttons, ride and hike and tourist road filters, a route framed whole before you set off, pins for camp and fuel. Tested on a real bike.

Bikepacking and gravel

Same needs, a different mount. An ordinary phone bar cradle holds it, which is what the motorcycle shots use, but nothing has been ridden far enough on gravel to say what shakes loose. Everything on the screen already suits a long day at 20 km/h.

02 · the screen

Real framebuffers, not mockups.

The ones tagged device came off the panel over USB: send a coordinate and the device draws what is around it from tiles on its SD card. The one tagged preview is the same renderer running on a laptop against the same tiles, which is how styling gets tuned without reflashing. We keep the two labelled apart on purpose.

Honest caveat: the device renderer follows most of the style spec now: road widths and casings, buildings, forest, built-up, filled water with waves, and railways as a blocked line all draw on the panel, and the route draws with them, and so do place names, street names, summits and named landmarks, rock areas and stairs. Junction dots exist in the spec, not yet on the glass, and neither do the edge markers for a village just off the screen. The laptop preview is the other way round for the route: it renders everything here except the route line, so that one is judged on the device only.

How the names get on the glass without blanking out the map: place labels on a one-bit panel. Why the map stands still while the marker moves: the track-up map. Where the rest of a walking group is when there is no phone signal: group positions over LoRa, on the one board that carries a radio.

03 · how it is built

Four parts. All four exist.

  1. 01

    Map builder laptop

    Fetches an area from OpenStreetMap, projects and clips it, routes along real roads, and writes binary .tib tiles at three levels of detail. A browser tuning tool renders a pixel-exact 480×800 preview, so the styling gets judged as e-ink instead of as a pretty vector map. How the tiles are built.

  2. 02

    Tile server tiles.explorink.com

    The built maps are on a public server, so nobody has to run the map builder to go riding: the phone downloads the squares the reader is missing, one plain file per square, and reads a small index to tell an empty square from one nobody has built, and a square that has gone out of date from a current one.

    It also builds what it does not have. A square that comes back missing is written to the server’s own log, and a builder on the host takes the ten most-asked-for squares of the last day and builds them from OpenStreetMap straight into what it serves, usually inside five minutes for a 13 by 13 km area. A published area is rebuilt only when the drawing rules change and have held still for 12 hours, one area at a time, and the day is capped, so an unattended builder cannot run away with the disk.

  3. 03

    Firmware ExplorInk, on the reader

    A fork of CrossPoint Reader, MIT licensed and public. Map screen, BLE position receiver, tiles off the SD card, zoom and marker height on the physical buttons, ride / hike / tourist filter, pins, and a command console over USB serial and BLE. The e-reader stack comes out; maps go in. Source on GitHub.

  4. 04

    Phone app Android · iOS planned

    Sends the phone's GPS fix to the device over BLE when the fix has actually moved, at most every 7 seconds, and records every fix and packet for replay. One window, no settings screen, foreground service: it keeps sending with the phone locked in a bag. It touches GPS only while the reader is actually connected, and shuts itself down a few minutes after the reader goes away. The reader opening its map starts it again. It is also the reader’s way to the tile server. What the phone app does, and where iOS stands, how the BLE bridge works, or the app source.

OpenStreetMap map builder laptop, or the server itself tile server tiles.explorink.com phone over BLE SD card .tib tiles e-ink panel phone GPS over BLE

The whole chain, part by part: what each piece hands the next one, and why it is split this way.

what it costs

You will never pay to read a map.

Outdoor mapping is a subscription business. Maps that work without signal usually sit behind the paid tier: onX Backcountry lists $30 to $100 a year across its two tiers, and that is one app, forever. Abroad without downloaded maps you pay again in roaming.

The software is free and open

Firmware and phone app, MIT licensed, source public. No account, no login, no trial.

The maps are OpenStreetMap

No licence to buy, no region to buy. A square on your card is yours, offline, forever.

If we ever charge, we will tell you what for

Building and hosting tiles on our servers costs money every month. A paid tier, if it comes, covers that: priority builds and hosted access. Never the firmware, never the app, never a map already on your card.

04 · status

What works today.

A working prototype, in active development. Formats, the render spec and the BLE protocol still change without notice, so do not build on them yet. The short list of what is on the device now:

  • Firmware: map screen drawing OSM tiles off the SD card, on real hardwareworks
  • Firmware: BLE position receiver; the phone app sends the fix and records the rideworks
  • The marker follows the fix; the map only redraws when it has toworks
  • Seven zoom rungs, 1 to 45 m/px, on the physical buttonsworks
  • Track-up or north-up map, with the north indicator turning with itworks
  • Town and village names on the map, outlined in white, kept off the routeworks
  • Routes: build one from waypoints, a GPX file or a recorded ride, and see all of it at onceworks
  • Trips: a route shared out of Google Maps on the phone is on the reader, drawn on the mapworks
  • Public tile server, live: maps served square by square, so nobody has to build oneworks
  • Missing squares fetched mid-ride: the device asks, the phone brings them over BLEworks
  • The tile server builds what riders ask for, unattended, and the square is usually on the server inside five minutesworks
  • Pins (park here, camp here) saved at your position and still there after a rebootworks
  • Phone app: read, save and delete the reader's pins from a coordinate, a geo: link or a shared map linkworks
  • Open the map and the phone starts sending on its own, app closed, nothing tappedworks
  • Downloads: firmware images and the Android APK, with an install guideworks
  • Tile server: builds the version-4 tile format, and keeps serving version 3 for readers still on the older firmwareworks
  • Useful places: water, shelter, huts, fuel, medical and a way out, searched 25 km around you and drawn on the mapworks
  • A pin off the edge of the screen still says which way it is and how farworks
  • Phone app: queue a whole area before you go, resumable if the link dropsworks
  • Street names along the street, tourist map at the two closest zooms, three and two per screenworks
  • Rock faces and named landmarks on the hike map, drawn on a real panelworks
  • Browser flasher at /flash/, from a desktop Chromium browserworks
  • Contour lines and height numbers on the hike map, not yet judged on a panelon the bench
  • Renderer: junction dots and off-screen place markersplanned
  • A release-signed Android app in a storeplanned

That is the short list. The full status list is on the development page, item by item, next to the dated log of when each one landed. Everything marked works is on a reader you flash yourself today.

05 · development log

Recent work, newest first.

  1. The map starts naming streets, and 0.2.2 is out for three boards

    In the tourist map the two closest zooms now name the streets: three names at the closest, two at the next, each set along its street with a white halo. A name that does not fit its straight run of road is refused rather than squeezed. Names live in a new layer of the map tiles, so tiles already on a card draw as before and simply have none until that ground is downloaded again. Firmware 0.2.2 ran on an X3, an X4 Pro and a LilyGo T5 S3 Pro the same day, all three built from one commit.

    How the map decides which streets to name

  2. Walking a city got its own map, and stairs are drawn for the first time

    A pedestrian zone is now the widest road on the screen, because in an old town it is the main street. Lanes shared with delivery vans are drawn, stairs appear as a ladder for the first time in any mode, and footpaths drop out once the view pulls back so they do not bury the rest. Running on a real X3, framebuffer pulled off the panel the same day.

    Why footpaths come off the screen

  3. A trip planned in Google Maps now lands on the reader

    Plan a route on the phone with a handful of stops, share it, pick ExplorInk, and the trip is on the reader’s card and drawn across the map. A shared link carries the stops and no line, so the route is worked out from them along real roads and will differ from what Google Maps drew; the app says so, and lists every stop before anything is sent. It stays a line on a paper map: no turn instructions, no recalculating, no voice.

    How a shared link becomes a trip

The full dated log: every entry, newest first, next to the status list. The repo carries one topic document per hardware finding: how the panel actually behaves, and why the obvious approach fails.

06 · the hardware

A reader off the shelf, not a dev board

A pocket e-ink reader, bought off the shelf. Not a dev board, not Android, no ADB: a microcontroller with a display driver and physical buttons. Everything ExplorInk does has to fit in that. Two builds cover the three Xteink readers. One is for the X4 and X3, both ESP32-C3, and it probes which panel it woke up on. The other is for the X4 Pro, an ESP32-S3 with touch, a frontlight and far more room: 172 kB free with the map up, against 58 kB on the X4. A third build covers the LilyGo T5 S3 Pro, a development board with its own GNSS receiver that we validate on.

The figures below are the X4’s, measured on one.

Panel
4.3″ e-ink, 480×800, 220 PPI, no touch
Grey
4 levels; 500 ms fast refresh, 1,684 ms clean, measured; map fills use 2×2 dither
SoC
ESP32-C3, WiFi + Bluetooth 5 LE
Heap
247 KB total; 58.5 KB free with the map and BLE up, measured
Storage
16 MB internal flash, maps on a separate SD card
Input
Physical buttons only, usable with gloves
Mount
Magnetic back: any MagSafe phone mount, bars, stem or dash

What hardware ExplorInk runs on, and everything we measured on the Xteink X4.

Xteink X4 in a bar mount on a motorcycle handlebar, chrome headlight and speedometer beside it, the panel showing a city map with the place name and clock along the top, a home pin at 5.4 km and a 500 m scale bar
A motorcycle bar, an overcast morning, no backlight and no sun shade. That is the whole point of e-ink.
Xteink X4 held on a magnetic car dashboard mount next to the car's own navigation screen, showing a real schematic map with a position marker, zoom controls and Exit/Select/Up/Down button labels
Real test drive, real panel: ride time, tiles read and draw time in the debug line up top. The position numbers on that line are blurred out.

07 · early access

Installs today from a download. Hear from us when the store app lands.

You can put ExplorInk on a reader right now, and there is nothing to build: a firmware download per reader and the Android APK are published files, the maps come off the public tile server with nothing to set up, and the install page has the commands next to the downloads. From a desktop Chromium browser the flasher writes the firmware over USB with no command line; other browsers use one command line tool. What does not exist yet is a signed app in a store. That is what comes next. Leave an address and you hear from us once, when it is ready.

Do you already own an Xteink reader: X4, X4 Pro or X3?

One address, held by Comsultia, s.r.o. and used only to tell you when ExplorInk installs without a toolchain. No list, no sharing, no newsletter.

08 · get in touch

Built at Comsultia, in the open.

ExplorInk is developed by Comsultia, s.r.o., a software company in Slovakia. It started because I ride, and I wanted a display that survives a sunny day on a handlebar. The firmware and the phone app are public and MIT licensed, and every hardware finding is written down in the firmware repo. If you are doing something similar on e-ink reader hardware, or you want to try it, or you just want to tell me the map style is wrong, write to us.

Email

info@explorink.com

Company

comsultia.com

Comsultia, s.r.o., the company behind ExplorInk.

Code

github.com/rfordinal/explorink

Firmware, docs and every hardware finding. MIT licensed. The phone app is at explorink-android.