Per-version entries below. v0.1.0's initial feature set is grouped by area rather than as a flat commit list.
v0.2.2 — 2026-08-04
Release notes and downloads on GitHub. New manifest features from real dogfooding, plus a proper activate/deactivate pair for projects.
Added
[project].env_files — extra .env paths loaded alongside the root .env. stack load-env now falls back to the root .env plus any declared env_files when no path is given, instead of hard-failing when .env isn't at the project root.
[language.*].venv — a project's virtualenv directory, folded into the existing ambient stack activate PATH-building. No more .venv\Scripts\activate step — just cd in. stack doctor --project reports whether it exists.
[script.<name>] + stack run <name> — named, project-scoped commands (migrations, tests, seed scripts, ...), run in the foreground. Commands can be a multi-line string or a TOML array, split into sequential steps that stop at the first failure with its exit code. Trailing args forward to the last step (stack run test -- -k foo); stack run alone lists what's declared. Gets its own lazy trust-on-first-use, checked only when a script actually runs.
Changed
stack deactivate now also suppresses the current directory's project activation (PATH, prompt indicator), not just an explicitly-activated profile — previously the only way to turn it off was to leave the directory. It stays suppressed while you're inside that project and clears itself automatically once you actually leave.
stack activate with no shell argument is a new explicit command that reactivates a suppressed project without leaving its directory — the counterpart to stack deactivate.
v0.2.1 — 2026-08-04
Release notes and downloads on GitHub. Follow-up to v0.2.0, fixing three real bugs in stack setup --default-profile.
Fixed
stack deactivate was a silent no-op whenever a default profile was configured — the per-prompt shell hook re-seeded the activation on the very next prompt. Removed entirely by the PATH change below.
- The
[stack] prompt indicator lit up for any profile-provided PATH, not just being inside a project. It's back to reflecting project activation only.
- Explicit
stack profile <name> activation silently skipped a profile's [tool.*] entries on PATH, even though stack exec and the default-profile mechanism both included them.
- Editing, adding to, or removing from a profile that's the current default no longer leaves the persistent PATH stale — it refreshes automatically.
Changed
stack setup --default-profile <name> now writes the profile's resolved pins directly into the persistent Windows user PATH (via the registry) instead of a per-prompt shell variable. A brand-new process — interactive or not, stack-aware or not — now finds its languages/tools with no shell hook involved. Already-open terminals/IDEs still need a restart to see it, same as installing anything else that touches PATH.
Added
stack profile add <name> <language|tool> <entry> [version] / stack profile remove <name> <language|tool> <entry> — structured modification of a saved profile, mirroring stack add/stack remove on stack.toml.
v0.2.0 — 2026-08-03
Release notes and downloads on GitHub. The largest feature surface shipped so far — first minor version bump.
Added
stack profile — named, persisted sets of language/tool version pins usable from any directory, not just inside a stack-managed project. The wizard walks through the same language-picking flow as stack new, then lets you activate it in the current shell, save it under a name, or both.
stack profile <name> activates a saved profile in the current shell; stack profile <name> --exec "<command>" resolves its pins (installing anything missing) and runs a one-off command with them on PATH, then exits — nothing persists.
stack profile list/describe <name>/edit <name>/rm <name> — manage saved profiles.
stack deactivate — clears an explicitly-activated profile. A project's own cd-based activation is unaffected.
stack which [name] — shows exactly what stack would resolve a language/tool to right now, and why (current project, active profile, or the reserved default-named profile as a fallback).
stack exec --with php@8.3.1,node@20 -- <command> — ephemeral ad hoc version pins with no named profile at all.
stack setup --default-profile <name> — ambiently auto-activates a profile in every new terminal.
stack prune now also scans saved profiles, so a profile's pinned languages are never mistaken for orphaned installs.
v0.1.26 — 2026-07-31
Release notes and downloads on GitHub. Bundles what would otherwise have been 11 separate patch releases into one.
Added
stack init — scaffolds a manifest for an existing project, pre-filled from composer.json/package.json/pyproject.toml instead of typing every language/version from memory.
stack restart [name] [--all] [--yes] and name-addressable stack up <name> — start/restart a project from anywhere, not just from inside it.
stack describe [name] — prints a project's resolved environment (binary paths, php.ini, log location, routed domain/port) whether it's up or down.
stack doctor --project — validates a manifest against live reality (ports, service paths, placeholders) before stack up runs, instead of failing one error at a time partway through.
stack clean — removes cached composer.phar downloads.
- Trust-on-first-use — the first
stack up on a project, or the first run after its [run]/[service.*] commands change, asks for confirmation before executing anything. --yes bypasses this for CI/scripted use.
- Automatic local HTTPS —
https://project.localhost now works with no browser warning, via Caddy's own internal CA. Plain http:// keeps working unchanged.
.env auto-loading on stack up/stack doctor --project — no more forgetting the separate stack load-env step.
- Fresh PHP installs are now configured automatically: commonly-needed extensions, OPcache, and dev-friendly
ini defaults, instead of shipping vanilla, mostly-disabled defaults.
- docs/why.html and docs/custom-domains.html — new docs pages.
Fixed
[[clone]] silently no-op'd on every stack up (its default path always pointed at a directory that trivially already existed). Now gated behind an explicit --clone flag, defaults to git's own folder-naming convention.
stack new/stack init's language/service selection used a yes/no loop where an accidental "yes" meant restarting the whole wizard. Replaced with checkboxes — nothing commits until you confirm.
- CLI output had no color coding or visual separation between phases of a
stack up run. stack up/stack doctor output is now color-coded, with blank-line phase breaks.
- The docs site was not usable on mobile: a nav bar with no breakpoint, a terminal block that overflowed the page, and a sidebar with no way to collapse it. Manifest and CLI reference docs had also drifted out of sync with actual shipped behavior — both rewritten against the current source.
v0.1.15 — 2026-07-30
Release notes and downloads on GitHub.
Fixed
- Tool installs (Caddy, uv) could fail during
stack setup/the first stack up with failed to run Expand-Archive on machines where PowerShell's Expand-Archive cmdlet wasn't usable (older PowerShell, execution-policy restrictions, etc.). Zip extraction is now handled entirely in-process via a pure-Rust implementation, with no external PowerShell process involved.
stack setup could fail outright with failed to ask PowerShell for $PROFILE: program not found, silently skipping the shell hook, on machines where neither pwsh nor powershell could be spawned as a subprocess. The profile path is now computed directly — it's a documented, static Windows known-folder location — instead of asking a spawned shell process for it, and it correctly follows Documents-folder redirection (e.g. OneDrive).
stack setup previously assumed pwsh by default. It now detects which shell (pwsh, powershell, or cmd) actually launched it, so the hook is written into the profile you actually use.
v0.1.13 — 2026-07-28
Release notes and downloads on GitHub.
Fixed
- Static assets (CSS, JS, fonts, images) on PHP projects using the v0.1.12 FastCGI default were being routed through
php-cgi instead of served directly, coming back with the wrong Content-Type — browsers silently accept that for scripts but strictly refuse it for stylesheets, so any project relying on Caddy to serve its own static files (plain PHP, WordPress, phpMyAdmin) rendered completely unstyled. The FastCGI route now only proxies *.php requests and serves everything else directly, matching Caddy's own documented expansion of its php_fastcgi directive.
v0.1.12 — 2026-07-28
Release notes and downloads on GitHub.
Added
- Real concurrent PHP execution.
php -S can only handle one request at a time — a large database import, several browser tabs, or a frontend firing concurrent API calls all serialize and stall each other. A [run] block on a project with [language.php] declared and no explicit command now defaults to php-cgi.exe running real worker processes, fronted by Caddy's FastCGI transport — genuinely parallel request handling. No new manifest field: write nothing and this is the default; an explicit command is respected exactly as before. The doc root is auto-detected (public/index.php present means Laravel/Symfony-style; otherwise the project root).
v0.1.11 — 2026-07-27
Release notes and downloads on GitHub.
Fixed
stack down had no middle ground between stopping just a project's own [run] process and --all (every running project on the machine). Plain stack down now also stops any service the project declared — but only once no other currently running project still needs it, checked live at the moment you run it. If another project still depends on it, it's left running with a message naming which one.
v0.1.10 — 2026-07-27
Release notes and downloads on GitHub.
Changed
- Internal: split the single 1300+ line command file into
core/commands/{lifecycle, scaffold, registry_commands, shell_integration}.rs, grouped along the structure already implicit in the CLI. Pure refactor — nothing about how stack behaves changes in this version.
v0.1.9 — 2026-07-27
Release notes and downloads on GitHub.
Fixed
stack up printed languages/services using Rust's raw debug array format (languages: ["python"]) instead of readable text — now a plain comma-joined list, or (none) when empty.
- A failed language install left a raw Lua plugin-hook traceback with no indication of how to find a valid version — now points at
vfox search <plugin>.
v0.1.8 — 2026-07-26
Release notes and downloads on GitHub.
Fixed
- A
[language.*] pinned to a loose version (e.g. php = "8.4", node = "24.18") could fail to resolve even right after a clean, successful install — vfox install php@8.4 would succeed and install the concrete 8.4.0-nts build, but the follow-up lookup queried vfox with the original loose string, which was never itself an installed key. Broke both stack up and the ambient per-prompt stack activate for any language pinned this way, cascading into [run].command failing with "program not found". Now falls back to matching vfox's actually-installed versions as a prefix of the requested version when the exact key isn't found.
v0.1.7 — 2026-07-26
Release notes and downloads on GitHub.
Fixed
- A registered service/tool whose path contains backslashes (the normal case on Windows) failed to start with a bogus "program not found" error. The path was fine —
stack was tokenizing the resolved command with a POSIX-style shell parser that treats backslash as an escape character, silently corrupting the path first. Affected any registered service with a backslash path, not just one engine.
Added
stack unregister <kind> <name> <version> — removes a single entry from the global registry directly. Previously the only options were stack register (add) and stack prune (bulk-remove only entries orphaned across every tracked project).
v0.1.6 — 2026-07-26
Release notes and downloads on GitHub.
Added
port fields in [service.*] and [run] now accept a quoted "{VAR}" placeholder (e.g. port = "{MEILISEARCH_PORT}"), resolved the same way command placeholders already are (environment, then an interactive prompt with --prompt). Previously only a literal number was valid — quoting a placeholder there failed with a raw TOML type error before stack's own resolution logic ever ran.
v0.1.5 — 2026-07-26
Release notes and downloads on GitHub.
Fixed
- Every CLI command and argument now has real help text.
stack --help and stack <command> --help previously showed blank descriptions for every command, argument, and flag — the doc comments existed in the source but had never actually been committed, so no prior release shipped them.
v0.1.4 — 2026-07-26
Release notes and downloads on GitHub.
Fixed
stack doctor/stack setup no longer reinstall Caddy on every run. The check only tested bare PATH, not the pinned-tools-store fallback stack up already resolves Caddy through — so every run re-downloaded and re-extracted the ~49MB zip and printed warning: one or more checks failed, even when Caddy was already correctly installed.
v0.1.3 — 2026-07-26
Release notes and downloads on GitHub.
Fixed
stack setup's printed tip line referenced an internal planning document that was never part of this repository. Removed — the tip is now just the Acrylic DNS Proxy suggestion.
Added
CLA.md plus a CLA Assistant GitHub Action, and CONTRIBUTING.md — a clear path for outside contributions.
v0.1.1 – v0.1.2 — 2026-07-26
Docs/metadata-only republishes — no source changes. v0.1.2 release notes · v0.1.1.
Fixed
- README's installer command, stale since v0.1.0 (hardcoded to that version's asset URL) — switched to GitHub's
releases/latest/download/ redirect so it doesn't need a manual bump on every future release.
- Removed a README parenthetical describing a temporary docs-hosting arrangement that had no business being permanent public record.
v0.1.0 — 2026-07-26
First tagged release. Release notes and downloads on GitHub · crates.io.
Core orchestration
- Manifest-driven
stack up/stack down: clone-if-missing, language activation, service start/reuse, dev-server spawn, domain routing — in that order.
- Services dedup by
engine@version — every project referencing the same database version shares the one running instance, isolated by schema.
[run].external — run your own dev server yourself, in your own terminal, exactly how you already would; stack only routes to it.
[service.*].external — adopt a database you already have running instead of colliding with it or starting a duplicate.
- Detached process spawn that survives the launching terminal closing, with output captured to a per-process log file.