Releases: JeffSteinbok/reMarkableSync
Release v2.2.0
✨ New Features
Google Gemini AI Provider — A new AI provider option for handwriting transcription with a free tier available!
- Gemini 2.5 Flash — Fast and free, great for most use cases
- Gemini 2.5 Flash Lite — Even faster, still free
- Gemini 2.5 Pro — Best quality for complex handwriting
Get your free API key at Google AI Studio — no credit card required.
🔧 Improvements
-
Config wizard enhancements
- Model selection picker for Google Gemini
- Folder connection prompt with sensible default
- Blank API key validation prevents misconfiguration
- Switching providers now properly clears the old model
-
Bug fixes
- Fixed Windows keyring case sensitivity issue that could cause credential storage failures
- Improved error handling for AI provider initialization
📚 Documentation
- Added "Supported AI Providers" section to README and website
- Updated device compatibility section with cleaner formatting
- Refreshed website with improved layout and navigation
🔗 Related
- Issue #34 tracks future local/offline model support for users who want OCR without an internet connection
Release v2.1.4
Release v2.1.4
What's Changed
- Fix template scaling for long/extended reMarkable pages by @JeffSteinbok in #30
Bug Fixes
- Extended page support: Pages with vertical scroll (infinite pages) are no longer squished into standard height — they now render at their true dimensions
- Template tiling: Template patterns (grids, lines, dots) now tile to fill the full page height on extended pages
- PDF merge corruption fix: Replaced PyPDF2's
merge_pagewith direct stream concatenation to fix corrupt PDFs caused by conflicting font resources
Full Changelog: v2.1.3...v2.1.4
Installation
macOS (Homebrew — recommended)
brew tap jeffsteinbok/remarkablesync
brew install remarkablesyncpip (all platforms)
pip install --upgrade remarkablesyncManual download
Download the appropriate package for your platform below:
- Windows:
reMarkableSync-Windows.zip - macOS:
reMarkableSync-macOS.zip
Extract the archive and run the reMarkableSync executable.
Upgrading
# Homebrew
brew upgrade remarkablesync
# pip
pip install --upgrade remarkablesync
# Check for updates from the CLI
reMarkableSync check-updateRelease v2.1.3
Release v2.1.3
What's Changed
- Architecture improvements: DI patterns, security fix, god object decomposition, and test coverage by @JeffSteinbok in #29
Full Changelog: v2.1.2...v2.1.3
Installation
macOS (Homebrew — recommended)
brew tap jeffsteinbok/remarkablesync
brew install remarkablesyncpip (all platforms)
pip install --upgrade remarkablesyncManual download
Download the appropriate package for your platform below:
- Windows:
reMarkableSync-Windows.zip - macOS:
reMarkableSync-macOS.zip
Extract the archive and run the reMarkableSync executable.
Upgrading
# Homebrew
brew upgrade remarkablesync
# pip
pip install --upgrade remarkablesync
# Check for updates from the CLI
reMarkableSync check-updateRelease v2.1.2
Release v2.1.2
What's New
- Fixed
reMarkableSync watchon Windows when launched from an installed console-script executable. The background watcher now starts throughpythonw.exe -m reMarkableSync watch --foreground, so the system tray process stays running instead of exiting immediately. - Included the app logo in the Python package manifest so pip-installed versions show the proper tray icon instead of the fallback icon.
- Updated the Windows startup command to use the same robust watcher launch path.
Installation
macOS (Homebrew — recommended)
brew tap jeffsteinbok/remarkablesync
brew install remarkablesyncpip (all platforms)
pip install --upgrade remarkablesyncManual download
Download the appropriate package for your platform below:
- Windows:
reMarkableSync-Windows.zip - macOS:
reMarkableSync-macOS.zip
Extract the archive and run the reMarkableSync executable.
Upgrading
# Homebrew
brew upgrade remarkablesync
# pip
pip install --upgrade remarkablesync
# Check for updates from the CLI
reMarkableSync check-updateRelease v2.1.1
⚠️ Breaking Changes
-
CLI renamed to
reMarkableSync— The command is now lowercasereMarkableSyncinstead ofRemarkableSyncto match the reMarkable brand styling. Update any scripts or aliases. -
GitHub authentication changed — If you use GitHub Models for AI OCR, you'll need to re-run
reMarkableSync configand re-authenticate. The new flow uses GitHub Copilot's API for better model access and selection.
✨ New Features
-
Custom OCR instructions — Create a Markdown file with custom prompts to improve AI transcription for your handwriting style, terminology, or formatting preferences. Default location:
~/.config/remarkablesync/custom_instructions.md -
Dynamic model picker — Config wizard now shows available AI models from your account instead of a text input
-
Pre/post sync commands — Add
pre_sync_commandandpost_sync_commandto config.json to run scripts before/after sync (e.g., git commits, notifications)
🎨 Improvements
- Higher DPI for OCR — Increased rasterization DPI for better handwriting recognition accuracy
- Long PDF chunking — Large notebooks are now processed in chunks to avoid API timeouts and memory issues
- Scrollable watch window — Watch mode output is now scrollable for easier monitoring
- New system tray icon — Fresh icon design for the system tray
- Single instance lock — Prevents multiple watch processes from running simultaneously
- Config wizard UX overhaul: styled panels, colored hints, clickable file paths
Installation
macOS (Homebrew — recommended)
brew tap jeffsteinbok/remarkablesync
brew install remarkablesyncpip (all platforms)
pip install --upgrade remarkablesyncManual download
Download the appropriate package for your platform below:
- Windows:
reMarkableSync-Windows.zip - macOS:
reMarkableSync-macOS.zip
Extract the archive and run the reMarkableSync executable.
Upgrading
# Homebrew
brew upgrade remarkablesync
# pip
pip install --upgrade remarkablesync
# Check for updates from the CLI
reMarkableSync check-updateRelease v2.0.6
What's New in v2.0.6
🔔 Auto-Update Notifications
- RemarkableSync now checks for new versions once per day and notifies you when an update is available
- New
RemarkableSync check-updatecommand to manually check for updates
🐛 Bug Fixes
- Fixed PDF conversion failing when the default
remarkable_backupdirectory doesn't exist — now falls back to the configured backup directory (#24)
Installation
macOS (Homebrew — recommended)
brew tap jeffsteinbok/remarkablesync
brew install remarkablesyncpip (all platforms)
pip install --upgrade remarkablesyncManual download
Download the appropriate package for your platform below:
- Windows:
RemarkableSync-Windows.zip - macOS:
RemarkableSync-macOS.zip
Extract the archive and run the RemarkableSync executable.
Upgrading
# Homebrew
brew upgrade remarkablesync
# pip
pip install --upgrade remarkablesync
# Check for updates from the CLI
RemarkableSync check-updateRelease v2.0.4
Release v2.0.4
What's New
- Live config reload in watch mode: the background watcher now re-reads your configuration at the start of every cycle, so changes to sync settings and the sync interval take effect without restarting. Interval changes made from the tray menu are now persisted back to your config.
- Pre/post sync commands: configurable commands now run on connect/disconnect via the reMarkable connection, with a security warning for shell command usage.
- Wider status window: the watch status popup is 20% wider for better readability.
- Better connection error UX and improved progress bar output.
- Bug fix: corrected
embed_imagesscoping.
Installation
macOS (Recommended)
brew tap jeffsteinbok/remarkablesync
brew install remarkablesyncWindows / macOS Manual Installation
Download the appropriate package for your platform:
- Windows:
RemarkableSync-Windows.zip - macOS:
RemarkableSync-macOS.zip
Extract and follow the instructions in README.md.
Platform Support
- Windows 10/11 (64-bit)
- macOS 10.13+ (Intel and Apple Silicon)
Note: This tool has been tested exclusively on reMarkable 2. Compatibility with reMarkable 1 is not guaranteed.
Note: The Homebrew formula will be automatically updated when this release is published.
v2.0.3
What's Changed
Pre/Post Sync Commands
- Pre-sync command now runs before SSH connects; post-sync command runs after SSH disconnects
- Both backup files and templates share a single SSH connection per sync (pre/post fire once)
- Config live folder selection also honors pre/post commands
Connection & Error Handling
- Suppressed noisy paramiko transport log output
- Connection failure messages now use consistent \ERR\ / \WRN\ formatting
- Warning messages displayed in yellow for better visibility
Config Summary
- Improved alignment of config summary labels
v2.0.2
What's Changed
Bug Fixes
- PDF conversion skipping all notebooks — folder filter was comparing sanitized paths against raw config values; fixed by keeping raw names for filtering and sanitizing only at output time
- "not enough values to unpack" error —
run_conversion()early-exit paths now correctly return a 3-tuple; this was causing a crash when no notebooks had changed - WiFi IP field — left blank when auto-detect finds nothing instead of showing a stale value
Config UX Improvements
- Sync action selection is now a single-select (radio) instead of a checkbox — makes it impossible to pick PDF conversion without backup by design:
- Backup only
- Backup + PDF Conversion
- Backup + PDF Conversion + AI OCR & Markdown Export
- Config defaults to all actions enabled
load_config()auto-corrects old configs that have invalid step combinations (e.g.["pdf"]→["backup", "pdf"])
Pipeline
- PDF hash detection — only notebooks whose merged PDF actually changed are forwarded to the Markdown export stage
- Each stage now writes a diagnostic manifest to the log directory:
updated_notebooks.txt,updated_pdf_pages.txt,updated_pdfs.txt,updated_md.txt - Log file moved one level up from the backup folder for easier access
Internals
- Single canonical
sanitize_name()— NTFS-only illegal chars replaced with-, everything else (spaces,&, parens,.) preserved NameRegistryadded for stable, deduplicated output path names across runs- Removed
obsidian_export_state.jsonstate tracking - Status message prefixes changed from
[OK]/[ERR]/[WRN]toOK -/ERR -/WRN -
Release v2.0.1
What's Changed
Performance
- Per-page change tracking — Only changed pages are re-converted to PDF and OCR'd, significantly reducing sync time for large notebooks (#10)
Bug Fixes
- Fixed page ordering — Pages now follow the correct order from the reMarkable tablet (using .content file ordering) instead of being sorted alphabetically by UUID
- Fixed CI — Replaced Chocolatey pkg-config with pip-based pkgconf for more reliable Windows CI builds
Other
- CI skips on version-only bumps
- Skip PyPI/Homebrew publishing for pre-releases
- Fixed README social image URL for PyPI display
Full Changelog: v2.0.0...v2.0.1