A Docker-Desktop-style desktop app for Windows that puts the native wsl.exe and
wslc.exe command surface behind one GUI.
The guiding rule of this project: it invents no commands. Every button maps to a
CLI invocation that Microsoft documents (or that the installed wslc binary proves it
supports via --help). When the app cannot do something honestly, it says so rather
than faking it.
Ships as a single compiled Windows executable — Deno + React + WebView2, no runtime dependencies beyond Windows' own WebView2.
| If you want to… | Read |
|---|---|
| Install and launch the app | Installation |
Understand .wslconfig and app settings |
Configuration |
| Build it from source and hack on it | Local development |
- Build and release the executable — CI, tagging, the offline DLL layout.
- Observe a running instance — SSE channels, live stats, capability probes, debugging a stuck UI.
- Run the tests — the 166-test suite, what each file covers, how to add to it.
- Plan and land a change — the bar a change has to clear here.
- Architectural overview — why the server lives in a Worker, what the capability model is for, how a stack becomes a sequence of
wslc runcalls. - Security model — the trust boundaries, the token, the process-execution choke point, and the risks that were accepted rather than closed.
- API endpoints — every
/apiroute, its body, and its status codes. - Data model — wire types, on-disk state, and the
.wslconfigkey catalog. - Environment variables — every variable the app reads or sets.
- Commands & scripts — every
deno task, plus what CI runs. - Dependencies — the full dependency tree and why each one is there.
- Docker & Compose compatibility — the compose subset the app can execute, and exactly what it drops.
Five pages, each backed by real CLI calls:
- Containers — list (running/all), stop, start*, delete*, logs, inspect, exec, prune, and live
wslc stats. - Images — list, pull (explicit verb* or the documented auto-pull fallback), inspect, delete*, prune, plus tag discovery from Docker Hub and OCI v2 registries.
- Resources — distributions (terminate, start, set default/version, resize, sparse, move, export, import, install, unregister), storage (real
ext4.vhdxpaths and sizes read from the registry, container-session disks, swap), WSL platform versions, disk mount/unmount, and volumes*. - Deploy — Quick run (a
wslc runconfigurator with a live command preview) and Stack mode: a compose-subset YAML the app compiles into an orderedwslc runplan, deploys sequentially, and exports as standarddocker-compose.yaml. It also imports docker-compose and Kubernetes manifests, telling you item by item what it could not honour. - Settings — theme, polling cadence, and a guided
.wslconfigeditor with the full documented key catalog, Windows-11-only keys gated on Windows 10, and backup-before-write.
* Capability-gated. container start/rm, explicit pull, image rm, the volume
lifecycle and run --entrypoint are real in the WSL container API but are not documented
CLI verbs. The app enables them only when wslc --help on your host actually lists them.
On a host with no wslc at all, the Containers/Images/Deploy pages show an explicit
"unavailable" state and Resources/Settings stay fully functional.
- Windows 10 build 19041+ (some
.wslconfigkeys are Windows 11 only — annotated in-app). - WSL 2. The container pages need a WSL release that ships
wslc; on hosts without it the app degrades gracefully. - WebView2 runtime (ships with Edge). If it is missing, the app falls back to
--headlessand opens in your browser.
wslc/
├─ app/ # the application (Deno backend + React frontend)
│ ├─ main.ts # exe entrypoint: webview shell + server worker
│ ├─ adapter/ # the ONLY place a child process is spawned
│ ├─ server/ # HTTP server, routes, auth, SSE
│ ├─ stacks/ # compose-subset schema, importer, compiler, runner
│ ├─ system/ # native file/folder dialogs (Win32 FFI)
│ ├─ tray/ # system-tray worker (Win32 FFI)
│ ├─ frontend/ # React 19 + Vite 7 SPA
│ └─ tests/ # 166 unit tests
├─ docs/ # you are here
└─ .github/ # CI workflow + community health files
