← All posts

SpaceX Tests Rockets by Blowing Them Up. Why Your Dev Loop Should Be Just as Disposable.

July 21, 2026 · 6 min read · The xShellz Team

SpaceX builds a Starship prototype, fuels it, and then sometimes watches it explode on the pad. To an outsider that looks like expensive failure. To the engineers, it's a few terabytes of telemetry and a pile of data they couldn't have gotten from a clean simulation. The spacecraft is disposable enough that blowing one up isn't a catastrophe. It's a deliberate step in a loop that turns a multi-year design cycle into a weekly cadence of build, test, break, learn, and rebuild.

A lot of developer workflows treat environments the opposite way. A dev machine is a mountain of accumulated config, dotfiles, half-installed packages, and state that nobody wants to disturb. Starting fresh means a morning lost to setup. So people guard their environment, avoid risky experiments, and end up with a loop that feels heavy and precious instead of light and fast.

I started stealing the SpaceX mindset a few months ago, and it changed how I code. The core shift: make your environment so cheap to create and throw away that you're willing to break it on purpose. Then pair that with an AI coding agent that can operate at the same tempo, running commands, editing files, and learning from each short cycle. The result is a dev loop that went from "dread a refactor" to "ship a first working version in minutes, then iterate six times before lunch."

The Problem with Precious Environments

When your local machine is the only place your code runs, every change carries a shadow cost. You tweak a dependency? Better hope it doesn't trash your Python or Node setup. You want to test a weird database migration? You'll spend 20 minutes on a Docker container that you'll then be afraid to touch. The fear of breaking your environment kills experimentation before it starts.

Even worse, local hardware caps how fast you can run a full test suite or rebuild a large project. The iteration speed hits a wall where you're waiting instead of thinking. That's the opposite of what you want when you're trying to move fast.

The SpaceX Mindset: Disposable vs Enduring

SpaceX's secret isn't special materials. It's that they separated the data from the hardware. They don't need any single rocket to survive. They need the data it generates during the attempt. The hardware is a consumable sensor platform.

In dev terms, your code and your config are the data. The OS, the shell, the packages, even the running process are the consumable layer. If you can spin up a fresh, identical shell in seconds, destroy it at will, and keep your work synced, you stop treating the environment as a pet. It becomes cattle. You'll break it, fork it, and redeploy without thinking. And that's when you start running experiments that actually teach you something.

A persistent remote shell that boots in under a second gives you that layer. You keep your dotfiles and project state on attached storage. The shell itself is ephemeral. One command to kill it, one to resurrect it with the same state pointing at your repo. No more "oh, I can't test that because something will bork my setup."

How Remote Shells + AI Agents Create High-Frequency Loops

A remote shell that's always on and reachable from anywhere removes the "where is my machine" friction. You open a terminal on any device, you're exactly where you left off: same prompt, same session, same tmux panes, same long-running processes. That persistent by default quality means you never context-switch to "where did I put that log output?"

Now add an AI coding agent living in the same shell. I've been using borg, the agent that ships inside xShellz shells. It's not a chat window you copy-paste from. It's a terminal-native tool that reads your code, runs shell commands, captures output, and writes patches directly. You aren't moving code between an IDE and a terminal; the agent is part of the same execution environment.

The loop shrinks to:

borg "add a --dry-run flag to the deploy script, include a simple test"
./deploy --dry-run   # borg already ran it and showed output
borg "dry-run shows wrong bucket name, fix it"
./deploy --dry-run   # now correct

Each step takes seconds, not minutes. If the agent's change breaks something, nuke the shell, re-attach storage, and re-run the agent with a refined prompt. The cost of a wrong turn is near zero, so you take more turns. That's the SpaceX curve: more iterations per hour equals faster convergence on a working solution.

A Real Example: Prototyping a CLI Tool

Last week I needed a small Go tool to parse some logfmt logs and produce Prometheus metrics. Normally I'd sketch a script, then spend 20 minutes Googling the logfmt library, setting up a temporary directory, writing a main.go, and testing. The friction to get the first working line of output isn't huge, but it adds up. I'd probably only test one or two scenarios before calling it done.

Instead, I opened a fresh shell on my xShellz box, told borg "drop me a Go program that reads logfmt lines from stdin and prints OpenMetrics counter lines for each log level," and waited 12 seconds. The first version compiled and produced output, but it miscounted multi-line entries. So I told the agent "the count is wrong for log lines that span multiple newlines, fix it and add a test with an example." Another few seconds, a corrected version, and a passing test. I went through six micro-iterations in under five minutes. The final tool was cleaner than what I'd write in an hour of careful solo coding, because I saw intermediate failures quickly and could course-correct without starting over. And the environment? When I was done, I destroyed the shell. The code was already pushed to a repo.

Why Local Fails to Do This

A local machine can spin up Docker containers fast, sure. But the cognitive load of orchestrating a container, volume mounts, port forwards, and making sure the AI agent has the right execution context is high. You end up scripting your dev environment instead of writing your actual code. And when your laptop slows to a crawl during a parallel build, your iteration frequency drops. Remote servers give you consistent CPU, no fan noise, and a network position that's often closer to your production APIs and databases. The shell becomes the constant; the hardware becomes a detail you stop thinking about.

The Soft Tie-Back (Because I Use It)

I'm biased: I work on xShellz, so I use our remote shells and the borg agent every day. But the principle doesn't depend on us. Any workflow where you can treat a full Linux environment as a fast, disposable resource unlocks the same mindset. The real unlock is combining a persistent session that stores your state with a command-line AI agent that shares that state. You stop guarding your machine and start treating it like a booster stage. Useful precisely because you're willing to see it crash.

If your dev loop feels heavy, ask yourself: how long would it take you to go from zero to a broken experiment, learn something, and be back to a clean state? If the answer is more than a minute, there's a SpaceX lesson waiting for you.