reMarkable Sync
unlistedby Tim Dommett
Sync your reMarkable Paper Pro documents to your vault as PDFs.
reMarkable Sync for Obsidian
Sync your reMarkable Paper Pro documents to your Obsidian vault as high-fidelity PDFs.
If you find this plugin useful, please consider supporting its development or buying me a coffee:
Have an idea for a new feature? Vote on upcoming features or suggest your own!
Features
- Direct Cloud Sync - connects to reMarkable Cloud API
- High-fidelity PDF rendering - all 9 pen types with calibrated colors, widths, and opacity
- Full color support - 14 colors including shader and highlighter
- Text rendering - paragraph styles (headings, bold, bullets, checkboxes, numbered lists)
- Layered drawing support - preserves layer ordering
- Extended pages - vertically scrolled pages rendered correctly
- Incremental sync - only downloads changed documents
- Auto-sync - configurable sync interval
- Annotated PDFs - merges your annotations with the original PDF background
Supported pen types
Ballpoint, Fineliner, Marker, Pencil, Mechanical Pencil, Calligraphy Pen, Paintbrush, Highlighter, Shader
Installation
- Download remarkable-sync.zip from the latest release
- Extract it — you'll get a
remarkable-sync/folder - Copy that folder into
<vault>/.obsidian/plugins/ - Open Obsidian Settings > Community Plugins > Enable "reMarkable Sync"
- Go to the plugin settings and authenticate with your reMarkable account
Note: This is a desktop-only plugin (requires Obsidian desktop app).
Privacy & data
- This plugin connects to the reMarkable Cloud API (
*.remarkable.com) to download your documents. No data is sent to any other service. - Authentication tokens are stored locally on your machine at
~/.remarkable-sync/token.json, outside the Obsidian vault. - No telemetry or analytics are collected.
Authentication
- Go to https://my.remarkable.com/device/desktop/connect to get a one-time code
- Enter the code in the plugin settings (Obsidian Settings > reMarkable Sync)
- Auth tokens are stored locally at
~/.remarkable-sync/token.json
Usage
- Click the tablet icon in the Obsidian ribbon to sync
- Or use the command palette: reMarkable Sync: Sync now
- Documents are saved as PDFs in your configured vault subfolder
- Enable auto-sync in settings for hands-free operation
Configuration
| Setting | Default | Description |
|---|---|---|
| Sync folder | reMarkable/ | Subfolder in your vault for synced documents |
| Auto-sync | Off | Sync automatically on a timer |
| Sync interval | 5 min | How often to auto-sync |
Development
Project structure
src/ # TypeScript source code
cloud-client.ts # reMarkable Cloud API (sync15/v3 protocol)
rm-parser.ts # v6 binary .rm format parser
pdf-renderer.ts # PDF generation via pdf-lib
document-converter.ts # ZIP → PDF pipeline (jszip + pdf-lib)
sync-manager.ts # Sync orchestration with incremental state tracking
main.ts # Obsidian plugin entry point
settings.ts # Settings tab UI
constants.ts # Shared constants
reference_sheets/ # Ground truth: PDFs exported from reMarkable + raw .rm files
compare-reference-sheets.ts # Metadata comparison tool
compare-pixels.mjs # Pixel-to-pixel rasterized comparison (MuPDF WASM)
compare-pdfs.ts # PDF comparison utility
re-render.ts # Re-renders .rm files to PDFs for comparison
verify-coords.mjs # Coordinate mapping verification
run-sync.ts # Standalone CLI sync (no Obsidian dependency)
release/remarkable-sync/ # Pre-built plugin files (main.js, manifest.json, styles.css)
Prerequisites
- Node.js 18+
- npm
Setup
git clone https://github.com/TimDommett/Remarkable-Sync---Obsidian-Plugin.git
cd Remarkable-Sync---Obsidian-Plugin
npm install
Build
npm run build # Production build with type checking
npm run dev # Watch mode (rebuilds on changes)
The build output is main.js in the project root.
Testing outside Obsidian
You can test the sync engine without Obsidian using the standalone CLI:
npx tsx run-sync.ts # Sync all documents to ./reMarkable
Get a one-time auth code from: https://my.remarkable.com/device/desktop/connect
Testing in Obsidian
- Run
npm run build - Copy or symlink
main.js,manifest.json, andstyles.cssto<vault>/.obsidian/plugins/remarkable-sync/ - Reload Obsidian (Ctrl+R) and enable the plugin
Reference sheets
The reference_sheets/ directory contains PDFs exported directly from reMarkable alongside their raw .rm source files. These are the ground truth for validating rendering accuracy.
Each subdirectory covers a specific pen tool or feature with every color and thickness:
- Pen tools: Ballpoint, Calligraphy Pen, Fineliner, Highlighter, Marker, Mechanical Pencil, Paintbrush, Pencil, Shader
- Features: Text, Checklist, Layers, Pages
- Templates: Blank, Grid medium, Lined
Use the comparison tools to validate rendering:
npx tsx compare-reference-sheets.ts # Compare metadata (colors, widths, dimensions)
node compare-pixels.mjs # Pixel comparison against reference PDFs
npx tsx re-render.ts # Re-render .rm files and compare output
Architecture notes
FileOpsinterface abstracts file I/O so the same core code works in both Node.js (CLI) and Obsidian (plugin)- reMarkable v6 .rm format is parsed from binary with zero dependencies — see
rm-parser.ts - Coordinate mapping converts .rm canvas coordinates (1404x1872, centered X) to PDF points (514pt wide)
- CRDT text is decoded with topological sorting for correct character ordering
- Runtime dependencies:
pdf-lib(PDF creation) andjszip(ZIP reading), bundled into the plugin
Contributing
Contributions are welcome! If you'd like to help improve this plugin:
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Run
npm run buildto verify your changes compile - Test in Obsidian (see "Testing in Obsidian" above)
- Commit your changes (
git commit -m "Add my feature") - Push to your branch (
git push origin feature/my-feature) - Open a Pull Request
Bug reports
Please open an issue with:
- A description of the problem
- Steps to reproduce
- Your Obsidian version and OS
- Any relevant error messages from the developer console (Ctrl+Shift+I)
Acknowledgments
The .rm file parsing implementation in this plugin is based on / inspired by
rmscene by Rick Lupton, originally
written in Python. Licensed under the MIT License.
License
Copyright (c) 2026 Tim Dommett
This project is licensed under the GNU General Public License v3.0. You are free to use, modify, and distribute this software, but derivative works must also be open source under the same license.
Third-party licenses
This project bundles the following MIT-licensed libraries:
- pdf-lib by Andrew Dillon (and its dependencies)
- jszip by Stuart Knightley et al. (and its dependencies: pako, lie, readable-stream)
The .rm file parser is derived from:
- rmscene by Rick Lupton — MIT License
See THIRD-PARTY-NOTICES for full license texts.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.