agent-local: local WordPress for humans and agents
Measured, not estimated
Same machine, same client, same day
The numbers, side by side.
Create a WordPress sitelower is better
Start a stopped sitelower is better
List your sites from a scriptlower is better
Serve a static assetlower is better
Memory to serve one sitelower is better
Apple M3, macOS, September 2026. One HTTP client for every provider, interleaved samples, medians of thirty for latency and three for lifecycle. DDEV 1.24 on Colima with 4 CPUs and 6 GB; LocalWP 9. Memory is everything one site needs: daemon, database and PHP pool here; app window plus site services for LocalWP; the freshly booted VM for DDEV, not the 5 GB it peaks at while pulling images. Where a result was a tie we say so: fresh-install homepage time was 30 ms here, 29 ms on DDEV. Published as measured.
NO DOCKER.
Native processes on real files. Container tools pay the macOS filesystem tax on every request; agent-local lists your sites in 28 milliseconds and serves PHP in 4.6. After a reboot, everything returns on its own — the database first, then every site that was running.
What is actually running
One engine. Three doors.
- tuithe dashboard: sites, previews, runtimes, doctor
- clione command per action, scriptable
- mcp75 tools over stdio, plus the HTTP API
- frontone listener on 80 and 443, routed by Host
- tlsa certificate per domain, trusted for you
- hosts.test domains resolve with no port suffix
- dbone MariaDB, a schema and user per site
- mailevery outgoing message caught, nothing sent
- fpmits own PHP pool, 7.4 to 8.5, on a unix socket
- filesserved where they already are, no copy
- @/branch previews beside the checkout
- staticstraight from disk, PHP streamed
State is one JSON file, written under a lock and re-read when it changes, so the TUI, the CLI, the daemon and any number of agents act on the same truth at once. Processes carry pid files and are reaped on exit, so restarts never leave an orphan holding a socket.
BUILT FOR AGENTS
Most local tools assume a person is clicking. agent-local exposes the same engine to you and to Claude, Codex, or anything that speaks MCP. Create, import, probe, checkpoint, roll back, read the mail a form just sent. Failed calls name the fix, calls run concurrently, and nothing prompts for a password.
create · import · snapshot · share · mail · previews
- Claude Code
- Codex
- Gemini CLI
- Antigravity
- πpi
- ompOh My Pi
- Z.ai
- Qwen Code
- DeepSeek
- Kimi CLI
- Copilot
- Cursor
- Windsurf
- Grok
- Mistral
What ships in the binary
Captured mail
Every email a site sends lands in a local inbox: password resets, form notifications, receipts. Agents can read it and assert on it.
Automatic snapshots
The database is saved before every destructive operation. A snapshot is a plain .sql.gz, and the one taken before a delete survives it.
Public share links
One command opens a verified public URL through a Cloudflare tunnel. No account needed, and client sites keep their production images.
Branch previews
Any git branch on its own domain beside the running site. Same database, copy-on-write files, ready in about ten seconds.
Per-site PHP versions
Each site runs its own pool, 7.4 through 8.5. Switching installs or repairs the runtime it needs, including releases Homebrew has dropped.
Trusted HTTPS
Every domain gets a certificate issued and trusted in the keychain the moment it is created or renamed. Sites and previews answer on 443 with no warning page.
Streaming imports
A 7 GB LocalWP or DDEV site imports in place with no copy step — DDEV projects move out of Docker entirely. Every stored domain is rewritten, serialized data included.
Production media fallback
Missing uploads redirect to your production origin, honouring the .htaccess rule already in the repo.
WP_DEBUG without the ritual
One flag turns debugging on with the log routed to a file and display kept off. Reproduce, then read the log. An agent does the same in two calls.
Checkpoint, then roll back
Database and files saved together under one name before a risky update — a copy-on-write clone, seconds regardless of size. Rollback puts both back and is itself undoable.
A doctor that fixes
One probe says whether a site is down, fatal, redirecting, blank or slow. Every health check reports the exact command that repairs it, and doctor --fix applies them all.
A live request log
Every request the site serves, as it happens: status, timing, and the PHP errors it logged. Click one for the headers and the file that answered. Pause when you need to read.
Any PHP app
Attach a Joomla, Laravel, Drupal or plain-PHP directory and it gets the same domain, certificate, database and dashboard. WordPress keeps the full toolkit; the rest is told so, plainly.
Compared, honestly
| Capability | agent-local | LocalWP | MAMP | DDEV |
|---|---|---|---|---|
| Runs on | native processes | Electron + services | bundled Apache/MySQL | Docker containers |
| Prerequisites | none, installs what it needs | app download | app download | Docker Desktop / Colima |
| Agent control | 75 MCP tools + HTTP API | none | none | CLI with JSON output |
| New WordPress site | 19 seconds | about a minute | manual setup | fast after first pull |
| Memory for one site | 52 MB | 601 MB | not measured | 2.5 GB |
| Trusted HTTPS | automatic, every domain | a Trust button per site | by hand | mkcert, once |
| Branch previews | own URLs, shared database | none | none | second project by hand |
| Outgoing mail capture | yes, agents can read it | yes | no | Mailpit |
| Database snapshots | automatic | no | no | manual |
| Public share links | verified, no account | account required | no | ngrok / cloudflared |
| Coexists on port 80 | by design | conflicts | conflicts | conflicts |
| Beyond WordPress | any PHP app; WordPress gets the full toolkit | WordPress only | any LAMP app | Drupal, Laravel, TYPO3 |
ONE BINARY.
macOS · Apple Silicon and Intel · MIT licensed