# Changelog ## 0.2.0 — 2026-02-15 ### Features - **Manual build switching**: `witryna switch ` command for instant rollback to any previous build via atomic symlink swap - **Manual cleanup**: `witryna cleanup [site] [--keep N]` subcommand for pruning old builds and logs - **Persistent build state**: `state.json` as single source of truth for build status, timestamps, and git commit hash - **Active build marker**: `witryna status` shows `+` next to sites with builds in progress - **Hook build status**: `WITRYNA_BUILD_STATUS` environment variable (`"success"` or `"failed"`) passed to post-deploy hooks ### Breaking Changes - **Post-deploy hooks now run on all builds.** Previously hooks only ran after successful builds. They now also run after build failures, with the new `WITRYNA_BUILD_STATUS` environment variable set to `"success"` or `"failed"`. Update existing hooks to check `WITRYNA_BUILD_STATUS` if they should only run on success (e.g. web server reload scripts). - **Removed built-in rate limiting.** The `rate_limit_per_minute` and `trust_proxy` configuration options have been removed. Rate limiting is now delegated to the reverse proxy (Caddy, nginx). See `examples/caddy/Caddyfile` and `examples/nginx/witryna.conf` for configuration examples. - **Dependency overhaul.** HTTP server replaced (`axum` → `tiny_http`), CLI parser replaced (`clap` → `argh`), logging replaced (`tracing` → `log`). Configuration format is unchanged but the binary is significantly smaller and has fewer transitive dependencies (192 → 139 crates, −28%). ### Internal - Replace `tracing` with `log` + custom `Logger` for smaller binary - `Box::pin` large futures to reduce async stack usage - Centralized version management via `Cargo.toml` - Drop `chrono`, `dashmap`, `tokio-util`, `subtle` dependencies - MSRV set to Rust 1.85 ### Packaging - **Nix flake** with NixOS module and VM integration test - **Arch Linux PKGBUILD** with packaging scripts - Add `git` and `git-lfs` to deb/rpm package dependencies - New integration tests for `validate` and `cleanup` CLI commands ## 0.1.0 — 2026-02-10 Initial release. Witryna is a minimalist Git-based static site deployment orchestrator. It listens for webhook triggers, pulls Git repositories, runs containerized build commands, and publishes static assets via atomic symlink switching. ### Features - **HTTP webhook server** (tiny_http) with bearer token auth and JSON error responses - **Git integration**: clone, fetch, shallow/full depth, automatic submodule initialization, LFS support - **Containerized builds** via Podman or Docker with security hardening (`--cap-drop=ALL`, `--network=bridge` default, resource limits) - **Atomic publishing** via timestamped directories and symlink switching - **Post-deploy hooks** with environment variables (`WITRYNA_SITE`, `WITRYNA_BUILD_DIR`, `WITRYNA_PUBLIC_DIR`, `WITRYNA_BUILD_TIMESTAMP`) - **SIGHUP hot-reload** for adding/removing/reconfiguring sites without restart - **Periodic polling** with configurable intervals and new-commit detection - **Build queue** (depth-1, latest-wins) for concurrent webhook requests - **Per-site environment variables** passed to builds and hooks - **Build config overrides** in `witryna.toml` (image, command, public) - **Container working directory** (`container_workdir`) for monorepo support - **Cache volumes** for persistent build caches across deploys - **Old build cleanup** with configurable retention (`max_builds_to_keep`) - **Build and git timeouts** with configurable durations ### CLI - `witryna serve` — start the deployment server - `witryna validate` — validate config and print summary - `witryna run ` — one-off synchronous build with `--verbose` - `witryna status` — deployment status with `--json` and `--site` ### Packaging - Debian/Ubuntu `.deb` and Fedora/RHEL `.rpm` packages with systemd service, man pages, and example configurations - Automatic container runtime detection in postinst (Docker group + systemd override, or Podman subuids + lingering + override) - Static binary tarball for manual installs - Example reverse proxy configs for Caddy and nginx