<?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: Danni Friedland</title>
    <description>The latest articles on DEV Community by Danni Friedland (@bluehotdog).</description>
    <link>https://dev.to/bluehotdog</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%2F2242704%2F98546331-c9b1-4fda-8107-fe398e59d2d3.png</url>
      <title>DEV Community: Danni Friedland</title>
      <link>https://dev.to/bluehotdog</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bluehotdog"/>
    <language>en</language>
    <item>
      <title>Add Runtime Context to Your AI Coding Workflow (Next.js + Frontman)</title>
      <dc:creator>Danni Friedland</dc:creator>
      <pubDate>Wed, 04 Mar 2026 11:51:21 +0000</pubDate>
      <link>https://dev.to/bluehotdog/add-runtime-context-to-your-ai-coding-workflow-nextjs-frontman-439o</link>
      <guid>https://dev.to/bluehotdog/add-runtime-context-to-your-ai-coding-workflow-nextjs-frontman-439o</guid>
      <description>&lt;p&gt;This is a practical walkthrough. We'll take a Next.js app with a layout bug, install Frontman, and fix the bug by clicking the broken element in the browser instead of describing it to an AI that can't see it.&lt;/p&gt;

&lt;p&gt;By the end you'll know whether runtime-aware AI coding actually saves time or is just a debugger with extra steps. (Spoiler: it's both.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Next.js 14 or 15 project (or &lt;code&gt;npx create-next-app@latest&lt;/code&gt; to create one)&lt;/li&gt;
&lt;li&gt;An API key from Claude, OpenAI, or OpenRouter&lt;/li&gt;
&lt;li&gt;5 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Install Frontman
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @frontman-ai/nextjs &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it for setup. The installer handles your config automatically. Start your dev server:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;When you open your app in the browser, you'll see a small Frontman toolbar. Click it and enter your AI key (Claude, OpenAI, or OpenRouter). The key is stored locally in your browser — it's never sent anywhere except directly to your AI provider.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: The Bug
&lt;/h2&gt;

&lt;p&gt;Let's create a realistic layout bug. Here's a card grid component with a subtle problem:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/components/CardGrid.tsx&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;CardGrid&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"grid grid-cols-3 gap-6 p-8"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rounded-lg bg-white p-6 shadow-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-lg font-semibold"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;featured&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-2 inline-block rounded-full bg-blue-100 px-3 py-1 text-sm text-blue-800"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              Featured
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 text-gray-600"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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;This looks fine in your source code. But when 2 of 6 items are &lt;code&gt;featured&lt;/code&gt;, the cards with the badge are taller than the ones without, breaking the grid alignment. The bottom row doesn't align. The &lt;code&gt;gap-6&lt;/code&gt; interacts with the conditional badge in a way that isn't obvious from reading the JSX.&lt;/p&gt;
&lt;h3&gt;
  
  
  What Cursor/Copilot Would Do
&lt;/h3&gt;

&lt;p&gt;You'd describe the bug: "The cards in CardGrid aren't aligning properly — some are taller than others."&lt;/p&gt;

&lt;p&gt;The AI would read the source, see &lt;code&gt;grid-cols-3 gap-6&lt;/code&gt;, and probably suggest one of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding &lt;code&gt;h-full&lt;/code&gt; to the cards (might work, might cause other issues)&lt;/li&gt;
&lt;li&gt;Adding &lt;code&gt;min-h-[200px]&lt;/code&gt; (arbitrary, fragile)&lt;/li&gt;
&lt;li&gt;Restructuring the component entirely (overkill)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can't see that the actual problem is the conditional &lt;code&gt;featured&lt;/code&gt; badge pushing content down, and that the real fix is just adding &lt;code&gt;flex flex-col&lt;/code&gt; to the card and &lt;code&gt;mt-auto&lt;/code&gt; to the description paragraph. The AI is guessing because it doesn't see the rendered layout.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3: Fix It With Runtime Context
&lt;/h2&gt;

&lt;p&gt;With Frontman running, open the page in your browser. You can see the misaligned cards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Click the misaligned card.&lt;/strong&gt; Frontman highlights it and shows you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The component: &lt;code&gt;CardGrid&lt;/code&gt; at &lt;code&gt;src/components/CardGrid.tsx:5&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The element: &lt;code&gt;&amp;lt;div class="rounded-lg bg-white p-6 shadow-sm"&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Computed styles: the actual padding, dimensions, and flex/grid properties as the browser computed them&lt;/li&gt;
&lt;li&gt;Parent layout: the grid container with its resolved gap, column widths, and row heights&lt;/li&gt;
&lt;li&gt;Children: what's actually inside this card (including the conditional badge)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now describe the fix:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Make all cards the same height and align the description text at the bottom, regardless of whether the Featured badge is present."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Frontman sends the AI:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your description&lt;/li&gt;
&lt;li&gt;The source code of &lt;code&gt;CardGrid.tsx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The computed layout: actual grid dimensions, card heights, which cards have the badge&lt;/li&gt;
&lt;li&gt;The component tree context&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The AI generates a targeted edit — adding &lt;code&gt;flex flex-col&lt;/code&gt; to the card wrapper and &lt;code&gt;mt-auto&lt;/code&gt; to the description paragraph. It knows this is the right fix because it can see the &lt;em&gt;actual&lt;/em&gt; height difference between cards with and without the badge.&lt;/p&gt;

&lt;p&gt;The edit is applied to your source file. Hot reload shows the result immediately. Cards align.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 4: What Just Happened Under the Hood
&lt;/h2&gt;

&lt;p&gt;Here's the flow:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. You clicked an element in the browser
2. Frontman's client-side code identified the React component
   and resolved it to a source file:line via sourcemaps
3. The click target + component info were sent to the
   Frontman middleware running inside the Next.js dev server
4. The middleware gathered:
   - Source code of the component
   - Computed styles from the browser
   - Component tree (parent/child relationships)
   - Server-side context (routes, module graph)
5. All of this was packaged as MCP tool responses
   and sent to the AI alongside your description
6. The AI generated a source code edit
7. The edit was written to disk
8. Next.js HMR hot-reloaded the change
9. The browser updated — you see the fix immediately
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The key insight: the AI didn't guess what the layout looks like. It &lt;em&gt;knew&lt;/em&gt; — because Frontman gave it the computed layout data from the browser. The fix was targeted instead of speculative.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 5: Beyond CSS — What Else You Can Do
&lt;/h2&gt;

&lt;p&gt;The card grid example is simple. Here are more realistic scenarios where runtime context helps:&lt;/p&gt;
&lt;h3&gt;
  
  
  Debugging a 404
&lt;/h3&gt;

&lt;p&gt;Your page returns a 404 but the file exists. Instead of manually checking the route table, middleware chain, and rewrites:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Why is /api/users/me returning 404?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Frontman gives the AI access to the registered route table and middleware state. The AI can see that a middleware redirect is firing before the route matches, or that the file-based route doesn't resolve to what you expect.&lt;/p&gt;
&lt;h3&gt;
  
  
  Fixing a Hydration Mismatch
&lt;/h3&gt;

&lt;p&gt;A component renders differently on server and client. Server logs show a hydration warning but you can't tell which component caused it:&lt;/p&gt;

&lt;p&gt;Click the component in the browser. Frontman shows the server-rendered HTML vs. the client-rendered DOM, plus the component's source location. The AI can see the mismatch directly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Understanding an Unfamiliar Codebase
&lt;/h3&gt;

&lt;p&gt;You joined a project and need to understand what renders the dashboard sidebar:&lt;/p&gt;

&lt;p&gt;Click the sidebar. Frontman tells you: &lt;code&gt;DashboardLayout &amp;gt; Sidebar&lt;/code&gt; at &lt;code&gt;src/layouts/DashboardLayout.tsx:23&lt;/code&gt;. You have your answer in 2 seconds instead of grepping through the component tree.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 6: Try It Yourself
&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;# Next.js&lt;/span&gt;
npx @frontman-ai/nextjs &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Or Astro&lt;/span&gt;
astro add @frontman-ai/astro

&lt;span class="c"&gt;# Or Vite (React, Vue, Svelte)&lt;/span&gt;
npx @frontman-ai/vite &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Full setup instructions and documentation: &lt;a href="https://frontman.sh" rel="noopener noreferrer"&gt;frontman.sh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/frontman-ai" rel="noopener noreferrer"&gt;
        frontman-ai
      &lt;/a&gt; / &lt;a href="https://github.com/frontman-ai/frontman" rel="noopener noreferrer"&gt;
        frontman
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The AI agent that lives in your framework/browser
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a href="https://frontman.sh" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/502dbad47bfab2dd965edb3921e761e4f7f2ffd965517a99bfa51b1e77f348a3/68747470733a2f2f66726f6e746d616e2e73682f6f672e706e67" alt="Frontman" width="600"&gt;
  &lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Ship frontend changes from your browser — no code editor needed&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;a href="https://github.com/frontman-ai/frontman/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/frontman-ai/frontman/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/frontman-ai/frontman/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0a9bcd6a29b65577f4bba48fcebf2e01b05d44e96dbc293e636d26e11944ba54/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302532302532462532304147504c2d2d332e302d626c7565" alt="License"&gt;&lt;/a&gt;
  &lt;a href="https://www.npmjs.com/package/@frontman-ai/nextjs" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/69988fb725e5c529e602533232e0070dacc6a017419d36c9f5bf8887f36a5b3c/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f4066726f6e746d616e2d61692f6e6578746a73" alt="npm version"&gt;&lt;/a&gt;
  &lt;a href="https://discord.gg/xk8uXJSvhC" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1572662bebf847907e65f3d426c3051280e9ac17599a1d5bd62d179ff3ae413e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d4a6f696e25323055732d3538363546323f6c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465" alt="Discord"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;p&gt;&lt;a href="https://frontman.sh" rel="nofollow noopener noreferrer"&gt;Frontman&lt;/a&gt; is an open-source AI coding agent that lives in your browser. It hooks into your dev server as middleware and sees the live DOM, component tree, CSS styles, routes, and server logs. Click any element in your running app, describe what you want changed in plain English, and Frontman edits the actual source files with instant hot reload. It supports Next.js, Astro, and Vite (React, Vue, Svelte). Free and open-source — Apache 2.0 (client libraries) / AGPL-3.0 (server). Bring your own API keys (Claude, ChatGPT, or OpenRouter).&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://www.youtube.com/watch?v=-4GD1GYwH8Y" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ffrontman-ai%2Ffrontman%2F.%2Fassets%2Fdemo.webp" alt="Frontman Demo" width="600"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Who Is This For?&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Frontend developers&lt;/strong&gt; who want richer context than terminal-based AI tools provide. Frontman reads the rendered page, not just the source files, so it knows what your CSS actually computes to and which component renders which DOM node.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Designers and product managers&lt;/strong&gt; who want to change copy, adjust…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/frontman-ai/frontman" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  When NOT to Use This
&lt;/h2&gt;

&lt;p&gt;Runtime-aware AI coding is not a silver bullet. Don't use it for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complex state logic&lt;/strong&gt; — the visual output doesn't tell you if your reducer logic is correct&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance optimization&lt;/strong&gt; — Frontman sees the DOM, not your render cycles or bundle size&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;As a substitute for understanding your code&lt;/strong&gt; — if you can't explain the AI's diff to a colleague, don't commit it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The runtime context gap is real, and closing it saves time on a specific class of problems (visual bugs, layout issues, routing confusion, server-side debugging). But it doesn't replace engineering judgment. It just means the AI has to guess less.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://frontman.sh" rel="noopener noreferrer"&gt;Frontman&lt;/a&gt; is open source on &lt;a href="https://github.com/frontman-ai/frontman" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. This tutorial uses Next.js, but the workflow is identical for Astro and Vite projects — just swap the package name.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>nextjs</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AI Coding Tools That Actually See Your Browser (2026)</title>
      <dc:creator>Danni Friedland</dc:creator>
      <pubDate>Wed, 04 Mar 2026 11:22:09 +0000</pubDate>
      <link>https://dev.to/bluehotdog/ai-coding-tools-that-actually-see-your-browser-2026-2hoc</link>
      <guid>https://dev.to/bluehotdog/ai-coding-tools-that-actually-see-your-browser-2026-2hoc</guid>
      <description>&lt;p&gt;There's a new category of AI coding tools emerging: ones that connect to your running application instead of just reading source files. The pitch is the same across all of them — give the AI runtime context so it stops guessing about what your app actually looks like and does.&lt;/p&gt;

&lt;p&gt;The implementations are very different. Some hook into the dev server. Some proxy the browser. Some expose DevTools via MCP. Some are free, some charge monthly, some are experimental. I've been working in this space and wanted to write an honest comparison, since most "tool roundup" articles are either thinly disguised ads or surface-level feature lists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure upfront:&lt;/strong&gt; I'm involved with Frontman, one of the tools listed. I'll be transparent about where it's stronger and where it's weaker than alternatives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Category Exists
&lt;/h2&gt;

&lt;p&gt;AI coding tools (Cursor, Copilot, Claude Code, Windsurf) work from source files. They don't see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The rendered DOM, computed styles, or layout geometry (client side)&lt;/li&gt;
&lt;li&gt;The compiled module graph, registered routes, server logs, or middleware state (server side)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For any web application with a runtime, this means the AI is guessing about a significant chunk of the application's behavior. The result is the describe-check-fix loop: the AI makes an edit, you check the browser, it's wrong, you describe it again.&lt;/p&gt;

&lt;p&gt;Runtime-aware tools try to close this gap. Here's how each one does it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Frontman
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://frontman.sh" rel="noopener noreferrer"&gt;frontman.sh&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/frontman-ai/frontman" rel="noopener noreferrer"&gt;github.com/frontman-ai/frontman&lt;/a&gt; (Apache 2.0 / AGPL-3.0)&lt;br&gt;
&lt;strong&gt;Stars:&lt;/strong&gt; ~131&lt;br&gt;
&lt;strong&gt;Approach:&lt;/strong&gt; Framework middleware&lt;/p&gt;

&lt;p&gt;Frontman installs as middleware inside your framework's dev server (Next.js, Astro, or Vite). Because it runs &lt;em&gt;inside&lt;/em&gt; the framework, it has native access to both client-side context (DOM, component tree, computed styles, click targets) and server-side context (routes, compiled module graph, server logs, framework-specific state). Both are exposed to the AI agent via MCP.&lt;/p&gt;

&lt;p&gt;The workflow: open your app in the browser, click any element, describe what you want changed. Frontman maps the element back to the source file and line, gives the AI runtime context, generates the edit, and hot reloads.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Deepest framework integration — sees both client and server runtime&lt;/li&gt;
&lt;li&gt;Fully free. No prompt limits, no account required&lt;/li&gt;
&lt;li&gt;BYOK — connect Claude, OpenAI, or OpenRouter directly&lt;/li&gt;
&lt;li&gt;Open source with permissive client library licensing (Apache 2.0)&lt;/li&gt;
&lt;li&gt;Supports 5 frameworks: Next.js, Astro, Vite+React, Vite+Vue, Vite+Svelte&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Early stage (~150 stars). Rough edges and incomplete documentation&lt;/li&gt;
&lt;li&gt;Limited to supported frameworks (no Angular, no Remix yet)&lt;/li&gt;
&lt;li&gt;Source mapping breaks on deeply abstracted component libraries&lt;/li&gt;
&lt;li&gt;Small community — fewer examples, tutorials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want the deepest runtime integration, use a supported framework, prefer open source, and don't want to pay for another subscription.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I'm involved with this project.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Stagewise
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://stagewise.io" rel="noopener noreferrer"&gt;stagewise.io&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/stagewise-io/stagewise" rel="noopener noreferrer"&gt;github.com/stagewise-io/stagewise&lt;/a&gt; (AGPL-3.0)&lt;br&gt;
&lt;strong&gt;Stars:&lt;/strong&gt; ~6,500&lt;br&gt;
&lt;strong&gt;Backing:&lt;/strong&gt; YC S25&lt;br&gt;
&lt;strong&gt;Approach:&lt;/strong&gt; Browser proxy / CLI injection&lt;/p&gt;

&lt;p&gt;Stagewise started as a browser toolbar and is pivoting to a full "developer browser" (Electron-based). It runs &lt;code&gt;npx stagewise@latest&lt;/code&gt; which starts a CLI proxy on port 3100 and injects a toolbar into your running app.&lt;/p&gt;

&lt;p&gt;Two modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Standalone:&lt;/strong&gt; has its own built-in AI agent. Requires OAuth login.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bridge mode:&lt;/strong&gt; connects to your IDE agent (Cursor, Copilot, Windsurf). You describe changes in the browser, but execution happens in the IDE.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Most polished option in the category. YC backing shows.&lt;/li&gt;
&lt;li&gt;~6,500 stars — active community, more examples and tutorials&lt;/li&gt;
&lt;li&gt;Supports React, Next.js, Vue, Angular, plus CSS frameworks (Tailwind, Bootstrap, MUI, ShadCN)&lt;/li&gt;
&lt;li&gt;Bridge mode integrates with existing IDE workflow&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Prompt limits: ~10 free prompts/day, EUR 20/month (+19% VAT in EU) for ~100/day&lt;/li&gt;
&lt;li&gt;Requires account and OAuth login before first use&lt;/li&gt;
&lt;li&gt;Proxy architecture means limited server-side visibility (it sits between browser and server, not inside the server)&lt;/li&gt;
&lt;li&gt;No Svelte or Astro support&lt;/li&gt;
&lt;li&gt;Bridge mode requires context-switching between browser and IDE&lt;/li&gt;
&lt;li&gt;Pivoting to Electron-based "developer browser" — adds significant overhead and scope creep&lt;/li&gt;
&lt;li&gt;No BYOK option — inference goes through their servers&lt;/li&gt;
&lt;li&gt;AGPL-3.0 only (no permissive client library option)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want the most polished UX, don't mind a subscription, and primarily work with React/Next.js/Vue/Angular.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Tidewave
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://tidewave.ai" rel="noopener noreferrer"&gt;tidewave.ai&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/tidewave-ai" rel="noopener noreferrer"&gt;github.com/tidewave-ai&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Stars:&lt;/strong&gt; ~1,600 combined&lt;br&gt;
&lt;strong&gt;Created by:&lt;/strong&gt; Jose Valim (creator of Elixir)&lt;br&gt;
&lt;strong&gt;Approach:&lt;/strong&gt; MCP server + custom browser app&lt;/p&gt;

&lt;p&gt;Tidewave isn't a coding agent itself — it's an MCP enhancement layer that gives your existing agent (Claude Code, Codex, Cursor) access to runtime state. It's built by Jose Valim via Dashbit, so the deepest integration is with the Elixir/Phoenix ecosystem.&lt;/p&gt;

&lt;p&gt;What makes Tidewave unique is its backend depth: database queries, runtime evaluation, stack traces, and live process state. For a Phoenix developer, this is like having the BEAM runtime piped directly into your AI agent. Rails and Django support exists but is thinner.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Deep backend integration — DB queries, runtime eval, stack traces&lt;/li&gt;
&lt;li&gt;Built by Jose Valim — technical credibility is unquestionable&lt;/li&gt;
&lt;li&gt;Works with your existing agent (Claude Code, Codex) rather than replacing it&lt;/li&gt;
&lt;li&gt;Strong Phoenix/Elixir support is unmatched by anything else&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;JS framework support is thin (~28 stars on &lt;code&gt;tidewave_js&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The agent isn't open source&lt;/li&gt;
&lt;li&gt;$10/month for the browser app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Phoenix/Rails/Django developers who want to enhance their existing AI agent with deep backend runtime context.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Chrome DevTools MCP (Google)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; [Experimental / Google]&lt;br&gt;
&lt;strong&gt;Approach:&lt;/strong&gt; MCP server exposing DevTools state&lt;/p&gt;

&lt;p&gt;Google's experimental project that exposes Chrome DevTools state as MCP tools. Your AI agent can query the DOM, read console output, inspect network requests, and access other DevTools data programmatically.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Official Google project — signals the category is real and becoming infrastructure&lt;/li&gt;
&lt;li&gt;Works with any web app (framework-agnostic)&lt;/li&gt;
&lt;li&gt;Free and open&lt;/li&gt;
&lt;li&gt;Integrates with any MCP-capable agent&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Raw — no agent included, you wire it up yourself&lt;/li&gt;
&lt;li&gt;Browser-only — no server-side context (routes, module graph, server logs)&lt;/li&gt;
&lt;li&gt;Experimental — limited documentation, may change or be abandoned&lt;/li&gt;
&lt;li&gt;Requires manual setup and configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want to add browser context to an existing agent and are comfortable with DIY integration.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Onlook (Honorable Mention — Different Category)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://onlook.dev" rel="noopener noreferrer"&gt;onlook.dev&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/onlook-dev/onlook" rel="noopener noreferrer"&gt;github.com/onlook-dev/onlook&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Stars:&lt;/strong&gt; ~24,700&lt;br&gt;
&lt;strong&gt;Backing:&lt;/strong&gt; YC-backed&lt;br&gt;
&lt;strong&gt;Approach:&lt;/strong&gt; Figma-like visual editor for React/Next.js&lt;/p&gt;

&lt;p&gt;Onlook is "Cursor for Designers" — a visual editor that lets you manipulate React/Next.js components like Figma layers, generating real code. It's a different product category (visual design tool, not runtime-aware coding agent), but it overlaps in the "non-engineers editing code" use case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key difference:&lt;/strong&gt; Onlook uses a sandboxed web container, not your real dev server. This makes it safer for experimentation but means it doesn't see your actual runtime environment — middleware, environment variables, real API responses, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Designers who want a Figma-like interface for React/Next.js, or teams prototyping UI without setting up a full dev environment.&lt;/p&gt;




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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Frontman&lt;/th&gt;
&lt;th&gt;Stagewise&lt;/th&gt;
&lt;th&gt;Tidewave&lt;/th&gt;
&lt;th&gt;Chrome MCP&lt;/th&gt;
&lt;th&gt;Onlook&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Framework middleware&lt;/td&gt;
&lt;td&gt;Browser proxy&lt;/td&gt;
&lt;td&gt;MCP server&lt;/td&gt;
&lt;td&gt;MCP server&lt;/td&gt;
&lt;td&gt;Visual editor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Client runtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Sandboxed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Server runtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Yes (deep)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standalone agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No (enhances existing)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (Apache 2.0 + AGPL)&lt;/td&gt;
&lt;td&gt;Yes (AGPL)&lt;/td&gt;
&lt;td&gt;Mixed&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free (no limits)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No (10/day free)&lt;/td&gt;
&lt;td&gt;No ($10/mo)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BYOK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Thin&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Astro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Svelte&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;React&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Angular&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phoenix/Rails&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (deep)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Account required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stars&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~130&lt;/td&gt;
&lt;td&gt;~6,500&lt;/td&gt;
&lt;td&gt;~1,600&lt;/td&gt;
&lt;td&gt;Experimental&lt;/td&gt;
&lt;td&gt;~24,700&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Which One Should You Use?
&lt;/h2&gt;

&lt;p&gt;Honest recommendations based on your situation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a Phoenix/Rails/Django developer:&lt;/strong&gt; Tidewave is the obvious choice. Jose Valim built it specifically for backend-heavy stacks with deep runtime integration that nothing else matches for those ecosystems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you want the most polished experience and don't mind paying:&lt;/strong&gt; Stagewise. The YC backing shows in the UX quality. If you primarily use React/Next.js/Vue and EUR 20/month doesn't bother you, it's the most mature option.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you want free + deep framework integration + full control:&lt;/strong&gt; Frontman. No prompt limits, no account, BYOK, open source. The tradeoff is that it's early-stage with fewer stars and rougher edges. If you're comfortable being an early adopter and filing issues when things break, the runtime integration depth is the deepest available for JS frameworks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you want to add browser context to your existing agent:&lt;/strong&gt; Chrome DevTools MCP. It's bare-bones but framework-agnostic and free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're a designer who wants a visual editor:&lt;/strong&gt; Onlook. Different category entirely, but the best Figma-like interface for editing React code visually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're building something outside these frameworks:&lt;/strong&gt; Wait. The category is too young for broad framework coverage. Stick with your current AI tool and check back in 6 months.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Category Is Real
&lt;/h2&gt;

&lt;p&gt;Six months ago, "AI coding tool that sees your browser" wasn't a category. Now there are at least five projects with different architectures attacking the same problem. Google is building infrastructure for it. The fact that these tools exist across different companies, funding stages, and ecosystems suggests the runtime context gap is a real problem worth solving — not just a marketing angle.&lt;/p&gt;

&lt;p&gt;Everything listed here is early. Some of these tools will be dead in a year. Some will be table stakes. The only way to know which is to try them on a real project and see if the workflow improvement justifies the setup cost.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm involved with &lt;a href="https://frontman.sh" rel="noopener noreferrer"&gt;Frontman&lt;/a&gt;, so take my perspective accordingly. I tried to be honest about every tool's strengths and weaknesses — if I got something wrong about a competitor, call it out in the comments and I'll correct it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>tooling</category>
    </item>
    <item>
      <title>I Built an AI Coding Agent That Lives in Your Browser</title>
      <dc:creator>Danni Friedland</dc:creator>
      <pubDate>Wed, 04 Mar 2026 11:05:40 +0000</pubDate>
      <link>https://dev.to/bluehotdog/i-built-an-ai-coding-agent-that-lives-in-your-browser-4oc4</link>
      <guid>https://dev.to/bluehotdog/i-built-an-ai-coding-agent-that-lives-in-your-browser-4oc4</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every AI coding tool I've used has the same blind spot: it edits source files without ever seeing the running application.&lt;/p&gt;

&lt;p&gt;You describe a layout bug. The AI reads your JSX, guesses what the DOM looks like, and generates a fix. You switch to the browser. It's wrong — the AI didn't know about the inherited padding, the conditional render that adds a third child, or the CSS variable that resolves differently at this breakpoint. You switch back, describe it again with more detail, and repeat.&lt;/p&gt;

&lt;p&gt;This loop — describe, edit, check, re-describe — is where a surprising amount of AI-assisted development time actually goes. Not on the AI generating code. On &lt;em&gt;you&lt;/em&gt; being the bridge between the AI's understanding of the source and the application's actual behavior.&lt;/p&gt;

&lt;p&gt;The same thing happens on the server side. Your AI edits a Next.js API route but doesn't know what middleware is active, what the compiled module graph looks like, or what's in the server logs. It's guessing about the runtime from the source alone.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://frontman.sh" rel="noopener noreferrer"&gt;Frontman&lt;/a&gt; is an open-source AI coding agent that lives inside your browser. Instead of working from source files alone, it hooks into your framework's dev server as middleware and sees both sides of the application:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Client side:&lt;/strong&gt; the rendered DOM, component tree, computed styles, layout geometry, console output, click targets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server side:&lt;/strong&gt; registered routes, compiled module graph, server logs, middleware state, framework-specific context (Astro island hydration, Next.js server/client component boundaries, Vite's HMR state).&lt;/p&gt;

&lt;p&gt;The workflow: open your app in the browser, click any element, describe what you want changed in plain English. Frontman maps the runtime element back to the source file and line number, gives the AI the full runtime context, and applies the edit. Hot reload shows you the result immediately.&lt;/p&gt;

&lt;p&gt;It supports &lt;strong&gt;Next.js&lt;/strong&gt;, &lt;strong&gt;Astro&lt;/strong&gt;, and &lt;strong&gt;Vite&lt;/strong&gt; (React, Vue, Svelte). You bring your own AI key — Claude, OpenAI, or OpenRouter. No subscription, no prompt limits, no account required.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/frontman-ai" rel="noopener noreferrer"&gt;
        frontman-ai
      &lt;/a&gt; / &lt;a href="https://github.com/frontman-ai/frontman" rel="noopener noreferrer"&gt;
        frontman
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The AI agent that lives in your framework/browser
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a href="https://frontman.sh" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/502dbad47bfab2dd965edb3921e761e4f7f2ffd965517a99bfa51b1e77f348a3/68747470733a2f2f66726f6e746d616e2e73682f6f672e706e67" alt="Frontman" width="600"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Ship frontend changes from your browser — no code editor needed&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;a href="https://github.com/frontman-ai/frontman/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/frontman-ai/frontman/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/frontman-ai/frontman/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0a9bcd6a29b65577f4bba48fcebf2e01b05d44e96dbc293e636d26e11944ba54/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302532302532462532304147504c2d2d332e302d626c7565" alt="License"&gt;&lt;/a&gt;
  &lt;a href="https://www.npmjs.com/package/@frontman-ai/nextjs" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/69988fb725e5c529e602533232e0070dacc6a017419d36c9f5bf8887f36a5b3c/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f4066726f6e746d616e2d61692f6e6578746a73" alt="npm version"&gt;&lt;/a&gt;
  &lt;a href="https://discord.gg/xk8uXJSvhC" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1572662bebf847907e65f3d426c3051280e9ac17599a1d5bd62d179ff3ae413e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d4a6f696e25323055732d3538363546323f6c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465" alt="Discord"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;p&gt;&lt;a href="https://frontman.sh" rel="nofollow noopener noreferrer"&gt;Frontman&lt;/a&gt; is an open-source AI coding agent that lives in your browser. It hooks into your dev server as middleware and sees the live DOM, component tree, CSS styles, routes, and server logs. Click any element in your running app, describe what you want changed in plain English, and Frontman edits the actual source files with instant hot reload. It supports Next.js, Astro, and Vite (React, Vue, Svelte). Free and open-source — Apache 2.0 (client libraries) / AGPL-3.0 (server). Bring your own API keys (Claude, ChatGPT, or OpenRouter).&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://www.youtube.com/watch?v=-4GD1GYwH8Y" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ffrontman-ai%2Ffrontman%2F.%2Fassets%2Fdemo.webp" alt="Frontman Demo" width="600"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Who Is This For?&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Frontend developers&lt;/strong&gt; who want richer context than terminal-based AI tools provide. Frontman reads the rendered page, not just the source files, so it knows what your CSS actually computes to and which component renders which DOM node.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Designers and product managers&lt;/strong&gt; who want to change copy, adjust…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/frontman-ai/frontman" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;The key architectural decision: Frontman installs as &lt;strong&gt;actual middleware&lt;/strong&gt; inside your framework's dev server, not as an external proxy or browser extension.&lt;/p&gt;

&lt;p&gt;This matters because the dev server already knows everything about both sides of your application. Next.js knows its route table and server/client component boundaries. Vite knows its HMR module graph and compiled output. Astro knows which islands hydrated. By running &lt;em&gt;inside&lt;/em&gt; the framework, Frontman gets native access to all of this without reimplementing it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @frontman-ai/nextjs &lt;span class="nb"&gt;install&lt;/span&gt;   &lt;span class="c"&gt;# for Next.js&lt;/span&gt;
astro add @frontman-ai/astro      &lt;span class="c"&gt;# for Astro&lt;/span&gt;
npx @frontman-ai/vite &lt;span class="nb"&gt;install&lt;/span&gt;     &lt;span class="c"&gt;# for Vite (React/Vue/Svelte)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;One import in your framework config, start the dev server, and the agent is available in the browser.&lt;/p&gt;

&lt;p&gt;Both client-side and server-side context are exposed via MCP (Model Context Protocol), so the AI agent works with structured runtime data rather than parsing HTML strings or grepping server logs.&lt;/p&gt;
&lt;h3&gt;
  
  
  Source Mapping
&lt;/h3&gt;

&lt;p&gt;The hardest part isn't getting runtime data — it's mapping it back to source code. "This &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; with these computed styles" needs to become "this component at &lt;code&gt;src/components/Card.tsx:47&lt;/code&gt;." Frontman uses a combination of sourcemaps, React/Vue/Svelte fiber/instance metadata, and framework-specific component registries to make this connection. It's not perfect — deeply abstracted component libraries can break the mapping — but for most application code it's reliable.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tradeoffs (The Honest Part)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What works well:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSS and layout fixes — the AI can see computed styles, so it knows &lt;em&gt;why&lt;/em&gt; something looks wrong, not just that you say it does&lt;/li&gt;
&lt;li&gt;Visual debugging — click the broken element instead of describing it&lt;/li&gt;
&lt;li&gt;Server-side debugging — the AI sees the actual error in server logs alongside the component that triggered it&lt;/li&gt;
&lt;li&gt;Onboarding — "what component renders this section?" is answered instantly&lt;/li&gt;
&lt;li&gt;Designer/PM collaboration — non-engineers can click elements and describe changes without opening an IDE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What doesn't work well (yet):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex state management changes — the visual output doesn't tell you if the logic is correct&lt;/li&gt;
&lt;li&gt;Performance optimization — Frontman sees the DOM and server state, not render cycles or bundle sizes&lt;/li&gt;
&lt;li&gt;Large refactors — runtime context helps with surgical edits, not architectural changes&lt;/li&gt;
&lt;li&gt;Unsupported frameworks — if you're on Angular, Remix, or SvelteKit (without Vite), there's no middleware adapter yet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Compared to alternatives:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://stagewise.io" rel="noopener noreferrer"&gt;Stagewise&lt;/a&gt; has more polish and ~6,500 stars, but uses a proxy architecture (less server-side visibility), requires an account, and limits free usage to ~10 prompts/day (EUR 20/month for more). Frontman is fully free with no prompt limits.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tidewave.ai" rel="noopener noreferrer"&gt;Tidewave&lt;/a&gt; has deep backend integration for Phoenix/Rails/Django like ours, but not fully Open Source.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/anthropics/anthropic-cookbook" rel="noopener noreferrer"&gt;Chrome DevTools MCP&lt;/a&gt; is browser-only — no server-side context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Frontman is early-stage. There are rough edges. The documentation could be better. Some framework-specific features are incomplete. I'm not going to pretend otherwise.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Open Source
&lt;/h2&gt;

&lt;p&gt;Frontman is licensed as Apache 2.0 (client libraries) and AGPL-3.0 (server). The client libs are permissively licensed so you can include them in any project without concern. The server is AGPL to keep the core open.&lt;/p&gt;

&lt;p&gt;The BYOK model means your code and your AI interactions stay between you and your AI provider. Nothing routes through our servers. There's nothing to route through — there are no servers.&lt;/p&gt;

&lt;p&gt;This isn't altruism. Open source is the only credible model for a tool that sits inside your dev server and sees your source code. If I can't read the code that has access to my codebase, I'm not installing it. I assume you feel the same way.&lt;/p&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;&lt;span class="c"&gt;# Next.js&lt;/span&gt;
npx @frontman-ai/nextjs &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Astro&lt;/span&gt;
astro add @frontman-ai/astro

&lt;span class="c"&gt;# Vite (React, Vue, or Svelte)&lt;/span&gt;
npx @frontman-ai/vite &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Full setup instructions: &lt;a href="https://frontman.sh" rel="noopener noreferrer"&gt;frontman.sh&lt;/a&gt;&lt;br&gt;
Source code: &lt;a href="https://github.com/frontman-ai/frontman" rel="noopener noreferrer"&gt;github.com/frontman-ai/frontman&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/frontman-ai" rel="noopener noreferrer"&gt;
        frontman-ai
      &lt;/a&gt; / &lt;a href="https://github.com/frontman-ai/frontman" rel="noopener noreferrer"&gt;
        frontman
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The AI agent that lives in your framework/browser
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a href="https://frontman.sh" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/502dbad47bfab2dd965edb3921e761e4f7f2ffd965517a99bfa51b1e77f348a3/68747470733a2f2f66726f6e746d616e2e73682f6f672e706e67" alt="Frontman" width="600"&gt;
  &lt;/a&gt;
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Ship frontend changes from your browser — no code editor needed&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;a href="https://github.com/frontman-ai/frontman/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/frontman-ai/frontman/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/frontman-ai/frontman/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0a9bcd6a29b65577f4bba48fcebf2e01b05d44e96dbc293e636d26e11944ba54/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322e302532302532462532304147504c2d2d332e302d626c7565" alt="License"&gt;&lt;/a&gt;
  &lt;a href="https://www.npmjs.com/package/@frontman-ai/nextjs" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/69988fb725e5c529e602533232e0070dacc6a017419d36c9f5bf8887f36a5b3c/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f4066726f6e746d616e2d61692f6e6578746a73" alt="npm version"&gt;&lt;/a&gt;
  &lt;a href="https://discord.gg/xk8uXJSvhC" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1572662bebf847907e65f3d426c3051280e9ac17599a1d5bd62d179ff3ae413e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d4a6f696e25323055732d3538363546323f6c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465" alt="Discord"&gt;&lt;/a&gt;
&lt;/p&gt;




&lt;p&gt;&lt;a href="https://frontman.sh" rel="nofollow noopener noreferrer"&gt;Frontman&lt;/a&gt; is an open-source AI coding agent that lives in your browser. It hooks into your dev server as middleware and sees the live DOM, component tree, CSS styles, routes, and server logs. Click any element in your running app, describe what you want changed in plain English, and Frontman edits the actual source files with instant hot reload. It supports Next.js, Astro, and Vite (React, Vue, Svelte). Free and open-source — Apache 2.0 (client libraries) / AGPL-3.0 (server). Bring your own API keys (Claude, ChatGPT, or OpenRouter).&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://www.youtube.com/watch?v=-4GD1GYwH8Y" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ffrontman-ai%2Ffrontman%2F.%2Fassets%2Fdemo.webp" alt="Frontman Demo" width="600"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Who Is This For?&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Frontend developers&lt;/strong&gt; who want richer context than terminal-based AI tools provide. Frontman reads the rendered page, not just the source files, so it knows what your CSS actually computes to and which component renders which DOM node.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Designers and product managers&lt;/strong&gt; who want to change copy, adjust…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/frontman-ai/frontman" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More frameworks:&lt;/strong&gt; Remix, SvelteKit (standalone), Angular are on the list&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance tools:&lt;/strong&gt; Expose render timing and bundle analysis to the agent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test generation:&lt;/strong&gt; Use runtime state to generate more accurate test cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better source mapping:&lt;/strong&gt; Improve component resolution for deeply abstracted UI libraries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you run into issues or have ideas, open an issue on GitHub or find me in the comments here. Contributions are welcome — the codebase is TypeScript and the architecture is documented in the repo.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Frontman is at &lt;a href="https://frontman.sh" rel="noopener noreferrer"&gt;frontman.sh&lt;/a&gt; and &lt;a href="https://github.com/frontman-ai/frontman" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. I built it because the describe-check-fix loop was eating my productivity and I couldn't find an open-source tool that solved it properly.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Multi-Select is here: Stop fixing UI one element at a time</title>
      <dc:creator>Danni Friedland</dc:creator>
      <pubDate>Fri, 27 Feb 2026 19:06:06 +0000</pubDate>
      <link>https://dev.to/bluehotdog/multi-select-is-here-stop-fixing-ui-one-element-at-a-time-3a1o</link>
      <guid>https://dev.to/bluehotdog/multi-select-is-here-stop-fixing-ui-one-element-at-a-time-3a1o</guid>
      <description>&lt;p&gt;&lt;strong&gt;Multi-Select is here.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stop fixing your UI one element at a time like it's 2024.&lt;/p&gt;

&lt;p&gt;Select multiple elements. Give each one instructions. Hit go. Frontman edits them all in one shot.&lt;/p&gt;

&lt;p&gt;That button that's 2px off? The header that says "Untitled"? The card that looks weird on mobile? Select all three, describe what you want, and get back to your coffee while Frontman rewrites the actual source code.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Click elements in your running app (hold Shift to multi-select)&lt;/li&gt;
&lt;li&gt;Add instructions to each — "make this bold", "fix the padding", "change copy to X"&lt;/li&gt;
&lt;li&gt;Frontman generates real code edits for all of them with hot reload&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No more context-switching between browser and editor for every tiny fix. Batch your nitpicks. Ship faster.&lt;/p&gt;

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

&lt;p&gt;Most AI coding tools work blind. They can't see your running app, your actual DOM, or how your changes look in the browser. So you're stuck in this endless loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Switch to editor&lt;/li&gt;
&lt;li&gt;Describe what you want to change&lt;/li&gt;
&lt;li&gt;Switch back to browser&lt;/li&gt;
&lt;li&gt;See if it worked&lt;/li&gt;
&lt;li&gt;Repeat for every. single. fix.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Frontman can actually see your DOM and UI. So instead of describing "the button in the top-right corner of the header component", you just click it. Instead of fixing one thing at a time, you select everything that's bugging you and fix it all at once.&lt;/p&gt;

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

&lt;p&gt;Frontman works with Next.js, Astro, and Vite (React, Vue, Svelte). Open source and Apache 2.0 licensed.&lt;/p&gt;

&lt;p&gt;Give it a try: &lt;a href="https://frontman.sh" rel="noopener noreferrer"&gt;frontman.sh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Star it on GitHub: &lt;a href="https://github.com/frontman-ai/frontman" rel="noopener noreferrer"&gt;github.com/frontman-ai/frontman&lt;/a&gt; ⭐&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>ai</category>
      <category>frontend</category>
    </item>
    <item>
      <title>AI Coding Tools and the Runtime Context Gap</title>
      <dc:creator>Danni Friedland</dc:creator>
      <pubDate>Fri, 20 Feb 2026 13:37:43 +0000</pubDate>
      <link>https://dev.to/bluehotdog/ai-coding-tools-and-the-runtime-context-gap-33ai</link>
      <guid>https://dev.to/bluehotdog/ai-coding-tools-and-the-runtime-context-gap-33ai</guid>
      <description>&lt;p&gt;Current AI coding tools operate on source files. They read your code, predict what the application does, and generate edits. This works well for pure logic — functions with clear inputs and outputs, refactoring, type-level changes.&lt;/p&gt;

&lt;p&gt;It falls apart when the source code isn't the whole story. And for any application with a runtime - a web app running in a browser, a server handling requests, a framework with middleware and compiled output — the source code is never the whole story.&lt;/p&gt;

&lt;p&gt;This isn't just a frontend problem. Yes, the browser has computed styles and a rendered DOM that don't exist in your source files. But the server side has its own runtime context that source code alone can't capture: which routes are registered, what the compiled module graph looks like, what's in the server logs, what middleware is active and in what order. An AI editing your Next.js API route doesn't know what the dev server's module resolution actually produced. An AI editing your Astro page doesn't know which islands hydrated and which didn't.&lt;/p&gt;

&lt;p&gt;The question is whether connecting AI tools to this runtime state - both client and server — is a meaningful improvement or just a debugger hook with extra steps. Having worked on this problem, I think the honest answer is: it's a debugger hook with extra steps, &lt;em&gt;and&lt;/em&gt; it's a meaningful improvement. Those aren't contradictory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's Be Precise About The Gap
&lt;/h2&gt;

&lt;p&gt;When an AI coding tool edits your project, it's working from source text. Here's what it doesn't have, split by where the information actually lives:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Client-side runtime (the browser):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Computed styles.&lt;/strong&gt; The final CSS applied to an element is the product of specificity, cascade order, media queries, CSS variables, container queries, and inheritance. The AI sees class names. The browser computes actual values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The rendered DOM.&lt;/strong&gt; Your JSX is not your DOM. Conditional rendering, portals, fragments, and framework transformations mean the actual tree can look very different from what the source suggests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layout geometry.&lt;/strong&gt; Is there 16px or 24px between the sidebar and content area? The AI can read &lt;code&gt;gap-4&lt;/code&gt; in a Tailwind class but can't see that a parent's padding also contributes to the visual spacing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client state.&lt;/strong&gt; What data is in your stores? What did the last API call return? What error is displayed?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Server-side runtime (the dev server / framework):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Compiled module graph.&lt;/strong&gt; Frameworks like Next.js, Vite, and Astro transform your source before serving it. The AI sees your source files; the dev server sees the compiled, bundled, tree-shaken output. These can diverge significantly — think barrel file re-exports, auto-generated routes, or framework-injected wrappers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registered routes and middleware.&lt;/strong&gt; File-based routing means the route table is a runtime artifact. Middleware ordering, redirect chains, and rewrite rules exist in the server's state, not in any single source file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server logs and errors.&lt;/strong&gt; A component that renders fine might be throwing warnings server-side, or an API route might be failing silently. The AI editing your code doesn't see &lt;code&gt;stdout&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework-specific context.&lt;/strong&gt; Astro island hydration directives, Next.js server/client component boundaries, Vite's HMR module graph — these are framework runtime concepts that source code only partially describes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source code has never been the complete picture of a running application. That's why we have debuggers, inspectors, and profilers. AI tools just make the gap more painful because they iterate faster.&lt;/p&gt;

&lt;h3&gt;
  
  
  An uncomfortable question worth asking
&lt;/h3&gt;

&lt;p&gt;If your code is so decoupled from its runtime behavior that neither you nor an AI can predict what it does, you might have an architecture problem that no tool will fix. Deeply nested utility classes, conditional rendering spread across five files, CSS overrides cascading through three abstraction layers, middleware chains that no single person understands — an AI with runtime access can patch around this, but it can't solve it. The complexity is in your code, not in the tooling gap.&lt;/p&gt;

&lt;p&gt;This doesn't invalidate the tooling argument. Even well-structured codebases have the source-to-runtime gap. But it's worth being honest: runtime-aware AI is most valuable when your code is already reasonable, and least valuable when it's used to paper over a mess you should be simplifying.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Runtime-Aware" Actually Means (Technically)
&lt;/h2&gt;

&lt;p&gt;Strip away the marketing and the architecture is straightforward: you give an AI agent access to runtime information from both the browser &lt;em&gt;and&lt;/em&gt; the dev server, then let it correlate that information back to source files.&lt;/p&gt;

&lt;p&gt;The interesting part is that modern web frameworks already bridge client and server — Next.js, Astro, and Vite all have dev servers that know about your component tree, module graph, and build output. A tool that hooks into the framework middleware gets both sides for free.&lt;/p&gt;

&lt;p&gt;Concretely, a runtime-aware tool exposes two categories of context via MCP (Model Context Protocol) or similar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────┐    ┌──────────────────────────┐
│ Client Runtime (Browser) │    │ Server Runtime (Dev Svr)  │
│                          │    │                           │
│  DOM tree                │    │  Route table              │
│  Computed styles         │    │  Compiled module graph    │
│  Component tree          │    │  Server logs / errors     │
│  Console output          │    │  Middleware state          │
│  Client state            │    │  HMR module map           │
│                          │    │                           │
└────────────┬─────────────┘    └─────────────┬─────────────┘
             │                                │
             └──────────┬─────────────────────┘
                        ▼
                 Runtime Bridge (MCP tools)
                        │
                        ▼
              AI Agent + Source file mapping
              (sourcemaps, framework metadata)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The critical piece is the &lt;strong&gt;source mapping&lt;/strong&gt; — connecting "this DOM element at runtime" or "this server route" back to "this component in this file at this line." Different tools achieve this at different depths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework middleware&lt;/strong&gt; (e.g., Frontman): hooks into the framework's dev server as actual middleware, so it has native access to both the client-side component tree &lt;em&gt;and&lt;/em&gt; the server-side module graph, routes, compiled output, and logs. This gives the deepest integration — the agent can see what Vite compiled a module to, which Next.js routes are registered, or which Astro islands hydrated — but limits you to supported frameworks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser proxy&lt;/strong&gt; (e.g., Stagewise): sits between browser and dev server, injecting a toolbar overlay. Gets client-side context (DOM, clicks, visual state) but has limited server-side visibility since it's not inside the framework.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server&lt;/strong&gt; (e.g., Chrome DevTools MCP, Tidewave): exposes runtime state as tools that an external agent can call. Chrome DevTools MCP is browser-only. Tidewave goes deep on the server side for Phoenix/Rails/Django but is thin on JS frameworks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is magic. On the client side, it's the same information you get from React DevTools + Chrome DevTools + sourcemaps. On the server side, it's what you'd get from your framework's debug mode + server logs + the module graph. The value is packaging it so an LLM can consume it programmatically and closing the feedback loop: instead of describe → edit → switch to browser → check → switch to IDE → re-describe, you get click element → describe → hot reload. The underlying models are the same. They just have more context about the running application.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tools Building This
&lt;/h2&gt;

&lt;p&gt;A few projects are working on this, with different tradeoffs:&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontman
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/frontman-ai/frontman" rel="noopener noreferrer"&gt;Open source&lt;/a&gt; (Apache 2.0 / AGPL-3.0). Framework middleware for Next.js, Vite (React/Vue/Svelte), and Astro. The key architectural choice: it installs as actual middleware inside your framework's dev server, not as an external proxy or browser extension. This means it has native access to both sides — client-side tools (component tree, DOM, click targets, performance data) and server-side tools (registered routes, compiled module graph, server logs, framework-specific state like Astro island hydration or Next.js server/client component boundaries). Both are exposed to the agent via MCP. BYOK — you connect your own Claude/OpenAI/OpenRouter keys, no subscription. Early-stage (~129 stars), rough edges. &lt;em&gt;Disclosure: I'm involved with this project.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Stagewise
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://stagewise.io" rel="noopener noreferrer"&gt;YC-backed&lt;/a&gt;, ~6,500 stars. Started as a browser toolbar, evolving into a developer browser. Two modes: standalone (hosted agent, account required, ~10 free prompts/day, EUR 20/month for more) or bridge mode (connects to Cursor/Copilot, but you interact in the IDE). More polish, less openness.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tidewave
&lt;/h3&gt;

&lt;p&gt;Built by José Valim (Elixir creator). Not a coding agent itself — an MCP enhancement layer that gives your existing agent (Claude Code, Codex) runtime access. Strongest in full-stack Phoenix/Rails/Django with deep backend integration (DB queries, runtime eval, stack traces). JS support is thin. $10/month for the browser app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chrome DevTools MCP
&lt;/h3&gt;

&lt;p&gt;Google's experimental MCP server exposing DevTools state to AI agents. Raw — you wire it up yourself. But it signals that runtime-context-for-AI is becoming infrastructure, not a product niche.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Maintenance Trap
&lt;/h2&gt;

&lt;p&gt;Here's where most "AI tool" articles stop, and where this one shouldn't.&lt;/p&gt;

&lt;p&gt;Runtime-aware AI makes it very easy to iterate on changes. Click, describe, hot reload, done. This is genuinely useful for prototyping, design tweaks, and CSS fixes where you can see the result is correct — and for server-side fixes where the agent can see the error log clear after an edit.&lt;/p&gt;

&lt;p&gt;But "it looks right" is not the same as "I understand what changed." If an AI rewrites your Tailwind classes, restructures your component's JSX, or adds inline styles to fix a layout — and you ship it without understanding the diff — you've created maintenance debt. The code works today but is opaque to the next person (including future you) who has to modify it.&lt;/p&gt;

&lt;p&gt;This is the "vibe coding" risk, and it applies to &lt;em&gt;all&lt;/em&gt; AI-generated code, not just runtime-aware tools. But runtime-aware tools amplify it because the feedback loop is so tight. When you can go from "broken layout" to "looks right" in 30 seconds, the temptation to skip reviewing the actual code changes is real.&lt;/p&gt;

&lt;p&gt;The rule should be the same as it's always been: &lt;strong&gt;don't commit code you don't understand.&lt;/strong&gt; Whether a blind AI wrote it, a seeing AI wrote it, or you wrote it while sleep-deprived — if you can't explain the diff to a colleague, it shouldn't be merged.&lt;/p&gt;

&lt;p&gt;Runtime-aware tools are better inputs to AI, not substitutes for engineering judgment. They reduce the guess-and-check cycle, which is real waste. They don't reduce the need to understand your own codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Actually Helps (and Where It Doesn't)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Good uses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSS/layout fixes where you can visually verify correctness&lt;/li&gt;
&lt;li&gt;Prototyping UI changes before committing to an approach&lt;/li&gt;
&lt;li&gt;Debugging visual regressions by pointing at the broken element&lt;/li&gt;
&lt;li&gt;Debugging server-side issues where the AI can see the actual error in server logs alongside the component that triggered it&lt;/li&gt;
&lt;li&gt;Understanding route/middleware behavior — "why is this page returning a 404?" when the answer is buried in framework route resolution&lt;/li&gt;
&lt;li&gt;Onboarding to an unfamiliar codebase ("what component renders this?" / "what route serves this page?")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bad uses:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex state management changes (the visual output won't tell you if the logic is right)&lt;/li&gt;
&lt;li&gt;Performance optimization (runtime-aware tools see the DOM and server state, not your render cycles or bundle size)&lt;/li&gt;
&lt;li&gt;Replacing your understanding of the codebase with "the AI can see it"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Not applicable:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pure backend services with no web runtime (CLI tools, data pipelines, libraries)&lt;/li&gt;
&lt;li&gt;Projects with clean, predictable UIs where the source-to-render gap barely exists&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;The idea of giving AI tools access to runtime context isn't revolutionary. It's the obvious next step, the same way debuggers were the obvious next step after print statements. The engineering value is real but bounded: you're eliminating a specific feedback loop, not fundamentally changing what AI can do with code.&lt;/p&gt;

&lt;p&gt;If you're using AI tools and spending significant time in the describe-check-fix cycle — whether that's checking the browser for visual regressions or tailing server logs for errors — runtime-aware tools are worth evaluating. If your project is simple enough that AI edits usually work on the first try, you probably don't need them.&lt;/p&gt;

&lt;p&gt;The category is early. Everything listed here is either beta, experimental, or both. That's fine — try them on a side project, see if the workflow fits, and make your own judgment.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://frontman.sh" rel="noopener noreferrer"&gt;Frontman&lt;/a&gt; is open source on &lt;a href="https://github.com/frontman-ai/frontman" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. I'm involved with the project, so take my perspective accordingly. The runtime context gap is real regardless of which tool you use to address it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>tooling</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
