"Vibe coding" — describing what you want and letting an AI agent write, run, and revise the code — has crossed from party trick to production practice. This site was substantially built that way. So were the AI products in my portfolio, and the design pipeline for my drone hardware. I'm a believer. Which is exactly why I want to talk about the three profoundly unfashionable tools that make the practice survivable, because the vibes are the top layer of a stack, and the stack is old.
Git: The Undo Button for Confidence
An AI agent generates with total confidence and no memory of what it destroyed. That's not a criticism — it's a job description, and git is the other half of it. Version control converts the agent's velocity from a risk into an asset: every working state committed is a savepoint, every experiment is free, and the scariest sentence in vibe coding — "I refactored a few other things while I was in there" — becomes reviewable as a diff instead of discoverable as a mystery.
The practices that matter are small: commit before asking for anything ambitious, keep generated changes in reviewable chunks, and read the diff — the diff is where you actually supervise an agent, because prose summaries describe intent and diffs describe reality. When you can't explain a hunk, that's not a nitpick; that's the moment the codebase was about to stop being yours.
GitHub: Memory That Outlives the Session
An agent's context window forgets; the remote doesn't. Pushing is the difference between "my laptop has the project" and "the project exists." But the deeper value for vibe coding is that GitHub is where generated code meets process: pull requests give you a reviewable boundary around each burst of generation; CI runs the tests the agent wrote against the code the agent wrote, on a machine the agent doesn't control; issues turn tonight's "we should fix that someday" into something a future session — human or agent — can actually pick up. The agent is a brilliant collaborator with amnesia. GitHub is the shared notebook that makes collaboration with an amnesiac possible.
A Linux Box: Deployment You Can Reason About
The fashionable answer to deployment is a platform that abstracts everything. The vibe-coder's honest friend is a $6 virtual server running nginx — because when an agent (or you at 1am) needs to know why the site is down, an ssh session with real logs beats a dashboard with a status badge every time.
This portfolio runs that way: a static build, tar over ssh, nginx serving flat files, certbot on a timer. Every piece is inspectable, documented for twenty years, and — critically — deeply known to the models. The agents were trained on decades of nginx configs and systemd questions. Ask one to debug a proprietary platform's black box and it guesses; ask it to read an nginx error log and it's a wizard. Boring infrastructure isn't just cheaper — it's the infrastructure AI is best at operating.
The Lesson in the Layers
There's a pattern here that typography taught me long ago: the new expressive layer is only as good as the boring system under it. A beautiful typeface on a broken grid is a mess; a brilliant agent on an unversioned codebase is a countdown. The craft of vibe coding isn't prompting — prompting is easy. It's building the substrate that makes fearless generation safe: checkpoints you trust, memory that persists, and a server you can actually read.
Learn the old tools not instead of the vibes, but for them. The stack holds up the party.