<?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: Aditya P Dixit</title>
    <description>The latest articles on DEV Community by Aditya P Dixit (@hootsworth).</description>
    <link>https://dev.to/hootsworth</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%2F4005747%2Fe8ed1ab9-bcef-444a-b867-f8669ecc20ea.jpg</url>
      <title>DEV Community: Aditya P Dixit</title>
      <link>https://dev.to/hootsworth</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hootsworth"/>
    <language>en</language>
    <item>
      <title>I Think Browser Agents Are Built on the Wrong Abstraction (So I Built a Compiler)</title>
      <dc:creator>Aditya P Dixit</dc:creator>
      <pubDate>Tue, 30 Jun 2026 07:15:54 +0000</pubDate>
      <link>https://dev.to/hootsworth/i-think-browser-agents-are-built-on-the-wrong-abstraction-so-i-built-a-compiler-15b8</link>
      <guid>https://dev.to/hootsworth/i-think-browser-agents-are-built-on-the-wrong-abstraction-so-i-built-a-compiler-15b8</guid>
      <description>&lt;p&gt;Every browser agent starts the same way.&lt;/p&gt;

&lt;p&gt;It downloads HTML.&lt;/p&gt;

&lt;p&gt;Builds a DOM.&lt;/p&gt;

&lt;p&gt;Searches for CSS selectors.&lt;/p&gt;

&lt;p&gt;Finds buttons.&lt;/p&gt;

&lt;p&gt;Waits for JavaScript.&lt;/p&gt;

&lt;p&gt;Clicks something.&lt;/p&gt;

&lt;p&gt;Reads more HTML.&lt;/p&gt;

&lt;p&gt;Repeats.&lt;/p&gt;

&lt;p&gt;We keep making LLMs dramatically smarter...&lt;/p&gt;

&lt;p&gt;...yet we're still asking them to reason over one of the lowest-level representations on the web.&lt;/p&gt;

&lt;p&gt;That felt wrong.&lt;/p&gt;

&lt;p&gt;So I started asking a different question:&lt;/p&gt;

&lt;p&gt;What if websites could be compiled into semantic interfaces instead of being rediscovered every time an AI agent visits them?&lt;/p&gt;

&lt;p&gt;That question eventually became an open-source project called Shiny Fishstick.&lt;/p&gt;

&lt;p&gt;Yes.&lt;/p&gt;

&lt;p&gt;That's actually the name.&lt;/p&gt;

&lt;p&gt;The Problem&lt;/p&gt;

&lt;p&gt;Imagine asking an AI agent to buy a laptop.&lt;/p&gt;

&lt;p&gt;Today, its internal reasoning looks something like this:&lt;/p&gt;

&lt;p&gt;Find login button.&lt;/p&gt;

&lt;p&gt;Click login.&lt;/p&gt;

&lt;p&gt;Wait.&lt;/p&gt;

&lt;p&gt;Find email field.&lt;/p&gt;

&lt;p&gt;Fill email.&lt;/p&gt;

&lt;p&gt;Find password field.&lt;/p&gt;

&lt;p&gt;Fill password.&lt;/p&gt;

&lt;p&gt;Click submit.&lt;/p&gt;

&lt;p&gt;Wait for navigation.&lt;/p&gt;

&lt;p&gt;Search for "Laptop".&lt;/p&gt;

&lt;p&gt;Find Add to Cart.&lt;/p&gt;

&lt;p&gt;Click Add to Cart.&lt;/p&gt;

&lt;p&gt;Now imagine doing that...&lt;/p&gt;

&lt;p&gt;Every.&lt;/p&gt;

&lt;p&gt;Single.&lt;/p&gt;

&lt;p&gt;Time.&lt;/p&gt;

&lt;p&gt;The website hasn't changed.&lt;/p&gt;

&lt;p&gt;The workflow hasn't changed.&lt;/p&gt;

&lt;p&gt;Yet the agent keeps rediscovering it.&lt;/p&gt;

&lt;p&gt;HTML Is A Great Human Interface&lt;/p&gt;

&lt;p&gt;HTML was designed for browsers.&lt;/p&gt;

&lt;p&gt;It tells browsers:&lt;/p&gt;

&lt;p&gt;where text goes&lt;br&gt;
what buttons exist&lt;br&gt;
how pages should render&lt;/p&gt;

&lt;p&gt;An AI agent doesn't care about any of that.&lt;/p&gt;

&lt;p&gt;It doesn't care whether the button is blue.&lt;/p&gt;

&lt;p&gt;It doesn't care whether the developer changed a &lt;/p&gt; to a .

&lt;p&gt;It cares about actions.&lt;/p&gt;

&lt;p&gt;Login&lt;br&gt;
Search&lt;br&gt;
Checkout&lt;br&gt;
Upload File&lt;/p&gt;

&lt;p&gt;Those are semantic concepts.&lt;/p&gt;

&lt;p&gt;HTML doesn't represent them very well.&lt;/p&gt;

&lt;p&gt;Thinking Like A Compiler&lt;/p&gt;

&lt;p&gt;Compiler design has an interesting idea.&lt;/p&gt;

&lt;p&gt;You don't execute source code directly.&lt;/p&gt;

&lt;p&gt;You first transform it into an Intermediate Representation (IR).&lt;/p&gt;

&lt;p&gt;Everything else builds from there.&lt;/p&gt;

&lt;p&gt;I wondered if websites could work the same way.&lt;/p&gt;

&lt;p&gt;Instead of repeatedly reasoning over HTML...&lt;/p&gt;

&lt;p&gt;Compile the website once.&lt;/p&gt;

&lt;p&gt;Generate a reusable semantic representation.&lt;/p&gt;

&lt;p&gt;Enter Preflight&lt;/p&gt;

&lt;p&gt;The compiler produces a specification called preflight.yaml.&lt;/p&gt;

&lt;p&gt;A simplified example:&lt;/p&gt;

&lt;p&gt;version: 1.0.0&lt;/p&gt;

&lt;p&gt;actions:&lt;/p&gt;

&lt;p&gt;login:&lt;br&gt;
    action_type: browser&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;parameters:
  - email
  - password
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;add_to_cart:&lt;br&gt;
    action_type: api&lt;/p&gt;

&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api:
  method: POST
  url: /api/cart/add
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Notice something.&lt;/p&gt;

&lt;p&gt;There's no HTML.&lt;/p&gt;

&lt;p&gt;No XPath.&lt;/p&gt;

&lt;p&gt;No brittle selectors.&lt;/p&gt;

&lt;p&gt;Only actions.&lt;/p&gt;

&lt;p&gt;API Disco&lt;/p&gt;

&lt;p&gt;One of my favorite modules is called API Disco.&lt;/p&gt;

&lt;p&gt;(Yes, that's the real filename.)&lt;/p&gt;

&lt;p&gt;While the crawler performs browser interactions, it watches every network request.&lt;/p&gt;

&lt;p&gt;If it discovers that an action is actually backed by a reusable API...&lt;/p&gt;

&lt;p&gt;The compiler upgrades that action automatically.&lt;/p&gt;

&lt;p&gt;Instead of generating browser automation...&lt;/p&gt;

&lt;p&gt;It generates an API-backed SDK method.&lt;/p&gt;

&lt;p&gt;If no API exists?&lt;/p&gt;

&lt;p&gt;No problem.&lt;/p&gt;

&lt;p&gt;The generated SDK simply falls back to resilient browser execution.&lt;/p&gt;

&lt;p&gt;The developer never has to think about the difference.&lt;/p&gt;

&lt;p&gt;One Specification, Multiple Outputs&lt;/p&gt;

&lt;p&gt;Once the compiler has generated preflight.yaml, everything else becomes code generation.&lt;/p&gt;

&lt;p&gt;Today it produces:&lt;/p&gt;

&lt;p&gt;Python SDKs&lt;br&gt;
TypeScript SDKs&lt;br&gt;
Rust SDKs&lt;br&gt;
MCP Servers&lt;/p&gt;

&lt;p&gt;Tomorrow it could just as easily generate:&lt;/p&gt;

&lt;p&gt;Go SDKs&lt;br&gt;
Java SDKs&lt;br&gt;
C# SDKs&lt;/p&gt;

&lt;p&gt;The compiler doesn't change.&lt;/p&gt;

&lt;p&gt;Only the backend generator does.&lt;/p&gt;

&lt;p&gt;Why I Think This Is Interesting&lt;/p&gt;

&lt;p&gt;The thing I'm most excited about isn't actually the compiler.&lt;/p&gt;

&lt;p&gt;It's the specification.&lt;/p&gt;

&lt;p&gt;Imagine a future where multiple tools understand the same semantic website format.&lt;/p&gt;

&lt;p&gt;Different compilers.&lt;/p&gt;

&lt;p&gt;Different validators.&lt;/p&gt;

&lt;p&gt;Different SDK generators.&lt;/p&gt;

&lt;p&gt;Different execution engines.&lt;/p&gt;

&lt;p&gt;All sharing the same representation.&lt;/p&gt;

&lt;p&gt;That feels much more powerful than another browser automation library.&lt;/p&gt;

&lt;p&gt;Benchmarks&lt;/p&gt;

&lt;p&gt;I also wanted to avoid hand-wavy performance claims.&lt;/p&gt;

&lt;p&gt;So the repository includes public benchmark methodology measuring:&lt;/p&gt;

&lt;p&gt;Token reduction&lt;br&gt;
Execution speed&lt;br&gt;
Reliability&lt;br&gt;
Memory usage&lt;br&gt;
Self-healing capability&lt;br&gt;
Developer implementation effort&lt;/p&gt;

&lt;p&gt;The goal wasn't to "win benchmarks."&lt;/p&gt;

&lt;p&gt;The goal was to make every claim reproducible.&lt;/p&gt;

&lt;p&gt;Is This A Browser Automation Replacement?&lt;/p&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;Some websites simply don't expose reusable APIs.&lt;/p&gt;

&lt;p&gt;Some authentication flows require browser interaction.&lt;/p&gt;

&lt;p&gt;Some workflows are inherently visual.&lt;/p&gt;

&lt;p&gt;Browser automation isn't going away.&lt;/p&gt;

&lt;p&gt;The idea is to separate:&lt;/p&gt;

&lt;p&gt;What an agent wants to do&lt;/p&gt;

&lt;p&gt;from&lt;/p&gt;

&lt;p&gt;How that action gets executed&lt;/p&gt;

&lt;p&gt;Sometimes that's an API.&lt;/p&gt;

&lt;p&gt;Sometimes it's a browser.&lt;/p&gt;

&lt;p&gt;The interface stays the same.&lt;/p&gt;

&lt;p&gt;What's Next?&lt;/p&gt;

&lt;p&gt;The roadmap currently includes:&lt;/p&gt;

&lt;p&gt;More SDK targets (Go &amp;amp; Java)&lt;br&gt;
Better API discovery&lt;br&gt;
Plugin architecture&lt;br&gt;
Visual regression support&lt;br&gt;
Improved compatibility across modern web frameworks&lt;/p&gt;

&lt;p&gt;But more importantly...&lt;/p&gt;

&lt;p&gt;I'd like to hear what other developers think.&lt;/p&gt;

&lt;p&gt;Am I solving the wrong problem?&lt;/p&gt;

&lt;p&gt;Is there a better abstraction?&lt;/p&gt;

&lt;p&gt;Could something like preflight.yaml actually become useful outside this project?&lt;/p&gt;

&lt;p&gt;I'd genuinely love the discussion.&lt;/p&gt;

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

&lt;p&gt;🌐 Website&lt;/p&gt;

&lt;p&gt;&lt;a href="https://adityapdixit.me/shiny-fishstick/" rel="noopener noreferrer"&gt;https://adityapdixit.me/shiny-fishstick/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐ GitHub&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Hootsworth/shiny-fishstick" rel="noopener noreferrer"&gt;https://github.com/Hootsworth/shiny-fishstick&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If nothing else, I hope the name made you curious enough to click.&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp1ackw2jly62yjuxqnkl.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%2Fp1ackw2jly62yjuxqnkl.png" alt=" " width="800" height="572"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>computerscience</category>
      <category>api</category>
    </item>
    <item>
      <title>I Got Tired of AI Agents Having Root Access to Everything, So I Built XRisk</title>
      <dc:creator>Aditya P Dixit</dc:creator>
      <pubDate>Sat, 27 Jun 2026 19:13:01 +0000</pubDate>
      <link>https://dev.to/hootsworth/i-got-tired-of-ai-agents-having-root-access-to-everything-so-i-built-xrisk-11k5</link>
      <guid>https://dev.to/hootsworth/i-got-tired-of-ai-agents-having-root-access-to-everything-so-i-built-xrisk-11k5</guid>
      <description>&lt;p&gt;Everyone is building AI agents.&lt;/p&gt;

&lt;p&gt;Very few people are building the thing that sits between an AI agent and a disastrous decision.&lt;/p&gt;

&lt;p&gt;That's why I built XRisk.&lt;/p&gt;

&lt;p&gt;XRisk is an open-source autonomous safety engine that acts as a decision layer between an AI agent and the real world.&lt;/p&gt;

&lt;p&gt;Instead of blindly executing an action, an agent asks XRisk:&lt;/p&gt;

&lt;p&gt;"Should I actually do this?"&lt;/p&gt;

&lt;p&gt;XRisk responds with one of three deterministic decisions:&lt;/p&gt;

&lt;p&gt;✅ Allow&lt;br&gt;
⚠️ Confirm&lt;br&gt;
❌ Block&lt;br&gt;
Why I Started This Project&lt;/p&gt;

&lt;p&gt;As I experimented with increasingly autonomous AI systems, I noticed the same pattern over and over again.&lt;/p&gt;

&lt;p&gt;Most projects focused on making agents more capable.&lt;/p&gt;

&lt;p&gt;Almost nobody was asking:&lt;/p&gt;

&lt;p&gt;"What happens when the agent is wrong?"&lt;/p&gt;

&lt;p&gt;Consider a few examples.&lt;/p&gt;

&lt;p&gt;An agent accidentally leaks API keys.&lt;br&gt;
A prompt injection convinces it to ignore previous instructions.&lt;br&gt;
A model decides to execute a shell command.&lt;br&gt;
An autonomous workflow loops forever and keeps calling expensive APIs.&lt;br&gt;
A deployment bot pushes code without human approval.&lt;/p&gt;

&lt;p&gt;Most agent frameworks assume the model behaves.&lt;/p&gt;

&lt;p&gt;Reality doesn't.&lt;/p&gt;

&lt;p&gt;I wanted something deterministic sitting between intention and execution.&lt;/p&gt;

&lt;p&gt;Not another model.&lt;/p&gt;

&lt;p&gt;Not another prompt.&lt;/p&gt;

&lt;p&gt;An actual policy engine.&lt;/p&gt;

&lt;p&gt;What XRisk Does&lt;/p&gt;

&lt;p&gt;XRisk evaluates every proposed action before it's executed.&lt;/p&gt;

&lt;p&gt;It combines multiple safety signals into a single explainable decision.&lt;/p&gt;

&lt;p&gt;Some of the things it checks include:&lt;/p&gt;

&lt;p&gt;Policy-as-code with layered precedence&lt;br&gt;
Prompt injection detection&lt;br&gt;
Sensitive data and secret detection&lt;br&gt;
Capability token validation&lt;br&gt;
Network egress restrictions&lt;br&gt;
Circuit breakers for autonomous loops&lt;br&gt;
Tamper-evident audit logs&lt;br&gt;
Supply-chain verification&lt;br&gt;
Policy conflict detection&lt;br&gt;
Deterministic forensic replay&lt;/p&gt;

&lt;p&gt;Instead of a mysterious "Safety Score: 67%," XRisk explains why it made a decision.&lt;/p&gt;

&lt;p&gt;Example&lt;/p&gt;

&lt;p&gt;Imagine an AI assistant wants to execute:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "tool": "deploy",&lt;br&gt;
  "actor": "release-bot",&lt;br&gt;
  "prompt": "Deploy production immediately."&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Instead of sending that directly to your deployment system...&lt;/p&gt;

&lt;p&gt;XRisk intercepts it.&lt;/p&gt;

&lt;p&gt;It evaluates:&lt;/p&gt;

&lt;p&gt;Does policy require approval?&lt;br&gt;
Is the actor allowed to deploy?&lt;br&gt;
Is the destination trusted?&lt;br&gt;
Are capability tokens valid?&lt;br&gt;
Does this resemble prompt injection?&lt;br&gt;
Is this part of a dangerous execution loop?&lt;/p&gt;

&lt;p&gt;Only then does it decide whether to:&lt;/p&gt;

&lt;p&gt;Allow&lt;br&gt;
Confirm&lt;br&gt;
Block&lt;br&gt;
One Design Decision I Feel Strongly About&lt;/p&gt;

&lt;p&gt;I deliberately avoided using another LLM to make safety decisions.&lt;/p&gt;

&lt;p&gt;LLMs are excellent at generating text.&lt;/p&gt;

&lt;p&gt;Policy enforcement should be deterministic.&lt;/p&gt;

&lt;p&gt;If an action is blocked, I want to know exactly why it was blocked.&lt;/p&gt;

&lt;p&gt;Every decision should be reproducible.&lt;/p&gt;

&lt;p&gt;Every audit should be explainable.&lt;/p&gt;

&lt;p&gt;Every policy should be inspectable.&lt;/p&gt;

&lt;p&gt;That's the philosophy behind XRisk.&lt;/p&gt;

&lt;p&gt;What's Next&lt;/p&gt;

&lt;p&gt;I'm currently working toward:&lt;/p&gt;

&lt;p&gt;Threat intelligence correlation&lt;br&gt;
Zero-trust workload identities&lt;br&gt;
Autonomous containment&lt;br&gt;
Adversarial simulation&lt;br&gt;
Multi-party approval workflows&lt;/p&gt;

&lt;p&gt;The long-term vision is to make XRisk a reusable security layer that can sit in front of any AI agent, regardless of framework.&lt;/p&gt;

&lt;p&gt;I'd Love Feedback&lt;/p&gt;

&lt;p&gt;This project is still evolving, and I'd genuinely appreciate feedback from people building AI systems.&lt;/p&gt;

&lt;p&gt;Some questions I'm particularly interested in:&lt;/p&gt;

&lt;p&gt;What attack vectors am I missing?&lt;br&gt;
Which policies would you want in production?&lt;br&gt;
What integrations would make this more useful?&lt;br&gt;
How would you design a safety engine differently?&lt;/p&gt;

&lt;p&gt;If you'd like to contribute, open an issue, suggest improvements, or submit a PR. Even small documentation fixes are welcome.&lt;/p&gt;

&lt;p&gt;Thanks for reading—I hope XRisk becomes something that helps make AI systems not just more capable, but more trustworthy.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://github.com/Hootsworth/XRisk" rel="noopener noreferrer"&gt;https://github.com/Hootsworth/XRisk&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>security</category>
    </item>
  </channel>
</rss>
