Docs · DevCatz

Runtimes

PHP and its extensions, Node.js, Bun, Python, Go and Rust, and the framework tools for each — how DevCatz installs them on macOS and Windows, which version a site gets, and how to use them in your terminal.

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:

  1. The version picked in the site’s Settings tab.
  2. The project: .nvmrc, .node-version or engines.node in package.json.
  3. 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); $NAME and ${NAME} become %NAME%.
  • VAR=value command and env VAR=value command become set "VAR=value"&& command.
  • .venv/bin/python is .venv\Scripts\python.exe, /dev/null is NUL, and a; b is a & 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:

  1. The version picked in the site’s Settings tab.
  2. The project: .python-version or requires-python in pyproject.toml.
  3. Your default version.
  4. 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.toml is 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 check and cargo 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