Ofelia v0.26.0 — the first release since v0.25.1 (2026-05-16). Net-new, backwards-compatible features plus two intentional breaking changes (one API behavior, one source-only). See the full changelog for the complete, detailed entries.
✨ Added
- Configurable save permissions — new octal keys
save-mode(log/JSON files, default0600) andsave-folder-mode(save folder, default0750). Widen them (e.g.save-mode = 0644) so a non-root operator or shared group can read captured logs; hardened defaults unchanged, and neither key is settable via global Docker labels. (#729) - Pushover device targeting — the bundled
pushoverpreset gains an optionaldevicefield to target specific named devices. (#715) - Durable API state —
--state-file/OFELIA_STATE_FILEpersists API-created/updated jobs and disable flags across daemon restarts (atomic writes,0600, versioned schema, fail-closed loading). (#593) - TTY console sizing —
job-execjobs acceptconsole-height/console-widthfor apps that expect a fixed terminal geometry. (#235) - Graceful container stop —
job-runjobs acceptstop-signalandstop-timeout. (#234) - Docker startup resilience —
[docker] startup-retry-count/startup-retry-intervalretry the initial Docker connection with exponential backoff before exit. (#523) - Healthchecks.io presets — bundled
healthchecksandhealthchecks-selfhostedwebhook presets. (#692)
🔄 Changed
- BREAKING (API behavior):
POST /api/jobs/deletenow returns403 Forbiddenfor jobs sourced from INI/Docker labels (use/api/jobs/disableor edit the source). UI/API-created jobs remain deletable. (#593) WebhookManagercaches*http.ClientperTimeout, preserving keep-alive pools across config reconciles. (#674)
🛡️ Security
- Extended
allow-host-jobs-from-labels=falseto filter host-path mounts (volume=/volumes-from=) onjob-runandjob-service-run, closing a container-to-host privilege-escalation vector. (#462)
🐛 Fixed
- Warn when a local preset file shadows a bundled preset name. (#679)
- Per-instance middleware dedup via an optional
Key()interface (multiple webhooks on one job no longer collapse). (#672) [global] default-user = defaultnow resolves to the container's default user instead of failingdocker exec --user default. (#716)[global]/[docker]unknown-key warnings now suggest the nearest valid key. (#678)RetryExecutorbackoff honors context cancellation, so SIGTERM mid-retry drains promptly. (#687)
🗑️ Removed
- BREAKING (source-only, pre-1.0): removed the unused
core/adapters/docker.ClientConfig.HTTPClientfield. (#684)
📦 Dependencies
- Go toolchain 1.26.3 → 1.26.4;
docker/cli,go-playground/validator,netresearch/go-cron, and the OpenTelemetry stack refreshed. (#720)
👥 Contributors
Thanks to everyone who made this release — code and reports alike:
- Code: @CybotTM, @twiesing
- Reported issues fixed here: @albertotb (#729), @techsolo12 (#692, #670), @FrankyBoy (#593), @twiesing (#716)
All binaries are published with Sigstore signatures and SPDX SBOMs; verify against checksums.txt.