Skip to main content

Bidirectional sync between reMarkable tablets and an Obsidian knowledge base with intelligent note processing

Project description

reMark

CI PyPI Python 3.11+ License: MIT

Bidirectional sync between reMarkable tablets and an Obsidian knowledge base with multi-engine OCR, intelligent note processing, and automatic action item extraction.

Write on your reMarkable. reMark handles the rest — your handwritten notes become structured, searchable Markdown in Obsidian, complete with tags, summaries, and extracted action items. Optionally push a response PDF back to your tablet.


Features

  • Multi-engine OCR pipeline — reMarkable built-in (MyScript), Google Cloud Vision, or VLM-based recognition with automatic fallback
  • Intelligent structuring — raw handwriting becomes clean Markdown with inferred headings, lists, and formatting
  • Action item extraction — detects tasks, questions, and follow-ups from both text patterns and pen color annotations
  • Auto-tagging — categorizes notes based on content
  • Obsidian vault integration — writes notes with full YAML frontmatter, wiki-links, and Git sync
  • Response push — generates styled PDFs and pushes them back to your reMarkable
  • Real-time sync — WebSocket-based live notifications or configurable cron schedule
  • Color-aware — uses reMarkable Paper Pro's color ink for semantic marking (red = action, blue = question, yellow = highlight)
  • MCP server — interact with your notes directly from Claude Desktop or Claude Code
  • Idempotent — SQLite state tracking ensures notes are never processed twice

Architecture

┌─────────────────┐     reMarkable Cloud API      ┌──────────────────────┐
│  reMarkable      │◄──────────────────────────────►│  reMark              │
│  Paper Pro / rM2 │     (sync 1.5 / JWT auth)     │  (VPS - systemd)     │
└─────────────────┘                                 │                      │
                                                    │  ┌────────────────┐  │
                                                    │  │ sync_engine    │  │
                                                    │  │ ocr_pipeline   │  │
                                                    │  │ note_processor │  │
                                                    │  │ obsidian_write │  │
                                                    │  │ response_push  │  │
                                                    │  └────────────────┘  │
                                                    │         │            │
                                                    │         ▼            │
                                                    │  ┌────────────────┐  │
                                                    │  │ Obsidian Vault │  │
                                                    │  │ (Git-synced)   │  │
                                                    │  └────────────────┘  │
                                                    └──────────────────────┘

Data Flow

1. DETECT    → New/changed notebook on reMarkable Cloud
2. DOWNLOAD  → Fetch .rm files + metadata via sync 1.5 protocol
3. CONVERT   → Extract text (built-in conversion → fallback OCR)
4. PROCESS   → Extract structure, action items, tags
5. STORE     → Write Markdown + frontmatter to Obsidian vault
6. RESPOND   → Generate summary PDF, push back to reMarkable
7. TRACK     → Update sync state DB, commit vault to Git

Requirements

  • Python 3.11+
  • A reMarkable tablet (Paper Pro or reMarkable 2)
  • An Obsidian vault (local or Git-synced)
  • An Anthropic API key for note processing
  • (Optional) Google Cloud Vision credentials for OCR fallback

VPS Deployment

  • Ubuntu 22.04+ or Debian 12+
  • 1 GB RAM minimum (2 GB recommended if using VLM OCR)
  • 10 GB disk (vault + state + downloaded .rm files)
  • Outbound HTTPS to *.remarkable.com, api.anthropic.com, vision.googleapis.com

Installation

From PyPI (recommended)

pip install remark-bridge

From source

git clone https://github.com/BGGBTAC/reMark.git
cd reMark
pip install .

Note: reMark requires libcairo2 for SVG→PNG rendering. On Debian/Ubuntu: sudo apt install libcairo2-dev. On macOS: brew install cairo.

Setup

# Interactive setup — authenticates with reMarkable Cloud,
# creates config, initializes vault structure and state DB
remark-bridge setup

During setup you'll need a one-time code from my.remarkable.com/device/browser/connect.

Configuration

Copy and edit the example config:

cp config.example.yaml config.yaml

Key sections:

Section What it controls
remarkable Cloud auth, folder filters, response folder
ocr Primary/fallback OCR engines, confidence threshold
processing Model selection, what to extract (actions, tags, summaries)
obsidian Vault path, folder mapping, Git sync settings
sync Trigger mode (realtime/scheduled/manual), WebSocket config

See config.example.yaml for the full reference with comments.

Usage

# One-shot sync
remark-bridge sync --once

# Continuous sync (scheduled + realtime based on config)
remark-bridge sync

# Real-time WebSocket watcher only
remark-bridge watch

# Process a specific notebook
remark-bridge process "Meeting Notes 2026-04-13"

# Upload a PDF to your reMarkable
remark-bridge push report.pdf --folder "Work"

# Check sync status
remark-bridge status

# Start MCP server (for Claude Desktop / Claude Code)
remark-bridge serve

# One-time import of all existing notebooks
remark-bridge migrate

reMarkable Marking Conventions

Use pen colors and text patterns to mark up your notes. reMark detects both, so it works on the monochrome rM2 too (just use text patterns).

Mark Pen Color Meaning Detection
Action item Red Task to do Color filter
Question Blue Needs follow-up Color filter
Important Yellow highlight Key info Color filter
Done Green Completed Color filter
TODO: text Any Task Text pattern
Q: text Any Question Text pattern
! prefix Any Priority flag Text pattern
[ ] checkbox Any Task checkbox Text pattern

Deployment (systemd)

# Copy service files
sudo cp systemd/remarkable-bridge.service /etc/systemd/system/
sudo cp systemd/remarkable-bridge.timer /etc/systemd/system/

# Set your API key in the service file
sudo systemctl edit remarkable-bridge
# Add: Environment=ANTHROPIC_API_KEY=sk-ant-...

# Enable and start
sudo systemctl daemon-reload
sudo systemctl enable --now remarkable-bridge

For timer-based mode (instead of continuous):

sudo systemctl enable --now remarkable-bridge.timer

Project Structure

reMark/
├── src/
│   ├── main.py              # CLI entry point (Click)
│   ├── config.py            # Config loading + validation
│   ├── remarkable/          # reMarkable Cloud interaction
│   │   ├── auth.py          # JWT auth flow
│   │   ├── cloud.py         # Cloud API client (sync 1.5)
│   │   ├── documents.py     # Document listing, download, upload
│   │   ├── websocket.py     # Real-time change notifications
│   │   └── formats.py       # .rm file parsing (wraps rmscene)
│   ├── ocr/                 # Handwriting recognition pipeline
│   │   ├── pipeline.py      # OCR orchestrator (strategy pattern)
│   │   ├── remarkable_builtin.py
│   │   ├── google_vision.py
│   │   ├── vlm.py
│   │   └── renderer.py      # .rm → PNG/SVG rendering
│   ├── processing/          # Intelligent note processing
│   │   ├── structurer.py    # Raw text → structured Markdown
│   │   ├── actions.py       # Action item extraction
│   │   ├── tagger.py        # Auto-tagging
│   │   └── summarizer.py    # Note summarization
│   ├── obsidian/            # Obsidian vault management
│   │   ├── vault.py         # Read/write operations
│   │   ├── frontmatter.py   # YAML frontmatter generation
│   │   ├── templates.py     # Note templates
│   │   └── git_sync.py      # Git commit + push
│   ├── response/            # Push results back to reMarkable
│   │   ├── pdf_generator.py # Generate response PDFs
│   │   ├── notebook_writer.py
│   │   └── uploader.py
│   ├── sync/                # Sync orchestration
│   │   ├── engine.py        # Main sync loop
│   │   ├── state.py         # SQLite state tracking
│   │   ├── scheduler.py     # Cron / interval scheduling
│   │   └── watcher.py       # WebSocket real-time watcher
│   └── mcp/                 # MCP server
│       └── server.py
├── tests/
├── scripts/
├── systemd/
├── vault_template/          # Initial Obsidian vault structure
├── config.example.yaml
├── pyproject.toml
└── LICENSE

Development

git clone https://github.com/BGGBTAC/reMark.git
cd reMark

python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

# Run tests
pytest tests/ -v

# Lint
ruff check src/ tests/

License

MIT — see LICENSE.

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

remark_bridge-0.1.0.tar.gz (66.7 kB view details)

Uploaded Source

Built Distribution

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

remark_bridge-0.1.0-py3-none-any.whl (67.4 kB view details)

Uploaded Python 3

File details

Details for the file remark_bridge-0.1.0.tar.gz.

File metadata

  • Download URL: remark_bridge-0.1.0.tar.gz
  • Upload date:
  • Size: 66.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for remark_bridge-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d01d6216aae6f852c1a2ffd08fd33a26a6ae318a8783220e5896bb1d3b1f19a7
MD5 1c23971583247b03c4d39a29c3e1d7c3
BLAKE2b-256 20e7372d9a991e304c41a212cda82268e7593385e80ad8ea05f39abc735d962b

See more details on using hashes here.

Provenance

The following attestation bundles were made for remark_bridge-0.1.0.tar.gz:

Publisher: release.yml on BGGBTAC/reMark

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

File details

Details for the file remark_bridge-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: remark_bridge-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 67.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for remark_bridge-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 044c8d00383dc1a721d441d4b8820867b5679f8df2383cd3d62081efbd94d99f
MD5 7705cdaaeaa5861910f2c617c42822e4
BLAKE2b-256 2106a3d47b198f525edaa9d111a03ab9a23ba8d0da329b536f75815fd834ce28

See more details on using hashes here.

Provenance

The following attestation bundles were made for remark_bridge-0.1.0-py3-none-any.whl:

Publisher: release.yml on BGGBTAC/reMark

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