If you've ever tried to set up a proper PHP development environment on Windows, you know the pain. You need Docker running, Nginx configured, SSL certificates that don't throw browser warnings, your hosts file edited with admin rights, and oh — you need to do all of that again for every PHP version your projects need.
I got tired of it. So I built WSDD (WebStack Deployer for Docker).
What is WSDD?
WSDD is a Windows desktop application that automates the entire setup and day-to-day management of a local PHP + Docker development stack. You open the app, add a project, pick a PHP version — and it handles everything else.
No terminal gymnastics. No manual docker-compose editing. No hosts file headaches.
The stack it deploys
Every WSDD installation manages:
Nginx reverse proxy — handles routing to all your local domains
MySQL 8 — shared across all projects
phpMyAdmin — pre-configured and accessible immediately
PHP containers per version — 5.6, 7.2, 7.4, 8.1, 8.2, 8.3, and 8.4, each with Apache + Xdebug
Each active PHP version automatically gets three local URLs:
URLPurposephp{version}.wsdd.dockMain PHP environmentcron{version}.wsdd.dockCron job managerwm{version}.wsdd.dockWebmin admin panel
And every project domain gets its own MKCert SSL certificate — no more browser security warnings on localhost.
Why I rewrote it in Rust
The original version of WSDD was a combination of PHP scripts and PowerShell. It worked, but distributing it was a nightmare — users needed the right PHP version installed just to run the installer, and async process management was fragile.
I wanted:
✅ A single .exe with zero runtime dependencies
✅ Real async process management for long-running Docker calls
✅ A native GUI that doesn't feel like a wrapped web app
✅ Something I'd enjoy building
Rust checked every box.
The interesting technical parts
GUI with egui
I went with egui and eframe for the interface. It's an immediate-mode GUI — no retained widget state, no callbacks, just a render function that runs every frame. Coming from web development this felt strange at first, but it turned out to be a great fit for an app that constantly polls Docker subprocess status.
Async with tokio
Docker operations — pulling images, starting containers, waiting for health checks — can take a while. Managing these as async tasks with tokio keeps the UI responsive while heavy operations run in the background.
Bootstrapping dependencies
One of the trickiest parts was handling first-run setup. If Docker Desktop isn't installed, WSDD installs it via Chocolatey. If Chocolatey isn't installed, WSDD installs that first. If WSL 2 isn't configured, WSDD handles that too — and gracefully handles the required system restart, picking up where it left off.
This chain of dependency bootstrapping was genuinely fun to model in Rust — a series of async checks and installs, each with its own error states and recovery paths.
Current status
Version 1.0.0-rc.1 — core workflow is stable. I'm looking for feedback and contributors, especially people with experience in:
egui / eframe UI patterns and best practices
Windows process and privilege management in Rust
Docker, Nginx, or PHP stack internals
Try it out
🔗 GitHub: https://github.com/wnunezc/wsdd-rust
If you're a PHP developer who has suffered through Windows dev environment setup, I hope this saves you some time. And if you're a Rustacean curious about egui + tokio for desktop apps, the source is all there to explore.
Feedback welcome — especially on the Rust architecture. 🦀
Top comments (0)