PHP development environment for Windows and macOS.
Multiple PHP versions side by side, each project declares its own. No Docker.
Website · Download · Getting started · CLI · Contributing
English | Português
HyPHP is a desktop app with its own orchestrator: several PHP versions serving different
.test domains at the same time, local HTTPS, supervised workers, and an environment
declared in a hyphp.yaml that travels with the project. PHP, Apache or nginx, MySQL or
MariaDB, Mailpit and phpMyAdmin are downloaded, verified and supervised by the app.
| Windows 10/11 x64 | Installer (hyphp-<version>-windows-amd64-setup.exe). It is not digitally signed yet: if SmartScreen warns you, choose More info › Run anyway. |
| macOS 15+ on Apple Silicon | curl -fsSL https://github.com/arismarioneves/hyphp/releases/latest/download/install.sh | sh installs or updates /Applications/HyPHP.app. The dmg on the Releases page works too; macOS blocks the first launch of an app it has not notarized, so allow it once in System Settings › Privacy & Security › Open Anyway. Runtimes come from Homebrew. |
| Tool | Limitation |
|---|---|
| XAMPP | mod_php: one PHP version per installation. No local domains, no local HTTPS, orphan processes after a crash. |
| Laragon | Sound architecture, but closed, with no published source. The PHP version is switched from a menu or a Profile, applies to the whole installation, and is not declared in the project. |
| WampServer | PHP per VirtualHost through FCGI since 3.2.8 (official changelog), but Apache only, and the configuration lives in the installation's menus and files, not in the project. |
| DDEV / Devilbox / Lando | Solid and open source, but they require Docker: 2–4 GB of RAM before the first request. |
HyPHP brings together, on Windows and macOS and without Docker, what the others deliver
separately: several PHP versions serving at the same time, the version declared in the
project itself (hyphp.yaml, committable), Apache or nginx, and supervised workers.
- Real simultaneous multi-version. One pool of workers per PHP version (
php-cgiin FastCGI mode on Windows,php-fpmon macOS) behind a single Apache or nginx. Each project declares its version. - Worker pool. On Windows
php-cgiserves one request at a time; without a pool, one slow request locks up the site. Measured: 2 requests of 3 s took 6.2 s with 1 worker and 3 s with 2. - No orphan processes. On Windows, a Job Object with kill-on-close; on macOS, a process group per service. Processes left behind by a crash are cleaned up at the next start.
- Real status. Every service has a readiness probe; the UI shows
degradedwhen the process is alive but not responding. .testdomains and local HTTPS. Each project answers at<name>.test, with a certificate from a local CA (mkcert) once you install it.wildcard: trueserves*.<name>.testthrough the app's own DNS resolver.- The localhost page explains itself.
http://localhostlists the projects on this machine and, for a host that opens the wrong page, says why (a subdomain withoutwildcard: true, a domain outside.testpointing to this machine). - Config is output, not input.
etc/is generated and validated (httpd -t/nginx -t) before being applied; an invalid config never takes the environment down. - Apache or nginx, MySQL or MariaDB. One of each active at a time, on the same ports, each database with its own data directory. Switching is immediate and rolls back if the new one does not come up.
- Database screen. Credentials, connection command, databases, and phpMyAdmin one click
away.
database:inhyphp.yamlcreates the database if it is missing. - Mail stays local.
php.inipointsmail()to Mailpit; the inbox is inside the app. - php.ini per version. Directives such as
max_input_varsare edited in the app for each PHP version, showing the effective value and where it comes from. - Outgoing HTTPS works on Windows. The PHP builds for Windows ship without CA
certificates; HyPHP keeps a bundle (Mozilla's, plus the local CA) and points
curl.cainfoandopenssl.cafileto it, socurl,file_get_contentsand Composer do not fail with "curl error 60". - Runtimes from official sources. PHP 7.2 to 8.5, Apache, nginx, MySQL, MariaDB, Mailpit, mkcert and phpMyAdmin are downloaded on demand and checked by SHA-256. The package catalog is signed and refreshed from the website every 6 hours, so a link that moved is fixed without a new app version.
- CLI for the terminal and AI agents.
hyphp status,hyphp start all,hyphp logs mysql -f,hyphp ini 8.3 max_input_vars 5000… Every command runs in the open app, with--jsonoutput and meaningful exit codes. See CLI. - Lives in the tray, can start at login (with or without the window), in English or Portuguese, dark or light theme (or the system's).
- Install and open HyPHP (see Download).
- Runtimes: download a PHP version and Apache (nginx, MySQL or MariaDB, Mailpit and phpMyAdmin are optional). On macOS the same screen installs them with Homebrew.
- Projects: add the folder where your projects live. Every subfolder with a
hyphp.yaml, apublic/index.php, anindex.phpor acomposer.jsonbecomes a project at<folder>.test. - Dashboard: the warnings tell what is missing and offer the fix. The actions that need
administrator rights (the
hostsfile and the.testDNS rule, the local certificate) run only when you click them. - Open
http://acme.test. Then commit ahyphp.yamlso the next clone gets the same environment:
name: acme
domain: acme.test # default: <name>.test
wildcard: false # true serves *.acme.test through the local DNS resolver
php: "8.1" # missing = global default version
docroot: public # default: public if it exists, otherwise the root
extensions: [pdo_mysql, intl, zip, gd]
database: acme_dev # created if missing
processes:
queue: php artisan queue:work --tries=3
scheduler: php artisan schedule:workDefault ports: 80 and 443 for the web server, 3306 for the database, 1025 (SMTP) and 8025 (web) for Mailpit, 8036 for phpMyAdmin. All of them can be changed in Settings.
hyphp talks to the open app (on Windows through a named pipe only your user can reach; on
macOS through a socket inside the data root) and runs each command with the same services as
the window: what the CLI does shows up in the UI right away, and the CLI tab lists the
recent calls and who made them. Put it on your PATH from that tab.
hyphp status version, web server, database, services, warnings
hyphp services services and their states
hyphp start [service|all] starts and waits until ready (no argument: everything)
hyphp stop [service|all] stops (no argument: everything)
hyphp restart <service> restarts and waits until ready
hyphp logs <service> [-n 50] [-f] last log lines; -f follows
hyphp projects projects, domain, PHP and folder
hyphp php | php default <series> | php use <project> <series>
hyphp ini <series> [<directive> <value> | <directive> --reset]
hyphp db | db create <name> | db drop <name> --yes | db engine <mysql|mariadb>
hyphp web <apache|nginx> switches the web server
hyphp warnings stack warnings
hyphp app shows the window (opens the app if it is closed)
hyphp version CLI and app versions
hyphp help [command] usage
For scripts and AI agents: every command accepts --json (errors too), and the exit code is
0 ok, 1 app error, 2 wrong usage, 3 app not running.
| Windows 10/11 x64 | macOS 15+ on Apple Silicon | |
|---|---|---|
| Runtimes | downloaded by the app from the official sources | installed by the app with Homebrew (shivammathur/php for PHP) |
| PHP workers | php-cgi pools (there is no php-fpm on Windows) |
php-fpm |
.test domains |
hosts file; wildcard through an NRPT rule |
/etc/resolver/test |
| Data root | next to the executable if writable, otherwise %LOCALAPPDATA%\HyPHP |
~/Library/Application Support/HyPHP |
| Signature | none yet (SmartScreen warning) | ad hoc, not notarized (Gatekeeper warning on the first launch) |
HYPHP_ROOT overrides the data root on both. OS-specific code lives in _windows.go and
_darwin.go files.
| Component | Versions in the catalog | License | Source |
|---|---|---|---|
| PHP | 7.2, 7.4, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5 | PHP License 3.01 | windows.php.net |
| Apache httpd | 2.4 | Apache-2.0 | apachelounge.com |
| nginx | 1.30 | BSD-2-Clause | nginx.org |
| MySQL Community | 8.0, 8.4 | GPL-2.0 | dev.mysql.com |
| MariaDB Server | 10.11, 11.4, 11.8, 12.3 | GPL-2.0 | mariadb.org |
| Mailpit | 1.31 | MIT | github.com/axllent/mailpit |
| mkcert | 1.4 | BSD-3-Clause | github.com/FiloSottile/mkcert |
| phpMyAdmin | 5.2 | GPL-2.0 | phpmyadmin.net |
| CA certificates | Mozilla's bundle | MPL-2.0 | curl.se |
HyPHP does not redistribute these binaries: it downloads them on demand, verifies the
SHA-256 and extracts them into bin/ (on macOS, Homebrew installs them). Any compatible build
placed manually in bin/ is recognized as well. The catalog with the links and hashes lives in
internal/pkgmgr/catalog.json.
Built with Go, Wails v3, React and TypeScript.
The published installer installs into Program Files and asks for UAC once. Silent mode:
hyphp-<version>-windows-amd64-setup.exe /S /D=C:\path # directory of your choiceThe app itself never needs privileges to run: the data root (bin/, etc/, var/, log/)
lives next to the executable if that directory is writable, otherwise in
%LOCALAPPDATA%\HyPHP. A per-user installer (no UAC) can be built from the source
(INSTALL_SCOPE=user, see Development).
The installer ships hyphp.exe and hyphp-helper.exe. The helper performs the actions that
need administrator rights (writing to hosts, installing the local root certificate, the
.test DNS rule, installing an update); each one asks for UAC only when you click it.
Uninstalling removes the installation directory but does not undo what you applied to the
system: remove the hosts block, the .test DNS rule and the autostart entry from
Settings (the Permissions card and the Start with Windows switch) before
uninstalling.
curl -fsSL https://github.com/arismarioneves/hyphp/releases/latest/download/install.sh | sh
curl -fsSL https://github.com/arismarioneves/hyphp/releases/latest/download/uninstall.sh | shinstall.sh checks the dmg's SHA-256 against the release manifest, closes HyPHP if it is
open and only asks for the password when /Applications is not writable. uninstall.sh
closes the app, removes the .test DNS rule, /etc/paths.d/hyphp and the trust in the mkcert
CA (asking for the administrator password), then the autostart entry, the cli folder and
the app. The data (databases, settings, logs) stays unless you confirm in the Terminal or run
uninstall.sh | sh -s -- --apagar-dados. Homebrew, its formulae and the mkcert CA files are
left alone.
The app checks for the newest release one minute after it opens and every 6 hours (can be
turned off in the About tab) and downloads it in the background. The release
manifest is signed with ed25519 (public key in internal/update/key.go) and carries the
installer's SHA-256; the app rejects a manifest or an installer that does not match.
Installation only happens when you click Update and restart: the services stop, the
system asks for permission once (Windows), and the app comes back in the new version. On
macOS the app swaps its own bundle for the one in the new dmg, without a password when
/Applications is writable by your account; otherwise it shows the Terminal command above.
Requires Go 1.26+, Node 22+ and the Wails v3 CLI:
go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0-beta.23
wails3 doctor # checks the environment
wails3 dev # development with hot reload
wails3 build # binary in bin/Packaging:
# Windows: NSIS on PATH (winget install NSIS.NSIS installs into C:\Program Files (x86)\NSIS)
$env:PATH = 'C:\Program Files (x86)\NSIS;' + $env:PATH
wails3 task windows:package # bin/hyphp-amd64-installer.exe
wails3 task windows:package INSTALL_SCOPE=user # user scope, no UAC# macOS
wails3 task darwin:package # bin/HyPHP.app (ad hoc signed, CLI and helper in Contents/Helpers)
wails3 task darwin:package:dmg # bin/HyPHP.dmgProject rules (comments, texts, tests, commits, checks before a pull request) are in
AGENTS.md. The website lives in web/, with its own rules in
web/README.md.
HyPHP is free. If it saves you time, you can support its development:
HyPHP follows the open core model:
- Everything outside
enterprise/is under the MIT License: anyone, individuals or companies, can use, study, modify, share and sell it. enterprise/will hold the paid features, under its own license and subscription-based use. Today it only contains the license: there are no paid features yet.
The name "HyPHP" and its logo are not covered by these licenses: a fork must use another name and logo.
Contributions outside enterprise/ are licensed under the MIT License; contributions to
enterprise/ follow the CLA. See CONTRIBUTING.md. The
components HyPHP downloads (table in Stack) each follow their own license.
