<?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>DEV Community: Parker Jones</title>
    <description>The latest articles on DEV Community by Parker Jones (@parallaxisjones).</description>
    <link>https://dev.to/parallaxisjones</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4010093%2Fcfd24fab-e0a0-47cf-82b9-2075d95b645c.jpg</url>
      <title>DEV Community: Parker Jones</title>
      <link>https://dev.to/parallaxisjones</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/parallaxisjones"/>
    <language>en</language>
    <item>
      <title>Context Harness: a Local-First RAG Engine in Rust with Lua Extensions and an MCP Server</title>
      <dc:creator>Parker Jones</dc:creator>
      <pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/parallaxisjones/context-harness-a-local-first-rag-engine-in-rust-with-lua-extensions-and-an-mcp-server-1fm5</link>
      <guid>https://dev.to/parallaxisjones/context-harness-a-local-first-rag-engine-in-rust-with-lua-extensions-and-an-mcp-server-1fm5</guid>
      <description>&lt;p&gt;AI tools are only useful when they can see &lt;em&gt;your&lt;/em&gt; context — your docs, your code, your notes, the Hacker News thread you read last week. The usual answer is a cloud RAG service: ship your data to someone's vector database, pay per query, hope it's still up. I wanted the opposite — a single binary that ingests my stuff, indexes it locally, and hands it to any AI tool over a standard protocol, with no cloud dependency. So I built &lt;strong&gt;&lt;a href="https://github.com/parallax-labs/context-harness" rel="noopener noreferrer"&gt;Context Harness&lt;/a&gt;&lt;/strong&gt; (&lt;code&gt;ctx&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ctx &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;span class="go"&gt;Context Harness provides a connector-driven pipeline for ingesting documents
from multiple sources (filesystem, Git repositories, S3 buckets), chunking and
embedding them, and exposing hybrid search (keyword + semantic) via a CLI and
MCP-compatible HTTP server.

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's a RAG engine that lives on your laptop. Here's the design.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pipeline
&lt;/h2&gt;

&lt;p&gt;The flow is the standard RAG shape, but every stage is local and configurable through one &lt;code&gt;ctx.toml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;connectors → sync → chunk → embed → SQLite → hybrid search → CLI / MCP

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Connectors&lt;/strong&gt; define where documents come from — filesystem globs, Git repos, S3 buckets, or custom Lua scripts (more on those below). &lt;code&gt;ctx sync&lt;/code&gt; pulls from a connector and runs the rest of the pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chunking and embedding&lt;/strong&gt; are configured, not hard-coded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[chunking]&lt;/span&gt;
&lt;span class="py"&gt;max_tokens&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;700&lt;/span&gt;
&lt;span class="py"&gt;overlap_tokens&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;

&lt;span class="nn"&gt;[embedding]&lt;/span&gt;
&lt;span class="py"&gt;provider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"openai"&lt;/span&gt;
&lt;span class="py"&gt;model&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"text-embedding-3-small"&lt;/span&gt;
&lt;span class="py"&gt;dims&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1536&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;provider&lt;/code&gt; is pluggable — that line can point at OpenAI's &lt;code&gt;text-embedding-3-small&lt;/code&gt;, or at a &lt;strong&gt;fully local&lt;/strong&gt; model. My test setup runs &lt;code&gt;fastembed&lt;/code&gt; with a quantized &lt;code&gt;all-MiniLM-L6-v2&lt;/code&gt; ONNX model, so embeddings happen on-device with no API call at all. That choice is the whole "local-first" thesis in one config key: trade a little retrieval quality for zero cloud dependency and zero per-query cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storage is SQLite.&lt;/strong&gt; No vector-database service to stand up, no Docker, no daemon. The index is a file you can copy, back up, or delete. For a single-user knowledge base, a managed vector DB is wildly over-provisioned; SQLite is exactly right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hybrid search
&lt;/h2&gt;

&lt;p&gt;Pure semantic search misses exact terms; pure keyword search misses paraphrase. &lt;code&gt;ctx&lt;/code&gt; does both and blends them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[retrieval]&lt;/span&gt;
&lt;span class="py"&gt;final_limit&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;
&lt;span class="py"&gt;hybrid_alpha&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.6&lt;/span&gt; &lt;span class="c"&gt;# weight toward semantic vs keyword&lt;/span&gt;
&lt;span class="py"&gt;candidate_k_keyword&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="c"&gt;# pull 80 keyword candidates&lt;/span&gt;
&lt;span class="py"&gt;candidate_k_vector&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="c"&gt;# and 80 vector candidates&lt;/span&gt;
&lt;span class="py"&gt;group_by&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"document"&lt;/span&gt; &lt;span class="c"&gt;# then dedup/group by document&lt;/span&gt;
&lt;span class="py"&gt;doc_agg&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"max"&lt;/span&gt;
&lt;span class="py"&gt;max_chunks_per_doc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It gathers candidates from both a keyword index and a vector index, blends the scores with &lt;code&gt;hybrid_alpha&lt;/code&gt;, groups by document so one long file can't flood the results, and returns the top 12. Tuning &lt;code&gt;hybrid_alpha&lt;/code&gt; toward 0 or 1 lets you dial between "find the exact phrase" and "find the related idea."&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that makes it an &lt;em&gt;engine&lt;/em&gt;: the MCP server
&lt;/h2&gt;

&lt;p&gt;A search CLI is handy. A search CLI that any AI tool can call as a tool is a force multiplier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ctx serve mcp
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Exposes search/get over a JSON API &lt;span class="k"&gt;for &lt;/span&gt;Cursor, Claude, and other
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;MCP-compatible AI tools.
&lt;span class="go"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; is the protocol AI tools use to call external tools. By speaking it, &lt;code&gt;ctx&lt;/code&gt; turns your local knowledge base into a tool the model can reach for mid-conversation: "search my notes for the retry-policy decision," and the model queries your SQLite index and gets grounded results — without your notes ever leaving the machine. That's the feature I use every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extensibility: connectors, tools, and agents in Lua
&lt;/h2&gt;

&lt;p&gt;Built-in connectors cover the common cases, but the interesting data is always somewhere weird. So &lt;code&gt;ctx&lt;/code&gt; embeds Lua: you can script &lt;strong&gt;connectors&lt;/strong&gt; (new data sources), &lt;strong&gt;tools&lt;/strong&gt; (new capabilities), and &lt;strong&gt;agents&lt;/strong&gt; (personas with a system prompt and a scoped toolset). Each has &lt;code&gt;init&lt;/code&gt;/&lt;code&gt;test&lt;/code&gt; scaffolding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ctx connector init &lt;span class="c"&gt;# scaffold a new Lua connector from a template&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ctx connector &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="c"&gt;# run it without writing to the DB&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ctx agent init/test/list
&lt;span class="go"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent system is the one I'm proudest of. An agent is a Lua script that, at resolve time, &lt;em&gt;assembles its own context&lt;/em&gt; by querying the knowledge base, then hands the model a system prompt plus pre-loaded research and a scoped set of tools. Here's a real one — &lt;code&gt;hn-writer&lt;/code&gt;, which writes Hacker News launch posts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hn-writer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Write Hacker News posts by studying top HN content and your product docs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"get"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;-- scoped: this agent can only search and fetch&lt;/span&gt;
    &lt;span class="n"&gt;arguments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"style"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"show_hn, launch, ask_hn, or discussion"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"angle"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"e.g. 'local-first', 'developer tooling'"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"technical, conversational, or minimal"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nc"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;-- pre-load HN trends from the knowledge base&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;ipairs&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="s2"&gt;"Show HN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Rust CLI tool"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"local first"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"AI context"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="kd"&gt;local&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"keyword"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="c1"&gt;-- ...fold the top results into the prompt as research...&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="c1"&gt;-- ...also search the project's own docs, then return:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"get"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;preloaded&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What I love about this pattern: the agent does its own retrieval &lt;em&gt;before&lt;/em&gt; the model gets involved, so the model starts with both "what performs well on HN right now" (from a connector that ingests HN) and "what this product actually does" (from a filesystem connector over the docs) already in context. And there's a pleasant recursion to it — I have an agent whose job is to write the Show HN post for the tool the agent runs on. Its prompt even encodes the house style: &lt;em&gt;"What HN hates: marketing speak, buzzwords, superlatives… technical substance over marketing language."&lt;/em&gt; Which, not coincidentally, is the ethos of this whole blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sharing extensions: registries
&lt;/h2&gt;

&lt;p&gt;Lua scripts are shareable, so &lt;code&gt;ctx&lt;/code&gt; supports &lt;strong&gt;registries&lt;/strong&gt; — git repos of community connectors, tools, and agents that sync in automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[registries.community]&lt;/span&gt;
&lt;span class="py"&gt;url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://github.com/parallax-labs/ctx-registry.git"&lt;/span&gt;
&lt;span class="py"&gt;auto_update&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;readonly&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A registry is just a versioned directory of &lt;code&gt;.lua&lt;/code&gt; files; pointing at one makes its connectors and agents available locally. It's the same "distribute capability declaratively" idea I use for &lt;a href="https://dev.to/posts/skills-with-nix/"&gt;agent skills&lt;/a&gt;, applied to data connectors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Static-site search, for free
&lt;/h2&gt;

&lt;p&gt;One more trick. &lt;code&gt;ctx export&lt;/code&gt; dumps the whole index to JSON for client-side search:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ctx &lt;span class="nb"&gt;export&lt;/span&gt;
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Exports documents and chunks to JSON &lt;span class="k"&gt;for &lt;/span&gt;use with ctx-search.js —
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;client-side search on a static site.
&lt;span class="go"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which means the same engine that grounds my AI tools could also power search on &lt;em&gt;this&lt;/em&gt; blog — index the posts, export the JSON, search it in the browser with no backend. &lt;/p&gt;

&lt;h2&gt;
  
  
  Honest trade-offs
&lt;/h2&gt;

&lt;p&gt;Context Harness is young, and local-first is a set of trade-offs, not a free lunch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local embeddings are private and free but lower-quality&lt;/strong&gt; than the big cloud models. &lt;code&gt;provider&lt;/code&gt; lets you choose per use case, but you don't get both at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite scales to a personal knowledge base, not a team's corpus.&lt;/strong&gt; That's the design target, not a bug — but know the ceiling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lua is power and rope.&lt;/strong&gt; Scriptable connectors mean I can ingest anything; they also mean a bad script can do bad things. &lt;code&gt;connector test&lt;/code&gt; (which never writes to the DB) exists for exactly that reason.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the core bet has paid off: a single Rust binary, a SQLite file, optional fully-local embeddings, and a standard protocol is enough to give every AI tool I use grounded access to my own context — without renting a vector database to do it.&lt;/p&gt;

&lt;p&gt;Context Harness is open source (AGPL-3.0) at &lt;a href="https://github.com/parallax-labs/context-harness" rel="noopener noreferrer"&gt;&lt;code&gt;parallax-labs/context-harness&lt;/code&gt;&lt;/a&gt;; docs and prebuilt binaries for macOS and Linux are at &lt;a href="https://parallax-labs.github.io/context-harness/" rel="noopener noreferrer"&gt;parallax-labs.github.io/context-harness&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Parker Jones, &lt;a href="https://parkerjones.dev" rel="noopener noreferrer"&gt;parkerjones.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>rag</category>
      <category>rust</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
