Skip to main content

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 repair broken.rmdoc.zip                    # fix a notebook a Mac unpacked and re-zipped
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, --width <px>, --fill hatch|outline|none, --threshold auto|0-255, --simplify <px>, --max-points <n>.

Shading. Photos and portraits can keep their grey tones: --shading stipple (dots, denser where darker), halftone (a dot screen with growing dots), hatch (lines, closer where darker), crosshatch (more line directions where darker) or pencil (pencil strokes whose pressure follows the tone). Tune with --shade-density and --shade-contrast. The web UI shows a small preview of every style side by side, so you can pick one before you download. 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, deploy deploy/vercel/ on Vercel (see hosting), or 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.

If a Mac turned the download into a folder or a .zip and the tablet will not import it, run rmink repair on it, or use Repair a notebook in the web UI.

Use with Claude

MCP server (Claude Code, Claude Desktop, any MCP client):

claude mcp add rmink -- uvx --from 'rmink[mcp]' rmink mcp

Tools:

  • preview_ink returns a PNG, so the model can look at the result and tune the options before converting.
  • convert_to_rmdoc writes the notebook.
  • inspect_rmdoc, list_devices and calibration_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
                       optional shading: tone map → dots / dot screen / hatching / pencil pressure
        ─► 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 and you want to say thanks, you can support it with 100 kr via Stripe. The money pays for the hosted web service and further development. Starring the repo and reporting how it works on your tablet in an issue helps a lot too.

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

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for rmink 2.1.1
File Size Uploaded
rmink-2.1.1.tar.gz 18.2 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for rmink 2.1.1
File Interpreter ABI Platform
rmink-2.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 18.4 MB

Release files / rmink-2.1.1.tar.gz

Download URL rmink-2.1.1.tar.gz
Size 18.2 MB
Tags Source
SHA-256 checksum
How to use checksums
eafb39f3c3d080f18a0174c121a119d290262624d5394525f545c281e7e26b33
BLAKE2b-256 checksum
How to use checksums
6e975c12ae021932209a60538e92cabd183b53f79a0d862028de6ae80864a33b
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 11, 2026.

Transparency log

Release files / rmink-2.1.1-py3-none-any.whl

Download URL rmink-2.1.1-py3-none-any.whl
Size 157.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9dd8ac8c200c1d9f4ca0e4024bbb7a271c3f4f034130e3412342ff45b2acac63
BLAKE2b-256 checksum
How to use checksums
7b2d8965b23002fb3de2efc5532c074ebae1ac5f6b5fc6644a5331179e52dae1
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 11, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2.1.1 This release

2 release files

2.1.0

2 release files

2.0.6

2 release files

2.0.5

2 release files

2.0.4

2 release files

2.0.3

2 release files

2.0.2

2 release files

2.0.1

2 release files

2.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page