flightdeck 0.5.0
First release.
Added
- Mountable Rails engine (
mount Flightdeck::Engine => "/flightdeck") with no
migrations and no asset pipeline requirements. - Overview: six stat tiles (24h throughput with prior-window delta, failures
with failure rate, ready, scheduled with next-due countdown, in progress with
worker capacity, oldest ready age), throughput and time-to-completion charts
with 1H/24H/7D ranges, queue mini-table with sparklines, recent failures, and
a fleet health strip. - Jobs: state tabs (all, ready, scheduled, in progress, blocked, finished,
failed) with counts, class and queue filters, prefix search, and keyset
pagination. - Job detail: error with app-frame-highlighted backtrace, pretty-printed raw
arguments (never ActiveJob-deserialized), metadata and a derived lifecycle
timeline. - Failed jobs: grouped by exception class, row selection, and retry/discard
for one job, the selected jobs, or everything matching the current filter —
capped, deadlined and committed per batch. - Queues: depth, latency, hourly rate and sparkline per queue, with
pause/resume. - Processes: supervisor-grouped fleet with heartbeat freshness, a
dead-process banner, and guarded pruning. - Recurring tasks: cron with a human-readable schedule, last and next run,
last-run status, and run-now. - Server-rendered SVG charts with no JavaScript charting library, coloured
entirely from CSS custom properties. - Light and dark themes from
prefers-color-schemewith a persisted override. - Live polling via Turbo Frames with a topbar LIVE switch, visibility-aware
pausing, focused-input pausing and ±10% jitter. - API-only host support via engine-local cookie, session and flash middleware.
- Authentication required in every environment: HTTP Basic from configuration,
ENVor Rails credentials, or inheritance from the host's own base
controller. - Precompiled, digest-named CSS and JS with embedded fonts, served from a
manifest whitelist with immutable caching.
Security
- The dashboard returns 401 by default in every environment, including
development, until authentication is configured. - Credentials are compared with
ActiveSupport::SecurityUtils.secure_compare
and read per request rather than memoized at boot. - Assets are served only by exact match against the built manifest, so a request
can never name a file that was not built.