1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
# Changelog
## 0.2.0 — 2026-02-15
### Features
- **Manual build switching**: `witryna switch <site> <build>` 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 <site>` — 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
|