Run remarquee on the reMarkable device to capture screenshots, raw frames, and streams via REST and CLI.
Device capture lets you run remarquee on the tablet itself to read the framebuffer and expose it over HTTP. This gives you reliable screenshots and raw frame dumps without relying on cloud sync, and it provides a foundation for live streaming or UI automation.
The capture pipeline reads the framebuffer directly from the xochitl process via /proc/<pid>/mem, so it runs only on-device (and typically as root). The server provides a minimal REST API for raw bytes and PNG screenshots, and the CLI offers a client-side wrapper so you can grab frames from your workstation.
Key capabilities:
/api/v1/screenshot.png)/api/v1/screenshot.raw)/api/v1/stream)/api/v1/events)/api/v1/gestures)remarquee device info|screenshot|raw|stream|events|gestures)Start the capture server on the tablet and keep it running while you pull frames from your workstation.
# on the device (ssh root@remarkable)
/home/root/remarquee device serve --bind :2718 --username admin --password password
Notes:
--unsafe only on trusted networks.GOOS=linux GOARCH=arm64.Use the CLI from your workstation to fetch info, a PNG screenshot, or a raw frame dump.
# fetch device info (width/height/bytes)
remarquee device info --url http://10.11.99.1:2718 --username admin --password password
# grab a PNG screenshot
remarquee device screenshot --url http://10.11.99.1:2718 --username admin --password password --out ./screenshot.png
# grab a raw framebuffer dump
remarquee device raw --url http://10.11.99.1:2718 --username admin --password password --out ./screenshot.raw
The REST API is intentionally small so it can run on the device with minimal overhead. All endpoints use basic auth unless the server runs with --unsafe.
GET /api/v1/infoThis endpoint returns the device geometry and pixel format.
Response (example):
{
"model": "RemarkablePaperPro",
"width": 1632,
"height": 2154,
"bytesPerPixel": 4,
"screenSizeBytes": 14061312
}
GET /api/v1/screenshot.pngThis endpoint returns a PNG rendering of the current framebuffer state.
Response: Content-Type: image/png
GET /api/v1/screenshot.rawThis endpoint returns raw framebuffer bytes.
Response: Content-Type: application/octet-stream
Headers include:
X-Device-ModelX-Screen-WidthX-Screen-HeightX-Bytes-Per-PixelGET /api/v1/streamThis endpoint streams raw framebuffer bytes repeatedly at a fixed rate.
Query parameters:
rate — frame rate in milliseconds (default: 200, minimum: 100)Response: Content-Type: application/octet-stream (chunked)
GET /api/v1/eventsThis endpoint streams pen input events as Server-Sent Events (SSE).
Response: Content-Type: text/event-stream
Each SSE event contains a JSON payload like:
{"source":1,"type":3,"code":54,"value":12345}
GET /api/v1/gesturesThis endpoint streams gesture summaries as newline-delimited JSON (NDJSON).
Response: Content-Type: application/x-ndjson
Each line contains a JSON object like:
{"left":120,"right":0,"up":30,"down":0}
The remarquee device command group provides a thin wrapper around the REST API.
remarquee device serveStarts the HTTP server on the device.
remarquee device serve --bind :2718 --username admin --password password
remarquee device infoPrints the /api/v1/info JSON to stdout.
remarquee device info --url http://10.11.99.1:2718 --username admin --password password
remarquee device screenshotDownloads a PNG screenshot to a local file.
remarquee device screenshot --url http://10.11.99.1:2718 --username admin --password password --out ./screenshot.png
remarquee device rawDownloads raw framebuffer bytes.
remarquee device raw --url http://10.11.99.1:2718 --username admin --password password --out ./screenshot.raw
remarquee device streamStreams raw frames to a file for a fixed duration.
remarquee device stream --url http://10.11.99.1:2718 --username admin --password password \
--rate 200 --duration 5s --out ./stream.raw
remarquee device eventsStreams pen events as SSE and writes the raw output to a file or stdout.
remarquee device events --url http://10.11.99.1:2718 --username admin --password password \
--duration 5s --out ./events.sse
Use --duration 0 to stream until interrupted. If the device is idle, the output may be empty.
remarquee device gesturesStreams gesture summaries as NDJSON.
remarquee device gestures --url http://10.11.99.1:2718 --username admin --password password \
--duration 5s --out ./gestures.ndjson
Use --duration 0 to stream until interrupted. If the device is idle, the output may be empty.
Device capture requires an arm64 Linux binary with CGO disabled. The capture code reads from /proc/<pid>/mem, so it must run as root on the tablet.
# build on workstation
GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o /tmp/remarquee-arm64 ./cmd/remarquee
# deploy to device
scp /tmp/remarquee-arm64 root@10.11.99.1:/home/root/remarquee
Framebuffer access is privileged. Keep the following in mind:
--unsafe only for quick local tests.Common failure modes and fixes:
xochitl pid not found — ensure the UI process is running; reboot if needed.permission denied — run the server as root on the tablet./api/v1/info.Upcoming additions include: