v0.18.0

thevoiceguy/siphon-aiv0.18.0Jun 26, 2026by github-actions[bot]

Upgrading?

AI Summary

The release enhances security by enabling HTTPS for the admin listener and introduces new variable expansion capabilities allowing secrets to be resolved from files or systemd credentials.

Key Highlights

  • Admin listener TLS/HTTPS support
  • Secret resolution from files (`${file:...}`)
  • Secret resolution from systemd credentials (`${cred:...}`)
  • Hot-reloadable TLS certificates on SIGHUP

New Features

  • Admin TLS configuration
  • File-based secret loading
  • Systemd credential loading

Full Release Notes

### Added

- **Admin listener TLS — `[admin.tls]`** (P1 "Security & abuse hardening";
  second chunk of v0.18.0). The authenticated `[admin]` listener can now serve
  **HTTPS** directly, so the bearer token is encrypted on the wire on a
  routable bind without a TLS-terminating proxy. Set `[admin.tls].cert` +
  `.key` (both required when the table is present; missing/empty → fatal at
  load). The cert is loaded at startup (fail-loud) and **hot-reloaded on
  `SIGHUP`** alongside `[sip.tls]` — the next connection picks up the new cert,
  in-flight ones keep theirs, and a broken PEM keeps the previous cert
  (nginx-style). New metric `siphon_ai_admin_tls_reload_attempts_total`
  `{outcome=ok|failed}`. Without `[admin.tls]` a non-loopback bind still works
  but logs a sharpened startup warning (the token travels in the clear). See
  `docs/CONFIG.md` → `[admin.tls]`.

- **Secret resolution from files & systemd credentials** (P1 "Security &
  abuse hardening"; first chunk of v0.18.0). Config `${...}` references can now
  pull a secret from outside the process environment, so plaintext secrets
  needn't sit in env vars (visible in `/proc/<pid>/environ`, dumps, unit
  files). Two new source prefixes, usable anywhere `${VAR}` works:
  `${file:/path/to/secret}` (trimmed file contents — Docker/Kubernetes
  secrets, Vault-Agent templated files) and `${cred:NAME}`
  (`$CREDENTIALS_DIRECTORY/NAME` — systemd `LoadCredential=`). Same fail-loud
  pass as `${VAR}`: a missing file, unset `$CREDENTIALS_DIRECTORY`, or path
  traversal in a credential name fails the load. `${VAR}`/`${VAR:-default}`
  behaviour is unchanged (the `:-` default operator still wins, so
  `${file:-x}` stays an env reference). See `docs/CONFIG.md` → *Secrets &
  variable expansion*.

---

**Artifacts**

- Static musl binaries for `x86_64` and `aarch64` (`.tar.gz`).
- Debian packages (`.deb`) for `amd64` and `arm64` — `apt install ./siphon-ai_*_amd64.deb`.
- `SHA256SUMS` — verify with `sha256sum -c SHA256SUMS`.
- `*-sbom.cdx.json` — CycloneDX SBOM.
- `SHA256SUMS.cosign.bundle` — cosign keyless signature over the checksums.
- Container: `ghcr.io/thevoiceguy/siphon-ai:v0.18.0` (multi-arch, cosign-signed).

Verify the checksums signature:
```
cosign verify-blob --bundle SHA256SUMS.cosign.bundle \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  --certificate-identity-regexp 'release.yml@' SHA256SUMS
```

Related Repositories