Repository files navigation

Rust 2021VersionPlatformLicenseAI Powered

run.dev

AI-native local dev environment

One dashboard. All your services. Zero config files to babysit.


The Problem

You're an architect. Or an artisan. Or both. You've got 4 microservices, 2 frontends, a websocket server, and that one Go binary Steve wrote before he left. Every morning you open 6 terminal tabs, type the same commands, forget which port is which, and lose 15 minutes to "address already in use" before your first coffee.

MAMP? Nginx configs? Docker Compose YAML files longer than your lease agreement?

Nah.

What Run.dev Does

Run.dev is a single Rust binary that replaces all of that. It gives you:

  • A nice dashboard — see every project and service at a glance, start/stop with a keystroke
  • Automatic local domainsapi.myapp.local, frontend.myapp.local, with real HTTPS
  • Zero-config SSL — mkcert-trusted certs, with rcgen fallback. No manual cert management
  • Reverse proxy — SNI-based routing with WebSocket support, from pretty URLs to localhost:whatever
  • Process management — spawn, monitor, restart. CPU and RAM stats per service, live
  • Smart project scanning — point it at a folder, it figures out npm run dev vs cargo run vs go run .
  • AI crash diagnosis — when something dies, Claude reads the stderr and tells you what went wrong
  • Personality — run.dev has moods. When everything works: 😎 vibing. When stuff crashes: 💀 flatlined
 ██████╗ ██╗ ██╗███╗ ██╗ ██████╗ ███████╗██╗ ██╗
██╔══██╗██║ ██║████╗ ██║ ██╔══██╗██╔════╝██║ ██║ 3/4 services vibing
██████╔╝██║ ██║██╔██╗ ██║ ██║ ██║█████╗ ██║ ██║
██╔══██╗██║ ██║██║╚██╗██║ ██║ ██║██╔══╝ ╚██╗ ██╔╝ [a] add service [n] new project
██║ ██║╚██████╔╝██║ ╚████║ ██████╔╝███████╗ ╚████╔╝ [s] start [x] stop [r] restart
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═══╝ [/] ask the AI anything
Daniel Tamas
hello@danieltamas.com 2 projects configured v0.3.2
projects ────────────────────────────────────────────────────────────────────────
service url local mem cpu
v WAM 2 services
| * win.wam.app https://win.wam.app localhost:5111 42M 0.0%
| * api.wam.app https://api.wam.app localhost:4000 38M 2.1%
v side-project 1 service
| x backend bro, backend is ded. port 3000 is already taken.
| press [f] to let me fix it
────────────────────────────────────────────────────────────────────────────────
/ ask claude something...

Install

One line:

curl -fsSL https://getrun.dev/install.sh | bash

The installer shows you exactly what it will change before proceeding:

What gets installed:

  • rundev binary → /usr/local/bin/rundev (+ run.dev symlink)
  • mkcert for trusted local HTTPS certificates
  • Build tools (gcc, pkg-config, libssl-dev) — only if building from source

What changes on your system:

  • /etc/hosts — adds entries for your local dev domains
  • /etc/sudoers.d/rundev — passwordless sudo for the hosts helper only
  • macOS:/etc/pf.anchors/rundev + /etc/pf.conf — pfctl firewall rules (port 80→1111, 443→1112)
  • Linux: iptables NAT rules for port forwarding (80→1111, 443→1112, localhost only)
  • Adds /usr/local/bin to your shell PATH (if not already there)

All changes can be reversed with rundev uninstall. If the installer fails partway through, it automatically rolls back everything it changed.

When run interactively (bash install.sh), you'll be prompted to confirm. When piped (curl | bash), it proceeds after showing the summary.

Or build it yourself:

git clone https://github.com/danieltamas/run.dev.git
cd run.dev
make install

Requirements: Rust toolchain (the installer handles this automatically). No Node. No Python. No Docker.

Quick Start

# Launch the dashboard (both commands work)
rundev
run.dev
# Press [a] to create a project → give it a name → get a .local domain# Press [a] again on the project → point it at a folder# Run.dev scans it, suggests a start command, picks a port# Your service is running. With SSL. On a pretty URL. In 30 seconds.

How It Works

Browser Run.dev Your services
│ │ │
│ https://api.myapp.local │ │
├─────────────────────────►│ /etc/hosts → 127.0.0.1 + ::1 │
│ │ port 443 → 1112 (pfctl) │
│ │ TLS + SNI → pick SSL cert │
│ │ Host header → route lookup │
│ ├─────────────────────────────►│ localhost:4000
│ │◄─────────────────────────────┤
│◄─────────────────────────┤ │
│ 200 OK (green padlock) │ │

No Docker network. No Traefik. No nginx.conf. Just a binary that manages your processes and routes your traffic.

CLI

Both rundev and run.dev work as the command name.

rundev # Open the TUI dashboard
rundev up [project] # Start project(s) and open dashboard
rundev down [project] # Stop project(s)
rundev status # Quick status check (no TUI)
rundev list # List all projects and services
rundev doctor # Health check — ports, certs, hosts, helper
rundev clean # Stop everything, remove /etc/hosts entries
rundev setup # Re-install privileged helper + port forwarding

Flags:

FlagWhat it does
--no-proxySkip the reverse proxy
--no-sslSkip SSL certificate setup
--no-aiDisable Claude integration
-vVerbose/debug output

Keyboard Shortcuts

KeyAction
j / kNavigate up/down
EnterExpand/collapse project
aAdd project or service
sStart selected service
xStop selected service
rRestart selected service
fAuto-fix crashed service
lToggle log panel
/Ask Claude a question
qQuit (services keep running)
QQuit and stop everything

Mouse works too. Click things. Scroll things. It's 2026.

Project Detection

Point run.dev at a folder and it knows what to do:

It findsIt suggests
package.jsonnpm run dev, npm start, etc.
Cargo.tomlcargo run
go.modgo run .
manage.pypython manage.py runserver
Gemfilebundle exec rails server
ProcfileEach process line
docker-compose.ymlService commands (runs natively, not in Docker)

Ports are auto-detected from command flags, .env files, package.json proxy fields, or framework defaults.

The Mood System

Run.dev watches all your services and expresses how things are going:

MoodEmojiMeaning
Vibing😎Everything running, no issues
Chill😌Running, minor warnings
Got the Flu🤒1-2 services crashed
Wounded🤕More than half are down
Flatlined💀Everything is down
Fixing🔧Auto-restart in progress

When something crashes, run.dev doesn't just show you an exit code. It reads the stderr, categorizes the error, and gives you a personality-driven message with a suggested fix:

✗ api bro, api is ded. port 4000 is already taken.
i know what's wrong. press [f] to let me fix it

Press [f] and it kills the process hogging the port. Press / and ask Claude what went wrong.

AI Integration (Optional)

Run.dev is built to work with Claude Code, Anthropic's local CLI agent. When a service crashes, run.dev doesn't just show you the exit code — it sends the stderr to Claude for a real diagnosis. Claude reads the logs, understands the context, and tells you what actually went wrong.

What you get:

  • Crash diagnosis — a service dies, Claude reads the stderr and explains what happened and how to fix it
  • Live debug sessions — press / in the dashboard, ask Claude anything about your running services. It knows your project structure, your routes, your ports — it answers in context
  • Auto-fix suggestions — for common errors (port conflicts, missing modules, connection failures), run.dev suggests a fix. Press [f] and it handles it

Run.dev talks to Claude Code — your code and logs never leave your machine.

Configure it in ~/.config/rundev/config.yaml:

claude_proxy: http://localhost:3456/v1

The AI features are entirely optional. The app works perfectly without them. Disable anytime with --no-ai or just don't configure the proxy.

Architecture

See src/docs/ARCHITECTURE.md for the full technical deep-dive — module structure, data flow diagrams, key types, and design decisions.

Per-Service Node Version

If your services need different Node.js versions, add node_version to the service config. Run.dev wraps the start command with nvm use <version> automatically — no manual switching.

services:
backend:
path: /Users/dan/code/myapp/backendcommand: npm run devport: 3000node_version: "22.9"# uses nvm to switch before runningfrontend:
path: /Users/dan/code/myapp/frontendcommand: npm run devport: 5173node_version: "20"# different version, no problem

Requires nvm installed at $NVM_DIR (defaults to ~/.nvm). If node_version is omitted, the command runs with whatever Node is on your PATH.

Config Files

Everything lives in ~/.config/rundev/ (or ~/Library/Application Support/rundev/ on macOS):

~/.config/rundev/
├── projects/ # One YAML per project
│ ├── myapp.yaml
│ └── side-project.yaml
├── certs/ # Auto-generated SSL certificates
│ ├── myapp.local.pem
│ └── myapp.local-key.pem
├── config.yaml # Global settings (Claude proxy, theme)
└── state.json # PID persistence for background mode

FAQ

Do my services stop when I close run.dev? No. Press q and they keep running in the background. Next time you open run.dev, it reconnects. Press Q (capital) to stop everything on exit.

Does it work with Docker services? Run.dev manages processes directly — it doesn't orchestrate containers. If your service runs with a shell command, run.dev can manage it. If it only runs in Docker, you'd run docker compose up as the service command.

Do I need to trust the self-signed certs? Run.dev uses mkcert to generate locally-trusted certs — green padlock out of the box, no manual trust needed. If mkcert isn't available, it falls back to rcgen self-signed certs (browsers will show a warning you can click through once).

Does it work with Chrome's DNS-over-HTTPS? Chrome with "Use secure DNS" enabled bypasses /etc/hosts entirely. If your local domains aren't resolving, go to chrome://settings/security and disable "Use secure DNS". Safari, Firefox, curl, and all other tools work out of the box — run.dev writes both IPv4 and IPv6 entries to prevent Happy Eyeballs from falling back to production addresses.

My domains stopped working after a while, but the dashboard says the proxy is running. This used to happen when the OS dropped run.dev's port-forwarding rules underneath it — macOS flushes them across sleep/wake, and Docker or a firewall reload can wipe them on Linux. The listeners stayed up (so the dashboard looked fine) but browser traffic no longer reached them. run.dev now re-checks the redirect every few seconds and re-applies it automatically, so it recovers without a restart; you'll briefly see a "port forwarding inactive — re-applying" notice while it heals. Run rundev doctor to confirm the redirect is routing.

What about Windows? Not yet. macOS and Linux only. WSL might work but isn't tested.

License

MIT License — see LICENSE for details.

Copyright (c) 2026 Daniel Tamas hello@danieltamas.com


Built by Daniel Tamas
Because life's too short for nginx.conf

getrun.dev

About

Run.dev is an AI-native local development environment built in Rust. It manages all your services from one TUI dashboard — automatic .local domains with HTTPS, SNI-based reverse proxy, live CPU/memory stats, and Claude Code integration for crash diagnosis and live debugging. One binary. Zero config files.

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Rust 2021VersionPlatformLicenseAI Powered

run.dev

AI-native local dev environment

One dashboard. All your services. Zero config files to babysit.


The Problem

You're an architect. Or an artisan. Or both. You've got 4 microservices, 2 frontends, a websocket server, and that one Go binary Steve wrote before he left. Every morning you open 6 terminal tabs, type the same commands, forget which port is which, and lose 15 minutes to "address already in use" before your first coffee.

MAMP? Nginx configs? Docker Compose YAML files longer than your lease agreement?

Nah.

What Run.dev Does

Run.dev is a single Rust binary that replaces all of that. It gives you:

  • A nice dashboard — see every project and service at a glance, start/stop with a keystroke
  • Automatic local domainsapi.myapp.local, frontend.myapp.local, with real HTTPS
  • Zero-config SSL — mkcert-trusted certs, with rcgen fallback. No manual cert management
  • Reverse proxy — SNI-based routing with WebSocket support, from pretty URLs to localhost:whatever
  • Process management — spawn, monitor, restart. CPU and RAM stats per service, live
  • Smart project scanning — point it at a folder, it figures out npm run dev vs cargo run vs go run .
  • AI crash diagnosis — when something dies, Claude reads the stderr and tells you what went wrong
  • Personality — run.dev has moods. When everything works: 😎 vibing. When stuff crashes: 💀 flatlined
 ██████╗ ██╗ ██╗███╗ ██╗ ██████╗ ███████╗██╗ ██╗
██╔══██╗██║ ██║████╗ ██║ ██╔══██╗██╔════╝██║ ██║ 3/4 services vibing
██████╔╝██║ ██║██╔██╗ ██║ ██║ ██║█████╗ ██║ ██║
██╔══██╗██║ ██║██║╚██╗██║ ██║ ██║██╔══╝ ╚██╗ ██╔╝ [a] add service [n] new project
██║ ██║╚██████╔╝██║ ╚████║ ██████╔╝███████╗ ╚████╔╝ [s] start [x] stop [r] restart
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═══╝ [/] ask the AI anything
Daniel Tamas
hello@danieltamas.com 2 projects configured v0.3.2
projects ────────────────────────────────────────────────────────────────────────
service url local mem cpu
v WAM 2 services
| * win.wam.app https://win.wam.app localhost:5111 42M 0.0%
| * api.wam.app https://api.wam.app localhost:4000 38M 2.1%
v side-project 1 service
| x backend bro, backend is ded. port 3000 is already taken.
| press [f] to let me fix it
────────────────────────────────────────────────────────────────────────────────
/ ask claude something...

Install

One line:

curl -fsSL https://getrun.dev/install.sh | bash

The installer shows you exactly what it will change before proceeding:

What gets installed:

  • rundev binary → /usr/local/bin/rundev (+ run.dev symlink)
  • mkcert for trusted local HTTPS certificates
  • Build tools (gcc, pkg-config, libssl-dev) — only if building from source

What changes on your system:

  • /etc/hosts — adds entries for your local dev domains
  • /etc/sudoers.d/rundev — passwordless sudo for the hosts helper only
  • macOS:/etc/pf.anchors/rundev + /etc/pf.conf — pfctl firewall rules (port 80→1111, 443→1112)
  • Linux: iptables NAT rules for port forwarding (80→1111, 443→1112, localhost only)
  • Adds /usr/local/bin to your shell PATH (if not already there)

All changes can be reversed with rundev uninstall. If the installer fails partway through, it automatically rolls back everything it changed.

When run interactively (bash install.sh), you'll be prompted to confirm. When piped (curl | bash), it proceeds after showing the summary.

Or build it yourself:

git clone https://github.com/danieltamas/run.dev.git
cd run.dev
make install

Requirements: Rust toolchain (the installer handles this automatically). No Node. No Python. No Docker.

Quick Start

# Launch the dashboard (both commands work)
rundev
run.dev
# Press [a] to create a project → give it a name → get a .local domain# Press [a] again on the project → point it at a folder# Run.dev scans it, suggests a start command, picks a port# Your service is running. With SSL. On a pretty URL. In 30 seconds.

How It Works

Browser Run.dev Your services
│ │ │
│ https://api.myapp.local │ │
├─────────────────────────►│ /etc/hosts → 127.0.0.1 + ::1 │
│ │ port 443 → 1112 (pfctl) │
│ │ TLS + SNI → pick SSL cert │
│ │ Host header → route lookup │
│ ├─────────────────────────────►│ localhost:4000
│ │◄─────────────────────────────┤
│◄─────────────────────────┤ │
│ 200 OK (green padlock) │ │

No Docker network. No Traefik. No nginx.conf. Just a binary that manages your processes and routes your traffic.

CLI

Both rundev and run.dev work as the command name.

rundev # Open the TUI dashboard
rundev up [project] # Start project(s) and open dashboard
rundev down [project] # Stop project(s)
rundev status # Quick status check (no TUI)
rundev list # List all projects and services
rundev doctor # Health check — ports, certs, hosts, helper
rundev clean # Stop everything, remove /etc/hosts entries
rundev setup # Re-install privileged helper + port forwarding

Flags:

FlagWhat it does
--no-proxySkip the reverse proxy
--no-sslSkip SSL certificate setup
--no-aiDisable Claude integration
-vVerbose/debug output

Keyboard Shortcuts

KeyAction
j / kNavigate up/down
EnterExpand/collapse project
aAdd project or service
sStart selected service
xStop selected service
rRestart selected service
fAuto-fix crashed service
lToggle log panel
/Ask Claude a question
qQuit (services keep running)
QQuit and stop everything

Mouse works too. Click things. Scroll things. It's 2026.

Project Detection

Point run.dev at a folder and it knows what to do:

It findsIt suggests
package.jsonnpm run dev, npm start, etc.
Cargo.tomlcargo run
go.modgo run .
manage.pypython manage.py runserver
Gemfilebundle exec rails server
ProcfileEach process line
docker-compose.ymlService commands (runs natively, not in Docker)

Ports are auto-detected from command flags, .env files, package.json proxy fields, or framework defaults.

The Mood System

Run.dev watches all your services and expresses how things are going:

MoodEmojiMeaning
Vibing😎Everything running, no issues
Chill😌Running, minor warnings
Got the Flu🤒1-2 services crashed
Wounded🤕More than half are down
Flatlined💀Everything is down
Fixing🔧Auto-restart in progress

When something crashes, run.dev doesn't just show you an exit code. It reads the stderr, categorizes the error, and gives you a personality-driven message with a suggested fix:

✗ api bro, api is ded. port 4000 is already taken.
i know what's wrong. press [f] to let me fix it

Press [f] and it kills the process hogging the port. Press / and ask Claude what went wrong.

AI Integration (Optional)

Run.dev is built to work with Claude Code, Anthropic's local CLI agent. When a service crashes, run.dev doesn't just show you the exit code — it sends the stderr to Claude for a real diagnosis. Claude reads the logs, understands the context, and tells you what actually went wrong.

What you get:

  • Crash diagnosis — a service dies, Claude reads the stderr and explains what happened and how to fix it
  • Live debug sessions — press / in the dashboard, ask Claude anything about your running services. It knows your project structure, your routes, your ports — it answers in context
  • Auto-fix suggestions — for common errors (port conflicts, missing modules, connection failures), run.dev suggests a fix. Press [f] and it handles it

Run.dev talks to Claude Code — your code and logs never leave your machine.

Configure it in ~/.config/rundev/config.yaml:

claude_proxy: http://localhost:3456/v1

The AI features are entirely optional. The app works perfectly without them. Disable anytime with --no-ai or just don't configure the proxy.

Architecture

See src/docs/ARCHITECTURE.md for the full technical deep-dive — module structure, data flow diagrams, key types, and design decisions.

Per-Service Node Version

If your services need different Node.js versions, add node_version to the service config. Run.dev wraps the start command with nvm use <version> automatically — no manual switching.

services:
backend:
path: /Users/dan/code/myapp/backendcommand: npm run devport: 3000node_version: "22.9"# uses nvm to switch before runningfrontend:
path: /Users/dan/code/myapp/frontendcommand: npm run devport: 5173node_version: "20"# different version, no problem

Requires nvm installed at $NVM_DIR (defaults to ~/.nvm). If node_version is omitted, the command runs with whatever Node is on your PATH.

Config Files

Everything lives in ~/.config/rundev/ (or ~/Library/Application Support/rundev/ on macOS):

~/.config/rundev/
├── projects/ # One YAML per project
│ ├── myapp.yaml
│ └── side-project.yaml
├── certs/ # Auto-generated SSL certificates
│ ├── myapp.local.pem
│ └── myapp.local-key.pem
├── config.yaml # Global settings (Claude proxy, theme)
└── state.json # PID persistence for background mode

FAQ

Do my services stop when I close run.dev? No. Press q and they keep running in the background. Next time you open run.dev, it reconnects. Press Q (capital) to stop everything on exit.

Does it work with Docker services? Run.dev manages processes directly — it doesn't orchestrate containers. If your service runs with a shell command, run.dev can manage it. If it only runs in Docker, you'd run docker compose up as the service command.

Do I need to trust the self-signed certs? Run.dev uses mkcert to generate locally-trusted certs — green padlock out of the box, no manual trust needed. If mkcert isn't available, it falls back to rcgen self-signed certs (browsers will show a warning you can click through once).

Does it work with Chrome's DNS-over-HTTPS? Chrome with "Use secure DNS" enabled bypasses /etc/hosts entirely. If your local domains aren't resolving, go to chrome://settings/security and disable "Use secure DNS". Safari, Firefox, curl, and all other tools work out of the box — run.dev writes both IPv4 and IPv6 entries to prevent Happy Eyeballs from falling back to production addresses.

My domains stopped working after a while, but the dashboard says the proxy is running. This used to happen when the OS dropped run.dev's port-forwarding rules underneath it — macOS flushes them across sleep/wake, and Docker or a firewall reload can wipe them on Linux. The listeners stayed up (so the dashboard looked fine) but browser traffic no longer reached them. run.dev now re-checks the redirect every few seconds and re-applies it automatically, so it recovers without a restart; you'll briefly see a "port forwarding inactive — re-applying" notice while it heals. Run rundev doctor to confirm the redirect is routing.

What about Windows? Not yet. macOS and Linux only. WSL might work but isn't tested.

License

MIT License — see LICENSE for details.

Copyright (c) 2026 Daniel Tamas hello@danieltamas.com


Built by Daniel Tamas
Because life's too short for nginx.conf

getrun.dev

About

Run.dev is an AI-native local development environment built in Rust. It manages all your services from one TUI dashboard — automatic .local domains with HTTPS, SNI-based reverse proxy, live CPU/memory stats, and Claude Code integration for crash diagnosis and live debugging. One binary. Zero config files.

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Rust 2021VersionPlatformLicenseAI Powered

run.dev

AI-native local dev environment

One dashboard. All your services. Zero config files to babysit.


The Problem

You're an architect. Or an artisan. Or both. You've got 4 microservices, 2 frontends, a websocket server, and that one Go binary Steve wrote before he left. Every morning you open 6 terminal tabs, type the same commands, forget which port is which, and lose 15 minutes to "address already in use" before your first coffee.

MAMP? Nginx configs? Docker Compose YAML files longer than your lease agreement?

Nah.

What Run.dev Does

Run.dev is a single Rust binary that replaces all of that. It gives you:

  • A nice dashboard — see every project and service at a glance, start/stop with a keystroke
  • Automatic local domainsapi.myapp.local, frontend.myapp.local, with real HTTPS
  • Zero-config SSL — mkcert-trusted certs, with rcgen fallback. No manual cert management
  • Reverse proxy — SNI-based routing with WebSocket support, from pretty URLs to localhost:whatever
  • Process management — spawn, monitor, restart. CPU and RAM stats per service, live
  • Smart project scanning — point it at a folder, it figures out npm run dev vs cargo run vs go run .
  • AI crash diagnosis — when something dies, Claude reads the stderr and tells you what went wrong
  • Personality — run.dev has moods. When everything works: 😎 vibing. When stuff crashes: 💀 flatlined
 ██████╗ ██╗ ██╗███╗ ██╗ ██████╗ ███████╗██╗ ██╗
██╔══██╗██║ ██║████╗ ██║ ██╔══██╗██╔════╝██║ ██║ 3/4 services vibing
██████╔╝██║ ██║██╔██╗ ██║ ██║ ██║█████╗ ██║ ██║
██╔══██╗██║ ██║██║╚██╗██║ ██║ ██║██╔══╝ ╚██╗ ██╔╝ [a] add service [n] new project
██║ ██║╚██████╔╝██║ ╚████║ ██████╔╝███████╗ ╚████╔╝ [s] start [x] stop [r] restart
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═══╝ [/] ask the AI anything
Daniel Tamas
hello@danieltamas.com 2 projects configured v0.3.2
projects ────────────────────────────────────────────────────────────────────────
service url local mem cpu
v WAM 2 services
| * win.wam.app https://win.wam.app localhost:5111 42M 0.0%
| * api.wam.app https://api.wam.app localhost:4000 38M 2.1%
v side-project 1 service
| x backend bro, backend is ded. port 3000 is already taken.
| press [f] to let me fix it
────────────────────────────────────────────────────────────────────────────────
/ ask claude something...

Install

One line:

curl -fsSL https://getrun.dev/install.sh | bash

The installer shows you exactly what it will change before proceeding:

What gets installed:

  • rundev binary → /usr/local/bin/rundev (+ run.dev symlink)
  • mkcert for trusted local HTTPS certificates
  • Build tools (gcc, pkg-config, libssl-dev) — only if building from source

What changes on your system:

  • /etc/hosts — adds entries for your local dev domains
  • /etc/sudoers.d/rundev — passwordless sudo for the hosts helper only
  • macOS:/etc/pf.anchors/rundev + /etc/pf.conf — pfctl firewall rules (port 80→1111, 443→1112)
  • Linux: iptables NAT rules for port forwarding (80→1111, 443→1112, localhost only)
  • Adds /usr/local/bin to your shell PATH (if not already there)

All changes can be reversed with rundev uninstall. If the installer fails partway through, it automatically rolls back everything it changed.

When run interactively (bash install.sh), you'll be prompted to confirm. When piped (curl | bash), it proceeds after showing the summary.

Or build it yourself:

git clone https://github.com/danieltamas/run.dev.git
cd run.dev
make install

Requirements: Rust toolchain (the installer handles this automatically). No Node. No Python. No Docker.

Quick Start

# Launch the dashboard (both commands work)
rundev
run.dev
# Press [a] to create a project → give it a name → get a .local domain# Press [a] again on the project → point it at a folder# Run.dev scans it, suggests a start command, picks a port# Your service is running. With SSL. On a pretty URL. In 30 seconds.

How It Works

Browser Run.dev Your services
│ │ │
│ https://api.myapp.local │ │
├─────────────────────────►│ /etc/hosts → 127.0.0.1 + ::1 │
│ │ port 443 → 1112 (pfctl) │
│ │ TLS + SNI → pick SSL cert │
│ │ Host header → route lookup │
│ ├─────────────────────────────►│ localhost:4000
│ │◄─────────────────────────────┤
│◄─────────────────────────┤ │
│ 200 OK (green padlock) │ │

No Docker network. No Traefik. No nginx.conf. Just a binary that manages your processes and routes your traffic.

CLI

Both rundev and run.dev work as the command name.

rundev # Open the TUI dashboard
rundev up [project] # Start project(s) and open dashboard
rundev down [project] # Stop project(s)
rundev status # Quick status check (no TUI)
rundev list # List all projects and services
rundev doctor # Health check — ports, certs, hosts, helper
rundev clean # Stop everything, remove /etc/hosts entries
rundev setup # Re-install privileged helper + port forwarding

Flags:

FlagWhat it does
--no-proxySkip the reverse proxy
--no-sslSkip SSL certificate setup
--no-aiDisable Claude integration
-vVerbose/debug output

Keyboard Shortcuts

KeyAction
j / kNavigate up/down
EnterExpand/collapse project
aAdd project or service
sStart selected service
xStop selected service
rRestart selected service
fAuto-fix crashed service
lToggle log panel
/Ask Claude a question
qQuit (services keep running)
QQuit and stop everything

Mouse works too. Click things. Scroll things. It's 2026.

Project Detection

Point run.dev at a folder and it knows what to do:

It findsIt suggests
package.jsonnpm run dev, npm start, etc.
Cargo.tomlcargo run
go.modgo run .
manage.pypython manage.py runserver
Gemfilebundle exec rails server
ProcfileEach process line
docker-compose.ymlService commands (runs natively, not in Docker)

Ports are auto-detected from command flags, .env files, package.json proxy fields, or framework defaults.

The Mood System

Run.dev watches all your services and expresses how things are going:

MoodEmojiMeaning
Vibing😎Everything running, no issues
Chill😌Running, minor warnings
Got the Flu🤒1-2 services crashed
Wounded🤕More than half are down
Flatlined💀Everything is down
Fixing🔧Auto-restart in progress

When something crashes, run.dev doesn't just show you an exit code. It reads the stderr, categorizes the error, and gives you a personality-driven message with a suggested fix:

✗ api bro, api is ded. port 4000 is already taken.
i know what's wrong. press [f] to let me fix it

Press [f] and it kills the process hogging the port. Press / and ask Claude what went wrong.

AI Integration (Optional)

Run.dev is built to work with Claude Code, Anthropic's local CLI agent. When a service crashes, run.dev doesn't just show you the exit code — it sends the stderr to Claude for a real diagnosis. Claude reads the logs, understands the context, and tells you what actually went wrong.

What you get:

  • Crash diagnosis — a service dies, Claude reads the stderr and explains what happened and how to fix it
  • Live debug sessions — press / in the dashboard, ask Claude anything about your running services. It knows your project structure, your routes, your ports — it answers in context
  • Auto-fix suggestions — for common errors (port conflicts, missing modules, connection failures), run.dev suggests a fix. Press [f] and it handles it

Run.dev talks to Claude Code — your code and logs never leave your machine.

Configure it in ~/.config/rundev/config.yaml:

claude_proxy: http://localhost:3456/v1

The AI features are entirely optional. The app works perfectly without them. Disable anytime with --no-ai or just don't configure the proxy.

Architecture

See src/docs/ARCHITECTURE.md for the full technical deep-dive — module structure, data flow diagrams, key types, and design decisions.

Per-Service Node Version

If your services need different Node.js versions, add node_version to the service config. Run.dev wraps the start command with nvm use <version> automatically — no manual switching.

services:
backend:
path: /Users/dan/code/myapp/backendcommand: npm run devport: 3000node_version: "22.9"# uses nvm to switch before runningfrontend:
path: /Users/dan/code/myapp/frontendcommand: npm run devport: 5173node_version: "20"# different version, no problem

Requires nvm installed at $NVM_DIR (defaults to ~/.nvm). If node_version is omitted, the command runs with whatever Node is on your PATH.

Config Files

Everything lives in ~/.config/rundev/ (or ~/Library/Application Support/rundev/ on macOS):

~/.config/rundev/
├── projects/ # One YAML per project
│ ├── myapp.yaml
│ └── side-project.yaml
├── certs/ # Auto-generated SSL certificates
│ ├── myapp.local.pem
│ └── myapp.local-key.pem
├── config.yaml # Global settings (Claude proxy, theme)
└── state.json # PID persistence for background mode

FAQ

Do my services stop when I close run.dev? No. Press q and they keep running in the background. Next time you open run.dev, it reconnects. Press Q (capital) to stop everything on exit.

Does it work with Docker services? Run.dev manages processes directly — it doesn't orchestrate containers. If your service runs with a shell command, run.dev can manage it. If it only runs in Docker, you'd run docker compose up as the service command.

Do I need to trust the self-signed certs? Run.dev uses mkcert to generate locally-trusted certs — green padlock out of the box, no manual trust needed. If mkcert isn't available, it falls back to rcgen self-signed certs (browsers will show a warning you can click through once).

Does it work with Chrome's DNS-over-HTTPS? Chrome with "Use secure DNS" enabled bypasses /etc/hosts entirely. If your local domains aren't resolving, go to chrome://settings/security and disable "Use secure DNS". Safari, Firefox, curl, and all other tools work out of the box — run.dev writes both IPv4 and IPv6 entries to prevent Happy Eyeballs from falling back to production addresses.

My domains stopped working after a while, but the dashboard says the proxy is running. This used to happen when the OS dropped run.dev's port-forwarding rules underneath it — macOS flushes them across sleep/wake, and Docker or a firewall reload can wipe them on Linux. The listeners stayed up (so the dashboard looked fine) but browser traffic no longer reached them. run.dev now re-checks the redirect every few seconds and re-applies it automatically, so it recovers without a restart; you'll briefly see a "port forwarding inactive — re-applying" notice while it heals. Run rundev doctor to confirm the redirect is routing.

What about Windows? Not yet. macOS and Linux only. WSL might work but isn't tested.

License

MIT License — see LICENSE for details.

Copyright (c) 2026 Daniel Tamas hello@danieltamas.com


Built by Daniel Tamas
Because life's too short for nginx.conf

getrun.dev

About

Run.dev is an AI-native local development environment built in Rust. It manages all your services from one TUI dashboard — automatic .local domains with HTTPS, SNI-based reverse proxy, live CPU/memory stats, and Claude Code integration for crash diagnosis and live debugging. One binary. Zero config files.

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Rust 2021VersionPlatformLicenseAI Powered

run.dev

AI-native local dev environment

One dashboard. All your services. Zero config files to babysit.


The Problem

You're an architect. Or an artisan. Or both. You've got 4 microservices, 2 frontends, a websocket server, and that one Go binary Steve wrote before he left. Every morning you open 6 terminal tabs, type the same commands, forget which port is which, and lose 15 minutes to "address already in use" before your first coffee.

MAMP? Nginx configs? Docker Compose YAML files longer than your lease agreement?

Nah.

What Run.dev Does

Run.dev is a single Rust binary that replaces all of that. It gives you:

  • A nice dashboard — see every project and service at a glance, start/stop with a keystroke
  • Automatic local domainsapi.myapp.local, frontend.myapp.local, with real HTTPS
  • Zero-config SSL — mkcert-trusted certs, with rcgen fallback. No manual cert management
  • Reverse proxy — SNI-based routing with WebSocket support, from pretty URLs to localhost:whatever
  • Process management — spawn, monitor, restart. CPU and RAM stats per service, live
  • Smart project scanning — point it at a folder, it figures out npm run dev vs cargo run vs go run .
  • AI crash diagnosis — when something dies, Claude reads the stderr and tells you what went wrong
  • Personality — run.dev has moods. When everything works: 😎 vibing. When stuff crashes: 💀 flatlined
 ██████╗ ██╗ ██╗███╗ ██╗ ██████╗ ███████╗██╗ ██╗
██╔══██╗██║ ██║████╗ ██║ ██╔══██╗██╔════╝██║ ██║ 3/4 services vibing
██████╔╝██║ ██║██╔██╗ ██║ ██║ ██║█████╗ ██║ ██║
██╔══██╗██║ ██║██║╚██╗██║ ██║ ██║██╔══╝ ╚██╗ ██╔╝ [a] add service [n] new project
██║ ██║╚██████╔╝██║ ╚████║ ██████╔╝███████╗ ╚████╔╝ [s] start [x] stop [r] restart
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═══╝ [/] ask the AI anything
Daniel Tamas
hello@danieltamas.com 2 projects configured v0.3.2
projects ────────────────────────────────────────────────────────────────────────
service url local mem cpu
v WAM 2 services
| * win.wam.app https://win.wam.app localhost:5111 42M 0.0%
| * api.wam.app https://api.wam.app localhost:4000 38M 2.1%
v side-project 1 service
| x backend bro, backend is ded. port 3000 is already taken.
| press [f] to let me fix it
────────────────────────────────────────────────────────────────────────────────
/ ask claude something...

Install

One line:

curl -fsSL https://getrun.dev/install.sh | bash

The installer shows you exactly what it will change before proceeding:

What gets installed:

  • rundev binary → /usr/local/bin/rundev (+ run.dev symlink)
  • mkcert for trusted local HTTPS certificates
  • Build tools (gcc, pkg-config, libssl-dev) — only if building from source

What changes on your system:

  • /etc/hosts — adds entries for your local dev domains
  • /etc/sudoers.d/rundev — passwordless sudo for the hosts helper only
  • macOS:/etc/pf.anchors/rundev + /etc/pf.conf — pfctl firewall rules (port 80→1111, 443→1112)
  • Linux: iptables NAT rules for port forwarding (80→1111, 443→1112, localhost only)
  • Adds /usr/local/bin to your shell PATH (if not already there)

All changes can be reversed with rundev uninstall. If the installer fails partway through, it automatically rolls back everything it changed.

When run interactively (bash install.sh), you'll be prompted to confirm. When piped (curl | bash), it proceeds after showing the summary.

Or build it yourself:

git clone https://github.com/danieltamas/run.dev.git
cd run.dev
make install

Requirements: Rust toolchain (the installer handles this automatically). No Node. No Python. No Docker.

Quick Start

# Launch the dashboard (both commands work)
rundev
run.dev
# Press [a] to create a project → give it a name → get a .local domain# Press [a] again on the project → point it at a folder# Run.dev scans it, suggests a start command, picks a port# Your service is running. With SSL. On a pretty URL. In 30 seconds.

How It Works

Browser Run.dev Your services
│ │ │
│ https://api.myapp.local │ │
├─────────────────────────►│ /etc/hosts → 127.0.0.1 + ::1 │
│ │ port 443 → 1112 (pfctl) │
│ │ TLS + SNI → pick SSL cert │
│ │ Host header → route lookup │
│ ├─────────────────────────────►│ localhost:4000
│ │◄─────────────────────────────┤
│◄─────────────────────────┤ │
│ 200 OK (green padlock) │ │

No Docker network. No Traefik. No nginx.conf. Just a binary that manages your processes and routes your traffic.

CLI

Both rundev and run.dev work as the command name.

rundev # Open the TUI dashboard
rundev up [project] # Start project(s) and open dashboard
rundev down [project] # Stop project(s)
rundev status # Quick status check (no TUI)
rundev list # List all projects and services
rundev doctor # Health check — ports, certs, hosts, helper
rundev clean # Stop everything, remove /etc/hosts entries
rundev setup # Re-install privileged helper + port forwarding

Flags:

FlagWhat it does
--no-proxySkip the reverse proxy
--no-sslSkip SSL certificate setup
--no-aiDisable Claude integration
-vVerbose/debug output

Keyboard Shortcuts

KeyAction
j / kNavigate up/down
EnterExpand/collapse project
aAdd project or service
sStart selected service
xStop selected service
rRestart selected service
fAuto-fix crashed service
lToggle log panel
/Ask Claude a question
qQuit (services keep running)
QQuit and stop everything

Mouse works too. Click things. Scroll things. It's 2026.

Project Detection

Point run.dev at a folder and it knows what to do:

It findsIt suggests
package.jsonnpm run dev, npm start, etc.
Cargo.tomlcargo run
go.modgo run .
manage.pypython manage.py runserver
Gemfilebundle exec rails server
ProcfileEach process line
docker-compose.ymlService commands (runs natively, not in Docker)

Ports are auto-detected from command flags, .env files, package.json proxy fields, or framework defaults.

The Mood System

Run.dev watches all your services and expresses how things are going:

MoodEmojiMeaning
Vibing😎Everything running, no issues
Chill😌Running, minor warnings
Got the Flu🤒1-2 services crashed
Wounded🤕More than half are down
Flatlined💀Everything is down
Fixing🔧Auto-restart in progress

When something crashes, run.dev doesn't just show you an exit code. It reads the stderr, categorizes the error, and gives you a personality-driven message with a suggested fix:

✗ api bro, api is ded. port 4000 is already taken.
i know what's wrong. press [f] to let me fix it

Press [f] and it kills the process hogging the port. Press / and ask Claude what went wrong.

AI Integration (Optional)

Run.dev is built to work with Claude Code, Anthropic's local CLI agent. When a service crashes, run.dev doesn't just show you the exit code — it sends the stderr to Claude for a real diagnosis. Claude reads the logs, understands the context, and tells you what actually went wrong.

What you get:

  • Crash diagnosis — a service dies, Claude reads the stderr and explains what happened and how to fix it
  • Live debug sessions — press / in the dashboard, ask Claude anything about your running services. It knows your project structure, your routes, your ports — it answers in context
  • Auto-fix suggestions — for common errors (port conflicts, missing modules, connection failures), run.dev suggests a fix. Press [f] and it handles it

Run.dev talks to Claude Code — your code and logs never leave your machine.

Configure it in ~/.config/rundev/config.yaml:

claude_proxy: http://localhost:3456/v1

The AI features are entirely optional. The app works perfectly without them. Disable anytime with --no-ai or just don't configure the proxy.

Architecture

See src/docs/ARCHITECTURE.md for the full technical deep-dive — module structure, data flow diagrams, key types, and design decisions.

Per-Service Node Version

If your services need different Node.js versions, add node_version to the service config. Run.dev wraps the start command with nvm use <version> automatically — no manual switching.

services:
backend:
path: /Users/dan/code/myapp/backendcommand: npm run devport: 3000node_version: "22.9"# uses nvm to switch before runningfrontend:
path: /Users/dan/code/myapp/frontendcommand: npm run devport: 5173node_version: "20"# different version, no problem

Requires nvm installed at $NVM_DIR (defaults to ~/.nvm). If node_version is omitted, the command runs with whatever Node is on your PATH.

Config Files

Everything lives in ~/.config/rundev/ (or ~/Library/Application Support/rundev/ on macOS):

~/.config/rundev/
├── projects/ # One YAML per project
│ ├── myapp.yaml
│ └── side-project.yaml
├── certs/ # Auto-generated SSL certificates
│ ├── myapp.local.pem
│ └── myapp.local-key.pem
├── config.yaml # Global settings (Claude proxy, theme)
└── state.json # PID persistence for background mode

FAQ

Do my services stop when I close run.dev? No. Press q and they keep running in the background. Next time you open run.dev, it reconnects. Press Q (capital) to stop everything on exit.

Does it work with Docker services? Run.dev manages processes directly — it doesn't orchestrate containers. If your service runs with a shell command, run.dev can manage it. If it only runs in Docker, you'd run docker compose up as the service command.

Do I need to trust the self-signed certs? Run.dev uses mkcert to generate locally-trusted certs — green padlock out of the box, no manual trust needed. If mkcert isn't available, it falls back to rcgen self-signed certs (browsers will show a warning you can click through once).

Does it work with Chrome's DNS-over-HTTPS? Chrome with "Use secure DNS" enabled bypasses /etc/hosts entirely. If your local domains aren't resolving, go to chrome://settings/security and disable "Use secure DNS". Safari, Firefox, curl, and all other tools work out of the box — run.dev writes both IPv4 and IPv6 entries to prevent Happy Eyeballs from falling back to production addresses.

My domains stopped working after a while, but the dashboard says the proxy is running. This used to happen when the OS dropped run.dev's port-forwarding rules underneath it — macOS flushes them across sleep/wake, and Docker or a firewall reload can wipe them on Linux. The listeners stayed up (so the dashboard looked fine) but browser traffic no longer reached them. run.dev now re-checks the redirect every few seconds and re-applies it automatically, so it recovers without a restart; you'll briefly see a "port forwarding inactive — re-applying" notice while it heals. Run rundev doctor to confirm the redirect is routing.

What about Windows? Not yet. macOS and Linux only. WSL might work but isn't tested.

License

MIT License — see LICENSE for details.

Copyright (c) 2026 Daniel Tamas hello@danieltamas.com


Built by Daniel Tamas
Because life's too short for nginx.conf

getrun.dev

About

Run.dev is an AI-native local development environment built in Rust. It manages all your services from one TUI dashboard — automatic .local domains with HTTPS, SNI-based reverse proxy, live CPU/memory stats, and Claude Code integration for crash diagnosis and live debugging. One binary. Zero config files.

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Rust 2021VersionPlatformLicenseAI Powered

run.dev

AI-native local dev environment

One dashboard. All your services. Zero config files to babysit.


The Problem

You're an architect. Or an artisan. Or both. You've got 4 microservices, 2 frontends, a websocket server, and that one Go binary Steve wrote before he left. Every morning you open 6 terminal tabs, type the same commands, forget which port is which, and lose 15 minutes to "address already in use" before your first coffee.

MAMP? Nginx configs? Docker Compose YAML files longer than your lease agreement?

Nah.

What Run.dev Does

Run.dev is a single Rust binary that replaces all of that. It gives you:

  • A nice dashboard — see every project and service at a glance, start/stop with a keystroke
  • Automatic local domainsapi.myapp.local, frontend.myapp.local, with real HTTPS
  • Zero-config SSL — mkcert-trusted certs, with rcgen fallback. No manual cert management
  • Reverse proxy — SNI-based routing with WebSocket support, from pretty URLs to localhost:whatever
  • Process management — spawn, monitor, restart. CPU and RAM stats per service, live
  • Smart project scanning — point it at a folder, it figures out npm run dev vs cargo run vs go run .
  • AI crash diagnosis — when something dies, Claude reads the stderr and tells you what went wrong
  • Personality — run.dev has moods. When everything works: 😎 vibing. When stuff crashes: 💀 flatlined
 ██████╗ ██╗ ██╗███╗ ██╗ ██████╗ ███████╗██╗ ██╗
██╔══██╗██║ ██║████╗ ██║ ██╔══██╗██╔════╝██║ ██║ 3/4 services vibing
██████╔╝██║ ██║██╔██╗ ██║ ██║ ██║█████╗ ██║ ██║
██╔══██╗██║ ██║██║╚██╗██║ ██║ ██║██╔══╝ ╚██╗ ██╔╝ [a] add service [n] new project
██║ ██║╚██████╔╝██║ ╚████║ ██████╔╝███████╗ ╚████╔╝ [s] start [x] stop [r] restart
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═══╝ [/] ask the AI anything
Daniel Tamas
hello@danieltamas.com 2 projects configured v0.3.2
projects ────────────────────────────────────────────────────────────────────────
service url local mem cpu
v WAM 2 services
| * win.wam.app https://win.wam.app localhost:5111 42M 0.0%
| * api.wam.app https://api.wam.app localhost:4000 38M 2.1%
v side-project 1 service
| x backend bro, backend is ded. port 3000 is already taken.
| press [f] to let me fix it
────────────────────────────────────────────────────────────────────────────────
/ ask claude something...

Install

One line:

curl -fsSL https://getrun.dev/install.sh | bash

The installer shows you exactly what it will change before proceeding:

What gets installed:

  • rundev binary → /usr/local/bin/rundev (+ run.dev symlink)
  • mkcert for trusted local HTTPS certificates
  • Build tools (gcc, pkg-config, libssl-dev) — only if building from source

What changes on your system:

  • /etc/hosts — adds entries for your local dev domains
  • /etc/sudoers.d/rundev — passwordless sudo for the hosts helper only
  • macOS:/etc/pf.anchors/rundev + /etc/pf.conf — pfctl firewall rules (port 80→1111, 443→1112)
  • Linux: iptables NAT rules for port forwarding (80→1111, 443→1112, localhost only)
  • Adds /usr/local/bin to your shell PATH (if not already there)

All changes can be reversed with rundev uninstall. If the installer fails partway through, it automatically rolls back everything it changed.

When run interactively (bash install.sh), you'll be prompted to confirm. When piped (curl | bash), it proceeds after showing the summary.

Or build it yourself:

git clone https://github.com/danieltamas/run.dev.git
cd run.dev
make install

Requirements: Rust toolchain (the installer handles this automatically). No Node. No Python. No Docker.

Quick Start

# Launch the dashboard (both commands work)
rundev
run.dev
# Press [a] to create a project → give it a name → get a .local domain# Press [a] again on the project → point it at a folder# Run.dev scans it, suggests a start command, picks a port# Your service is running. With SSL. On a pretty URL. In 30 seconds.

How It Works

Browser Run.dev Your services
│ │ │
│ https://api.myapp.local │ │
├─────────────────────────►│ /etc/hosts → 127.0.0.1 + ::1 │
│ │ port 443 → 1112 (pfctl) │
│ │ TLS + SNI → pick SSL cert │
│ │ Host header → route lookup │
│ ├─────────────────────────────►│ localhost:4000
│ │◄─────────────────────────────┤
│◄─────────────────────────┤ │
│ 200 OK (green padlock) │ │

No Docker network. No Traefik. No nginx.conf. Just a binary that manages your processes and routes your traffic.

CLI

Both rundev and run.dev work as the command name.

rundev # Open the TUI dashboard
rundev up [project] # Start project(s) and open dashboard
rundev down [project] # Stop project(s)
rundev status # Quick status check (no TUI)
rundev list # List all projects and services
rundev doctor # Health check — ports, certs, hosts, helper
rundev clean # Stop everything, remove /etc/hosts entries
rundev setup # Re-install privileged helper + port forwarding

Flags:

FlagWhat it does
--no-proxySkip the reverse proxy
--no-sslSkip SSL certificate setup
--no-aiDisable Claude integration
-vVerbose/debug output

Keyboard Shortcuts

KeyAction
j / kNavigate up/down
EnterExpand/collapse project
aAdd project or service
sStart selected service
xStop selected service
rRestart selected service
fAuto-fix crashed service
lToggle log panel
/Ask Claude a question
qQuit (services keep running)
QQuit and stop everything

Mouse works too. Click things. Scroll things. It's 2026.

Project Detection

Point run.dev at a folder and it knows what to do:

It findsIt suggests
package.jsonnpm run dev, npm start, etc.
Cargo.tomlcargo run
go.modgo run .
manage.pypython manage.py runserver
Gemfilebundle exec rails server
ProcfileEach process line
docker-compose.ymlService commands (runs natively, not in Docker)

Ports are auto-detected from command flags, .env files, package.json proxy fields, or framework defaults.

The Mood System

Run.dev watches all your services and expresses how things are going:

MoodEmojiMeaning
Vibing😎Everything running, no issues
Chill😌Running, minor warnings
Got the Flu🤒1-2 services crashed
Wounded🤕More than half are down
Flatlined💀Everything is down
Fixing🔧Auto-restart in progress

When something crashes, run.dev doesn't just show you an exit code. It reads the stderr, categorizes the error, and gives you a personality-driven message with a suggested fix:

✗ api bro, api is ded. port 4000 is already taken.
i know what's wrong. press [f] to let me fix it

Press [f] and it kills the process hogging the port. Press / and ask Claude what went wrong.

AI Integration (Optional)

Run.dev is built to work with Claude Code, Anthropic's local CLI agent. When a service crashes, run.dev doesn't just show you the exit code — it sends the stderr to Claude for a real diagnosis. Claude reads the logs, understands the context, and tells you what actually went wrong.

What you get:

  • Crash diagnosis — a service dies, Claude reads the stderr and explains what happened and how to fix it
  • Live debug sessions — press / in the dashboard, ask Claude anything about your running services. It knows your project structure, your routes, your ports — it answers in context
  • Auto-fix suggestions — for common errors (port conflicts, missing modules, connection failures), run.dev suggests a fix. Press [f] and it handles it

Run.dev talks to Claude Code — your code and logs never leave your machine.

Configure it in ~/.config/rundev/config.yaml:

claude_proxy: http://localhost:3456/v1

The AI features are entirely optional. The app works perfectly without them. Disable anytime with --no-ai or just don't configure the proxy.

Architecture

See src/docs/ARCHITECTURE.md for the full technical deep-dive — module structure, data flow diagrams, key types, and design decisions.

Per-Service Node Version

If your services need different Node.js versions, add node_version to the service config. Run.dev wraps the start command with nvm use <version> automatically — no manual switching.

services:
backend:
path: /Users/dan/code/myapp/backendcommand: npm run devport: 3000node_version: "22.9"# uses nvm to switch before runningfrontend:
path: /Users/dan/code/myapp/frontendcommand: npm run devport: 5173node_version: "20"# different version, no problem

Requires nvm installed at $NVM_DIR (defaults to ~/.nvm). If node_version is omitted, the command runs with whatever Node is on your PATH.

Config Files

Everything lives in ~/.config/rundev/ (or ~/Library/Application Support/rundev/ on macOS):

~/.config/rundev/
├── projects/ # One YAML per project
│ ├── myapp.yaml
│ └── side-project.yaml
├── certs/ # Auto-generated SSL certificates
│ ├── myapp.local.pem
│ └── myapp.local-key.pem
├── config.yaml # Global settings (Claude proxy, theme)
└── state.json # PID persistence for background mode

FAQ

Do my services stop when I close run.dev? No. Press q and they keep running in the background. Next time you open run.dev, it reconnects. Press Q (capital) to stop everything on exit.

Does it work with Docker services? Run.dev manages processes directly — it doesn't orchestrate containers. If your service runs with a shell command, run.dev can manage it. If it only runs in Docker, you'd run docker compose up as the service command.

Do I need to trust the self-signed certs? Run.dev uses mkcert to generate locally-trusted certs — green padlock out of the box, no manual trust needed. If mkcert isn't available, it falls back to rcgen self-signed certs (browsers will show a warning you can click through once).

Does it work with Chrome's DNS-over-HTTPS? Chrome with "Use secure DNS" enabled bypasses /etc/hosts entirely. If your local domains aren't resolving, go to chrome://settings/security and disable "Use secure DNS". Safari, Firefox, curl, and all other tools work out of the box — run.dev writes both IPv4 and IPv6 entries to prevent Happy Eyeballs from falling back to production addresses.

My domains stopped working after a while, but the dashboard says the proxy is running. This used to happen when the OS dropped run.dev's port-forwarding rules underneath it — macOS flushes them across sleep/wake, and Docker or a firewall reload can wipe them on Linux. The listeners stayed up (so the dashboard looked fine) but browser traffic no longer reached them. run.dev now re-checks the redirect every few seconds and re-applies it automatically, so it recovers without a restart; you'll briefly see a "port forwarding inactive — re-applying" notice while it heals. Run rundev doctor to confirm the redirect is routing.

What about Windows? Not yet. macOS and Linux only. WSL might work but isn't tested.

License

MIT License — see LICENSE for details.

Copyright (c) 2026 Daniel Tamas hello@danieltamas.com


Built by Daniel Tamas
Because life's too short for nginx.conf

getrun.dev

About

Run.dev is an AI-native local development environment built in Rust. It manages all your services from one TUI dashboard — automatic .local domains with HTTPS, SNI-based reverse proxy, live CPU/memory stats, and Claude Code integration for crash diagnosis and live debugging. One binary. Zero config files.

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Rust 2021VersionPlatformLicenseAI Powered

run.dev

AI-native local dev environment

One dashboard. All your services. Zero config files to babysit.


The Problem

You're an architect. Or an artisan. Or both. You've got 4 microservices, 2 frontends, a websocket server, and that one Go binary Steve wrote before he left. Every morning you open 6 terminal tabs, type the same commands, forget which port is which, and lose 15 minutes to "address already in use" before your first coffee.

MAMP? Nginx configs? Docker Compose YAML files longer than your lease agreement?

Nah.

What Run.dev Does

Run.dev is a single Rust binary that replaces all of that. It gives you:

  • A nice dashboard — see every project and service at a glance, start/stop with a keystroke
  • Automatic local domainsapi.myapp.local, frontend.myapp.local, with real HTTPS
  • Zero-config SSL — mkcert-trusted certs, with rcgen fallback. No manual cert management
  • Reverse proxy — SNI-based routing with WebSocket support, from pretty URLs to localhost:whatever
  • Process management — spawn, monitor, restart. CPU and RAM stats per service, live
  • Smart project scanning — point it at a folder, it figures out npm run dev vs cargo run vs go run .
  • AI crash diagnosis — when something dies, Claude reads the stderr and tells you what went wrong
  • Personality — run.dev has moods. When everything works: 😎 vibing. When stuff crashes: 💀 flatlined
 ██████╗ ██╗ ██╗███╗ ██╗ ██████╗ ███████╗██╗ ██╗
██╔══██╗██║ ██║████╗ ██║ ██╔══██╗██╔════╝██║ ██║ 3/4 services vibing
██████╔╝██║ ██║██╔██╗ ██║ ██║ ██║█████╗ ██║ ██║
██╔══██╗██║ ██║██║╚██╗██║ ██║ ██║██╔══╝ ╚██╗ ██╔╝ [a] add service [n] new project
██║ ██║╚██████╔╝██║ ╚████║ ██████╔╝███████╗ ╚████╔╝ [s] start [x] stop [r] restart
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═══╝ [/] ask the AI anything
Daniel Tamas
hello@danieltamas.com 2 projects configured v0.3.2
projects ────────────────────────────────────────────────────────────────────────
service url local mem cpu
v WAM 2 services
| * win.wam.app https://win.wam.app localhost:5111 42M 0.0%
| * api.wam.app https://api.wam.app localhost:4000 38M 2.1%
v side-project 1 service
| x backend bro, backend is ded. port 3000 is already taken.
| press [f] to let me fix it
────────────────────────────────────────────────────────────────────────────────
/ ask claude something...

Install

One line:

curl -fsSL https://getrun.dev/install.sh | bash

The installer shows you exactly what it will change before proceeding:

What gets installed:

  • rundev binary → /usr/local/bin/rundev (+ run.dev symlink)
  • mkcert for trusted local HTTPS certificates
  • Build tools (gcc, pkg-config, libssl-dev) — only if building from source

What changes on your system:

  • /etc/hosts — adds entries for your local dev domains
  • /etc/sudoers.d/rundev — passwordless sudo for the hosts helper only
  • macOS:/etc/pf.anchors/rundev + /etc/pf.conf — pfctl firewall rules (port 80→1111, 443→1112)
  • Linux: iptables NAT rules for port forwarding (80→1111, 443→1112, localhost only)
  • Adds /usr/local/bin to your shell PATH (if not already there)

All changes can be reversed with rundev uninstall. If the installer fails partway through, it automatically rolls back everything it changed.

When run interactively (bash install.sh), you'll be prompted to confirm. When piped (curl | bash), it proceeds after showing the summary.

Or build it yourself:

git clone https://github.com/danieltamas/run.dev.git
cd run.dev
make install

Requirements: Rust toolchain (the installer handles this automatically). No Node. No Python. No Docker.

Quick Start

# Launch the dashboard (both commands work)
rundev
run.dev
# Press [a] to create a project → give it a name → get a .local domain# Press [a] again on the project → point it at a folder# Run.dev scans it, suggests a start command, picks a port# Your service is running. With SSL. On a pretty URL. In 30 seconds.

How It Works

Browser Run.dev Your services
│ │ │
│ https://api.myapp.local │ │
├─────────────────────────►│ /etc/hosts → 127.0.0.1 + ::1 │
│ │ port 443 → 1112 (pfctl) │
│ │ TLS + SNI → pick SSL cert │
│ │ Host header → route lookup │
│ ├─────────────────────────────►│ localhost:4000
│ │◄─────────────────────────────┤
│◄─────────────────────────┤ │
│ 200 OK (green padlock) │ │

No Docker network. No Traefik. No nginx.conf. Just a binary that manages your processes and routes your traffic.

CLI

Both rundev and run.dev work as the command name.

rundev # Open the TUI dashboard
rundev up [project] # Start project(s) and open dashboard
rundev down [project] # Stop project(s)
rundev status # Quick status check (no TUI)
rundev list # List all projects and services
rundev doctor # Health check — ports, certs, hosts, helper
rundev clean # Stop everything, remove /etc/hosts entries
rundev setup # Re-install privileged helper + port forwarding

Flags:

FlagWhat it does
--no-proxySkip the reverse proxy
--no-sslSkip SSL certificate setup
--no-aiDisable Claude integration
-vVerbose/debug output

Keyboard Shortcuts

KeyAction
j / kNavigate up/down
EnterExpand/collapse project
aAdd project or service
sStart selected service
xStop selected service
rRestart selected service
fAuto-fix crashed service
lToggle log panel
/Ask Claude a question
qQuit (services keep running)
QQuit and stop everything

Mouse works too. Click things. Scroll things. It's 2026.

Project Detection

Point run.dev at a folder and it knows what to do:

It findsIt suggests
package.jsonnpm run dev, npm start, etc.
Cargo.tomlcargo run
go.modgo run .
manage.pypython manage.py runserver
Gemfilebundle exec rails server
ProcfileEach process line
docker-compose.ymlService commands (runs natively, not in Docker)

Ports are auto-detected from command flags, .env files, package.json proxy fields, or framework defaults.

The Mood System

Run.dev watches all your services and expresses how things are going:

MoodEmojiMeaning
Vibing😎Everything running, no issues
Chill😌Running, minor warnings
Got the Flu🤒1-2 services crashed
Wounded🤕More than half are down
Flatlined💀Everything is down
Fixing🔧Auto-restart in progress

When something crashes, run.dev doesn't just show you an exit code. It reads the stderr, categorizes the error, and gives you a personality-driven message with a suggested fix:

✗ api bro, api is ded. port 4000 is already taken.
i know what's wrong. press [f] to let me fix it

Press [f] and it kills the process hogging the port. Press / and ask Claude what went wrong.

AI Integration (Optional)

Run.dev is built to work with Claude Code, Anthropic's local CLI agent. When a service crashes, run.dev doesn't just show you the exit code — it sends the stderr to Claude for a real diagnosis. Claude reads the logs, understands the context, and tells you what actually went wrong.

What you get:

  • Crash diagnosis — a service dies, Claude reads the stderr and explains what happened and how to fix it
  • Live debug sessions — press / in the dashboard, ask Claude anything about your running services. It knows your project structure, your routes, your ports — it answers in context
  • Auto-fix suggestions — for common errors (port conflicts, missing modules, connection failures), run.dev suggests a fix. Press [f] and it handles it

Run.dev talks to Claude Code — your code and logs never leave your machine.

Configure it in ~/.config/rundev/config.yaml:

claude_proxy: http://localhost:3456/v1

The AI features are entirely optional. The app works perfectly without them. Disable anytime with --no-ai or just don't configure the proxy.

Architecture

See src/docs/ARCHITECTURE.md for the full technical deep-dive — module structure, data flow diagrams, key types, and design decisions.

Per-Service Node Version

If your services need different Node.js versions, add node_version to the service config. Run.dev wraps the start command with nvm use <version> automatically — no manual switching.

services:
backend:
path: /Users/dan/code/myapp/backendcommand: npm run devport: 3000node_version: "22.9"# uses nvm to switch before runningfrontend:
path: /Users/dan/code/myapp/frontendcommand: npm run devport: 5173node_version: "20"# different version, no problem

Requires nvm installed at $NVM_DIR (defaults to ~/.nvm). If node_version is omitted, the command runs with whatever Node is on your PATH.

Config Files

Everything lives in ~/.config/rundev/ (or ~/Library/Application Support/rundev/ on macOS):

~/.config/rundev/
├── projects/ # One YAML per project
│ ├── myapp.yaml
│ └── side-project.yaml
├── certs/ # Auto-generated SSL certificates
│ ├── myapp.local.pem
│ └── myapp.local-key.pem
├── config.yaml # Global settings (Claude proxy, theme)
└── state.json # PID persistence for background mode

FAQ

Do my services stop when I close run.dev? No. Press q and they keep running in the background. Next time you open run.dev, it reconnects. Press Q (capital) to stop everything on exit.

Does it work with Docker services? Run.dev manages processes directly — it doesn't orchestrate containers. If your service runs with a shell command, run.dev can manage it. If it only runs in Docker, you'd run docker compose up as the service command.

Do I need to trust the self-signed certs? Run.dev uses mkcert to generate locally-trusted certs — green padlock out of the box, no manual trust needed. If mkcert isn't available, it falls back to rcgen self-signed certs (browsers will show a warning you can click through once).

Does it work with Chrome's DNS-over-HTTPS? Chrome with "Use secure DNS" enabled bypasses /etc/hosts entirely. If your local domains aren't resolving, go to chrome://settings/security and disable "Use secure DNS". Safari, Firefox, curl, and all other tools work out of the box — run.dev writes both IPv4 and IPv6 entries to prevent Happy Eyeballs from falling back to production addresses.

My domains stopped working after a while, but the dashboard says the proxy is running. This used to happen when the OS dropped run.dev's port-forwarding rules underneath it — macOS flushes them across sleep/wake, and Docker or a firewall reload can wipe them on Linux. The listeners stayed up (so the dashboard looked fine) but browser traffic no longer reached them. run.dev now re-checks the redirect every few seconds and re-applies it automatically, so it recovers without a restart; you'll briefly see a "port forwarding inactive — re-applying" notice while it heals. Run rundev doctor to confirm the redirect is routing.

What about Windows? Not yet. macOS and Linux only. WSL might work but isn't tested.

License

MIT License — see LICENSE for details.

Copyright (c) 2026 Daniel Tamas hello@danieltamas.com


Built by Daniel Tamas
Because life's too short for nginx.conf

getrun.dev

About

Run.dev is an AI-native local development environment built in Rust. It manages all your services from one TUI dashboard — automatic .local domains with HTTPS, SNI-based reverse proxy, live CPU/memory stats, and Claude Code integration for crash diagnosis and live debugging. One binary. Zero config files.

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Rust 2021VersionPlatformLicenseAI Powered

run.dev

AI-native local dev environment

One dashboard. All your services. Zero config files to babysit.


The Problem

You're an architect. Or an artisan. Or both. You've got 4 microservices, 2 frontends, a websocket server, and that one Go binary Steve wrote before he left. Every morning you open 6 terminal tabs, type the same commands, forget which port is which, and lose 15 minutes to "address already in use" before your first coffee.

MAMP? Nginx configs? Docker Compose YAML files longer than your lease agreement?

Nah.

What Run.dev Does

Run.dev is a single Rust binary that replaces all of that. It gives you:

  • A nice dashboard — see every project and service at a glance, start/stop with a keystroke
  • Automatic local domainsapi.myapp.local, frontend.myapp.local, with real HTTPS
  • Zero-config SSL — mkcert-trusted certs, with rcgen fallback. No manual cert management
  • Reverse proxy — SNI-based routing with WebSocket support, from pretty URLs to localhost:whatever
  • Process management — spawn, monitor, restart. CPU and RAM stats per service, live
  • Smart project scanning — point it at a folder, it figures out npm run dev vs cargo run vs go run .
  • AI crash diagnosis — when something dies, Claude reads the stderr and tells you what went wrong
  • Personality — run.dev has moods. When everything works: 😎 vibing. When stuff crashes: 💀 flatlined
 ██████╗ ██╗ ██╗███╗ ██╗ ██████╗ ███████╗██╗ ██╗
██╔══██╗██║ ██║████╗ ██║ ██╔══██╗██╔════╝██║ ██║ 3/4 services vibing
██████╔╝██║ ██║██╔██╗ ██║ ██║ ██║█████╗ ██║ ██║
██╔══██╗██║ ██║██║╚██╗██║ ██║ ██║██╔══╝ ╚██╗ ██╔╝ [a] add service [n] new project
██║ ██║╚██████╔╝██║ ╚████║ ██████╔╝███████╗ ╚████╔╝ [s] start [x] stop [r] restart
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═══╝ [/] ask the AI anything
Daniel Tamas
hello@danieltamas.com 2 projects configured v0.3.2
projects ────────────────────────────────────────────────────────────────────────
service url local mem cpu
v WAM 2 services
| * win.wam.app https://win.wam.app localhost:5111 42M 0.0%
| * api.wam.app https://api.wam.app localhost:4000 38M 2.1%
v side-project 1 service
| x backend bro, backend is ded. port 3000 is already taken.
| press [f] to let me fix it
────────────────────────────────────────────────────────────────────────────────
/ ask claude something...

Install

One line:

curl -fsSL https://getrun.dev/install.sh | bash

The installer shows you exactly what it will change before proceeding:

What gets installed:

  • rundev binary → /usr/local/bin/rundev (+ run.dev symlink)
  • mkcert for trusted local HTTPS certificates
  • Build tools (gcc, pkg-config, libssl-dev) — only if building from source

What changes on your system:

  • /etc/hosts — adds entries for your local dev domains
  • /etc/sudoers.d/rundev — passwordless sudo for the hosts helper only
  • macOS:/etc/pf.anchors/rundev + /etc/pf.conf — pfctl firewall rules (port 80→1111, 443→1112)
  • Linux: iptables NAT rules for port forwarding (80→1111, 443→1112, localhost only)
  • Adds /usr/local/bin to your shell PATH (if not already there)

All changes can be reversed with rundev uninstall. If the installer fails partway through, it automatically rolls back everything it changed.

When run interactively (bash install.sh), you'll be prompted to confirm. When piped (curl | bash), it proceeds after showing the summary.

Or build it yourself:

git clone https://github.com/danieltamas/run.dev.git
cd run.dev
make install

Requirements: Rust toolchain (the installer handles this automatically). No Node. No Python. No Docker.

Quick Start

# Launch the dashboard (both commands work)
rundev
run.dev
# Press [a] to create a project → give it a name → get a .local domain# Press [a] again on the project → point it at a folder# Run.dev scans it, suggests a start command, picks a port# Your service is running. With SSL. On a pretty URL. In 30 seconds.

How It Works

Browser Run.dev Your services
│ │ │
│ https://api.myapp.local │ │
├─────────────────────────►│ /etc/hosts → 127.0.0.1 + ::1 │
│ │ port 443 → 1112 (pfctl) │
│ │ TLS + SNI → pick SSL cert │
│ │ Host header → route lookup │
│ ├─────────────────────────────►│ localhost:4000
│ │◄─────────────────────────────┤
│◄─────────────────────────┤ │
│ 200 OK (green padlock) │ │

No Docker network. No Traefik. No nginx.conf. Just a binary that manages your processes and routes your traffic.

CLI

Both rundev and run.dev work as the command name.

rundev # Open the TUI dashboard
rundev up [project] # Start project(s) and open dashboard
rundev down [project] # Stop project(s)
rundev status # Quick status check (no TUI)
rundev list # List all projects and services
rundev doctor # Health check — ports, certs, hosts, helper
rundev clean # Stop everything, remove /etc/hosts entries
rundev setup # Re-install privileged helper + port forwarding

Flags:

FlagWhat it does
--no-proxySkip the reverse proxy
--no-sslSkip SSL certificate setup
--no-aiDisable Claude integration
-vVerbose/debug output

Keyboard Shortcuts

KeyAction
j / kNavigate up/down
EnterExpand/collapse project
aAdd project or service
sStart selected service
xStop selected service
rRestart selected service
fAuto-fix crashed service
lToggle log panel
/Ask Claude a question
qQuit (services keep running)
QQuit and stop everything

Mouse works too. Click things. Scroll things. It's 2026.

Project Detection

Point run.dev at a folder and it knows what to do:

It findsIt suggests
package.jsonnpm run dev, npm start, etc.
Cargo.tomlcargo run
go.modgo run .
manage.pypython manage.py runserver
Gemfilebundle exec rails server
ProcfileEach process line
docker-compose.ymlService commands (runs natively, not in Docker)

Ports are auto-detected from command flags, .env files, package.json proxy fields, or framework defaults.

The Mood System

Run.dev watches all your services and expresses how things are going:

MoodEmojiMeaning
Vibing😎Everything running, no issues
Chill😌Running, minor warnings
Got the Flu🤒1-2 services crashed
Wounded🤕More than half are down
Flatlined💀Everything is down
Fixing🔧Auto-restart in progress

When something crashes, run.dev doesn't just show you an exit code. It reads the stderr, categorizes the error, and gives you a personality-driven message with a suggested fix:

✗ api bro, api is ded. port 4000 is already taken.
i know what's wrong. press [f] to let me fix it

Press [f] and it kills the process hogging the port. Press / and ask Claude what went wrong.

AI Integration (Optional)

Run.dev is built to work with Claude Code, Anthropic's local CLI agent. When a service crashes, run.dev doesn't just show you the exit code — it sends the stderr to Claude for a real diagnosis. Claude reads the logs, understands the context, and tells you what actually went wrong.

What you get:

  • Crash diagnosis — a service dies, Claude reads the stderr and explains what happened and how to fix it
  • Live debug sessions — press / in the dashboard, ask Claude anything about your running services. It knows your project structure, your routes, your ports — it answers in context
  • Auto-fix suggestions — for common errors (port conflicts, missing modules, connection failures), run.dev suggests a fix. Press [f] and it handles it

Run.dev talks to Claude Code — your code and logs never leave your machine.

Configure it in ~/.config/rundev/config.yaml:

claude_proxy: http://localhost:3456/v1

The AI features are entirely optional. The app works perfectly without them. Disable anytime with --no-ai or just don't configure the proxy.

Architecture

See src/docs/ARCHITECTURE.md for the full technical deep-dive — module structure, data flow diagrams, key types, and design decisions.

Per-Service Node Version

If your services need different Node.js versions, add node_version to the service config. Run.dev wraps the start command with nvm use <version> automatically — no manual switching.

services:
backend:
path: /Users/dan/code/myapp/backendcommand: npm run devport: 3000node_version: "22.9"# uses nvm to switch before runningfrontend:
path: /Users/dan/code/myapp/frontendcommand: npm run devport: 5173node_version: "20"# different version, no problem

Requires nvm installed at $NVM_DIR (defaults to ~/.nvm). If node_version is omitted, the command runs with whatever Node is on your PATH.

Config Files

Everything lives in ~/.config/rundev/ (or ~/Library/Application Support/rundev/ on macOS):

~/.config/rundev/
├── projects/ # One YAML per project
│ ├── myapp.yaml
│ └── side-project.yaml
├── certs/ # Auto-generated SSL certificates
│ ├── myapp.local.pem
│ └── myapp.local-key.pem
├── config.yaml # Global settings (Claude proxy, theme)
└── state.json # PID persistence for background mode

FAQ

Do my services stop when I close run.dev? No. Press q and they keep running in the background. Next time you open run.dev, it reconnects. Press Q (capital) to stop everything on exit.

Does it work with Docker services? Run.dev manages processes directly — it doesn't orchestrate containers. If your service runs with a shell command, run.dev can manage it. If it only runs in Docker, you'd run docker compose up as the service command.

Do I need to trust the self-signed certs? Run.dev uses mkcert to generate locally-trusted certs — green padlock out of the box, no manual trust needed. If mkcert isn't available, it falls back to rcgen self-signed certs (browsers will show a warning you can click through once).

Does it work with Chrome's DNS-over-HTTPS? Chrome with "Use secure DNS" enabled bypasses /etc/hosts entirely. If your local domains aren't resolving, go to chrome://settings/security and disable "Use secure DNS". Safari, Firefox, curl, and all other tools work out of the box — run.dev writes both IPv4 and IPv6 entries to prevent Happy Eyeballs from falling back to production addresses.

My domains stopped working after a while, but the dashboard says the proxy is running. This used to happen when the OS dropped run.dev's port-forwarding rules underneath it — macOS flushes them across sleep/wake, and Docker or a firewall reload can wipe them on Linux. The listeners stayed up (so the dashboard looked fine) but browser traffic no longer reached them. run.dev now re-checks the redirect every few seconds and re-applies it automatically, so it recovers without a restart; you'll briefly see a "port forwarding inactive — re-applying" notice while it heals. Run rundev doctor to confirm the redirect is routing.

What about Windows? Not yet. macOS and Linux only. WSL might work but isn't tested.

License

MIT License — see LICENSE for details.

Copyright (c) 2026 Daniel Tamas hello@danieltamas.com


Built by Daniel Tamas
Because life's too short for nginx.conf

getrun.dev

About

Run.dev is an AI-native local development environment built in Rust. It manages all your services from one TUI dashboard — automatic .local domains with HTTPS, SNI-based reverse proxy, live CPU/memory stats, and Claude Code integration for crash diagnosis and live debugging. One binary. Zero config files.

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Rust 2021VersionPlatformLicenseAI Powered

run.dev

AI-native local dev environment

One dashboard. All your services. Zero config files to babysit.


The Problem

You're an architect. Or an artisan. Or both. You've got 4 microservices, 2 frontends, a websocket server, and that one Go binary Steve wrote before he left. Every morning you open 6 terminal tabs, type the same commands, forget which port is which, and lose 15 minutes to "address already in use" before your first coffee.

MAMP? Nginx configs? Docker Compose YAML files longer than your lease agreement?

Nah.

What Run.dev Does

Run.dev is a single Rust binary that replaces all of that. It gives you:

  • A nice dashboard — see every project and service at a glance, start/stop with a keystroke
  • Automatic local domainsapi.myapp.local, frontend.myapp.local, with real HTTPS
  • Zero-config SSL — mkcert-trusted certs, with rcgen fallback. No manual cert management
  • Reverse proxy — SNI-based routing with WebSocket support, from pretty URLs to localhost:whatever
  • Process management — spawn, monitor, restart. CPU and RAM stats per service, live
  • Smart project scanning — point it at a folder, it figures out npm run dev vs cargo run vs go run .
  • AI crash diagnosis — when something dies, Claude reads the stderr and tells you what went wrong
  • Personality — run.dev has moods. When everything works: 😎 vibing. When stuff crashes: 💀 flatlined
 ██████╗ ██╗ ██╗███╗ ██╗ ██████╗ ███████╗██╗ ██╗
██╔══██╗██║ ██║████╗ ██║ ██╔══██╗██╔════╝██║ ██║ 3/4 services vibing
██████╔╝██║ ██║██╔██╗ ██║ ██║ ██║█████╗ ██║ ██║
██╔══██╗██║ ██║██║╚██╗██║ ██║ ██║██╔══╝ ╚██╗ ██╔╝ [a] add service [n] new project
██║ ██║╚██████╔╝██║ ╚████║ ██████╔╝███████╗ ╚████╔╝ [s] start [x] stop [r] restart
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ ╚═══╝ [/] ask the AI anything
Daniel Tamas
hello@danieltamas.com 2 projects configured v0.3.2
projects ────────────────────────────────────────────────────────────────────────
service url local mem cpu
v WAM 2 services
| * win.wam.app https://win.wam.app localhost:5111 42M 0.0%
| * api.wam.app https://api.wam.app localhost:4000 38M 2.1%
v side-project 1 service
| x backend bro, backend is ded. port 3000 is already taken.
| press [f] to let me fix it
────────────────────────────────────────────────────────────────────────────────
/ ask claude something...

Install

One line:

curl -fsSL https://getrun.dev/install.sh | bash

The installer shows you exactly what it will change before proceeding:

What gets installed:

  • rundev binary → /usr/local/bin/rundev (+ run.dev symlink)
  • mkcert for trusted local HTTPS certificates
  • Build tools (gcc, pkg-config, libssl-dev) — only if building from source

What changes on your system:

  • /etc/hosts — adds entries for your local dev domains
  • /etc/sudoers.d/rundev — passwordless sudo for the hosts helper only
  • macOS:/etc/pf.anchors/rundev + /etc/pf.conf — pfctl firewall rules (port 80→1111, 443→1112)
  • Linux: iptables NAT rules for port forwarding (80→1111, 443→1112, localhost only)
  • Adds /usr/local/bin to your shell PATH (if not already there)

All changes can be reversed with rundev uninstall. If the installer fails partway through, it automatically rolls back everything it changed.

When run interactively (bash install.sh), you'll be prompted to confirm. When piped (curl | bash), it proceeds after showing the summary.

Or build it yourself:

git clone https://github.com/danieltamas/run.dev.git
cd run.dev
make install

Requirements: Rust toolchain (the installer handles this automatically). No Node. No Python. No Docker.

Quick Start

# Launch the dashboard (both commands work)
rundev
run.dev
# Press [a] to create a project → give it a name → get a .local domain# Press [a] again on the project → point it at a folder# Run.dev scans it, suggests a start command, picks a port# Your service is running. With SSL. On a pretty URL. In 30 seconds.

How It Works

Browser Run.dev Your services
│ │ │
│ https://api.myapp.local │ │
├─────────────────────────►│ /etc/hosts → 127.0.0.1 + ::1 │
│ │ port 443 → 1112 (pfctl) │
│ │ TLS + SNI → pick SSL cert │
│ │ Host header → route lookup │
│ ├─────────────────────────────►│ localhost:4000
│ │◄─────────────────────────────┤
│◄─────────────────────────┤ │
│ 200 OK (green padlock) │ │

No Docker network. No Traefik. No nginx.conf. Just a binary that manages your processes and routes your traffic.

CLI

Both rundev and run.dev work as the command name.

rundev # Open the TUI dashboard
rundev up [project] # Start project(s) and open dashboard
rundev down [project] # Stop project(s)
rundev status # Quick status check (no TUI)
rundev list # List all projects and services
rundev doctor # Health check — ports, certs, hosts, helper
rundev clean # Stop everything, remove /etc/hosts entries
rundev setup # Re-install privileged helper + port forwarding

Flags:

FlagWhat it does
--no-proxySkip the reverse proxy
--no-sslSkip SSL certificate setup
--no-aiDisable Claude integration
-vVerbose/debug output

Keyboard Shortcuts

KeyAction
j / kNavigate up/down
EnterExpand/collapse project
aAdd project or service
sStart selected service
xStop selected service
rRestart selected service
fAuto-fix crashed service
lToggle log panel
/Ask Claude a question
qQuit (services keep running)
QQuit and stop everything

Mouse works too. Click things. Scroll things. It's 2026.

Project Detection

Point run.dev at a folder and it knows what to do:

It findsIt suggests
package.jsonnpm run dev, npm start, etc.
Cargo.tomlcargo run
go.modgo run .
manage.pypython manage.py runserver
Gemfilebundle exec rails server
ProcfileEach process line
docker-compose.ymlService commands (runs natively, not in Docker)

Ports are auto-detected from command flags, .env files, package.json proxy fields, or framework defaults.

The Mood System

Run.dev watches all your services and expresses how things are going:

MoodEmojiMeaning
Vibing😎Everything running, no issues
Chill😌Running, minor warnings
Got the Flu🤒1-2 services crashed
Wounded🤕More than half are down
Flatlined💀Everything is down
Fixing🔧Auto-restart in progress

When something crashes, run.dev doesn't just show you an exit code. It reads the stderr, categorizes the error, and gives you a personality-driven message with a suggested fix:

✗ api bro, api is ded. port 4000 is already taken.
i know what's wrong. press [f] to let me fix it

Press [f] and it kills the process hogging the port. Press / and ask Claude what went wrong.

AI Integration (Optional)

Run.dev is built to work with Claude Code, Anthropic's local CLI agent. When a service crashes, run.dev doesn't just show you the exit code — it sends the stderr to Claude for a real diagnosis. Claude reads the logs, understands the context, and tells you what actually went wrong.

What you get:

  • Crash diagnosis — a service dies, Claude reads the stderr and explains what happened and how to fix it
  • Live debug sessions — press / in the dashboard, ask Claude anything about your running services. It knows your project structure, your routes, your ports — it answers in context
  • Auto-fix suggestions — for common errors (port conflicts, missing modules, connection failures), run.dev suggests a fix. Press [f] and it handles it

Run.dev talks to Claude Code — your code and logs never leave your machine.

Configure it in ~/.config/rundev/config.yaml:

claude_proxy: http://localhost:3456/v1

The AI features are entirely optional. The app works perfectly without them. Disable anytime with --no-ai or just don't configure the proxy.

Architecture

See src/docs/ARCHITECTURE.md for the full technical deep-dive — module structure, data flow diagrams, key types, and design decisions.

Per-Service Node Version

If your services need different Node.js versions, add node_version to the service config. Run.dev wraps the start command with nvm use <version> automatically — no manual switching.

services:
backend:
path: /Users/dan/code/myapp/backendcommand: npm run devport: 3000node_version: "22.9"# uses nvm to switch before runningfrontend:
path: /Users/dan/code/myapp/frontendcommand: npm run devport: 5173node_version: "20"# different version, no problem

Requires nvm installed at $NVM_DIR (defaults to ~/.nvm). If node_version is omitted, the command runs with whatever Node is on your PATH.

Config Files

Everything lives in ~/.config/rundev/ (or ~/Library/Application Support/rundev/ on macOS):

~/.config/rundev/
├── projects/ # One YAML per project
│ ├── myapp.yaml
│ └── side-project.yaml
├── certs/ # Auto-generated SSL certificates
│ ├── myapp.local.pem
│ └── myapp.local-key.pem
├── config.yaml # Global settings (Claude proxy, theme)
└── state.json # PID persistence for background mode

FAQ

Do my services stop when I close run.dev? No. Press q and they keep running in the background. Next time you open run.dev, it reconnects. Press Q (capital) to stop everything on exit.

Does it work with Docker services? Run.dev manages processes directly — it doesn't orchestrate containers. If your service runs with a shell command, run.dev can manage it. If it only runs in Docker, you'd run docker compose up as the service command.

Do I need to trust the self-signed certs? Run.dev uses mkcert to generate locally-trusted certs — green padlock out of the box, no manual trust needed. If mkcert isn't available, it falls back to rcgen self-signed certs (browsers will show a warning you can click through once).

Does it work with Chrome's DNS-over-HTTPS? Chrome with "Use secure DNS" enabled bypasses /etc/hosts entirely. If your local domains aren't resolving, go to chrome://settings/security and disable "Use secure DNS". Safari, Firefox, curl, and all other tools work out of the box — run.dev writes both IPv4 and IPv6 entries to prevent Happy Eyeballs from falling back to production addresses.

My domains stopped working after a while, but the dashboard says the proxy is running. This used to happen when the OS dropped run.dev's port-forwarding rules underneath it — macOS flushes them across sleep/wake, and Docker or a firewall reload can wipe them on Linux. The listeners stayed up (so the dashboard looked fine) but browser traffic no longer reached them. run.dev now re-checks the redirect every few seconds and re-applies it automatically, so it recovers without a restart; you'll briefly see a "port forwarding inactive — re-applying" notice while it heals. Run rundev doctor to confirm the redirect is routing.

What about Windows? Not yet. macOS and Linux only. WSL might work but isn't tested.

License

MIT License — see LICENSE for details.

Copyright (c) 2026 Daniel Tamas hello@danieltamas.com


Built by Daniel Tamas
Because life's too short for nginx.conf

getrun.dev

About

Run.dev is an AI-native local development environment built in Rust. It manages all your services from one TUI dashboard — automatic .local domains with HTTPS, SNI-based reverse proxy, live CPU/memory stats, and Claude Code integration for crash diagnosis and live debugging. One binary. Zero config files.

Topics

Resources

Stars

9 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages