<?xml version="1.0" encoding="UTF-8"?>

<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Parker Jones Dev Blog - context-harness</title>
    <subtitle>Local-first, reproducible systems in Rust and Nix — and using AI as a power tool without getting credulous about it. I build the unglamorous plumbing and write up what actually happened, including what broke.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://parkerjones.dev/series/context-harness/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://parkerjones.dev"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-06-29T00:00:00+00:00</updated>
    <id>https://parkerjones.dev/series/context-harness/atom.xml</id>
    <entry xml:lang="en">
        <title>A Hammer Still Looking for Its Nail: Context Harness and the Team-Context Problem</title>
        <published>2026-06-29T00:00:00+00:00</published>
        <updated>2026-06-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://parkerjones.dev/posts/context-harness-site-search/"/>
        <id>https://parkerjones.dev/posts/context-harness-site-search/</id>
        <content type="html" xml:base="https://parkerjones.dev/posts/context-harness-site-search/">&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;parkerjones.dev&#x2F;posts&#x2F;context-harness-rag-rust&#x2F;&quot;&gt;Part 1&lt;&#x2F;a&gt; was the engine: a local-first RAG index in Rust — SQLite, hybrid search, Lua connectors, served to any tool over MCP. This post is the harder question one layer up, the one the engine only makes sense as an answer to: &lt;strong&gt;context that stays current and shareable across a team&lt;&#x2F;strong&gt; — and whether &lt;a href=&quot;https:&#x2F;&#x2F;parkerjones.dev&#x2F;posts&#x2F;context-harness-rag-rust&#x2F;&quot;&gt;Context Harness&lt;&#x2F;a&gt; is really the shape of that answer, or a hammer I enjoyed building and then went looking for a nail to justify.&lt;&#x2F;p&gt;
&lt;span id=&quot;continue-reading&quot;&gt;&lt;&#x2F;span&gt;
&lt;p&gt;I want to be honest about the register here, because it&#x27;s different from Part 1. That post was a retrospective — a thing I built, surveyed, and understood. This one isn&#x27;t finished. Context Harness is a work in progress, and I&#x27;m still genuinely working out whether its core bet is right. So this is me reasoning in public, dogfooding a tool and watching whether it earns its place — not selling you a conclusion I don&#x27;t have. Pretending otherwise would be its own kind of slop, which is funny, because slop is the thing the tool exists to fight.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-itch&quot;&gt;The itch&lt;&#x2F;h2&gt;
&lt;p&gt;Context Harness came from confabulation. AI tools are great until they start confidently inventing details about &lt;em&gt;my&lt;&#x2F;em&gt; code — a function signature that doesn&#x27;t exist, a config key I never wrote, a system summarized the way it isn&#x27;t. The fix is grounding: give the model the real material and it stops guessing. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cursor.com&#x2F;&quot;&gt;Cursor&lt;&#x2F;a&gt; does this with semantic search over a repo. I wanted that, but portable, multi-repo, and pointable at any pile of my own work — and the index it builds is a database (a SQLite file, hybrid keyword-plus-vector search, served to any tool over MCP). That&#x27;s the engine I &lt;a href=&quot;https:&#x2F;&#x2F;parkerjones.dev&#x2F;posts&#x2F;context-harness-rag-rust&#x2F;&quot;&gt;described in Part 1&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;i-m-already-in-the-format-camp&quot;&gt;I&#x27;m already in the format camp&lt;&#x2F;h2&gt;
&lt;p&gt;Before I defend the engine, I should admit which side I&#x27;ve actually lived on. The loudest current answer to &quot;how do you give AI context&quot; isn&#x27;t an engine at all — it&#x27;s a &lt;strong&gt;format&lt;&#x2F;strong&gt;: markdown with frontmatter, in a directory, that agents read directly. Google&#x27;s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cloud.google.com&#x2F;blog&#x2F;products&#x2F;data-analytics&#x2F;how-the-open-knowledge-format-can-improve-data-sharing&quot;&gt;Open Knowledge Format&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;karpathy&#x2F;442a6bf555914893e9891c11519de94f&quot;&gt;Karpathy&#x27;s LLM-wiki&lt;&#x2F;a&gt;, the &lt;code&gt;AGENTS.md&lt;&#x2F;code&gt; convention, every Obsidian vault. No SDK, no runtime, no index — the format &lt;em&gt;is&lt;&#x2F;em&gt; the contribution, and a long-context model just reads the files.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m not skeptical of this from the outside. I&#x27;ve kept markdown knowledge vaults for years — personal and professional — since before &quot;LLM wiki&quot; was a phrase. For one person, or a couple of people who trust each other&#x27;s notes, it is genuinely the right tool. Lightweight, portable, human-readable, version-controlled. If that&#x27;s your scale, you probably don&#x27;t need anything I&#x27;m building.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;where-the-format-quietly-breaks&quot;&gt;Where the format quietly breaks&lt;&#x2F;h2&gt;
&lt;p&gt;It breaks at &lt;em&gt;team&lt;&#x2F;em&gt; scale, and I&#x27;ve watched it break. Past about three people, a shared markdown corpus develops the same disease every wiki has ever had: it goes stale, nobody owns curating it, and it grows into an overwhelming pile of text that no one trusts is current. The format assumes someone keeps the files good. At small scale that someone exists. On a large engineering team riddled with silos, they don&#x27;t — and &quot;just read the folder&quot; turns into &quot;read a thousand documents, half of them six months out of date, and hope.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;This isn&#x27;t a niche complaint. Portable, shareable, &lt;em&gt;current&lt;&#x2F;em&gt; team context is, as far as I can tell, an unsolved problem — even well-resourced internal tooling at large companies hasn&#x27;t really cracked it. That part I&#x27;m confident about. It&#x27;s the part I&#x27;m &lt;em&gt;less&lt;&#x2F;em&gt; sure about that this whole post is circling.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-bet-i-m-dogfooding&quot;&gt;The bet I&#x27;m dogfooding&lt;&#x2F;h2&gt;
&lt;p&gt;Context Harness&#x27;s bet is that the thing markdown can&#x27;t be — at team scale — is exactly what a context &lt;em&gt;engine&lt;&#x2F;em&gt; can: a shared store that &lt;strong&gt;stays current&lt;&#x2F;strong&gt; (it re-syncs from the sources instead of waiting for a human to update prose), is &lt;strong&gt;shareable&lt;&#x2F;strong&gt; (the index is an artifact a team can pull, not a vault each person curates alone), and &lt;strong&gt;possesses skills&lt;&#x2F;strong&gt; rather than being inert text — the Lua connectors, tools, and agents that let it ingest weird sources and act on what it finds. A worthy context tool, the way I think about it, is a current, shareable thing that &lt;em&gt;does&lt;&#x2F;em&gt; things — not an overwhelming corpus that rots.&lt;&#x2F;p&gt;


&lt;figure class=&quot;post-image&quot;&gt;
  &lt;img src=&quot;https:&#x2F;&#x2F;parkerjones.dev&#x2F;processed_images&#x2F;context-harness-format-vs-engine.c815f8fc3cad4f9d.webp&quot; width=&quot;1600&quot; height=&quot;1000&quot;
       alt=&quot;Two-column comparison. Left, the format camp: a markdown vault labelled lightweight, portable, human-readable, with an arrow down to a team-scale failure state — stale, unowned, untrusted. Right, the engine camp: Context Harness, a database index that stays current by re-syncing from sources, is shareable as one artifact instead of a per-person vault, and carries skills via Lua connectors, tools, and agents. A vertical line marks the team-scale threshold where the left side rots and the right side is the bet.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
  &lt;figcaption&gt;The whole argument in one picture: the format camp is right up to team scale, where it rots — and the bet is that a current, shareable, skill-bearing index is the thing markdown structurally can&amp;#x27;t be.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Two honest clarifications, because they matter and they cut against my own earlier framing:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&quot;Local-first&quot; is mostly a cover story.&lt;&#x2F;strong&gt; Under the hood the design is &lt;em&gt;configuration-driven, with multiple backends&lt;&#x2F;em&gt; — local is one configuration, not a religion — and yes, there&#x27;s a paid tier in the back of my mind. That flexibility is precisely what could make it team-shareable; a purist local-only tool couldn&#x27;t be.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Search is a component, not the point.&lt;&#x2F;strong&gt; A serious context tool needs good retrieval, sure. But &quot;search the blog&quot; and &quot;keep a team&#x27;s context fresh and shareable&quot; only overlap at the word &lt;em&gt;search&lt;&#x2F;em&gt;. The first is a commodity; the second is the actual problem. I spent &lt;a href=&quot;https:&#x2F;&#x2F;parkerjones.dev&#x2F;posts&#x2F;surrealdb-wasm-experiment&#x2F;&quot;&gt;a whole post in another series&lt;&#x2F;a&gt; untangling the same search-versus-state conflation, and I don&#x27;t want to repeat it here.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;the-browser-rag-tangent-still-half-baked&quot;&gt;The browser-RAG tangent (still half-baked)&lt;&#x2F;h2&gt;
&lt;p&gt;There&#x27;s a tempting offshoot I haven&#x27;t resolved: &lt;code&gt;ctx export&lt;&#x2F;code&gt; already dumps the index to JSON, and you could pair that with on-device embeddings (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;docs&#x2F;transformers.js&#x2F;index&quot;&gt;Transformers.js&lt;&#x2F;a&gt; with the same small &lt;code&gt;all-MiniLM-L6-v2&lt;&#x2F;code&gt; model the engine can embed with locally) and a vector index (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;asg017&#x2F;sqlite-vec&quot;&gt;&lt;code&gt;sqlite-vec&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; runs in WASM) to do retrieval entirely in a browser tab. For a forty-post blog it&#x27;s a 25MB model aimed at a mosquito. For the multi-repo workspace the engine was built for, maybe not. I file it under &quot;experiments I want to run,&quot; not &quot;roadmap.&quot;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-i-m-actually-doing-about-it&quot;&gt;What I&#x27;m actually doing about it&lt;&#x2F;h2&gt;
&lt;p&gt;Dogfooding, mostly — which is the only honest way to find out if the bet holds. I run Context Harness against my own vaults and my own multi-repo work, and I watch for the moment it either earns its keep or doesn&#x27;t: does a freshly-synced, shareable, skill-bearing index actually beat &quot;just keep good markdown,&quot; once the corpus is too big and too shared for any one person to keep good? I don&#x27;t have that answer yet. Some days the format camp looks obviously right and the engine looks like a hammer I built because hammers are fun. Other days I hit exactly the staleness-at-scale wall the engine is meant for, and it feels like the only thing that could work.&lt;&#x2F;p&gt;
&lt;p&gt;The meta-loop is the honest ending, and I&#x27;ll leave it unresolved on purpose: I built a tool to fight AI slop by grounding models in real context, I&#x27;m using a model to reason about whether that tool is even the right shape, and the answer is genuinely &lt;em&gt;I&#x27;m still finding out&lt;&#x2F;em&gt;. Naming that uncertainty — instead of papering over it with a confident conclusion — is the same discipline the tool is supposed to enforce on the models. So that&#x27;s where Context Harness is: a hammer still looking for its nail, being swung in public until I know whether the nail is real.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;— Parker Jones&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
    </entry>
    <entry xml:lang="en">
        <title>Context Harness: a Local-First RAG Engine in Rust with Lua Extensions and an MCP Server</title>
        <published>2026-06-26T00:00:00+00:00</published>
        <updated>2026-06-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://parkerjones.dev/posts/context-harness-rag-rust/"/>
        <id>https://parkerjones.dev/posts/context-harness-rag-rust/</id>
        <content type="html" xml:base="https://parkerjones.dev/posts/context-harness-rag-rust/">&lt;p&gt;AI tools are only useful when they can see &lt;em&gt;your&lt;&#x2F;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&#x27;s vector database, pay per query, hope it&#x27;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 rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;parallax-labs&#x2F;context-harness&quot;&gt;Context Harness&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; (&lt;code&gt;ctx&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;text&quot;&gt;$ ctx --help
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;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It&#x27;s a RAG engine that lives on your laptop. Here&#x27;s the design.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-pipeline&quot;&gt;The pipeline&lt;&#x2F;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;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;text&quot;&gt;connectors → sync → chunk → embed → SQLite → hybrid search → CLI &#x2F; MCP
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Connectors&lt;&#x2F;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;&#x2F;code&gt; pulls from a connector and runs the rest of the pipeline.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Chunking and embedding&lt;&#x2F;strong&gt; are configured, not hard-coded:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;toml&quot;&gt;[chunking]
max_tokens = 700
overlap_tokens = 80

[embedding]
provider = &amp;quot;openai&amp;quot;
model = &amp;quot;text-embedding-3-small&amp;quot;
dims = 1536
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;provider&lt;&#x2F;code&gt; is pluggable — that line can point at OpenAI&#x27;s &lt;code&gt;text-embedding-3-small&lt;&#x2F;code&gt;, or at a &lt;strong&gt;fully local&lt;&#x2F;strong&gt; model. My test setup runs &lt;code&gt;fastembed&lt;&#x2F;code&gt; with a quantized &lt;code&gt;all-MiniLM-L6-v2&lt;&#x2F;code&gt; ONNX model, so embeddings happen on-device with no API call at all. That choice is the whole &quot;local-first&quot; thesis in one config key: trade a little retrieval quality for zero cloud dependency and zero per-query cost.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Storage is SQLite.&lt;&#x2F;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;&#x2F;p&gt;
&lt;h2 id=&quot;hybrid-search&quot;&gt;Hybrid search&lt;&#x2F;h2&gt;
&lt;p&gt;Pure semantic search misses exact terms; pure keyword search misses paraphrase. &lt;code&gt;ctx&lt;&#x2F;code&gt; does both and blends them:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;toml&quot;&gt;[retrieval]
final_limit = 12
hybrid_alpha = 0.6           # weight toward semantic vs keyword
candidate_k_keyword = 80     # pull 80 keyword candidates
candidate_k_vector  = 80     # and 80 vector candidates
group_by = &amp;quot;document&amp;quot;        # then dedup&#x2F;group by document
doc_agg = &amp;quot;max&amp;quot;
max_chunks_per_doc = 3
&lt;&#x2F;code&gt;&lt;&#x2F;pre&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;&#x2F;code&gt;, groups by document so one long file can&#x27;t flood the results, and returns the top 12. Tuning &lt;code&gt;hybrid_alpha&lt;&#x2F;code&gt; toward 0 or 1 lets you dial between &quot;find the exact phrase&quot; and &quot;find the related idea.&quot;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-part-that-makes-it-an-engine-the-mcp-server&quot;&gt;The part that makes it an &lt;em&gt;engine&lt;&#x2F;em&gt;: the MCP server&lt;&#x2F;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;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;text&quot;&gt;$ ctx serve mcp
# Exposes search&#x2F;get over a JSON API for Cursor, Claude, and other
# MCP-compatible AI tools.
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;modelcontextprotocol.io&#x2F;&quot;&gt;MCP&lt;&#x2F;a&gt; is the protocol AI tools use to call external tools. By speaking it, &lt;code&gt;ctx&lt;&#x2F;code&gt; turns your local knowledge base into a tool the model can reach for mid-conversation: &quot;search my notes for the retry-policy decision,&quot; and the model queries your SQLite index and gets grounded results — without your notes ever leaving the machine. That&#x27;s the feature I use every day.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;extensibility-connectors-tools-and-agents-in-lua&quot;&gt;Extensibility: connectors, tools, and agents in Lua&lt;&#x2F;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;&#x2F;code&gt; embeds Lua: you can script &lt;strong&gt;connectors&lt;&#x2F;strong&gt; (new data sources), &lt;strong&gt;tools&lt;&#x2F;strong&gt; (new capabilities), and &lt;strong&gt;agents&lt;&#x2F;strong&gt; (personas with a system prompt and a scoped toolset). Each has &lt;code&gt;init&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;test&lt;&#x2F;code&gt; scaffolding:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;text&quot;&gt;$ ctx connector init    # scaffold a new Lua connector from a template
$ ctx connector test    # run it without writing to the DB
$ ctx agent  init&#x2F;test&#x2F;list
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The agent system is the one I&#x27;m proudest of. An agent is a Lua script that, at resolve time, &lt;em&gt;assembles its own context&lt;&#x2F;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&#x27;s a real one — &lt;code&gt;hn-writer&lt;&#x2F;code&gt;, which writes Hacker News launch posts:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;lua&quot;&gt;agent = {
    name = &amp;quot;hn-writer&amp;quot;,
    description = &amp;quot;Write Hacker News posts by studying top HN content and your product docs&amp;quot;,
    tools = { &amp;quot;search&amp;quot;, &amp;quot;get&amp;quot; },          -- scoped: this agent can only search and fetch
    arguments = {
        { name = &amp;quot;style&amp;quot;, description = &amp;quot;show_hn, launch, ask_hn, or discussion&amp;quot; },
        { name = &amp;quot;angle&amp;quot;, description = &amp;quot;e.g. &amp;#39;local-first&amp;#39;, &amp;#39;developer tooling&amp;#39;&amp;quot; },
        { name = &amp;quot;tone&amp;quot;,  description = &amp;quot;technical, conversational, or minimal&amp;quot; },
    },
}

function agent.resolve(args, config, context)
    -- pre-load HN trends from the knowledge base
    for _, q in ipairs({ &amp;quot;Show HN&amp;quot;, &amp;quot;Rust CLI tool&amp;quot;, &amp;quot;local first&amp;quot;, &amp;quot;AI context&amp;quot; }) do
        local results = context.search(q, { mode = &amp;quot;keyword&amp;quot;, limit = 5 })
        -- ...fold the top results into the prompt as research...
    end
    -- ...also search the project&amp;#39;s own docs, then return:
    return { system = system_prompt, tools = { &amp;quot;search&amp;quot;, &amp;quot;get&amp;quot; }, messages = preloaded }
end
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What I love about this pattern: the agent does its own retrieval &lt;em&gt;before&lt;&#x2F;em&gt; the model gets involved, so the model starts with both &quot;what performs well on HN right now&quot; (from a connector that ingests HN) and &quot;what this product actually does&quot; (from a filesystem connector over the docs) already in context. And there&#x27;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;&quot;What HN hates: marketing speak, buzzwords, superlatives… technical substance over marketing language.&quot;&lt;&#x2F;em&gt; Which, not coincidentally, is the ethos of this whole blog.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sharing-extensions-registries&quot;&gt;Sharing extensions: registries&lt;&#x2F;h2&gt;
&lt;p&gt;Lua scripts are shareable, so &lt;code&gt;ctx&lt;&#x2F;code&gt; supports &lt;strong&gt;registries&lt;&#x2F;strong&gt; — git repos of community connectors, tools, and agents that sync in automatically:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;toml&quot;&gt;[registries.community]
url = &amp;quot;https:&#x2F;&#x2F;github.com&#x2F;parallax-labs&#x2F;ctx-registry.git&amp;quot;
auto_update = true
readonly = true
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A registry is just a versioned directory of &lt;code&gt;.lua&lt;&#x2F;code&gt; files; pointing at one makes its connectors and agents available locally. It&#x27;s the same &quot;distribute capability declaratively&quot; idea I use for &lt;a href=&quot;&#x2F;posts&#x2F;skills-with-nix&#x2F;&quot;&gt;agent skills&lt;&#x2F;a&gt;, applied to data connectors.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;static-site-search-for-free&quot;&gt;Static-site search, for free&lt;&#x2F;h2&gt;
&lt;p&gt;One more trick. &lt;code&gt;ctx export&lt;&#x2F;code&gt; dumps the whole index to JSON for client-side search:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;text&quot;&gt;$ ctx export
# Exports documents and chunks to JSON for use with ctx-search.js —
# client-side search on a static site.
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Which means the same engine that grounds my AI tools could also power search on &lt;em&gt;this&lt;&#x2F;em&gt; blog — index the posts, export the JSON, search it in the browser with no backend. (My &lt;a href=&quot;&#x2F;posts&#x2F;consoler-dark-theme&#x2F;&quot;&gt;terminal theme already runs a database in the browser&lt;&#x2F;a&gt;, so this is a natural next step.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;honest-trade-offs&quot;&gt;Honest trade-offs&lt;&#x2F;h2&gt;
&lt;p&gt;Context Harness is young, and local-first is a set of trade-offs, not a free lunch:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Local embeddings are private and free but lower-quality&lt;&#x2F;strong&gt; than the big cloud models. &lt;code&gt;provider&lt;&#x2F;code&gt; lets you choose per use case, but you don&#x27;t get both at once.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SQLite scales to a personal knowledge base, not a team&#x27;s corpus.&lt;&#x2F;strong&gt; That&#x27;s the design target, not a bug — but know the ceiling.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Lua is power and rope.&lt;&#x2F;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;&#x2F;code&gt; (which never writes to the DB) exists for exactly that reason.&lt;&#x2F;li&gt;
&lt;&#x2F;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;&#x2F;p&gt;
&lt;p&gt;Context Harness is open source (AGPL-3.0) at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;parallax-labs&#x2F;context-harness&quot;&gt;&lt;code&gt;parallax-labs&#x2F;context-harness&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;; docs and prebuilt binaries for macOS and Linux are at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;parallax-labs.github.io&#x2F;context-harness&#x2F;&quot;&gt;parallax-labs.github.io&#x2F;context-harness&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;— Parker Jones, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;parkerjones.dev&quot;&gt;parkerjones.dev&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
    </entry>
</feed>
