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 rexenv

Install

Two ways in. One of them is better.

Terminal
brew tap rexenv/tap
brew trust rexenv/tap
brew install --cask rexenv
brew trust is required, not optional. Current Homebrew refuses to install a cask from a tap it has not been told to trust. Skip that line and the install stops with a refusal that reads like a broken package.
  • 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.

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 →
ServicesExample
  • 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.

PHP8.5.8 · 8.4.23 · 8.3.31 · 8.2.31 · 8.1.34Per-site switch, per-version php.ini editorXdebug 3.5.3
PHP 8.08.0.30Past its php.net security-end date, and the app badges it as suchEOL · no Xdebug
PHP 7.47.4.33rexenv's own reproducible build — static-php.dev publishes no 7.4EOL · no Xdebug

Web servers

One shared Nginx serves every site by default. Override per site when a project needs something else.

Nginx1.30.3Shared, one server block per siteDefault
FrankenPHP1.12.4Per-site override; embeds its own PHP
Apache httpd2.4.68Per-site override with working .htaccess
Caddy2.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.

MySQL8.4.6 · 8.0.44:13306
MariaDB12.3.2 · 11.4.1211.4 is the LTS series:13307
PostgreSQL18.4.0 · 17.10.0 · 16.14.0macOS 26+:15432
Redis8.8.0:16379

Tools

Bundled, pinned, and checksum-locked like everything else.

WP-CLI2.12.0Powers the WordPress manager and `rex wp`
Composer2.10.2Always run through the site's own PHP
Adminer5.4.2Deep-linked into the site's database
Mailpit1.30.3Catches every outgoing mail:11025 / 18025
cloudflared2026.6.1Quick tunnels, outbound-only
Xdebug3.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