Getting Started
stack runs your project's languages, databases, and dev server as plain processes and routes a real local domain to whichever one you're working on — no containers, no idle hypervisor, nothing running you didn't ask for.
1. Install
Available now:
$ irm https://github.com/sanayasfp/stack/releases/latest/download/stackenv-installer.ps1 | iex
$ cargo install stackenv
The crate is published as stackenv (stack was already taken on crates.io by an unrelated project) — it still installs a stack command.
Or grab the zip directly from the latest release and extract it yourself.
winget, Scoop, and Chocolatey packages are coming soon — not published yet.
2. Run stack setup
One command, once. It wires the shell hook into your PowerShell profile (so activation runs on every prompt) and installs the three tools stack delegates to — vfox, uv, and Caddy — at the pinned versions stack is built and tested against.
$ stack setup
added the stack hook for pwsh
checking vfox/uv/caddy...
vfox: OK (1.0.11)
uv: OK (0.11.7)
caddy: OK (2.11.4)
tip: for curl/Postman/non-browser clients to also resolve *.localhost, consider
Acrylic DNS Proxy (optional, one-time, needs admin rights)
Restart your terminal (or reload $PROFILE) once, so the new hook takes effect in the current session.
3. Create a project
Scaffold a manifest
$ stack new acme-api
domain: acme-api.localhost
Add a language? yes
language name (e.g. php, node, python): php
version: 8.3.1
Add a language? no
Add a service? yes
service name (e.g. mysql, postgres, mongo): mysql
version: 8.0.35
Add a service? no
created acme-api\stack.toml
next: cd into it, add a [run] command when you know it, then `stack up`
stack new prompts you through it interactively and writes a commented stack.toml. You can also hand-write one — see the Manifest Reference.
Add how it runs
Open stack.toml and set [run] — the one process that needs a stable URL, usually your app's own dev server:
[run]
command = "php -S 127.0.0.1:{port} -t public"
Bring it up
$ cd acme-api $ stack up Loaded C:\Users\you\acme-api\stack.toml project: acme-api domain: acme-api.localhost languages: ["php"] services: ["mysql"] php: C:\Users\you\.vfox\cache\php\v-8.3.1\...\php.exe -> PHP 8.3.1 (cli) service.mysql: started (pid 41232, port 3306) schema 'acme_api' — automatic creation not yet implemented; create it manually if needed run: php -S 127.0.0.1:52140 -t public (pid 41244, port 52140) log: C:\Users\you\.stack\logs\acme-api.log routed: http://acme-api.localhost -> 127.0.0.1:52140
4. Everyday use
Once stack setup has run, activation is ambient — no daemon to remember to start. cd into any folder with a stack.toml and your pinned php/node/python are already first on PATH, for anything you run by hand: composer install, npm install, a test runner. Leave the folder and PATH resets. You only need stack up for the one process that needs a real routed domain and needs to keep running without a terminal watching it.
When you're done for the day:
$ stack down --all
Stops every project process and every shared service — the actual 0% CPU point, not just the one project you were looking at.
Next
Manifest Reference — every stack.toml field, with defaults. CLI Reference — every subcommand. Examples — four real projects (FastAPI, Node, React, Laravel), each showing a different part of the manifest instead of the same happy path four times.