v0.25.0

thevoiceguy/siphon-aiv0.25.0Jul 8, 2026by github-actions[bot]

Upgrading?

AI Summary

Adds object storage upload (S3-compatible), AWS KMS integration for encryption keys, and Ogg-Opus recording format support.

Key Highlights

  • S3-compatible object storage upload with spooling and retry logic.
  • AWS KMS integration for envelope encryption keys (no AWS SDK).
  • Ogg-Opus recording format added (~10x smaller than WAV).
  • New lifecycle webhook `recording_uploaded`.

New Features

  • S3-compatible object storage upload
  • AWS KMS encryption integration
  • Ogg-Opus recording format

Full Release Notes

### Added

- **Object-storage upload — `[recording.storage]`** (P1 "Recording
  compliance & storage", second release). Finalized recordings upload to
  any S3-compatible bucket (AWS, MinIO, Cloudflare R2, Backblaze B2 —
  path-style, hand-rolled SigV4, **no AWS SDK**). Durable by design: a
  small job file lands in `spool_dir` at call teardown (atomic, survives
  restarts) and a background worker uploads with retries; a job that keeps
  failing is dropped with a metric rather than wedging the spool, and the
  local file is deleted only after a durable upload (opt-in
  `delete_local_after_upload`). `key_template` names objects with
  `{call_id}` / `{date}` / `{route}` / `{direction}`. The CDR gains an
  additive `recording_url` (`s3://bucket/key`, stamped at enqueue) and a
  new **`recording_uploaded`** lifecycle webhook (after `call_end`)
  confirms arrival with `size_bytes`. New metrics:
  `siphon_ai_recording_uploads_total{result}`,
  `siphon_ai_recording_upload_spool_depth`,
  `siphon_ai_recording_upload_seconds`. Retention/TTL stays the bucket
  lifecycle policy's job (worked recipe in `docs/RECORDING.md` §9). Pair
  with `[recording.encryption]` so the bucket only ever holds ciphertext.
  **Off by default.**
- **AWS KMS as the recording KEK — `[recording.encryption.kms]`**. The KMS
  hook the 0.24.0 envelope design reserved: each recording's data key is
  wrapped by KMS `Encrypt` (the KEK never exists outside KMS; every unwrap
  is IAM-auditable), on the same SigV4 client — still no AWS SDK. Exactly
  one of `kek` / `kms`; `endpoint` override supports KMS-compatible
  emulators. `siphon-ai decrypt-recording` gains `--kms-region` /
  `--kms-endpoint` (credentials via `AWS_ACCESS_KEY_ID` /
  `AWS_SECRET_ACCESS_KEY`); symmetric-KMS blobs name their own key, so no
  key ARN is needed to decrypt. **Off by default.**
- **Ogg-Opus recording format — `[recording].format = "opus"`**. ~10×
  smaller than WAV for voice, encoded with the same libopus the media path
  already uses and playable by ffmpeg/VLC/browsers. Streaming-native
  (RFC 7845), so nothing needs a finalize back-patch — including inside an
  encrypted envelope. Extensions: `.opus` plaintext, `.opusa` sealed.
  Adds the `ogg` crate (the theme's one new small dependency). **Default
  stays WAV.**

---

**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.25.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