<?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: crovia</title>
    <description>The latest articles on DEV Community by crovia (@croviatrust).</description>
    <link>https://dev.to/croviatrust</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%2F3938881%2Fcc2ce06a-3947-436d-9fb0-cdc75b0398b6.png</url>
      <title>DEV Community: crovia</title>
      <link>https://dev.to/croviatrust</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/croviatrust"/>
    <language>en</language>
    <item>
      <title>Git tells you what changed. Causari tells you why.</title>
      <dc:creator>crovia</dc:creator>
      <pubDate>Wed, 08 Jul 2026 18:56:48 +0000</pubDate>
      <link>https://dev.to/croviatrust/git-tells-you-what-changed-causari-tells-you-why-24lo</link>
      <guid>https://dev.to/croviatrust/git-tells-you-what-changed-causari-tells-you-why-24lo</guid>
      <description>&lt;p&gt;AI coding agents are becoming good enough to touch real codebases.&lt;/p&gt;

&lt;p&gt;They can refactor files, write tests, change architecture, move logic around, and sometimes modify more code in ten minutes than a human would in an afternoon.&lt;/p&gt;

&lt;p&gt;That is powerful.&lt;/p&gt;

&lt;p&gt;But it creates a new debugging problem.&lt;/p&gt;

&lt;p&gt;Git can tell you &lt;strong&gt;what changed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When an AI agent was involved, you often need to know something deeper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why did this change happen?&lt;/li&gt;
&lt;li&gt;Which prompt caused this line?&lt;/li&gt;
&lt;li&gt;Which model produced it?&lt;/li&gt;
&lt;li&gt;What files did the agent read before writing it?&lt;/li&gt;
&lt;li&gt;What later changes depended on this agent action?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the problem I wanted to solve with &lt;strong&gt;Causari&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Causari is a local CLI for &lt;strong&gt;intent-addressable code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It records AI agent actions as causal events: prompts, models, reads, writes, diffs, reasoning, cost, and relationships between actions.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Git tracks bytes. Causari tracks intent and causality.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/croviatrust/causari" rel="noopener noreferrer"&gt;https://github.com/croviatrust/causari&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Website: &lt;a href="https://causari.dev" rel="noopener noreferrer"&gt;https://causari.dev&lt;/a&gt;&lt;/p&gt;


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

&lt;p&gt;When a human developer changes code, there is usually some context.&lt;/p&gt;

&lt;p&gt;A commit message.&lt;br&gt;&lt;br&gt;
A pull request.&lt;br&gt;&lt;br&gt;
A ticket.&lt;br&gt;&lt;br&gt;
A discussion.&lt;br&gt;&lt;br&gt;
A design decision.&lt;/p&gt;

&lt;p&gt;With AI coding agents, the workflow is different.&lt;/p&gt;

&lt;p&gt;You ask something 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;Refactor the auth flow and add JWT refresh logic.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent reads files, makes assumptions, writes code, maybe fixes tests, maybe changes something unrelated, then moves on.&lt;/p&gt;

&lt;p&gt;At the end, you have a diff.&lt;/p&gt;

&lt;p&gt;But the diff does not tell the full story.&lt;/p&gt;

&lt;p&gt;A suspicious line appears in &lt;code&gt;auth.ts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Git can show when the line appeared.&lt;/p&gt;

&lt;p&gt;But Git cannot answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;which prompt produced this exact line?
what completion did it come from?
did the agent read the right files first?
was this part of the original request or an accidental side effect?
if I revert this, what downstream work am I also undoing?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gap becomes bigger as agents become more autonomous.&lt;/p&gt;

&lt;p&gt;The more work agents do, the more we need provenance.&lt;/p&gt;

&lt;p&gt;Not only code provenance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intent provenance.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The idea: intent-addressable code
&lt;/h2&gt;

&lt;p&gt;Causari treats an AI agent action as something that should be traceable.&lt;/p&gt;

&lt;p&gt;Not just as a Git diff.&lt;/p&gt;

&lt;p&gt;But as an event with cause and effect.&lt;/p&gt;

&lt;p&gt;An event can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the prompt&lt;/li&gt;
&lt;li&gt;the model&lt;/li&gt;
&lt;li&gt;the files read&lt;/li&gt;
&lt;li&gt;the files written&lt;/li&gt;
&lt;li&gt;the diff&lt;/li&gt;
&lt;li&gt;the reasoning or message&lt;/li&gt;
&lt;li&gt;token and cost information&lt;/li&gt;
&lt;li&gt;the causal relationship with previous and later events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So instead of only asking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;what changed in this file?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;why does this line exist?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re why src/auth.ts:42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re trace src/auth.ts:42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re impact &amp;lt;event-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the core of Causari.&lt;/p&gt;

&lt;p&gt;It is not trying to replace Git.&lt;/p&gt;

&lt;p&gt;Git is still the source of truth for version control.&lt;/p&gt;

&lt;p&gt;Causari sits next to it and answers a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Git answers what changed.&lt;br&gt;&lt;br&gt;
Causari answers why the agent changed it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Capturing provenance without trusting the agent
&lt;/h2&gt;

&lt;p&gt;One thing I did not want was a system that only works if the AI agent politely reports what it did.&lt;/p&gt;

&lt;p&gt;That is fragile.&lt;/p&gt;

&lt;p&gt;Agents forget.&lt;br&gt;&lt;br&gt;
Tools differ.&lt;br&gt;&lt;br&gt;
IDE integrations are inconsistent.&lt;br&gt;&lt;br&gt;
Some agents expose hooks, others do not.&lt;br&gt;&lt;br&gt;
Some workflows happen through proxies, some through local tools, some through editors.&lt;/p&gt;

&lt;p&gt;So Causari has multiple capture paths.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. &lt;code&gt;re proxy&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Causari can run as a local OpenAI-compatible or Anthropic-compatible LLM proxy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re proxy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your agent sends requests through it.&lt;/p&gt;

&lt;p&gt;Causari sees the prompt, completion, model, tokens, and cost as they pass through.&lt;/p&gt;

&lt;p&gt;The request still goes to the provider.&lt;/p&gt;

&lt;p&gt;The difference is that the interaction becomes part of a local causal ledger.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;re watch&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Causari can also watch the filesystem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re watch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When files change, Causari records snapshots and diffs.&lt;/p&gt;

&lt;p&gt;Then it tries to connect the code that appeared on disk with the completions captured through the proxy.&lt;/p&gt;

&lt;p&gt;If a completion generated a block of code, and seconds later that same code appears in a file, that is a causal fingerprint.&lt;/p&gt;

&lt;p&gt;The provenance is no longer only a self-report.&lt;/p&gt;

&lt;p&gt;It is observed from two independent streams:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LLM traffic + filesystem changes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. &lt;code&gt;re hook&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Where an agent exposes lifecycle hooks, Causari can capture more directly.&lt;/p&gt;

&lt;p&gt;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;re hook claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows native capture from the agent runtime when available.&lt;/p&gt;

&lt;p&gt;So Causari can work in layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;proxy capture
filesystem capture
native hook capture
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The more signals available, the more precise the provenance becomes.&lt;/p&gt;




&lt;h2&gt;
  
  
  What you can ask Causari
&lt;/h2&gt;

&lt;p&gt;Once actions are recorded, you can query the causal history.&lt;/p&gt;

&lt;p&gt;Some examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re why src/auth.ts:42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Show what produced a specific line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re trace src/auth.ts:42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Show the upstream causal chain behind that line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re impact &amp;lt;event-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Show the downstream blast radius of an agent action.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re lens src/auth.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Render a file with per-line provenance annotations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re find &lt;span class="s2"&gt;"JWT refactor"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Search prompts, messages, reasoning, and events.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re bisect &lt;span class="nt"&gt;--test&lt;/span&gt; &lt;span class="s2"&gt;"npm test"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find which agent action broke the build.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re churn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Measure how much AI-generated code survived versus got rewritten.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re report &lt;span class="nt"&gt;--open&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate a local report or dashboard.&lt;/p&gt;

&lt;p&gt;This is the part I find most interesting.&lt;/p&gt;

&lt;p&gt;With normal version control, the unit of analysis is usually the commit.&lt;/p&gt;

&lt;p&gt;With AI agents, the more useful unit may be the &lt;strong&gt;agent action&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A single commit may contain 30 agent decisions.&lt;/p&gt;

&lt;p&gt;Causari tries to make those decisions inspectable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;At small scale, this may feel like overkill.&lt;/p&gt;

&lt;p&gt;If you ask an agent to write a small helper function, maybe you do not care about causal provenance.&lt;/p&gt;

&lt;p&gt;But as soon as agents start making larger changes, the workflow changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debugging regressions
&lt;/h3&gt;

&lt;p&gt;A test breaks after many AI-assisted edits.&lt;/p&gt;

&lt;p&gt;Instead of reading chat logs manually, you can ask which agent action introduced the break.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re bisect &lt;span class="nt"&gt;--test&lt;/span&gt; &lt;span class="s2"&gt;"npm test"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reviewing AI-generated code
&lt;/h3&gt;

&lt;p&gt;A reviewer sees a strange line.&lt;/p&gt;

&lt;p&gt;Instead of asking "who wrote this?", they can ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re why path/to/file.ts:120
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And inspect the prompt and context behind it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding downstream risk
&lt;/h3&gt;

&lt;p&gt;Before reverting an AI action, you can ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re impact &amp;lt;event-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because later changes may depend on that action.&lt;/p&gt;

&lt;h3&gt;
  
  
  Measuring wasted AI work
&lt;/h3&gt;

&lt;p&gt;If an agent writes a lot of code that gets rewritten shortly after, that matters.&lt;/p&gt;

&lt;p&gt;Not only because of cost.&lt;/p&gt;

&lt;p&gt;Because it may reveal bad prompts, bad context, bad model choice, or bad workflow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re churn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes AI coding work measurable in a way that normal Git history does not.&lt;/p&gt;




&lt;h2&gt;
  
  
  Local-first by design
&lt;/h2&gt;

&lt;p&gt;Causari is built as a local developer tool.&lt;/p&gt;

&lt;p&gt;The ledger lives in your repo under:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;.causari/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is not to send your code or prompts to a third-party dashboard.&lt;/p&gt;

&lt;p&gt;The goal is to make the agent activity around your own codebase inspectable locally.&lt;/p&gt;

&lt;p&gt;Causari is written in Rust and uses content addressing for events.&lt;/p&gt;

&lt;p&gt;The repository describes it as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;intent-addressable code for AI agents&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That phrase is important to me.&lt;/p&gt;

&lt;p&gt;Because I do not think the future of AI coding is only "generate more code faster".&lt;/p&gt;

&lt;p&gt;I think the next problem is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can we understand, verify, replay, and debug what the agent did?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Skills: turning verified work into reusable experience
&lt;/h2&gt;

&lt;p&gt;Causari also has an experimental skill layer.&lt;/p&gt;

&lt;p&gt;The idea is that completed, verified work can be distilled into signed reusable units.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re skill distill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A skill can contain the task, the steps, the files changed, and the outcome.&lt;/p&gt;

&lt;p&gt;Then it can be exported:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re skill &lt;span class="nb"&gt;export&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And verified later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re skill verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is still early, but the idea is important:&lt;/p&gt;

&lt;p&gt;Agents should not repeat the same mistake forever.&lt;/p&gt;

&lt;p&gt;If a repository already has a verified solution to a class of problem, the next agent should be able to recall that experience before acting.&lt;/p&gt;

&lt;p&gt;Not as vague memory.&lt;/p&gt;

&lt;p&gt;As signed, local, inspectable provenance.&lt;/p&gt;




&lt;h2&gt;
  
  
  A small example
&lt;/h2&gt;

&lt;p&gt;Imagine this prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add JWT refresh logic that rotates tokens every 24 hours.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent modifies &lt;code&gt;auth.py&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Later, you inspect a line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re why auth.py:42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Causari can show that the line came from that prompt, which model produced it, and which event introduced it.&lt;/p&gt;

&lt;p&gt;Then you can ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re trace auth.py:42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To see the upstream context.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;re impact &amp;lt;event-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To see what later work depended on it.&lt;/p&gt;

&lt;p&gt;That is the workflow I want:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;not only code review,
but intent review.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What I am looking for feedback on
&lt;/h2&gt;

&lt;p&gt;Causari is still young, and I would love feedback from developers who are using tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cursor&lt;/li&gt;
&lt;li&gt;Claude Code&lt;/li&gt;
&lt;li&gt;Cline&lt;/li&gt;
&lt;li&gt;Windsurf&lt;/li&gt;
&lt;li&gt;Aider&lt;/li&gt;
&lt;li&gt;Continue&lt;/li&gt;
&lt;li&gt;other agentic coding workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main questions I am trying to answer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Would you use provenance/debugging like this in your AI coding workflow?&lt;/li&gt;
&lt;li&gt;Is "which prompt caused this line?" a problem you already feel?&lt;/li&gt;
&lt;li&gt;Should this live mostly as a CLI, an IDE extension, an MCP server, or all of them?&lt;/li&gt;
&lt;li&gt;Is the &lt;code&gt;re proxy + re watch&lt;/code&gt; capture model practical enough for real developers?&lt;/li&gt;
&lt;li&gt;What would make you trust or adopt a tool like this?&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Closing thought
&lt;/h2&gt;

&lt;p&gt;AI agents are starting to write and rewrite real software.&lt;/p&gt;

&lt;p&gt;That means our tools need to evolve.&lt;/p&gt;

&lt;p&gt;Git gave developers a way to track changes.&lt;/p&gt;

&lt;p&gt;But AI-generated code needs another layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;intent
causality
provenance
impact
replay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is what I am trying to explore with Causari.&lt;/p&gt;

&lt;p&gt;If this problem feels real to you, I would love your feedback.&lt;/p&gt;

&lt;p&gt;What would you want from a tool like this before trusting it in a real codebase?&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/croviatrust/causari" rel="noopener noreferrer"&gt;https://github.com/croviatrust/causari&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Website: &lt;a href="https://causari.dev" rel="noopener noreferrer"&gt;https://causari.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>devtools</category>
      <category>rust</category>
    </item>
    <item>
      <title>I built a GitHub Action that works with any stack — here's how</title>
      <dc:creator>crovia</dc:creator>
      <pubDate>Fri, 29 May 2026 18:18:40 +0000</pubDate>
      <link>https://dev.to/croviatrust/i-built-a-github-action-that-works-with-any-stack-heres-how-2h2k</link>
      <guid>https://dev.to/croviatrust/i-built-a-github-action-that-works-with-any-stack-heres-how-2h2k</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Every time I clone a repo, I have to figure out how to run it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go project? &lt;code&gt;go test ./...&lt;/code&gt; — unless it uses &lt;code&gt;make test&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Node project? &lt;code&gt;npm test&lt;/code&gt; — unless it uses &lt;code&gt;pnpm&lt;/code&gt; or &lt;code&gt;yarn&lt;/code&gt; or &lt;code&gt;bun&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rust? &lt;code&gt;cargo test&lt;/code&gt;. Python? Could be &lt;code&gt;pytest&lt;/code&gt;, &lt;code&gt;python -m unittest&lt;/code&gt;, or &lt;code&gt;poetry run pytest&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is fine for my own projects. But when I'm reviewing a PR, onboarding a new teammate, or setting up CI for a polyglot team, it becomes noise.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;rex&lt;/strong&gt; is a single Go binary that detects your project's stack and runs the right command. No config file. No reading the README.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/someone/unknown-project
&lt;span class="nb"&gt;cd &lt;/span&gt;unknown-project
rex &lt;span class="nb"&gt;test&lt;/span&gt;   &lt;span class="c"&gt;# it just works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;The detection logic is surprisingly simple — and that's the point.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: File scanning
&lt;/h3&gt;

&lt;p&gt;rex walks your project root and looks for known files:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Stack&lt;/th&gt;
&lt;th&gt;Package manager&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go.mod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;go modules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;package.json&lt;/code&gt; + &lt;code&gt;pnpm-lock.yaml&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Node&lt;/td&gt;
&lt;td&gt;pnpm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cargo.toml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;cargo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;pyproject.toml&lt;/code&gt; + &lt;code&gt;uv.lock&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;uv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pom.xml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Maven&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;build.gradle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Gradle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Gemfile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ruby&lt;/td&gt;
&lt;td&gt;bundler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;composer.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;composer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mix.exs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Elixir&lt;/td&gt;
&lt;td&gt;mix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;build.zig&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Zig&lt;/td&gt;
&lt;td&gt;zig&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This happens in &lt;strong&gt;&amp;lt;50ms&lt;/strong&gt; because it's just &lt;code&gt;os.Stat&lt;/code&gt; calls — no network, no parsing heavy files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Command mapping
&lt;/h3&gt;

&lt;p&gt;Once the stack is known, rex maps standard verbs to the right tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Go&lt;/span&gt;
&lt;span class="n"&gt;test&lt;/span&gt;  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"go test ./..."&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt;   &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"go run ./cmd/server"&lt;/span&gt;
&lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"go build ./..."&lt;/span&gt;

&lt;span class="c"&gt;// Node (pnpm)&lt;/span&gt;
&lt;span class="n"&gt;test&lt;/span&gt;  &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"pnpm test"&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt;   &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"pnpm run dev"&lt;/span&gt;
&lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"pnpm run build"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Priority chain (the smart part)
&lt;/h3&gt;

&lt;p&gt;rex doesn't blindly guess. It respects what's already there:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="err"&gt;1.&lt;/span&gt; &lt;span class="err"&gt;Justfile&lt;/span&gt; &lt;span class="err"&gt;/&lt;/span&gt; &lt;span class="err"&gt;Makefile&lt;/span&gt; &lt;span class="err"&gt;(task&lt;/span&gt; &lt;span class="err"&gt;runner&lt;/span&gt; &lt;span class="err"&gt;overrides&lt;/span&gt; &lt;span class="err"&gt;everything)&lt;/span&gt;
&lt;span class="err"&gt;2.&lt;/span&gt; &lt;span class="err"&gt;package.json&lt;/span&gt; &lt;span class="err"&gt;scripts&lt;/span&gt; &lt;span class="err"&gt;/&lt;/span&gt; &lt;span class="err"&gt;Cargo.toml&lt;/span&gt; &lt;span class="err"&gt;/&lt;/span&gt; &lt;span class="err"&gt;go.mod&lt;/span&gt; &lt;span class="err"&gt;(ecosystem&lt;/span&gt; &lt;span class="err"&gt;native)&lt;/span&gt;
&lt;span class="err"&gt;3.&lt;/span&gt; &lt;span class="err"&gt;Language&lt;/span&gt; &lt;span class="err"&gt;heuristics&lt;/span&gt; &lt;span class="err"&gt;(fallback)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a Makefile defines a &lt;code&gt;test&lt;/code&gt; target, &lt;code&gt;rex test&lt;/code&gt; runs &lt;code&gt;make test&lt;/code&gt; — even in a Go project.&lt;/p&gt;

&lt;h2&gt;
  
  
  The GitHub Action
&lt;/h2&gt;

&lt;p&gt;The most interesting part is how this became a &lt;strong&gt;GitHub Action&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of requiring Go to be installed in the runner, the action downloads the correct binary directly from the release page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rexrun-dev/rex@v0.4.0&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single step replaces 10+ lines of stack-specific YAML. Works for all 12 supported languages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why composite actions?
&lt;/h3&gt;

&lt;p&gt;I used GitHub's composite action type instead of Docker. Why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Faster&lt;/strong&gt;: no container startup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smaller&lt;/strong&gt;: no image to pull&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portable&lt;/strong&gt;: works on any runner (ubuntu, macOS, Windows)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trade-off? The install script has to handle OS/arch detection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;OS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;'[:upper:]'&lt;/span&gt; &lt;span class="s1"&gt;'[:lower:]'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ARCH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in
  &lt;/span&gt;x86_64&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"amd64"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
  aarch64|arm64&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"arm64"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="nv"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/rexrun-dev/rex/releases/download/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/rex_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="p"&gt;#v&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz"&lt;/span&gt;
curl &lt;span class="nt"&gt;-sL&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tar &lt;/span&gt;xz &lt;span class="nt"&gt;-C&lt;/span&gt; /usr/local/bin rex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Watch mode
&lt;/h2&gt;

&lt;p&gt;A recent addition: &lt;code&gt;rex watch&lt;/code&gt; polls the filesystem and re-runs your command on change.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rex watch &lt;span class="nb"&gt;test&lt;/span&gt;   &lt;span class="c"&gt;# re-run tests when files change&lt;/span&gt;
rex watch build  &lt;span class="c"&gt;# re-build on change&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's not using inotify or fsnotify — just a lightweight polling loop with hash-based change detection. This makes it portable across all platforms without CGO or platform-specific dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  CI generator
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;rex ci&lt;/code&gt; generates a GitHub Actions workflow file customized for your detected stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;rex ci
✓ created .github/workflows/ci.yml &lt;span class="o"&gt;(&lt;/span&gt;go project&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated YAML uses the official setup actions for each language (setup-go, setup-node, setup-python, etc.) and runs the correct test command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Binary size&lt;/strong&gt;: ~3.5 MB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Startup time&lt;/strong&gt;: &amp;lt;50ms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Languages supported&lt;/strong&gt;: 12&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines of Go&lt;/strong&gt;: ~2,000&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero runtime dependencies&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap rexrun-dev/tap &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew &lt;span class="nb"&gt;install &lt;/span&gt;rex
&lt;span class="c"&gt;# or&lt;/span&gt;
go &lt;span class="nb"&gt;install &lt;/span&gt;rexrun.dev/rex/cmd/rex@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or try the interactive playground at &lt;a href="https://rexrun.dev" rel="noopener noreferrer"&gt;rexrun.dev&lt;/a&gt; — paste any GitHub repo URL and see what rex would detect.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/rexrun-dev/rex" rel="noopener noreferrer"&gt;github.com/rexrun-dev/rex&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Marketplace&lt;/strong&gt;: &lt;a href="https://github.com/marketplace/actions/rex-universal-project-runner" rel="noopener noreferrer"&gt;github.com/marketplace/actions/rex-universal-project-runner&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>cli</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built a CLI that eliminates README reading forever</title>
      <dc:creator>crovia</dc:creator>
      <pubDate>Thu, 21 May 2026 16:02:26 +0000</pubDate>
      <link>https://dev.to/croviatrust/i-built-a-cli-that-eliminates-readme-reading-forever-4794</link>
      <guid>https://dev.to/croviatrust/i-built-a-cli-that-eliminates-readme-reading-forever-4794</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Every developer knows this pain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone a repo&lt;/li&gt;
&lt;li&gt;Want to run the tests&lt;/li&gt;
&lt;li&gt;Open the README&lt;/li&gt;
&lt;li&gt;Scroll... scroll... find a "Development" section... maybe&lt;/li&gt;
&lt;li&gt;Figure out it's &lt;code&gt;pnpm test&lt;/code&gt; (not &lt;code&gt;npm test&lt;/code&gt;, not &lt;code&gt;yarn test&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Run it wrong anyway because you needed &lt;code&gt;pnpm install&lt;/code&gt; first&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Multiply this by every repo you touch. Every PR you review. Every onboarding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I got tired of it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution: rex
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/some/repo
&lt;span class="nb"&gt;cd &lt;/span&gt;repo
rex &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Rex looks at your project files, detects the stack, and runs the correct command. No config. No setup. No reading anything.&lt;/p&gt;

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

&lt;p&gt;Rex reads files in your project root:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File found&lt;/th&gt;
&lt;th&gt;Stack detected&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;rex test&lt;/code&gt; runs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;go.mod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;&lt;code&gt;go test ./...&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;package.json&lt;/code&gt; + &lt;code&gt;pnpm-lock.yaml&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Node + pnpm&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pnpm test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cargo.toml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cargo test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;pyproject.toml&lt;/code&gt; + &lt;code&gt;uv.lock&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Python + uv&lt;/td&gt;
&lt;td&gt;&lt;code&gt;uv run pytest&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;composer.json&lt;/code&gt; + &lt;code&gt;artisan&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;PHP + Laravel&lt;/td&gt;
&lt;td&gt;&lt;code&gt;php artisan test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Gemfile&lt;/code&gt; + &lt;code&gt;app/&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Ruby + Rails&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bundle exec rails test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pom.xml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Java + Maven&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mvn test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;build.gradle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Java + Gradle&lt;/td&gt;
&lt;td&gt;&lt;code&gt;./gradlew test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;build.zig&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Zig&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zig build test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mix.exs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Elixir&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mix test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Makefile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Make&lt;/td&gt;
&lt;td&gt;&lt;code&gt;make test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Justfile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Just&lt;/td&gt;
&lt;td&gt;&lt;code&gt;just test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;12 ecosystems.&lt;/strong&gt; It also detects which package manager you use by looking at lockfiles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/rexrun-dev/rex/releases/download/v0.2.0/demo.mp4" rel="noopener noreferrer"&gt;Watch the video demo&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-go-project/
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rex
&lt;span class="go"&gt;
  my-go-project

  stack  go

  commands
    rex test   go test ./...
    rex run    go run ./cmd/server
    rex build  go build ./...
    rex deps   go mod download
    rex fmt    gofmt -w .
    rex lint   go vet ./...

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rex &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;go &lt;span class="nb"&gt;test&lt;/span&gt; ./...
&lt;span class="go"&gt;ok   github.com/example/app   1.2s
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;&amp;gt;&lt;/code&gt; arrow always shows exactly what rex will run. Full transparency.&lt;/p&gt;

&lt;h2&gt;
  
  
  All the verbs
&lt;/h2&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;rex test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rex run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start the app / dev server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rex build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Build the project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rex deps&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Install dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rex clean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove build artifacts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rex fresh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;clean, deps, build in sequence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rex fmt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Format code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rex lint&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lint code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rex clone &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clone + detect + install deps in one command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rex init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generate rex.toml for your team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rex doctor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Diagnose environment issues&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Killer feature: rex clone
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rex clone https://github.com/someone/project
&lt;span class="c"&gt;# cloning...&lt;/span&gt;
&lt;span class="c"&gt;# detected: node + pnpm&lt;/span&gt;
&lt;span class="c"&gt;# deps: pnpm install&lt;/span&gt;
&lt;span class="c"&gt;# ready! cd project &amp;amp;&amp;amp; rex run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From URL to working project in one command. No README needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monorepo support
&lt;/h2&gt;

&lt;p&gt;Rex auto-detects monorepos (packages/, apps/, services/):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rex
&lt;span class="go"&gt;
  my-monorepo (monorepo)

  workspace  3 sub-projects detected

    packages/api         node + pnpm
    packages/web         node + pnpm
    services/auth        go
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Team workflow: rex init
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rex init
&lt;span class="c"&gt;# created rex.toml (go project)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generates a rex.toml from detected commands. Commit it. Now every teammate runs the same commands without asking.&lt;/p&gt;

&lt;h2&gt;
  
  
  .env loading
&lt;/h2&gt;

&lt;p&gt;Rex automatically loads &lt;code&gt;.env&lt;/code&gt; files before running commands. No extra tools needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;I maintain projects across Go, Node, Python, and Rust. I context-switch between repos dozens of times per day. The cognitive load of remembering &lt;code&gt;pnpm test&lt;/code&gt; vs &lt;code&gt;go test ./...&lt;/code&gt; vs &lt;code&gt;cargo test&lt;/code&gt; is small individually, but it adds up.&lt;/p&gt;

&lt;p&gt;Rex makes every repo feel the same:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rex &lt;span class="nb"&gt;test&lt;/span&gt;   &lt;span class="c"&gt;# always works&lt;/span&gt;
rex run    &lt;span class="c"&gt;# always works&lt;/span&gt;
rex build  &lt;span class="c"&gt;# always works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's the muscle memory tax I no longer pay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Single binary, no runtime, no dependencies&lt;/li&gt;
&lt;li&gt;Written in Go, cross-platform&lt;/li&gt;
&lt;li&gt;Less than 50ms startup, faster than your shell prompt&lt;/li&gt;
&lt;li&gt;Zero network calls, fully offline&lt;/li&gt;
&lt;li&gt;Correct exit codes, works in CI&lt;/li&gt;
&lt;li&gt;Shell completions for bash, zsh, fish&lt;/li&gt;
&lt;li&gt;Apache 2.0 license&lt;/li&gt;
&lt;li&gt;Mentioned in &lt;a href="https://github.com/avelino/awesome-go" rel="noopener noreferrer"&gt;Awesome Go&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Homebrew (macOS/Linux)&lt;/span&gt;
brew tap rexrun-dev/tap &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew &lt;span class="nb"&gt;install &lt;/span&gt;rex

&lt;span class="c"&gt;# Go&lt;/span&gt;
go &lt;span class="nb"&gt;install &lt;/span&gt;rexrun.dev/rex/cmd/rex@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or grab a binary from &lt;a href="https://github.com/rexrun-dev/rex/releases" rel="noopener noreferrer"&gt;GitHub Releases&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/rexrun-dev/rex" rel="noopener noreferrer"&gt;github.com/rexrun-dev/rex&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Website: &lt;a href="https://rexrun.dev" rel="noopener noreferrer"&gt;rexrun.dev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this solves a pain you've felt, star the repo. If you want a stack added, open an issue.&lt;/p&gt;

</description>
      <category>go</category>
      <category>cli</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
