DEV Community

dani.wam 🏴‍☠️ ⓦ
dani.wam 🏴‍☠️ ⓦ

Posted on

I spent 17 years building gaming platforms. Every morning I still fought my local dev environment

I've been building gaming startups since 2007. Shipped over 8000 games across four companies. Built infrastructure that handled millions of users.

And every single morning, I opened 6 terminal tabs (when lucky), typed the same start commands, forgot which port was which, got "address already in use" because yesterday's processes didn't die, and spent 10 minutes unfucking my setup before writing a single line of code.

The breaking point

Last month I needed to work on three projects simultaneously. WAM's API and frontend, the backend, ai endpoints and testing tools. That's 7 services across 3 projects.

My setup: MAMP Pro ($100/year) for some of it, manually edited nginx configs for the rest, mkcert for SSL because one project needed HTTPS callbacks, and a sticky note on my monitor with port numbers.

MAMP crashed. Again. nginx was hanging. Again. I killed it, restarted, realized it was still holding port 443, ran lsof -i :443, found a zombie process from three days ago, killed that too.

I looked at the clock. 25 minutes gone. Haven't written a single line of code.

That was the last time. Nail to the coffin moment.

What I built

run.dev — a terminal tool that does one thing: makes your local dev environment not suck.

You point it at a folder. It scans for package.json, Cargo.toml, go.mod, whatever's there. It figures out your services, suggests start commands, assigns ports. You get local domains with HTTPS. Everything shows up in one dashboard.

That's it. No Docker. No config files. No YAML. No accounts. No cloud. One binary.

curl -fsSL https://getrun.dev/install.sh | bash
Enter fullscreen mode Exit fullscreen mode

The part that makes people screenshot their terminal

When something crashes, instead of a stack trace, you get:

💀 bro, api is ded. port 4000 is already taken.
   i know what's wrong. press [f] to fix it
Enter fullscreen mode Exit fullscreen mode

Or:

🤒 got the flu — backend can't reach localhost:6379.
   is redis running? press [s] on it to start it
Enter fullscreen mode Exit fullscreen mode

The dashboard shows moods based on your stack's health:

  • 😎 vibing — everything green
  • 🤒 got the flu — something's down
  • 💀 flatlined — everything is down
  • 😮‍💨 close call — just auto-recovered

I didn't plan for this to be the feature that people care about most. But it turns out developers really like it when their tools talk to them like a human instead of vomiting error codes.

How it actually works (the interesting parts)

The reverse proxy uses SNI-based routing. When a TLS connection comes in, the tool reads the hostname from the ClientHello before the HTTP request arrives, picks the right certificate, and routes to the right port. All in Rust, using rustls. No nginx, no Caddy, no config files.

SSL certificates are generated in pure Rust with rcgen. On first run, it creates a local CA, adds it to your system trust store, and signs certs for each local domain on the fly. Zero external dependencies. You get green padlock in the browser without installing anything.

Process management handles the thing that drives everyone insane: zombie processes. When you stop a service, it doesn't just kill the parent PID — it kills the entire process group. npm run dev spawns node, which spawns webpack, which spawns watchers. You need to kill the whole tree. Then it verifies the port is actually free before reporting "stopped." Because TIME_WAIT is real.

Crash detection parses stderr against common patterns:

  • EADDRINUSE → find and kill the PID holding the port
  • Cannot find module → suggest npm install
  • ECONNREFUSED → cross-reference against your other services
  • Unknown errors → optionally send to Claude Code for deeper diagnosis

The AI part (and why it's optional)

I integrated Claude Code as the diagnostic brain. When the template-based error matching can't figure out what happened, Claude reads the stderr and explains it in plain English.

But here's the thing — it's optional. Disabled by default. Works perfectly without it. I use AI tools daily (I'm literally building AI-native companies), but I hate when tools force an AI dependency that isn't needed.

90% of crashes are the same 5 problems. A regex handles those fine. Claude is there for the 10% that are actually weird.

Why I open sourced it

I've been in the startup game long enough to know the difference between a product and a tool. This is a tool. It solves a problem that every developer has. The value isn't in keeping it proprietary — it's in getting it into as many hands as possible.

MIT licensed. Single Rust binary. Source on GitHub.

If you've ever wasted 20 minutes fighting your local dev environment before your first coffee, give it a try. Takes 30 seconds to install, and you'll know immediately if it's for you.

curl -fsSL https://getrun.dev/install.sh | bash
Enter fullscreen mode Exit fullscreen mode

I'm Dani — I build gaming and blockchain companies (WAM. I'm on X as @dani_wam if you want to talk about dev tools, gaming, or AI agents.

Top comments (0)