rmink
Turn images, photos of handwriting, SVGs, logos and PDFs into native, editable reMarkable ink.
Most tools put a picture behind your notes. rmink writes real pen strokes
(.rm v6, the format of firmware 3.x) into a .rmdoc notebook, so on the
tablet you can erase part of a converted sketch, lasso a word and move it, or
recolour a diagram.
| Input | What happens |
|---|---|
| Photo or scan of handwriting, sketches, whiteboards | Paper shadows are removed, the ink is skeletonised, and each line becomes one stroke along its centre, with the line's width |
| Logos, icons, illustrations (PNG/JPG) | Colours are clustered and mapped to the tablet's pen colours. Thin lines are traced; solid areas are outlined and hatched |
| Vector PDF / SVG | Paths become strokes directly. Text glyphs are outlined and filled |
| Scanned PDF | Detected automatically and traced like a photo |
Supported devices: reMarkable 2, Paper Pure, Paper Pro (colour) and Paper Pro Move (colour).
Install
pip install rmink # or run without installing: uvx rmink ...
pip install 'rmink[mcp]' # + MCP server for Claude and other agents
pip install 'rmink[heic]' # + iPhone HEIC photos
Every command also works without installing anything: uvx rmink convert notes.jpg
(needs uv).
Use
rmink convert notes.jpg # -> notes.rmdoc for reMarkable 2
rmink convert logo.png -d pro --preview logo.png # colour, plus a PNG preview
rmink convert paper.pdf --pages 1-3 --fit width -o paper.rmdoc
rmink convert a.jpg b.jpg c.pdf --name "Week 41" # several inputs -> one notebook
rmink preview sketch.jpg -o preview.png # preview only, no notebook
rmink inspect paper.rmdoc # pages, strokes, pens, colours
rmink devices # device profiles
rmink calibrate -d pro # ruler page for checking scale
Useful options: --mode auto|vector|centerline|outline,
--colors auto|mono|N, --pen fineliner|ballpoint|marker|pencil,
--fill hatch|outline|none, --threshold auto|0-255, --simplify <px>,
--max-points <n>. Run rmink convert --help for the full list.
Web UI
pip install 'rmink[web]'
rmink web # opens http://localhost:8765
Drop files on the page, choose a device and options, and the preview updates
as you change them. When it looks right, download the .rmdoc.
To host it for others, use the included Dockerfile
(docker build -t rmink . && docker run -p 8765:8765 rmink). The per-request
limits can be tightened with RMINK_MAX_UPLOAD_MB, RMINK_MAX_FILES,
RMINK_MAX_PAGES, RMINK_TIMEOUT_S and RMINK_CONCURRENCY; see
src/rmink/web/__init__.py. Uploads are deleted as soon as the request
finishes.
Getting it onto the tablet: connect the tablet by USB, turn on
Settings → Storage → USB web interface, open http://10.11.99.1 and drag the
.rmdoc in (100 MB limit). Alternatively, drag it into the reMarkable desktop app.
Use with Claude
MCP server (Claude Code, Claude Desktop, any MCP client):
claude mcp add rmink -- uvx --from 'rmink[mcp]' rmink mcp
Tools:
preview_inkreturns a PNG, so the model can look at the result and tune the options before converting.convert_to_rmdocwrites the notebook.inspect_rmdoc,list_devicesandcalibration_sheet.
Skill: copy skills/rmink/ into ~/.claude/skills/. It covers choosing a
mode, the preview → tune → convert loop, and transferring the file.
How it works
input ─► ingest ─┬─ vector (PDF→SVG with text as paths, SVG) ─► paths → strokes, fills → outline + hatch
└─ raster (photos, scans, images)
background normalisation + Otsu/Sauvola → ink mask
colour clustering (CIELAB k-means) → device palette
per component: thin → skeleton graph → centerline strokes (+ width)
thick → contours + hatching
─► simplify (RDP), smooth (Chaikin), chain, reading order, point budget
─► .rm v6 via rmscene ─► .rmdoc (content/metadata/thumbnails)
Code layout: src/rmink/ contains ingest/, extract/, geometry/,
color/, writer/rm_v6.py, package/rmdoc.py, render/preview.py, api.py,
cli.py, mcp_server.py and web/ (FastAPI plus a single static page).
Device notes
The reMarkable 2 coordinate system is well known: 1404×1872, with x measured
from the page centre. The other profiles assume the same scene unit on a
larger canvas, and are marked beta until that is confirmed on hardware.
Print rmink calibrate -d <device> and measure it; if it is off, override the
profile in ~/.config/rmink/devices.toml:
[pro]
ink_scale = 0.99
See docs/device-acceptance.md for the on-device checklist.
Development
python -m venv .venv && .venv/bin/pip install -e '.[dev]'
.venv/bin/pytest # unit, round-trip, fidelity, CLI and MCP tests
python examples/make_examples.py
Releases: see docs/releasing.md.
The fidelity tests render the parsed output and compare it with the source ink, checking precision and recall within 3 px. That way the tests cover the writer as well as the tracing.
Support
rmink is free, and that is not going to change. If it saves you time, starring the repo and reporting how it works on your tablet in an issue helps a lot.
License
rmink is free software under the GNU AGPL-3.0 or later. This is
required by PyMuPDF, which is AGPL. If you host a modified version as a web
service, you have to offer its source code to the people who use it.
Hosted instances set RMINK_SOURCE_URL so the footer links to the source.
Not affiliated with or endorsed by reMarkable AS. "reMarkable" is a trademark of reMarkable AS.
History
This project began as pdf2rmnotebook by Simon Rechermann, a wrapper around drawj2d that wrote
v5 pages in black fineliner only. That version lives on at the tag v1.1.0.
rmink 2.0 replaces it with a pure-Python pipeline: no Java, v6 output, colour,
image input, centerline tracing and an agent interface.
Metadata
Release files for rmink 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| rmink-2.0.0.tar.gz | 215.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| rmink-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 279.5 kB
Release files / rmink-2.0.0.tar.gz
| Download URL | rmink-2.0.0.tar.gz |
|---|---|
| Size | 215.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8c385f4d38b73614551d97405cd980837090f144eacb4889037aea5d4abeaf97
|
|
BLAKE2b-256 checksum How to use checksums |
13e3590b3d69d8dc4f3241810272e56595c5207d3518fa66b904bb77e7ae2166
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.
Transparency logRelease files / rmink-2.0.0-py3-none-any.whl
| Download URL | rmink-2.0.0-py3-none-any.whl |
|---|---|
| Size | 64.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
983bc7fe3b515bfff422bfd86925d9e976fa1860847c9ff9296939c1027314bd
|
|
BLAKE2b-256 checksum How to use checksums |
343d284c2249437931e37b50f46469d4f09ad5f1e703d841e743a74a26486096
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 10, 2026.
Transparency log