FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

AmitSubhash/rmscribe: Sync reMarkable notebooks to Obsidian as transcribed Markdown, via SSH only -- no cloud, no OAuth server · GitHub

Repository files navigation

rmscribe

Sync reMarkable notebooks to an Obsidian vault as transcribed Markdown — over plain SSH, no cloud service, no OAuth server, no background sync daemon.

How it works

  1. 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.
  2. Convertrmc turns each .rm page into SVG, which rsvg-convert rasterizes to PNG at native resolution (1404x1872).
  3. 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 [?].
  4. 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.

Requirements

  • 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

Setup

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.

Usage

# 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.

Known limitations

  • 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.

About

Sync reMarkable notebooks to Obsidian as transcribed Markdown, via SSH only -- no cloud, no OAuth server

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages


Back | FazBrowse Home | New Git URL