<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Local-First on RockB</title><link>https://baeseokjae.github.io/tags/local-first/</link><description>Recent content in Local-First on RockB</description><image><title>RockB</title><url>https://baeseokjae.github.io/images/og-default.png</url><link>https://baeseokjae.github.io/images/og-default.png</link></image><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 13 Aug 2026 13:02:05 +0000</lastBuildDate><atom:link href="https://baeseokjae.github.io/tags/local-first/index.xml" rel="self" type="application/rss+xml"/><item><title>AgentProof Review 2026: Local-First CI Verification for AI-Generated Code Diffs</title><link>https://baeseokjae.github.io/posts/agentproof-ci-diff-verification-2026/</link><pubDate>Thu, 13 Aug 2026 13:02:05 +0000</pubDate><guid>https://baeseokjae.github.io/posts/agentproof-ci-diff-verification-2026/</guid><description>AgentProof is a free local-first proof harness that verifies AI-generated code diffs in CI with a min-score gate — review outcomes, not diff hunks.</description><content:encoded><![CDATA[<p>AgentProof is a free, local-first proof harness that verifies AI-generated code and diffs by detecting the project type, running safe local checks, launching the app, crawling routes with Playwright, and scoring launch readiness — all without uploading your source, using an API key, or trusting a cloud vendor. For AI code CI verification, it answers one question the chat transcript never can: did this app actually work, or did it just look good in the transcript? This review covers how AgentProof works, its GitHub Action score gate, its pricing, and how it compares to ProofPack and the broader &ldquo;proof beats diffs&rdquo; movement.</p>
<h2 id="what-is-agentproof">What Is AgentProof?</h2>
<p>AgentProof is a local proof harness for AI-built apps, repositories, and public pull requests. Built by dicnunz and released as an open-source tool, it exists to answer a single, stubborn question: when an AI coding agent claims it finished a feature, did the resulting app actually work?</p>
<p>The tool is deliberately positioned against the most common failure mode of AI coding agents. A coding agent produces a transcript full of confident &ldquo;done&rdquo; messages, and a reviewer is left staring at a large diff and still has to judge mergeability and correctness by hand. AgentProof automates that judgment by running the app and verifying outcomes rather than eyeballing code.</p>
<p>Key properties from the official repository:</p>
<ul>
<li>Detects the project type automatically and runs safe local checks appropriate to that stack.</li>
<li>Starts the application and crawls its routes using Playwright.</li>
<li>Captures screenshots and console errors during the crawl.</li>
<li>Checks accessibility and broken links.</li>
<li>Produces a numeric &ldquo;launch readiness&rdquo; score.</li>
<li>Writes a static report to <code>agentproof-report/index.html</code>.</li>
</ul>
<p>Because everything runs locally, AgentProof makes no paid API calls, needs no API key, requires no hosting, uses no database, sends no telemetry, and never uploads your source code.</p>
<h2 id="why-ai-generated-diffs-need-a-new-kind-of-verification">Why AI-Generated Diffs Need a New Kind of Verification</h2>
<p>The traditional code review workflow was built for human-authored changes. A human writes a diff, and a reviewer reads it, reasons about intent, and approves or requests changes. That model breaks down when the diff is generated by an AI agent.</p>
<p>The core problem is the scale and nature of AI diffs. As the ZeroNoise analysis of verification-first coding agents notes, the core failure is &ldquo;coming back to a 1000-line diff and still having to judge mergeability and correctness yourself.&rdquo; When an agent produces a thousand lines of changes in minutes, line-by-line review becomes impractical, and reading a transcript tells you little about whether the software actually runs.</p>
<p>There is also a determinism problem. CI/CD for AI agents behaves differently from CI/CD for traditional software because agents are non-deterministic. As the UnderstandingData analysis of CI/CD agent patterns points out, the same prompt can produce different outputs on each run, which means a test that passed yesterday can fail today for no obvious reason.</p>
<p>The emerging consensus, captured in the &ldquo;proof beats diffs&rdquo; thesis, is that teams should stop reviewing code and start verifying outcomes. Instead of asking &ldquo;does this diff look correct?&rdquo;, you ask &ldquo;does the built application work?&rdquo; That shift is exactly what AgentProof automates.</p>
<p>The market context is enormous. The OpenAI Codex CLI repository has roughly 105,000+ stars as of mid-2026, underscoring how large the AI-coding-tool audience has grown. That audience increasingly needs trust tooling before large AI-generated diffs get merged.</p>
<h2 id="how-agentproof-works-from-project-detection-to-launch-score">How AgentProof Works: From Project Detection to Launch Score</h2>
<p>AgentProof&rsquo;s verification pipeline is designed to be automatic and hands-off. The workflow follows a defined sequence:</p>
<ol>
<li><strong>Project detection.</strong> AgentProof inspects the repository to determine the project type and stack.</li>
<li><strong>Safe local checks.</strong> It runs checks that are safe to execute locally and appropriate for the detected stack.</li>
<li><strong>Application startup.</strong> It launches the app so the runtime behavior can be observed.</li>
<li><strong>Route crawling with Playwright.</strong> It crawls the application&rsquo;s routes, simulating a user navigating through the UI.</li>
<li><strong>Evidence capture.</strong> During the crawl it captures screenshots and console errors.</li>
<li><strong>Quality checks.</strong> It checks accessibility and looks for broken links.</li>
<li><strong>Scoring.</strong> It aggregates the results into a launch-readiness score.</li>
</ol>
<p>The output is a static HTML report. This report becomes the durable evidence artifact that a reviewer, a CI system, or a human stakeholder can inspect to judge whether the app actually works.</p>
<p>This runtime-verification approach is philosophically different from simply validating that code compiles or that unit tests pass. AgentProof verifies that the application launches, renders, navigates, and behaves correctly as a running product — which is closer to what a human reviewer actually cares about when an agent claims a feature is done.</p>
<h2 id="agentproof-in-ci-github-action-min-score-gate-and-badge">AgentProof in CI: GitHub Action, Min-Score Gate, and Badge</h2>
<p>The most practical reason to use AgentProof for AI code CI verification is its GitHub Action integration. AgentProof ships a reusable GitHub Action that plugs directly into a workflow.</p>
<p>The key feature is the min-score gate. You can configure a minimum launch-readiness score, for example <code>min-score: '70'</code>, and the workflow fails if the app scores below that threshold. This turns a fuzzy &ldquo;did the AI do a good job?&rdquo; judgment into a deterministic, repeatable quality gate.</p>
<p>The Action also produces a README badge, so the launch-readiness score becomes a persistent, visible signal on the repository. Path targeting is supported, allowing you to scope the verification to a specific directory, such as <code>examples/demo-app</code>.</p>
<p>This score-gate pattern matters because it addresses the non-determinism of AI agents head-on. When a human reviews every AI diff, the gate is inconsistent and slow. When a CI gate enforces a numeric threshold, the verification is automatic, repeatable, and cheap to run on every pull request.</p>
<p>A typical usage flow is:</p>
<ol>
<li>An AI agent produces a diff and opens a pull request.</li>
<li>The GitHub Action runs AgentProof against the PR&rsquo;s build.</li>
<li>AgentProof crawls the app, scores launch readiness, and writes the report.</li>
<li>The workflow passes or fails based on the configured <code>min-score</code>.</li>
<li>The report and badge give reviewers objective evidence to merge or reject.</li>
</ol>
<h2 id="privacy-and-local-first-design-no-api-key-no-telemetry-no-source-upload">Privacy and Local-First Design: No API Key, No Telemetry, No Source Upload</h2>
<p>A central selling point of AgentProof is its local-first, privacy-preserving design. The tool is explicitly built to verify AI code without uploading source or trusting a cloud vendor.</p>
<p>The design constraints from the repository are unambiguous:</p>
<ul>
<li><strong>No paid API.</strong> All verification runs locally with local tooling.</li>
<li><strong>No API key.</strong> There is nothing to configure or leak.</li>
<li><strong>No hosting.</strong> The report is a static local file.</li>
<li><strong>No database.</strong> No server-side state.</li>
<li><strong>No telemetry.</strong> The tool does not phone home.</li>
<li><strong>No source upload.</strong> Your code stays on your machine.</li>
</ul>
<p>This makes AgentProof attractive for teams with strict privacy and sovereignty requirements. If your organization cannot send proprietary source code to a third-party verification service, a local harness is the only viable option for automated AI-code verification.</p>
<p>For open-source projects, this local design also means anyone can audit the verification itself. There is no opaque cloud service sitting between the code and the verdict — the entire proof is reproducible on any machine.</p>
<h2 id="pricing-and-the-149-mini-audit-when-free-local-proof-isnt-enough">Pricing and the $149 Mini Audit: When Free Local Proof Isn&rsquo;t Enough</h2>
<p>AgentProof itself is free and open source. The monetization model is a fixed-price professional service for cases where local verification alone is not sufficient.</p>
<p>The paid offering is a <strong>Mini Audit</strong> at a flat <strong>$149</strong> for an asynchronous, written proof packet of one public repository, demo, or pull request. The scope is deliberately narrow: no calls, no secrets, no private-repo access. You get an external, written verification that a public AI-built artifact actually works.</p>
<p>The pricing logic is framed as a break-even trade against the review churn it replaces. At a fully loaded rate of $50/hour, $149 breaks even after roughly 3 hours of saved review time. At $100/hour, it breaks even after 1.5 hours. If you would otherwise spend that long manually reviewing and re-testing a large AI diff, the Mini Audit pays for itself.</p>
<p>The Mini Audit is aimed at a specific situation: when you need outside, independent written proof — for a client deliverable, a pitch, a launch, or a public-facing claim — and running the harness yourself is not sufficient evidence.</p>
<h2 id="agentproof-vs-proofpack-runtime-verification-vs-evidence-bundle">AgentProof vs ProofPack: Runtime Verification vs Evidence Bundle</h2>
<p>The most direct comparison for AgentProof is ProofPack, another open-source local-only tool in the same space. Although both claim to be &ldquo;proof&rdquo; tools for AI coding agents, they solve different problems.</p>
<table>
  <thead>
      <tr>
          <th>Dimension</th>
          <th>AgentProof</th>
          <th>ProofPack</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Core purpose</td>
          <td>Runtime/launch verification of the app</td>
          <td>Evidence bundle / diff provenance</td>
      </tr>
      <tr>
          <td>What it proves</td>
          <td>The app actually launches, crawls, and scores</td>
          <td>A record of what the agent did</td>
      </tr>
      <tr>
          <td>Approach</td>
          <td>Detect project, run app, crawl with Playwright, score</td>
          <td>Wrap agent command, capture logs and state</td>
      </tr>
      <tr>
          <td>Output</td>
          <td><code>agentproof-report/index.html</code> + score</td>
          <td>Proof folder with prompt, logs, git.diff, checksums</td>
      </tr>
      <tr>
          <td>Typical usage</td>
          <td><code>verify the built app works</code></td>
          <td><code>proofpack run -- claude &quot;fix login bug&quot;</code> then <code>proofpack verify</code></td>
      </tr>
      <tr>
          <td>Verification target</td>
          <td>The running product</td>
          <td>The agent&rsquo;s execution artifact</td>
      </tr>
  </tbody>
</table>
<p>ProofPack positions itself as &ldquo;receipts for AI coding agents.&rdquo; It wraps Claude Code, Codex CLI, Hermes, or any command and writes a proof folder containing the prompt, stdout/stderr logs, git before/after state, <code>git.diff</code>, a commands log, test output, a manifest, and checksums.</p>
<p>AgentProof, by contrast, is runtime verification. It does not primarily care about the execution transcript; it cares about whether the resulting application behaves correctly when launched.</p>
<p>In practice the two are complementary. ProofPack answers &ldquo;what did the agent actually do?&rdquo; AgentProof answers &ldquo;does the finished app actually work?&rdquo; A rigorous team could use both: ProofPack to capture provenance, and AgentProof to verify the runtime outcome.</p>
<h2 id="pros-and-cons">Pros and Cons</h2>
<table>
  <thead>
      <tr>
          <th>Pros</th>
          <th>Cons</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Free and open source</td>
          <td>Local verification depends on the local environment being set up correctly</td>
      </tr>
      <tr>
          <td>Fully local-first: no API key, no telemetry, no source upload</td>
          <td>Playwright crawling may miss behavior that only appears under real user conditions</td>
      </tr>
      <tr>
          <td>Automated score gate makes CI verification deterministic</td>
          <td>Numeric score can be gamed or may not capture every correctness issue</td>
      </tr>
      <tr>
          <td>Answers &ldquo;did the app work?&rdquo; not &ldquo;does the diff look ok?&rdquo;</td>
          <td>Scope limited to launchable app projects; not suited to every repo type</td>
      </tr>
      <tr>
          <td>Produces a readable static report and README badge</td>
          <td>The paid Mini Audit only covers public repos/demos/PRs</td>
      </tr>
  </tbody>
</table>
<h2 id="who-should-use-agentproof-and-who-shouldnt">Who Should Use AgentProof (and Who Shouldn&rsquo;t)</h2>
<p>AgentProof is a strong fit if:</p>
<ul>
<li>You rely heavily on AI coding agents and merge large generated diffs.</li>
<li>You need a deterministic CI gate for non-deterministic agent output.</li>
<li>You cannot or will not send proprietary source to a third-party cloud verification service.</li>
<li>You want objective launch-readiness evidence for reviews, demos, or client deliverables.</li>
<li>You maintain open-source projects where a README score badge adds trust.</li>
</ul>
<p>AgentProof may not be the right tool if:</p>
<ul>
<li>Your work is mostly backend logic with no launchable app or browsable routes to crawl.</li>
<li>You need deep, line-by-line code correctness analysis rather than runtime outcome verification.</li>
<li>You require verification of code that must never be executed locally in your environment.</li>
<li>You need independent, third-party written proof of a private repository — that is outside the Mini Audit&rsquo;s scope.</li>
</ul>
<h2 id="verdict-and-alternatives">Verdict and Alternatives</h2>
<p>AgentProof is a genuinely useful addition to the AI-verification toolkit. It aligns with the strongest trend in the space — the &ldquo;proof beats diffs&rdquo; shift from reviewing code to verifying outcomes — and it does so with a discipline most competitors lack: fully local, no telemetry, no source upload, no paid API. The GitHub Action with a min-score gate turns fuzzy human judgment about AI output into a repeatable CI check, which is precisely what teams merging large agent-generated diffs need.</p>
<p>Its main limitation is scope. Runtime, launch-oriented verification is not a substitute for code correctness analysis, and teams with strict non-execution constraints will find it unusable. The pricing is also worth weighing against recurring spend: a single agent task costs roughly $0.015–0.05 in tokens, a 50-scenario suite runs $0.75–2.50, and 20+ runs a day on every PR can total $15–50 per month — so a $149 Mini Audit is best reserved for cases where local proof is not enough.</p>
<p>Strong alternatives depend on your priority. For diff provenance and execution evidence, ProofPack is the natural counterpart. For teams that want cloud-scale verification and spec-driven loops, the broader verification-first agents ecosystem — exemplified by Cursor&rsquo;s 10x usage jump when agents can prove their own correctness — points to a future where verification is the core product feature of coding agents, not an afterthought.</p>
<p>For most teams, the sensible starting point is the free, local harness: wire AgentProof into CI, set a reasonable min-score gate, and let the launch score do the reviewing while you focus on the outcomes that matter.</p>
<h2 id="faq">FAQ</h2>
<p><strong>What is AgentProof?</strong>
AgentProof is a free, local-first proof harness that verifies AI-built apps and public pull requests by detecting the project type, running safe checks, launching the app, crawling routes with Playwright, and producing a launch-readiness score in a static report.</p>
<p><strong>How does AgentProof verify AI-generated code diffs in CI?</strong>
It ships a GitHub Action with a min-score gate (for example <code>min-score: '70'</code>). The Action crawls the built app, scores launch readiness, and fails the workflow if the app scores below the threshold, turning agent verification into a deterministic CI check.</p>
<p><strong>Is AgentProof really free and private?</strong>
Yes. It requires no paid API, no API key, no hosting, no database, and no telemetry, and it never uploads your source code. Everything runs locally and outputs a static <code>agentproof-report/index.html</code>.</p>
<p><strong>What is the $149 Mini Audit?</strong>
It is a fixed-price, asynchronous written proof packet for one public repository, demo, or pull request — no calls, no secrets, no private-repo access. It breaks even after roughly 3 hours of saved review time at $50/hour or 1.5 hours at $100/hour.</p>
<p><strong>How does AgentProof compare to ProofPack?</strong>
AgentProof verifies the runtime outcome — whether the launched app actually works and scores — while ProofPack is an evidence bundle that captures what the agent did (prompt, logs, git.diff, checksums). They are complementary: ProofPack gives provenance, AgentProof gives runtime proof.</p>
]]></content:encoded></item><item><title>Knowledge Inbox for AI Agents and Obsidian: The Local-First Way to Capture Everything (2026 Guide)</title><link>https://baeseokjae.github.io/posts/knowledge-inbox-ai-agents-obsidian-2026/</link><pubDate>Thu, 13 Aug 2026 07:01:39 +0000</pubDate><guid>https://baeseokjae.github.io/posts/knowledge-inbox-ai-agents-obsidian-2026/</guid><description>A knowledge inbox turns links, PDFs, videos, and notes into structured Markdown knowledge cards in your Obsidian vault — locally, with no cloud dependency.</description><content:encoded><![CDATA[<p>A knowledge inbox for AI agents and Obsidian is a local-first ingestion pipeline that turns raw inputs — links, PDFs, videos, screenshots, and plain text — into structured Markdown knowledge cards inside your own vault. Instead of dumping every snippet into cloud read-it-later apps, it normalizes all sources through a single pipeline, enriches them with OCR, transcription, and auto-tagging, then stores everything as human-readable files plus a queryable SQLite index. Your AI agents read the same local store your notes live in.</p>
<h2 id="what-is-a-knowledge-inbox-and-why-go-local-first">What Is a Knowledge Inbox and Why Go Local-First?</h2>
<p>A knowledge inbox is the capture stage of a personal knowledge management (PKM) system. Think of it as the &ldquo;inbox zero&rdquo; pattern applied to everything you consume: an article you bookmarked, a YouTube video, a podcast episode, a PDF whitepaper, a screenshot, or a WeChat message. Instead of leaving those inputs scattered across apps and browser tabs, a knowledge inbox routes them into one normalized destination where your notes and your AI agents can actually use them.</p>
<p>The &ldquo;local-first&rdquo; part is the differentiator. Cloud read-it-later tools like Readwise, Matter, and Instapaper sync your highlights to their servers, where they are subject to their privacy policies, pricing tiers, and eventual shutdown. A local-first knowledge inbox keeps your raw materials and your enriched knowledge cards on your own machine or network. That matters more in 2026 than it did a few years ago, because the inputs you want to preserve are increasingly private: personal research, medical PDFs, financial statements, and sensitive internal documents.</p>
<p>Obsidian&rsquo;s own ecosystem is a signal of how big this space has grown. The official plugin/community release repository has passed 20,700 GitHub stars, reflecting a large, active community of plugins and tools built around the vault format. A knowledge inbox plugs directly into that ecosystem, which means the structured cards it produces work with the same tools, themes, and graph views you already rely on.</p>
<h2 id="how-local-first-ingestion-works-from-raw-source-to-markdown-knowledge-card">How Local-First Ingestion Works: From Raw Source to Markdown Knowledge Card</h2>
<p>The reference knowledge-inbox pipeline is a clean, reproducible model for how local-first ingestion works. Every input flows through the same stages regardless of where it came from:</p>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 1024 25"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='56' y='4' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='88' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='192' y='4' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='200' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='208' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='216' y='4' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='232' y='4' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='248' y='4' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='256' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='264' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='272' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='280' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='288' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='296' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='312' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='328' y='4' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='336' y='4' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='344' y='4' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='360' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='376' y='4' fill='currentColor' style='font-size:1em'>W</text>
<text text-anchor='middle' x='384' y='4' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='392' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='400' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='408' y='4' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='416' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='424' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='440' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='456' y='4' fill='currentColor' style='font-size:1em'>A</text>
<text text-anchor='middle' x='464' y='4' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='480' y='4' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='496' y='4' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='504' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='512' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='520' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='528' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='536' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='544' y='4' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='552' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='560' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='568' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='584' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='600' y='4' fill='currentColor' style='font-size:1em'>T</text>
<text text-anchor='middle' x='608' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='616' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='624' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='640' y='4' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='656' y='4' fill='currentColor' style='font-size:1em'>K</text>
<text text-anchor='middle' x='664' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='672' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='680' y='4' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='688' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='696' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='704' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='712' y='4' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='720' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='736' y='4' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='744' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='752' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='760' y='4' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='768' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='776' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='792' y='4' fill='currentColor' style='font-size:1em'>→</text>
<text text-anchor='middle' x='808' y='4' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='816' y='4' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='824' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='832' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='840' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='848' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='856' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='864' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='880' y='4' fill='currentColor' style='font-size:1em'>M</text>
<text text-anchor='middle' x='888' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='896' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='904' y='4' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='912' y='4' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='920' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='928' y='4' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='936' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='952' y='4' fill='currentColor' style='font-size:1em'>+</text>
<text text-anchor='middle' x='968' y='4' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='976' y='4' fill='currentColor' style='font-size:1em'>Q</text>
<text text-anchor='middle' x='984' y='4' fill='currentColor' style='font-size:1em'>L</text>
<text text-anchor='middle' x='992' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='1000' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='1008' y='4' fill='currentColor' style='font-size:1em'>e</text>
</g>

    </svg>
  
</div>
<ol>
<li><strong>Source Adapter</strong> — A connector that pulls content from a specific source, such as a web page, YouTube video, or PDF file.</li>
<li><strong>ContentItem</strong> — A normalized internal representation of the raw input. Every source produces the same data shape, so downstream stages never care where the content came from.</li>
<li><strong>Cleaner / OCR / Whisper / AI</strong> — The enrichment stage. It strips boilerplate, extracts text from images and scans, transcribes audio and video, and can hand off to an LLM for summarization and structuring.</li>
<li><strong>Classifier / Tags / Knowledge Linker</strong> — The intelligence stage. Content is classified, automatically tagged, and linked to related knowledge cards so the result is discoverable rather than dumped.</li>
<li><strong>Obsidian Markdown + SQLite</strong> — The dual-store output. The human-readable Markdown lives in your vault, while a SQLite index makes the content queryable by your agents.</li>
</ol>
<p>The dual-store design is worth calling out because it is what separates a knowledge inbox from a simple web clipper. Clippers save a snapshot; a knowledge inbox produces a structured, tagged, cross-linked card that your notes and agents can both use.</p>
<h2 id="the-12-source-ingestion-layer-web-social-media-pdf-telegram">The 12-Source Ingestion Layer (Web, Social, Media, PDF, Telegram)</h2>
<p>The breadth of source coverage is where a mature knowledge inbox earns its keep. The reference project implements <strong>12 source adapters</strong> that normalize content from:</p>
<ul>
<li><strong>Web</strong> — any URL, article, or page</li>
<li><strong>WeChat Official Accounts</strong> — long-form WeChat posts</li>
<li><strong>X/Twitter</strong> — threads and posts</li>
<li><strong>YouTube</strong> — video, including automatic transcription</li>
<li><strong>Podcast RSS</strong> — episodes and show notes</li>
<li><strong>Vimeo</strong> — video content</li>
<li><strong>Direct media</strong> — uploaded audio and video files</li>
<li><strong>PDF</strong> — documents, including scanned PDFs via OCR</li>
<li><strong>Images</strong> — screenshots and photos</li>
<li><strong>Telegram</strong> — saved messages and channels</li>
</ul>
<p>The value is not just the number of sources — it is that every one of them produces the <strong>same ContentItem shape</strong> downstream. Whether you save a YouTube video or a PDF, the enrichment pipeline treats them identically. That normalization is what makes the whole system manageable: one cleaner, one tagger, one linker, one store.</p>
<p>This directly competes with the &ldquo;send it to Readwise&rdquo; reflex. A local-first inbox gives you comparable capture breadth, but the output stays on your machine and is immediately usable by your notes and agents rather than living in a proprietary cloud silo.</p>
<h2 id="ai-enrichment-pipeline-ocr-whisper-auto-tagging-and-knowledge-linking">AI-Enrichment Pipeline: OCR, Whisper, Auto-Tagging, and Knowledge Linking</h2>
<p>Raw captured content is only half the job. The other half is making it findable and connected, and that is where the AI-enrichment pipeline does the heavy lifting:</p>
<ul>
<li><strong>OCR</strong> converts scanned PDFs and images into searchable text. Without it, a photographed whiteboard or a scanned contract is effectively invisible to search.</li>
<li><strong>Whisper</strong> transcribes audio and video. This turns a 45-minute podcast or an hour-long talk into a text transcript that can be chunked, summarized, and searched.</li>
<li><strong>LLM summarization</strong> condenses long documents into digestible knowledge cards, preserving the essence without forcing you to re-read everything.</li>
<li><strong>Auto-tagging</strong> classifies each card so it surfaces in the right searches and vault folders.</li>
<li><strong>Knowledge linking</strong> connects related cards, building the web of connections that makes a vault more than a folder of files.</li>
</ul>
<p>The practical result is that content becomes queryable the moment it lands. You do not need to transcribe, tag, or summarize anything by hand. The pipeline does it, and the enriched card is ready for both your own reading and your agents&rsquo; retrieval.</p>
<h2 id="mcp-as-the-2026-integration-standard-for-ai-agents-and-obsidian">MCP as the 2026 Integration Standard for AI Agents and Obsidian</h2>
<p>The Model Context Protocol (MCP) has become the dominant integration surface between AI agents and local tools, and Obsidian vaults are squarely in that trend. Every notable local-first knowledge tool — engraph, Molio, and swarmvault — ships an MCP server for Obsidian vaults. The reference knowledge-inbox project is harness-neutral, exposing the same adapters and processing service to Hermes, Codex, and OpenClaw via MCP.</p>
<p>MCP matters because it standardizes how agents talk to your data. Rather than each agent tool maintaining its own private API to your notes, an MCP server provides a common protocol: the agent issues standard tool calls, and the server reads and writes the vault. This is why a harness-neutral design is a selling point in 2026 — one ingestion service can feed whichever agent you use today, and you are not locked into a single vendor&rsquo;s tooling.</p>
<p>For Obsidian specifically, an MCP server means your agents can:</p>
<ul>
<li><strong>Retrieve</strong> knowledge cards by semantic search over the vault</li>
<li><strong>Ingest</strong> new content directly into the correct location</li>
<li><strong>Link</strong> new cards to related existing notes automatically</li>
<li><strong>Query</strong> the SQLite index for fast, structured lookups</li>
</ul>
<p>The result is a vault that is not just a note-taking app but a data store your agents operate on natively.</p>
<h2 id="competitor-landscape-review-knowledge-inbox-vs-khoj-vs-engraph-vs-molio-vs-swarmvault">Competitor Landscape Review: Knowledge-Inbox vs Khoj vs Engraph vs Molio vs Swarmvault</h2>
<p>The local-first knowledge space has several credible options, each with a different emphasis. Here is how the main players stack up:</p>
<table>
  <thead>
      <tr>
          <th>Tool</th>
          <th>Focus</th>
          <th>GitHub Stars</th>
          <th>Stack</th>
          <th>Best For</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>knowledge-inbox</strong></td>
          <td>Harness-neutral local-first ingestion into Obsidian Markdown + SQLite</td>
          <td>Newer project</td>
          <td>Python / FastAPI</td>
          <td>Turning 12+ source types into structured knowledge cards</td>
      </tr>
      <tr>
          <td><strong>Khoj</strong></td>
          <td>Self-hostable &ldquo;AI second brain&rdquo; — search + answers over your docs</td>
          <td>36,400+</td>
          <td>Python, supports offline LLM via llama.cpp</td>
          <td>Semantic search and Q&amp;A over existing notes</td>
      </tr>
      <tr>
          <td><strong>Engraph</strong></td>
          <td>Local knowledge graph for agents, hybrid search + MCP</td>
          <td>164</td>
          <td>Rust</td>
          <td>Knowledge-graph retrieval for Obsidian vaults</td>
      </tr>
      <tr>
          <td><strong>Molio</strong></td>
          <td>Local-first knowledge layer with evolving graph + LLM Wiki</td>
          <td>181</td>
          <td>TypeScript</td>
          <td>Evolving knowledge graphs + web/WeChat ingestion</td>
      </tr>
      <tr>
          <td><strong>Swarmvault</strong></td>
          <td>Local-first LLM Wiki / agent-memory store on Karpathy&rsquo;s llm-wiki</td>
          <td>654</td>
          <td>Open-source</td>
          <td>Agent memory and wiki-style local knowledge base</td>
      </tr>
  </tbody>
</table>
<p>The strategic split is between <strong>ingestion-led</strong> and <strong>retrieval-led</strong> tools:</p>
<ul>
<li><strong>Khoj</strong> is the most mature (36,400+ stars) and is retrieval-led. It excels at semantic search and answering questions over your existing docs, with strong Obsidian/Emacs integration and optional offline inference. It is less focused on the structured ingestion pipeline — it assumes your content is already in place.</li>
<li><strong>knowledge-inbox</strong> is ingestion-led. Its strength is the normalization of many raw sources into consistent knowledge cards before they enter your store. If your problem is &ldquo;I have content everywhere and I want it structured,&rdquo; this is the gap it fills.</li>
<li><strong>Engraph</strong> (164 stars) is narrowly focused on the retrieval/query layer — a hybrid-search MCP server over Obsidian vaults. It complements, rather than replaces, an ingestion pipeline.</li>
<li><strong>Molio</strong> (181 stars) competes on the knowledge-layer angle with an evolving knowledge graph plus web/WeChat ingestion.</li>
<li><strong>Swarmvault</strong> (654 stars) leans into the &ldquo;agent memory&rdquo; and local-first wiki narrative, built on Karpathy&rsquo;s llm-wiki concept with an MCP server.</li>
</ul>
<p>The signal across all of them is that <strong>MCP is becoming the standard interface</strong> and that local-first storage is the shared value proposition. They differ mainly in whether they prioritize getting content in (ingestion) or getting answers out (retrieval).</p>
<h2 id="key-considerations-privacy-cost-setup-complexity-and-vault-portability">Key Considerations: Privacy, Cost, Setup Complexity, and Vault Portability</h2>
<p>Before you adopt a local-first knowledge inbox, weigh these four factors:</p>
<p><strong>Privacy.</strong> Local-first means your content — including sensitive PDFs, private transcripts, and personal research — never leaves your machine unless you choose to send it to an external LLM. Many pipelines let you run OCR and tagging locally, and tools like Khoj support fully offline inference via llama.cpp. If privacy is your top priority, local-first is the clear advantage over cloud read-it-later services.</p>
<p><strong>Cost.</strong> A self-hosted pipeline runs on hardware you already own, with no per-seat subscription. The trade-off is that heavy AI enrichment — especially Whisper transcription and LLM summarization — consumes local compute or requires an API key if you offload to a hosted model. Cloud tools have predictable monthly pricing but ongoing subscription costs; local-first trades that for upfront setup and your own compute.</p>
<p><strong>Setup complexity.</strong> A local-first ingestion pipeline is more complex to stand up than a hosted app. You are managing Python/FastAPI services, source adapters, an SQLite database, and an MCP server. If you are comfortable with self-hosting, this is manageable; if not, the learning curve is real. Tools like Khoj simplify this by packaging a turnkey self-hosted experience.</p>
<p><strong>Vault portability.</strong> Because the output is plain Markdown plus a standard SQLite index, your knowledge cards are not locked into a proprietary format. You can move, export, or back them up with ordinary file tools, and the Markdown works with any tool that reads the format — not just Obsidian. This portability is a genuine long-term advantage over cloud silos.</p>
<h2 id="who-should-adopt-a-local-first-knowledge-inbox-in-2026">Who Should Adopt a Local-First Knowledge Inbox in 2026</h2>
<p>A local-first knowledge inbox is a strong fit if you:</p>
<ul>
<li><strong>Use Obsidian as your primary knowledge base</strong> and want your AI agents to read and write the same vault</li>
<li><strong>Consume a lot of varied media</strong> — articles, videos, podcasts, PDFs — and want them normalized into one structure</li>
<li><strong>Value privacy</strong> and prefer not to ship your reading and research through cloud servers</li>
<li><strong>Are comfortable self-hosting</strong> a Python/FastAPI stack and an MCP server</li>
<li><strong>Want agent integration</strong> across multiple tools (Hermes, Codex, OpenClaw) without being locked into one vendor</li>
</ul>
<p>It is a poorer fit if you want a zero-setup, hosted solution or if you rarely consume content that needs enrichment. For a simple note-taker who never touches PDFs or videos, the pipeline is overkill — a basic clipper and manual tagging will do.</p>
<h2 id="final-verdict-and-recommendations">Final Verdict and Recommendations</h2>
<p>For 2026, the local-first knowledge inbox is a compelling answer to the &ldquo;content everywhere&rdquo; problem, especially for Obsidian users who also run AI agents. The reference knowledge-inbox project shows the right architecture: <strong>12 source adapters → normalized ContentItem → OCR/Whisper/AI enrichment → tagged, linked Markdown cards in a dual Markdown + SQLite store</strong>, all exposed to agents through a harness-neutral MCP server.</p>
<p><strong>Our recommendations by use case:</strong></p>
<ul>
<li><strong>Capture-led, multi-source, self-hosters</strong> — start with a knowledge-inbox-style pipeline. It solves the hardest problem: turning disparate sources into structured, queryable cards.</li>
<li><strong>Answer-led users who already have rich notes</strong> — Khoj is the mature, well-supported choice (36,400+ stars) with strong search and optional offline inference.</li>
<li><strong>Knowledge-graph-first teams</strong> — Engraph or Molio if graph retrieval is your priority; Swarmvault if you are building agent memory on the llm-wiki pattern.</li>
</ul>
<p>The through-line is unmistakable: local-first storage and MCP integration are the 2026 standard, and the tools that respect your data&rsquo;s ownership while making it usable by agents will win the workflows of people who take their knowledge seriously.</p>
<h2 id="faq">FAQ</h2>
<p><strong>What is a knowledge inbox for Obsidian?</strong>
A knowledge inbox is a capture pipeline that takes links, PDFs, videos, screenshots, and notes and converts them into structured Markdown knowledge cards inside your Obsidian vault, enriched with OCR, transcription, and auto-tagging.</p>
<p><strong>How is a knowledge inbox different from a read-it-later app like Readwise?</strong>
Read-it-later apps store your highlights in the cloud, subject to their privacy and pricing. A local-first knowledge inbox keeps everything on your machine, outputs standard Markdown plus a SQLite index, and is directly readable by your notes and AI agents.</p>
<p><strong>Do I need cloud AI to use a local-first knowledge inbox?</strong>
No. You can run enrichment locally, including OCR, Whisper transcription, and even LLM inference via tools like llama.cpp (as Khoj supports). Offloading to a hosted model is optional and controlled by you.</p>
<p><strong>What is MCP and why does it matter for Obsidian and AI agents?</strong>
MCP (Model Context Protocol) is the standard protocol that lets AI agents talk to local tools. An MCP server for an Obsidian vault lets agents retrieve, ingest, and link knowledge cards using a common interface, and it works across harnesses like Hermes, Codex, and OpenClaw.</p>
<p><strong>Can I export my knowledge if I leave the tool?</strong>
Yes. Because the output is plain Markdown and a standard SQLite index, your knowledge cards are portable. You can back up, move, or open them with any tool that reads those formats — there is no proprietary lock-in.</p>
]]></content:encoded></item></channel></rss>