dragonflight/docs/WORK_LOG_2026_05.md
ZGaetano 354731a363 fix(capture): fix DeckLink device name enumeration for SDI port 2+; add per-take project selector on Recorders page
- capture-manager.js, routes/capture.js: fix ffmpeg -sources decklink
  parse regex from v4l2 hex-address format (never matched DeckLink output)
  to correct indented-line format. Port 2+ (index 1+) was falling through
  to a wrong model-name fallback, causing ffmpeg to open the wrong input
  and produce black frames. Now logs the detected device list and the
  selected name at start.

- recorders.js (/start): accept per-take projectId override in request
  body. If provided, clips go to that project instead of the recorder's
  default project_id. Used for both the live-asset INSERT and the
  PROJECT_ID env var passed to the capture container.

- screens-ingest.jsx (RecorderRow): add project dropdown shown when
  recorder is stopped. Defaults to the recorder's configured project;
  operator can change it before hitting Record without editing the
  recorder config.
2026-05-28 22:26:08 +00:00

5 KiB

Work Log — May 2026

Summary

Session focused on auth system architecture, dashboard redesign, and audio track inspector. Multiple iterations on auth approach; settled on simplified local-account model with RBAC. Dashboard rebuilt as control-room status board. Audio tab completed with full metering and fader controls.

Auth System Work

Commits

  • 002e5ac — auth: top-to-bottom rework — local accounts, RBAC + client tag, audit log, env-bootstrap
  • d1f9557 — auth: park login flow — circle back
  • 9726dbb — Revert "auth: top-to-bottom rework..."
  • 4172b0d — rip out entire auth/login flow

What Happened

Attempted comprehensive auth rewrite including:

  • Local user account system with bcrypt hashing
  • Role-based access control (admin/editor/viewer)
  • Client tagging for audit trails
  • Environment-based bootstrap (AUTH_ENABLED flag)
  • Session management with PostgreSQL backing

Decision: Reverted entire auth work. Reason: complexity vs. current product stage. System was over-engineered for self-hosted use case where auth is optional.

Current State: Auth disabled by default (AUTH_ENABLED=false). When enabled, system returns synthetic /auth/me endpoint. No persistent user management yet.

  • cfcbec0 — fix(auth): make AUTH_ENABLED=true workable end-to-end
  • e71c330 — fix(auth): remove manual session.save() — was suppressing Set-Cookie header
  • 65684aa — fix(auth): ensure sessions table exists + log session.save errors

Dashboard Redesign

Commits

  • a48e1d9 — dashboard: rebuild as control-room status board (on air / up next / attention / work)
  • e5e0656 — dashboard: redesign stat cards, compress header, improve density
  • 5de1e3d — dashboard: add dense stat cards, cluster bars, job rows, sparkline fixes
  • 48d54a3 — dashboard: add missing dash-* CSS classes; cluster: add stat-row/stat-card CSS

What Changed

Transformed dashboard from generic metrics view to broadcast control-room interface:

  • On Air section: live stream status, bitrate, duration
  • Up Next section: queued clips/segments
  • Attention section: warnings, errors, resource alerts
  • Work section: active jobs, encoding progress

Added visual components:

  • Dense stat cards with icon + value + trend
  • Cluster health bars (CPU, memory, disk per node)
  • Job progress rows with ETA
  • Sparkline charts for trend visualization

CSS infrastructure added for consistent spacing/sizing across dashboard components.

Audio Tab Implementation

Commit

  • c48c7e6 — feat(audio-tab): full audio track inspector with meters, mute/solo, faders

Features

  • Per-track audio meters (VU-style, real-time)
  • Mute/solo buttons per track
  • Fader controls (0-100 dB range)
  • Master output meter
  • Track naming/labeling
  • Visual feedback for clipping/peaks

Other Work

Storage & Admin

  • 64d739b — feat(admin): unified Storage settings page with mount/bucket health diagnostics
  • a44d8bd — feat(admin): live video-presence indicators on cluster DeckLink ports

Player & Streaming

  • a86c1c7 — fix(player): stitch S3 ranges around RustFS empty-body bug (#143)
  • d257a19 — fix(player): buffer indicator + 416 instead of 500 on out-of-range S3
  • 37247fd — fix(video): direct S3 signed URL for streaming + proxy bitrate 1.5Mbps
  • e4d4c00 — feat(proxy): VBR 500k-1M encoding for proxy generation

Cluster & Hardware

  • 55ff2e7 — feat(cluster): full hardware breakdown per node
  • 5ff507b — fix(node-agent): use nsenter to run nvidia-smi in host mount namespace
  • 558c18e — fix(node-agent): detect GPUs via docker run --gpus all ubuntu:22.04
  • a6f045b — fix(node-agent): probe GPU via Docker API async at startup, cache result

Release & Cleanup

  • 04ce096 — chore: 1.2 ship-prep sweep — close 38 issues
  • f0f6156 — release: add v1.1.0 ZXP artifact (Growing tab + visual system alignment)

Blockers / Open Questions

Auth System

  • Decision needed: Should auth be mandatory for production? Current design assumes optional.
  • API endpoints missing: /users, /auth/me, /groups routes not yet implemented in mam-api
  • Frontend expects: Users list, groups management, role-based UI filtering

Dashboard

  • Real data integration needed (currently mock data)
  • Cluster stats endpoint integration
  • Job queue polling/WebSocket updates

Audio

  • Backend audio processing pipeline not yet connected
  • Metering data source undefined
  • Fader changes need routing to encoder
  1. Clarify auth requirements: Is user management needed for v1.2? If yes, implement /users and /groups endpoints.
  2. Connect dashboard to live data: Wire cluster stats, job queue, stream status to real endpoints.
  3. Audio backend integration: Define audio processing pipeline and metering data flow.
  4. Testing: Add integration tests for auth flow, dashboard data binding, audio control.

Session ended: 2026-05-27 06:31 CDT Status: Work logged, auth decision documented, next steps identified