8000
Skip to content

Releases: rlacombe/distillate

v0.7.0: Autonomous Experiments

11 Apr 21:09

Choose a tag to compare

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/completed runs), 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 --email to 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_by on 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 /transmute to 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_papers tool: keyword-matches your paper library against experiment goals, returns candidates with relevance reasons
  • inspired_by on runs: conclude_run accepts 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.ps1 script, npm run install:win, homepage auto-detects OS via user agent
  • purge_hook_runs tool: 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_SESSION env var — only fires inside Distillate-managed tmux sessions
  • compare_projects null 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 + setWindowOpenHandler guards
  • Control panel disappeared on select: isReady variable 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 .icns with 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 as best (frontier-improving) or completed — 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/discard in runs.jsonl parsed as completed; best determined 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_at instead of last_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
  • distillate now 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

25 Feb 22:01

Choose a tag to compare

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 --init setup. 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: --schedule shows 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

25 Feb 20:04

Choose a tag to compare

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_summary via 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

24 Feb 00:53

Choose a tag to compare

Bug Fix

  • WebDAV PDF downloads broken since 0.4.4: get_pdf_attachment() only matched imported_file and imported_url link modes, missing WebDAV's linked_url attachments. 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

24 Feb 00:07

Choose a tag to compare

Interactive agent mode — distillate becomes a research assistant.

Highlights

  • Agent REPL: distillate now 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

  • distillate now opens the agent REPL — use distillate --sync for sync-only
  • Optional extras ([ai], [email], [all]) removed — pip install distillate includes everything

See CHANGELOG for full details.

v0.4.4 — Index numbers, terminal colors, reliability fixes

22 Feb 07:17

Choose a tag to compare

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-metadata now accepts an optional query to refresh just one paper
  • PDF subfolder: annotated PDFs now saved to Saved/pdf/ (configurable via PDF_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 year field as fallback
  • Title cleaning: strips : JournalName suffixes from Zotero web clipper titles
  • Citekey for S2 authors: handles "First Last" name format
  • Author preservation: --refresh-metadata no 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

19 Feb 16:20

Choose a tag to compare

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 (page counts, highlight word counts)

v0.4.2 — Suggestion compute-once, email stats fix

19 Feb 16:16

Choose a tag to compare

Improvements

  • Suggestion compute-once: --suggest-email now 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

19 Feb 15:34

Choose a tag to compare

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

19 Feb 07:07

Choose a tag to compare

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--init lists 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

0