<?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: ArshTechPro</title>
    <description>The latest articles on DEV Community by ArshTechPro (@arshtechpro).</description>
    <link>https://dev.to/arshtechpro</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%2F3258664%2F7a2cc61a-0b4d-4cf8-884e-52f33905cac3.png</url>
      <title>DEV Community: ArshTechPro</title>
      <link>https://dev.to/arshtechpro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arshtechpro"/>
    <language>en</language>
    <item>
      <title>TokenSpeed: A New LLM Inference Engine Built for Coding Agents.</title>
      <dc:creator>ArshTechPro</dc:creator>
      <pubDate>Thu, 15 Oct 2026 22:42:25 +0000</pubDate>
      <link>https://dev.to/arshtechpro/tokenspeed-a-new-llm-inference-engine-built-for-coding-agents-34jc</link>
      <guid>https://dev.to/arshtechpro/tokenspeed-a-new-llm-inference-engine-built-for-coding-agents-34jc</guid>
      <description>&lt;p&gt;If you self-host large language models, you have probably settled into one of two camps. You use vLLM or SGLang because they are easy to run, or you use TensorRT-LLM because it squeezes the most out of NVIDIA hardware and you are willing to pay for that in setup pain.&lt;/p&gt;

&lt;p&gt;TokenSpeed wants to end that trade-off. It is an open-source (MIT) inference engine from the LightSeek Foundation that targets TensorRT-LLM-level performance with vLLM-level usability, and it is tuned specifically for agentic workloads like coding assistants.&lt;/p&gt;

&lt;p&gt;In this post we will cover what it is, why "agentic" changes the problem, how to get a server running in a few minutes, and whether it deserves a spot in your stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What problem is it solving?
&lt;/h2&gt;

&lt;p&gt;Most inference benchmarks look like chat: a short prompt, a short answer, done. Coding agents look nothing like that.&lt;/p&gt;

&lt;p&gt;A typical agent session has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Very long contexts.&lt;/strong&gt; Prompts regularly pass 50K tokens once you include files, tool output, and history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Many turns.&lt;/strong&gt; The same conversation comes back dozens of times, each time slightly longer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A hard speed floor.&lt;/strong&gt; If tokens stream slowly, the agent feels broken. The TokenSpeed team targets around 70 tokens per second per user as a minimum, sometimes 200+.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the goal is not just "maximum throughput." It is maximum throughput per GPU &lt;em&gt;while every user still gets fast generation&lt;/em&gt;. That framing drives most of TokenSpeed's design choices.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works (the short version)
&lt;/h2&gt;

&lt;p&gt;You do not need to understand the internals to use it, but four pieces are worth knowing about:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Modeling layer.&lt;/strong&gt; Instead of hand-writing tensor-parallel communication code for every model, developers annotate where data should live at module boundaries, and a small static compiler generates the collective operations. Less custom parallelism code means fewer bugs when adding new models.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scheduler.&lt;/strong&gt; The control plane is written in C++ as a finite-state machine. Request lifecycle and KV cache ownership are modeled explicitly, and the type system catches unsafe KV cache reuse at compile time instead of at 3 a.m. in production. The execution side stays in Python so it is still easy to hack on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kernels.&lt;/strong&gt; Kernels live in their own pluggable package with a registry, so NVIDIA and AMD backends can sit side by side. Their MLA (Multi-head Latent Attention) kernel for Blackwell is fast enough that vLLM has adopted it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Entrypoint.&lt;/strong&gt; Requests come in through an OpenAI-compatible server built on their SMG project, keeping CPU-side overhead low.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What you need
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;An NVIDIA GPU host (CUDA 13 for the nightly wheels), or an AMD host with ROCm 7.2&lt;/li&gt;
&lt;li&gt;Python 3.11 to 3.13&lt;/li&gt;
&lt;li&gt;Docker with GPU support if you want the easy path&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Option 1: Docker (recommended)
&lt;/h3&gt;

&lt;p&gt;The project ships a runner image with everything preinstalled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull lightseekorg/tokenspeed-runner:latest

docker run &lt;span class="nt"&gt;-itd&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--shm-size&lt;/span&gt; 32g &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--gpus&lt;/span&gt; all &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--ipc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;host &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; ~/.cache:/home/runner/.cache &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; tokenspeed &lt;span class="se"&gt;\&lt;/span&gt;
  lightseekorg/tokenspeed-runner:latest &lt;span class="se"&gt;\&lt;/span&gt;
  /bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mounting your cache directory means model weights survive container restarts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: pip (nightly wheels)
&lt;/h3&gt;

&lt;p&gt;On a CUDA 13 machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; tokenspeed &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--extra-index-url&lt;/span&gt; https://lightseek.org/whl/nightly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nightlies are versioned by date, so you can pin one for reproducibility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"tokenspeed==0.1.0.post20260930"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--extra-index-url&lt;/span&gt; https://lightseek.org/whl/nightly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AMD users should follow the ROCm instructions in the &lt;a href="https://lightseek.org/tokenspeed/guides/getting-started" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;, since you need to install ROCm PyTorch first and use a separate wheel index.&lt;/p&gt;

&lt;p&gt;Check that everything is in place:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tokenspeed &lt;span class="nb"&gt;env
&lt;/span&gt;tokenspeed serve &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Launch your first model
&lt;/h3&gt;

&lt;p&gt;GPT-OSS 20B fits on a single GPU and is a good smoke test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tokenspeed serve openai/gpt-oss-20b &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--served-model-name&lt;/span&gt; gpt-oss-20b &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tensor-parallel-size&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Call it like OpenAI
&lt;/h3&gt;

&lt;p&gt;Because the server speaks the OpenAI API, your existing client code works with only a &lt;code&gt;base_url&lt;/code&gt; change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EMPTY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8000/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-oss-20b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Explain KV caching in two sentences.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or with curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:8000/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "gpt-oss-20b",
    "messages": [{"role": "user", "content": "Hello!"}],
    "max_tokens": 100
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the whole loop. Anything that already talks to OpenAI, including most agent frameworks, can point at this server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Going bigger
&lt;/h3&gt;

&lt;p&gt;For large MoE models the flags will look familiar if you have used vLLM. Here is the shape of a Kimi K2.5 launch on four Blackwell GPUs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tokenspeed serve nvidia/Kimi-K2.5-NVFP4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--served-model-name&lt;/span&gt; kimi-k2.5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--trust-remote-code&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 262144 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--kv-cache-dtype&lt;/span&gt; fp8 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--quantization&lt;/span&gt; nvfp4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tensor-parallel-size&lt;/span&gt; 4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-expert-parallel&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--reasoning-parser&lt;/span&gt; kimi_k25 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tool-call-parser&lt;/span&gt; kimik2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://lightseek.org/tokenspeed/recipes/models" rel="noopener noreferrer"&gt;model recipes page&lt;/a&gt; has tested launch commands for DeepSeek V4, Qwen3 and Qwen3.8, GLM 5.x, MiniMax M3, Kimi K3, Nemotron-3 Super, and more. Start from a recipe rather than tuning flags from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about performance?
&lt;/h2&gt;

&lt;p&gt;The team's headline numbers, all self-reported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On Kimi K2.5 running on NVIDIA B200 with a real coding-agent trace (SWE-smith, evaluated with EvalScope), TokenSpeed beat TensorRT-LLM across the whole latency/throughput curve. That works out to about 9% faster at batch size 1 and about 11% more throughput at around 100 tokens per second per user.&lt;/li&gt;
&lt;li&gt;Their MLA decode kernel cut latency roughly in half versus TensorRT-LLM's on typical speculative-decoding workloads.&lt;/li&gt;
&lt;li&gt;They reported up to 580 tokens per second on Qwen3.5-397B-A17B for agentic workloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are vendor benchmarks, so treat them as a reason to test, not as a guarantee. The good news is the benchmark harness is in the repo under &lt;code&gt;test/agentic_benchmark&lt;/code&gt;, so you can reproduce it on your own traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is it worth a try?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Yes, if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You serve large MoE models (DeepSeek, Kimi, Qwen, GLM, MiniMax) for coding agents or other long-context, multi-turn workloads.&lt;/li&gt;
&lt;li&gt;You run on recent NVIDIA hardware (Hopper, and especially Blackwell) or AMD MI350-class GPUs, and you care about cost per token.&lt;/li&gt;
&lt;li&gt;You have been eyeing TensorRT-LLM for speed but do not want its build and setup overhead.&lt;/li&gt;
&lt;li&gt;You want day-zero support for new frontier open models. TokenSpeed shipped launch-day support for Kimi K3 and Thinking Machines' Inkling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/lightseekorg/tokenspeed" rel="noopener noreferrer"&gt;lightseekorg/tokenspeed&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>llm</category>
      <category>programming</category>
    </item>
    <item>
      <title>REA: Let Your AI Agent Reverse Engineer the App Features You Wish You Had</title>
      <dc:creator>ArshTechPro</dc:creator>
      <pubDate>Thu, 08 Oct 2026 11:28:11 +0000</pubDate>
      <link>https://dev.to/arshtechpro/rea-let-your-ai-agent-reverse-engineer-the-app-features-you-wish-you-had-3en7</link>
      <guid>https://dev.to/arshtechpro/rea-let-your-ai-agent-reverse-engineer-the-app-features-you-wish-you-had-3en7</guid>
      <description>&lt;p&gt;You are using an app and notice a feature that just works. Instant offline search. A clever sync behavior. A smooth update flow. You want something similar in your own product, but you have no source code, no docs, and no idea where to start.&lt;/p&gt;

&lt;p&gt;Traditionally, the answer was "learn reverse engineering." That means picking a disassembler, learning its API, digging through strings and symbols, following call graphs by hand, and copying findings between tools. It is a deep skill, and most application developers never have the time to pick it up.&lt;/p&gt;

&lt;p&gt;REA takes a different approach: it hands that work to your AI coding agent.&lt;/p&gt;

&lt;p&gt;In this post we will cover what REA is, how it works, how to set it up, and whether it is worth your time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is REA?
&lt;/h2&gt;

&lt;p&gt;REA is an open-source (MIT) tool, written in TypeScript, that gives AI agents a consistent way to investigate software. It ships as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A CLI&lt;/strong&gt; (&lt;code&gt;rea&lt;/code&gt;) you can run from your terminal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An MCP server&lt;/strong&gt; that agents like Claude Code, Cursor, Codex, Gemini CLI, Windsurf, and Claude Desktop can call directly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pitch is simple: point your agent at an app, ask how a feature works, and the agent uses REA to inspect the app, explain the feature with evidence, and then build a version adapted to your stack.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo8qri1jzrdmw14novgbk.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo8qri1jzrdmw14novgbk.png" alt="REA running an analysis inside Hopper" width="799" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The mental model: Decompile, Understand, Recreate
&lt;/h2&gt;

&lt;p&gt;REA frames every investigation in three stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decompile&lt;/strong&gt; - open the app and recover readable code, strings, symbol names, and other clues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understand&lt;/strong&gt; - follow the code from one part of the app to another until the agent can explain how the feature actually works.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recreate&lt;/strong&gt; - turn what was learned into a feature for your own product, in your language and framework.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One thing worth stating up front: REA does not claim to recover the original source code, and it does not clone apps. It gives the agent pseudocode, assembly, symbols, strings, and relationships, and it shows the evidence behind every conclusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a real investigation looks like
&lt;/h2&gt;

&lt;p&gt;Say you ask your agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reverse engineer the Notes app. Find how offline search works, explain it,
and build a version for my project using TypeScript and SQLite.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Behind the scenes, the agent works through roughly these steps using REA tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What the agent does&lt;/th&gt;
&lt;th&gt;Example REA tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Opens and identifies the binary&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;open_binary&lt;/code&gt;, &lt;code&gt;binary_overview&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Looks for search-related clues&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;search_strings&lt;/code&gt;, &lt;code&gt;search_procedures&lt;/code&gt;, &lt;code&gt;list_names&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Connects clues to actual code&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;find_xrefs_to_name&lt;/code&gt;, &lt;code&gt;xrefs&lt;/code&gt;, &lt;code&gt;procedure_callers&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Rebuilds the control flow&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;get_call_graph&lt;/code&gt;, &lt;code&gt;procedure_callees&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Decompiles the important functions&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;procedure_pseudo_code&lt;/code&gt;, &lt;code&gt;batch_decompile&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Writes the feature in your project&lt;/td&gt;
&lt;td&gt;Your agent's normal editing and test tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;REA handles steps 1 through 5. Step 6 is your agent doing what it already does well: writing code.&lt;/p&gt;

&lt;p&gt;If you have done any manual reverse engineering, you will recognize this workflow. The difference is that the agent drives it instead of you.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works under the hood
&lt;/h2&gt;

&lt;p&gt;REA itself is not a disassembler. It is an orchestration layer that sits between your agent and real analysis tools.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent / Terminal
      |
      v
  REA (CLI + MCP server)
      |
      +--&amp;gt; Deep analysis providers: Hopper, Ghidra
      +--&amp;gt; Native macOS utilities (Mach-O, code signatures, plists, Swift demangling)
      +--&amp;gt; Artifact provider (ZIP, APK, IPA, ASAR, MSIX inventory)
      +--&amp;gt; Browser provider (passive Chrome DevTools Protocol observation)
      +--&amp;gt; Process capture provider (controlled terminal sessions)
      |
      v
  Evidence records you can export, compare, and reuse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few design choices stand out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Providers do the heavy lifting.&lt;/strong&gt; Hopper is the main deep-analysis provider, and Ghidra is supported as a read-only, bring-your-own option on Linux (plus an experimental Windows x64 mode).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything produces evidence.&lt;/strong&gt; Each successful result is stored as a structured "Evidence v2" record that includes the provider, confidence, and known limitations. You can export these bundles, import them later, and diff them across app versions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unknowns stay unknown.&lt;/strong&gt; REA is strict about not presenting guesses as facts. Static inference and runtime observation are labeled separately, and incomplete data is reported as incomplete.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local by design.&lt;/strong&gt; There is no hosted analysis service. The app you analyze stays on your machine (though your AI model provider still has its own data policy).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same engine for CLI and MCP.&lt;/strong&gt; Whatever your agent can do, you can also do from the terminal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it can analyze today
&lt;/h2&gt;

&lt;p&gt;Native binaries get the deepest support, but REA covers more than that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native apps&lt;/strong&gt;: Mach-O, ELF, PE, and macOS &lt;code&gt;.app&lt;/code&gt; bundles, including Swift and Objective-C metadata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Packages and archives&lt;/strong&gt;: ZIP, APK, IPA, ASAR, plus file-level inventory without extraction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Electron and JavaScript apps&lt;/strong&gt;: static mapping of entry points, modules, IPC channels, preload scripts, and source maps, without executing anything&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Websites&lt;/strong&gt;: passive observation of a browser you already control, over a local Chrome DevTools endpoint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;.NET (managed PE/CLI)&lt;/strong&gt;: execution-free triage of metadata, members, and native boundaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version diffs&lt;/strong&gt;: compare two releases of an app and get a report of what changed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;macOS 12+, or Ubuntu 24.04+, Fedora 41+, or 64-bit Arch Linux (Windows x64 is experimental and Ghidra-only)&lt;/li&gt;
&lt;li&gt;Node.js 22.19+ or 24.11+&lt;/li&gt;
&lt;li&gt;A deep-analysis provider: Hopper (setup can install it, and the free demo mode works) or your own Ghidra 12.1.2 with JDK 21&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Install and run setup
&lt;/h3&gt;

&lt;p&gt;The quickest path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;--yes&lt;/span&gt; rea-agents@latest setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or install the CLI globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--global&lt;/span&gt; rea-agents
rea setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup is careful. It detects which agents you have installed, asks which capabilities you want, shows the exact files it will change, and defaults to "No" before applying anything. Use &lt;code&gt;rea setup --dry-run&lt;/code&gt; if you want to preview the plan first.&lt;/p&gt;

&lt;p&gt;When setup finishes, restart your agent so it picks up the new MCP server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check your environment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rea doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells you whether something is missing, misconfigured, or unsupported on your machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try it from the terminal
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rea analyze /Applications/Notes.app
rea search /Applications/Notes.app &lt;span class="s2"&gt;"offline"&lt;/span&gt;
rea trace /Applications/Notes.app &lt;span class="s2"&gt;"offline"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Or just ask your agent
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Understand how search works in the Notes app, show me the evidence,
and build a similar feature for my project.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Manual MCP configuration
&lt;/h3&gt;

&lt;p&gt;If your agent supports local MCP servers but is not auto-detected, add this to its config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rea"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rea-agents@3.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pin to the latest published version from &lt;a href="https://www.npmjs.com/package/rea-agents" rel="noopener noreferrer"&gt;npm&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safety and permissions
&lt;/h2&gt;

&lt;p&gt;Reverse-engineering tools can be risky if they run code you do not trust. REA leans heavily toward caution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dynamic features (process capture, browser observation, runtime inspection) are &lt;strong&gt;disabled by default&lt;/strong&gt; and need explicit environment variables plus per-call approval.&lt;/li&gt;
&lt;li&gt;File-based evidence commands only work inside directories you approve, using variables like &lt;code&gt;REA_EVIDENCE_ROOTS_JSON&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Static JavaScript analysis parses code without running it.&lt;/li&gt;
&lt;li&gt;REA never calls &lt;code&gt;sudo&lt;/code&gt;, and it uses authenticated local sockets for provider communication.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The flip side: providers and launched targets still run with your user permissions. REA is not a security sandbox, so do not treat it as one when handling malware.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is it worth a try?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Yes, if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are on macOS or Linux and already use an MCP-capable agent like Claude Code or Cursor.&lt;/li&gt;
&lt;li&gt;You want to understand how a feature works in an app you use, especially a native or Electron app.&lt;/li&gt;
&lt;li&gt;You are curious about reverse engineering but never had time to learn Hopper or Ghidra.&lt;/li&gt;
&lt;li&gt;You need to document an undocumented file format, protocol, or interface for interoperability.&lt;/li&gt;
&lt;li&gt;You maintain software and want to diff behavior across versions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Maybe hold off if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are on Windows. Support there is experimental and limited.&lt;/li&gt;
&lt;li&gt;You want a quick, zero-config tool. REA has a lot of opt-in switches and environment variables, which is good for safety but takes time to learn.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A few practical notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hopper is separate commercial software. The demo mode works, but has vendor-defined limits.&lt;/li&gt;
&lt;li&gt;Deep investigations can use a lot of agent tokens, so watch your model costs.&lt;/li&gt;
&lt;li&gt;Respect the law and the software license. Reverse engineering for learning and interoperability is common, but some license agreements and jurisdictions restrict it. Recreate ideas and behavior, not copyrighted code or assets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;REA turns reverse engineering from a specialist skill into something you can delegate to your coding agent. You describe the feature, the agent investigates the app, shows you how it reached its conclusions, and then helps you build your own version.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/morluto/rea" rel="noopener noreferrer"&gt;github.com/morluto/rea&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>reverseengineering</category>
      <category>ai</category>
      <category>mcp</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Trying e2e: Write End-to-End Tests with Plain English and Real Assertions</title>
      <dc:creator>ArshTechPro</dc:creator>
      <pubDate>Tue, 06 Oct 2026 13:27:49 +0000</pubDate>
      <link>https://dev.to/arshtechpro/trying-e2e-write-end-to-end-tests-with-plain-english-and-real-assertions-2p7i</link>
      <guid>https://dev.to/arshtechpro/trying-e2e-write-end-to-end-tests-with-plain-english-and-real-assertions-2p7i</guid>
      <description>&lt;p&gt;End-to-end tests are valuable and painful in equal measure. Selectors break when someone renames a class. Mobile tests need their own tooling. A flow that takes one sentence to describe takes fifty lines to script.&lt;/p&gt;

&lt;p&gt;e2e is an open source framework that tries to fix this by mixing two styles in one test: plain-English steps run by an agent, and normal locators and assertions you already know. Here is what it does and whether it deserves a spot in your stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is e2e?
&lt;/h2&gt;

&lt;p&gt;e2e is an end-to-end testing framework for web and mobile apps. You describe a goal in natural language, and an agent interacts with the app to complete it. When you need exact checks, you use regular locators and assertions in the same test.&lt;/p&gt;

&lt;p&gt;It is built by the TesterArmy team and released under the Apache-2.0 license.&lt;/p&gt;

&lt;h2&gt;
  
  
  A first look
&lt;/h2&gt;

&lt;p&gt;This is what a test looks like:&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="c1"&gt;// tests/checkout.e2e.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="p"&gt;}&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;e2e&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a member upgrades to Pro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;screen&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/settings/billing&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;act&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;upgrade the workspace to the Pro plan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;the invoice preview shows a prorated amount&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toContainText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are three kinds of steps here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;app.open&lt;/code&gt; navigates to a page.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;agent.act&lt;/code&gt; and &lt;code&gt;agent.assert&lt;/code&gt; take plain-English instructions and checks.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;expect(screen.getByRole(...))&lt;/code&gt; is a precise, deterministic assertion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent handles the part that is tedious to script, such as clicking through a billing flow. Your own assertion verifies the result. The test reads like a description of the feature, and you still get an exact check at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;Setup is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx e2e init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From there, the docs at &lt;a href="https://e2e.tester.army/docs" rel="noopener noreferrer"&gt;e2e.tester.army/docs&lt;/a&gt; cover the quickstart, writing tests, mobile, and the full reference. The &lt;code&gt;e2e&lt;/code&gt; package also ships every docs page in &lt;code&gt;node_modules/e2e/docs&lt;/code&gt;, so coding agents can read them offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that matters: replay
&lt;/h2&gt;

&lt;p&gt;The obvious worry with AI-driven tests is cost and flakiness. Calling a model on every run is slow and expensive, and results can vary.&lt;/p&gt;

&lt;p&gt;e2e's answer is replay. According to the README, when an agent step is verified by a later assertion, the framework records the actions it took. The next run replays them with no model calls, until the app changes. Tests without agent steps need no model at all.&lt;/p&gt;

&lt;p&gt;In practice this means you pay for the model when a flow is new or has changed, not on every CI run. You can also bring your own subscription, API key, or local model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Packages
&lt;/h2&gt;

&lt;p&gt;e2e is split into small packages, so you only install what you need:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;e2e&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SDK, runner, and CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@e2e-dev/web&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Browser engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@e2e-dev/mobile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;iOS and Android engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@e2e-dev/github&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pull request comment reporter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@e2e-dev/kernel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hosted browsers for the web engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@e2e-dev/eas&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hosted iOS simulators and Android emulators&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you are coming from another tool, the docs include migration guides for Playwright, Cypress, Selenium, Detox, and Maestro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is it worth trying?
&lt;/h2&gt;

&lt;p&gt;It is a good fit if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have a critical flow (checkout, onboarding, billing) that is expensive to script and easy to break.&lt;/li&gt;
&lt;li&gt;You test mobile and want something simpler than a separate toolchain.&lt;/li&gt;
&lt;li&gt;You like the idea of readable tests but still want exact assertions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Be aware of a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The project is young, so expect rough edges and changes. Start with one or two flows rather than migrating a whole suite.&lt;/li&gt;
&lt;li&gt;It comes from a company that also sells a testing platform. The framework is open source, but keep that context in mind.&lt;/li&gt;
&lt;li&gt;Agent steps depend on a model, so check how replay behaves on your own app before trusting it in CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;e2e is a practical take on AI in testing: use the agent for the tedious parts, use real assertions for the checks that matter, and replay recorded runs so you are not paying for a model on every build.&lt;/p&gt;

&lt;p&gt;Try it on one flow this week. If it saves you from maintaining a brittle script, expand from there.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/tester-army/e2e" rel="noopener noreferrer"&gt;github.com/tester-army/e2e&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
      <category>testing</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Caveman: Make Your AI Coding Agent Talk Less (and Save Tokens)</title>
      <dc:creator>ArshTechPro</dc:creator>
      <pubDate>Fri, 02 Oct 2026 14:22:14 +0000</pubDate>
      <link>https://dev.to/arshtechpro/caveman-make-your-ai-coding-agent-talk-less-and-save-tokens-4moi</link>
      <guid>https://dev.to/arshtechpro/caveman-make-your-ai-coding-agent-talk-less-and-save-tokens-4moi</guid>
      <description>&lt;p&gt;If you use an AI coding agent every day, you have probably noticed how much of its output is padding. Phrases like "The reason this is happening is likely because..." or "I'd recommend that you consider..." appear before the useful part of the answer. You pay for those tokens, and you spend time reading them.&lt;/p&gt;

&lt;p&gt;Caveman is an open source project that fixes this. Its tagline is "why use many token when few do trick", and it does what it says: your agent answers in short, blunt sentences without the filler.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Here is the example from the README. The question is why a React component keeps re-rendering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Normal agent (69 tokens):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The reason your React component is re-rendering is likely because you're creating a new object reference on each render cycle. When you pass an inline object as a prop, React's shallow comparison sees it as a different object every time, which triggers a re-render. I'd recommend using useMemo to memoize the object.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Caveman agent (19 tokens):&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;New object ref each render. Inline object prop = new ref = re-render. Wrap in &lt;code&gt;useMemo&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The diagnosis and the fix are the same. Only the throat-clearing is gone.&lt;/p&gt;

&lt;p&gt;Code, commands, file paths, and exact error messages are never rewritten. Only the prose around them gets shortened, so the answers stay accurate and copy-pasteable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install in one command
&lt;/h2&gt;

&lt;p&gt;The simplest version is a skill, which is a rule file your agent loads:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add JuliusBrussee/caveman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works with 30+ agents, including Claude Code, Codex, Gemini CLI, Cursor, Windsurf, Cline, and Copilot. If your agent does not pick it up automatically, type &lt;code&gt;/caveman&lt;/code&gt; in the chat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intensity levels and commands
&lt;/h2&gt;

&lt;p&gt;You control how terse the agent gets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/caveman lite
/caveman full
/caveman ultra
/caveman off
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The skill also adds a few useful commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/caveman-commit&lt;/code&gt; writes short Conventional Commit messages.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/caveman-review&lt;/code&gt; gives one-line, actionable code review comments.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/caveman-compress &amp;lt;file&amp;gt;&lt;/code&gt; shrinks Markdown memory files and keeps a backup of the original.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/caveman-stats&lt;/code&gt; shows local token usage and estimated savings in Claude Code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;The author ran ten ordinary coding prompts through the Claude API, with and without the skill. Output tokens dropped by 65% on average. The range is wide, though:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Normal&lt;/th&gt;
&lt;th&gt;Caveman&lt;/th&gt;
&lt;th&gt;Saved&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Implement React error boundary&lt;/td&gt;
&lt;td&gt;3454&lt;/td&gt;
&lt;td&gt;456&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set up PostgreSQL connection pool&lt;/td&gt;
&lt;td&gt;2347&lt;/td&gt;
&lt;td&gt;380&lt;/td&gt;
&lt;td&gt;84%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Explain git rebase vs merge&lt;/td&gt;
&lt;td&gt;702&lt;/td&gt;
&lt;td&gt;292&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refactor callback to async/await&lt;/td&gt;
&lt;td&gt;387&lt;/td&gt;
&lt;td&gt;301&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern is simple. When the agent would have written an essay, you save a lot. When the answer was mostly code, you save very little.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read this before quoting the 65%
&lt;/h2&gt;

&lt;p&gt;The project is unusually honest about its limits, and you should be too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The skill only shortens &lt;strong&gt;output&lt;/strong&gt;. Input and reasoning tokens do not change.&lt;/li&gt;
&lt;li&gt;The skill's own rules add roughly 1 to 1.5k input tokens on every turn.&lt;/li&gt;
&lt;li&gt;Whole-session savings will be lower than the benchmark table, and on work that was already terse you can end up paying more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The README says speed and readability are the real product, and the discount is a bonus. Measure your own setup before promising anyone a 65% cut on the bill.&lt;/p&gt;

&lt;h2&gt;
  
  
  The optional proxy
&lt;/h2&gt;

&lt;p&gt;There is also a second, bigger piece: a local proxy that sits between your agent and the AI provider. It shrinks what the agent reads, such as logs, diffs, and test output, before each call, and it keeps a backup of every original on your machine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @caveman-ai/cli &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; caveman setup &lt;span class="nt"&gt;--install&lt;/span&gt;
caveman claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a 54-run Claude Code benchmark, total input tokens dropped by about 33%. One case, an HTML dashboard, actually got 9.9% worse, and the README leaves that row in the table. It is a bigger commitment than the skill, so start with the skill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things to know before you install
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Telemetry:&lt;/strong&gt; the &lt;code&gt;caveman&lt;/code&gt; CLI sends anonymous usage stats by default (commands run and token counts, never prompts or code). Turn it off with &lt;code&gt;caveman telemetry off&lt;/code&gt; or &lt;code&gt;DO_NOT_TRACK=1&lt;/code&gt;. The skill itself runs entirely on your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Licensing:&lt;/strong&gt; the skill and CLI are MIT. The engine and proxy are BSL-1.1, which is source-available but not OSI open source. Self-hosting for your own use is fine.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Is it worth trying?
&lt;/h2&gt;

&lt;p&gt;Yes, with realistic expectations. The skill is a one-line install, easy to turn off, and does not touch your code. If your agent is wordy, you get faster, easier-to-scan answers right away. Treat any token savings as a bonus and check them with &lt;code&gt;/caveman-stats&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/JuliusBrussee/caveman" rel="noopener noreferrer"&gt;github.com/JuliusBrussee/caveman&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>llm</category>
      <category>agents</category>
    </item>
    <item>
      <title>Impeccable: Stop Your AI Coding Agent From Building the Same Ugly UI</title>
      <dc:creator>ArshTechPro</dc:creator>
      <pubDate>Fri, 02 Oct 2026 06:45:50 +0000</pubDate>
      <link>https://dev.to/arshtechpro/impeccable-stop-your-ai-coding-agent-from-building-the-same-ugly-ui-2pg4</link>
      <guid>https://dev.to/arshtechpro/impeccable-stop-your-ai-coding-agent-from-building-the-same-ugly-ui-2pg4</guid>
      <description>&lt;p&gt;Impeccable is a design skill for AI coding agents. It started from Anthropic's frontend-design skill and extends it with three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A single setup step.&lt;/strong&gt; &lt;code&gt;/impeccable init&lt;/code&gt; inspects your project and writes a &lt;code&gt;PRODUCT.md&lt;/code&gt; file with your audience, purpose, constraints, and voice. Later commands use it as context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;24 commands&lt;/strong&gt; that give you and the agent a shared design vocabulary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;61 deterministic detector rules&lt;/strong&gt; that flag common AI design mistakes. They run without an LLM or an API key.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works with Claude Code, Cursor, Codex CLI, Gemini CLI, GitHub Copilot, and a long list of other tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install in two commands
&lt;/h2&gt;

&lt;p&gt;From your project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx impeccable &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installer detects which AI tools you use and asks whether to install for the project or globally. Reload your tool, then run:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;If you use Claude Code, you can also install it as a plugin with &lt;code&gt;/plugin marketplace add pbakaus/impeccable&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The commands worth knowing
&lt;/h2&gt;

&lt;p&gt;You do not need all 24. These cover most daily use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/impeccable craft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Plan, then build a new surface with visual iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/impeccable critique&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;UX review of hierarchy, clarity, and tone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/impeccable audit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Technical checks for accessibility, performance, and responsiveness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/impeccable polish&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Final pass before shipping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/impeccable distill&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Strip a design down to what matters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/impeccable harden&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Error states, text overflow, i18n, edge cases&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each command takes a target, so you stay in control of scope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/impeccable audit the header
/impeccable polish the checkout form
/impeccable harden checkout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also describe what you want in plain language, for example &lt;code&gt;/impeccable redo this hero section&lt;/code&gt;. If you use one command a lot, &lt;code&gt;/impeccable pin audit&lt;/code&gt; turns it into a standalone &lt;code&gt;/audit&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that works without AI: the detector
&lt;/h2&gt;

&lt;p&gt;This is the feature I would try first. The CLI can scan your code, or a live URL, for design problems with no model involved:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx impeccable detect src/
npx impeccable detect https://example.com
npx impeccable detect &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It catches things like purple gradients, bounce easing, tiny touch targets, skipped headings, and cramped padding. The &lt;code&gt;--json&lt;/code&gt; flag and exit codes make it easy to add to CI. Because the rules are deterministic, the results are repeatable, which is hard to get from asking an AI to review the design.&lt;/p&gt;

&lt;p&gt;The README is honest about the limits too: a clean run is evidence, not proof, and it does not replace looking at the page on real viewports.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design hook
&lt;/h2&gt;

&lt;p&gt;On Claude Code, Cursor, Codex, GitHub Copilot, and Grok Build, the installer can add a hook that runs the detector whenever the agent edits a UI file. The agent sees the findings and can fix them in the same session. On Cursor it can block a bad write before it lands. This catches problems while the code is being written, instead of in review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things to check before adopting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hooks run on their own.&lt;/strong&gt; In Claude Code, installed hooks run independently of tool approval, and the first run may download a binary into &lt;code&gt;~/.impeccable/bin/&lt;/code&gt;. Review the hook before using it in unattended runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live mode is for local development only.&lt;/strong&gt; Do not inject it into a deployed production site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ignore the right files.&lt;/strong&gt; The repo provides a &lt;code&gt;.gitignore&lt;/code&gt; block for the &lt;code&gt;.impeccable/&lt;/code&gt; folder, so screenshots and caches do not get committed. Keep the shared config and design files tracked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opinionated by design.&lt;/strong&gt; It discourages fonts like Inter and Arial and warns against nested cards. If your brand uses Inter, you can add an ignore rule with a reason:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx impeccable ignores add-value overused-font Inter &lt;span class="nt"&gt;--reason&lt;/span&gt; &lt;span class="s2"&gt;"Brand font"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Is it worth trying?
&lt;/h2&gt;

&lt;p&gt;Yes, for most developers who build UI with AI tools. The setup takes a couple of minutes, nothing locks you in, and you can try the detector alone without letting an AI touch your code.&lt;/p&gt;

&lt;p&gt;It is most useful if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ship side projects or MVPs and do not have a designer&lt;/li&gt;
&lt;li&gt;are tired of every AI-generated page looking the same&lt;/li&gt;
&lt;li&gt;want automated design checks in CI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/pbakaus/impeccable" rel="noopener noreferrer"&gt;github.com/pbakaus/impeccable&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
      <category>frontend</category>
    </item>
    <item>
      <title>NVIDIA OpenShell Explained: A Safer Runtime for AI Agents</title>
      <dc:creator>ArshTechPro</dc:creator>
      <pubDate>Wed, 30 Sep 2026 11:53:47 +0000</pubDate>
      <link>https://dev.to/arshtechpro/nvidia-openshell-explained-a-safer-runtime-for-ai-agents-3kcn</link>
      <guid>https://dev.to/arshtechpro/nvidia-openshell-explained-a-safer-runtime-for-ai-agents-3kcn</guid>
      <description>&lt;p&gt;AI agents are getting genuinely useful. They can read your files, install packages, call APIs, and run shell commands. That is exactly what makes them risky.&lt;/p&gt;

&lt;p&gt;If you have ever pasted an API key into an agent's environment and then held your breath while it ran, this article is for you. NVIDIA has an open source project called &lt;strong&gt;OpenShell&lt;/strong&gt; that tries to solve this problem. Let's look at what it is, how it works, and whether it is worth your time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem in one paragraph
&lt;/h2&gt;

&lt;p&gt;An agent is only useful if it can do things. But every capability you give it is also a capability that can go wrong: a prompt injection in a web page, a hallucinated &lt;code&gt;rm -rf&lt;/code&gt;, a dependency that phones home, or a leaked token in a log. Most of us handle this today by running the agent in a Docker container and hoping for the best. That helps, but a container by default does not know the difference between "download a package from PyPI" and "send your credentials to a random server."&lt;/p&gt;

&lt;h2&gt;
  
  
  What OpenShell is
&lt;/h2&gt;

&lt;p&gt;According to the project, OpenShell is "the safe, private runtime for autonomous AI agents." In practical terms, it is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;CLI&lt;/strong&gt; you use to create and manage sandboxes.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;gateway&lt;/strong&gt; that acts as the control plane for sandboxes, policies, and access.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;sandbox&lt;/strong&gt; where the agent actually runs, isolated from your host.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;policy system&lt;/strong&gt; where you declare what the agent can access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You write the rules. OpenShell enforces them. The agent does not get to negotiate.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The README describes two main ideas.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Enforcement at the kernel level
&lt;/h3&gt;

&lt;p&gt;Each agent runs in its own isolated sandbox. Kernel-level controls restrict which files the agent can open and which system calls it can make. Every network connection goes through a policy check before it leaves the sandbox.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Formally verified policy changes
&lt;/h3&gt;

&lt;p&gt;Agents often need new access as they work. Maybe your agent suddenly wants to reach a new host. Normally you would either approve everything (unsafe) or approve each request by hand (exhausting).&lt;/p&gt;

&lt;h2&gt;
  
  
  A mental model that helps
&lt;/h2&gt;

&lt;p&gt;Think of it like a building with a security desk.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;sandbox&lt;/strong&gt; is the room the agent works in.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;policy&lt;/strong&gt; is the visitor list and the set of doors the agent's badge opens.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;provider&lt;/strong&gt; is a mail clerk who attaches the real stamp (your credential) to an approved letter, so the agent never holds the stamp itself.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;gateway&lt;/strong&gt; is the security office that manages all of it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;Requirements from the README: Linux, macOS on Apple Silicon, or Windows with WSL 2 (marked experimental). You also need Docker, Podman, or host virtualization.&lt;/p&gt;

&lt;p&gt;Install and create a sandbox:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-LsSf&lt;/span&gt; https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | sh
openshell sandbox create &lt;span class="nt"&gt;--name&lt;/span&gt; demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installer sets up the CLI and a local gateway. The default sandbox image is a minimal Ubuntu with no agent installed, so you are starting with a clean, locked-down box.&lt;/p&gt;

&lt;p&gt;As always with a &lt;code&gt;curl | sh&lt;/code&gt; installer, read the script before running it on a machine you care about.&lt;/p&gt;

&lt;p&gt;To run a real agent, the docs have a "Run Your First Agent" walkthrough. It runs OpenCode against a free OpenRouter model and shows how to approve new access as the agent asks for it. That walkthrough is the best way to see the policy loop in action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Talking to it from code
&lt;/h2&gt;

&lt;p&gt;If you want to integrate OpenShell into your own application, there are SDKs that connect to a gateway:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Install&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uv add openshell&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install @nvidia/openshell-sdk&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;&lt;code&gt;go get github.com/NVIDIA/OpenShell/sdk/go@latest&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cargo add openshell-sdk --git ... --tag &amp;lt;release-tag&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note that the SDKs do not install the CLI. You still need a gateway running, and the project recommends using the same release for both.&lt;/p&gt;

&lt;p&gt;There is also a set of "agent skills" you can install so your coding agent learns how to drive the OpenShell CLI and write policies for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add NVIDIA/OpenShell
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Other things worth knowing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes support.&lt;/strong&gt; You can deploy the gateway with Helm. Your CNI must enforce &lt;code&gt;NetworkPolicy&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensibility.&lt;/strong&gt; The docs mention middleware, interceptors, and compute drivers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPU support.&lt;/strong&gt; The sandbox docs cover GPUs, which matters if your agents run local models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License.&lt;/strong&gt; Apache 2.0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telemetry.&lt;/strong&gt; Anonymous telemetry is on by default and limited to operational categories and counts. The README says it does not collect prompts, file paths, credentials, or model names. You can turn it off with &lt;code&gt;OPENSHELL_TELEMETRY_ENABLED=false&lt;/code&gt; on the gateway.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reasons to try it
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;It targets a real problem.&lt;/strong&gt; Credential leakage and over-permissioned agents are the most common ways agent setups go wrong. Keeping real secrets out of the agent's reach is a strong design choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Policy as configuration.&lt;/strong&gt; Being able to declare "this agent can read this folder and call these two APIs" and have it enforced is far better than relying on prompt instructions like "please do not touch anything else."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good signs of a serious project.&lt;/strong&gt; The repository has around 10k stars, 1.4k forks, and over 1,500 commits. It ships SDKs in four languages, has an RFC process, a governance document, and a security policy. This is not a weekend demo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It comes from NVIDIA.&lt;/strong&gt; That is not a guarantee of quality, but it does suggest ongoing investment and attention to GPU-heavy agent workloads.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you are...&lt;/th&gt;
&lt;th&gt;Should you try it?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Running autonomous agents with real credentials or access to sensitive data&lt;/td&gt;
&lt;td&gt;Yes. This is the target use case.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Building an agent platform or internal tooling for a team&lt;/td&gt;
&lt;td&gt;Yes. The policy and gateway model fits well.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Experimenting with agents on your laptop, mostly for fun&lt;/td&gt;
&lt;td&gt;Maybe. A plain container may be enough for now.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Building a simple chatbot with no tool access&lt;/td&gt;
&lt;td&gt;No. You do not need it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Needing production stability today with no tolerance for change&lt;/td&gt;
&lt;td&gt;Wait a bit. Watch the releases and let it mature.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;My short answer: &lt;strong&gt;yes, it is worth an afternoon of your time&lt;/strong&gt;, especially if you are giving agents access to anything you would be upset to lose. Follow the "Run Your First Agent" guide, watch how the policy approvals work, and then decide whether the extra structure pays for itself in your setup. Just go in knowing it is a young project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repository: &lt;a href="https://github.com/NVIDIA/OpenShell" rel="noopener noreferrer"&gt;github.com/NVIDIA/OpenShell&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>Goodbye pbxproj: A Friendly Guide to Xcode 27.2's New JSON Project Format</title>
      <dc:creator>ArshTechPro</dc:creator>
      <pubDate>Thu, 24 Sep 2026 16:08:54 +0000</pubDate>
      <link>https://dev.to/arshtechpro/goodbye-pbxproj-a-friendly-guide-to-xcode-272s-new-json-project-format-bhh</link>
      <guid>https://dev.to/arshtechpro/goodbye-pbxproj-a-friendly-guide-to-xcode-272s-new-json-project-format-bhh</guid>
      <description>&lt;p&gt;If you've built iOS apps on a team, you know this moment. You pull &lt;code&gt;main&lt;/code&gt;, Git says &lt;code&gt;CONFLICT (content): Merge conflict in project.pbxproj&lt;/code&gt;, and you open a wall of 24-character hex IDs.&lt;/p&gt;

&lt;p&gt;Xcode 27.2 finally changes that. Here's what's new, explained without jargon.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Xcode 27.2 replaces the old &lt;code&gt;project.pbxproj&lt;/code&gt; property list with a new JSON-based &lt;code&gt;project.xcproj&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;New projects use the new format by default. Existing projects are not converted automatically, and both formats work side by side.&lt;/li&gt;
&lt;li&gt;Xcode 27.0 and 27.2 can both open a JSON project. Xcode 26 cannot.&lt;/li&gt;
&lt;li&gt;Diffs get smaller, merge conflicts become rare, and you can read the file without special knowledge.&lt;/li&gt;
&lt;li&gt;Check your tools (CocoaPods, fastlane, scripts) before you switch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  First, what is an &lt;code&gt;.xcodeproj&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;MyApp.xcodeproj&lt;/code&gt; looks like a file, but it is a folder. Right-click it and choose &lt;strong&gt;Show Package Contents&lt;/strong&gt; to see what's inside:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MyApp.xcodeproj/
├── project.pbxproj      &amp;lt;- the old project description
├── project.xcworkspace/
├── xcshareddata/        &amp;lt;- shared schemes, Package.resolved
└── xcuserdata/          &amp;lt;- your personal UI state
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only one file changes in 27.2. &lt;code&gt;project.xcproj&lt;/code&gt; replaces &lt;code&gt;project.pbxproj&lt;/code&gt;. Nothing else in the bundle changes, so schemes, &lt;code&gt;Package.resolved&lt;/code&gt;, and &lt;code&gt;xcuserdata&lt;/code&gt; stay the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the old format hurt
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;project.pbxproj&lt;/code&gt; uses an old NeXTSTEP-era plist syntax. It stores your project as one large flat list of objects, and every object points to the others by random hex IDs.&lt;/p&gt;

&lt;p&gt;To add a single Swift file, Xcode has to write it in &lt;strong&gt;four&lt;/strong&gt; places:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;code&gt;PBXFileReference&lt;/code&gt; so the file exists&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;PBXBuildFile&lt;/code&gt; so it gets compiled&lt;/li&gt;
&lt;li&gt;An entry in a &lt;code&gt;PBXGroup&lt;/code&gt; so it shows in the navigator&lt;/li&gt;
&lt;li&gt;An entry in the &lt;code&gt;PBXSourcesBuildPhase&lt;/code&gt; so it reaches the target&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Xcode generates both IDs fresh, so a teammate who adds a different file on their branch writes different IDs into the same four places. That's where the classic merge conflict comes from.&lt;/p&gt;

&lt;p&gt;Build settings had the same problem. Each configuration (Debug, Release) kept its own full copy of the settings, so changing the deployment target meant editing two places.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the new file looks like
&lt;/h2&gt;

&lt;p&gt;Here's a small example app in the new format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"default-configuration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Debug"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"configurations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Debug"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Release"&lt;/span&gt;&lt;span class="p"&gt;,],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"files"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"group"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sources"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WeatherApp.swift"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"target-membership"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Weather/compile-sources"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ForecastView.swift"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"target-membership"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Weather/compile-sources"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"targets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Weather"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"product-type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"application"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"build-phases"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"compile-sources"&lt;/span&gt;&lt;span class="p"&gt;,],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"build-settings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"PRODUCT_BUNDLE_IDENTIFIER"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"com.example.weather"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"SWIFT_VERSION"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build-settings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"IPHONEOS_DEPLOYMENT_TARGET"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"27.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SWIFT_OPTIMIZATION_LEVEL[config=Debug]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-Onone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SWIFT_OPTIMIZATION_LEVEL[config=Release]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-O"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can probably read it without any explanation. Let's go through the three main ideas.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. It's a tree, not a flat list
&lt;/h3&gt;

&lt;p&gt;The file follows the structure you see in Xcode's UI. Instead of one big &lt;code&gt;objects&lt;/code&gt; table, it is split into sections like &lt;code&gt;files&lt;/code&gt;, &lt;code&gt;targets&lt;/code&gt;, and &lt;code&gt;build-settings&lt;/code&gt;, so a diff looks like what you actually did in the interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Files say which target they belong to
&lt;/h3&gt;

&lt;p&gt;This is the most important change. In the old format, the target kept a list of its files. In the new format, each file lists its targets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ForecastView.swift"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"target-membership"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Weather/compile-sources"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read &lt;code&gt;Weather/compile-sources&lt;/code&gt; as "compile this file in the Weather target." It combines the target name with the build phase, and no UUID is involved. Adding a file is now &lt;strong&gt;one line&lt;/strong&gt; in &lt;strong&gt;one place&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you need more detail, the entry becomes an object. For example, marking a header as public is done right there on the file, instead of inside &lt;code&gt;PBXBuildFile.settings.ATTRIBUTES&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Build settings are written once
&lt;/h3&gt;

&lt;p&gt;A setting that's the same in every configuration now appears once. When Debug and Release differ, the key carries a condition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"SWIFT_OPTIMIZATION_LEVEL[config=Debug]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-Onone"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"SWIFT_OPTIMIZATION_LEVEL[config=Release]"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-O"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you've used &lt;code&gt;.xcconfig&lt;/code&gt; files, this &lt;code&gt;[config=...]&lt;/code&gt; syntax will look familiar. In one real migration, 161 lines of &lt;code&gt;XCBuildConfiguration&lt;/code&gt; shrank to a single &lt;code&gt;build-settings&lt;/code&gt; block, and the whole file went from 300 lines of property list to 123 lines of JSON.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bonus: IDs are mostly gone
&lt;/h3&gt;

&lt;p&gt;IDs are only assigned where they're needed, meaning targets and build products. Everything else is referenced by name or path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotcha: it's "JSON", but with trailing commas
&lt;/h2&gt;

&lt;p&gt;You might have noticed the trailing commas in the examples above. That's intentional. The format allows trailing commas, so a plain &lt;code&gt;JSON.parse&lt;/code&gt; can't read it as-is. Apple's open-source library uses JSON5 encoding for this. If you're writing a script, use a JSON5-tolerant parser or Apple's library (see below) instead of &lt;code&gt;jq&lt;/code&gt; or &lt;code&gt;JSON.parse&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to switch an existing project
&lt;/h2&gt;

&lt;h3&gt;
  
  
  In Xcode
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Select the &lt;strong&gt;project&lt;/strong&gt; at the top of the Project navigator.&lt;/li&gt;
&lt;li&gt;Open the &lt;strong&gt;File inspector&lt;/strong&gt; (&lt;code&gt;Option-Command-1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Project Document&lt;/strong&gt;, set &lt;strong&gt;Project Format&lt;/strong&gt; to &lt;strong&gt;JSON&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Confirm the dialog.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;project.pbxproj&lt;/code&gt; is deleted and &lt;code&gt;project.xcproj&lt;/code&gt; takes its place. Commit the change as its own commit, with no other edits, so it's easy to review and revert.&lt;/p&gt;

&lt;h3&gt;
  
  
  From the command line
&lt;/h3&gt;

&lt;p&gt;This is handy for CI or for converting many projects at once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xcodebuild &lt;span class="nt"&gt;-project&lt;/span&gt; MyApp.xcodeproj &lt;span class="nt"&gt;-convert-project&lt;/span&gt; &lt;span class="s2"&gt;"Xcode Project"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command converts the project, and it does the same thing as choosing JSON in the File inspector.&lt;/p&gt;

&lt;h2&gt;
  
  
  New tooling: &lt;code&gt;xcprojformatter&lt;/code&gt; and an open-source library
&lt;/h2&gt;

&lt;p&gt;Apple published the format openly. &lt;code&gt;xcode-project-format&lt;/code&gt; is a Swift library for reading, writing, and manipulating the &lt;code&gt;project.xcproj&lt;/code&gt; format, so tools like generators, linters, and validators don't each have to reverse-engineer it.&lt;/p&gt;

&lt;p&gt;Reading a project takes a few lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;XcodeProjectFormat&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="kt"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;contentsOf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;projectURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;project&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="kt"&gt;XCSchema&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="kt"&gt;Project&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;jsonRepresentation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;targets&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Xcode 27.2 also includes &lt;code&gt;xcprojformatter&lt;/code&gt; in &lt;code&gt;/usr/bin&lt;/code&gt;. It validates and reformats files that already use &lt;code&gt;xcproj&lt;/code&gt;. It is not a converter from &lt;code&gt;pbxproj&lt;/code&gt;. For CI, think of it as &lt;code&gt;swift-format&lt;/code&gt; for your project file. Run &lt;code&gt;xcprojformatter --help&lt;/code&gt; to see its options, and consider adding a check to CI so hand edits (from people or AI agents) stay in canonical form.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about Tuist, XcodeGen, CocoaPods, fastlane?
&lt;/h2&gt;

&lt;p&gt;This is the main reason to wait before switching.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anything that parses &lt;code&gt;project.pbxproj&lt;/code&gt; directly needs an update.&lt;/strong&gt; That includes CocoaPods through the &lt;code&gt;xcodeproj&lt;/code&gt; gem, fastlane actions that bump versions or change settings, project generators, and custom scripts. As of the 27.2 release, support is still rolling out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Swift &lt;code&gt;XcodeProj&lt;/code&gt; library already has experimental support.&lt;/strong&gt; Version 9.17.0 added it on September 17, 2026. Its maintainers say to expect details to change and to check a converted project before committing it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some tools don't support it yet.&lt;/strong&gt; For example, Capacitor has an open issue because &lt;code&gt;cap sync ios&lt;/code&gt; only parses &lt;code&gt;.pbxproj&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generators keep working.&lt;/strong&gt; Tuist, XcodeGen, Bazel, SwiftPM, and xcconfig-based workflows continue to work unchanged and can adopt the new format at their own pace.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why now? (Hint: AI agents)
&lt;/h2&gt;

&lt;p&gt;Apple filed its announcement under &lt;strong&gt;Coding Intelligence&lt;/strong&gt;. Apple says directly that the new format makes it easier for coding agents to work with Xcode projects. When an agent (or a human) can change one setting by editing one readable line, instead of updating several ID cross-references, there are far fewer ways to break the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you switch?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your situation&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Solo dev or small team, everyone on Xcode 27&lt;/td&gt;
&lt;td&gt;Switch now&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hand-maintained &lt;code&gt;.xcodeproj&lt;/code&gt; with frequent conflicts&lt;/td&gt;
&lt;td&gt;Switch, since you gain the most&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Someone on the team still uses Xcode 26&lt;/td&gt;
&lt;td&gt;Wait&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CocoaPods, fastlane project edits, or custom pbxproj scripts&lt;/td&gt;
&lt;td&gt;Check each tool first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You generate projects with Tuist or XcodeGen&lt;/td&gt;
&lt;td&gt;Nothing urgent, since your manifest is the source of truth&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;project.xcproj&lt;/code&gt; isn't a new build system or a Swift manifest. It's the same project model written in a form people can actually read. Adding a file is one line, a setting is one line, and a merge conflict becomes something you can resolve by reading it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Further reading&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apple: &lt;a href="https://developer.apple.com/documentation/xcode/updating-your-xcode-project-configuration-file-format" rel="noopener noreferrer"&gt;Updating your Xcode project configuration file format&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ios</category>
      <category>swift</category>
      <category>ai</category>
      <category>xcode</category>
    </item>
    <item>
      <title>Orca: The Agent Development Environment for Running AI Coding Agents in Parallel</title>
      <dc:creator>ArshTechPro</dc:creator>
      <pubDate>Sun, 20 Sep 2026 06:00:36 +0000</pubDate>
      <link>https://dev.to/arshtechpro/orca-explained-the-agent-development-environment-for-running-ai-coding-agents-in-parallel-440n</link>
      <guid>https://dev.to/arshtechpro/orca-explained-the-agent-development-environment-for-running-ai-coding-agents-in-parallel-440n</guid>
      <description>&lt;p&gt;If you use Claude Code, Codex, or another AI coding agent in your terminal, you have probably hit this wall: the agent is busy on one task, you want to start a second one, and now you are juggling branches, stashing changes, and opening five terminal windows that all look the same.&lt;/p&gt;

&lt;p&gt;Orca is a desktop app built to solve exactly that. This article explains what it is, how it differs from Cursor, what it costs, and where it falls short.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Orca?
&lt;/h2&gt;

&lt;p&gt;Orca calls itself an &lt;strong&gt;ADE&lt;/strong&gt;, an Agent Development Environment. The idea is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A traditional &lt;strong&gt;IDE&lt;/strong&gt; is built around one human typing code.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;ADE&lt;/strong&gt; is built around you &lt;em&gt;supervising several AI agents&lt;/em&gt; that write code at the same time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, Orca is a desktop app (macOS, Windows, Linux) where every task you start gets:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Its own &lt;strong&gt;git worktree&lt;/strong&gt; (an isolated copy of your repo on its own branch)&lt;/li&gt;
&lt;li&gt;Its own &lt;strong&gt;agent terminal&lt;/strong&gt; (Claude Code, Codex, Gemini, Cursor CLI, and so on)&lt;/li&gt;
&lt;li&gt;Its own &lt;strong&gt;browser tab&lt;/strong&gt; for previewing the app&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  A quick primer on git worktrees
&lt;/h2&gt;

&lt;p&gt;Worktrees are the core idea behind Orca, so it is worth a 30-second refresher.&lt;/p&gt;

&lt;p&gt;Normally, one repo folder has one checked-out branch. A worktree lets you check out &lt;em&gt;another&lt;/em&gt; branch into a &lt;em&gt;separate folder&lt;/em&gt; that shares the same git history:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git worktree add ../fix-login-race &lt;span class="nt"&gt;-b&lt;/span&gt; fix-login-race
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have two folders, two branches, one repo. No stashing needed.&lt;/p&gt;

&lt;p&gt;Orca automates this. Click "+", name your task, pick an agent, and Orca creates a real git worktree and launches the agent inside it. Because these are standard worktrees, you can always &lt;code&gt;cd&lt;/code&gt; into one and use plain git.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does a typical workflow look like?
&lt;/h2&gt;

&lt;p&gt;The Orca docs describe a "first 3-agent session" that sums up the whole product:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add a repo.&lt;/strong&gt; Point Orca at a local checkout. It uses your default branch (for example &lt;code&gt;origin/main&lt;/code&gt;) as the base for new worktrees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a worktree.&lt;/strong&gt; Give the task a name like &lt;code&gt;fix-login-race&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick an agent.&lt;/strong&gt; Choose Claude Code, Codex, Cursor CLI, or another supported agent. Orca launches its CLI in the right directory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Race agents.&lt;/strong&gt; Repeat twice more with different agents and paste the same prompt into each:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fix-login-race&lt;/code&gt; with Claude Code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fix-login-race-2&lt;/code&gt; with Codex&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fix-login-race-3&lt;/code&gt; with Cursor CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split panes&lt;/strong&gt; so you can watch all three working at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review and ship.&lt;/strong&gt; Open each diff, leave inline comments to send back to the best agent, then commit and push from inside Orca. Delete the losing worktrees in one click.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That loop (add, worktree, agent, split, diff, ship) is essentially the whole product. Everything else is a deeper version of one of those steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key features
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Parallel worktrees.&lt;/strong&gt; Every task is isolated, so five agents can work on the same repo without overwriting each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bring your own agent.&lt;/strong&gt; Orca ships preconfigured for a long list of CLI agents, including Claude Code, Codex, Gemini, Cursor CLI, GitHub Copilot, OpenCode, Amp, Goose, Cline, Kiro, and Qwen Code, and any other CLI agent can be added.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Annotate AI diffs.&lt;/strong&gt; Leave markdown comments on specific diff lines, batch them, and send them back to the agent as feedback. You can also inspect CI, resolve conflicts, and open PRs in the app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design Mode.&lt;/strong&gt; Each worktree gets a real Chromium window. Click a UI element and Orca sends its HTML, CSS, and a cropped screenshot to your agent. Useful for "fix this button" style front-end work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Terminal.&lt;/strong&gt; GPU-rendered, with unlimited splits, scrollback that survives restarts, and scrollback search. On first launch it can import your Ghostty settings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Editor.&lt;/strong&gt; It includes a VS Code-style (Monaco) editor with autosave, so you can make manual edits without leaving the app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSH worktrees.&lt;/strong&gt; Run agents on a powerful remote machine with full file editing, git, and terminals, plus auto-reconnect and port forwarding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub, Linear, and Jira integration.&lt;/strong&gt; Browse PRs and issues, open a worktree straight from a task, and review PRs without switching apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Orca CLI.&lt;/strong&gt; Agents can drive Orca too, for example creating worktrees themselves, which enables orchestration and scheduled automations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usage tracking.&lt;/strong&gt; See Claude and Codex usage and rate-limit reset times, and swap between Codex accounts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mobile companion.&lt;/strong&gt; iOS and Android apps let you check agent status, get notifications, and keep terminal work moving when you are away from your desk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is Orca like Cursor?
&lt;/h2&gt;

&lt;p&gt;Short answer: &lt;strong&gt;they overlap, but they solve different problems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; is an AI-first code editor (a fork of VS Code). The AI lives &lt;em&gt;inside&lt;/em&gt; the editor: autocomplete as you type, chat in a sidebar, and an agent mode. You are the main author, and the AI assists you in one workspace. You pay Cursor for access to the models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Orca&lt;/strong&gt; is an orchestration layer for &lt;em&gt;CLI agents&lt;/em&gt;. It does not provide its own model. Instead, it runs the agents you already have (including Cursor's own CLI agent) side by side, each in its own isolated branch, and gives you tools to review and merge their output.&lt;/p&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;Orca&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core idea&lt;/td&gt;
&lt;td&gt;Manage many agents in parallel&lt;/td&gt;
&lt;td&gt;AI-assisted editor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built on&lt;/td&gt;
&lt;td&gt;Desktop app wrapping CLI agents, terminals, browser, editor&lt;/td&gt;
&lt;td&gt;Fork of VS Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI models&lt;/td&gt;
&lt;td&gt;Bring your own (Claude Code, Codex, Gemini, etc.)&lt;/td&gt;
&lt;td&gt;Cursor's subscription and models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parallel agents&lt;/td&gt;
&lt;td&gt;First-class, one worktree per task&lt;/td&gt;
&lt;td&gt;Supported, but not the main workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inline autocomplete while you type&lt;/td&gt;
&lt;td&gt;Not a headline feature&lt;/td&gt;
&lt;td&gt;Yes, a core feature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;Yes, MIT&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platforms&lt;/td&gt;
&lt;td&gt;macOS, Windows, Linux&lt;/td&gt;
&lt;td&gt;macOS, Windows, Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price of the tool itself&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free tier plus paid plans&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A useful way to think about it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you mostly &lt;strong&gt;write code yourself&lt;/strong&gt; and want AI help as you type, Cursor (or a similar AI editor) is the more natural fit.&lt;/li&gt;
&lt;li&gt;If you mostly &lt;strong&gt;delegate tasks to agents&lt;/strong&gt; and your job is increasingly to review, compare, and merge their output, Orca is designed for that.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing: is Orca free?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Yes. The Orca app is free and open source under the MIT license.&lt;/strong&gt; There is no paid tier listed on the website.&lt;/p&gt;

&lt;p&gt;There are two things to be aware of:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;You pay for the agents.&lt;/strong&gt; Orca is not a model. You need your own Claude, Codex, Gemini, or other subscription or API key. Running three agents in parallel can use your quota roughly three times as fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise is "contact us."&lt;/strong&gt; There is an Enterprise page covering security reviews, self-hosting, rollout help, and SOC 2 readiness, but no public pricing. You have to email the team.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Installing Orca
&lt;/h2&gt;

&lt;p&gt;Download builds for each platform from the &lt;a href="https://www.onorca.dev/download" rel="noopener noreferrer"&gt;download page&lt;/a&gt; or GitHub Releases. On macOS you can also use Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; stablyai/orca/orca
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On first launch, Orca offers to import your &lt;code&gt;~/.claude&lt;/code&gt;, &lt;code&gt;~/.codex&lt;/code&gt;, and Ghostty settings.&lt;/li&gt;
&lt;li&gt;On Linux, pick the AppImage if you want automatic updates. The CLI is named &lt;code&gt;orca-ide&lt;/code&gt; so it does not clash with the GNOME Orca screen reader.&lt;/li&gt;
&lt;li&gt;The app auto-updates on a stable channel, with optional release-candidate builds for early features.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who should try Orca?
&lt;/h2&gt;

&lt;p&gt;Orca is worth a look if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You already use one or more CLI coding agents and feel limited by running one task at a time.&lt;/li&gt;
&lt;li&gt;You want to compare how different agents handle the same bug.&lt;/li&gt;
&lt;li&gt;You want a Claude Code or Codex workflow on Windows or Linux with a proper UI around it.&lt;/li&gt;
&lt;li&gt;You like running agents on a remote machine and checking on them from your phone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can probably skip it if you rarely use agents, prefer AI autocomplete while you type, or want a single all-in-one subscription that handles the models for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/stablyai/orca" rel="noopener noreferrer"&gt;https://github.com/stablyai/orca&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>agents</category>
    </item>
    <item>
      <title>Worktrunk: Git Worktrees Made Simple for Parallel AI Agents</title>
      <dc:creator>ArshTechPro</dc:creator>
      <pubDate>Sat, 19 Sep 2026 21:08:11 +0000</pubDate>
      <link>https://dev.to/arshtechpro/worktrunk-git-worktrees-made-simple-for-parallel-ai-agents-1106</link>
      <guid>https://dev.to/arshtechpro/worktrunk-git-worktrees-made-simple-for-parallel-ai-agents-1106</guid>
      <description>&lt;p&gt;AI coding agents like Claude Code and Codex can now work on longer tasks without supervision. That means you can realistically run several of them at once, each on a different feature or bug.&lt;/p&gt;

&lt;p&gt;The catch: if they all work in the same folder, they overwrite each other's changes. Git has a built-in answer for this called &lt;strong&gt;worktrees&lt;/strong&gt;. A worktree is a separate working directory attached to the same repository, so each branch can live in its own folder at the same time.&lt;/p&gt;

&lt;p&gt;The problem is that git's worktree commands are clunky. Just starting a new one looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git worktree add &lt;span class="nt"&gt;-b&lt;/span&gt; feat ../repo.feat
&lt;span class="nb"&gt;cd&lt;/span&gt; ../repo.feat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You type the branch name three times. Cleaning up afterward takes another three commands. Do this ten times a day and it gets old fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Worktrunk is
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/max-sixty/worktrunk" rel="noopener noreferrer"&gt;Worktrunk&lt;/a&gt; is a command-line tool, written in Rust, that makes worktrees as easy to use as regular branches. You refer to everything by branch name, and Worktrunk works out the folder paths for you.&lt;/p&gt;

&lt;p&gt;It's open source (MIT or Apache-2.0), was released at the start of 2026, and already has over 5k stars on GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core commands
&lt;/h2&gt;

&lt;p&gt;Here's how Worktrunk compares with plain git:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Worktrunk&lt;/th&gt;
&lt;th&gt;Plain git&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Switch to a worktree&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wt switch feat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cd ../repo.feat&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create and start an agent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wt switch -c -x claude feat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git worktree add -b feat ../repo.feat &amp;amp;&amp;amp; cd ../repo.feat &amp;amp;&amp;amp; claude&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clean up&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wt remove&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cd ../repo &amp;amp;&amp;amp; git worktree remove ../repo.feat &amp;amp;&amp;amp; git branch -d feat&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List with status&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wt list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;git worktree list&lt;/code&gt; (paths only)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Four commands cover most of what you'll do day to day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;Install with Homebrew (macOS and Linux):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;worktrunk &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; wt config shell &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or with Cargo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;worktrunk &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; wt config shell &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;wt config shell install&lt;/code&gt; step matters. It adds shell integration so &lt;code&gt;wt&lt;/code&gt; can actually change your current directory.&lt;/p&gt;

&lt;p&gt;Create a worktree for a new feature:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wt switch &lt;span class="nt"&gt;--create&lt;/span&gt; feature-auth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates the branch and the worktree, then moves you into it. Check all your worktrees and their status with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wt list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you're done, you can open a PR as usual and run &lt;code&gt;wt remove&lt;/code&gt; after it merges. Or merge locally with one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wt merge main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That commits your changes, rebases onto main, merges, and removes the worktree and branch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running agents in parallel
&lt;/h2&gt;

&lt;p&gt;This is where Worktrunk shines. Start three agents on three tasks, each in its own isolated worktree:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wt switch &lt;span class="nt"&gt;-x&lt;/span&gt; claude &lt;span class="nt"&gt;-c&lt;/span&gt; feature-a &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s1"&gt;'Add user authentication'&lt;/span&gt;
wt switch &lt;span class="nt"&gt;-x&lt;/span&gt; claude &lt;span class="nt"&gt;-c&lt;/span&gt; feature-b &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s1"&gt;'Fix the pagination bug'&lt;/span&gt;
wt switch &lt;span class="nt"&gt;-x&lt;/span&gt; claude &lt;span class="nt"&gt;-c&lt;/span&gt; feature-c &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s1"&gt;'Write tests for the API'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;-x&lt;/code&gt; flag runs a command after switching, and everything after &lt;code&gt;--&lt;/code&gt; is passed to that command. No agent touches another agent's files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extras worth knowing
&lt;/h2&gt;

&lt;p&gt;Beyond the basics, Worktrunk includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hooks&lt;/strong&gt; that run commands when a worktree is created or merged, such as installing dependencies or starting a dev server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM-generated commit messages&lt;/strong&gt; based on your diff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build cache copying&lt;/strong&gt; so a new worktree can reuse &lt;code&gt;node_modules/&lt;/code&gt; or &lt;code&gt;target/&lt;/code&gt; instead of starting cold.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PR checkout&lt;/strong&gt; with &lt;code&gt;wt switch pr:123&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A unique port per worktree&lt;/strong&gt; so multiple dev servers can run side by side.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Is it worth a try?
&lt;/h2&gt;

&lt;p&gt;Yes, if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run more than one AI coding agent at a time.&lt;/li&gt;
&lt;li&gt;Juggle several branches and hate stashing or re-cloning.&lt;/li&gt;
&lt;li&gt;Already use git worktrees and are tired of the long commands.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few honest caveats. It's a young project, so expect frequent releases and occasional changes. Every worktree is a full copy of your working files, so large repos use more disk space (the cache-copying feature helps, but doesn't remove this). On Windows, &lt;code&gt;wt&lt;/code&gt; clashes with the Windows Terminal command, so it installs as &lt;code&gt;git-wt&lt;/code&gt; instead unless you disable that alias. And if you only ever work on one branch at a time, plain &lt;code&gt;git switch&lt;/code&gt; is all you need.&lt;/p&gt;

&lt;p&gt;If parallel agents are part of your workflow, Worktrunk removes most of the friction of worktrees. Install it, spin up two worktrees, and you'll know within ten minutes whether it sticks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/max-sixty/worktrunk" rel="noopener noreferrer"&gt;https://github.com/max-sixty/worktrunk&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>agents</category>
      <category>git</category>
    </item>
    <item>
      <title>Docling: Turn Messy Documents into Clean Data for Your AI App</title>
      <dc:creator>ArshTechPro</dc:creator>
      <pubDate>Sat, 19 Sep 2026 20:57:15 +0000</pubDate>
      <link>https://dev.to/arshtechpro/docling-turn-messy-documents-into-clean-data-for-your-ai-app-3gnp</link>
      <guid>https://dev.to/arshtechpro/docling-turn-messy-documents-into-clean-data-for-your-ai-app-3gnp</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;If you've built anything with LLMs, you've hit this wall: your data lives in PDFs, Word files, slide decks, and scanned images. You need clean text to feed a model or a RAG pipeline. Basic PDF-to-text tools give you a jumbled mess: tables collapse into random lines, two-column layouts get read in the wrong order, and headers mix with body text.&lt;/p&gt;

&lt;p&gt;Docling is an open-source Python library built to solve exactly that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Docling is
&lt;/h2&gt;

&lt;p&gt;Docling reads documents and converts them into structured output such as Markdown, HTML, or JSON. It was started by IBM Research Zurich, is now hosted by the LF AI &amp;amp; Data Foundation, and is MIT licensed. It has over 66k stars on GitHub, so it's far from a side project.&lt;/p&gt;

&lt;p&gt;What sets it apart from a plain text extractor is that it tries to &lt;em&gt;understand&lt;/em&gt; the page. It detects layout and reading order, rebuilds tables, and recognizes code blocks, formulas, and images.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it supports
&lt;/h2&gt;

&lt;p&gt;Input formats include PDF, DOCX, PPTX, XLSX, HTML, EPUB, images, LaTeX, email files, and even audio and video (transcribed with speech recognition models). Scanned PDFs are handled with OCR.&lt;/p&gt;

&lt;p&gt;Everything is converted into one internal format called &lt;code&gt;DoclingDocument&lt;/code&gt;, which you can then export as Markdown, HTML, or lossless JSON. That means your downstream code deals with one structure no matter what the input was.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;You need Python 3.10 or newer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;docling
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Convert a document from the command line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docling https://arxiv.org/pdf/2206.01062
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This writes a &lt;code&gt;.md&lt;/code&gt; file to your current directory.&lt;/p&gt;

&lt;p&gt;Or use it from Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;docling.document_converter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DocumentConverter&lt;/span&gt;

&lt;span class="n"&gt;converter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DocumentConverter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;converter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://arxiv.org/pdf/2408.09869&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;export_to_markdown&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Local file paths work the same way as URLs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it fits in your stack
&lt;/h2&gt;

&lt;p&gt;Docling has ready-made integrations with LangChain, LlamaIndex, CrewAI, and Haystack, so you can drop it into an existing RAG pipeline as the document loader. It also ships an MCP server for connecting it to AI agents, and an API server (&lt;code&gt;docling-serve&lt;/code&gt;) if you'd rather run it as a service than import it as a library.&lt;/p&gt;

&lt;p&gt;It runs fully locally, which matters if you're handling sensitive documents or working in an air-gapped environment. No data has to leave your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is it worth a try?
&lt;/h2&gt;

&lt;p&gt;Yes, if any of these describe you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're building a RAG system or chatbot over real-world documents.&lt;/li&gt;
&lt;li&gt;You have PDFs with tables that other tools mangle.&lt;/li&gt;
&lt;li&gt;You need to process many file types without writing a separate parser for each.&lt;/li&gt;
&lt;li&gt;You can't send documents to a third-party API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few honest caveats. Docling uses machine learning models for layout and table detection, so the install is heavier than a lightweight library like &lt;code&gt;pypdf&lt;/code&gt;, and models are downloaded on first run. Processing large PDF batches on CPU can be slow, and a GPU helps a lot. If all you need is raw text from simple, single-column PDFs, a lighter tool will do the job with less overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/docling-project/docling" rel="noopener noreferrer"&gt;https://github.com/docling-project/docling&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>python</category>
      <category>rag</category>
    </item>
    <item>
      <title>Open Source Alternative to Claude Code and Cursor: Meet Cline</title>
      <dc:creator>ArshTechPro</dc:creator>
      <pubDate>Thu, 17 Sep 2026 08:18:39 +0000</pubDate>
      <link>https://dev.to/arshtechpro/open-source-alternative-to-claude-code-and-cursor-meet-cline-5cfi</link>
      <guid>https://dev.to/arshtechpro/open-source-alternative-to-claude-code-and-cursor-meet-cline-5cfi</guid>
      <description>&lt;p&gt;Cline is an open source, autonomous coding agent. Instead of just autocompleting the line you're typing, Cline can read your entire project, plan out a set of changes, edit multiple files, run terminal commands, and check its own work against linter and compiler errors, all with you reviewing and approving each step.&lt;/p&gt;

&lt;p&gt;It started as a VS Code extension (previously known as "Claude Dev"), but it has grown into something bigger. Today, Cline ships as four things built on the same underlying engine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VS Code Extension&lt;/strong&gt; — the original, most widely used form. Install it from the VS Code Marketplace and it sits right in your editor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JetBrains Plugin&lt;/strong&gt; — the same experience inside IntelliJ IDEA, PyCharm, WebStorm, GoLand, and the rest of the JetBrains family.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI&lt;/strong&gt; — run Cline directly in your terminal, either as an interactive chat or fully headless for scripts and CI/CD pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SDK&lt;/strong&gt; — a Node.js package (&lt;code&gt;@cline/sdk&lt;/code&gt;) for developers who want to build their own agents, custom tools, or integrations on top of Cline's engine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's licensed under Apache 2.0, and as of this writing has over 67,000 stars and more than 7,000 forks on GitHub, so it has real traction, not just a novelty project.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Can It Actually Do?
&lt;/h2&gt;

&lt;p&gt;Here's a breakdown of the core capabilities, in plain terms.&lt;/p&gt;

&lt;h3&gt;
  
  
  It edits code across your whole project
&lt;/h3&gt;

&lt;p&gt;Cline doesn't just look at the file you have open. It reads your project structure, figures out how files relate to each other, and makes coordinated edits across the codebase. While it works, it watches for linter and compiler errors and tries to fix problems like missing imports or type mismatches before you even notice them. Every edit shows up as a reviewable diff, and changes are tracked with checkpoints so you can undo the agent's work if something goes wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  It runs terminal commands
&lt;/h3&gt;

&lt;p&gt;Cline can execute commands directly: installing packages, running build scripts, executing tests, deploying, managing databases. For long-running processes like a dev server, it keeps watching the output in the background and reacts to new errors or crashes as they appear.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plan mode and Act mode
&lt;/h3&gt;

&lt;p&gt;This is one of Cline's more distinctive features. In &lt;strong&gt;Plan mode&lt;/strong&gt;, Cline explores your code, asks clarifying questions, and proposes a strategy before touching anything. Once you're happy with the plan, you switch to &lt;strong&gt;Act mode&lt;/strong&gt; and it executes. By default, every file edit and command needs your approval — though you can flip on auto-approve if you want it to run more autonomously.&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom rules and skills
&lt;/h3&gt;

&lt;p&gt;You can define project-specific rules in &lt;code&gt;.clinerules&lt;/code&gt; files: coding standards, architecture conventions, deployment steps, testing requirements. These are picked up automatically across the CLI, VS Code extension, and JetBrains plugin, so the agent behaves consistently with your team's conventions rather than guessing.&lt;/p&gt;

&lt;h3&gt;
  
  
  You're not locked into one AI model
&lt;/h3&gt;

&lt;p&gt;This is a big differentiator. Cline doesn't force you onto a single provider. You can plug in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic (Claude Opus, Sonnet, Haiku)&lt;/li&gt;
&lt;li&gt;OpenAI (GPT series)&lt;/li&gt;
&lt;li&gt;Google (Gemini series)&lt;/li&gt;
&lt;li&gt;OpenRouter (200+ models)&lt;/li&gt;
&lt;li&gt;AWS Bedrock, Azure, GCP Vertex&lt;/li&gt;
&lt;li&gt;Cerebras, Groq (fast inference)&lt;/li&gt;
&lt;li&gt;Ollama or LM Studio for local models&lt;/li&gt;
&lt;li&gt;Any OpenAI-compatible endpoint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You bring your own API key, and you decide what you're paying for and which model fits the task.&lt;/p&gt;

&lt;h3&gt;
  
  
  Extensibility: plugins and MCP servers
&lt;/h3&gt;

&lt;p&gt;Using the SDK, you can register custom tools and lifecycle hooks for logging, auditing, policy enforcement, or domain-specific capabilities. Cline also supports &lt;a href="https://github.com/modelcontextprotocol" rel="noopener noreferrer"&gt;MCP (Model Context Protocol)&lt;/a&gt; servers, so it can connect to databases, call APIs, manage cloud infrastructure, or use community-built tools. You can even ask Cline to write a new custom tool on the fly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-agent teams and scheduled agents
&lt;/h3&gt;

&lt;p&gt;Newer additions let you coordinate multiple agents on a single task, with a coordinator agent delegating subtasks to specialists, and state persisting across sessions. You can also schedule agents to run on a cron schedule for recurring work like daily PR summaries or weekly dependency checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chat with it from Slack, Telegram, Discord, and more
&lt;/h3&gt;

&lt;p&gt;Cline can connect to messaging platforms so you can hand it tasks from Slack, Telegram, Discord, Google Chat, WhatsApp, or Linear, with each conversation thread mapped to a full agent session.&lt;/p&gt;

&lt;h3&gt;
  
  
  Headless mode for CI/CD
&lt;/h3&gt;

&lt;p&gt;For automation, Cline can run with zero interaction: pipe input in, get JSON output back, and chain it into scripts or pipelines. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cline &lt;span class="s2"&gt;"Run tests and fix any failures"&lt;/span&gt;
git diff origin/main | cline &lt;span class="s2"&gt;"Review these changes for issues"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How Do You Get Started?
&lt;/h2&gt;

&lt;p&gt;For the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; cline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the editor experience, install the &lt;a href="https://marketplace.visualstudio.com/items?itemName=saoudrizwan.claude-dev" rel="noopener noreferrer"&gt;VS Code extension&lt;/a&gt; or the &lt;a href="https://plugins.jetbrains.com/plugin/28247-cline" rel="noopener noreferrer"&gt;JetBrains plugin&lt;/a&gt;, then connect your API key from whichever model provider you want to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is It Worth Trying?
&lt;/h2&gt;

&lt;p&gt;Short answer: yes, especially if any of the following sound like you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try Cline if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want an agent that can make autonomous, multi-file changes across a real codebase, not just single-line suggestions.&lt;/li&gt;
&lt;li&gt;You want to choose your own model and control your own costs, rather than being locked into one vendor's bundled pricing.&lt;/li&gt;
&lt;li&gt;You already live in VS Code or a JetBrains IDE and don't want to switch to a different editor entirely.&lt;/li&gt;
&lt;li&gt;You want to inspect, extend, or audit the tool itself, since it's fully open source under Apache 2.0.&lt;/li&gt;
&lt;li&gt;You want the same agent core available as a CLI for scripting, a plugin for your editor, and an SDK for building your own tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Think twice, or pair it with something else, if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want a fully polished, all-in-one AI-native editor experience. Tools like Cursor offer a more integrated, purpose-built interface with fast inline completions, and many developers report an easier on-ramp for beginners.&lt;/li&gt;
&lt;li&gt;You'd rather pay a flat monthly fee and not think about token costs. Cline's "bring your own key" model means your spend depends on which model you use and how much you run it, and heavy usage can add up.&lt;/li&gt;
&lt;li&gt;You want something with zero setup. Cline requires you to get an API key from a provider and configure it, which is a small extra step compared to tools with built-in, bundled access.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Compares to Other Agents
&lt;/h2&gt;

&lt;p&gt;It's worth being clear-eyed about where Cline sits in the current landscape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cline vs Cursor&lt;/strong&gt;: Cursor is a standalone, AI-native editor (a VS Code fork) with a bundled model and a smoother out-of-the-box experience. Cline is a VS Code/JetBrains extension plus CLI and SDK, open source, and model-agnostic. Many developers actually run both: Cursor for fast in-editor completions, an agent like Cline or Claude Code for larger autonomous, multi-file work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cline vs Claude Code&lt;/strong&gt;: Claude Code is Anthropic's own terminal-first agent, tightly built around Claude models. Cline offers a similar terminal and autonomous-agent experience but lets you swap in any model provider, and it also gives you a full IDE extension and SDK, which Claude Code doesn't offer in the same way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither of these makes Cline "better" or "worse" outright. It's a different set of trade-offs: openness and model flexibility versus the tighter polish of a closed, single-vendor product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/cline/cline" rel="noopener noreferrer"&gt;github.com/cline/cline&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>agentskills</category>
      <category>programming</category>
    </item>
    <item>
      <title>BrewUI: A First Look at Homebrew's Official macOS GUI</title>
      <dc:creator>ArshTechPro</dc:creator>
      <pubDate>Wed, 16 Sep 2026 13:44:53 +0000</pubDate>
      <link>https://dev.to/arshtechpro/brewui-a-first-look-at-homebrews-official-macos-gui-3fk2</link>
      <guid>https://dev.to/arshtechpro/brewui-a-first-look-at-homebrews-official-macos-gui-3fk2</guid>
      <description>&lt;p&gt;If you use a Mac for development, you almost certainly have Homebrew installed. You type &lt;code&gt;brew install something&lt;/code&gt;, wait a few seconds, and move on with your day.&lt;/p&gt;

&lt;p&gt;But not everyone who needs Homebrew is comfortable in a terminal. Designers, data folks, students, and plenty of developers early in their careers often get told "just install it with brew" and then get stuck.&lt;/p&gt;

&lt;p&gt;The Homebrew team is working on an answer to that: &lt;strong&gt;BrewUI&lt;/strong&gt;, an official, native macOS app for managing Homebrew packages. The project lives at &lt;a href="https://github.com/Homebrew/BrewUI" rel="noopener noreferrer"&gt;github.com/Homebrew/BrewUI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article walks through what BrewUI is, the ideas behind it, and how its architecture works, in plain terms.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Heads up:&lt;/strong&gt; BrewUI is in early development. The team describes the current phase as building the app foundation. Treat everything here as a look at a project in progress, not a finished product you can download today.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What is BrewUI?
&lt;/h2&gt;

&lt;p&gt;BrewUI is a graphical front end for Homebrew. Instead of typing commands, you can search for packages, install them, update them, and remove them through a regular Mac app window.&lt;/p&gt;

&lt;p&gt;The key word is &lt;strong&gt;official&lt;/strong&gt;. There have been third-party Homebrew GUIs over the years, but this one is maintained under the Homebrew organization itself.&lt;/p&gt;

&lt;p&gt;The stated goal is to let people who avoid the command line safely discover and manage packages, without the app ever hiding what Homebrew is actually doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core idea: transparency
&lt;/h2&gt;

&lt;p&gt;Most GUIs wrap a tool and try to make you forget the tool exists. BrewUI takes the opposite approach.&lt;/p&gt;

&lt;p&gt;The design rules say the app should always show the &lt;strong&gt;exact command&lt;/strong&gt; it is running. If you click "Install" on a package, you should be able to see the real &lt;code&gt;brew&lt;/code&gt; command behind that button, along with its output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Homebrew stays the source of truth
&lt;/h2&gt;

&lt;p&gt;BrewUI does not reimplement Homebrew or reach into its internals. It gets data in two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The &lt;code&gt;brew&lt;/code&gt; command line tool&lt;/strong&gt;, run as a subprocess (the same way you would run it yourself).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The &lt;a href="https://formulae.brew.sh/docs/api/" rel="noopener noreferrer"&gt;Homebrew JSON API&lt;/a&gt;&lt;/strong&gt; at &lt;code&gt;formulae.brew.sh&lt;/code&gt;, which provides package metadata.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It also does not bundle Homebrew. If Homebrew is not installed, the app is meant to detect that and degrade gracefully rather than crash. To find &lt;code&gt;brew&lt;/code&gt;, it checks the two standard locations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/opt/homebrew/bin/brew   &lt;span class="c"&gt;# Apple Silicon&lt;/span&gt;
/usr/local/bin/brew      &lt;span class="c"&gt;# Intel&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the app simple: Homebrew does the real work, and BrewUI presents it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Choice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;Swift 6.0 with strict concurrency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI&lt;/td&gt;
&lt;td&gt;SwiftUI (AppKit only when SwiftUI cannot do the job)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Observable&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrency&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;async&lt;/code&gt;/&lt;code&gt;await&lt;/code&gt;, actors for shared mutable state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependencies&lt;/td&gt;
&lt;td&gt;Swift Package Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform&lt;/td&gt;
&lt;td&gt;macOS only, with macOS Tahoe 26 as the main target&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;AGPL-3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you have been meaning to see what a modern, "all in" Swift 6 macOS project looks like, this repository is a good real-world example.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the architecture works
&lt;/h2&gt;

&lt;p&gt;Here is the part that is most interesting for developers. BrewUI follows a layered design. A user action flows down through the layers like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;View  -&amp;gt;  ViewModel  -&amp;gt;  Repository or Interactor  -&amp;gt;  Service  -&amp;gt;  brew CLI / JSON API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's break that down with a simple example: showing a list of installed packages and letting you upgrade one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Views
&lt;/h3&gt;

&lt;p&gt;SwiftUI views are kept thin. They display state and forward user actions. A view knows that a button was tapped; it does not know how to upgrade a package.&lt;/p&gt;

&lt;h3&gt;
  
  
  ViewModels
&lt;/h3&gt;

&lt;p&gt;The ViewModel holds presentation state, such as "is this list loading?" or "what text should this label show?". It turns domain data into something the UI can display, and passes real work further down.&lt;/p&gt;

&lt;h3&gt;
  
  
  Repositories
&lt;/h3&gt;

&lt;p&gt;A Repository is about &lt;strong&gt;reading data from a source&lt;/strong&gt;. For example, getting the list of installed packages from &lt;code&gt;brew list&lt;/code&gt; output, or package details from the JSON API.&lt;/p&gt;

&lt;p&gt;The benefit: the rest of the app does not care where the data came from. You could swap in a mock repository for tests and nothing above it would change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interactors
&lt;/h3&gt;

&lt;p&gt;An Interactor represents &lt;strong&gt;one specific use case&lt;/strong&gt;, such as running &lt;code&gt;brew doctor&lt;/code&gt;. It is not a generic "fetch everything" layer; it is a single, focused action.&lt;/p&gt;

&lt;h3&gt;
  
  
  Services
&lt;/h3&gt;

&lt;p&gt;Services are the infrastructure at the edge of the app: actually launching the &lt;code&gt;brew&lt;/code&gt; process, making HTTP requests, and so on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Models
&lt;/h3&gt;

&lt;p&gt;Plain domain types (like a package) shared across layers. They intentionally stay free of UI details, so the same model works for a list row, a detail page, or a test.&lt;/p&gt;

&lt;p&gt;If you know MVVM and Clean Architecture, this will feel familiar. The project describes it as a lightweight MVVM with a coordinator style, guided by Clean Architecture ideas, and it explicitly prefers the smallest pattern that solves the current problem rather than building everything up front.&lt;/p&gt;

&lt;h2&gt;
  
  
  The command center: why brew commands run one at a time
&lt;/h2&gt;

&lt;p&gt;One detail worth calling out is the &lt;strong&gt;command center&lt;/strong&gt;, an actor named &lt;code&gt;BrewCommandCenter&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Homebrew does not like it when you run multiple commands that change your system at the same time. Picture a user clicking "Upgrade" on three packages in quick succession. In a terminal you would naturally run them one after another. A GUI needs to enforce that on your behalf.&lt;/p&gt;

&lt;p&gt;The command center:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Serializes&lt;/strong&gt; any command that changes the system, so they run in order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracks the state&lt;/strong&gt; of each operation (in progress, failed, and so on), so every part of the UI can show accurate status.&lt;/li&gt;
&lt;li&gt;Runs small, dedicated command types for each mutating action.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reading data, like parsing &lt;code&gt;brew list&lt;/code&gt; or &lt;code&gt;brew info&lt;/code&gt;, is not its job. That stays in the repositories. This separation keeps "things that change your machine" in one controlled place.&lt;/p&gt;

&lt;p&gt;Using a Swift &lt;code&gt;actor&lt;/code&gt; here is a nice fit: actors guarantee only one task touches their state at a time, which is exactly the property you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing for tools that change
&lt;/h2&gt;

&lt;p&gt;BrewUI depends on two things it does not control: the text output of &lt;code&gt;brew&lt;/code&gt; and the shape of the JSON API. Both can change between Homebrew releases.&lt;/p&gt;

&lt;p&gt;The project handles that with a defensive mindset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CLI output is treated as unstable.&lt;/strong&gt; Parsers are expected to be tolerant and have fallbacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON decoding is resilient.&lt;/strong&gt; Unknown or missing fields should never crash the app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commands are async and cancellable&lt;/strong&gt;, with output streamed or preserved for logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is good advice for any app that wraps a command line tool, not just this one.&lt;/p&gt;

&lt;p&gt;Check it out here: &lt;a href="https://github.com/Homebrew/BrewUI" rel="noopener noreferrer"&gt;github.com/Homebrew/BrewUI&lt;/a&gt;&lt;/p&gt;

</description>
      <category>homebew</category>
      <category>swift</category>
      <category>opensource</category>
      <category>macos</category>
    </item>
  </channel>
</rss>
