Skip to main content

Push diagrams to reMarkable, fetch annotated drawings, render handwritten notes — built for AI-human collaboration.

Project description

remarkable-ai

A CLI that bridges Claude Code and a reMarkable tablet. Push diagrams, draw on them with a pen, pull the annotations back as a PDF.

┌─────────┐  push   ┌───────────┐  draw   ┌─────────┐
│ SVG/PDF ├────────▶│ reMarkable├────────▶│ .rmdoc  │
└─────────┘         └───────────┘         └────┬────┘
                                               │ fetch
                                          ┌────▼────┐
                                          │annotated│
                                          │  PDF    │
                                          └─────────┘

Quickstart

uv tool install remarkable-ai
remarkable-ai setup

That's it. setup downloads the remark binary for your platform and walks you through cloud auth. No Go toolchain needed.

Commands

remarkable-ai setup                        # download remark + authenticate
remarkable-ai push architecture.pdf        # upload PDF to tablet
remarkable-ai push diagram.svg             # auto-converts SVG to PDF first
remarkable-ai fetch architecture           # pull annotated doc, render strokes onto PDF
remarkable-ai blank "Neural Networks"      # push a titled blank page for drawing
remarkable-ai render diagram.svg           # SVG to PNG (for review)
remarkable-ai render diagram.svg --pdf --push-to-tablet
remarkable-ai calibrate                    # push 9-point grid for coordinate alignment
remarkable-ai list                         # list files on tablet

All commands default to the /AI Brainstorm/ folder. Pass --folder to change it.

How fetch works

.rmdoc archive          .rm binary             annotated PDF
┌────────────┐     ┌──────────────┐     ┌───────────────────┐
│ diagram.pdf│     │ SceneLineItem│     │ original PDF      │
│ *.rm files │────▶│  → Stroke[]  │────▶│ + stroke overlay  │
└────────────┘     └──────────────┘     └───────────────────┘
  extract_strokes    parse_strokes        render_annotations
                     _from_rm
  1. remark get pulls the .rmdoc archive from the cloud
  2. The archive is a ZIP with the original PDF and .rm annotation layers. rmscene parses the pen strokes.
  3. Each stroke lands on a transparent PDF overlay (reportlab), merged onto page 1 of the original (pypdf)

The coordinate mapping comes from a calibrated affine transform. Run remarkable-ai calibrate once, circle each crosshair on the tablet, fetch it back. The transform solves from there.

Architecture

src/remarkable_ai/
├── core/                 # Domain types and the transport port. No deps.
│   ├── types.py          # PenColor, Point, Stroke, CalibrationTransform
│   ├── transport.py      # CloudTransport ABC
│   ├── errors.py         # CLIError → RemarkableError, SvgConversionError
│   └── constants.py      # Page dimensions (1152×936)
├── adapters/             # Talks to external tools. Depends on core only.
│   ├── remark_cli.py     # RemarkCLIAdapter — shells out to remark
│   ├── in_memory.py      # InMemoryAdapter — fake transport for tests
│   ├── renderer.py       # .rm parsing + PDF overlay compositing
│   ├── svg.py            # SVG→PNG/PDF (rsvg → cairosvg → Inkscape)
│   ├── templates.py      # Blank page + calibration grid PDFs
│   └── setup.py          # Binary download + install
└── cli/                  # Wires adapters together.
    ├── __init__.py       # App, console, error handling, entry point
    └── commands.py       # setup, push, fetch, list, blank, render, calibrate

Boundaries enforced by tachcore never imports from adapters or cli.

Claude Code skills

Three skills in the skills/ directory turn a conversation into a whiteboard session. Copy them to your project's .claude/skills/.

/explain-me — Claude draws, you read. Generates an SVG diagram, self-reviews it by rendering to PNG, then pushes the final version to your tablet.

/explain — You draw, Claude reads. Pushes a blank page to the tablet. You sketch with the pen. Claude fetches it back and interprets the drawing.

/architect — Collaborative architecture design. Claude proposes structure (any style — hexagonal, layered, flat, whatever fits), pushes a diagram to the tablet. You annotate with the pen. Claude fetches your notes and argues back from principles. Repeat until you agree.

Development

git clone https://github.com/Yassimba/remarkable-ai
cd remarkable-ai
uv sync --all-extras

uv run ruff check src/          # lint
uv run ruff format --check src/ # format
uv run tach check               # boundary enforcement
uv run complexipy src/          # complexity (max 15)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

remarkable_ai-0.2.2.tar.gz (57.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

remarkable_ai-0.2.2-py3-none-any.whl (19.9 kB view details)

Uploaded Python 3

File details

Details for the file remarkable_ai-0.2.2.tar.gz.

File metadata

  • Download URL: remarkable_ai-0.2.2.tar.gz
  • Upload date:
  • Size: 57.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for remarkable_ai-0.2.2.tar.gz
Algorithm Hash digest
SHA256 3b419c14d9414420a71bd90218959ef2aafeca71d6107dc331d680bfc70b9b24
MD5 4764356972d94fc63cf82a32e1bb9153
BLAKE2b-256 7f462df395aba53fc3ce4be4608c199053809dcc1d2e743ac4c09acdf56d8fca

See more details on using hashes here.

Provenance

The following attestation bundles were made for remarkable_ai-0.2.2.tar.gz:

Publisher: publish.yml on Yassimba/remarkable-ai

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file remarkable_ai-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: remarkable_ai-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 19.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for remarkable_ai-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f685111ef4cb5020b1fafd4f4a64c5f9d0afe21105641041384408cb38d6d658
MD5 d74e7465554a102b1e1c73872a67bdee
BLAKE2b-256 840981ab2dc4d91aafa61a538e118f716750a132c084efe4c2a0fc2f39d8e18b

See more details on using hashes here.

Provenance

The following attestation bundles were made for remarkable_ai-0.2.2-py3-none-any.whl:

Publisher: publish.yml on Yassimba/remarkable-ai

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page