Skip to content

Automate paper reading workflow between Zotero and reMarkable

License

Notifications You must be signed in to change notification settings

rlacombe/distillate

Repository files navigation

Distillate

Distill research papers from Zotero through reMarkable into structured notes.

PyPI Python 3.10+ License: MIT

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

Quick Start

pip install distillate
distillate init

The setup wizard walks you through connecting Zotero, reMarkable, and choosing where your notes go.

What You Need

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

Install

1. Install rmapi

Distillate uses rmapi to talk to the reMarkable Cloud.

macOS:

brew install rmapi

Linux:

curl -L -o /usr/local/bin/rmapi \
  https://github.com/ddvk/rmapi/releases/latest/download/rmapi-linuxx86-64
chmod +x /usr/local/bin/rmapi

2. Install Distillate

Basic (notes + highlights only):

pip install distillate

With AI summaries:

pip install "distillate[ai]"

With email digest:

pip install "distillate[email]"

Everything:

pip install "distillate[all]"

3. Run the setup wizard

distillate init

This walks you through:

  1. Connecting your Zotero account
  2. Registering your reMarkable device
  3. Choosing where notes go (Obsidian vault or plain folder)
  4. 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 --register
Development 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/

Usage

distillate

What happens each run

  1. Polls Zotero for new papers added since last run
  2. Downloads PDFs and uploads to reMarkable Distillate/Inbox
  3. Tags papers inbox in Zotero, enriches with Semantic Scholar citation data
  4. Checks reMarkable Distillate/Read for papers you've finished reading
  5. Extracts highlighted text from the reMarkable document
  6. Renders an annotated PDF with highlights overlaid on the original
  7. Creates a note with metadata, highlights, and AI summary (if configured)
  8. Updates the Reading Log and tags the paper read in Zotero
  9. Moves processed documents to Distillate/Saved on reMarkable

On first run, the script sets a watermark at your current Zotero library version. Only papers added after this point will be synced.

Commands

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 wizard

How highlights work

When 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:

  1. Downloads the raw document bundle via rmapi
  2. Parses .rm files using rmscene to extract highlighted text
  3. Searches for that text in the original PDF using PyMuPDF and adds highlight annotations
  4. Saves the annotated PDF and writes highlights to the note

AI summaries

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.

Scheduling

macOS (launchd)

# 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

Linux (cron)

*/15 * * * * /path/to/.venv/bin/distillate >> /var/log/distillate.log 2>&1

Configuration

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

Your workflow

  1. Save a paper to Zotero using the browser connector
  2. Wait for Distillate to sync (or run it manually)
  3. Read and highlight on your reMarkable
  4. Move the document from Distillate/Inbox to Distillate/Read
  5. The next sync picks it up and creates your note

License

MIT

About

Automate paper reading workflow between Zotero and reMarkable

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •