<?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: Amariah Kamau</title>
    <description>The latest articles on DEV Community by Amariah Kamau (@abishaiama).</description>
    <link>https://dev.to/abishaiama</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%2F3394455%2F903b6008-0825-4cf9-b88b-bdaba42c4258.png</url>
      <title>DEV Community: Amariah Kamau</title>
      <link>https://dev.to/abishaiama</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abishaiama"/>
    <language>en</language>
    <item>
      <title>The harness, not the model: how to make a weak or local model reliable enough to ship</title>
      <dc:creator>Amariah Kamau</dc:creator>
      <pubDate>Fri, 11 Sep 2026 19:41:05 +0000</pubDate>
      <link>https://dev.to/abishaiama/the-harness-not-the-model-how-to-make-a-weak-or-local-model-reliable-enough-to-ship-2plp</link>
      <guid>https://dev.to/abishaiama/the-harness-not-the-model-how-to-make-a-weak-or-local-model-reliable-enough-to-ship-2plp</guid>
      <description>&lt;p&gt;If you've tried to point a local model — Qwen, a quantized Llama, whatever fits on your GPU — at a real task in a real repo, you already know the feeling. It starts confidently. It edits three files. It announces it's done. And then you run the tests and half of them are red, one of the files it "edited" is byte-for-byte unchanged, and the function it swore it added isn't there.&lt;/p&gt;

&lt;p&gt;The usual conclusion is: the model is too weak. Get a bigger model, or rent a frontier API, and the problem goes away.&lt;/p&gt;

&lt;p&gt;That conclusion is mostly wrong, and it's expensive. A large share of what looks like model weakness is actually &lt;strong&gt;the absence of a system around the model&lt;/strong&gt; — the scaffolding that a frontier model partially compensates for on its own and a weak model does not. If you build that system, a much weaker model becomes usable for work you'd have assumed it couldn't touch. The industry has a name for that system: the &lt;strong&gt;harness&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I've spent the last several months building one — a coding harness called Atlarix that's designed to run any model, including small local ones, and get real work out of them. Along the way it's produced code that got merged into projects like Remix, Caddy, Traefik, and Valkey (more on that, honestly, at the end). This post isn't a pitch for it. It's the set of principles I learned building it, written so you can apply them to your &lt;em&gt;own&lt;/em&gt; agent, whatever it's built on. Atlarix is just the reference implementation I'll point at to prove I actually did each thing rather than just theorizing.&lt;/p&gt;

&lt;p&gt;Here's the core claim, stated plainly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A weak model doesn't need a bigger prompt. It needs a system that catches its mistakes instead of trusting them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Four mechanisms do most of the work. None of them require a better model.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Verify edits against reality, not against the model's word
&lt;/h2&gt;

&lt;p&gt;The single most common failure mode of a weak model in a coding loop is the &lt;strong&gt;confident false completion&lt;/strong&gt;: it reports success for work it didn't actually do. The edit didn't apply. The file didn't change. The function it described isn't on disk.&lt;/p&gt;

&lt;p&gt;A frontier model does this too — it just does it less often, so you get away with trusting it. With a weak model you cannot trust the report at all. So don't. The fix is a principle I'd now build into any agent from day one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Never let the model be the judge of whether its own change succeeded. Check the world.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Concretely, after every edit, the harness re-reads the file from disk and confirms the change is actually present. If the edit didn't land, that fact goes &lt;strong&gt;back to the model as a tool result&lt;/strong&gt; — "the file is unchanged" — instead of forward to the user as "done." The model gets a chance to notice and retry, in the same turn, before anything reaches you.&lt;/p&gt;

&lt;p&gt;The same principle extends to commands. When the agent runs the project's own checks — &lt;code&gt;tsc&lt;/code&gt;, &lt;code&gt;eslint&lt;/code&gt;, &lt;code&gt;ruff&lt;/code&gt;, &lt;code&gt;mypy&lt;/code&gt;, &lt;code&gt;pytest&lt;/code&gt;, whatever the repo uses — a non-zero exit code is not something the agent gets to narrate its way past. In Atlarix the turn is &lt;em&gt;held open&lt;/em&gt;: a command that exits non-zero, or an edit that didn't verify on disk, is routed back to the agent rather than surfaced as a finished result. The agent literally cannot declare a task done while the project's own tests are failing.&lt;/p&gt;

&lt;p&gt;That one rule — &lt;strong&gt;the agent can't mark work complete while the repo's checks are red&lt;/strong&gt; — eliminates the most damaging class of weak-model errors, because the most damaging errors aren't wrong code. They're wrong code &lt;em&gt;reported as correct&lt;/em&gt;. Wrong-but-flagged is recoverable. Wrong-but-confident is what ships bugs.&lt;/p&gt;

&lt;p&gt;You can implement this in any loop. Run the checks. Read the exit code. If it's non-zero, feed the failure back as the next observation instead of returning to the caller. It's not clever. It's just refusing to take the model's word for anything you can verify yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Enforce control in the harness, not in the prompt
&lt;/h2&gt;

&lt;p&gt;There's a strong temptation to solve agent misbehavior with more instructions. &lt;em&gt;"Always wait for the command to finish before continuing. Never claim completion prematurely. Always ask before running destructive commands."&lt;/em&gt; You write a longer and longer system prompt, and a frontier model mostly follows it, and a weak model mostly doesn't — because following a paragraph of procedural instructions &lt;em&gt;is itself a capability&lt;/em&gt; that weak models lack.&lt;/p&gt;

&lt;p&gt;So stop asking the model to behave and make the behavior structural.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If a rule matters, the harness should enforce it mechanically, so a model that "forgets" the rule physically can't break it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tool approvals, background command handling, wait-states, sub-agent orchestration — in a prompt-driven agent these are all things you &lt;em&gt;ask&lt;/em&gt; the model to handle correctly. In a harness-driven agent they're enforced by the system around the model. A weak model can't emit a premature "task complete" if completion is gated on verification it doesn't control (see #1). It can't skip an approval if the approval is a queue the execution path &lt;em&gt;must&lt;/em&gt; pass through, not a politeness the model chooses to observe.&lt;/p&gt;

&lt;p&gt;The practical test: for every "always/never" line in your system prompt, ask &lt;em&gt;"what happens if the model ignores this?"&lt;/em&gt; If the answer is "something bad happens," that rule doesn't belong in the prompt — it belongs in the harness, as a gate the model routes through whether it wants to or not. The prompt is for guidance. The harness is for guarantees. Weak models need guarantees.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Give it a sandbox, so a mistake is contained instead of catastrophic
&lt;/h2&gt;

&lt;p&gt;A weak model &lt;em&gt;will&lt;/em&gt; try to run something it shouldn't — a command scoped too broadly, a write outside the project, a destructive operation it didn't reason through. If your safety story is "the model is careful," you don't have a safety story.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Contain execution at the OS level, so the blast radius of a bad call is bounded by the system, not by the model's judgment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Atlarix confines command execution per-OS — Landlock on Linux, AppContainer on Windows, Seatbelt on macOS — so the agent physically cannot write outside the project you opened. There's an approval queue with hunk-level accept/reject on every diff, and a danger gate on destructive operations. The point isn't the specific primitives; it's the principle: &lt;strong&gt;the model's mistakes are caught by the system, not trusted on faith.&lt;/strong&gt; When containment is structural, you can let a weaker, less-trustworthy model act, because the cost of it being wrong is bounded.&lt;/p&gt;

&lt;p&gt;This is also what makes local-first viable at all. If the model runs on your machine and the execution is sandboxed to your project, "the AI touched my system" stops being a leap of faith. The containment is what earns the autonomy.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Feed it structure on demand, not the whole repo
&lt;/h2&gt;

&lt;p&gt;Weak models have smaller effective context and degrade faster as you fill it. The instinct is to stuff the repo into the prompt so the model "has everything." This is exactly backwards — you drown the small model in tokens and it performs &lt;em&gt;worse&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Retrieve narrowly and on demand. Let the model pull what it needs when it needs it, instead of pre-loading everything it might need.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Atlarix searches the repo on demand — bundled &lt;code&gt;ripgrep&lt;/code&gt; for &lt;code&gt;grep&lt;/code&gt;/&lt;code&gt;glob&lt;/code&gt;, no index to build, no background watcher — and keeps durable notes on what it learns about the codebase so it doesn't re-derive the same structure every turn. The model asks for what it needs; it isn't forced to hold the whole tree in its head.&lt;/p&gt;

&lt;p&gt;The general principle for any agent: on-demand, tool-driven retrieval beats context-stuffing, and it beats it &lt;em&gt;more&lt;/em&gt; the weaker your model is. A frontier model can afford to waste context. A local model can't. Give it a way to look things up, and a way to remember what it found, and you've freed its limited context for actual reasoning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters beyond saving on API bills
&lt;/h2&gt;

&lt;p&gt;The obvious payoff is cost — run a local model, pay nothing per token, keep your code on your own machine. That's real. But the deeper payoff is &lt;em&gt;trust&lt;/em&gt;. Every one of these mechanisms replaces a place where you were trusting the model with a place where the system checks. Verified edits replace trusting the completion report. Harness-enforced control replaces trusting the model to follow rules. The sandbox replaces trusting it not to do damage. On-demand retrieval replaces trusting it to juggle the whole repo.&lt;/p&gt;

&lt;p&gt;Stack them and something surprising happens: &lt;strong&gt;the model's reliability stops being the ceiling.&lt;/strong&gt; The system's guarantees become the floor, and a weaker model operating above a solid floor beats a stronger model operating on trust. That's the whole thesis. The harness, not the model.&lt;/p&gt;




&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;I said I'd be straight about the merges, so here it is.&lt;/p&gt;

&lt;p&gt;Atlarix, running on open-weight and local models, has produced code that maintainers merged into real projects — Remix (merged by its co-creator), Caddy, Traefik, Valkey, and others. Every one is a public, verifiable pull request; the links are on &lt;a href="https://atlarix.dev" rel="noopener noreferrer"&gt;atlarix.dev&lt;/a&gt; if you want to check them, and you should.&lt;/p&gt;

&lt;p&gt;But I want to be precise about what that does and doesn't mean, because a technical audience deserves it and will figure it out anyway. These were &lt;strong&gt;human-directed&lt;/strong&gt;. I drove the agent — chose the target, steered the work, reviewed the diff before it went out — and the agent appears as a &lt;em&gt;co-author&lt;/em&gt; on the commits, not the sole author. A maintainer of Remix or Caddy reviewed the change and merged it after dealing with me as the human behind it. What the harness did was get an open-weight model's output to the point where it could clear that bar: correct, verified against the project's own checks, and clean enough to survive a real maintainer's review.&lt;/p&gt;

&lt;p&gt;That's the claim, and it's a narrower and more honest one than "AI merged code into Remix." It's: a well-built harness plus a modest model, driven by a human who knows what they want, can produce work that passes the same gate a human contributor's work passes. That's not magic. It's the four mechanisms above, doing their job.&lt;/p&gt;

&lt;p&gt;If you're building your own agent, take the principles and leave the tool. If you want to see the reference implementation, it's &lt;a href="https://atlarix.dev" rel="noopener noreferrer"&gt;Atlarix&lt;/a&gt; — a private AI workstation that runs any model, local or hosted, with your code staying on your machine. Either way: stop blaming the model. Build the harness.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Amariah Abishai, a self-taught engineer in Nairobi building AI developer tooling at NorahLabs. If you want the deeper version of the retrieval design, there's a &lt;a href="https://doi.org/10.5281/zenodo.20381860" rel="noopener noreferrer"&gt;published paper&lt;/a&gt; on an earlier structural-retrieval approach I tried, measured, and eventually moved away from — which is its own lesson for another post.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>localagents</category>
      <category>agents</category>
    </item>
    <item>
      <title>I shipped two PRs into Alibaba's qwen-code using only open-weight models. Here's the honest version.</title>
      <dc:creator>Amariah Kamau</dc:creator>
      <pubDate>Fri, 03 Jul 2026 16:28:04 +0000</pubDate>
      <link>https://dev.to/abishaiama/i-shipped-two-prs-into-alibabas-qwen-code-using-only-open-weight-models-heres-the-honest-version-3clk</link>
      <guid>https://dev.to/abishaiama/i-shipped-two-prs-into-alibabas-qwen-code-using-only-open-weight-models-heres-the-honest-version-3clk</guid>
      <description>&lt;p&gt;I build &lt;a href="https://atlarix.dev" rel="noopener noreferrer"&gt;Atlarix&lt;/a&gt; — a desktop coding harness that runs whatever model you point it at: managed, your own API key, or fully local via Ollama or LM Studio. The whole thesis is that the gap between a weak open-weight model and a frontier one closes when the harness does the heavy lifting. This post is a test of exactly that.&lt;/p&gt;

&lt;p&gt;So I decided to test that thesis in the least forgiving place I could think of: contributing real code to a frontier lab's &lt;em&gt;own&lt;/em&gt; production repo, using nothing but open-weight models to write it.&lt;/p&gt;

&lt;p&gt;Two pull requests are now merged into &lt;a href="https://github.com/QwenLM/qwen-code" rel="noopener noreferrer"&gt;QwenLM/qwen-code&lt;/a&gt; — Alibaba's open-source coding agent. Here's the honest version, including the part that didn't go well and the constraint that shaped how I worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first attempt got closed — correctly
&lt;/h2&gt;

&lt;p&gt;My first swing was ambitious: a full always-on scheduled-task daemon. Tasks that fire on a cron schedule without an interactive session open, system service installation, webhook triggers, the works. Around 5,000 lines across four rollout phases.&lt;/p&gt;

&lt;p&gt;A maintainer closed it. And they were right to.&lt;/p&gt;

&lt;p&gt;The problem wasn't that the code didn't work — it was that I'd built a &lt;em&gt;second, parallel&lt;/em&gt; daemon with its own storage format and lifecycle, when the repo already had a long-running daemon (&lt;code&gt;qwen serve&lt;/code&gt;) and a durable scheduler I should have extended instead. On top of that, four phases in one PR is simply too much to review well.&lt;/p&gt;

&lt;p&gt;The maintainer's feedback was blunt and generous at the same time: reuse the existing infrastructure, make the change incremental, split it into reviewable pieces. What could have been ~300 lines of extension, I'd written as thousands of lines of duplication.&lt;/p&gt;

&lt;p&gt;That stung. But it was the most useful thing that happened in the whole process, because it taught me the lesson every open-source contributor eventually learns: &lt;strong&gt;read the existing architecture before you build, and keep your PRs small enough to review.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So I did the right-sized thing instead
&lt;/h2&gt;

&lt;p&gt;Instead of fighting to rebuild the giant feature immediately, I went looking for a small, well-scoped problem — the kind of change that's easy to review, easy to revert, and unlikely to break anything.&lt;/p&gt;

&lt;p&gt;I found one in the web-shell's model picker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/QwenLM/qwen-code/pull/6209" rel="noopener noreferrer"&gt;PR #6209&lt;/a&gt; — vision model support in the web-shell UI.&lt;/strong&gt; The CLI could select a vision model; the web-shell daemon UI couldn't. I added it, following the exact pattern the codebase already used for other model modes. Small, mechanical, convention-matching. It merged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/QwenLM/qwen-code/pull/6236" rel="noopener noreferrer"&gt;PR #6236&lt;/a&gt; — a real data-loss fix.&lt;/strong&gt; This one mattered more than its size suggests. When a user selected a vision model from the web-shell picker, they'd see a success toast — but their choice was silently discarded. The picker stored the model ID in one format (&lt;code&gt;modelId(authType)&lt;/code&gt;, ACP-style) while the core resolver expected another (&lt;code&gt;authType:modelId&lt;/code&gt;). The mismatch meant the stored value never resolved, and the system quietly fell back to auto-select. The settings page still &lt;em&gt;showed&lt;/em&gt; the value, which masked the failure completely. The user's explicit choice had no effect, and nothing told them.&lt;/p&gt;

&lt;p&gt;The fix re-encodes the format before persisting, plus type-safe dispatch to replace some fragile ternary chains, plus the missing English and Chinese i18n keys. It merged too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part: the models didn't write perfect code
&lt;/h2&gt;

&lt;p&gt;This is the bit I actually care about, because it's where the hype usually lies.&lt;/p&gt;

&lt;p&gt;Both PRs went through several rounds of genuine maintainer review. And the maintainers — Alibaba collaborators, plus an automated reviewer running on Qwen's own models — found &lt;em&gt;real&lt;/em&gt; bugs. Not style nitpicks. Actual security and lifecycle issues: an HMAC check computed over the wrong input, a timing-attack-vulnerable token comparison, a timer that could fire on a stopped process, an auth config silently stripped from a webhook path.&lt;/p&gt;

&lt;p&gt;I fixed and re-verified each one before merge. On #6236, a maintainer even built the PR locally with real browser tests and screenshots to confirm the fix worked end-to-end before approving.&lt;/p&gt;

&lt;p&gt;That review loop is the entire point. The claim isn't "open-weight models wrote flawless code." They didn't. The claim is that &lt;strong&gt;open-weight models, driven by a good harness, could take architectural feedback and iterate to something a senior maintainer at a frontier lab was willing to merge.&lt;/strong&gt; That's a much more interesting and much more honest result than "the AI one-shotted it."&lt;/p&gt;

&lt;h2&gt;
  
  
  The constraint nobody tells you about: cost
&lt;/h2&gt;

&lt;p&gt;Here's a detail I think is worth being transparent about, because it's the reality of building solo.&lt;/p&gt;

&lt;p&gt;PR #6209 was built almost entirely on Qwen (3.6 Plus, 3.7 Plus/Max) via OpenRouter. But partway through PR #6236, I started running low on OpenRouter credits. As a solo founder trying to conserve runway for actual users, I switched to using DeepSeek API credits instead. So #6236 ended up roughly a 50/50 mix of Qwen and DeepSeek.&lt;/p&gt;

&lt;p&gt;I could have hidden that and claimed "100% Qwen" across the board. But two things: first, it wouldn't be true, and the whole value of a post like this is that it's honest. Second — it actually makes the result &lt;em&gt;broader&lt;/em&gt;, not weaker. The thesis was never "Qwen specifically." It was "open-weight models, in a harness built for them, can do real work." Making that work across &lt;em&gt;two&lt;/em&gt; different open-weight labs is stronger evidence than making it work with one.&lt;/p&gt;

&lt;p&gt;No frontier model wrote either PR. Just open-weight models — Qwen and DeepSeek — running in Atlarix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters (to me, at least)
&lt;/h2&gt;

&lt;p&gt;I'm a self-taught developer building in Nairobi. The models I can afford to run at scale are open-weight ones. Atlarix exists because I needed a way to make those models genuinely productive — not "good enough for a demo," but good enough to ship code into a repo maintained by the people who &lt;em&gt;train&lt;/em&gt; the models.&lt;/p&gt;

&lt;p&gt;Two merged PRs in a Tier-1 lab's production repo, written by open-weight models in the harness, reviewed and merged by the lab's own maintainers, is the clearest proof of that thesis I've been able to produce.&lt;/p&gt;

&lt;p&gt;The gap between open-weight and frontier is real. But a lot of it lives in the harness, not the weights. Close that gap, and a model you can run yourself can punch well above its weight.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Atlarix is at &lt;a href="https://atlarix.dev" rel="noopener noreferrer"&gt;atlarix.dev&lt;/a&gt;. If you're building with open-weight models or thinking about model-agnostic tooling, I'd genuinely like to compare notes.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>openweight</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Atlarix vs opencode on Terminal-Bench 2.0 — same model, only the harness changes (k=1, receipts included)</title>
      <dc:creator>Amariah Kamau</dc:creator>
      <pubDate>Mon, 29 Jun 2026 19:22:30 +0000</pubDate>
      <link>https://dev.to/abishaiama/atlarix-vs-opencode-on-terminal-bench-20-same-model-only-the-harness-changes-k1-receipts-54nk</link>
      <guid>https://dev.to/abishaiama/atlarix-vs-opencode-on-terminal-bench-20-same-model-only-the-harness-changes-k1-receipts-54nk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update — treat this as a historical data point, not a current claim.&lt;/strong&gt; Two things have superseded it. Terminal-Bench has moved to &lt;strong&gt;4.0&lt;/strong&gt;, which recalibrated task resources, dropped saturated tasks and standardised an 8-hour agent timeout — 2.x scores are not comparable to it. And the headless runner that produced these numbers dispatched reasoning &lt;strong&gt;one notch below&lt;/strong&gt; each model's declared ceiling, while published leaderboard entries run the ceiling. Both are fixed; the run has not been repeated.&lt;/p&gt;

&lt;p&gt;The caveat in the post below still stands and matters more than the result: a 3-task gap at k=1 is within noise, and this &lt;strong&gt;does not&lt;/strong&gt; show Atlarix is ahead of opencode. &lt;strong&gt;There is also no Atlarix SWE-bench number&lt;/strong&gt; — if you have seen one attributed to Atlarix, it is invented. Current results and methodology: &lt;strong&gt;&lt;a href="https://www.atlarix.dev/benchmark" rel="noopener noreferrer"&gt;atlarix.dev/benchmark&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://atlarix.dev/benchmark" rel="noopener noreferrer"&gt;Benchmarks&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I build &lt;a href="https://atlarix.dev" rel="noopener noreferrer"&gt;Atlarix&lt;/a&gt;, an agent workstation for open-weight models. The core claim behind it is that the harness — retrieval, tool surface, control loop — is what lets an open-weight model perform, not just the model's raw weights. This post is me trying to falsify that claim with a controlled run, and publishing every output file so you can check it.&lt;/p&gt;

&lt;p&gt;Short version: on Terminal-Bench 2.0, single attempt, &lt;strong&gt;Atlarix resolved 42/89 and opencode resolved 39/89&lt;/strong&gt; on the same model. That 3-task gap is &lt;strong&gt;within k=1 noise&lt;/strong&gt; — I'm not claiming a win. What it shows is that the harness isn't bottlenecking the model. Details and caveats below; raw files at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  The experiment
&lt;/h2&gt;

&lt;p&gt;The only variable is the harness. Everything else is pinned identical across both agents.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Benchmark:&lt;/strong&gt; &lt;code&gt;terminal-bench/terminal-bench-2&lt;/code&gt; — all 89 tasks, one isolated container each, automated verifiers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;code&gt;minimax/minimax-m3&lt;/code&gt;, routed through OpenRouter, pinned to a single provider at &lt;strong&gt;fp8&lt;/strong&gt; — identical for both harnesses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure:&lt;/strong&gt; &lt;a href="https://github.com/harbor-framework/terminal-bench" rel="noopener noreferrer"&gt;Harbor&lt;/a&gt; on Modal (&lt;code&gt;-e modal&lt;/code&gt;), one container per task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attempts:&lt;/strong&gt; single attempt, &lt;code&gt;-k 1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timeout:&lt;/strong&gt; native, &lt;code&gt;--timeout-multiplier 1&lt;/code&gt; (same for both).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retries:&lt;/strong&gt; &lt;code&gt;--max-retries 3&lt;/code&gt; (same for both).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool calling:&lt;/strong&gt; native function-calling forced, no text-tool shim.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Atlarix harness&lt;/span&gt;
harbor run &lt;span class="nt"&gt;-d&lt;/span&gt; terminal-bench/terminal-bench-2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-m&lt;/span&gt; openai/minimax/minimax-m3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-n&lt;/span&gt; 24 &lt;span class="nt"&gt;-k&lt;/span&gt; 1 &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;--timeout-multiplier&lt;/span&gt; 1 &lt;span class="nt"&gt;--max-retries&lt;/span&gt; 3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; modal &lt;span class="nt"&gt;--agent-import-path&lt;/span&gt; atlarix_tb:AtlarixAgent

&lt;span class="c"&gt;# opencode harness (same model + provider + infra)&lt;/span&gt;
harbor run &lt;span class="nt"&gt;-d&lt;/span&gt; terminal-bench/terminal-bench-2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-m&lt;/span&gt; bench/minimax/minimax-m3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-n&lt;/span&gt; 24 &lt;span class="nt"&gt;-k&lt;/span&gt; 1 &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;--timeout-multiplier&lt;/span&gt; 1 &lt;span class="nt"&gt;--max-retries&lt;/span&gt; 3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; modal &lt;span class="nt"&gt;--agent-import-path&lt;/span&gt; atlarix_tb.opencode_proxy:BenchOpenCodeAgent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(&lt;code&gt;-n 24&lt;/code&gt; is concurrency — how many containers run in parallel — not a task count. All 89 tasks run.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Harness&lt;/th&gt;
&lt;th&gt;Resolved&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Atlarix&lt;/td&gt;
&lt;td&gt;42 / 89&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;opencode&lt;/td&gt;
&lt;td&gt;39 / 89&lt;/td&gt;
&lt;td&gt;44%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Read this before you read the table
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;k=1 means one sample per task.&lt;/strong&gt; The official Terminal-Bench leaderboard requires &lt;strong&gt;k=5&lt;/strong&gt; specifically to measure run-to-run variance. A 3-task difference at k=1 is inside that noise band. So this is &lt;strong&gt;not&lt;/strong&gt; a leaderboard result and not a claim that Atlarix beats opencode. The honest takeaway: an open-weight model performs about as well under Atlarix as under a strong existing harness — the harness isn't holding it back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;~25% of tasks timed out — for both harnesses.&lt;/strong&gt; At native timeout (×1), roughly a quarter of tasks hit &lt;code&gt;AgentTimeoutError&lt;/code&gt; on each side and count as unresolved. So the sub-50% absolute scores aren't all capability failures; a meaningful share are wall-clock on heavy tasks. The timeout ceiling is identical for both agents, so the comparison stays fair — but that's why neither number is higher.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one config change (full disclosure)
&lt;/h2&gt;

&lt;p&gt;Atlarix's desktop app asks for human approval before every file write and command — a core safety feature. Benchmarks run unattended, so I grant that approval once via an explicit operator flag (&lt;code&gt;ATLARIX_AUTONOMOUS_DANGER=1&lt;/code&gt;). Without it, any task needing an install or privileged command is blocked and fails.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt; an advantage over opencode — every agent auto-approves to run an automated benchmark; it's inherent to running unattended. Stating it for full transparency. The flag is off by default; the interactive app always asks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce it
&lt;/h2&gt;

&lt;p&gt;The exact Atlarix bundle I ran is a public, Electron-free headless build: &lt;code&gt;atlarix-headless-linux-amd64.tar.gz&lt;/code&gt;. The benchmark is the open-source Harbor framework. The raw Harbor result files — per-task pass/fail for both harnesses — are published unedited. Nothing is hand-typed.&lt;/p&gt;

&lt;p&gt;Everything (raw &lt;code&gt;result.json&lt;/code&gt; for both sides, &lt;code&gt;summary.csv&lt;/code&gt;, exact bundle, full setup): &lt;strong&gt;&lt;a href="https://atlarix.dev/benchmark" rel="noopener noreferrer"&gt;atlarix.dev/benchmark&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;More open-weight models, so no claim rests on one.&lt;/li&gt;
&lt;li&gt;The official Terminal-Bench (k=5) submission — on the roadmap.&lt;/li&gt;
&lt;li&gt;More benchmarks beyond terminal tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you spot something wrong in the result files, that's the point — tell me.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built in Nairobi.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Show dev: I built an AI agent workstation in Nairobi for open-weight and local models</title>
      <dc:creator>Amariah Kamau</dc:creator>
      <pubDate>Fri, 19 Jun 2026 09:10:36 +0000</pubDate>
      <link>https://dev.to/abishaiama/show-dev-i-built-an-ai-agent-workstation-in-nairobi-for-deepseek-qwen-kimi-minimax-lnb</link>
      <guid>https://dev.to/abishaiama/show-dev-i-built-an-ai-agent-workstation-in-nairobi-for-deepseek-qwen-kimi-minimax-lnb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Historical.&lt;/strong&gt; Blueprint, ctags, ast-grep and SQLite FTS5 were all removed from Atlarix in &lt;strong&gt;v14.9.0 (10 July 2026)&lt;/strong&gt; — the index leaked file descriptors and did not beat plain search. &lt;strong&gt;Atlarix has no index of any kind today&lt;/strong&gt;; retrieval is bundled ripgrep, no embeddings, no graph. Current docs: &lt;strong&gt;&lt;a href="https://www.atlarix.dev/docs" rel="noopener noreferrer"&gt;atlarix.dev/docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;Atlarix — a ~400MB AI agent workstation that sits &lt;em&gt;beside&lt;/em&gt; your IDE (VS Code, IntelliJ, Vim) instead of replacing it. A native harness that runs whatever model you point it at — managed, your own API key across the live models.dev catalogue, or fully local via Ollama and LM Studio. &lt;em&gt;(This post originally named four open-weight labs as "the point"; that framing no longer holds — the managed lineup is configured remotely and changes, and the harness is deliberately model-agnostic.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Built solo under NorahLabs, in Nairobi, Kenya.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;I was running open-weight models for actual agentic work — multi-file edits, terminal commands, codebase exploration. Every tool I tried was built around Claude or GPT, with my models bolted on as a BYOK option. Context-window assumptions tuned for a different model. System prompts and tool-calling shaped around closed-model behavior. Retrieval that either dumps the whole repo or leans on a cloud vector DB that doesn't even exist on an offline machine.&lt;/p&gt;

&lt;p&gt;The models are frontier-class now. The tooling around them isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The approach
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Blueprint — structural retrieval, no embeddings &lt;em&gt;(removed in v14.9.0)&lt;/em&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Universal Ctags symbols + ast-grep edges, backed by SQLite FTS5 *(all removed in v14.9.0 — see the note at the top)*
- grep results reranked by structural relevance
- each result annotated with its enclosing function/class
- no vector DB, constant memory at any repo size
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The thesis: for &lt;em&gt;code&lt;/em&gt;, lexical + structural retrieval plus the model's own reasoning beats a vector index — which is also why Claude Code and opencode carry no embedding index. On my own large multi-repo workspace, a "find the signup code" query dropped from ~63K to ~26K turn tokens with exact &lt;code&gt;file:line&lt;/code&gt; citations. (That's my own workspace, not a published benchmark — a reproducible eval is what I'm building next.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Verified edit loop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- write → re-read from disk → compare to intended
- zero tokens on the happy path
- blocks "task complete" if an edit didn't actually land
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Live model catalog
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- managed model IDs fetched from a hosted config at startup
- new drops from the four labs appear automatically
- swapping a model is a config change, not an app rebuild
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Per-OS sandboxing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- macOS: Seatbelt
- Linux: bubblewrap
- Windows: AppContainer
- every file write + command approval-gated, per-hunk diff review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Electron + React + TypeScript&lt;/li&gt;
&lt;li&gt;SQLite FTS5 for retrieval&lt;/li&gt;
&lt;li&gt;Universal Ctags + ast-grep for structural indexing&lt;/li&gt;
&lt;li&gt;Rust helper for the Windows sandbox&lt;/li&gt;
&lt;li&gt;Node.js 24+&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it's at, honestly
&lt;/h2&gt;

&lt;p&gt;v13.9.0, shipped and working. I'm one developer, so I'll be straight about the early edges: no published head-to-head benchmark yet, macOS is notarized but Windows builds are currently unsigned (signing's coming), and the retrieval numbers above are from my own use, not a controlled eval. The honest pitch is "the first workstation built &lt;em&gt;around&lt;/em&gt; open-weight models instead of just accepting them — here's exactly how," not "this beats everything."&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback wanted
&lt;/h2&gt;

&lt;p&gt;If you're running open-weight models for agentic work — what's your current setup, and where does it break? That's the feedback that actually shapes this.&lt;/p&gt;

&lt;p&gt;🌐 atlarix.dev&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>We Tried to Reduce LLM Context Usage in a Multi-Repo Codebase. The AI Used More Tokens, Not Less. Here's Why That's Correct.</title>
      <dc:creator>Amariah Kamau</dc:creator>
      <pubDate>Mon, 25 May 2026 17:46:41 +0000</pubDate>
      <link>https://dev.to/abishaiama/we-tried-to-reduce-llm-context-usage-in-a-multi-repo-codebase-the-ai-used-more-tokens-not-less-3gje</link>
      <guid>https://dev.to/abishaiama/we-tried-to-reduce-llm-context-usage-in-a-multi-repo-codebase-the-ai-used-more-tokens-not-less-3gje</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update — this experiment ended the way the numbers suggested it would.&lt;/strong&gt; Blueprint was removed from Atlarix in &lt;strong&gt;v14.9.0 (10 July 2026)&lt;/strong&gt;, along with the whole index: FTS5, BM25, ctags, the reranker and the file watcher, about 5,246 lines. The 54% result below was part of why. The watcher also turned out to hold one file descriptor per watched file, reaching roughly 12,365 on a large repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retrieval is now purely lexical&lt;/strong&gt; — bundled ripgrep, no index, no embeddings, nothing in the background. This post is the evidence for that decision, not a description of a shipping feature.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;When we set out to build Blueprint — Atlarix's structural codebase retrieval system — the hypothesis was simple: give the AI a map of the codebase upfront, and it will need to read fewer files. Fewer files means less context. Less context means lower cost and faster responses.&lt;/p&gt;

&lt;p&gt;We ran a controlled benchmark. The AI with Blueprint used &lt;strong&gt;54% more context&lt;/strong&gt; than the AI without it.&lt;/p&gt;

&lt;p&gt;Here's why that's not a failure.&lt;/p&gt;




&lt;h3&gt;
  
  
  The problem with how most AI coding tools handle context
&lt;/h3&gt;

&lt;p&gt;If you've used Cursor, Claude Code, or GitHub Copilot on a large codebase, you've hit this wall: the AI either reads too much (dumping raw files into context until you hit the limit) or reads too little (making confident wrong assumptions about files it hasn't seen).&lt;/p&gt;

&lt;p&gt;The root cause is navigation. Without a structural map of the codebase, the AI is exploring blind — making guesses about which files matter, following import chains manually, or relying on whatever files happen to be open. In a multi-repository workspace, this gets worse fast. You might have 25 separate projects with thousands of files. The AI has no idea where it is.&lt;/p&gt;

&lt;p&gt;The standard solutions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Raw file injection&lt;/strong&gt; — dump everything relevant into context upfront. Expensive and doesn't scale past a few hundred files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dense vector search&lt;/strong&gt; — embed the codebase and retrieve by semantic similarity. Loses structural relationships (call chains, import graphs, HTTP routes).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic search&lt;/strong&gt; — let the model call search/read tools and figure it out. Works, but slow and token-hungry as the model searches blindly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We built Blueprint to try a fourth approach: give the model a symbolic structural graph before it starts exploring.&lt;/p&gt;




&lt;h3&gt;
  
  
  What Blueprint actually is
&lt;/h3&gt;

&lt;p&gt;Blueprint is a four-layer index:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 1 — Universal Ctags (symbol index)&lt;/strong&gt;&lt;br&gt;
Extracts every function, class, type, and method across 18 languages. Line-accurate positions. Cached to &lt;code&gt;.atlarix/symbols.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 2 — ast-grep (structural edges)&lt;/strong&gt;&lt;br&gt;
AST-level pattern matching for import edges, call edges, and HTTP route edges. Express &lt;code&gt;app.get&lt;/code&gt;, Fastify &lt;code&gt;fastify.post&lt;/code&gt;, Next.js &lt;code&gt;export async function GET&lt;/code&gt; — all become first-class nodes in the graph.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 3 — BM25 (semantic symbol ranking)&lt;/strong&gt;&lt;br&gt;
Ranks ctags symbols by concept query. "Authentication middleware" finds the right functions without requiring an exact name match.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 4 — ripgrep (text fallback)&lt;/strong&gt;&lt;br&gt;
Exact string search for when you know precisely what you're looking for.&lt;/p&gt;

&lt;p&gt;The output is a compact Markdown slice — rooms (directory-scoped clusters), beacons (individual symbols), and edges (structural relationships). Section-scoped: the agent requests one folder at a time, not the whole workspace.&lt;/p&gt;




&lt;h3&gt;
  
  
  The benchmark
&lt;/h3&gt;

&lt;p&gt;We ran two arms of the same task on a production multi-repository workspace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;25 sections&lt;/strong&gt; across the workspace root&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3,250 tracked files&lt;/strong&gt; total&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target section:&lt;/strong&gt; a TypeScript CLI package, 99 files, ~9,500 lines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Task:&lt;/strong&gt; Trace an event-driven HTTP-ingress-to-webhook-reply pipeline. Both arms had identical deliverables — narrative of the flow, key file paths, Mermaid sequence diagram.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arm A (with Blueprint):&lt;/strong&gt; Prescribed tool order — explore folder → &lt;code&gt;get_blueprint&lt;/code&gt; → text search → &lt;code&gt;read_file&lt;/code&gt; on 2-3 central files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arm B (without Blueprint):&lt;/strong&gt; Same task, no &lt;code&gt;get_blueprint&lt;/code&gt; — only explore folder → text search → &lt;code&gt;read_file&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; Kimi K2.6 (268K context window) via OpenRouter. Same model, same provider, both arms.&lt;/p&gt;




&lt;h3&gt;
  
  
  The results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;With Blueprint&lt;/th&gt;
&lt;th&gt;Without Blueprint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Blueprint slice&lt;/td&gt;
&lt;td&gt;~6,500 tokens&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Final billed input&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;63,541 tokens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;41,327 tokens&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output tokens&lt;/td&gt;
&lt;td&gt;2,671&lt;/td&gt;
&lt;td&gt;2,534&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Task completion&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Blueprint arm used &lt;strong&gt;54% more total context.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Context growth per turn:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With Blueprint:&lt;/strong&gt; 8,661 → 13,966 → 24,771 → 25,012 → 31,717 → 54,188 → 63,541&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without Blueprint:&lt;/strong&gt; 2,253 → 3,567 → 8,629 → 13,934 → 14,175 → 37,876 → 41,327&lt;/p&gt;

&lt;p&gt;The Blueprint arm took six tool-call turns. The no-Blueprint arm took five.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why this is the correct result
&lt;/h3&gt;

&lt;p&gt;Here's what we found in the qualitative output comparison:&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Blueprint arm&lt;/strong&gt; named 7 specific internal functions by exact identifier — the auth validator, mention detector, memory clamp, post-processor, card builder, and two others. It surfaced a section-specific post-processor module not explicitly requested.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;no-Blueprint arm&lt;/strong&gt; found a client module in an &lt;code&gt;eval/&lt;/code&gt; subdirectory that Blueprint's section scope hadn't included. It named specific environment variables and API constants the text search found directly.&lt;/p&gt;

&lt;p&gt;Both arms completed the task correctly. But the &lt;em&gt;type&lt;/em&gt; of knowledge was different.&lt;/p&gt;

&lt;p&gt;Blueprint gave the model a symbol-level map before any file was read. With that map, the model knew which files were worth reading and went deeper — more function names, more architectural detail, more thorough coverage. Without the map, the model explored more conservatively: followed fewer paths, read fewer files, stopped sooner.&lt;/p&gt;

&lt;p&gt;The no-Blueprint arm used fewer tokens partly because it was less certain about what to look for next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a read-only exploration task, "explored less" isn't obviously worse.&lt;/strong&gt; Both arms got the answer. But for write tasks — bug fixes, refactors, feature implementation — a model that stops exploring because it's navigationally lost is not saving tokens. It's missing dependencies, and those missing dependencies become production bugs.&lt;/p&gt;




&lt;h3&gt;
  
  
  The real finding: structural understanding and execution context are separable problems
&lt;/h3&gt;

&lt;p&gt;The honest framing isn't "Blueprint reduces total context." It's that these are two different problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structural understanding cost&lt;/strong&gt; — how many tokens does it take to know where you are in the codebase?&lt;/p&gt;

&lt;p&gt;With Blueprint: &lt;strong&gt;~6,500 tokens&lt;/strong&gt;, regardless of section complexity, in ~3 seconds.&lt;br&gt;
Without Blueprint: amortised across many search/read tool calls over multiple turns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Execution context&lt;/strong&gt; — how many tokens accumulate as the model actually does the work?&lt;/p&gt;

&lt;p&gt;This is determined by exploration depth — how many files the model reads, how many tool calls it makes. Blueprint increases this by making the model more confident. But it's bounded and manageable.&lt;/p&gt;

&lt;p&gt;We address the execution context problem with a separate mechanism: post-turn tool-result summarisation. After each turn, large tool outputs in the persisted transcript are rewritten by a fast compaction model — keeping paths, symbol names, and key values, dropping JSON noise and repetition. In the benchmark runs, individual &lt;code&gt;read_file&lt;/code&gt; results compressed from 2,500–3,500 tokens to 60–110 tokens. ~95–98% reduction per qualifying block.&lt;/p&gt;

&lt;p&gt;Two mechanisms, two layers, two different problems.&lt;/p&gt;




&lt;h3&gt;
  
  
  What this means if you're building on top of LLMs
&lt;/h3&gt;

&lt;p&gt;If you're building an AI coding tool, an agentic system, or anything that needs to navigate a large codebase:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't chase "total context reduction" as a single metric.&lt;/strong&gt; It conflates structural overhead (knowable upfront, bounded by your retrieval design) with execution noise (determined by task complexity and model confidence).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give the model a map before it explores.&lt;/strong&gt; Not raw files — a structural graph. The model will use more total context because it will explore more thoroughly. That's the right trade for write tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compress history, not retrieval.&lt;/strong&gt; Post-turn summarisation on tool outputs is more effective than trying to cram less information into the initial retrieval. The model needs the full file during the turn. Future turns don't.&lt;/p&gt;




&lt;h3&gt;
  
  
  The full paper
&lt;/h3&gt;

&lt;p&gt;This benchmark is documented in a technical paper published on Zenodo with full methodology, exact prompts, provider-billed token counts, and an honest discussion of limitations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blueprint: Section-Scoped Structural Graph Retrieval and Post-Turn Compression for Agentic LLM Coding in Multi-Repository Workspaces&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zenodo.org/records/20381860" rel="noopener noreferrer"&gt;zenodo.org/records/20381860&lt;/a&gt; · DOI: 10.5281/zenodo.20381860&lt;/p&gt;

&lt;p&gt;Atlarix is available at &lt;a href="https://atlarix.dev" rel="noopener noreferrer"&gt;atlarix.dev&lt;/a&gt;. The MCP server registry is open-source at &lt;a href="https://github.com/AmariahAK/atlarix-mcps" rel="noopener noreferrer"&gt;github.com/AmariahAK/atlarix-mcps&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built in Nairobi. Questions or thoughts? Drop them in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Build an AI Agent That Actually Understands Your Codebase (Without Switching Editors)</title>
      <dc:creator>Amariah Kamau</dc:creator>
      <pubDate>Mon, 18 May 2026 13:04:51 +0000</pubDate>
      <link>https://dev.to/abishaiama/build-an-ai-agent-that-actually-understands-your-codebase-without-switching-editors-6d9</link>
      <guid>https://dev.to/abishaiama/build-an-ai-agent-that-actually-understands-your-codebase-without-switching-editors-6d9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Historical.&lt;/strong&gt; Blueprint, ctags, ast-grep and SQLite FTS5 were all removed from Atlarix in &lt;strong&gt;v14.9.0 (10 July 2026)&lt;/strong&gt; — the index leaked file descriptors and did not beat plain search. &lt;strong&gt;Atlarix has no index of any kind today&lt;/strong&gt;; retrieval is bundled ripgrep, no embeddings, no graph. Current docs: &lt;strong&gt;&lt;a href="https://www.atlarix.dev/docs" rel="noopener noreferrer"&gt;atlarix.dev/docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;I use Neovim. I'm not switching.&lt;/p&gt;

&lt;p&gt;But I also want an agent that can refactor across 50 files, run tests, debug failures, and come back with a working PR — not just suggest the next line.&lt;/p&gt;

&lt;p&gt;The problem: every AI coding tool that does serious agentic work wants to be your editor. Cursor, Windsurf, GitHub Copilot Workspace — all VS Code. If you use anything else, you're a second-class citizen.&lt;/p&gt;

&lt;p&gt;So I built something different. An agent that has its own workspace &lt;em&gt;beside&lt;/em&gt; my editor, not inside it. I stay in Neovim. The agent gets a live map of the codebase, a terminal, file tools, and an approval queue.&lt;/p&gt;

&lt;p&gt;This post walks through how it works, how to set it up, and what it actually looks like in practice.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Problem with Raw Code Injection
&lt;/h2&gt;

&lt;p&gt;Before getting into the setup, it's worth understanding why most agents struggle with large codebases.&lt;/p&gt;

&lt;p&gt;The standard approach is to dump files into the context window:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Here is your codebase:
[file 1 - 500 lines]
[file 2 - 800 lines]
[file 3 - 1200 lines]
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works at small scale. At 20+ files it starts to break down. The model spends most of its reasoning budget reconstructing architecture from raw text instead of actually solving the problem.&lt;/p&gt;

&lt;p&gt;The better approach: give the agent a &lt;em&gt;structured map&lt;/em&gt; of the codebase and let it query specific parts on demand. Think of it like the difference between handing someone a stack of printed pages vs giving them a searchable database with a good schema.&lt;/p&gt;

&lt;p&gt;That's the core idea behind Atlarix's Live Code Map — your repo gets parsed into a node/edge graph that the agent navigates instead of reading raw files linearly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Download and Install
&lt;/h3&gt;

&lt;p&gt;Grab the installer from &lt;a href="https://atlarix.dev" rel="noopener noreferrer"&gt;atlarix.dev&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS&lt;/strong&gt;: &lt;code&gt;.dmg&lt;/code&gt;, notarized, installs to Applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux&lt;/strong&gt;: &lt;code&gt;.AppImage&lt;/code&gt; (auto-updates), &lt;code&gt;.deb&lt;/code&gt;, or &lt;code&gt;.rpm&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: unsigned &lt;code&gt;.exe&lt;/code&gt; (code signing coming)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Install the CLI
&lt;/h3&gt;

&lt;p&gt;Open Atlarix → Settings → General → Install CLI.&lt;/p&gt;

&lt;p&gt;This drops an &lt;code&gt;atlarix&lt;/code&gt; binary into your PATH. After that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Open current directory as a workspace&lt;/span&gt;
atlarix &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Open a specific path&lt;/span&gt;
atlarix ~/projects/my-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same muscle memory as &lt;code&gt;code .&lt;/code&gt;. Atlarix opens in the background, your terminal returns immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Connect a Model
&lt;/h3&gt;

&lt;p&gt;Go to Settings → AI. You have two options:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BYOK (Bring Your Own Key)&lt;/strong&gt; — paste in an API key for any of the supported providers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenAI, Anthropic, Google Gemini, Groq, Together AI,
Mistral, xAI, OpenRouter, AWS Bedrock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Local models via Ollama or LM Studio&lt;/strong&gt; — set the base URL and pick your model. No API key needed. Works on the free Solo tier.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ollama base URL: http://localhost:11434
Model: qwen2.5-coder:7b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For local models I've had good results with &lt;code&gt;qwen2.5-coder:7b&lt;/code&gt; and &lt;code&gt;deepseek-coder-v2:16b&lt;/code&gt; on an M2 MacBook. The structured context from the code map means you don't need a massive model to get useful results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model Bridge (managed)&lt;/strong&gt; — Atlarix's own managed tier (Speed/Standard/Deep) if you don't want to manage keys. Speed tier is included in the free Solo plan.&lt;/p&gt;




&lt;h2&gt;
  
  
  Opening a Workspace
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-saas-api
atlarix &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atlarix opens and loads your workspace. The first thing it does is a lightweight repo scan via &lt;code&gt;git ls-files&lt;/code&gt; — fast, respects your &lt;code&gt;.gitignore&lt;/code&gt;, and doesn't run any heavy parsing upfront.&lt;/p&gt;

&lt;p&gt;The Live Code Map was built on-demand when the agent first called &lt;code&gt;get_blueprint&lt;/code&gt;. &lt;em&gt;(The &lt;code&gt;get_blueprint&lt;/code&gt; tool, the Blueprint tab and the map itself were all removed in v14.9.0 — see the note at the top.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For a 500-file TypeScript repo, the initial parse takes 3–5 seconds. After that it's cached and incremental.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your First Agent Task
&lt;/h2&gt;

&lt;p&gt;Let's say I want to add rate limiting to my auth routes. Here's what that actually looks like.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Start in Explore Mode
&lt;/h3&gt;

&lt;p&gt;Pick &lt;strong&gt;Explore&lt;/strong&gt; from the mode selector. This is read-only — the agent can query the code map, read files, and search, but can't write anything. Good for orientation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Me: Map the auth flow. Where does a login request go from the 
    route handler to the database?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent called &lt;code&gt;get_blueprint&lt;/code&gt; to pull the architectural graph, then navigated from the auth route to the middleware stack to the database layer. &lt;em&gt;(Today it does this with ripgrep and reasoning over ranked results — no graph involved.)&lt;/em&gt; It comes back with a precise answer and which files are involved — without reading every file in the codebase.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Switch to Plan Mode
&lt;/h3&gt;

&lt;p&gt;Now switch to &lt;strong&gt;Plan&lt;/strong&gt; mode. The agent can now draft a plan but still can't execute writes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Me: I want to add rate limiting to the login and registration 
    routes. Use express-rate-limit. Failed attempts should be 
    tracked by IP. After 5 failures in 10 minutes, lock out 
    for 30 minutes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent knows the architecture from the previous explore session. It drafts a step-by-step plan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Plan: Add rate limiting to auth routes

[ ] Install express-rate-limit
[ ] Create rate limiter config in src/middleware/rateLimiter.ts
[ ] Apply limiter to POST /auth/login in src/routes/auth.ts
[ ] Apply limiter to POST /auth/register in src/routes/auth.ts
[ ] Add error response handler for 429 status
[ ] Update integration tests in tests/auth.test.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Review the plan. If it looks right, switch to &lt;strong&gt;Build&lt;/strong&gt; mode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Build — Approval Queue in Action
&lt;/h3&gt;

&lt;p&gt;In Build mode, the agent starts executing. For every file write, you get an approval prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;rateLimiter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;

&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;rateLimit&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express-rate-limit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loginRateLimiter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;rateLimit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;   &lt;span class="na"&gt;windowMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 10 minutes&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;   &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;   &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Too many login attempts. Try again later.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;   &lt;span class="na"&gt;standardHeaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;   &lt;span class="na"&gt;legacyHeaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;registerRateLimiter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;rateLimit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;   &lt;span class="na"&gt;windowMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 1 hour&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;   &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;   &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Too many registration attempts.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;   &lt;span class="na"&gt;standardHeaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;   &lt;span class="na"&gt;legacyHeaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&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="nx"&gt;Approve&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Reject&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You approve. The file gets written. The agent continues through the plan.&lt;/p&gt;

&lt;p&gt;For terminal commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Terminal: npm &lt;span class="nb"&gt;install &lt;/span&gt;express-rate-limit

&lt;span class="o"&gt;[&lt;/span&gt;Approve] &lt;span class="o"&gt;[&lt;/span&gt;Reject]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You approve. It runs, shows you the output, continues.&lt;/p&gt;

&lt;p&gt;This isn't friction — it's the same review cycle as a PR, but live. You're watching the work happen and approving as it goes rather than reviewing after the fact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Review in Your Editor
&lt;/h3&gt;

&lt;p&gt;The agent writes the files. You review them in Neovim, VS Code, IntelliJ, or wherever. The agent doesn't care what you're using to review — it just cares about the approval queue.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Meanwhile in my terminal&lt;/span&gt;
nvim src/middleware/rateLimiter.ts
&lt;span class="c"&gt;# Looks good, approve the rest in Atlarix&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Tests
&lt;/h3&gt;

&lt;p&gt;If the agent runs tests as part of the plan and they fail, it reads the failure output and iterates. Self-correction is built in — up to a configurable number of retry attempts before it stops and asks you what to do.&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="go"&gt;Test run: npm test
FAIL tests/auth.test.ts
  ● Auth › POST /login › should return 429 after 5 attempts
    Expected: 429
    Received: 200

Diagnosing failure...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It reads the test, traces the failure to a missing &lt;code&gt;@types/express-rate-limit&lt;/code&gt; dev dependency, installs it, re-runs. Pass.&lt;/p&gt;




&lt;h2&gt;
  
  
  Modes Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;What the agent can do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Explore&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Read files, query code map, search, web search. No writes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Everything in Explore + draft plans, create &lt;code&gt;.atlarix/ATLARIX_PLAN.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full tool access — file writes, terminal, tests, MCP calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Focused on diagnosing and fixing specific errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Review&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Read-only analysis, code quality feedback, architectural suggestions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can switch modes mid-session. The agent's context persists across the switch.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Works Well With Local Models
&lt;/h2&gt;

&lt;p&gt;If you're running Ollama, here's what I've found works well and what doesn't:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Works great:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explore mode — querying the code map, finding files, understanding architecture. Even a 7B model does this well when it has the graph.&lt;/li&gt;
&lt;li&gt;Simple, scoped Build tasks — "add a field to this schema and update the related API endpoint"&lt;/li&gt;
&lt;li&gt;Fix mode — diagnosing TypeScript errors with LSP output injected into context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Works better with larger models:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-step autonomous plans across many files&lt;/li&gt;
&lt;li&gt;Complex refactors with non-obvious dependency chains&lt;/li&gt;
&lt;li&gt;Tasks that require reasoning about edge cases and side effects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The practical threshold I've found: for anything touching more than 10 files or involving significant architectural decisions, I switch from my local 7B to a Standard tier cloud model. For everything else, local is fast and free.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;.atlarix/ATLARIX.md&lt;/code&gt; for persistent context.&lt;/strong&gt; This file gets injected into every session for this workspace. Put your tech stack, conventions, and any context the agent should always know.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Project Context&lt;/span&gt;

Stack: Node.js, Express, TypeScript, PostgreSQL, Prisma
Auth: JWT with refresh tokens, stored in httpOnly cookies
Testing: Jest + Supertest
Conventions: 
&lt;span class="p"&gt;-&lt;/span&gt; All database queries go through service layer, never directly in routes
&lt;span class="p"&gt;-&lt;/span&gt; Error handling via custom AppError class in src/lib/errors.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Start tasks in Explore mode.&lt;/strong&gt; Even for tasks you think are simple, a quick explore turn first means the agent navigates correctly from the start rather than making wrong assumptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reject and explain, don't just reject.&lt;/strong&gt; When you reject an approval queue item, add a reason. The agent uses it to replan. "Reject — use the existing &lt;code&gt;AppError&lt;/code&gt; class for error handling, not a raw &lt;code&gt;throw&lt;/code&gt;" gets you a better next attempt than a silent reject.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check the Blueprint canvas on new codebases.&lt;/strong&gt; &lt;em&gt;(Removed — there is no canvas.)&lt;/em&gt; The visual graph in the Blueprint tab is useful for understanding unfamiliar repos. Filter by file type, zoom into a module, and let the graph show you the dependency shape before you start prompting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Free Tier Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Solo (Free)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Workspaces&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local models (Ollama, LM Studio)&lt;/td&gt;
&lt;td&gt;✓ Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model Bridge Speed tier&lt;/td&gt;
&lt;td&gt;✓ Included usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core tools (file, terminal, search, blueprint)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP marketplace&lt;/td&gt;
&lt;td&gt;✗ (1 manual MCP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent Behaviors marketplace&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a solo developer using local models, the free tier is genuinely unlimited. No token caps on Ollama usage.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Download from atlarix.dev&lt;/span&gt;
&lt;span class="c"&gt;# 2. Install CLI from Settings → General&lt;/span&gt;
&lt;span class="c"&gt;# 3. Open your project&lt;/span&gt;
atlarix &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# 4. Connect Ollama (or paste an API key)&lt;/span&gt;
&lt;span class="c"&gt;# 5. Start in Explore mode, describe your codebase&lt;/span&gt;
&lt;span class="c"&gt;# 6. Switch to Build when you're ready to execute&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The learning curve is less steep than it sounds. The hardest part is resisting the urge to jump straight into Build mode — a quick Explore turn first makes everything else go smoother.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://atlarix.dev" rel="noopener noreferrer"&gt;atlarix.dev&lt;/a&gt; — macOS + Linux, free Solo tier&lt;/p&gt;

&lt;p&gt;Open source: &lt;a href="https://github.com/AmariahAK/atlarix-skills" rel="noopener noreferrer"&gt;atlarix-skills&lt;/a&gt; · &lt;a href="https://github.com/AmariahAK/atlarix-mcps" rel="noopener noreferrer"&gt;atlarix-mcps&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions? Drop them in the comments — happy to go deep on any part of this.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>typescript</category>
      <category>devtools</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I reduced AI codebase context from 100K to 5K tokens using a graph-based RAG — and why I deleted it</title>
      <dc:creator>Amariah Kamau</dc:creator>
      <pubDate>Thu, 30 Apr 2026 18:43:26 +0000</pubDate>
      <link>https://dev.to/abishaiama/how-i-reduced-ai-codebase-context-from-100k-to-5k-tokens-using-a-graph-based-rag-4dbd</link>
      <guid>https://dev.to/abishaiama/how-i-reduced-ai-codebase-context-from-100k-to-5k-tokens-using-a-graph-based-rag-4dbd</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Historical — the architecture below was removed from Atlarix in v14.9.0 (10 July 2026).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Blueprint, the parser, the SQLite graph, BM25 node scoring and the file watcher were all deleted — roughly 5,246 lines — after the watcher was found to hold one file descriptor per watched file and reach about 12,365 on a large repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atlarix today has no index of any kind.&lt;/strong&gt; Retrieval is purely lexical: bundled ripgrep (&lt;code&gt;grep&lt;/code&gt; and &lt;code&gt;glob&lt;/code&gt;), no embeddings, no vector store, no graph, nothing in the background. Current architecture: &lt;strong&gt;&lt;a href="https://www.atlarix.dev/docs" rel="noopener noreferrer"&gt;atlarix.dev/docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Most AI coding tools lie to you about context.&lt;/p&gt;

&lt;p&gt;They say "I understand your codebase." What they actually do is dump as many files as possible into the context window and hope the model figures it out. That works on a 3-file project. It falls apart on anything real.&lt;/p&gt;

&lt;p&gt;Here's the problem I kept hitting: a medium-sized production codebase hits ~100K tokens when you try to feed it to an LLM. That's expensive, slow, and surprisingly lossy — models start hallucinating relationships between files that don't exist, missing the ones that do.&lt;br&gt;
So I built a different approach inside Atlarix. Here's exactly how it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Parse the codebase into a typed graph (Round-Trip Engineering)
&lt;/h2&gt;

&lt;p&gt;When you open a project in Atlarix, it runs a parser over every file using Tree-sitter AST. Instead of storing raw text, it extracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every function, class, interface, and type&lt;/li&gt;
&lt;li&gt;Import/export relationships between files&lt;/li&gt;
&lt;li&gt;Call relationships between functions&lt;/li&gt;
&lt;li&gt;File-level dependency edges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This got stored as a typed node/edge graph in SQLite — what we called the Blueprint. &lt;em&gt;(Removed in v14.9.0. There is no SQLite graph and no Blueprint today.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Query the graph, not the files
&lt;/h2&gt;

&lt;p&gt;When you asked Atlarix something, it didn't re-read your files — it queried the Blueprint graph. &lt;em&gt;(Today it does re-read files, deliberately: ripgrep over the workspace, no index in between.)&lt;/em&gt;&lt;br&gt;
We use BM25 scoring to rank nodes by relevance to the query. Only the top-scoring nodes get passed to the LLM. Everything else stays in SQLite.&lt;br&gt;
Result: instead of ~100K tokens, the average query uses ~5K tokens. That's a 95% reduction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Hierarchical context for complex queries
&lt;/h2&gt;

&lt;p&gt;For simple queries, BM25 node retrieval is enough. For complex ones — multi-file refactors, architecture questions — we use a three-layer hierarchy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mermaid diagram&lt;/strong&gt; — a persistent high-level map of the whole codebase, always in context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BM25-scored Blueprint nodes&lt;/strong&gt; — targeted retrieval for the specific query&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast-model compression&lt;/strong&gt; — if context hits 70% capacity, a fast model compresses the least relevant nodes before passing to the main model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps context tight regardless of project size.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Provider-agnostic by design
&lt;/h2&gt;

&lt;p&gt;The Blueprint RAG layer sits beneath every AI provider. Whether you're using GPT-4o, Claude, Gemini, Groq, or a local Ollama model — the same 5K token context gets served. You're not paying for the model to re-read your whole codebase on every message.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters beyond token cost
&lt;/h2&gt;

&lt;p&gt;The token reduction is the headline number. But the real win is accuracy.&lt;br&gt;
When you give an LLM 100K tokens, it attends to all of it roughly equally. The file you actually care about is competing with 200 other files for attention. With 5K targeted tokens, the model is working with exactly what's relevant. Responses are more precise, edits land in the right place, and hallucinated file paths basically disappear.&lt;/p&gt;

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

&lt;p&gt;Atlarix v7 added parallel agents named Research, Architect, Builder, Reviewer and Debugger on top of this foundation. &lt;strong&gt;Those names are long gone and are a common source of stale descriptions of Atlarix.&lt;/strong&gt; The work modes today are Explore, Plan, Build, Debug and Review, and the &lt;code&gt;task&lt;/code&gt; tool spawns scoped workers whose edits come back as reviewable proposals rather than writes.&lt;br&gt;
We also just shipped Windows support today — so Atlarix now runs on Mac, Windows, and Linux.&lt;br&gt;
If you're building something where AI context management is a bottleneck, I'd love to compare notes. Try it at atlarix.dev or ask me anything in the comments&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devtools</category>
      <category>buildinpublic</category>
      <category>programming</category>
    </item>
    <item>
      <title>What two hackathons taught me about agent architecture — and how it's reshaping Atlarix</title>
      <dc:creator>Amariah Kamau</dc:creator>
      <pubDate>Fri, 10 Apr 2026 18:05:45 +0000</pubDate>
      <link>https://dev.to/abishaiama/what-two-hackathons-taught-me-about-agent-architecture-and-how-its-reshaping-atlarix-36ch</link>
      <guid>https://dev.to/abishaiama/what-two-hackathons-taught-me-about-agent-architecture-and-how-its-reshaping-atlarix-36ch</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe97kbtca8dlmbpuxe61s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe97kbtca8dlmbpuxe61s.png" alt=" " width="800" height="509"&gt;&lt;/a&gt;I recently competed in two hackathons back to back: the Amazon Nova AI Hackathon (virtual, won the Bonus Blog Post Prize) and the Lua x Antler "Building Agent-First Businesses" event in Nairobi (physical). Both cracked open how I was thinking about agents in ways I didn't expect.&lt;/p&gt;

&lt;p&gt;The Amazon Nova lesson: a model is only as powerful as its capabilities&lt;/p&gt;

&lt;p&gt;The hackathon required building with Amazon Nova. My instinct going in was that model choice was the primary variable — pick the best model, get the best results. Wrong.&lt;/p&gt;

&lt;p&gt;What actually moved the needle was what I wrapped around the model: the tools it could call, the context it had access to, how I structured the agent loop. Nova performed at a high level not because of raw benchmark numbers but because I gave it enough surface area to work with.&lt;/p&gt;

&lt;p&gt;This directly influenced how I think about Atlarix's Compass tier system. Compass routed users to Fast / Balanced / Thinking model tiers via OpenRouter — but the tier was almost secondary to the tooling layer underneath. That part of the thesis held; the specifics did not. &lt;em&gt;(Two numbers in the original version of this sentence are worth correcting, because they still circulate: there was never a stable "57 tools" — the tool surface is deliberately small and changes between releases — and "RTE codebase parsing into a SQLite knowledge graph" was removed in v14.9.0. Atlarix has no index, no graph and no embeddings; retrieval is bundled ripgrep.)&lt;/em&gt; What survived is the claim underneath: the harness matters more than the model slot.&lt;/p&gt;

&lt;p&gt;The Nairobi lesson: our definition of "agent" was too narrow&lt;br&gt;
At the Lua x Antler event, I saw builders shipping agent-first products that weren't just "chat plus tools." These were autonomous systems designed around specific domains — deeply customized, operator-light, solving massive real-world use cases across the continent. The technical depth in that room reset my benchmark.&lt;br&gt;
It pushed me to think harder about what "agent mode" actually means in Atlarix. Right now we have Ask / Plan / Build / Debug / Review. That's a good start. But the next version needs to think more seriously about customization depth — how specialized can an agent get for a specific codebase, workflow, or domain?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2h07n6s6cdwrbbl407k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2h07n6s6cdwrbbl407k.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb6gz694xglpbjnkbx2u.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsb6gz694xglpbjnkbx2u.jpeg" alt=" " width="576" height="1280"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5av6qwwyw4rf75urzn0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe5av6qwwyw4rf75urzn0.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
What's next for Atlarix&lt;br&gt;
We're building the next version informed by both of these. The core thesis stays: Your Architecture. Your Model. Your Sovereignty. But we're pushing further into:&lt;/p&gt;

&lt;p&gt;Deeper agent specialization per workflow&lt;br&gt;
First-class support for African AI models as they come online&lt;br&gt;
Keeping data local and sovereign by default&lt;/p&gt;

&lt;p&gt;If you're building with agents or thinking about model-agnostic tooling, I'd love to compare notes. Atlarix is open for early access at atlarix.dev.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>devtools</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>The Private Sovereign AI Workstation — Why I built Atlarix differently</title>
      <dc:creator>Amariah Kamau</dc:creator>
      <pubDate>Sun, 29 Mar 2026 19:13:08 +0000</pubDate>
      <link>https://dev.to/abishaiama/the-private-sovereign-ai-ide-why-i-built-atlarix-differently-1839</link>
      <guid>https://dev.to/abishaiama/the-private-sovereign-ai-ide-why-i-built-atlarix-differently-1839</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Historical — the architecture below was removed from Atlarix in v14.9.0 (10 July 2026).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Blueprint, the parser, the SQLite graph, BM25 node scoring and the file watcher were all deleted — roughly 5,246 lines — after the watcher was found to hold one file descriptor per watched file and reach about 12,365 on a large repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atlarix today has no index of any kind.&lt;/strong&gt; Retrieval is purely lexical: bundled ripgrep (&lt;code&gt;grep&lt;/code&gt; and &lt;code&gt;glob&lt;/code&gt;), no embeddings, no vector store, no graph, nothing in the background. Current architecture: &lt;strong&gt;&lt;a href="https://www.atlarix.dev/docs" rel="noopener noreferrer"&gt;atlarix.dev/docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;There's an assumption baked into every major AI coding tool right now.&lt;br&gt;&lt;br&gt;
That you have a $20/month subscription to an American AI company. That you have a fast, stable connection. That the models worth using are the ones coming out of San Francisco.&lt;/p&gt;

&lt;p&gt;I'm building software from Nairobi. That assumption doesn't hold.&lt;/p&gt;

&lt;p&gt;So I built Atlarix differently — and after a year of building, &lt;strong&gt;v5.1.0&lt;/strong&gt; is the version that finally says out loud what it was always trying to be: &lt;strong&gt;The Private Sovereign AI IDE&lt;/strong&gt; &lt;em&gt;(the name did not last — Atlarix is explicitly not an IDE; it runs beside your editor, and never replaced it)&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What that actually means
&lt;/h2&gt;

&lt;p&gt;Sovereign doesn't mean offline-only or anti-cloud. It means &lt;strong&gt;you decide&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
You decide which model runs your code.&lt;br&gt;&lt;br&gt;
You decide what context gets sent.&lt;br&gt;&lt;br&gt;
You decide whether your keys live on your machine or in a provider's system.&lt;/p&gt;

&lt;p&gt;Atlarix is built around three ideas that most AI coding tools don't share:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Blueprint — your codebase as a living graph
&lt;/h3&gt;

&lt;p&gt;Instead of sending files per query, Atlarix parsed your codebase into a persistent node/edge graph stored locally in SQLite, and that graph became the AI's long-term memory. &lt;em&gt;(All of it was removed in v14.9.0. Project memory survives as plain notes on disk; the graph does not.)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Any model — genuinely
&lt;/h3&gt;

&lt;p&gt;Cloud providers via BYOK. Local models via Ollama and LM Studio. And now &lt;strong&gt;Compass&lt;/strong&gt; — three built-in model tiers (Fast, Balanced, Thinking) that work the moment you open the app. No API key. No configuration. Just open and build.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The tool carries the intelligence
&lt;/h3&gt;

&lt;p&gt;This is the core thesis. Atlarix feeds the model exactly what it needs, when it needs it, scoped by your &lt;code&gt;.atlarixignore&lt;/code&gt; and Blueprint context tiers. A lighter model with good context beats a frontier model flying blind. That's not a consolation prize — that's the architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Work modes that mean something
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ask&lt;/strong&gt; — read-only. No code changes, no terminal. Research, explore, understand.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plan&lt;/strong&gt; — map out what needs to happen before anything gets written.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build&lt;/strong&gt; — full tools, explicit approval queue before execution.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debug&lt;/strong&gt; — focused on what's broken and why.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review&lt;/strong&gt; — read your code the way a reviewer would.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each mode binds to a Blueprint context tier. The AI isn't just switching personality — it's switching what it knows and what it's allowed to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why sovereignty matters right now
&lt;/h2&gt;

&lt;p&gt;AI coding tools are becoming infrastructure. The question of which model runs your code, who sees your prompts, and whether you can switch providers without rebuilding your workflow — these are not small questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atlarix's answer&lt;/strong&gt;: your architecture, your model, your sovereignty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v5.1.0 is live.&lt;/strong&gt; Free to start. Native desktop — Mac, Windows, Linux.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://atlarix.dev" rel="noopener noreferrer"&gt;atlarix.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I built this from Nairobi. If you try it, tell me honestly what's missing. That feedback is worth more than any press right now.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>ai</category>
      <category>devtools</category>
      <category>programming</category>
    </item>
    <item>
      <title>Atlarix v3.7 is live — now Apple Notarized</title>
      <dc:creator>Amariah Kamau</dc:creator>
      <pubDate>Fri, 06 Mar 2026 15:12:43 +0000</pubDate>
      <link>https://dev.to/abishaiama/atlarix-v37-is-live-now-apple-notarized-o8a</link>
      <guid>https://dev.to/abishaiama/atlarix-v37-is-live-now-apple-notarized-o8a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Historical — v3.7, March 2026.&lt;/strong&gt; Blueprint and RTE parsing, described below as how Atlarix works, were &lt;strong&gt;removed in v14.9.0 (10 July 2026)&lt;/strong&gt; along with the entire index. &lt;strong&gt;Atlarix has no graph and no RAG knowledge base today&lt;/strong&gt; — retrieval is bundled ripgrep over your workspace, with no embeddings and nothing running in the background. Current docs: &lt;strong&gt;&lt;a href="https://www.atlarix.dev/docs" rel="noopener noreferrer"&gt;atlarix.dev/docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;After months of building, testing, and waiting on &lt;br&gt;
Apple's notarization process — Atlarix v3.7 is &lt;br&gt;
officially live and Apple Verified.&lt;/p&gt;

&lt;p&gt;What is Atlarix?&lt;br&gt;
An AI coding copilot that actually understands your &lt;br&gt;
entire codebase. Not just the open file. &lt;br&gt;
The whole thing — visually.&lt;/p&gt;

&lt;p&gt;Here's what makes it different:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blueprint + RTE Parsing&lt;/strong&gt;&lt;br&gt;
Atlarix parses your project once using Round-Trip &lt;br&gt;
Engineering. It builds a live architecture diagram &lt;br&gt;
(Blueprint) and uses it as a RAG knowledge base. &lt;br&gt;
Every AI response comes from the graph — not from &lt;br&gt;
scanning 100K tokens of raw files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8 AI Providers + Local Models&lt;/strong&gt;&lt;br&gt;
Claude, GPT-4, Gemini, Groq, Mistral, xAI, &lt;br&gt;
OpenRouter, Together AI. Plus Ollama and LM Studio &lt;br&gt;
for fully offline, private coding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent System&lt;/strong&gt;&lt;br&gt;
Research, Architect, Builder, Reviewer — &lt;br&gt;
each with dedicated tools and structured delegation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v3.7 specifically:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apple Notarized and code-signed (Mac)&lt;/li&gt;
&lt;li&gt;Sentry error monitoring&lt;/li&gt;
&lt;li&gt;PostHog optional analytics (consent-based)&lt;/li&gt;
&lt;li&gt;Two-stage auto router&lt;/li&gt;
&lt;li&gt;Blueprint enricher&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This couldn't have been possible without every &lt;br&gt;
person who downloaded and used Atlarix before it &lt;br&gt;
was polished. To all our active users — &lt;br&gt;
to many more achievements 🥳&lt;/p&gt;

&lt;p&gt;Free to try → &lt;a href="https://atlarix.dev" rel="noopener noreferrer"&gt;https://atlarix.dev&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  devtools #buildinpublic #AI #MacOS
&lt;/h1&gt;

</description>
      <category>buildinpublic</category>
      <category>devtools</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Got Tired of Re-Explaining My Codebase to AI Every Single Session</title>
      <dc:creator>Amariah Kamau</dc:creator>
      <pubDate>Wed, 18 Feb 2026 19:57:09 +0000</pubDate>
      <link>https://dev.to/abishaiama/i-got-tired-of-re-explaining-my-codebase-to-ai-every-single-session-10dk</link>
      <guid>https://dev.to/abishaiama/i-got-tired-of-re-explaining-my-codebase-to-ai-every-single-session-10dk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Historical — February 2026. The architecture described below was removed from Atlarix in v14.9.0 (10 July 2026) and no longer exists.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Blueprint, the parser, the graph, the file watcher and the whole index were deleted — about 5,246 lines — after the watcher was found to hold one open file descriptor per watched file, reaching roughly 12,365 of them on a large repository and breaking every child process the app tried to spawn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atlarix today has no index of any kind.&lt;/strong&gt; Retrieval is purely lexical: bundled ripgrep (&lt;code&gt;grep&lt;/code&gt; and &lt;code&gt;glob&lt;/code&gt;) over the open workspace, with no embeddings, no vector store, no structural graph and nothing running in the background. Project memory survives, but as plain notes on disk rather than a parsed graph.&lt;/p&gt;

&lt;p&gt;The problem this post opens with is real and I still think it is the right problem. The solution in it is not the one that shipped. Current architecture: &lt;strong&gt;&lt;a href="https://www.atlarix.dev/docs" rel="noopener noreferrer"&gt;atlarix.dev/docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;There's a specific frustration every developer using AI coding tools knows.&lt;/p&gt;

&lt;p&gt;You open a project you've been on for months. You ask the AI something reasonable — "how does our auth flow connect to the user service?" — and it either makes something up, asks you to paste files, or tells you it doesn't have access to your codebase.&lt;/p&gt;

&lt;p&gt;So you paste the files. You explain the structure. You give it context. It helps. You close the laptop.&lt;/p&gt;

&lt;p&gt;Next session: same thing. From scratch. Every time.&lt;/p&gt;

&lt;p&gt;That's what pushed me to build &lt;a href="https://atlarix.dev" rel="noopener noreferrer"&gt;Atlarix&lt;/a&gt;. Not to make another AI chat interface, but to fix this specific problem — the AI having no real, persistent understanding of your project.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Root Issue: Code Isn't a List of Files
&lt;/h2&gt;

&lt;p&gt;Every tool that tries to "understand your codebase" by dumping raw files into context is solving the wrong problem.&lt;/p&gt;

&lt;p&gt;Your codebase isn't a flat list of files. It's a graph. Functions call functions. API routes hit services. Services write to databases. Webhooks trigger workers. A class inherits from a base that three other classes also inherit from.&lt;/p&gt;

&lt;p&gt;When a senior engineer who's been on a project for a year answers a question, they're not re-reading files. They're querying a mental graph they've built up. The question I kept asking myself was: what if the AI had that graph too?&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built: Parse Once, Query Forever &lt;em&gt;(removed in v14.9.0)&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Here's what Atlarix actually does when you open a project.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(This described Atlarix v3.x. None of it ships today.)&lt;/em&gt; It ran a parser across your codebase — TypeScript and Python right now, more coming — and extracts every meaningful node: API endpoints, functions, classes, database operations, webhooks, scheduled jobs, third-party calls. Each node gets typed and tagged. Then it builds a graph from those nodes and their relationships, and caches it as a &lt;strong&gt;Blueprint&lt;/strong&gt; at &lt;code&gt;~/.atlarix/blueprints/{projectHash}/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Full parse on most projects: under 30 seconds.&lt;/p&gt;

&lt;p&gt;After that, when you asked the AI something, it didn't scan files. It queried the graph. Finds the relevant nodes. Injects only those into context. We're talking ~5K tokens instead of 100K. A file watcher updates affected nodes on save, so the graph stays current without you doing anything.&lt;/p&gt;

&lt;p&gt;The practical difference:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before: Ask question → AI scans everything → 100K tokens → slow, expensive, confused
After:  Ask question → Query graph → inject relevant nodes → 5K tokens → fast, accurate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was the core of what we called RTE + RAG — Round-Trip Engineering to build the graph, Retrieval-Augmented Generation to query it. &lt;strong&gt;Both were removed in v14.9.0.&lt;/strong&gt; If you have read that Atlarix uses Round-Trip Engineering or a visual Blueprint, this post is where that came from, and it is out of date.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Part I'm Most Proud Of: Project Memory That Actually Persists
&lt;/h2&gt;

&lt;p&gt;The RAG system solves the "understanding" problem. But there's a second problem — remembering &lt;em&gt;decisions&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Why did you choose this database? Why is that service structured that way? What's the rule about how auth tokens are handled?&lt;/p&gt;

&lt;p&gt;Atlarix writes to &lt;code&gt;.atlarix/memory.md&lt;/code&gt; automatically during context compaction (when a conversation gets long). When you start a new session, the AI reads it first. It's just a markdown file — you can edit it manually, version control it, whatever you want.&lt;/p&gt;

&lt;p&gt;There's also &lt;code&gt;.atlarix/spec.md&lt;/code&gt; — a model-created task breakdown the AI generates for complex features. Both are inspired by how Claude Code handles project memory. Simple idea, makes a huge quality-of-life difference in practice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building Visually: The Blueprint Canvas &lt;em&gt;(removed)&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;The graph wasn't just for the AI to query. It was also the foundation of a visual architecture designer. &lt;em&gt;(The canvas, the graph and the generated plan file are all gone.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In Blueprint mode, you get a React Flow canvas. You can design your system visually — drag in containers (Auth API, Worker Service, DB Layer), add beacons inside them (specific routes, functions, handlers), draw edges between them. It looks like an actual system diagram because it's meant to be one.&lt;/p&gt;

&lt;p&gt;The workflow I use for new features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Design the architecture in Blueprint&lt;/li&gt;
&lt;li&gt;Click "Generate Plan" — the AI compares Blueprint (desired) to Live (actual code), generates &lt;code&gt;ATLARIX_PLAN.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;AI implements one task per message, waits for review before the next&lt;/li&gt;
&lt;li&gt;Approve, iterate, ship&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's architecture-first development. Design before you code. The AI implements what you designed, not what it guesses you want.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Agent System (and Why I Separated Permissions from Modes)
&lt;/h2&gt;

&lt;p&gt;One decision I made early that I think was right: separate &lt;em&gt;agent mode&lt;/em&gt; from &lt;em&gt;permission mode&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modes&lt;/strong&gt; are about delegation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct&lt;/strong&gt; — just you and the model, no agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guided&lt;/strong&gt; — orchestrator delegates flat to specialists (Research, Architect, Builder, Reviewer)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autonomous&lt;/strong&gt; — agents can spawn sub-agents for complex multi-step work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Permissions&lt;/strong&gt; are about what the AI can touch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ask&lt;/strong&gt; — read-only tools only&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build&lt;/strong&gt; — can write files and run commands&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are independent. You can run Autonomous mode in Ask permission (agents can plan and research but can't write anything) or Direct mode in Build permission (full write access, no delegation). Mixing them any way you want.&lt;/p&gt;

&lt;p&gt;The reason this matters: a Reviewer shouldn't be writing code. A Research agent shouldn't be executing commands. The separation of concerns in the tool sets prevents the agents from stepping on each other's work.&lt;/p&gt;




&lt;h2&gt;
  
  
  What v3.0 Changed
&lt;/h2&gt;

&lt;p&gt;The big v3.0 changes were less glamorous than the earlier features but genuinely important for daily use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Workspace storage and path resolution were reworked and now just work correctly&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;.atlarix/&lt;/code&gt; folder system is solid — &lt;code&gt;memory.md&lt;/code&gt; and &lt;code&gt;spec.md&lt;/code&gt; reliably persist across sessions&lt;/li&gt;
&lt;li&gt;Relative paths in &lt;code&gt;create_directory&lt;/code&gt; and file tools resolve correctly to the workspace root&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes the most important release is the one that makes the existing stuff reliable.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;A few honest things I'd change if I were starting over:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start with SQLite sooner.&lt;/strong&gt; The Blueprint was JSON-cached, and full ANTLR4 parsing with SQLite persistence was on the roadmap. &lt;em&gt;Neither shipped — the whole index was deleted first, and in hindsight that was the right call rather than a missed one.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fewer providers at launch.&lt;/strong&gt; Supporting 8 cloud providers + AWS Bedrock + Ollama + LM Studio sounds like a feature. In practice, it's a lot of surface area to maintain. I'd have launched with 3 and expanded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The permission UI took longer than expected.&lt;/strong&gt; Getting the approve/reject flow right — where the AI proposes every file change and you see a diff before anything runs — was worth it, but it was the part I most underestimated.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://atlarix.dev" rel="noopener noreferrer"&gt;https://atlarix.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've hit the same wall with AI coding tools — re-explaining your project every session, blowing token budgets on raw context, wishing the AI actually understood your architecture — I'd love to hear if this solves it for you.&lt;/p&gt;

&lt;p&gt;And if you've built something similar or tackled the codebase-as-graph problem differently, genuinely curious how you approached it. Drop it in the comments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where this ended up
&lt;/h2&gt;

&lt;p&gt;Five months after this post, I deleted all of it. The file watcher was holding one&lt;br&gt;
open file descriptor per watched file and hit roughly 12,365 on a large repository,&lt;br&gt;
which broke process spawning outright; the index rebuilds also kept a laptop warm&lt;br&gt;
for no measurable gain over plain search. Atlarix now uses bundled ripgrep and&lt;br&gt;
nothing else — no index, no embeddings, no watcher, constant memory at any repo size.&lt;/p&gt;

&lt;p&gt;I wrote up what that cost and what it taught here: &lt;strong&gt;&lt;a href="https://www.atlarix.dev/blogs" rel="noopener noreferrer"&gt;atlarix.dev/blogs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cursor vs Windsurf vs Atlarix: Which AI Coding Assistant Should You Choose in 2026?</title>
      <dc:creator>Amariah Kamau</dc:creator>
      <pubDate>Tue, 10 Feb 2026 17:41:25 +0000</pubDate>
      <link>https://dev.to/abishaiama/cursor-vs-windsurf-vs-atlarix-which-ai-coding-assistant-should-you-choose-in-2026-50k4</link>
      <guid>https://dev.to/abishaiama/cursor-vs-windsurf-vs-atlarix-which-ai-coding-assistant-should-you-choose-in-2026-50k4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dated — February 2026.&lt;/strong&gt; Two warnings before you use this comparison.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On Atlarix:&lt;/strong&gt; the Blueprint architecture described below was removed in &lt;strong&gt;v14.9.0 (10 July 2026)&lt;/strong&gt;. There is no visual blueprint, no graph and no index; retrieval is bundled ripgrep. The "1 workspace" free tier is also gone — since v14.45.0 no feature is gated by plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On Cursor and Windsurf:&lt;/strong&gt; every claim about them reflects their February 2026 state and has not been re-verified since. Both ship quickly. Check their own documentation before relying on any row in the table.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Cursor vs Windsurf vs Atlarix: Which AI Coding Assistant Should You Choose in 2026?
&lt;/h1&gt;

&lt;p&gt;The AI coding assistant market exploded in 2024-2025. If you're a developer trying to pick between Cursor, Windsurf, and newer alternatives like Atlarix, this comparison breaks down what each tool does best—and where they fall short.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;th&gt;Windsurf&lt;/th&gt;
&lt;th&gt;Atlarix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Core Strength&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chat + autocomplete&lt;/td&gt;
&lt;td&gt;Agentic flows&lt;/td&gt;
&lt;td&gt;Visual architecture + AI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$20/mo&lt;/td&gt;
&lt;td&gt;$10-15/mo&lt;/td&gt;
&lt;td&gt;Free (BYOK) / $19/mo Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IDE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code fork&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Standalone desktop app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architecture View&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌ &lt;em&gt;(Atlarix had visual blueprints when this was written; removed v14.9.0)&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent System&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Advanced&lt;/td&gt;
&lt;td&gt;3-tier (Research/Architect/Builder/Review)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Local Models&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;✅ Full Ollama + LM Studio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-Provider&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OpenAI + Anthropic&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;8+ providers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BYOK Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Bring your own API keys&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Cursor: The Chat-First Powerhouse
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does well:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Excellent autocomplete (Tab to accept)&lt;/li&gt;
&lt;li&gt;@-mentions for codebase context&lt;/li&gt;
&lt;li&gt;Smooth VS Code integration&lt;/li&gt;
&lt;li&gt;Fast inline edits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where it struggles:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No architecture visualization&lt;/li&gt;
&lt;li&gt;Expensive at $20/mo (no BYOK option)&lt;/li&gt;
&lt;li&gt;Limited to OpenAI/Anthropic models&lt;/li&gt;
&lt;li&gt;Can't see the "big picture" of your project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who live in VS Code and want premium autocomplete with AI chat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Windsurf: The Agentic Coder
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does well:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-step agentic workflows ("Cascade" mode)&lt;/li&gt;
&lt;li&gt;Can plan and execute complex tasks&lt;/li&gt;
&lt;li&gt;Lower price point than Cursor&lt;/li&gt;
&lt;li&gt;Good at refactoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where it struggles:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom IDE (learning curve)&lt;/li&gt;
&lt;li&gt;No visual architecture tools&lt;/li&gt;
&lt;li&gt;Limited model choices&lt;/li&gt;
&lt;li&gt;Still scanning your entire codebase each time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers comfortable with a new IDE who want autonomous coding agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Atlarix: The Approval-First Alternative &lt;em&gt;(this section was written when Atlarix was Blueprint-first; it is not any more)&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What makes it different:&lt;/strong&gt;&lt;br&gt;
Atlarix took a fundamentally different approach at the time: you designed your app's architecture visually, and the AI used that blueprint as persistent memory. &lt;strong&gt;That approach was removed in v14.9.0.&lt;/strong&gt; What Atlarix does now is the opposite — purely lexical search with bundled ripgrep, no index and no map, with hunk-level approval before anything is written to disk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Visual Blueprint Mode&lt;/strong&gt; - Design your app structure with rooms (services) and functions (APIs, webhooks, features)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3-Tier Agent System&lt;/strong&gt; - Research agent finds patterns, Architect plans changes, Builder implements, Reviewer checks quality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Generation&lt;/strong&gt; - Generate stub code from blueprints, AI fills in logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent Memory (v2.2)&lt;/strong&gt; - AI "remembers" your architecture across sessions instead of re-scanning&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What it does well:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;See your entire architecture at a glance (Mermaid diagrams)&lt;/li&gt;
&lt;li&gt;BYOK - use your own API keys from 8+ providers&lt;/li&gt;
&lt;li&gt;Full local model support (Ollama, LM Studio)&lt;/li&gt;
&lt;li&gt;Free tier with full features &lt;em&gt;(the "1 workspace" limit is gone — since v14.45.0 no feature is gated by plan, and workspaces are unlimited on every plan)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Works as standalone app (not tied to specific IDE)&lt;/li&gt;
&lt;li&gt;Activity stream shows exactly what agents are doing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where it struggles:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Newer product (smaller community)&lt;/li&gt;
&lt;li&gt;Blueprint system has learning curve&lt;/li&gt;
&lt;li&gt;Not integrated into existing IDE (separate app)&lt;/li&gt;
&lt;li&gt;v2.2 Blueprint Intelligence still in development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers working on complex multi-service architectures who want visual clarity + AI assistance. Also great for privacy-focused devs using local models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use Cursor if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want the smoothest autocomplete experience&lt;/li&gt;
&lt;li&gt;You're happy paying $20/mo&lt;/li&gt;
&lt;li&gt;You primarily use OpenAI/Anthropic models&lt;/li&gt;
&lt;li&gt;You live in VS Code and don't want to switch&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Windsurf if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want autonomous agents to handle multi-step tasks&lt;/li&gt;
&lt;li&gt;You're comfortable learning a new IDE&lt;/li&gt;
&lt;li&gt;You want a middle-ground price point&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Atlarix if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You're building complex apps with multiple services&lt;/li&gt;
&lt;li&gt;You want to see and design architecture visually&lt;/li&gt;
&lt;li&gt;You prefer BYOK or local models (privacy/cost control)&lt;/li&gt;
&lt;li&gt;You like the idea of AI having "persistent memory" of your project structure&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Cost Breakdown
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Monthly cost comparison (assuming 100k tokens/day usage):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor:&lt;/strong&gt; $20/mo (flat rate, no BYOK)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windsurf:&lt;/strong&gt; ~$10-15/mo (varies by plan)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atlarix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free tier: $0 (BYOK - you pay your provider directly)&lt;/li&gt;
&lt;li&gt;With OpenAI API (BYOK): ~$5-10/mo depending on usage&lt;/li&gt;
&lt;li&gt;Pro plan: $19/mo (unlimited workspaces)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're a heavy user with your own API keys, Atlarix can save you significant money.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Take
&lt;/h2&gt;

&lt;p&gt;All three are solid tools. Your choice depends on your workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; = Best in-editor experience, premium price&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windsurf&lt;/strong&gt; = Best autonomous agents, custom IDE&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atlarix&lt;/strong&gt; = Best for architecture-first development, most flexible pricing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd suggest trying all three (they all have free tiers or trials). Personally, I use Atlarix for planning/architecture and Cursor for autocomplete - they complement each other well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try Them Out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cursor:&lt;/strong&gt; cursor.com (2-week trial)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windsurf:&lt;/strong&gt; codeium.com/windsurf (free tier)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atlarix:&lt;/strong&gt; atlarix.dev (free tier with BYOK)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's your experience with these tools? Drop a comment below - I'd love to hear which workflow works best for you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I'm building Atlarix, but I've used Cursor and Windsurf extensively and genuinely respect what they're doing. This comparison is based on real hands-on experience with all three tools.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>coding</category>
    </item>
  </channel>
</rss>
