<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Norrie Taylor</title>
    <description>The latest articles on Forem by Norrie Taylor (@norrietaylor).</description>
    <link>https://forem.com/norrietaylor</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3860360%2Fe1af65ad-46b9-463f-8f78-4941d5a1be8a.jpeg</url>
      <title>Forem: Norrie Taylor</title>
      <link>https://forem.com/norrietaylor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/norrietaylor"/>
    <language>en</language>
    <item>
      <title>Full-Proof: Distillery 0.4.0 and the Agent Memory Problem</title>
      <dc:creator>Norrie Taylor</dc:creator>
      <pubDate>Mon, 20 Apr 2026 05:18:38 +0000</pubDate>
      <link>https://forem.com/norrietaylor/full-proof-distillery-040-and-the-agent-memory-problem-477b</link>
      <guid>https://forem.com/norrietaylor/full-proof-distillery-040-and-the-agent-memory-problem-477b</guid>
      <description>&lt;h1&gt;
  
  
  Full-Proof: Distillery 0.4.0 and the Agent Memory Problem
&lt;/h1&gt;

&lt;p&gt;!!! note "Release summary"&lt;br&gt;
    Distillery 0.4.0 shipped April 19, 2026. It's the release where the&lt;br&gt;
    MCP tool surface becomes a public contract: stable tool names,&lt;br&gt;
    consistent error codes, predictable response shapes. The release&lt;br&gt;
    body lives on the &lt;a href="https://github.com/norrietaylor/distillery/releases/tag/v0.4.0" rel="noopener noreferrer"&gt;GitHub release page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A few weeks ago I wrote &lt;a href="//building-a-second-brain-for-claude-code.md"&gt;the first post in this series&lt;/a&gt; about why I built Distillery. The short version: the knowledge your team generates while working with Claude Code is mostly evaporating, and the fix is to capture it where the work happens, not in a separate tool.&lt;/p&gt;

&lt;p&gt;That was the capture story. This post is about the memory story, and why I spent a release hardening the surface instead of shipping features.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Karpathy's LLM Wiki actually argues
&lt;/h2&gt;

&lt;p&gt;The shape of the agent-memory conversation changed in April. Karpathy posted &lt;a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f" rel="noopener noreferrer"&gt;his "LLM Wiki" idea&lt;/a&gt; (&lt;a href="https://news.ycombinator.com/item?id=47640875" rel="noopener noreferrer"&gt;HN discussion&lt;/a&gt;), and within a week the pattern had been cloned into at least five projects: &lt;a href="https://www.reddit.com/r/ClaudeAI/comments/1sddc33/i_built_a_modelagnostic_knowledge_base_platform/" rel="noopener noreferrer"&gt;Knowledge Raven&lt;/a&gt;, &lt;a href="https://github.com/AyanbekDos/memoriki" rel="noopener noreferrer"&gt;Memoriki&lt;/a&gt;, &lt;a href="https://github.com/opentrace/opentrace" rel="noopener noreferrer"&gt;OpenTrace KG-MCP&lt;/a&gt;, &lt;a href="https://github.com/Alidmo/OptiVault" rel="noopener noreferrer"&gt;OptiVault&lt;/a&gt;, and a handful of Obsidian harness variants. The shape of the argument, simplified:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Raw sources are not useful on their own. Chat logs, PRs, tickets, and docs are too lossy to reason over directly.&lt;/li&gt;
&lt;li&gt;The intermediate layer is an LLM-maintained wiki that compounds synthesis over time. You don't re-derive context per query. You maintain a living artifact.&lt;/li&gt;
&lt;li&gt;A query layer sits above that, CLAUDE.md-style and schema-first, trimmed for whatever context budget the model in use gives you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My own investigation of the memory research last week kept landing on a related but distinct conclusion. Three-tier layered memory (fast index on top, episodes in the middle, raw transcripts on demand) is now the default pattern in serious memory systems. &lt;a href="https://www.reddit.com/r/ClaudeAI/comments/1sc2zfm/the_right_way_to_build_memory_claude_is_doing_it/" rel="noopener noreferrer"&gt;LongMemEval-S at 73%&lt;/a&gt; is a reasonable community-stack baseline (&lt;a href="https://github.com/vektori-ai/vektori" rel="noopener noreferrer"&gt;Vektori&lt;/a&gt;, BGE-M3 plus Flash-2.5-lite), and &lt;a href="https://github.com/milla-jovovich/mempalace" rel="noopener noreferrer"&gt;MemPalace's ChromaDB-backed stack&lt;/a&gt; has since posted 96.6% on LongMemEval R@5 in raw mode, which is the kind of jump worth watching. The &lt;a href="https://flowpatrol.ai/blog/claude-code-two-memories" rel="noopener noreferrer"&gt;leaked Claude Code memory internals&lt;/a&gt;, three subsystems plus a "Dream" consolidation pass, is almost exactly this architecture. The failures in agent memory aren't mostly retrieval: they sit in the reasoning layer between retrieval and action, and in the moment a session ends and all the volatile context evaporates.&lt;/p&gt;

&lt;p&gt;Distillery is built around Karpathy's compile-and-query pattern, not the Vektori three-tier stratification. &lt;code&gt;/distill&lt;/code&gt; writes, &lt;code&gt;/recall&lt;/code&gt; queries, &lt;code&gt;/pour&lt;/code&gt; synthesizes. Under the hood it's a single DuckDB table with typed entries, hybrid BM25 plus vector search, and deduplication thresholds, not L0/L1/L2 access tiers. The LongMemEval benchmark and transcript-mining integration we're tracking in &lt;a href="https://github.com/norrietaylor/distillery/issues/233" rel="noopener noreferrer"&gt;issue #233&lt;/a&gt; is how we plan to measure ourselves against the three-tier systems on the same yardstick.&lt;/p&gt;

&lt;p&gt;The operational side of the wiki pattern is where the interesting work actually lives, though, and it's where contributor feedback shaped what 0.x shipped. Every entry carries provenance (author, session ID, source). Every entry can be corrected without losing its history. Entries can be marked expired or unreliable without being deleted (&lt;a href="https://github.com/norrietaylor/distillery/issues/177" rel="noopener noreferrer"&gt;issue #177&lt;/a&gt;). Those aren't decorative. They're the primitives that let a shared knowledge base admit it was wrong, which is what separates a living memory layer from a static dump.&lt;/p&gt;

&lt;h2&gt;
  
  
  The memory layer is load-bearing
&lt;/h2&gt;

&lt;p&gt;If you're building agents, the memory layer sits under everything else. Planners read from it. Tools write to it. Evals depend on it being deterministic across runs. When &lt;a href="https://claude.com/blog/claude-managed-agents" rel="noopener noreferrer"&gt;Claude Managed Agents&lt;/a&gt; launched in April with memory labeled "research preview," the entire community ecosystem (memsearch, Honcho, Hippo, Memoriki, thebrain, Knowledge Raven, Octopoda, MemPalace) rushed to fill the gap, because nobody ships serious agent work on top of a preview.&lt;/p&gt;

&lt;p&gt;The same argument applies one layer down. If the memory layer you build on has drifting tool names, inconsistent error codes, response envelopes that change shape between minor versions, and defaults that flood your context window without warning, every downstream agent inherits that instability. Planners inherit it. Evals inherit it. Shared team knowledge bases inherit it.&lt;/p&gt;

&lt;p&gt;That's what this release is about.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stability pledge
&lt;/h2&gt;

&lt;p&gt;From 0.4.0 onward, the MCP tool surface is a public contract. That covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool names&lt;/li&gt;
&lt;li&gt;Parameter shapes and defaults&lt;/li&gt;
&lt;li&gt;Error codes&lt;/li&gt;
&lt;li&gt;Response envelopes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Breaking changes require a major version bump. Evolution happens additively: new optional parameters, new tools, new output modes behind an explicit opt-in. Skills and plugins can declare &lt;code&gt;min_server_version&lt;/code&gt; with confidence that the surface they compiled against will still be there.&lt;/p&gt;

&lt;p&gt;This is a commitment, not a feature flag. If something has to break, it breaks on a major, with a deprecation window and loud warnings on the deprecated path first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped in 0.4.0
&lt;/h2&gt;

&lt;p&gt;Sixty-plus PRs landed under the &lt;code&gt;staging/api-hardening&lt;/code&gt; line. The narrative categories:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API surface hardening.&lt;/strong&gt; &lt;code&gt;distillery_store&lt;/code&gt;'s &lt;code&gt;dedup_action&lt;/code&gt; now means what it says (#332). &lt;code&gt;"stored"&lt;/code&gt; means a new row was written. &lt;code&gt;"merged"&lt;/code&gt; and &lt;code&gt;"linked"&lt;/code&gt; are reserved for true folds, not informational similarity hints; the similarity signal lives on &lt;code&gt;existing_entry_id&lt;/code&gt; and &lt;code&gt;similarity&lt;/code&gt; where it belongs. &lt;code&gt;distillery_list&lt;/code&gt; defaults to &lt;code&gt;output_mode="summary"&lt;/code&gt; (#311), which shrinks a typical &lt;code&gt;limit=50&lt;/code&gt; gh-sync response from roughly 300 KB of content to a few kilobytes of titles, tags, and previews. Error codes consolidated on a single &lt;code&gt;ToolErrorCode&lt;/code&gt; enum across every tool. &lt;code&gt;resolve_review&lt;/code&gt; is idempotent for no-op transitions (#333). Canonical &lt;code&gt;entry_type&lt;/code&gt; values are suggested on &lt;code&gt;INVALID_PARAMS&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storage quality.&lt;/strong&gt; Aborted transactions roll back and surface query failures in &lt;code&gt;distillery_status&lt;/code&gt; instead of swallowing them (#363). WAL is flushed after writes and preserved on recovery, with signature matching (#346). FTS WAL replay no longer fails on cold start (#349). The "ghost entry ID" class of bug is gone. &lt;code&gt;storage_bytes&lt;/code&gt; scopes to the filtered set when filters are active, so usage numbers stop lying about what you actually searched.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feeds.&lt;/strong&gt; &lt;code&gt;gh-sync&lt;/code&gt; now runs async via server-side background jobs (#348), so long syncs don't block the caller. Poll &lt;code&gt;distillery_sync_status&lt;/code&gt; for progress. Liveness fields are populated across poll and sync paths (#334), so &lt;code&gt;/watch&lt;/code&gt; reports accurate freshness. Crucially for anyone using ambient intelligence: feed entries are now excluded from the interest profile, which means &lt;code&gt;/radar&lt;/code&gt; no longer drifts toward whatever feed happens to be loudest that week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scheduling.&lt;/strong&gt; &lt;code&gt;/setup&lt;/code&gt; and &lt;code&gt;/watch&lt;/code&gt; now configure Claude Code routines (#272) instead of CronCreate jobs or GitHub Actions webhook scheduling. Three routines ship: hourly feed poll, daily stale check, weekly maintenance. The webhook endpoints (&lt;code&gt;/hooks/poll&lt;/code&gt;, &lt;code&gt;/hooks/rescore&lt;/code&gt;, &lt;code&gt;/hooks/classify-batch&lt;/code&gt;) are deprecated and log warnings when hit. &lt;code&gt;/api/maintenance&lt;/code&gt; is retained for orchestrated ops.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this unlocks
&lt;/h2&gt;

&lt;p&gt;Stability is boring on its own. What makes it worth writing about is everything it lets other people do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dashboards.&lt;/strong&gt; There's a SvelteKit dashboard in progress (the &lt;code&gt;dashboard/&lt;/code&gt; directory in the repo is the seed). With the MCP surface contracted, the dashboard can ship pinned against &lt;code&gt;min_server_version=0.4.0&lt;/code&gt;, and nothing downstream will break when internal implementations move.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community plugins.&lt;/strong&gt; If you want to build on top of the Distillery MCP tools, you can pin against the 0.4.0 contract with the same confidence you'd pin against any public SDK.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory-layer integrations.&lt;/strong&gt; LangChain orchestrators, Letta-style stateful-agent frameworks, and any MCP-native runtime can now treat Distillery as a durable backend instead of a moving target.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Stability is the prerequisite for anyone else building on top.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx distillery-mcp@0.4.0
&lt;span class="c"&gt;# or&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;distillery-mcp&lt;span class="o"&gt;==&lt;/span&gt;0.4.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The hosted demo server at &lt;code&gt;https://distillery-mcp.fly.dev/mcp&lt;/code&gt; has been redeployed to match. If you're coming from an older version, nothing you wrote against the 0.3.x surface should break. If it does, that's now a bug against the pledge, not a design decision, and I want to hear about it.&lt;/p&gt;

&lt;p&gt;The full release notes are on the &lt;a href="https://github.com/norrietaylor/distillery/releases/tag/v0.4.0" rel="noopener noreferrer"&gt;GitHub release&lt;/a&gt;. The discussion thread lives in &lt;a href="https://github.com/norrietaylor/distillery/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Karpathy's point about the LLM Wiki is that knowledge compounds when the layer under your agent is treated as infrastructure, not as something you rebuild every sprint. That's the model 0.4.0 commits to. Pour a full-proof one.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>mcp</category>
      <category>devtools</category>
      <category>release</category>
    </item>
    <item>
      <title>Building a Second Brain for Claude Code</title>
      <dc:creator>Norrie Taylor</dc:creator>
      <pubDate>Sat, 04 Apr 2026 03:51:12 +0000</pubDate>
      <link>https://forem.com/norrietaylor/building-a-second-brain-for-claude-code-1a4g</link>
      <guid>https://forem.com/norrietaylor/building-a-second-brain-for-claude-code-1a4g</guid>
      <description>&lt;h2&gt;
  
  
  Building a Second Brain for Claude Code
&lt;/h2&gt;

&lt;p&gt;Every team I've worked on has the same problem. Someone makes a decision — a good one, usually — with a lot of context behind it. Why we chose DuckDB over Postgres. Why we inverted that dependency. Why the authentication flow goes through a middleware layer instead of a decorator. And then, six months later, someone asks "why does this work this way?" and the answer is... gone. Buried in Slack. Lost in a PR description nobody remembers. Living only in the head of the person who wrote it, if they're still on the team.&lt;/p&gt;

&lt;p&gt;In the age of agentic development this fundamental problem has only been exacerbated. The time it takes to code up an epic is no longer the long pole in the SDLC tent. Knowledge is being generated at exponential rates and no one seems to be able to keep up.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;em&gt;The problem isn't generating knowledge. It's retaining it.&lt;/em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I started building Distillery to solve this problem for my own work with Claude Code. It turned into something more interesting than I expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Knowledge Lives in Chat
&lt;/h2&gt;

&lt;p&gt;When you work with Claude Code all day, you're having real conversations. You're debugging, designing, deciding. Some of those conversations contain genuinely valuable knowledge — not just the code produced, but the &lt;em&gt;reasoning&lt;/em&gt; behind it. The context that makes the code make sense.&lt;/p&gt;

&lt;p&gt;But that context lives in your chat history. It's ephemeral by design. Next session, fresh context. Next week, you can't find it. Next month, a new team member joins and has no idea why things work the way they do.&lt;/p&gt;

&lt;p&gt;The standard answers — wikis, Confluence, Notion — all share the same failure mode: they require friction to populate. A wiki doesn't help if writing to it is slower than the pace of actual work. Documentation that requires a separate workflow doesn't get written. Or it does, once, and then it rots.&lt;/p&gt;

&lt;p&gt;The irony is that the knowledge gets &lt;em&gt;generated&lt;/em&gt; constantly. Every time you and Claude Code figure out an approach, that's value. Every time you decide not to do something and explain why, that's value. It just doesn't get captured.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Insight: Capture Where Work Happens
&lt;/h2&gt;

&lt;p&gt;The fix isn't a better wiki. The fix is making capture so frictionless that it happens at the moment of insight, without switching context.&lt;/p&gt;

&lt;p&gt;If you're already talking to Claude Code, the capture tool should be Claude Code. Not a sidebar. Not a separate app. A slash command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/distill "Decided to use DuckDB for local storage because it supports vector similarity search natively via the VSS extension. Postgres would require pgvector and a separate service. For local dev and small-team deployments, DuckDB's file-based model is significantly simpler. Revisit if we need multi-writer concurrency."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. The decision, the reasoning, the trade-offs, captured in the moment, from inside the tool you're already using. And because it's semantic search, you can find it later in natural language:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/recall why did we choose DuckDB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the core insight Distillery is built on: capture-at-source, inside the assistant.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Distillery Does
&lt;/h2&gt;

&lt;p&gt;Distillery is a knowledge base system for Claude Code. It stores, searches, and classifies knowledge entries using DuckDB with vector similarity search. It includes ambient intelligence that monitors GitHub repos and RSS feeds for relevant developments. It exposes 18 MCP tools and 10 Claude Code slash commands. Install it with &lt;code&gt;pip install distillery-mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here are the commands:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/distill&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Capture knowledge from the current session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/recall&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Semantic search across all knowledge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/pour&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Multi-pass synthesis — summarize across many entries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/bookmark&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Store URLs with auto-generated summaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/minutes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Capture meeting notes with append support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/classify&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Review and triage the review queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/watch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Manage monitored GitHub repos and RSS feeds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/radar&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ambient digest of what's changed in your feeds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/tune&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adjust relevance scoring thresholds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/setup&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Onboarding wizard for MCP connectivity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The deduplication system is one of the things I'm most happy with. When you try to store something, Distillery checks semantic similarity against existing entries. Above 95% similarity, it skips — you already have this. Between 80-95%, it offers to merge — same concept, maybe new detail. Between 60-80%, it links — related, worth knowing about. This keeps the knowledge base from getting cluttered with near-duplicates, which is the main reason most personal knowledge systems eventually become unusable. (Details in the &lt;a href="https://norrietaylor.github.io/distillery/architecture/deduplication/" rel="noopener noreferrer"&gt;dedup docs&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;/pour&lt;/code&gt; command is the one that feels most like magic. You ask a synthesis question:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/pour how does our authentication system work?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it does a multi-pass synthesis: first pass retrieves the most relevant entries via semantic search, second pass extracts the key points, third pass synthesizes a coherent answer with citations showing which entries contributed what. For complex topics where knowledge is distributed across many entries, this is significantly better than any single search result. See the &lt;a href="https://norrietaylor.github.io/distillery/skills/pour/" rel="noopener noreferrer"&gt;pour docs&lt;/a&gt; for examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ambient Intelligence: The Game Changer
&lt;/h2&gt;

&lt;p&gt;The feature that changed how I work isn't capture or search — it's ambient intelligence. The &lt;code&gt;/watch&lt;/code&gt; and &lt;code&gt;/radar&lt;/code&gt; commands turn Distillery from a passive knowledge store into something that actively works for you.&lt;/p&gt;

&lt;p&gt;Here's the idea: you tell Distillery to watch sources — GitHub repos, RSS feeds, subreddits — and it polls them on a schedule. But it doesn't just dump everything into a feed. It &lt;em&gt;scores every item for relevance against your existing knowledge base&lt;/em&gt; using embedding similarity. If an item is semantically close to things you've already captured, it surfaces. If it's noise, it's filtered out.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/watch add https://github.com/anthropics/claude-code
/watch add https://simonwillison.net/atom/everything
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The scoring pipeline has layers that make it genuinely smart:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interest-boosted relevance.&lt;/strong&gt; Distillery mines your knowledge base to build an interest profile — your most-used tags (recency-weighted, so recent work matters more than old entries), your bookmarked domains, your tracked repos, your expertise areas. When a feed item matches entries tagged with your top interests, the relevance score gets boosted by up to 15%. This creates a positive feedback loop: the more you capture about a topic, the better Distillery gets at finding related content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trust-weighted sources.&lt;/strong&gt; Not all sources are equal. You can set a &lt;code&gt;trust_weight&lt;/code&gt; per source — your team's own repos at 1.0, a secondary blog at 0.7. The poller multiplies all scores by trust weight, giving you a tunable signal-to-noise ratio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two-tier thresholds.&lt;/strong&gt; Items scoring above 0.85 trigger alerts. Items between 0.60 and 0.85 are quietly stored for the next digest. Below 0.60, they're dropped. This prevents alert fatigue while still capturing everything worth knowing. Both thresholds are adjustable via &lt;code&gt;/tune&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart deduplication.&lt;/strong&gt; When the same story appears in three different feeds, Distillery catches it. A fast external ID check filters exact duplicates, then semantic dedup at 0.95 similarity catches rephrased duplicates. Batch-aware dedup prevents items from the same poll run from blocking each other.&lt;/p&gt;

&lt;p&gt;When you're ready for your briefing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/radar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get a synthesized digest grouped by source, with cross-cutting themes highlighted and links to the original items. Add &lt;code&gt;--suggest&lt;/code&gt; and Distillery will recommend new sources based on your interest profile — repos you reference but don't track, domains you bookmark but don't follow.&lt;/p&gt;

&lt;p&gt;The whole system runs on a schedule — hourly polls, daily rescoring, weekly maintenance — without any manual intervention. Your knowledge base gets smarter over time because the interest profile evolves as you capture more. I've caught breaking changes in dependencies, relevant new tools, and team-relevant discussions days before I would have otherwise. See the &lt;a href="https://norrietaylor.github.io/distillery/skills/watch/" rel="noopener noreferrer"&gt;feed system docs&lt;/a&gt; and &lt;a href="https://norrietaylor.github.io/distillery/skills/radar/" rel="noopener noreferrer"&gt;radar docs&lt;/a&gt; for the full details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture: Four Layers, Clean Separation
&lt;/h2&gt;

&lt;p&gt;The architecture is four layers:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbp5e0hpr8gmale7ohfyp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbp5e0hpr8gmale7ohfyp.png" alt=" " width="800" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The skills are Markdown files with YAML frontmatter — they're instructions for Claude Code, not code. The MCP server is where the actual logic lives. The core protocols are Python &lt;code&gt;Protocol&lt;/code&gt; classes (structural subtyping, not ABCs) that define the contract between layers. The backends implement those protocols.&lt;/p&gt;

&lt;p&gt;I chose MCP for the transport layer for a specific reason: it means Distillery tools are available to any MCP-compatible client, not just Claude Code. And because FastMCP handles the wire protocol, I can focus on the tool logic.&lt;/p&gt;

&lt;p&gt;The transport choice — stdio or HTTP — matters for deployment. Stdio is simpler: the MCP server runs as a subprocess of Claude Code, single user, no authentication needed. HTTP transport enables multi-user deployment: multiple Claude Code instances connect to a shared server, authentication is handled via GitHub OAuth, and the knowledge base is genuinely shared.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Stdio: local single-user
&lt;/span&gt;&lt;span class="n"&gt;distillery&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;

&lt;span class="c1"&gt;# HTTP: team deployment with GitHub OAuth
&lt;/span&gt;&lt;span class="n"&gt;distillery&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="mi"&gt;8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For storage, DuckDB with the VSS extension handles both structured queries and vector similarity search in a single file. No separate vector database. No Postgres. For local dev and small-team deployment, this is the right trade-off — simple operations (backup is &lt;code&gt;cp distillery.db distillery.db.bak&lt;/code&gt;), good enough performance, no infrastructure overhead.&lt;/p&gt;

&lt;p&gt;The embedding layer is pluggable. Default is Jina AI's embedding API (good quality, generous free tier). OpenAI's embeddings work too. The &lt;code&gt;EmbeddingProvider&lt;/code&gt; protocol makes it straightforward to add others.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Access: GitHub OAuth
&lt;/h2&gt;

&lt;p&gt;Running Distillery locally is a one-person knowledge base. The interesting case is team access: shared knowledge that everyone on the team can read and write.&lt;/p&gt;

&lt;p&gt;The HTTP transport with GitHub OAuth handles this. You deploy, configure GitHub OAuth credentials, and every team member connects their Claude Code to the same server. Knowledge captured by one person is searchable by everyone. &lt;code&gt;/pour&lt;/code&gt; synthesizes across the whole team's collective knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Distillery v0.1.0 is &lt;a href="https://pypi.org/project/distillery-mcp/" rel="noopener noreferrer"&gt;now on PyPI&lt;/a&gt; — &lt;code&gt;pip install distillery-mcp&lt;/code&gt;. With the package published, the next priorities are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP directory listings&lt;/strong&gt; — Submitting to the major MCP directories (Glama, mcp.so, Smithery, modelcontextprotocol.io) so teams can discover Distillery where they're already looking for MCP servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team skills&lt;/strong&gt; — The next wave of skills is built around shared knowledge bases. &lt;code&gt;/whois&lt;/code&gt; builds an evidence-backed expertise map from contributions — who on the team knows what, backed by the entries they've captured. &lt;code&gt;/digest&lt;/code&gt; generates team activity summaries so everyone stays aware of what others are learning. &lt;code&gt;/briefing&lt;/code&gt; provides a dashboard view of the team's collective knowledge state. &lt;code&gt;/investigate&lt;/code&gt; compiles deep context on a domain by synthesizing across the whole team's entries. &lt;code&gt;/gh-sync&lt;/code&gt; connects GitHub issues and PRs as knowledge sources. These are designed for teams running a shared Distillery instance with GitHub OAuth, where the real value compounds — every team member's captures make everyone else's searches and syntheses better. See the &lt;a href="https://norrietaylor.github.io/distillery/roadmap/" rel="noopener noreferrer"&gt;roadmap&lt;/a&gt; for the full list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Classification improvements&lt;/strong&gt; — The LLM-based classification engine uses a confidence threshold (default 60%) to decide what goes to the review queue. I want to experiment with few-shot examples in the classification prompt to improve precision on domain-specific knowledge.&lt;/p&gt;

&lt;p&gt;The full roadmap is at &lt;a href="https://norrietaylor.github.io/distillery/roadmap/" rel="noopener noreferrer"&gt;norrietaylor.github.io/distillery/roadmap/&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;From the Claude Code plugin marketplace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude plugin marketplace add norrietaylor/distillery
claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;distillery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run the onboarding wizard from a Claude Code session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The wizard checks MCP connectivity, detects whether you're on stdio or HTTP, and walks you through configuration. If you want to connect to the demo server to try it without any setup, &lt;code&gt;/setup&lt;/code&gt; handles that too. (The demo server at &lt;code&gt;distillery-mcp.fly.dev&lt;/code&gt; is for evaluation only — don't store anything sensitive there.)&lt;/p&gt;

&lt;p&gt;You'll need a Jina AI API key for embeddings (free tier is generous) and then to configure the MCP server in Claude Code's settings. The &lt;a href="https://norrietaylor.github.io/distillery/getting-started/local-setup/" rel="noopener noreferrer"&gt;Local Setup Guide&lt;/a&gt; walks through the full process.&lt;/p&gt;




&lt;p&gt;The thing I keep coming back to is that the knowledge problem is fundamentally a friction problem. Every system that requires you to leave your current context to capture knowledge will fail. The capture has to be where the work is.&lt;/p&gt;

&lt;p&gt;For teams using Claude Code, that's already solved: the capture tool is Claude Code. Distillery just gives that capture tool a place to store things, and a way to get them back.&lt;/p&gt;

&lt;p&gt;I'd love to hear what use cases you're running into — find me on GitHub at &lt;a href="https://github.com/norrietaylor/distillery" rel="noopener noreferrer"&gt;norrietaylor/distillery&lt;/a&gt;, check out the &lt;a href="https://norrietaylor.github.io/distillery/" rel="noopener noreferrer"&gt;full documentation&lt;/a&gt;, or drop a comment below.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>mcp</category>
      <category>devtools</category>
      <category>python</category>
    </item>
  </channel>
</rss>
