DevCatz installs the language runtimes your sites need and picks the right version for each site, so one project can run PHP 8.4 while the next stays on 8.1. Everything lives in DevCatz’s own data folder; nothing is installed system-wide.
Open Runtimes in the rail. It has a page per language: PHP, Python, Node.js, Bun, Go and Rust — all six on macOS and on Windows.
<data> in this page is DevCatz’s data folder: ~/Library/Application Support/DevCatz%APPDATA%\DevCatz.
The runtime pages
Every page works the same way:
- Installed lists the versions you have, with Make default and Uninstall.
- Available lists what can be installed, with Install, and Refresh to load the list again.
- Versions you installed yourself are listed too, read-only, marked your own — a Homebrew PHP or Node.js, for example; Laravel Herd’s PHP and Node.js show up marked Laravel Herd; the Node.js page shows the one On your Path.
- Tools (Node.js, Go, Python and Rust) installs the command-line tools that frameworks use — see Framework tools.
Every install and update shows its progress and can be cancelled.
The default version is the one a site gets when nothing in the project asks for another.
Using the runtimes in your terminal
DevCatz keeps small launchers (“shims”) for your default version of each runtime in one folder, <data>/bin:
node, npm, npx and corepack; bun and bunx; go and gofmt; php and composer; python, python3,
pip, uv and uvx — plus every framework tool you install (pnpm, yarn, tsc, air,
poetry, …). Change what they run with Make default. Sites always get their own version, whatever the default is.
Rust is not in this folder: cargo and the Rust tools live in ~/.cargo/bin%USERPROFILE%\.cargo\bin,
where rustup puts them.
The card Use the default in your terminal is on the Node.js page, under its Terminal tab. Its badge reads active once the folder is on your path, not on PATH before.
Copy the line DevCatz shows (Copy) — export PATH="<data>/bin:$PATH" — and add it to the end of your
~/.zshrc, then open a new terminal tab. Because it comes last, DevCatz’s shims take precedence over a node from
another tool (nvm, Homebrew …).
Press Add to my Path. DevCatz puts the folder first in your own Path (the user Path, no administrator rights),
and new terminals — Windows Terminal, PowerShell, cmd and VS Code’s terminal — use it. Each shim is a .cmd file.
Remove from my Path takes the folder out again.
A Node installed for all users (in Program Files) still comes first: Windows puts the system Path before yours.
Runtime updates
DevCatz checks every 6 hours for newer patch releases of the PHP, Go, Bun and Node.js versions you have installed and offers an Update button for each. A dot appears on Runtimes in the rail, and the menu bartray menu lists them as Runtime Updates (N)….
New releases of the framework tools you installed are checked too: the runtime’s Tools tab gets a badge, the Runtimes dot counts them, and a notification (Tool update available) opens that tab. The same dot marks the other rail sections with an update waiting — Object Storage, WebSocket, Search Engine, Gateways and Expose.
Under Settings → Project → Runtime updates, Notify me sends a notification when updates are found, and Check now checks right away.
PHP
The PHP page has four tabs: Installed, php.ini, Extensions and Available, with a PHP version selector for the two in the middle.
Where PHP comes from
| Versions | Source |
|---|---|
| 8.0 and later | Static builds from static-php.dev (CLI + FPM), with a large set of extensions built in — gd, intl, pdo_mysql, redis, zip, bcmath, pcntl, sodium, imagick, OPcache and more |
| 7.4, 7.3, 7.2, 7.1, 7.0, 5.6 | Homebrew, from shivammathur/php, for old projects. Install runs brew install shivammathur/php/[email protected], and DevCatz uses Homebrew’s PHP and PHP-FPM like its own. Needs Homebrew |
static-php.dev publishes no checksums: downloads use HTTPS, the binary must report the expected version, and the
SHA-256 is recorded in SHA256SUMS next to it.
Each version lives in php/<version>/bin with its own php and php-fpm. One PHP-FPM master runs per version
in use, and every site on that version shares it.
Official PHP builds from php.net’s Windows downloads (NTS x64, Laravel’s usual extensions turned on) — the current
release of every minor php.net still lists there. Every download is checked against the SHA-256 that php.net publishes
for it (releases.json); the digest is recorded in SHA256SUMS next to the binaries.
Each version lives in php\<version> with its own php.exe and php-cgi.exe. There is no PHP-FPM on Windows: PHP
sites are served by a few php-cgi workers per version (four, on consecutive ports from 9100; the next version takes
the next block), labelled PHP (FastCGI), always on. Each request goes to the least busy worker.
PHP needs the Microsoft Visual C++ Redistributable (x64). When it is missing, PHP does not start and DevCatz says so: PHP did not start. It needs the Microsoft Visual C++ Redistributable (x64): install it from https://aka.ms/vs/17/release/vc_redist.x64.exe and try again.
When php.net has released a newer version than DevCatz’s source has built so far, the page says so; the update appears once it is built.
A site’s PHP version is set when you add it and in its Settings tab. DevCatz suggests the newest one that fits
the project’s composer.json. Uninstall stops that version’s PHP-FPM poolPHP (FastCGI) workers;
sites using it fall back to another installed version.
Composer
Install Composer puts a managed composer.phar (from getcomposer.org, checked against its SHA-256) on the shims
path, so composer works in your terminal with the site’s PHP.
The php.ini form
The php.ini tab is a form for the settings people change most. It applies to the PHP version you pick:
| Setting | Default |
|---|---|
memory_limit |
512M |
upload_max_filesize |
64M |
post_max_size |
64M |
max_execution_time |
120 |
max_input_vars |
5000 |
display_errors |
On |
error_reporting |
E_ALL |
date.timezone |
Your computer’s time zone |
opcache.enable |
1 |
Anything else goes in the free-text box below. DevCatz writes your values to conf.d/99-mrcatz.ini, checks that PHP
accepts them, and then reloads PHP-FPMPHP (FastCGI) (php.ini
saved; PHP-FPMPHP (FastCGI) 8.4 reloaded). The tab shows the
values PHP really uses (from php -i), so you can see that a change took. Open php.ini opens that version’s
php.ini folder (with conf.d) in your editor.
Extensions
Many extensions are already built into DevCatz’s PHP builds — Show the built-in modules lists them. The Extensions tab adds PECL extensions on top, and switches each one on or off per PHP version.
Extensions are built from PECL source with phpize for your exact PHP version. The first build also prepares the
build toolkit (phpize, php-config and the headers, about a minute), kept per version in
~/Library/Caches/DevCatz/php-dev — outside the data folder, because the build tools break on paths with spaces.
autoconf is needed too; DevCatz installs what a build needs through Homebrew (extensions that do are marked
brew). Press Install on an extension in the list, or type any PECL name and press Build & install.
Extensions can be added to DevCatz’s own PHP builds (8.x) only: a Homebrew PHP keeps its own pecl.
Nothing is compiled on Windows. The extensions that ship in the PHP zip (ext\php_*.dll) are switched on and off
from the list; PECL extensions come as ready-made DLLs from php.net’s Windows PECL builds, matched to your PHP minor
(NTS, x64), and are kept only when they load into that PHP. Press Install on an extension in the list, or type
any PECL name and press Install.
Each one is loaded from its own conf.d/20-<name>.ini. When DevCatz updates PHP to a newer patch of the same minor
version (8.3.x to a later 8.3.x), your extensions come along.
| Extension | What it is for |
|---|---|
| Xdebug | Step debugging, profiling and coverage. Set up with mode=debug,develop,coverage, start_with_request=trigger and client_port=9003, so it only runs when asked |
| PCOV | Fast code coverage |
| MongoDB | The MongoDB driver |
| igbinary | Compact binary serializer |
| MessagePack | MessagePack serializer |
| Data Structures | The ds collections |
| php-ast | PHP’s abstract syntax tree, for static analysis tools |
| XHProf | Profiler |
| Excimer | Sampling profiler |
| YAML | YAML parsing |
| Memcached | Memcached client |
| SSH2 | SSH and SFTP from PHP |
| rdkafka | Kafka client |
| Decimal | Arbitrary-precision decimals |
| Mailparse | Mail parsing |
| Zstandard | Zstandard compression |
| LZF | LZF compression |
| Upload progress | Upload progress tracking |
| gRPC | gRPC client — the build takes 10 minutes or more |
WP-CLI
The WordPress tasks on a site’s Database tab call wp. DevCatz does not install it: brew install wp-cliput wp-cli.phar and a wp.bat on your Path (wp-cli.org), and the tasks
find it.
Node.js
Official builds from nodejs.org, checked against their SHA-256 sums. Every major version from 18 up is offered, with its LTS name.
A site gets its Node.js version from, in this order:
- The version picked in the site’s Settings tab.
- The project:
.nvmrc,.node-versionorengines.nodeinpackage.json. - Your default version.
The Node.js page has an extra Terminal tab next to Installed, Available and Tools — see Using the runtimes in your terminal.
Bun
Bun comes from its GitHub releases, checked against SHA-256 sums. A project that pins a version in the
packageManager field of package.json gets that version; anything else uses your default.
Go
Go toolchains come from go.dev, checked against SHA-256 sums. A site gets the newest installed version that
satisfies its go.mod, preferring your default when it fits.
Dev commands on Windows
DevCatz writes every dev command the POSIX way (npm run dev, python manage.py runserver 127.0.0.1:${PORT:-8000},
go run .), and on Windows runs it under cmd.exe, translated as it goes:
${PORT:-8000}is filled in with the port DevCatz gives the app (the default when it is unset);$NAMEand${NAME}become%NAME%.VAR=value commandandenv VAR=value commandbecomeset "VAR=value"&& command..venv/bin/pythonis.venv\Scripts\python.exe,/dev/nullisNUL, anda; bisa & b.
So a dev command you type in the site’s Settings can stay in shell form. Stop and Cancel end the whole process
tree (taskkill /T), and dev servers left behind by a DevCatz that ended without stopping them are stopped on the next
launch.
Framework tools
The Tools tab on the Node.js, Go and Python pages installs the command-line tools that frameworks call — the
newest release, into DevCatz’s own <data>/tools folder, put on the shims path (as linksas .cmd shims)
so your terminal finds them too.
| Runtime | Installed with | Tools |
|---|---|---|
| Node.js | npm install -g with your default Node.js |
pnpm, Yarn, Electron, Electron Forge, Angular CLI (ng), NestJS CLI (nest), TypeScript (tsc), tsx, nodemon |
| Go | go install …@latest with your default Go (it compiles, so it takes a minute or two) |
Air (live reload — sites with an .air.toml start with it), swag, golang-migrate, goose, sqlc, templ, Wails, Delve (dlv) |
| Python | uv tool install |
Poetry, Pipenv, PDM, Ruff, pre-commit, Cookiecutter |
Each tool has Install, and once installed Update (when a newer release is out) and Remove; Update all updates every outdated one and Check for updates looks again. A tool you installed some other way is marked your own copy — update that one the way you installed it. After an update DevCatz reads the version again: if the old one is still the one that runs, the update is reported as failed, with both versions, not as done. A needed by N sites badge shows which tools your sites are waiting for. The Go and Node.js tabs need a version of that runtime installed first; the Python tab needs uv. Rust has the same tab — see Rust tools.
Python and uv
DevCatz runs Python through uv. Press Install uv on the Python page, and DevCatz downloads it. Python itself
(CPython from python-build-standalone) is installed with uv python install into <data>/python.
Each site gets its own .venv — DevCatz recognises it by .venv/bin/python.venv\Scripts\python.exe.
Its Python version comes from, in this order:
- The version picked in the site’s Settings tab.
- The project:
.python-versionorrequires-pythoninpyproject.toml. - Your default version.
- The newest version you have.
Install dependencies uses the project’s own tool:
| Project has | Runs |
|---|---|
uv (uv.lock) |
uv sync |
requirements.txt |
uv venv then pip install -r |
| Poetry, PDM or Pipenv | poetry install, pdm install or pipenv install |
A broken virtualenv
A .venv remembers the Python it was made with (pyvenv.cfg). When that Python is gone — uninstalled, or replaced by
an update — nothing in the venv runs any more. DevCatz notices: the site’s Overview shows The virtualenv is broken
(.venv was made with Python 3.12, which is no longer installed, so nothing in it runs), and Start refuses with
the same reason. Press Install dependencies: DevCatz moves the old venv to the TrashRecycle Bin,
makes it again with the site’s Python and installs the packages. On both platforms.
Rust
The Rust page has three tabs: Installed, Available and Tools.
DevCatz uses the official rustup, in its usual place — ~/.rustup and ~/.cargo%USERPROFILE%\.rustup
and %USERPROFILE%\.cargo — so your editor and terminal use the same toolchains. When rustup is missing,
Install Rust downloads rustup-init from rust-lang.org (SHA-256 checked) and installs the stable toolchain, the
standard way.
Rust links programs with the Xcode Command Line Tools’ linker. When they are missing, the page says The Xcode Command
Line Tools are missing: run xcode-select --install in Terminal, then come back.
DevCatz installs rustup’s MSVC toolchain (x86_64-pc-windows-msvc), which links programs with Microsoft’s linker from
the Visual Studio Build Tools. When they are missing, the page says The Visual Studio Build Tools (C++) are missing,
and Install Build Tools fetches Microsoft’s installer (its signature is checked) with the C++ tools: Windows asks
for administrator rights, then the Visual Studio Installer shows its own progress — a few GB, several minutes. A Build
Tools you already have is extended, not installed twice; when the installer asks for a restart, the restart finishes it.
On a Windows on Arm PC, rustup picks the aarch64 toolchain and DevCatz looks for the ARM64 C++ tools.
- Toolchains: stable, beta and nightly. A project’s
rust-toolchain.tomlis honoured. - WebAssembly: Add wasm32-unknown-unknown adds the target that Yew, Sycamore, Leptos and Dioxus need in the browser.
- On a site’s Overview: buttons for
cargo fetch,cargo checkandcargo update.
Rust tools
The Tools tab installs the command-line tools that frameworks need — prebuilt through cargo-binstall where the
project publishes a binary, else compiled by cargo — into ~/.cargo/bin%USERPROFILE%\.cargo\bin,
where new terminals find them too:
| Tool | For |
|---|---|
| Trunk | Yew, Sycamore and client-side Leptos |
Dioxus CLI (dx) |
Dioxus |
| cargo-leptos | Leptos with server-side rendering |
Tauri CLI (cargo-tauri) |
Tauri |
| Solana CLI (Agave) | Solana programs; from Anza’s installer, into ~/.local/share/solana |
| Anchor (avm) | Anchor projects; compiled once, which takes a few minutes |
| SQLx CLI | SQLx migrations |
| SeaORM CLI | SeaORM migrations and entities |
| Diesel CLI | Diesel migrations |
Solana and Anchor are not in the Windows list: as their own docs say, on Windows they run inside WSL (Windows Subsystem for Linux) — install them there.
Like the other Tools tabs, each one has Update and Remove, and new releases show up as an update badge.
While Anchor is installed, the Solana card offers no newer release. Anchor picks the Solana release it was built for
and switches back to it every time it runs, so a newer Solana would not stay; the card says so, and a project can ask
for another release in its Anchor.toml ([toolchain] solana_version).
A Rust site whose tools are missing lists them on its Overview with install buttons. See Rust in Detected stacks.
Queue workers and schedulers
Background processes that belong to a site start and stop with it. Switch them on in the site’s Settings tab under Runs with Start:
| Switch | Runs |
|---|---|
| Queue worker | php artisan queue:work |
| Scheduler | php artisan schedule:work |
| Celery worker | The Celery worker of a Python site |
| Celery beat | The Celery beat scheduler |
They are off by default in worktree sites, so a second copy of a site does not process the same queue.
Dependencies
The Dependencies card on a site’s Overview installs or updates the project’s packages with the right tool for its stack. Install runs straight away; Update asks first, because it can change your lock file.
When dependencies are missing, the site’s Overview shows Install dependencies, and says why Start would fail — see the Overview tab. To win back disk space from a stopped site, use Free up space in its Settings tab (see Per-site settings).
Last updated 2026-11-03