A command-line tool for managing custom templates on reMarkable Paper Pro and
Paper Pro Move devices. It uploads template files over SSH and registers them
in the device's templates JSON, so you don't have to hand-edit
templates.json or restart xochitl yourself.
- Python 3.9+
- SSH access to the device (enabled in Settings > About > Copyrights and licenses, or Settings > Storage on newer firmware)
pip install paramiko scpThen either run rmtemplate.py directly, or install it as a rmtemplate
command:
pip install .rmtemplate.py connect --host 10.11.99.1 --password abc123
rmtemplate.py list
rmtemplate.py add watch-log.svg --name "Watch Log" --category "Planners"
rmtemplate.py remove --name "Watch Log"
rmtemplate.py backup
rmtemplate.py restore ~/.rmtemplate/backups/templates.json.20260101_120000.bak
rmtemplate.py restart
rmtemplate.py iconsconnect saves the device IP and SSH password to ~/.rmtemplate/config.ini
(permissions are set to owner-read/write only) so later commands don't need
--host/--password. Every command still accepts them directly if you'd
rather not persist credentials to disk.
| Command | Description |
|---|---|
connect |
Save device IP and SSH password for later commands |
list |
List all registered templates |
add |
Upload a .svg/.png file and register it as a template |
remove |
Unregister a template, optionally deleting its file |
backup |
Save the current templates JSON to ~/.rmtemplate/backups |
restore |
Restore templates JSON from a backup file |
restart |
Restart xochitl to pick up changes |
icons |
List available icon names and their hex codes |
templates/ has example templates you can install with add. The Paper Pro
and Paper Pro Move have different screens (1620x2160 portrait vs. 1696x954
landscape), so each template ships as two files — pick the one matching your
device:
| Template | Paper Pro | Paper Pro Move |
|---|---|---|
| Movie watch log | movie-watch-log-pro.svg |
movie-watch-log-move.svg |
| Book log | book-log-pro.svg |
book-log-move.svg |
| Workout tracker | workout-tracker-pro.svg |
workout-tracker-move.svg |
rmtemplate.py add templates/movie-watch-log-pro.svg --name "Movie Watch Log" --category "Planners"add figures out landscape vs. portrait from the file's own dimensions and
sets the JSON entry accordingly — you don't need to tell it which variant
you're uploading.
They're styled to match reMarkable's own templates — hairline strokes at
varying opacity instead of solid gray, dashed minor guide lines, and text
rendered as vector outlines rather than <text> elements (the on-device SVG
renderer's font handling isn't something to rely on). scripts/gen_templates.py
generates all six from a shared layout system; run python scripts/gen_templates.py
after editing it to regenerate them.
- SSH host keys are trusted automatically on first connect (
AutoAddPolicy). This is convenient for a device on your own LAN but means there's no protection against a spoofed host; be aware of that tradeoff. backupsaves the templates JSON and a listing of files in the templates directory, not copies of the template images themselves.- The four categories and the icon codes in
iconsare taken directly from a real device'stemplates.json(built-in entries), not guessed — the picker UI only shows a fixed set of category tabs, so a category outside that set means a template won't appear under any tab.
MIT, see LICENSE.