Run every server, site, and database from one calm command room.
A native, lightweight, limitless local development environment for web & WordPress developers. No Docker.
macOS 15+ · universal · v0.1.1
brew install --cask rexenvInstall
Two ways in. One of them is better.
brew tap rexenv/tap
brew trust rexenv/tap
brew install --cask rexenv- No Gatekeeper step. The cask removes the quarantine attribute, so rexenv opens on a normal double-click the first time.
- rex on your PATH automatically, linked into Homebrew's bin.
- Updating later is brew upgrade --cask rexenv.
- 1. Download the universal disk image from the releases page.
- 2. Verify it against the published checksum, and compare with the rexenv_0.1.1_universal.dmg.sha256 published beside it.
shasum -a 256 rexenv_0.1.1_universal.dmg - 3. Drag rexenv into Applications and eject the image.
- 4. Right-click → Open, then Open again in the dialog. Once only.
What you get
One app instead of nine.
Sites in one click
WordPress, Laravel or blank PHP. Or link a folder you already have and serve it in place — rexenv never copies or moves it. Or clone straight from a git repository.
HTTPS that just works
A real green lock on https://yoursite.rex, signed by a local authority that never leaves your Mac. No warning page, no port number, no /etc/hosts.
Seven PHP versions
From 7.4.33 to 8.5.8, switchable per site in one click. Versions past their security-end date are badged wherever they appear.
Four database engines
MySQL, MariaDB, PostgreSQL and Redis, chosen per site. Each engine keeps a separate data directory per version series, so switching is never an in-place upgrade.
A full WordPress manager
Plugins, themes, users and multisite — subdomain or subdirectory. Install from wp.org, a zip, a git clone or a local folder, and open wp-admin with one click and no password.
Every mail caught
Password resets, order confirmations, plugin notifications. They all land in Mailpit and none of them reach a real inbox.
Share it publicly
A Cloudflare quick tunnel puts a local site on a public URL, outbound-only, with the URL rewriting WordPress needs. It dies when you quit — a share you forgot about is one you did not consent to.
The rex CLI
Over 40 commands driving the running app over a private socket: site lifecycle, logs with --follow, PHP and Xdebug switches, database export and import, and rex doctor.
Migrate from Valet or Herd
Scan, review, import sites, copy databases, optionally rewrite connection config with a diff and a backup first. Reversible throughout, and the source stays strictly read-only.
Honest status
Every dot is derived from a probe.
Not from what the app asked for, and not from a port that happens to be listening. A service is running when rexenv owns the process and the process answers — anything less shows as unknown rather than as green.
That rule is one of about a dozen the interface follows, each written down because a screen once lied to somebody.
Read the honest-UI rules →- Edge proxycaddy · :80, :443running
- Web servernginx · :18088running
- PHP 8.4php-fpm · :9784running
- MySQL 8.4mysqld · :13306running
- PostgreSQLneeds macOS 26warning
- Redisnot startedstopped
The pinned stack
Every version, written down.
Nothing here is "latest". Every binary is pinned to an exact version and locked to a checksum, downloaded on demand from its own upstream and prepared for macOS. You can read what you are about to run before you run it.
PHP
Seven versions. Switch a site between them in one click — no rebuild of docroot, certificate or database.
| PHP | 8.5.8 · 8.4.23 · 8.3.31 · 8.2.31 · 8.1.34Per-site switch, per-version php.ini editor | Xdebug 3.5.3 |
|---|---|---|
| PHP 8.0 | 8.0.30Past its php.net security-end date, and the app badges it as such | EOL · no Xdebug |
| PHP 7.4 | 7.4.33rexenv's own reproducible build — static-php.dev publishes no 7.4 | EOL · no Xdebug |
Web servers
One shared Nginx serves every site by default. Override per site when a project needs something else.
| Nginx | 1.30.3Shared, one server block per site | Default |
|---|---|---|
| FrankenPHP | 1.12.4Per-site override; embeds its own PHP | |
| Apache httpd | 2.4.68Per-site override with working .htaccess | |
| Caddy | 2.11.4The edge — TLS termination on :80 and :443 |
Databases
Chosen per site at create time. Each engine keeps a separate data directory per version series, so switching is never an in-place upgrade.
| MySQL | 8.4.6 · 8.0.44 | :13306 |
|---|---|---|
| MariaDB | 12.3.2 · 11.4.1211.4 is the LTS series | :13307 |
| PostgreSQL | 18.4.0 · 17.10.0 · 16.14.0 | macOS 26+:15432 |
| Redis | 8.8.0 | :16379 |
Tools
Bundled, pinned, and checksum-locked like everything else.
| WP-CLI | 2.12.0Powers the WordPress manager and `rex wp` | |
|---|---|---|
| Composer | 2.10.2Always run through the site's own PHP | |
| Adminer | 5.4.2Deep-linked into the site's database | |
| Mailpit | 1.30.3Catches every outgoing mail | :11025 / 18025 |
| cloudflared | 2026.6.1Quick tunnels, outbound-only | |
| Xdebug | 3.5.3PHP 8.1–8.5 only; your IDE listens on 9003 |
Ports are offset from the usual defaults on purpose, so rexenv never collides with a server you already run.
Honest UI
Rules the interface follows, written down.
- Status derives from reality — never from what we asked for.
- Progress moves only on real completions. Failure freezes the bar — it never rolls back.
- A counter that cannot advance is not shown at all.
- A control whose only outcome is an error is not rendered.
Each one exists because a screen lied to somebody once. They are the reason rexenv sometimes shows you less than another tool would.
Read all of them →Before you install
The things worth knowing first.
- macOS
15 (Sequoia) or later
A hard floor. The pinned nginx and cloudflared builds will not launch below it. Intel or Apple Silicon — one universal build. Read the requirements
- First run
Internet required, up to ~600MB
rexenv downloads its components on demand rather than bundling them, checksum-verified. After that it works offline. What gets downloaded
- Permissions
Three prompts, once
An admin password for the DNS resolver, a Keychain prompt to trust a local CA that signs only your sites, and an admin password to bind ports 80 and 443. What each prompt writes
- PostgreSQL
Needs macOS 26
The one exception to the floor above, and an upstream constraint rather than a choice. Everything else runs on macOS 15. PostgreSQL details
- Uninstalling
One in-app step first
Settings → Remove system changes, then delete the app. Dragging it to the Bin leaves a root daemon holding port 443. How to uninstall
Your whole stack, in about a minute.
Free, native, and no Docker. macOS today; Windows and Linux are stubs waiting to be filled in, not an afterthought.
brew tap rexenv/tap
brew trust rexenv/tap
brew install --cask rexenv