exp78/rmweb

Native WPE WebKit browser for the reMarkable Paper Pro e-ink tablet

4

stars

149

commits

C++

primary language

Aug 28, 2026

updated

browser
e-ink
eink
embedded
remarkable
remarkable-paper-pro
webkit
wpe

README

rmweb

A native WPE WebKit web browser for the reMarkable Paper Pro e-ink tablet.

start page

Status: v0.9.1 — beta. The primary use case is reading; general browsing is basic. Implemented and verified on-device: reader mode (Mozilla Readability, light/dark theme), B2 chrome painted into the frame (with C++ hit-test and inverted press feedback on every button and key), touch input via evdev with a phantom-touch guard, on-screen URL keyboard, bookmarks/history/ settings persisted in the profile dir, a redesigned HTML start page (rmweb: scheme) with letter avatars and a tabs-lite open-pages switcher, a separate settings page (tap-to-toggle rows, applies immediately), page/reader zoom, content blocking (WebKit UserContentManager filter) with cosmetic rules that collapse blocked-ad containers (no white holes), an e-ink calm-down stylesheet (kills CSS animations/transitions/smooth scrolling), an auto-refresh guard that throttles pages reloading themselves while you read, a loading pill with progress and a stop button, persistent cookies (sqlite — logins survive relaunch), per-URL scroll restore, in-page find (/text in the address bar), downloads to ~/Downloads, form filling (tap a text field → on-screen keyboard with its current value, password masked; tap toggles checkbox/radio and cycles selects), learn-as-you-type autofill for email/username/name fields (passwords are never learned), a per-host password store (obfuscated — NOT encrypted), styled error pages with Retry, a TLS padlock, address-bar search over local bookmarks+history (with a web-search link), long-press link peek, a B&W fast mode (grayscale present + the fast mono waveform) and a mobile/desktop UA toggle (both in Settings), a KOReader-style reading-progress bar, a coherent Lucide icon set drawn as vectors (crisp on e-ink, font-independent), a home-screen icon in the stock launcher (XOVI + AppLoad), and a no-brick launcher that stops/restores xochitl. E-ink-safe: CPU-only llvmpipe + Skia, ~120–250 ms page turns, low RAM. A 2026-07-18 code review (docs/review-2026-07-18.md) found open security/robustness issues; the HIGH/CRITICAL items were fixed after it (see git log), but treat this as enthusiast-grade beta software, not a hardened product.

Screenshots

Wikipediae-ink labsettings
Wikipediae-ink lab (animations frozen, ad slots collapsed)Settings page

More: loading pill with stop button

Why it's interesting

The Paper Pro's i.MX8M Mini SoC actually has a GPU on die (Vivante GC7000 UltraLite), but the stock OS ships no driver for it (no /dev/dri render node) — so in practice everything renders on the CPU. rmweb renders the web entirely in software — Skia CPU raster + Mesa llvmpipe (software EGL) — and presents through reMarkable's e-ink display path.

Architecture (short)

input (touch) → shell (hand-painted C++ chrome on a QQuickPaintedItem) → engine (WPE, software GL)
        ARGB8888 frame → display (Qt6 + epaper QPA) → imx-drm → E-Ink 1620×2160

The design's five modules folded into engine/wpeqt (input/shell/display inside main.cpp), plus device/ for the on-device glue. Full design: docs/superpowers/specs/2026-06-24-rmweb-browser-design.md. Verified hardware facts: docs/device-profile.md.

Target device

reMarkable Paper Pro ("Ferrari"), Codex Linux (scarthgap), aarch64, kernel 6.12.49. GPU exists on the SoC but has no driver in the stock OS, so rendering is CPU-only. Everything installs under /home/root/rmweb (the rootfs is full). Cross-compiled with the official reMarkable "ferrari" Yocto SDK.

Build & Install

Prebuilt archives on GitHub Releases install without any toolchain — see docs/install.md.

Building from source needs a linux/arm64 Docker engine (on macOS: colima + docker-buildx) and the reMarkable Yocto SDK — setup in toolchain/README.md. The WPE WebKit + Mesa build takes hours and tens of GB of disk.

./scripts/fetch-sdk.sh                                # download the Yocto SDK once
docker build -f toolchain/Dockerfile -t rmweb-sdk .   # cross-compile image
./scripts/build-wpe.sh deps                           # WPE WebKit deps + Mesa llvmpipe (hours)
./scripts/build-wpe.sh build                          # WPE WebKit itself
./scripts/build-wpeqt.sh                              # build rmweb-wpeqt
./scripts/bundle.sh                                   # create device bundle
./scripts/run-wpeqt-on-device.sh show https://example.com

Full instructions: docs/install.md

Roadmap / Planned

Not implemented yet (earlier docs claimed some of these by mistake — see the review above): on-device JS console, user/content scripts, performance dashboard.

Credits & License

MIT — see the file for details. Third-party components (WPE WebKit, Qt6, Mesa, Mozilla Readability, Lucide icons, XOVI/AppLoad) and their licenses are listed in NOTICE.

Co-developed with AI pair-programming — many thanks to Claude Code (Anthropic), Grok (xAI) and Kimi (Moonshot AI), who wrote and reviewed large parts of this project.

Contributors

exp78

149 commits

exp78/rmweb

Native WPE WebKit browser for the reMarkable Paper Pro e-ink tablet

4

stars

149

commits

C++

primary language

Aug 28, 2026

updated

browser
e-ink
eink
embedded
remarkable
remarkable-paper-pro
webkit
wpe

README

rmweb

A native WPE WebKit web browser for the reMarkable Paper Pro e-ink tablet.

start page

Status: v0.9.1 — beta. The primary use case is reading; general browsing is basic. Implemented and verified on-device: reader mode (Mozilla Readability, light/dark theme), B2 chrome painted into the frame (with C++ hit-test and inverted press feedback on every button and key), touch input via evdev with a phantom-touch guard, on-screen URL keyboard, bookmarks/history/ settings persisted in the profile dir, a redesigned HTML start page (rmweb: scheme) with letter avatars and a tabs-lite open-pages switcher, a separate settings page (tap-to-toggle rows, applies immediately), page/reader zoom, content blocking (WebKit UserContentManager filter) with cosmetic rules that collapse blocked-ad containers (no white holes), an e-ink calm-down stylesheet (kills CSS animations/transitions/smooth scrolling), an auto-refresh guard that throttles pages reloading themselves while you read, a loading pill with progress and a stop button, persistent cookies (sqlite — logins survive relaunch), per-URL scroll restore, in-page find (/text in the address bar), downloads to ~/Downloads, form filling (tap a text field → on-screen keyboard with its current value, password masked; tap toggles checkbox/radio and cycles selects), learn-as-you-type autofill for email/username/name fields (passwords are never learned), a per-host password store (obfuscated — NOT encrypted), styled error pages with Retry, a TLS padlock, address-bar search over local bookmarks+history (with a web-search link), long-press link peek, a B&W fast mode (grayscale present + the fast mono waveform) and a mobile/desktop UA toggle (both in Settings), a KOReader-style reading-progress bar, a coherent Lucide icon set drawn as vectors (crisp on e-ink, font-independent), a home-screen icon in the stock launcher (XOVI + AppLoad), and a no-brick launcher that stops/restores xochitl. E-ink-safe: CPU-only llvmpipe + Skia, ~120–250 ms page turns, low RAM. A 2026-07-18 code review (docs/review-2026-07-18.md) found open security/robustness issues; the HIGH/CRITICAL items were fixed after it (see git log), but treat this as enthusiast-grade beta software, not a hardened product.

Screenshots

Wikipediae-ink labsettings
Wikipediae-ink lab (animations frozen, ad slots collapsed)Settings page

More: loading pill with stop button

Why it's interesting

The Paper Pro's i.MX8M Mini SoC actually has a GPU on die (Vivante GC7000 UltraLite), but the stock OS ships no driver for it (no /dev/dri render node) — so in practice everything renders on the CPU. rmweb renders the web entirely in software — Skia CPU raster + Mesa llvmpipe (software EGL) — and presents through reMarkable's e-ink display path.

Architecture (short)

input (touch) → shell (hand-painted C++ chrome on a QQuickPaintedItem) → engine (WPE, software GL)
        ARGB8888 frame → display (Qt6 + epaper QPA) → imx-drm → E-Ink 1620×2160

The design's five modules folded into engine/wpeqt (input/shell/display inside main.cpp), plus device/ for the on-device glue. Full design: docs/superpowers/specs/2026-06-24-rmweb-browser-design.md. Verified hardware facts: docs/device-profile.md.

Target device

reMarkable Paper Pro ("Ferrari"), Codex Linux (scarthgap), aarch64, kernel 6.12.49. GPU exists on the SoC but has no driver in the stock OS, so rendering is CPU-only. Everything installs under /home/root/rmweb (the rootfs is full). Cross-compiled with the official reMarkable "ferrari" Yocto SDK.

Build & Install

Prebuilt archives on GitHub Releases install without any toolchain — see docs/install.md.

Building from source needs a linux/arm64 Docker engine (on macOS: colima + docker-buildx) and the reMarkable Yocto SDK — setup in toolchain/README.md. The WPE WebKit + Mesa build takes hours and tens of GB of disk.

./scripts/fetch-sdk.sh                                # download the Yocto SDK once
docker build -f toolchain/Dockerfile -t rmweb-sdk .   # cross-compile image
./scripts/build-wpe.sh deps                           # WPE WebKit deps + Mesa llvmpipe (hours)
./scripts/build-wpe.sh build                          # WPE WebKit itself
./scripts/build-wpeqt.sh                              # build rmweb-wpeqt
./scripts/bundle.sh                                   # create device bundle
./scripts/run-wpeqt-on-device.sh show https://example.com

Full instructions: docs/install.md

Roadmap / Planned

Not implemented yet (earlier docs claimed some of these by mistake — see the review above): on-device JS console, user/content scripts, performance dashboard.

Credits & License

MIT — see the file for details. Third-party components (WPE WebKit, Qt6, Mesa, Mozilla Readability, Lucide icons, XOVI/AppLoad) and their licenses are listed in NOTICE.

Co-developed with AI pair-programming — many thanks to Claude Code (Anthropic), Grok (xAI) and Kimi (Moonshot AI), who wrote and reviewed large parts of this project.

Contributors

exp78

149 commits

Languages

C++

58.0%

Shell

19.0%

JavaScript

17.9%

C

4.3%