Distill research papers from Zotero through reMarkable into structured notes.
Save paper in Zotero ──> PDF uploaded to reMarkable
│
Read & highlight on reMarkable
Move to Read folder when done
│
Distillate picks it up:
├── Annotated PDF with highlights
├── Markdown note + AI summary
├── Reading log entry
└── Paper archived on reMarkable
pip install distillate
distillate initThe setup wizard walks you through connecting Zotero, reMarkable, and choosing where your notes go.
| Component | Required? | What it does |
|---|---|---|
| Zotero | Yes | Paper library + browser connector for saving papers |
| reMarkable tablet | Yes | Read & highlight papers with the built-in highlighter |
| rmapi | Yes | CLI bridge to reMarkable Cloud |
| Obsidian vault | No | Rich note integration (wiki-links, Dataview, stats) |
| Plain folder | No | Alternative to Obsidian — just markdown notes + PDFs |
| Anthropic API key | No | AI-generated summaries and key learnings |
| Resend API key | No | Email digests and paper suggestions |
Distillate uses rmapi to talk to the reMarkable Cloud.
macOS:
brew install rmapiLinux:
curl -L -o /usr/local/bin/rmapi \
https://github.com/ddvk/rmapi/releases/latest/download/rmapi-linuxx86-64
chmod +x /usr/local/bin/rmapiBasic (notes + highlights only):
pip install distillateWith AI summaries:
pip install "distillate[ai]"With email digest:
pip install "distillate[email]"Everything:
pip install "distillate[all]"distillate initThis walks you through:
- Connecting your Zotero account
- Registering your reMarkable device
- Choosing where notes go (Obsidian vault or plain folder)
- Optionally configuring AI summaries and email digests
Manual setup (without the wizard)
Create ~/.config/distillate/.env (or copy .env.example):
ZOTERO_API_KEY=your_key
ZOTERO_USER_ID=your_id
OBSIDIAN_VAULT_PATH=/path/to/vault # or OUTPUT_PATH=/path/to/folder
ANTHROPIC_API_KEY=your_key # optional
Register your reMarkable:
distillate --registerDevelopment install
git clone https://github.com/rlacombe/distillate.git
cd distillate
uv venv --python 3.12
source .venv/bin/activate
uv pip install -e ".[all]"
pytest tests/distillate- Polls Zotero for new papers added since last run
- Downloads PDFs and uploads to reMarkable
Distillate/Inbox - Tags papers
inboxin Zotero, enriches with Semantic Scholar citation data - Checks reMarkable
Distillate/Readfor papers you've finished reading - Extracts highlighted text from the reMarkable document
- Renders an annotated PDF with highlights overlaid on the original
- Creates a note with metadata, highlights, and AI summary (if configured)
- Updates the Reading Log and tags the paper
readin Zotero - Moves processed documents to
Distillate/Savedon reMarkable
On first run, the script sets a watermark at your current Zotero library version. Only papers added after this point will be synced.
distillate # Run the full sync workflow
distillate --dry-run # Preview what would happen (no changes)
distillate --reprocess "Title" # Re-run highlights + summary for a paper
distillate --suggest # Get 3 paper suggestions from your queue
distillate --promote # Move suggested papers to reMarkable root
distillate --digest # Send a weekly reading digest email
distillate --themes 2026-02 # Generate monthly research themes synthesis
distillate --backfill-s2 # Backfill Semantic Scholar data
distillate --sync-state # Push state to a GitHub Gist
distillate --register # Register a reMarkable device
distillate --init # Run the setup wizardWhen you highlight text on the reMarkable using the built-in highlighter (with text recognition enabled), the text is embedded in the document's .rm files.
Distillate:
- Downloads the raw document bundle via rmapi
- Parses
.rmfiles using rmscene to extract highlighted text - Searches for that text in the original PDF using PyMuPDF and adds highlight annotations
- Saves the annotated PDF and writes highlights to the note
With an Anthropic API key, each processed paper gets:
- A one-liner explaining why the paper matters (shown in the Reading Log)
- A paragraph summary of methods and findings
- Key learnings — 4-6 bullet points distilling the most important insights
Without an API key, papers use their abstract as a fallback.
# Install automatic sync (every 15 min) + auto-promote (every 8 hours)
./scripts/install-launchd.sh
# Useful commands
launchctl start com.distillate.sync # Run sync now
tail -f ~/Library/Logs/distillate.log # Watch logs
./scripts/uninstall-launchd.sh # Remove schedule*/15 * * * * /path/to/.venv/bin/distillate >> /var/log/distillate.log 2>&1
All settings live in .env (either ~/.config/distillate/.env or your working directory). See .env.example for the full list.
| Setting | Default | Description |
|---|---|---|
ZOTERO_API_KEY |
(required) | Zotero API key |
ZOTERO_USER_ID |
(required) | Zotero numeric user ID |
RM_FOLDER_PAPERS |
Distillate |
Parent folder on reMarkable |
RM_FOLDER_INBOX |
Distillate/Inbox |
Folder for unread papers |
RM_FOLDER_READ |
Distillate/Read |
Move papers here when done reading |
RM_FOLDER_SAVED |
Distillate/Saved |
Archive folder for processed papers |
OBSIDIAN_VAULT_PATH |
(empty) | Path to Obsidian vault |
OBSIDIAN_PAPERS_FOLDER |
Distillate |
Subfolder within the vault |
OUTPUT_PATH |
(empty) | Plain folder for notes (alternative to Obsidian) |
ANTHROPIC_API_KEY |
(empty) | Anthropic API key for AI summaries |
CLAUDE_SMART_MODEL |
claude-sonnet-4-5 |
Model for summaries |
CLAUDE_FAST_MODEL |
claude-haiku-4-5 |
Model for suggestions and themes |
RESEND_API_KEY |
(empty) | Resend API key for email features |
DIGEST_TO |
(empty) | Email address for digests |
- Save a paper to Zotero using the browser connector
- Wait for Distillate to sync (or run it manually)
- Read and highlight on your reMarkable
- Move the document from
Distillate/InboxtoDistillate/Read - The next sync picks it up and creates your note
MIT