Skip to content

Repository files navigation

lookout charts — reMarkable

⚓ A monochrome, e-ink-first nautical chart viewer for the reMarkable tablet.
Renders prebaked tile57 charts (S-57/S-101 → S-52 portrayal) behind a reMarkable-style Qt 6 UI. It never bakes — it only renders archives produced elsewhere by tile57 bake.


Not for navigation. Built on the tile57 engine, an AI-written experiment in implementing the IHO chart specs — not a certified navigation product.

What it is

A viewer, not a plotter. It opens a baked <CELL>.pmtiles archive — or a whole directory of them, stitched into one seamless chart by tile57's runtime compositor — and draws it with the native tile57 S-52 pixel pipeline. On top of the chart it puts two pieces of chrome:

  • a readout bar — band · scale · zoom · position, plus an overscale warning when you zoom past the survey scale;
  • a settings panel — the S-52 mariner display options (detail level, day/dusk/night, depth contours & safety depth, four-shade water, boundary and symbol style, text layers, area-overlay declutter, SCAMIN, symbol size).

Everything is flat black ink on white paper — hairline rules, no shadows, generous touch targets — following the reMarkable idiom. Pan by dragging, zoom by pinch / scroll / the ± buttons (snapped to integer levels), and tap a feature to pop up a pick report (its S-57 class + attributes).

The chart renders as an async raster tile pyramid: an off-thread worker paints 512-px web-mercator tiles through tile57's vector-canvas API (S-52 draw calls painted into a QImage with QPainter), which the UI thread caches and composites. So pan/zoom never block, and revisited areas are instant — the right cadence for slow e-ink redraws.

Layout

src/       C++: RenderWorker (async engine thread), ChartView (tile pyramid),
           tile57 wrapper, MarinerSettings
qml/       Qt Quick UI: Theme, Hud, SettingsPanel, IdentifyPopup, components
docker/    Dockerfile.sdk (reMarkable-SDK image) + in-container build scripts
cmake/     cross-compile toolchains
scripts/   setup-sdk.sh, sdk-build.sh, deploy.sh, build-engine.sh
device/    launch.sh — runs on the tablet (epaper by default)
Makefile   the build / deploy front door

The app links libtile57.a (the engine's C ABI, ../tile57/include/tile57.h); no engine sources are vendored.


Quick start (Docker — recommended)

Everything cross-builds inside Docker, so it works the same on macOS, Linux, and Windows/WSL — no local Qt or toolchain. It builds against the reMarkable SDK's own Qt, so the binary runs on the device's epaper platform directly (no bundle, no rm2fb).

You need: Docker and a tile57 checkout at ../tile57. That's it — make image auto-picks the current rM2 SDK for your host arch.

make image      # once: bake the reMarkable SDK (Qt6 + epaper) into an image (~cached)
make            # -> build-rm2-sdk/lookoutviewer  (device-Qt epaper binary)
make deploy     # copy it + your charts to the tablet (with a progress bar)
make run        # build + deploy + launch on the device

make help lists every target; make sdk-url prints the SDK URL it will use. Override defaults inline or in a git-ignored config.mk: DEVICE (rm2 | rmpp), HOST (ssh target), CHART (file/folder), SDK_URL (other firmware / Paper Pro — see developer.remarkable.com/links).

Apple Silicon Mac: make builds a native linux/arm64 container (no emulation) and auto-selects the aarch64 SDK — nothing to configure.


Preparing charts

The viewer only renders; bake on the desktop with the tile57 CLI, then let make deploy copy the .pmtiles to the device.

cd ../tile57 && zig build            # builds zig-out/bin/tile57
./zig-out/bin/tile57 bake CELL.000 -o out/          # one cell
./zig-out/bin/tile57 bake ENC_ROOT/ -o out/         # a whole catalogue
# -> out/tiles/<CELL>.pmtiles  (+ out/partition.tpart)

Point the viewer at one out/tiles/<CELL>.pmtiles, or at the whole out/ directory to quilt every cell into one seamless view. NOAA ENC cells are U.S. public domain (and not for navigation).


Running on the tablet

Enable developer mode / SSH (rM2); over USB the tablet is root@10.11.99.1 (password under Settings → General → Help → Copyrights and licenses). make run deploys and launches; by hand on the tablet:

/home/root/lookoutviewer/launch.sh /home/root/lookoutviewer/charts

launch.sh stops the stock UI (xochitl), sets touch orientation, and runs fullscreen on reMarkable's epaper platform. If taps land wrong, override QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS (rM2 default rotate=180:invertx). Drop packaging/rm2.draft in /opt/etc/draft/ (or use rm-appload) so you don't need SSH each time.


Display notes for e-ink

  • The chrome (HUD, panel, popups) is pure black-on-white — high contrast and ghost-free on e-ink. The chart uses the S-52 day/dusk/night palette (the panel switches it); on a grayscale panel "day" reads best. Antialiasing is off on epaper for crisper, faster raster.
  • The scale readout is a physical ruler-on-the-glass value; it assumes the rM2 pixel pitch (≈0.1124 mm, 226 dpi). Set ChartView.pixelPitchMm for another panel (the Paper Pro is ≈0.111).
  • Rendering is coarse-then-sharp: a pan/zoom instantly shows cached tiles (or a scaled coarser tile as a placeholder), then sharp tiles stream in — one e-ink refresh per settle, not one per tile.

Development

Build on your desktop to iterate on the UI (needs local Qt 6.5+, CMake, Zig):

make host
./build/lookoutviewer charts/

Env knobs (no effect unless set): LOOKOUT_SCHEME=0|1|2 (day/dusk/night), LOOKOUT_START_ZOOM=N, LOOKOUT_OPEN_SETTINGS=1, LOOKOUT_FULLSCREEN=1, LOOKOUT_NO_AA / LOOKOUT_GRAY (e-ink raster knobs), LOOKOUT_SHOT=out.png (grab the window after it settles, then exit — for headless verification).


Advanced: linuxfb bundle (old firmware without epaper)

If your firmware's Qt has no epaper plugin, build a self-contained Qt-6.4 / linuxfb bundle instead and run it via rm2fb:

make bundle                          # -> dist/rm2/ (binary + launch.sh + Qt runtime)
scripts/deploy.sh dist/rm2 charts/
# on device:  USE_BUNDLE=1 RM2FB_CLIENT=/…/librm2fb_client.so.1 launch.sh charts

To drive the SDK build without Docker (on an x86_64 Linux host), use scripts/setup-sdk.sh <url> then scripts/sdk-build.sh <env-setup> rm2 — see those scripts' headers.


AI-First Development

This project is built with AI assistance. We encourage contributors to use AI tools for development and to contribute by providing clear requirements and/or a prototype of what they'd like rather than code. See the tile57 contributing guide.

License

MIT © Jeremy Collins. Renders charts via tile57 (MIT); embeds the IHO S-101 Portrayal Catalogue through the engine. Not for navigation.

About

⚓ A monochrome, e-ink-first nautical chart viewer for the reMarkable tablet.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages