Laravel specific VS Code multi terminal setup for claude, queues, logs, npm
I got tired of opening 6 terminals every time I sat down to work and didn't want to start using some 3rd party tool like tmux etc. So I set up a single VS Code task that boots my entire dev environment in parallel. It's just a .vscode/tasks.json (see below) with a compound task called "Start Development Environment" that kicks off everything at once:
Hit CMD+Shift+B.
Here are the tabs in visual studio code
All of these tabs open automatically with 1 command.
Claude
An embedded Claude Code session right in the terminal. It runs with --dangerously-skip-permissions so it doesn't nag me mid-flow, and I've got it pinned to Opus
NPM Dev
Vite dev server. Runs silently in the background — I don't need to see HMR logs unless something breaks. The reveal: silent keeps it out of my face.
Queue Workers (x3)
Three php artisan queue:work processes grouped together under a "workers" tab group. I start up 3 workers and can see them work in the same tab which is nice.
Logs
php artisan pail — Laravel's real-time log tail. Also runs silent in the background. I flip to it when something looks off, otherwise it just hangs out.

How it works
The magic is the compound task at the bottom. dependsOrder: parallel fires all six tasks simultaneously. It's set as the default build task so Cmd+Shift+B is all it takes.
{
"label": "Start Development Environment",
"dependsOrder": "parallel",
"dependsOn": [
"Claude",
"NPM Dev",
"Queue Worker 1",
"Queue Worker 2",
"Queue Worker 3",
"Logs"
],
"group": {
"kind": "build",
"isDefault": true
}
}
Making It Global
If you want this across all your projects, drop the file in:
~/Library/Application Support/Code/User/tasks.json
Or just Cmd+Shift+P → "Tasks: Open User Tasks" and paste it in. The Laravel-specific tasks will only work in Laravel projects obviously, but they fail silently so it's not a big deal.
The Full tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "Claude",
"type": "shell",
"command": "claude",
"args": ["--dangerously-skip-permissions", "--model", "claude-opus-4-6"],
"group": "build",
"isBackground": true,
"presentation": {},
"runOptions": {
"instanceLimit": 1
}
},
{
"label": "NPM Dev",
"type": "shell",
"command": "npm",
"args": ["run", "dev"],
"group": "build",
"isBackground": true,
"presentation": {
"echo": false,
"reveal": "silent",
"focus": false,
"panel": "new",
"showReuseMessage": false,
"clear": false
},
"runOptions": {
"instanceLimit": 1
}
},
{
"label": "Queue Worker 1",
"type": "shell",
"command": "php",
"args": ["artisan", "queue:work"],
"group": "build",
"isBackground": true,
"presentation": {
"group": "workers"
},
"runOptions": {
"instanceLimit": 1
}
},
{
"label": "Queue Worker 2",
"type": "shell",
"command": "php",
"args": ["artisan", "queue:work"],
"group": "build",
"isBackground": true,
"presentation": {
"group": "workers"
},
"runOptions": {
"instanceLimit": 1
}
},
{
"label": "Queue Worker 3",
"type": "shell",
"command": "php",
"args": ["artisan", "queue:work"],
"group": "build",
"isBackground": true,
"presentation": {
"group": "workers"
},
"runOptions": {
"instanceLimit": 1
}
},
{
"label": "Logs",
"type": "shell",
"command": "php",
"args": ["artisan", "pail"],
"group": "build",
"isBackground": true,
"presentation": {
"echo": false,
"reveal": "silent",
"focus": false,
"panel": "new",
"showReuseMessage": false,
"clear": false
},
"runOptions": {
"instanceLimit": 1
}
},
{
"label": "Start Development Environment",
"dependsOrder": "parallel",
"dependsOn": [
"Claude",
"NPM Dev",
"Queue Worker 1",
"Queue Worker 2",
"Queue Worker 3",
"Logs"
],
"group": {
"kind": "build",
"isDefault": true
},
"isBackground": true
}
]
}
That's my setup, enjoy.