You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Breaking Changes
TriggerProtocol split — custom triggers must now implement both first_run_time(current_time) and next_run_time(previous_run, current_time) instead of a single method. Triggers are now stateless. (#452)
/api/healthz removed — update Docker Compose health checks from /api/healthz to /api/health, which returns structured JSON and 503 for non-ok status. (#448)
Scheduler enforces job name uniqueness — duplicate job names per instance raise ValueError. Pass if_exists="skip" for idempotent registration. (#297)
once=True + rate limiting raises ValueError — combining once=True with debounce or throttle is no longer silently accepted. Remove the rate-limiting parameter from affected listeners. (#430)
Web UI
Complete rebuild as a Preact SPA with 5 pages: Dashboard, Apps, App Detail, Sessions, Logs (#343)
Graphite + Emerald design token system with light/dark mode toggle and [data-theme] persistence (#343, #442)
Session list page with status badges, "This Session" / "All Time" scope toggle, and localStorage persistence (#464)
Source location display in handler/job detail panels and log table (#464, #410)
Handler/job drill-down with invocation history, plain-language handler summaries, and error feed with exception type names (#343, #411)
Dashboard app cards show invocation/execution counts, error rate percentage, instance count badge, and multi-instance telemetry aggregation (#392, #410, #411, #448)
Multi-column sort on log table with live-streaming auto-pause and click-to-expand messages (#411, #381)
Self-hosted fonts (DM Sans, JetBrains Mono, Space Grotesk) — no external CDN requests (#442)
Real-time log streaming via WebSocket with server-side level filtering and deduplication (#409)
WebSocket reconnection automatically refreshes all REST-fetched data without page reload (#379)
Status bar "DB degraded" indicator with exponential backoff polling (#448)
Database & Telemetry
Persistent SQLite telemetry storage for sessions, handler invocations, and job executions with automatic schema migrations (#305, #329)
Configurable retention (db_retention_days) and size limit (db_max_size_mb, default 500 MB) with automatic oldest-record deletion (#464)
Telemetry status endpoint (/api/telemetry/status) returns 503 when degraded, usable by Docker HEALTHCHECK (#448)
/api/health returns 503 for non-ok system status while preserving structured JSON (#448)
Bus & Scheduler
Rate limiter redesign: throttle no longer blocks concurrent dispatch, debounced handlers produce accurate telemetry, once=True listeners cannot double-fire under rapid events (#430)
Zero or negative debounce and throttle values rejected with ValueError at registration (#430)
if_exists parameter on all Scheduler.run_* methods — "error" (default) or "skip" for idempotent registration (#297)
IntervalTrigger rejects zero/negative intervals with ValueError at construction (#452)
Logging
Per-service log level tuning via 13 dedicated *_log_level config fields (e.g., api_log_level, bus_service_log_level) — no service falls through to global default (#463)
Configuration
total_shutdown_timeout_seconds — caps total shutdown wall-clock time (default: 30s) (#453)