Sync reMarkable notebooks to an Obsidian vault as transcribed Markdown — over
plain SSH, no cloud service, no OAuth server, no background sync daemon.
- Pull — cheap metadata-only rsync over SSH lists every notebook on
the device without transferring page data. Only the notebook(s) you
actually ask for get their real page data pulled.
- Convert — rmc turns each .rm
page into SVG, which rsvg-convert
rasterizes to PNG at native resolution (1404x1872).
- Transcribe — each page image is sent to Claude (Haiku by default) to
transcribe handwriting into Markdown, describing diagrams/sketches in
bracketed notes and marking illegible words with [?].
- Export — one Markdown file per notebook, written straight into your
Obsidian vault folder.
No reMarkable Cloud account, no Docker, no persistent sync process — you run
it whenever you want a notebook exported.
- SSH access to the tablet with rm-ssh-over-wlan (or USB) enabled and a key
installed (see the reMarkable SSH docs)
- rsync, rsvg-convert (brew install librsvg)
- Python 3.10+
- Claude Code CLI, authenticated
git clone https://github.com/AmitSubhash/rmscribe.git
cd rmscribe
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Add an SSH host alias for your tablet (e.g. rm2) to ~/.ssh/config.
# list every notebook on the device (fast, metadata only)
python main.py --list --vault /path/to/vault
# sync one notebook by exact name
python main.py --notebook "My Notebook" --vault /path/to/vault
# sync everything (slow, pulls every notebook's page data)
python main.py --all --vault /path/to/vault
# use a different Claude model
python main.py --notebook "My Notebook" --vault /path/to/vault --model claude-sonnet-5
Handwritten journal → Emacs (journal.py)
A companion CLI routes a "Journal" folder on the tablet into an Emacs
org-mode file+datetree journal (e.g. ~/org/journal.org) instead of the
Obsidian vault. Handwrite in that folder, and each new page is transcribed and
appended as a dated entry, interleaved with your typed SPC X j captures:
* 2026
** 2026-07 July
*** 2026-07-06 Sunday
**** [2026-07-06 Sun 09:14] :handwritten:
transcribed entry text ...
# preview what would be added, without writing the journal (recommended first)
python journal.py --dry-run
# transcribe new "Journal" pages into ~/org/journal.org
python journal.py
# point at a different folder / journal file / model
python journal.py --folder "Journal" --journal-file ~/org/journal.org --model claude-sonnet-5
Details:
- By default only the notebook named "Journal" inside the Journal folder
is touched, so other notebooks you keep in that folder (plans, scratch) are
ignored. Pass --notebook "" to journal every notebook in the folder, or
--notebook "Name" to target a different one. Reuses the same pull → convert
→ transcribe engine as main.py.
- Idempotent: each page is deduped by the SHA-256 of its raw .rm stroke
data (state in state/journal_pages.json), so re-runs never duplicate an
entry even as you keep adding pages to one journal notebook.
- Each page is its own entry, dated by that page's own write time (the
reMarkable's per-page modifed stamp), so keep one journal notebook and add a
page whenever you journal -- every page lands on the day you wrote it, even if
you sync several days at once. (Falls back to the notebook's last-modified
time if a page carries no stamp.)
- Missing year/month/day nodes are created in sorted order; the journal file is
backed up (journal.org.bak) before every write and replaced atomically;
transcribed body text is indented so a line starting with * or # can't be
misread as an org heading.
- --bootstrap marks all current pages as already-journaled without
transcribing (run once if you point it at a notebook with a back-catalog you
don't want dumped under today's date).
The triple-tap trigger (device/poll_trigger.sh) runs this automatically after
the Obsidian sync, so one triple-tap syncs notebooks, publishes the blog, and
files your journal.
- Only plain handwritten notebooks (fileType: "notebook") are supported —
annotated PDFs and EPUBs are skipped for now.
- Transcription quality depends on handwriting legibility and the chosen
model; treat output as a searchable draft, not a verbatim transcript.
- Pen colors outside rmc's built-in palette (e.g. custom ShadingMarker
colors) render as black — cosmetic only, doesn't affect transcription.