Releases: rlacombe/distillate
v0.7.0: Autonomous Experiments
0.7.0 — 2026-04-11
Distillate is now an autonomous research platform. Describe a hypothesis, and an AI agent runs experiments for you — training models, tuning hyperparameters, and reporting results. A desktop GUI lets you watch the frontier improve in real time, steer the agent, and compare runs across projects.
Highlights
- Autonomous experiments: describe what you want to test, an agent runs it. Time-budgeted sessions with live metric tracking, automatic frontier detection (
best/completedruns), and structured insight extraction - Desktop IDE: Electron app with four tabs — Control Panel (frontier chart + live session status), Session (terminal), Results (run grid + insights), Prompt (PROMPT.md editor). Context-aware chat with Nicolas throughout
- Cloud & email (optional): sign up with
--emailto get experiment reports with embedded charts, daily paper suggestions, and weekly digests. Papers and experiments sync to the cloud for backup - One-click onboarding: install to live experiment in 60 seconds — new users see CTAs to launch a demo or connect their paper library
- Paper-experiment integration: link papers to experiments, discover relevant papers, credit papers via
inspired_byon runs — what you read informs what you try - Desktop IDE: four-tab Electron app (Control Panel, Session, Results, Prompt) with context-aware chat, stop generation, and full highlight display
- No API key needed: runs entirely through your Claude Code subscription (Max or Pro)
New Features
- Autonomous experiments: describe a hypothesis, Nicolas spawns an agent to test it. Time-budgeted sessions, live metric tracking, and automatic insight extraction
- Alchemy skill system: 9 slash commands — The Laboratory (
/survey,/conjure,/steer,/assay,/distill), The Library (/brew,/forage,/tincture), and/transmuteto bridge papers and experiments - Onboarding flow: sidebar CTA, welcome screen CTA, chat suggestion — all lead to a 3-step scaffold/GitHub/launch flow that gets you to a running experiment in under a minute
- Library setup wizard: "Connect your library" CTA in papers sidebar → Zotero credentials → reading surface choice (reMarkable / iPad / any device) → sync
- Paper-experiment cross-references: linked papers in experiment detail, linked experiments in paper detail, both clickable for navigation
discover_relevant_paperstool: keyword-matches your paper library against experiment goals, returns candidates with relevance reasonsinspired_byon runs:conclude_runaccepts a paper reference, auto-links it to the project- Stop generation: red stop button interrupts Claude via SDK, Nicolas says "Stopped. What should I do instead?"
- Context-aware suggestions: chat pills above the input update based on context — experiment (steer, analyze, compare) or paper (summarize, experiment ideas, similar papers)
- Link handling: external links open in system browser, arXiv/DOI links show popup with "Open in browser" or "Add to library queue"
- Windows support:
install.ps1script,npm run install:win, homepage auto-detects OS via user agent purge_hook_runstool: clean up accumulated noise from manual script executions- 49 MCP tools: paper library, experiments, bridge, and cleanup tools via the Distillate MCP server
- Monorepo: desktop app, MCP server, and Agent SDK in a single repository
- GitHub integration: public repos by default (
distillate-xp-prefix), GitHub flare in control panel
Desktop IDE
- Control Panel: metric chart with log scale toggle, export to PNG, session timer, goal chips
- Session tab: embedded xterm.js terminal attached to the running Claude Code agent
- Results tab: runs grid with research insights (key brea 8000 kthrough, lessons learned, dead ends)
- Prompt tab: view and edit PROMPT.md with markdown rendering and syntax highlighting
- Three experiment states: running (green triangle), ready (purple circle), paused (gray square)
- Chat UX: purple presence dot on Nicolas messages, thinking spinner after tool completion, tool subtitles showing what's happening (search terms, project names, etc.)
- Full highlights: paper detail view shows complete highlights (no truncation)
- Keyboard shortcuts: Cmd+R refresh, Cmd+1-4 switch tabs, Cmd+E toggle sidebar, Cmd+K toggle chat
CLI
- Onboarding: first-use welcome with two clear paths — conjure an experiment or connect Zotero via
/init - Contextual suggestions: hints adapt to what you have (papers, experiments, or both)
- Rotating tips: one random skill tip per session
--report: reading insights dashboard — lifetime stats, weekly velocity, topic breakdown--export-state/--import-state: backup and restore tracked papers and reading history
Bug Fixes
- Scanner spurious runs: hooks fired on all Bash commands, creating ghost runs. Now gated by
DISTILLATE_SESSIONenv var — only fires inside Distillate-managed tmux sessions compare_projectsnull values: skipped non-"keep" runs and used wrong direction for loss metrics. Now includes all non-discarded runs with direction-aware best (min for loss, max for accuracy)- Unhashable list crash on delete: run names in set comprehensions crashed with list-valued hyperparameters. Defensive
str()wrapping - Highlights truncated at 3000 chars: desktop paper detail used the MCP tool's truncation limit. Now reads full highlights directly
- Links opened inside Electron app: no navigation interception. Added
will-navigate+setWindowOpenHandlerguards - Control panel disappeared on select:
isReadyvariable removed during refactor but still referenced, crashing the render - Tab hijack on polling: 15-second session poll re-rendered the detail pane, snapping back to Control Panel. Polling now only updates sidebar
- Sync 501 errors in DevTools:
triggerCloudSync()called.json()on non-ok responses - Dock icon too large in dev mode: now uses
.icnswith proper resolutions
Cloud & Email
- Cloud state sync: papers and experiments sync to the Distillate cloud API via granular endpoints with incremental pull (
?since=watermark) and additive merge - Run-level merge: cross-device sync merges individual runs — decisions advance monotonically (best > completed > crash), metrics and metadata fill gaps
- Email notifications: experiment reports on session completion (with embedded chart), daily paper suggestions, and weekly digest — each toggled independently
- Auto sync triggers: background sync after first app load, automatic push after experiment sessions end
- Supabase URL auto-derived: no manual configuration needed — the Supabase project ref is extracted from the anon key JWT
Experiment Decisions (best/completed)
- Auto-detected decisions:
conclude_run()automatically marks runs asbest(frontier-improving) orcompleted— agents no longer decide keep/discard - State migration v1→v2: existing experiments re-evaluated chronologically to compute best/completed from the key metric frontier
- Backward compatible: old
keep/discardin runs.jsonl parsed ascompleted;bestdetermined from state migration - Commit format:
[best]prefix on frontier-improving runs — e.g.[best] baseline CNN: f1=0.42
Desktop Improvements
- Chart Y-axis: scales to best runs only (discarded outliers no longer squish the frontier flat)
- Log-scale ticks: clean rounded values when data spans less than one decade
- Sidebar stability: experiments sorted by
added_atinstead oflast_scanned_at(no more reordering on reload) - Faster sidebar: removed auto-rescan from experiment list — state.json is authoritative, rescans only on session end and manual reload
- Session status: "Agent working — analyzing runs" instead of misleading "awaiting instructions"
- Enrichment prompts: cleaner output — one-sentence breakthroughs, no ALL CAPS, no Greek letters
CLI Improvements
--connectors: check status of all integrations (Zotero, email, Obsidian, reMarkable) at a glance--email: interactive email management with per-type toggles--sync-state: manual cloud sync trigger- Security: CORS tightened to localhost only, auth token verification on sensitive endpoints
Migration from 0.6.x
- No breaking changes — existing paper libraries carry over unchanged
distillatenow requires Claude Code — install from docs.anthropic.com/en/docs/claude-code- Desktop app is optional — the CLI works exactly the same as before
v0.6.0 — Read on any device
New Features
- Read on any device: no longer requires a reMarkable tablet — read and highlight in the Zotero app on iPad, desktop, Android, or any device. Pick your reading surface during
--initsetup. reMarkable remains fully supported.
Improvements
- Agent: dim magenta for verbose tool output, response truncation fix
- Email digest: trending section with top 3 papers, mobile-friendly layout
- Init wizard: WebDAV configuration step, reading surface choice
- Landing page: reMarkable now optional, "any device" messaging
- Windows:
--scheduleshows Task Scheduler instructions instead of crashing - Lazy rmscene imports: Zotero-only users don't need rmscene/rmapi installed
- WebDAV fallback: catches all HTTP errors, visible retry output, manual upload detection
Migration from 0.5.x
- The init wizard (
--init) now offers an optional newsletter signup at the end
Full changelog: https://github.com/rlacombe/distillate/blob/main/CHANGELOG.md
v0.5.2 — HF summary fallback
Improvements
- HuggingFace summary fallback: papers get a real one-liner even without a Claude API key, using HF's AI-generated summaries. Most AI/ML papers on arXiv already have an
ai_summaryvia the HuggingFace API — Distillate now stores it and uses it as fallback when Claude is unavailable. - Email trending: default limit tightened to 3 papers for cleaner digest emails.
Upgrade: pip install --upgrade distillate
v0.5.1 — WebDAV fix
Bug Fix
- WebDAV PDF downloads broken since 0.4.4:
get_pdf_attachment()only matchedimported_fileandimported_urllink modes, missing WebDAV'slinked_urlattachments. Papers got stuck as "Awaiting PDF" instead of downloading from WebDAV. Regression introduced in v0.4.4.
Upgrade: pip install --upgrade distillate
v0.5.0 — Agent Mode
Interactive agent mode — distillate becomes a research assistant.
Highlights
- Agent REPL:
distillatenow launches an interactive research assistant ("Nicolas") powered by Claude - Add papers from the REPL: give an arXiv ID and it's added to Zotero, enriched with metadata, and synced to reMarkable in one step
- Cross-paper synthesis: ask Nicolas to compare or synthesize across multiple papers
- HuggingFace Daily Papers: trending research with GitHub repo links and community votes
- Refresh metadata: agent can fix metadata gaps on existing papers via Semantic Scholar
- Conversation memory: sessions persist locally for cross-session context
Migration from 0.4.x
distillatenow opens the agent REPL — usedistillate --syncfor sync-only- Optional extras (
[ai],[email],[all]) removed —pip install distillateincludes everything
See CHANGELOG for full details.
v0.4.4 — Index numbers, terminal colors, reliability fixes
Paper index numbers, terminal colors, and reliability fixes.
Features
- Paper index numbers: every paper gets a stable
[index]shown in--status,--digest,--suggest,--list, and emails — use it to target papers in commands - Paper lookup by index, citekey, or title:
--reprocess 3,--remove kindel,--refresh-metadata "DynaSpec"all work - Single-paper refresh:
--refresh-metadatanow accepts an optional query to refresh just one paper - PDF subfolder: annotated PDFs now saved to
Saved/pdf/(configurable viaPDF_SUBFOLDER), keeping notes and PDFs separate — auto-migrates existing files - S2 author backfill: papers with unknown authors are enriched from Semantic Scholar, with automatic citekey regeneration
- Terminal colors: bold bright-white titles on dark terminals, dim gray metadata lines — TTY-aware with dark/light background detection
Bug Fixes
- Awaiting PDF retry: re-checks Zotero children when the stored attachment returns 404
- Missing years in citekeys: extracts year from DOI patterns; uses S2
yearfield as fallback - Title cleaning: strips
: JournalNamesuffixes from Zotero web clipper titles - Citekey for S2 authors: handles "First Last" name format
- Author preservation:
--refresh-metadatano longer overwrites S2-filled authors - Refresh reporting: citekey changes for non-processed papers are now reported
Full changelog: https://github.com/rlacombe/distillate/blob/main/CHANGELOG.md#044--2026-02-21
v0.4.3
v0.4.2 — Suggestion compute-once, email stats fix
Improvements
- Suggestion compute-once:
--suggest-emailnow calls Claude at most once per day — subsequent runs reuse cached suggestions (from local state or Gist) and just re-send the email
Bug Fixes
- Email stats missing pages/words: the main sync loop now auto-pushes state to the Gist after processing papers, so GH Actions emails have fresh reading stats
Full changelog: https://github.com/rlacombe/distillate/blob/main/CHANGELOG.md
v0.4.1 — Crash traceback logging, CI fix
Bug Fixes
- Traceback logging on crash: unhandled exceptions now log the full traceback to the log file / CI output, instead of only showing the one-line message
- CI uv cache warning: disabled uv cache in the email workflow to silence spurious "no lockfile" warnings
Full changelog: https://github.com/rlacombe/distillate/blob/main/CHANGELOG.md
v0.4.0 — Handwriting OCR, personalized summaries, collection filtering
What's new
- Handwriting OCR via Claude Vision — handwritten margin notes are transcribed using Claude Haiku, with the printed PDF page as context for accurate reading
- Personalized AI summaries — your margin notes are fed to the summarizer, so insights reflect what you found interesting
- Zotero collection filtering — scope Distillate to a specific collection via
ZOTERO_COLLECTION_KEY - Collection picker in init wizard —
--initlists your Zotero collections and lets you pick one
Improvements
- Landing page restructured: core features ("Built in") vs optional extensions ("Plug in what you need")
Removals
- Apple Vision / Pillow dependencies removed — handwriting OCR now uses Claude Vision instead
Full changelog: https://github.com/rlacombe/distillate/blob/main/CHANGELOG.md