Changelog
All notable changes to this project will be documented in this file.
v0.7.0 — 2026-04-03
Added
- Env vars now support object syntax with
value,script, andfilemodes filemode reads values from structured files (JSON, YAML, TOML, INI/conf) usingpath | key.pathdot-separated traversalscriptmode runs a shell command and captures stdout as the value- INI/conf parser supports
[section]headers, comments, and quoted values
Changed
Envtype internally usesEnvVarstruct instead of plain strings — YAML unmarshalling is fully backward-compatible (plain strings still work)
v0.6.0 — 2026-04-03
Added
env_filefield on bootstrap steps — services, hooks, and bootstrap now all support dotenv filesdeck run <service> -- <cmd>command — run one-off commands in a service’s environment (dir, env, env_file)- Selective service targeting — all commands (
up,start,stop,restart,status,logs) accept[services...] deck doctorcommand — check deps, bootstrap, and config status without starting anything (supports--json)depends_onandreadyfields on services — dependency-ordered startup with readiness pollingdeck initstack detection — detects Go, Node, Python, Ruby, Rust and generates tailored config with correct package managerrestartfield on services (always,on-failure) — automatic crash recovery duringdeck up
Changed
- Services start in topological order based on
depends_ongraph (cycle detection at config parse time) - Selective targeting auto-expands to include transitive dependencies on start/up/restart
deck stopwith service names stops only those services without running post-stop hooks
v0.5.0 — 2026-04-03
Added
- Per-step
envfield on bootstrap steps, hooks, and services with$(…)shell interpolation - Env values containing
$(…)are evaluated at runtime (not config load time) viash -c - Step-level
envmerges on top of globalenv— step values win on conflict - Shell interpolation runs in the step’s working directory for correct relative path resolution
- Failed
$(…)commands produce an empty string and log a warning; the step continues normally
Changed
- Introduced
config.Envnamed type withMergeandToSlicemethods, replacing rawmap[string]string - Service
envvalues now support$(…)interpolation (previously only literal values)
v0.4.0 — 2026-04-02
Added
--versionflag with ldflags injection at build time and git fallback at runtime
v0.3.0 — 2026-04-02
Added
- Interactive
promptfield on bootstrap steps — reads multi-line input, exposes$DECK_INPUTand$DECK_INPUT_FILE - Non-TTY detection — prompts fail gracefully in CI/pipes instead of blocking
v0.2.0 — 2026-04-02
Added
- Global
envmap — injected into all commands (bootstrap, hooks, services) - Per-service
envandenv_file— load dotenv files and override env vars per service - Per-hook
env_file— load dotenv files for lifecycle hooks dirfield on bootstrap steps and hooks- Log backlog — shows last 20 lines when tailing starts
- ANSI escape code stripping from service log output
Fixed
- Broadened ANSI stripping to cover all CSI sequences (dim, underline, cursor, etc.)
v0.1.0 — 2026-04-02
Initial release.
Added
- Config parsing with
deck.yaml+deck.local.yamldeep merge (order-preserving) StringOrListtype — depstart/stopaccept string or list- Duplicate key rejection in config
- Dependency checker with multi-strategy fallback and polling
- Bootstrap step runner with idempotent check/run pattern
- Lifecycle hooks — pre-start (fail-fast) and post-stop (best-effort)
- Process manager — PID files, process group kill, SIGTERM → SIGKILL, stale PID cleanup
- Startup rollback — stops already-started services if a later service fails
- Log tailing with colored
[name]prefixes and timestamp auto-detection - Status formatters — table, JSON, Go template output
- Status shows all configured services with ports and log paths
- Engine orchestrator wiring the full lifecycle
- CLI commands:
up,start,stop,restart,status,logs,init - Graceful shutdown with 30s timeout, second signal force-exits
- Correct shutdown ordering:
deck upruns post-stop hooks before kill,deck stopkills first - goreleaser with Homebrew cask publishing