<?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: An Nguyễn Hoàng</title>
    <description>The latest articles on DEV Community by An Nguyễn Hoàng (@an_nguynhong_0c0496258).</description>
    <link>https://dev.to/an_nguynhong_0c0496258</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%2F3570170%2F5005d481-a27d-4a44-b72d-2d2de9e7d9a1.png</url>
      <title>DEV Community: An Nguyễn Hoàng</title>
      <link>https://dev.to/an_nguynhong_0c0496258</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/an_nguynhong_0c0496258"/>
    <language>en</language>
    <item>
      <title>I gave my coding agent root on my VPS so it would stop making me deploy by hand</title>
      <dc:creator>An Nguyễn Hoàng</dc:creator>
      <pubDate>Tue, 02 Jun 2026 03:38:43 +0000</pubDate>
      <link>https://dev.to/an_nguynhong_0c0496258/i-gave-my-ai-agent-root-on-my-server-so-it-could-deploy-for-me-1881</link>
      <guid>https://dev.to/an_nguynhong_0c0496258/i-gave-my-ai-agent-root-on-my-server-so-it-could-deploy-for-me-1881</guid>
      <description>&lt;p&gt;Last week I built a little dashboard with Claude. Took maybe ten minutes. Then I spent the next hour trying to get it online.&lt;/p&gt;

&lt;p&gt;ssh in, install docker, write a Dockerfile, set up nginx, run certbot, certbot fails, read the log, oh the DNS hasn't propagated, wait, run it again, open port 443, realize ufw was blocking it the whole time. By the time it was live I'd forgotten what the app even did.&lt;/p&gt;

&lt;p&gt;I've done that maybe a few hundred times by now. I'm a backend guy, I'm fast at it. But fast at something boring still means doing the boring thing.&lt;/p&gt;

&lt;p&gt;So at some point I just thought: the AI already wrote the app. Why does it stop right when the annoying part starts? Why doesn't it just deploy the thing itself?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fluongs3%2Fvibe-deploy%2Fmain%2Fassets%2Fdemo.gif" 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%2Fraw.githubusercontent.com%2Fluongs3%2Fvibe-deploy%2Fmain%2Fassets%2Fdemo.gif" alt="one message, app goes live with https" width="720" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The reason is it has no hands. The model can write you a perfect docker-compose file. It can't ssh into your box and run it. No connection to your server, nowhere to hold your key.&lt;/p&gt;

&lt;p&gt;So I gave it hands. It's an MCP server, vibe-deploy. You hook it up once to a VPS you own, and then you just say "deploy this to notes.mydomain.com" and the agent containerizes it, ships it over ssh, sets up nginx, gets a real Let's Encrypt cert. Node, Python, Go, plain static. It figures out the stack and writes the Dockerfile.&lt;/p&gt;

&lt;p&gt;No PaaS, no per-seat pricing, no free tier you'll outgrow. A $5 box runs a dozen of my projects and I own the whole thing.&lt;/p&gt;

&lt;p&gt;The "you gave an AI root on your server??" reaction is fair, so: it runs locally, your key never leaves your laptop. I used a separate ssh key scoped to deploys, not my real one, and you should too. It checks the server host key before connecting and validates everything you pass it, because a deploy tool that pastes your input straight into a shell is a horror story waiting to happen. I had someone audit the security before I put it out. They found two real bugs. I fixed them.&lt;/p&gt;

&lt;p&gt;It's free and MIT, on &lt;a href="https://github.com/luongs3/vibe-deploy" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and npm as &lt;code&gt;@cgnguyen/vibe-deploy&lt;/code&gt;. I built it because I wanted it. If you live in the same gap between "it works on localhost" and "it's online", try it and tell me where it breaks. The stacks it supports right now are the ones I needed. Next ones are whatever you ask for.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>devops</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
