timdommett490 downloadsSync your reMarkable Paper Pro documents to your vault as PDFs.
Sync your reMarkable Paper Pro documents to your Obsidian vault as high-fidelity PDFs.
Disclaimer: This is an unofficial, community-built plugin. It is not affiliated with, endorsed by, or supported by reMarkable AS. "reMarkable" is a trademark of reMarkable AS, used here only to describe compatibility.
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!
Ballpoint, Fineliner, Marker, Pencil, Mechanical Pencil, Calligraphy Pen, Paintbrush, Highlighter, Shader
main.js, manifest.json, and styles.css from the latest release.<vault>/.obsidian/plugins/remarkable-sync/.Note: This is a desktop-only plugin (requires Obsidian desktop app).
*.remarkable.com) to download your documents. No data is sent to any other service.~/.remarkable-sync/token.json, outside the Obsidian vault.~/.remarkable-sync/token.json| 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 |
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 # reMarkable archive → PDF pipeline (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/ # Build output (git-ignored, regenerated by `npm run build`)
git clone https://github.com/TimDommett/Remarkable-Sync---Obsidian-Plugin.git
cd Remarkable-Sync---Obsidian-Plugin
npm install
npm run build # Type-check + production build
npm run dev # Watch mode (rebuilds on changes)
The build writes the plugin assets to release/remarkable-sync/ (main.js,
manifest.json, styles.css). That folder is git-ignored and regenerated on
every build.
Because the build folder is named after the plugin id, the simplest workflow is to symlink it straight into a test vault's plugins directory:
npm run build
ln -s "$(pwd)/release/remarkable-sync" "<vault>/.obsidian/plugins/remarkable-sync"
On Windows, use mklink /D from an elevated prompt, or copy the folder instead
of symlinking. Then enable reMarkable Sync under Settings > Community
plugins. Run npm run dev while developing and reload Obsidian (Ctrl/Cmd + R)
to pick up each rebuild.
The core modules have no Obsidian dependency, so you can exercise them from the command line:
npm run test:unit # Unit tests (cloud client)
npx tsx run-sync.ts # Full sync of all documents into ./reMarkable
Register once via the plugin (or run-sync.ts) before syncing — get a one-time
auth code from https://my.remarkable.com/device/desktop/connect.
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:
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
FileOps interface abstracts file I/O so the same core code works in both Node.js (CLI) and Obsidian (plugin)rm-parser.tspdf-lib (PDF creation), bundled into the plugin; reMarkable archives are read directly without a ZIP libraryContributions are welcome! If you'd like to help improve this plugin:
git checkout -b feature/my-feature)npm run build to verify your changes compilegit commit -m "Add my feature")git push origin feature/my-feature)Please open an issue with:
<sync folder>/_reMarkable Sync Log.md (open it via the Open log button
in settings or the reMarkable Sync: Open sync log command). The log contains
the specific per-document error messages needed to diagnose failures. If the log
is missing, enable Write sync log in settings and reproduce the issue.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.
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.
This project bundles the following MIT-licensed library:
The .rm file parser is derived from:
See THIRD-PARTY-NOTICES for full license texts.