Frameworks

Framework tooling that already knows which PHP version each site uses.

Laravel

Artisan, queue workers, Vite, .env sync

WordPress

WP-CLI per site

Composer

Bundled wrapper, always the active PHP

Laravel Artisan

Run Artisan for any linked site, from anywhere, with that site's isolated PHP version. Everything after the site name is passed straight through.

bitl artisan shop migratebitl artisan shop make:model Order --migrationbitl artisan shop.test tinkerbitl artisan shop route:list --json

Queue workers

Run php artisan queue:work for a site. The connection is read from the project's .env unless you pass one.

bitl queue start                          # current directory, 1 worker, queue "default"bitl queue start shop --workers 3 --queue emails,defaultbitl queue start shop --connection redis

For workers you want to keep an eye on, use the app instead: open the site, click Add Worker under Queue Workers, and BitL supervises the workers, shows their status, and lets you restart or stop them after a deploy.

bitl queue status                         # workers from any earlier bitl queue startbitl queue restart shop                   # after a deploybitl queue stop shop
Note. The CLI keeps track of the workers it starts in /tmp/bitl/queue-workers.json, so a later status, restart or stop finds them. Workers that have exited are dropped from the list. Workers added in the app are managed in the app.

Vite

Run a project's Vite dev server. BitL picks npm, pnpm, yarn or bun from the lockfile and hands out ports from 5173 upward so several projects can run at once.

bitl vite start                 # current directorybitl vite start ~/Sites/shop --port 5180
bitl vite statusbitl vite stop ~/Sites/shop     # same site or path you started it with
Note. Running Vite servers are recorded in /tmp/bitl/vite-instances.json, so status and stop work from any terminal.

WordPress · WP-CLI

bitl wp blog plugin listbitl wp blog core updatebitl wp blog.test db export backup.sql

BitL runs your installed wp with the site's PHP version. It does not bundle WP-CLI: brew install wp-cli.

Composer

A composer wrapper ships inside BitL.app and is copied into BitL's bin directory. It downloads composer.phar on first use and runs it with the active PHP version.

bitl composer                    # status: where it is, which versionbitl composer self-updatebitl composer install --force    # reinstall the wrapper from scratch

With BitL's bin on your PATH (see Runtimes) you just type composer.

Scaffolding

bitl new creates the project in the current directory, then links it:

TemplateRunsNeeds
laravelcomposer create-project laravel/laravelComposer (bundled)
wordpresswp core downloadwp (WP-CLI)
statica folder with an index.htmlnothing
cd ~/Sitesbitl new laravel shop          # → ~/Sites/shop, served at shop.testbitl new laravel api --park    # park ~/Sites instead of linking the one sitebitl new static landing --tld=localhost

nginx templates

BitL writes a vhost per site automatically. When you need a different shape — an SPA fallback, a reverse proxy to a Node or Python server — start from a built-in template:

TemplateFor
laravelLaravel / PHP front controller via PHP-FPM
spaSingle-page apps (React, Vue …): every path falls back to index.html
wordpressWordPress with pretty permalinks
staticPlain files
proxyReverse proxy to a local port
nodeNode.js app, with WebSocket upgrade headers
bitl nginx templatesbitl nginx template spa --domain app.test --root ~/Sites/app/distbitl nginx template node --domain api.test --root ~/Sites/api --port 3000bitl nginx validate        # check BitL's nginx configbitl nginx reload
Note. bitl nginx template prints the rendered server block; it doesn't install it. Save the output as ~/Library/Application Support/BitL/nginx/vhosts/<domain>.conf, then run bitl nginx validate and bitl nginx reload. For a reverse proxy to a Docker container, bitl docker link does it in one step.