<?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>Forem: Anton</title>
    <description>The latest articles on Forem by Anton (@antonmry).</description>
    <link>https://forem.com/antonmry</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F159728%2F39035694-fe45-4970-b78d-41c86ca1db2e.jpg</url>
      <title>Forem: Anton</title>
      <link>https://forem.com/antonmry</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/antonmry"/>
    <language>en</language>
    <item>
      <title>Get React out of my terminal: a case for headless mode</title>
      <dc:creator>Anton</dc:creator>
      <pubDate>Sun, 22 Feb 2026 15:36:54 +0000</pubDate>
      <link>https://forem.com/antonmry/get-react-out-of-my-terminal-a-case-for-headless-mode-44ie</link>
      <guid>https://forem.com/antonmry/get-react-out-of-my-terminal-a-case-for-headless-mode-44ie</guid>
      <description>&lt;p&gt;Code agents are fun. I use them every day. They fit neatly into the tools I&lt;br&gt;
already use: &lt;a href="https://www.gnu.org/software/bash/" rel="noopener noreferrer"&gt;Bash&lt;/a&gt;, &lt;a href="https://zellij.dev/" rel="noopener noreferrer"&gt;Zellij&lt;/a&gt;, &lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;Git&lt;/a&gt;, and more. But if&lt;br&gt;
you live in a terminal, a lot of "code agents" feel like hostile web apps&lt;br&gt;
ported into a CLI.&lt;/p&gt;

&lt;p&gt;Take Claude Code. I run Claude Opus through it often. The model is excellent.&lt;br&gt;
The client is one of the worst terminal experiences I've seen: slow, buggy, and&lt;br&gt;
somehow using ~400 MB of RAM per instance for what is essentially a cloud API&lt;br&gt;
wrapper. React in a terminal is a self-inflicted wound.&lt;/p&gt;

&lt;p&gt;OpenCode isn't much better: basic UX like copy/paste breaks inside a VM. At&lt;br&gt;
least it lets you switch models, and it's open source. Codex is the best of the&lt;br&gt;
bunch, faster and lighter, but still bloated. It amazes me how much these tools&lt;br&gt;
struggle with something the terminal already does natively: scrolling.&lt;/p&gt;

&lt;p&gt;Here's the part that hurts most: being forced to use a specific client if I want&lt;br&gt;
to use a specific model. Anthropic models are great for agentic tasks. They're&lt;br&gt;
more decisive, more willing to take risks, and more proactive than OpenAI or&lt;br&gt;
Google models. For code quality, I still find OpenAI better, but only with much&lt;br&gt;
more human guidance. Google Gemini shines in non-coding tasks but is still weak&lt;br&gt;
at tool calling.&lt;/p&gt;

&lt;p&gt;If I want Claude Opus through a subscription, I'm forced into Claude Code.&lt;br&gt;
That's not good. Yes, I can use the API instead, but why should I pay 10x more&lt;br&gt;
just to use the tools I like? That's absurd.&lt;/p&gt;

&lt;p&gt;Another trend that annoys me is how these tools are starting to babysit power&lt;br&gt;
users. The best example is compaction: automatic summarization to save tokens.&lt;br&gt;
It's useful when I ask for it. It's infuriating when it happens on its own and&lt;br&gt;
discards the constraints I just spent time setting. That might help&lt;br&gt;
non-technical users. For power users, it's often counterproductive and&lt;br&gt;
frustrating, especially given how buggy it can be.&lt;/p&gt;

&lt;p&gt;So I started thinking about how to make code agents fit my workflow without&lt;br&gt;
fighting the terminal. I wanted something that follows the&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/Unix_philosophy" rel="noopener noreferrer"&gt;Unix philosophy&lt;/a&gt;: small pieces you can compose. The answer&lt;br&gt;
was already there: headless mode.&lt;/p&gt;

&lt;p&gt;You can run &lt;code&gt;claude -p&lt;/code&gt; to send a prompt, get a response, and exit. Everything&lt;br&gt;
else in Claude Code is just layers on top. Most code agents work the same way.&lt;/p&gt;

&lt;p&gt;So what happens if you stop using the TUI and just drive headless mode? Turns&lt;br&gt;
out it's not only possible, it's surprisingly effective. It also forces you to&lt;br&gt;
learn what "agentic engineering" actually means when the TUI is no longer doing&lt;br&gt;
the thinking for you.&lt;/p&gt;

&lt;p&gt;Before I knew it, I'd built &lt;a href="https://github.com/antonmry/breo" rel="noopener noreferrer"&gt;BREO&lt;/a&gt;: the&lt;br&gt;
Browserless React-free Execution Operator. It's meant for my workflow, not&lt;br&gt;
yours, but the patterns are portable. This is what&lt;br&gt;
&lt;a href="https://github.com/antonmry/breo" rel="noopener noreferrer"&gt;BREO&lt;/a&gt; currently does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs Claude Code, Codex, and Gemini headlessly. No TUIs. No React.
Subscriptions, not API keys.&lt;/li&gt;
&lt;li&gt;Makes it easy to switch between agents and models.&lt;/li&gt;
&lt;li&gt;Persists conversations in Git with fuzzy search, renaming, and history.&lt;/li&gt;
&lt;li&gt;Saves full state (conversation, agent, model, sandbox), so sessions resume
cleanly in any folder.&lt;/li&gt;
&lt;li&gt;Lets me decide when compaction happens.&lt;/li&gt;
&lt;li&gt;Defaults to YOLO mode inside a sandbox
(&lt;a href="https://github.com/lima-vm/lima" rel="noopener noreferrer"&gt;LimaVM&lt;/a&gt; for now), because that's how I
usually work with agents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I usually start a conversation with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;breo &lt;span class="nt"&gt;-c&lt;/span&gt; new_data_api &lt;span class="s2"&gt;"Let's plan a new data API for my service"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It prints a response, and then I continue the conversation with another command.&lt;br&gt;
It remembers and persists the thread:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;breo &lt;span class="s2"&gt;"Let's run an E2E test to validate that the feature works as expected"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I can run other tools between messages, and I can also change the agent or the&lt;br&gt;
model in the next message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;breo &lt;span class="nt"&gt;-a&lt;/span&gt; codex &lt;span class="s2"&gt;"Let's update the SPEC with our findings"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BREO saves the last conversation, agent, model, and sandbox per folder, so I&lt;br&gt;
don't have to think about it. At any moment, &lt;code&gt;breo status&lt;/code&gt; tells me what's being&lt;br&gt;
used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;directory:     /Users/antonmry/Workspace/Galiglobal/breo
config:        /Users/antonmry/.config/breo
conversations: /Users/antonmry/.config/breo/conversations/breo
conversation:  2026-02-18_20-09-40
agent:         claude
sandbox:       default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The nicest thing is that it enables stronger workflows. I kept cycling through&lt;br&gt;
planning, implementation, and verification, so I built my own loop to offload&lt;br&gt;
part of that work to agents: &lt;code&gt;breo loop&lt;/code&gt;. It takes &lt;code&gt;PLAN.md&lt;/code&gt; (what to build)&lt;br&gt;
and &lt;code&gt;VERIFICATION.md&lt;/code&gt; (how to prove it works). It lets me select different&lt;br&gt;
agents for implementation and verification. The implementation agent keeps&lt;br&gt;
iterating until the verification agent can complete the E2E tests and validate&lt;br&gt;
the result.&lt;/p&gt;

&lt;p&gt;I usually prefer Codex for implementation because the code is less verbose, and&lt;br&gt;
Claude Code for verification because it doesn't stop when it hits an environment&lt;br&gt;
problem. Since everything runs inside a VM, I don't care if it nukes the&lt;br&gt;
sandbox along the way. This loop workflow uses the strengths of both models&lt;br&gt;
while minimizing their weaknesses.&lt;/p&gt;

&lt;p&gt;This is only one example of how I adapted ideas like&lt;br&gt;
&lt;a href="https://ghuntley.com/loop/" rel="noopener noreferrer"&gt;Ralph&lt;/a&gt; or &lt;a href="https://github.com/steveyegge/beads" rel="noopener noreferrer"&gt;Beads&lt;/a&gt; to my own workflow. I'm already thinking about&lt;br&gt;
how to add &lt;a href="https://xcancel.com/karpathy/status/2024987174077432126" rel="noopener noreferrer"&gt;Claws&lt;/a&gt; or spec-driven flows with &lt;a href="https://juxt.github.io/allium/" rel="noopener noreferrer"&gt;Allium&lt;/a&gt;. The point&lt;br&gt;
isn't to adopt a tool vibe-coded by another developer (including &lt;a href="https://github.com/antonmry/breo" rel="noopener noreferrer"&gt;BREO&lt;/a&gt;).&lt;br&gt;
It's to understand the pattern and explore it yourself. Agentic engineering is&lt;br&gt;
going to be a big field in software engineering, and it isn't about just using&lt;br&gt;
tools. It's about understanding how to work with agents in the most effective&lt;br&gt;
way. For that, you need to remove layers of unnecessary code.&lt;/p&gt;

&lt;p&gt;There's a lot of noise and marketing around code agents right now. As usual,&lt;br&gt;
when something goes mainstream, it gets worse and more bloated. But don't forget&lt;br&gt;
the fundamentals: understand how code agents work, master headless mode,&lt;br&gt;
identify the powerful patterns, and wire them into your workflow. That's what&lt;br&gt;
drives personal productivity, not the latest shiny, bloated UI you'll forget in&lt;br&gt;
three days.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffnwu2wzbaarz9tgk41ux.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffnwu2wzbaarz9tgk41ux.jpg" alt="Get React out of my terminal" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>cli</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
