Run all your dev commands in parallel with one WOW.
WOW is a lightweight CLI tool that reads a wow.json from your project root and spins up all your development processes in parallel — each with its own colored, labeled output stream. No more juggling terminal tabs.
[ WOW] 🚀 Starting My Project (4 commands)
[ WOW] ──────────────────────────────────────────────
[ Vite] ▶ npm run dev
[ Vite] VITE v5.4.0 ready in 320 ms
[ Vite] ➜ Local: http://localhost:5173/
[Queue] ▶ php artisan queue:listen
[Queue] Queue listener started successfully.
[Queue] Processing: App\Jobs\SendEmail
[ WOW] ⏳ Expose starting in 3s...
[ Logs] ▶ tail -f storage/logs/laravel.log
[Expose] ▶ expose share http://my-domain.test
[Expose] Expose is sharing http://my-domain.test
WOW is built with Rust. If you don't have Rust installed yet:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shgit clone https://github.com/jessedev1/wow.git
cd wow
./install.shIf you get permission denied on macOS/Linux:
chmod +x install.sh
./install.shThat's it. The wow command is now available everywhere on your machine.
cd wow
git pull
./install.shcargo uninstall wow# Navigate to your Laravel project (or any project)
cd ~/Projects/my-app
# Generate a starter config
wow init
# Edit wow.json to match your project
nano wow.json
# Run everything
wowwow Start all enabled commands
wow run Start all enabled commands (same as above)
wow run <group> Start only commands in a specific group
wow init Generate a starter wow.json
wow list Show all configured commands
wow check Validate wow.json without starting
wow --help Show help
wow --version Show version
Reads wow.json from the current directory and starts all enabled commands in parallel. Each command gets its own colored prefix so you can easily tell which output belongs to which process.
Press Ctrl+C to gracefully stop all processes at once.
# Start everything
wow
# Start only frontend commands
wow run frontend
# Start only backend commands
wow run backendCreates a starter wow.json in the current directory with example commands for a typical Laravel project. Won't overwrite an existing file.
Displays all commands in a formatted table with their group, restart policy, and enabled status.
My Project — 6 commands
NAME COMMAND GROUPS RESTART STATUS
──────────────────────────────────────────────────────────────────────────────────────
Vite npm run dev frontend never enabled
Queue php artisan queue:listen backend on-failure enabled
Expose expose share http://my-project.test frontend never enabled (3s delay)
Mailpit mailpit backend, mail always enabled
Logs tail -f storage/logs/laravel.log backend never enabled
Scheduler php artisan schedule:work backend on-failure disabled
Validates your wow.json without starting anything. Useful after editing the config to catch mistakes early.
✅ wow.json is valid!
Project: My Project
Commands: 6 total, 5 enabled
Groups: backend, frontend, mail
WOW is configured through a wow.json file in your project root.
{
"project": "My Project",
"commands": [
{
"name": "Vite",
"cmd": "npm run dev",
"color": "cyan",
"group": ["frontend"]
},
{
"name": "Queue",
"cmd": "php artisan queue:listen",
"color": "yellow",
"group": ["backend"],
"restart": "on-failure",
"max_retries": 5
},
{
"name": "Expose",
"cmd": "expose share http://my-project.test",
"color": "magenta",
"group": ["frontend"],
"delay": 3
},
{
"name": "Mailpit",
"cmd": "mailpit",
"color": "green",
"group": ["backend", "mail"],
"restart": "always"
},
{
"name": "Scheduler",
"cmd": "php artisan schedule:work",
"group": ["backend"],
"enabled": false
}
]
}Only name and cmd are required. Everything else has sensible defaults:
{
"commands": [
{ "name": "Vite", "cmd": "npm run dev" },
{ "name": "Queue", "cmd": "php artisan queue:listen" }
]
}| Field | Type | Required | Default | Description |
|---|---|---|---|---|
project |
string | No | Directory name | Project name displayed at startup |
commands |
array | Yes | — | List of commands to run |
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
name |
string | Yes | — | Label shown as prefix in terminal |
cmd |
string | Yes | — | Shell command to execute |
color |
string | No | Auto-assigned | Prefix color (see below) |
group |
string[] | No | [] |
Groups for wow run <group> |
delay |
number | No | 0 |
Seconds to wait before starting |
restart |
string | No | "never" |
Restart policy (see below) |
max_retries |
number | No | 3 |
Max restart attempts |
enabled |
boolean | No | true |
Set false to skip without removing |
env |
object | No | {} |
Extra environment variables |
cwd |
string | No | Project root | Working directory override |
red · green · yellow · blue · magenta · cyan · white
If no color is specified, WOW assigns colors automatically in the order listed above.
| Policy | Behavior |
|---|---|
never |
Don't restart. Show exit code if the process crashes. |
on-failure |
Restart only on non-zero exit code, up to max_retries. |
always |
Restart on any exit (including clean exit), up to max_retries. |
A 1-second pause is applied between restarts to prevent tight crash loops.
Commands can belong to one or more groups. Use wow run <group> to start only commands in that group.
{
"name": "Queue",
"cmd": "php artisan queue:listen",
"group": ["backend"]
}{
"name": "Mailpit",
"cmd": "mailpit",
"group": ["backend", "mail"]
}wow run backend # Starts Queue + Mailpit
wow run mail # Starts Mailpit only
wow run frontend # Starts only frontend-tagged commands
wow # Starts everythingA command without any groups will only run when you start all commands (i.e. wow or wow run without a group name).
Delay long-starting dependencies. If a command depends on another being ready (like Expose needing the dev server), use delay to give it time:
{ "name": "Expose", "cmd": "expose share http://app.test", "delay": 3 }Temporarily disable commands without removing them by setting enabled to false. They'll show as "disabled" in wow list but won't run.
Use env to pass secrets or flags without polluting your shell:
{ "name": "Worker", "cmd": "php artisan queue:work", "env": { "QUEUE_CONNECTION": "redis" } }Use cwd for monorepos where commands need to run from different subdirectories:
{ "name": "API", "cmd": "php artisan serve", "cwd": "./api" },
{ "name": "Frontend", "cmd": "npm run dev", "cwd": "./frontend" }Commit wow.json to your repo so every team member gets the same dev setup with one command.
- Rust
- clap — CLI argument parsing
- tokio — Async runtime for parallel process management
- serde — JSON deserialization
- colored — Terminal colors
Created and maintained by Jessedev1 (jesse@codewow.nl).
MIT — see LICENSE.