<?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: Huzky</title>
    <description>The latest articles on DEV Community by Huzky (@huzky30g).</description>
    <link>https://dev.to/huzky30g</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%2F4079835%2Ffeb93c61-e2dd-4a86-a0a5-f873a315b21c.jpg</url>
      <title>DEV Community: Huzky</title>
      <link>https://dev.to/huzky30g</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/huzky30g"/>
    <language>en</language>
    <item>
      <title>I Got Tired of Alt-Tabbing to a Real Terminal, So I Built My AI a Front Door</title>
      <dc:creator>Huzky</dc:creator>
      <pubDate>Sun, 16 Aug 2026 07:48:36 +0000</pubDate>
      <link>https://dev.to/huzky30g/i-got-tired-of-alt-tabbing-to-a-real-terminal-so-i-built-my-ai-a-front-door-2h78</link>
      <guid>https://dev.to/huzky30g/i-got-tired-of-alt-tabbing-to-a-real-terminal-so-i-built-my-ai-a-front-door-2h78</guid>
      <description>&lt;p&gt;So you're deep in a session with Claude Code or Cursor, everything's flowing, and then it hits a wall:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I can't install this package system-wide, I don't have sudo."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And you're sitting right there, hands on the keyboard, perfectly willing to run that one command yourself. But instead you have to stop, alt-tab to a real terminal, type it out, come back, and re-explain what just happened so the agent can pick up where it left off. Every time. All day.&lt;/p&gt;

&lt;p&gt;The sandbox isn't wrong, by the way. You &lt;em&gt;want&lt;/em&gt; your AI boxed in — nobody wants an agent that can quietly touch &lt;code&gt;/etc&lt;/code&gt; or fiddle with firewall rules on its own initiative. The problem isn't that the sandbox exists. It's that there's no door in it. No way to say "yes, this one, go ahead" without leaving the conversation entirely.&lt;/p&gt;

&lt;p&gt;That's the whole reason I built &lt;strong&gt;Conduit&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it actually is
&lt;/h2&gt;

&lt;p&gt;Conduit is a small Python process that runs on your machine, with whatever privileges &lt;em&gt;you&lt;/em&gt; give it. Your AI proposes a command. You get a popup showing exactly what it wants to run. You click Yes or No — and it defaults to No, on purpose. Nothing executes without you personally reading it first.&lt;/p&gt;

&lt;p&gt;Starting it is about as complicated as it gets:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;That's it. No pip installs, standard library only. It opens a local dashboard, prints a session token, and waits.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the flow actually looks
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;You start Conduit in an elevated terminal (or just double-click &lt;code&gt;conduit.bat&lt;/code&gt; on Windows).&lt;/li&gt;
&lt;li&gt;It opens a dashboard in your browser with a token and a "copy prompt" button.&lt;/li&gt;
&lt;li&gt;You hand that prompt to your agent, or wire it up once as an MCP server.&lt;/li&gt;
&lt;li&gt;The agent asks to run something privileged — say, installing a package or restarting a service.&lt;/li&gt;
&lt;li&gt;A dialog pops up on your screen with the exact command.&lt;/li&gt;
&lt;li&gt;You click. If yes, it runs and the output streams back to the agent as JSON. If no, the agent gets &lt;code&gt;DENIED&lt;/code&gt; and that's the end of it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No silent execution, no "trust me," no background magic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two ways to wire it up
&lt;/h2&gt;

&lt;p&gt;If your client speaks MCP (Claude Code, Cursor, Claude Desktop), this is genuinely one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add conduit &lt;span class="nt"&gt;--&lt;/span&gt; python /full/path/to/run_conduit.py &lt;span class="nt"&gt;--mcp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That gives the agent a native &lt;code&gt;run_command&lt;/code&gt; tool, plus read-only &lt;code&gt;list_shells&lt;/code&gt; and &lt;code&gt;get_status&lt;/code&gt; that don't need your approval at all. Worth noting: the MCP piece is just a thin bridge. It runs inside the agent's own sandbox and can't execute anything itself — it just forwards the request over localhost to the real Conduit process, which is the one actually holding the keys and the dialog box.&lt;/p&gt;

&lt;p&gt;If MCP isn't an option, plain HTTP works too, and it's about eight lines of stdlib Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib.request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:40404/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;command&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;brew install ffmpeg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer YOUR_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both paths land in the same queue and the same approval dialog. Doesn't matter which one your tool prefers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I didn't cut corners on the boring stuff
&lt;/h2&gt;

&lt;p&gt;The security details matter more than the UI here, so a quick rundown: it binds only to &lt;code&gt;127.0.0.1&lt;/code&gt;, never touches your network. Every session gets a fresh UUID token that dies when you close Conduit — nothing persists, no history lingers around waiting to be a problem. Unanswered prompts auto-deny after 60 seconds instead of hanging open forever. And there's a &lt;code&gt;--headless&lt;/code&gt; flag with &lt;code&gt;--always-allow&lt;/code&gt; baked in for when you're running on a VPS and genuinely trust the pipeline — but that's opt-in, never the default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this actually helps
&lt;/h2&gt;

&lt;p&gt;Mostly it's the small stuff that used to break my flow: &lt;code&gt;apt install&lt;/code&gt;-ing a missing system dependency, restarting a local service after a config change, checking disk space, tweaking something in a protected directory. None of it is dangerous when &lt;em&gt;you're&lt;/em&gt; the one clicking approve. It was only ever annoying because there was no clean way to approve it without leaving the chat.&lt;/p&gt;

&lt;p&gt;Conduit doesn't make your AI more powerful. It just gives you a button.&lt;/p&gt;

&lt;p&gt;Repo's here if you want to poke at it: &lt;a href="https://github.com/Rehan30g/Conduit" rel="noopener noreferrer"&gt;github.com/Rehan30g/Conduit&lt;/a&gt;&lt;/p&gt;

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