Brian Dillingham

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

Claude terminal tab

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.

NPM Dev terminal tab

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.

Queue Workers terminal tabs

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. Logs terminal tab

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.