Skip to content

v0.24.0

Choose a tag to compare

@NodeJSmith NodeJSmith released this 04 Apr 03:02
· 680 commits to main since this release
aab51e7

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)
  • Keyboard accessibility: focus-visible indicators, skip-nav link, ARIA roles, keyboard-navigable log table (#442, #390)
  • 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)
  • db_path, db_retention_days, db_max_size_mb — telemetry database location, retention, and size limit (#305, #464)

Bug Fixes

  • Startup race condition: phased startup ensures session exists before handlers fire, eliminating "Dropping N handler invocation record(s)" warnings (#343)
  • CommandExecutor startup crash resolved — registration methods wait for DatabaseService readiness before DB access (#330)
  • SQLite write serialization eliminates OperationalError: cannot commit transaction races at startup (#333)
  • Stale listener/job registrations cleaned up on app restart; telemetry no longer shows removed handlers (#390)
  • Connection status bar no longer flashes "Disconnected" on page refresh (#390)
  • WebSocket hook no longer causes infinite reconnect loop (#379)
  • App start/stop/reload endpoints work in production mode without dev_mode flag (#390)
  • Strip literal quote characters from base_url, fixing Docker Compose connection failures (#298)
  • ServiceWatcher triggers shutdown on max restart failures instead of silently giving up (#301)
  • Scheduler auto-generated job names include trigger info, preventing name collisions (#446)
  • Scheduler job and listener filters return correct results after owner_id/app_key mismatch fix (#335, #336)

Documentation

  • Fixed broken code examples: run_hourly(minute=15) TypeError, invalid api_port field, wrong instance_name key in config snippet (#469, #472)
  • Added parameter tables to all scheduler methods with types, defaults, and cross-references (#469, #472)
  • Corrected data_dir default from ~/.hassette to actual platform-dependent path (#469, #472)
  • Added troubleshooting index page with symptom-based navigation (#469, #472)
  • Added security admonition for unauthenticated web API (#469, #472)
  • Extracted duplicated config file-discovery table into a shared snippet (#469, #472)
  • Simplified getting-started first app to use raw events; added typed-handler forward reference (#469, #472)
  • Removed ghost getting-started/configuration.md page (#469, #472)