Backup and convert reMarkable tablet notebooks to PDF
Project description
RemarkableSync
A comprehensive Python toolkit for backing up and converting reMarkable tablet notebooks to PDF with template support and proper folder hierarchy preservation.
[!IMPORTANT] This tool has been tested exclusively on reMarkable 2. Compatibility with reMarkable 1 is not guaranteed.
Features
๐ Backup & Sync
- USB Connection: Connects to reMarkable tablet over USB (10.11.99.1)
- Incremental Sync: Only downloads files that have changed since last backup
- Complete Backup: Backs up all notebooks, documents, and metadata
- Template Support: Automatically backs up template files from the device
- File Integrity: MD5 hash verification for synced files
๐ PDF Conversion
- Hybrid Converter: Supports both v5 and v6 .rm file formats
- Template Rendering: Applies original notebook templates (grids, lines, etc.) to PDFs
- SVG Pipeline: Uses rmc โ SVG โ PDF conversion for high quality output
- Folder Hierarchy: Recreates original device folder structure in output
- Single PDF per Notebook: Merges all pages into one PDF file per notebook
- Smart Conversion: Only converts notebooks updated in the last backup
- Progress Tracking: Visual progress bars and detailed logging
Prerequisites
-
reMarkable Tablet Setup:
- Connect your reMarkable tablet to your computer via USB
- Enable SSH access (it's enabled by default)
- Get your SSH password from Settings โ Help โ Copyright and licenses
-
Python Requirements:
- Python 3.11 or higher (required)
- Required packages (install with
pip install -r requirements.txt)
-
External Tools (for v6 PDF conversion):
rmc(reMarkable file converter) - Install from https://github.com/ricklupton/rmc- Note: rmc is a Rust tool, not a Python package. Install via cargo or download binaries.
Installation
Option 1: Homebrew (Recommended for macOS)
macOS users can install RemarkableSync using Homebrew:
# Add the tap (one time only)
brew tap jeffsteinbok/remarkablesync
# Install RemarkableSync
brew install remarkablesync
This will automatically:
- Install Python 3.13 and all dependencies
- Install the
rmctool for v6 format conversion - Set up everything needed for PDF conversion
Updating to latest version:
brew upgrade remarkablesync
Uninstalling:
brew uninstall remarkablesync
brew untap jeffsteinbok/remarkablesync
Option 2: pip (All Platforms)
For users with Python 3.11+ installed:
# Install using pip (recommended: use a virtual environment)
pip install remarkablesync
# Then install rmc separately
pip install rmc
Using a virtual environment (recommended):
# Create virtual environment
python -m venv venv
# Activate it
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install RemarkableSync
pip install remarkablesync
Updating to latest version:
pip install --upgrade remarkablesync
Option 3: Pre-built Executables (Windows/macOS)
For users without Python or who prefer standalone executables:
- Download the latest release from the Releases page
- Extract the archive:
- Windows: Extract
RemarkableSync-Windows.zip - macOS: Extract
RemarkableSync-macOS.zip
- Windows: Extract
- Run the executable:
- Windows:
RemarkableSync.exe - macOS:
./RemarkableSync/RemarkableSync
- Windows:
For detailed instructions on building executables yourself, see BUILD_EXECUTABLES.md.
Option 4: From Source (For Developers)
-
Clone this repository:
git clone https://github.com/JeffSteinbok/RemarkableSync.git cd RemarkableSync
-
Install dependencies:
pip install -r requirements.txt
Quick Start
The simplest way to get started:
- Connect your reMarkable tablet via USB
- Get your SSH password from Settings โ Help โ Copyright and licenses on your tablet
- Run RemarkableSync:
# If installed via Homebrew (macOS) RemarkableSync # If using pre-built executable ./RemarkableSync # If using Python python3 RemarkableSync.py
- Enter your password when prompted (you can save it for future use)
- Your notebooks will be backed up to
./remarkable_backup/Notebooks/ - PDFs will be created in
./remarkable_backup/PDF/
That's it! The tool will only sync changed files and convert updated notebooks on subsequent runs.
Usage
Unified Command Line Interface
RemarkableSync provides a single entry point with three main commands:
Default Command: Sync (Backup + Convert)
The most common workflow - backs up your device and converts only updated notebooks:
# If installed via Homebrew
RemarkableSync
# If using pre-built executable
./RemarkableSync
# If using Python
python3 RemarkableSync.py
This will:
- Connect to your ReMarkable tablet via USB
- Backup all changed files (including templates)
- Convert only notebooks that were updated in this backup
Individual Commands
Backup only (no conversion):
# Homebrew
RemarkableSync backup
# Python
python3 RemarkableSync.py backup
Convert only (from existing backup):
# Homebrew
RemarkableSync convert
# Python
python3 RemarkableSync.py convert
Sync with options:
# Force full backup and conversion (ignore sync status)
RemarkableSync sync --force-backup --force-convert
# Skip template backup
RemarkableSync sync --skip-templates
# Verbose output
RemarkableSync sync -v
Testing and Selective Conversion
Convert a single notebook (by name or UUID):
RemarkableSync convert --notebook "My Notebook"
Convert first N notebooks (for testing):
RemarkableSync convert --sample 5
Force convert all notebooks (ignore sync status):
RemarkableSync convert --force-all
Command Line Options
Common Options (all commands):
-d, --backup-dir: Directory for backups (default:./remarkable_backup)-v, --verbose: Enable debug logging--version: Show version and repository information
Backup/Sync Options:
-p, --password: ReMarkable SSH password (will prompt if not provided)--skip-templates: Don't backup template files-f, --force/--force-backup: Backup all files (ignore sync status)
Convert Options:
-o, --output-dir: Output directory for PDFs (default:backup_dir/pdfs_final)-f, --force-all/--force-convert: Convert all notebooks (ignore sync status)-s, --sample N: Convert only first N notebooks-n, --notebook NAME: Convert only specific notebook (by UUID or name)
How It Works
- Connection: Establishes SSH connection to ReMarkable tablet at 10.11.99.1
- File Discovery: Scans
/home/root/.local/share/remarkable/xochitl/for notebook files - Template Backup: Downloads template files from
/usr/share/remarkable/templates/ - Incremental Sync: Compares file metadata (size, modification time, hash) to determine what needs updating
- Download: Uses SCP to efficiently transfer only changed files
- PDF Conversion:
- Converts .rm files to SVG using rmc (for v6 format)
- Renders template backgrounds (grids, lines, dots)
- Merges templates with notebook content
- Combines all pages into single PDF per notebook
- Smart Updates: Tracks which notebooks changed and only converts those
File Structure
After backup, your directory will contain three clean folders:
remarkable_backup/
โโโ Notebooks/ # All notebook files and metadata
โ โโโ [uuid].metadata # Document metadata files
โ โโโ [uuid].content # Document content info
โ โโโ [uuid]/ # Notebook directories
โ โโโ [uuid]-metadata.json # Page metadata
โ โโโ *.rm # Drawing/writing data (v5 or v6 format)
โโโ Templates/ # Template files from device
โ โโโ *.png # Template preview images
โ โโโ *.template # Template definition files
โ โโโ templates.json # Template metadata
โโโ PDF/ # Generated PDF outputs
โ โโโ [notebook folders with PDFs preserving hierarchy]
โโโ sync_metadata.json # Sync state tracking
โโโ updated_notebooks.txt # List of notebooks updated in last backup
โโโ .remarkable_backup.log # Backup operation log
PDF Conversion Technical Details
RemarkableSync includes a hybrid converter that supports both v5 and v6 .rm file formats:
- v6 Format (newer tablets): Uses external
rmctool to convert .rm โ SVG โ PDF - v5 Format (older tablets): Direct Python-based conversion (legacy support)
- Template Rendering: Custom renderer applies original device templates with accurate scaling (226 DPI โ 72 DPI PDF points)
- Page Merging: Uses PyPDF2 to composite template backgrounds with notebook content
External Tool: rmc
For v6 notebook conversion, you'll need the rmc tool:
- Repository: https://github.com/ricklupton/rmc
- Installation: Via Rust cargo or download pre-built binaries
- Note: This is NOT a Python package - install separately
Incremental Sync Details
The tool maintains a sync_metadata.json file that tracks:
- File modification times
- File sizes
- MD5 hashes of local files
- Last sync timestamps
Files are only downloaded if:
- They don't exist locally
- Remote modification time changed
- Remote file size changed
- Local file hash doesn't match stored hash
Troubleshooting
Connection Issues
- Ensure ReMarkable is connected via USB
- Verify the tablet shows up as network interface
- Try pinging
10.11.99.1 - Check SSH password from tablet settings
Permission Errors
- Run as administrator on Windows if needed
- Ensure backup directory is writable
File Access Issues
- Restart ReMarkable tablet if SSH becomes unresponsive
- Check available disk space on both devices
Security Notes
- SSH password is requested interactively (not stored)
- Uses paramiko with auto-add host key policy
- Files are transferred over local USB network (not internet)
License
This tool is for personal use with your own ReMarkable tablet. Respect ReMarkable's terms of service.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file remarkablesync-1.0.7.tar.gz.
File metadata
- Download URL: remarkablesync-1.0.7.tar.gz
- Upload date:
- Size: 34.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
657d4e6e97ddcbf70453dfc15e5427d21efa1849056b71ae9ffc7cf06cc5a63e
|
|
| MD5 |
f4cc306f5402321cfcc0e83751f9939f
|
|
| BLAKE2b-256 |
980047a75580fa4b0ebc083473a12a48b1c080f9d4a83cf9d15b799cb89cb8d5
|
Provenance
The following attestation bundles were made for remarkablesync-1.0.7.tar.gz:
Publisher:
publish-pypi.yml on JeffSteinbok/RemarkableSync
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
remarkablesync-1.0.7.tar.gz -
Subject digest:
657d4e6e97ddcbf70453dfc15e5427d21efa1849056b71ae9ffc7cf06cc5a63e - Sigstore transparency entry: 782226969
- Sigstore integration time:
-
Permalink:
JeffSteinbok/RemarkableSync@4b3b80ec5edb87462aa18bb3dd0efb0b4b8e3cb5 -
Branch / Tag:
refs/tags/v1.0.7 - Owner: https://github.com/JeffSteinbok
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@4b3b80ec5edb87462aa18bb3dd0efb0b4b8e3cb5 -
Trigger Event:
release
-
Statement type:
File details
Details for the file remarkablesync-1.0.7-py3-none-any.whl.
File metadata
- Download URL: remarkablesync-1.0.7-py3-none-any.whl
- Upload date:
- Size: 40.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81b8285c79723229d23c0df492641a1cf9e91f33cccc70e39e6e9768200518ff
|
|
| MD5 |
fa053e93588e85bf8c8b0609c2aa4222
|
|
| BLAKE2b-256 |
faed13ff8b711ba896f17d2f09025d425d6fd3e686974dab7a3dd93623213512
|
Provenance
The following attestation bundles were made for remarkablesync-1.0.7-py3-none-any.whl:
Publisher:
publish-pypi.yml on JeffSteinbok/RemarkableSync
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
remarkablesync-1.0.7-py3-none-any.whl -
Subject digest:
81b8285c79723229d23c0df492641a1cf9e91f33cccc70e39e6e9768200518ff - Sigstore transparency entry: 782226972
- Sigstore integration time:
-
Permalink:
JeffSteinbok/RemarkableSync@4b3b80ec5edb87462aa18bb3dd0efb0b4b8e3cb5 -
Branch / Tag:
refs/tags/v1.0.7 - Owner: https://github.com/JeffSteinbok
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@4b3b80ec5edb87462aa18bb3dd0efb0b4b8e3cb5 -
Trigger Event:
release
-
Statement type: