Requirements
macOS 13 (Ventura) or later to run — macOS 15 (Sequoia) for everything
Section titled “macOS 13 (Ventura) or later to run — macOS 15 (Sequoia) for everything”Two numbers, on purpose. Through 0.8.6 the floor was macOS 15; now the app runs on macOS 13 and 14, and it says so itself: at first launch on such a Mac the wizard reads “This Mac runs macOS 13.6 — rexenv works here with older versions of some components and without PostgreSQL and PHP 8.0. Everything is available on macOS 15 or later.” Below 13 nothing is offered a download.
What “older versions” means is a different pin per component — the last build of each that still loads on that macOS, measured on both chips before it was pinned. The exact numbers are on every row of Pinned versions; in short, on macOS 13:
| Component | macOS 15+ | macOS 13 |
|---|---|---|
| MySQL | 8.4.6 / 8.0.44 | 8.4.3 / 8.0.40 |
| MariaDB | 12.3.2 / 11.4.12 | 12.0.2 / 11.4.8 |
| Redis | 8.8.0 | 8.2.1 |
| Apache | 2.4.68 | 2.4.65 |
| Xdebug | 3.5.3 for 8.1–8.5 | 3.4.5 for 8.1–8.4 — none for 8.5 |
| cloudflared | 2026.6.1 | 2025.4.0 (also on macOS 14) |
| PostgreSQL | 18.6 / 17.11 / 16.15 | not available (macOS 14: 16.4.0 only) |
| PHP 8.0 | 8.0.30 | not available |
macOS 14 differs from 15 in only two rows: cloudflared 2025.4.0 and PostgreSQL 16.4.0 alone. Everything else on 14 is the standard pin.
What is not available is refused by name, with the macOS it needs, wherever you could
choose it — the Databases page, the New Site dialog’s Database field, rex db versions and
the agent tools all answer with the same sentence, for example “Needs macOS 14 or later —
this Mac runs macOS 13.6.” The row stays visible with that reason; nothing is silently
hidden. PHP 8.0 sits in Settings with the sentence as a badge and its Install button off.
Intel or Apple Silicon
Section titled “Intel or Apple Silicon”One universal build runs natively on both. There is no separate download to choose and no Rosetta involved.
An internet connection on first run
Section titled “An internet connection on first run”rexenv does not bundle its stack. It downloads each component — PHP, nginx, Caddy, MySQL, Mailpit and the rest — the first time you actually use it, verifies it against a pinned checksum, and prepares it for macOS.
Budget up to ~600MB across a full cold start, spread over your first few actions rather than taken all at once. After that rexenv works offline; nothing re-downloads unless you add a component you have not used before.
The reason it works this way rather than shipping a 600MB app: you get seven PHP versions, four database engines and three web servers available on demand, and you only pay for the ones you touch.
Plan on 2–4GB for a working setup: the app itself is small, the downloaded components are
most of it, and your databases sit alongside them under
~/Library/Application Support/dev.rexenv.rexenv/. Your sites are in ~/rexenv/Sites.
rexenv binds 80 and 443 for the edge proxy, and a set of high ports for everything else — deliberately offset from the usual defaults so it never collides with a MySQL, Mailpit or nginx you already run.
If something else already holds 80 or 443, rexenv tells you what is holding it rather than
failing quietly. rex doctor reports the same from a terminal.
What it does not need
Section titled “What it does not need”- No Docker, no VM, no Homebrew installation of the stack itself.
- No
/etc/hostsediting. A DNS resolver handles*.rexfor you. - No Xcode, and no Command Line Tools, for the stack — Caddy, nginx, PHP, MySQL, Mailpit, Adminer and WP-CLI all install on a Mac that has never seen a compiler, and so do Redis, MariaDB, Apache and Xdebug.
Windows 11 x64
Section titled “Windows 11 x64”Windows 10 22H2 is best-effort — it left mainstream support on 14 October 2025, and nothing on it is measured.
arm64 is unsupported, and not merely unbuilt. The x64 build runs under emulation on an arm64 machine, but the official PHP Windows builds are x86/x64 only and PostgreSQL’s portable build is x64 only — there is no native stack to ship, so rexenv does not pretend there is one.
An internet connection on first run
Section titled “An internet connection on first run”rexenv does not bundle its stack. It downloads each component — PHP, Caddy, nginx, MySQL, PostgreSQL, Mailpit, cloudflared — the first time you use it, checksum-verified, then works offline.
The Windows artifacts are the same versions as macOS from different publishers: PHP from php.net’s NTS builds, nginx from nginx.org, MySQL from Oracle’s CDN. Every one is pinned to a digest rexenv downloaded and hashed itself.
The app installs to %LOCALAPPDATA%\rexenv at about 37 MB. The components and your
databases land under %LOCALAPPDATA%\rexenv\rexenv\data, your sites in
%USERPROFILE%\rexenv\Sites — plan on 2–4GB for a working setup, the same as macOS.
The edge proxy binds 80 and 443, and the DNS answerer binds 53 on 127.0.0.1 —
Windows’ NRPT has no port field, so it cannot be offset the way macOS’s 15353 is. Everything
else is on the same high, offset ports as macOS.
Two things follow from binding loopback only:
- No Windows Defender Firewall alert on first run, because nothing listens on a routable address.
- Your sites are reachable from this computer only. Sharing one publicly is Tunnels, which dials out rather than opening a port.
Binding 80 and 443 needs no administrator approval on Windows — measured under an ordinary unelevated account.
The Microsoft Visual C++ Redistributable (x64)
Section titled “The Microsoft Visual C++ Redistributable (x64)”PHP and MySQL’s Windows builds link it, and a fresh Windows 11 install does not always have
it. Without it, no database and no PHP can start — rexenv checks for it before Start all
touches either, rather than letting MySQL die with a bare exit code. Settings, rex doctor’s
Runtime line, and the installer itself (skipped on a silent /S install) all offer the
same link: https://aka.ms/vs/17/release/vc_redist.x64.exe.
What it does not need
Section titled “What it does not need”- No Docker, no VM, no WSL. This is a native Windows build.
- No
hostsfile editing. rexenv never touches it: that file is shared by every tool on the machine, and rexenv’s rule is never to overwrite a file somebody else owns. It uses an NRPT rule instead. - No compiler, and no build tools.
Five components are not in this build
Section titled “Five components are not in this build”Apache, FrankenPHP, Xdebug, Redis and MariaDB. Each is refused by name with the reason rather than offered and then failing — Install has the table, and Pinned versions marks the rows.
MySQL 8.4 and 8.0 both ship, so a site has a database either way, and PostgreSQL’s three majors are there for Laravel.
Ubuntu 22.04 LTS or newer, x86_64 or arm64
Section titled “Ubuntu 22.04 LTS or newer, x86_64 or arm64”22.04 is the floor for two reasons. It is the first LTS with libwebkit2gtk-4.1, which the
app’s window needs, and the release is built on it, so its glibc is the oldest the binary runs
against. The one-command installer refuses 20.04 with a sentence saying so.
Newer releases are covered, including where Ubuntu renamed a library MySQL or PostgreSQL loads
— libaio1t64 on 24.04 and later, libxml2-16 on 26.04. There rexenv keeps a private symlink
under its own data folder that bridges the old name, so both engines start; the .deb declares
either spelling. Measured on Ubuntu 22.04 arm64 with a GNOME desktop, and on 22.04 and 26.04
x86_64.
Other distributions with systemd-resolved and polkit will probably work, and none has been
tested. The AppImage exists for them; a distribution without apt gets it from the one command.
Both architectures get a native build of every component — every publisher rexenv pins ships an arm64 Linux build, so nothing runs under emulation.
systemd-resolved
Section titled “systemd-resolved”.rex is routed through a dummy network link that systemd-resolved sends only .rex names to,
so resolved has to be what answers /etc/resolv.conf — Ubuntu’s default. Where it is not
running, the setup step refuses with a sentence saying so and writes nothing.
A desktop, with polkit
Section titled “A desktop, with polkit”The app is a desktop window (WebKitGTK) with a tray icon, and every system change goes through
pkexec — your desktop’s own password dialog, so a polkit authentication agent must be running,
as it is on any Ubuntu desktop. The tray icon needs libayatana-appindicator3; the .deb pulls
it in.
An internet connection on first run
Section titled “An internet connection on first run”rexenv does not bundle its stack. It downloads each component the first time you use it — the same versions as macOS, from each publisher’s own Linux build: Caddy, nginx, PHP from static-php.dev (7.4 is rexenv’s own), MySQL from Oracle’s CDN, PostgreSQL, Mailpit and cloudflared — every one pinned to a digest rexenv hashed itself, then it works offline.
The .deb is about 15 MB to download and 45 MB installed; the AppImage about 87 MB. The
components and your databases land under ~/.local/share/rexenv ($XDG_DATA_HOME/rexenv if
you set it), your sites in ~/rexenv/Sites — plan on 2–4GB for a working setup, as on macOS.
The edge proxy binds 80 and 443, run as root by a systemd unit because only root may bind
below 1024. The DNS resolver is on 15353, loopback-only, as on macOS. Everything else is on
the same high, offset ports as the other two platforms.
What it does not need
Section titled “What it does not need”- No Docker, no VM. This is a native Linux build, for x86_64 and arm64.
- No
/etc/hostsediting. rexenv never touches it, nor a global resolver configuration — the.rexroute is rexenv’s own link, removable without touching anything anybody else wrote. - No compiler, and no build tools.
Four components are not in this build
Section titled “Four components are not in this build”Apache, Xdebug, Redis and MariaDB. Each is refused with a message naming Linux rather than offered and then failing — Install says why, and Pinned versions marks the rows. FrankenPHP ships, and so do MySQL 8.4 and 8.0 and PostgreSQL’s three majors.
One user account per machine
Section titled “One user account per machine”On all three systems the web server on :443, the .rex DNS route and the resolver’s port are
machine-wide, so a second account on the same machine cannot run its own rexenv beside the
first — its services would find those ports taken. Use rexenv from one account. On Windows there
is one more machine-wide piece, the \rexenv\dns-agent scheduled task. A second account’s
launch finds it registered for the first and leaves it alone — its log says the task is
“registered for another account on this computer”, naming that account’s SID — and .rex is
answered by that second copy only while it runs. Through 0.8.10 the second launch silently took
the task over, so the resolver then started at the wrong account’s sign-in.