6510871448
fix: implement real upload (XHR + S3 multipart) and fix SDI recorder device_index + manual fallback: modal-new-recorder.jsx
2026-05-22 11:10:01 -04:00
26399f8d0a
fix: implement real upload (XHR + S3 multipart) and fix SDI recorder device_index + manual fallback: screens-ingest.jsx
2026-05-22 11:10:00 -04:00
529d14cb6b
fix: SDI crash, monitors polling, home RAM fields, editor IN DEV splash, timecode, create recorder API: modal-new-recorder.jsx
2026-05-22 10:55:22 -04:00
fb44bd8aff
fix: SDI crash, monitors polling, home RAM fields, editor IN DEV splash, timecode, create recorder API: screens-editor.jsx
2026-05-22 10:55:20 -04:00
24a1d57165
fix: SDI crash, monitors polling, home RAM fields, editor IN DEV splash, timecode, create recorder API: screens-ingest.jsx
2026-05-22 10:55:19 -04:00
48ee66e744
fix: SDI crash, monitors polling, home RAM fields, editor IN DEV splash, timecode, create recorder API: screens-home.jsx
2026-05-22 10:55:18 -04:00
0342aa0a5a
fix admin screen: move data destructuring inside components, normalize field names: screens-admin.jsx
2026-05-22 10:15:42 -04:00
406f28c663
feat(ui): wire ingest screens to real API (recorders, capture devices): screens-ingest.jsx
2026-05-22 10:07:13 -04:00
835545e061
feat(ui): wire library, jobs, ingest, editor screens to live API data: screens-editor.jsx
2026-05-22 10:05:57 -04:00
1392e28a88
feat(ui): wire library, jobs, ingest, editor screens to live API data: screens-jobs.jsx
2026-05-22 10:05:56 -04:00
bc03ee866b
feat(ui): wire library, jobs, ingest, editor screens to live API data: screens-library.jsx
2026-05-22 10:05:54 -04:00
69f0d130ee
feat(ui): wire screens to live API data; add thumbnail lazy-loading: screens-projects.jsx
2026-05-22 10:04:25 -04:00
07af51b05c
feat(ui): wire screens to live API data; add thumbnail lazy-loading: screens-home.jsx
2026-05-22 10:04:24 -04:00
3574ae8a43
feat(ui): wire screens to live API data; add thumbnail lazy-loading: visuals.jsx
2026-05-22 10:04:23 -04:00
7dda7cc89c
feat(ui): wire data.jsx to real API; add loading gate in app.jsx: app.jsx
2026-05-22 10:02:55 -04:00
98025001e8
feat(ui): wire data.jsx to real API; add loading gate in app.jsx: data.jsx
2026-05-22 10:02:54 -04:00
068e3a0828
fix(ui): replace FauxFrame SVG scenes with clean dark placeholder; strip fake LiveStrip animation: screens-editor.jsx
2026-05-22 09:31:58 -04:00
6ad277275b
fix(ui): replace FauxFrame SVG scenes with clean dark placeholder; strip fake LiveStrip animation: visuals.jsx
2026-05-22 09:31:57 -04:00
f58fe95f0d
fix(ui): remove placeholder elements — no scanlines, no DEV BUILD, no tweaks panel: screens-projects.jsx
2026-05-22 09:30:50 -04:00
6e763e8270
fix(ui): remove placeholder elements — no scanlines, no DEV BUILD, no tweaks panel: screens-home.jsx
2026-05-22 09:30:49 -04:00
6ac3050a05
fix(ui): remove placeholder elements — no scanlines, no DEV BUILD, no tweaks panel: index.html
2026-05-22 09:30:47 -04:00
e13d111b9f
feat(ui): Dragonflight redesign — admin screens (users, tokens, containers, cluster, settings): screens-admin.jsx
2026-05-22 08:24:08 -04:00
1eaf9dff5c
Add Z-AMPP UI: screens-ingest + screens-admin: screens-admin.jsx
2026-05-22 08:22:38 -04:00
20dfa504e5
Add Z-AMPP UI: screens-ingest + screens-admin: screens-ingest.jsx
2026-05-22 08:22:37 -04:00
0945f488f6
feat(ui): Dragonflight redesign — ingest, jobs, editor, admin screens: screens-ingest.jsx
2026-05-22 08:20:15 -04:00
bd9dfd2cce
Add Z-AMPP UI: screens-jobs + screens-editor + modal-new-recorder: modal-new-recorder.jsx
2026-05-22 08:19:03 -04:00
b8e1796c33
Add Z-AMPP UI: screens-jobs + screens-editor + modal-new-recorder: screens-editor.jsx
2026-05-22 08:19:02 -04:00
f8bd80e38e
Add Z-AMPP UI: screens-jobs + screens-editor + modal-new-recorder: screens-jobs.jsx
2026-05-22 08:19:01 -04:00
7007d2df93
Add Z-AMPP UI: screens-asset + screens-projects: screens-asset.jsx
2026-05-22 08:17:17 -04:00
ed3084e60f
feat(ui): Dragonflight redesign — screen components batch 1: screens-projects.jsx
2026-05-22 08:17:06 -04:00
4a77c1bed8
Add Z-AMPP UI: screens-home + screens-library: screens-library.jsx
2026-05-22 08:15:36 -04:00
100fc054cc
Add Z-AMPP UI: screens-home + screens-library: screens-home.jsx
2026-05-22 08:15:35 -04:00
c0345e47c9
feat(ui): Dragonflight redesign — visuals + tweaks panel: visuals.jsx
2026-05-22 08:15:34 -04:00
a9e0313fe4
Add Z-AMPP UI: visuals + tweaks-panel: tweaks-panel.jsx
2026-05-22 08:13:37 -04:00
d54d960b8f
Add Z-AMPP UI: visuals + tweaks-panel: visuals.jsx
2026-05-22 08:13:36 -04:00
2706903353
feat(ui): Dragonflight redesign — foundation JSX files: app.jsx
2026-05-22 08:13:03 -04:00
b6dcecb672
feat(ui): Dragonflight redesign — foundation JSX files: shell.jsx
2026-05-22 08:13:02 -04:00
14bfcabcaf
feat(ui): Dragonflight redesign — foundation JSX files: icons.jsx
2026-05-22 08:13:01 -04:00
3b1610a167
feat(ui): Dragonflight redesign — foundation JSX files: data.jsx
2026-05-22 08:13:00 -04:00
d5fd705d66
feat(web-ui): Z-AMPP core JSX files (data, icons, visuals, tweaks, shell, app): icons.jsx
2026-05-22 08:09:04 -04:00
a700124f50
feat(web-ui): Z-AMPP core JSX files (data, icons, visuals, tweaks, shell, app): data.jsx
2026-05-22 08:09:03 -04:00
10952df591
feat(web-ui): add styles-asset and styles-rest CSS: styles-rest.css
2026-05-22 08:07:16 -04:00
352d21496f
feat(web-ui): asset detail + rest CSS: styles-rest.css
2026-05-22 08:06:40 -04:00
016adff949
feat(web-ui): asset detail + rest CSS: styles-asset.css
2026-05-22 08:06:39 -04:00
6befb0f46a
feat(web-ui): Z-AMPP screen + component CSS: styles-modal.css
2026-05-22 08:03:57 -04:00
e655ccdf64
feat(web-ui): Z-AMPP screen + component CSS: styles-screens.css
2026-05-22 08:03:55 -04:00
2c88fb0a03
feat(web-ui): Z-AMPP design system CSS: styles-fixes.css
2026-05-22 08:02:36 -04:00
7b13d8bd0f
feat(web-ui): Z-AMPP design system CSS: styles.css
2026-05-22 08:02:35 -04:00
68df3797f1
feat(web-ui): new design system CSS from Claude Design: styles.css
2026-05-22 08:02:07 -04:00
dccca554e0
Add Dragonflight React SPA design - index.html and CSS: styles-fixes.css
2026-05-21 23:53:21 -04:00
1b63429def
Add Dragonflight React SPA design - index.html and CSS: index.html
2026-05-21 23:53:19 -04:00
87da3c0b58
feat: migrate cluster.html to wd-* design system
2026-05-21 23:17:48 -04:00
06551c66a6
feat: migrate editor.html to wd-* design system
2026-05-21 23:16:46 -04:00
136820c8f9
feat: migrate capture.html to wd-* design system
2026-05-21 23:16:29 -04:00
7c88692c1c
feat: migrate recorders.html to wd-* design system
2026-05-22 03:16:27 +00:00
1e0015322c
feat: migrate projects.html to wd-* design system
2026-05-21 23:15:57 -04:00
6176791174
feat: migrate player.html to wd-* design system
2026-05-21 23:15:18 -04:00
9ff80f8cc1
feat: migrate upload.html to wd-* design system
2026-05-21 23:14:51 -04:00
738d6298d2
feat: migrate edit.html to wd-* design system
2026-05-21 23:14:19 -04:00
a84bc3ecfe
feat: migrate api-tokens.html to wd-* design system
2026-05-21 23:14:09 -04:00
daa203a43e
feat: migrate index.html to wd-* design system
2026-05-21 23:13:13 -04:00
33d2a4004d
feat: migrate jobs.html to wd-* design system
2026-05-21 23:12:58 -04:00
6e43ab30c2
rebrand: Recorders — Dragonflight, ember orange hue-32
2026-05-22 02:54:10 +00:00
cc45cc6347
rebrand: _primitives-smoke — Dragonflight brand
2026-05-21 22:52:12 -04:00
c31933a53c
rebrand: Projects — Dragonflight, ember orange hue-32
2026-05-21 22:51:20 -04:00
efe005378a
rebrand: Editor (in development) — Dragonflight, ember orange hue-32
2026-05-21 22:49:43 -04:00
5874c93956
rebrand: Editor — Dragonflight, ember orange hue-32
2026-05-21 22:49:00 -04:00
cd5fc3a05c
rebrand: upload.html — Dragonflight title + sidebar
2026-05-21 22:44:25 -04:00
e0a2d0c95c
rebrand: jobs.html — Dragonflight title + sidebar
2026-05-21 22:42:56 -04:00
4572c88f58
rebrand: capture.html — Dragonflight title + sidebar + hue-32
2026-05-21 22:40:48 -04:00
c752227e20
rebrand: api-tokens.html — Dragonflight title + sidebar
2026-05-21 22:39:20 -04:00
d4e5af459e
rebrand: settings.html — Z-AMPP → Dragonflight
2026-05-21 22:35:33 -04:00
29360e38e8
rebrand: users.html — Z-AMPP → Dragonflight
2026-05-21 22:33:21 -04:00
e5f4c00729
rebrand: containers.html — Z-AMPP → Dragonflight
2026-05-21 22:31:41 -04:00
c6aeedb5fc
rebrand: Dragonflight — cluster.html brand names
2026-05-21 22:27:36 -04:00
32cf6bf63e
rebrand: Dragonflight — tokens.html brand names and footer text
2026-05-21 22:26:24 -04:00
024833cc95
rebrand: Dragonflight — login.html brand names, description text
2026-05-21 22:22:58 -04:00
b4642b3c78
rebrand: Dragonflight — index.html brand names, splash screen, accent colors
2026-05-21 22:22:12 -04:00
b82cc73cf1
rebrand: Dragonflight — home.html wordmark, accent gradients, brand names
2026-05-21 22:19:00 -04:00
873920d27f
rebrand: Dragonflight — ember orange accent (hue 266→32)
2026-05-21 22:16:32 -04:00
37767f9939
fix(cluster): pickIp() only treats 172.17.x as docker bridge, not all of RFC1918 172.16/12
2026-05-21 21:27:15 -04:00
30b4deffc6
fix(capture): proper SDK 16 patch via upstream FFmpeg master diff
...
The previous patch_decklink.py mixed v14_2_1 versioned types (Fix 1 renamed the allocator class) with no-ops for SetVideoInputFrameMemoryAllocator + QueryInterface-around-GetBytes (Fixes 2 & 3). That inconsistency compiled but silently dropped every video frame: VideoInputFrameArrived saw _v14_2_1 allocator output but tried to read it via the SDK 16 unversioned IDeckLinkVideoBuffer path, and the SDK released the buffer before FFmpeg could consume it.
Bisected with the BMD-provided Capture sample at SDK 16 mode 5 (Hp29) which got frames cleanly, confirming the signal was fine and the bug was in FFmpegs decklink demuxer.
Fix: pull libavdevice/decklink_{enc,dec,common}{.cpp,.h} from upstream FFmpeg master (commits past 7.1 that fully rename every decklink interface to its _v14_2_1 versioned form) and apply that diff in reverse during build. Now build is internally consistent and frames flow.
Verified: SDI1 recorder on zampp2 hits 423 frames in 14s @ 29 fps, ProRes HQ at 91 Mbps.
2026-05-22 00:53:03 +00:00
96f0f58e68
capture: yadif deint=1 so progressive SDI passes through unchanged
...
Bug: yadif=mode=1 unconditionally doubled output framerate for SDI input. On 1080p29.97 progressive sources the encoder produced zero frames (time advanced, size stayed at 1KiB MOV header).
Fix: deint=1 makes yadif only process frames flagged as interlaced; progressive frames pass through at the source rate.
2026-05-22 00:14:02 +00:00
a8656fc1a8
capture: custom FFmpeg 7.1 build with DeckLink + D-Bus mounts + SDI deinterlace
...
Dockerfile is now a two-stage build that compiles FFmpeg from source with --enable-decklink against the Blackmagic SDK 16.x headers in services/capture/sdk/ (operator-supplied, gitignored). build-with-decklink.sh + patch_decklink.py drive the build.
docker-compose.yml mounts /dev/shm, /run/dbus, /run/systemd into mam-api, capture, web-ui so the BMD runtime can talk to the host.
capture-manager.js wraps SDI sources with -vf yadif=mode=1 (deinterlace).
recorders.html defaults to SDI source type now that we have a working DeckLink path.
2026-05-22 00:01:43 +00:00
1074104d34
fix(capture): FFmpeg 7.x DeckLink compatibility
2026-05-22 00:00:02 +00:00
bbed2a7059
fix(decklink): mount /dev/blackmagic in sidecar + remote node routing via node-agent
...
Two bugs fixed:
1. SDI capture sidecar never had /dev/blackmagic bound — ffmpeg opened the
decklink input inside a container with no device nodes, so frame=0.
Fix: local spawns now push '/dev/blackmagic:/dev/blackmagic' onto Binds
when source_type='sdi'.
2. recorders.js always spawned sidecars against the local Docker socket
(zampp1), even when a recorder's node_id pointed at zampp2 (where the
card is). Fix: resolveNodeTarget() looks up the recorder's cluster node;
if it's a different hostname the sidecar is spawned via a new
POST /sidecar/start endpoint on the remote node-agent.
node-agent gains three new routes (all talk to the local Docker socket):
POST /sidecar/start — create + start container (host network,
privileged, /dev/blackmagic bind for sdi)
DELETE /sidecar/:id — stop + remove
GET /sidecar/:id/status — inspect + poll capture service
docker-compose.worker.yml: add /var/run/docker.sock and LIVE_DIR to
node-agent so it can spawn sidecars, and document build-capture prerequisite.: recorders.js
2026-05-21 18:51:10 -04:00
8186b181cc
fix(decklink): mount /dev/blackmagic in sidecar + remote node routing via node-agent
...
Two bugs fixed:
1. SDI capture sidecar never had /dev/blackmagic bound — ffmpeg opened the
decklink input inside a container with no device nodes, so frame=0.
Fix: local spawns now push '/dev/blackmagic:/dev/blackmagic' onto Binds
when source_type='sdi'.
2. recorders.js always spawned sidecars against the local Docker socket
(zampp1), even when a recorder's node_id pointed at zampp2 (where the
card is). Fix: resolveNodeTarget() looks up the recorder's cluster node;
if it's a different hostname the sidecar is spawned via a new
POST /sidecar/start endpoint on the remote node-agent.
node-agent gains three new routes (all talk to the local Docker socket):
POST /sidecar/start — create + start container (host network,
privileged, /dev/blackmagic bind for sdi)
DELETE /sidecar/:id — stop + remove
GET /sidecar/:id/status — inspect + poll capture service
docker-compose.worker.yml: add /var/run/docker.sock and LIVE_DIR to
node-agent so it can spawn sidecars, and document build-capture prerequisite.: index.js
2026-05-21 18:51:09 -04:00
539429c058
tokens.html: remove orphan sidebar-footer + duplicate /nav; use main flex wrapper
2026-05-21 16:40:28 -04:00
01a9d6c3db
settings.html: remove orphan sidebar-footer + duplicate /nav; use main flex wrapper
2026-05-21 16:40:28 -04:00
Zac
ddd3b3eca1
Revert shell.css primitive rework (5 commits eea1ed6..a8f5bce)
2026-05-21 20:34:08 +00:00
a8f5bce9ee
home.html: drop per-page body+shell rules (now in shell primitive)
2026-05-21 16:22:49 -04:00
683f0ff101
containers.html: drop inline shell hack (now in shell primitive)
2026-05-21 16:22:49 -04:00
47c0e1f933
users.html: drop inline shell hack (now in shell primitive)
2026-05-21 16:22:48 -04:00
6cad11f687
app.css: import new shell primitive; drop redundant html base rule (now in shell.css)
2026-05-21 16:22:47 -04:00
eea1ed6bcb
shell.css: codify body + .wd-shell + .wd-main as a primitive (fix dead-space layout bug)
2026-05-21 16:22:46 -04:00
c6bcbbd214
web-ui(wave 2): migrate settings.html to new primitives
...
Surgical migration: stylesheet swap to /dist/app.css + sidebar markup
updated to wd-sidebar primitives. Page-specific content + JS unchanged.
2026-05-21 13:35:04 -04:00
e7495dfe29
web-ui(wave 2): migrate tokens.html to new primitives
...
Surgical migration: stylesheet swap to /dist/app.css + sidebar markup
updated to wd-sidebar primitives. Page-specific content + JS unchanged.
2026-05-21 13:35:03 -04:00
5650b279c3
web-ui(wave 2): migrate users.html to new primitives
2026-05-21 13:33:22 -04:00
596fe228ed
web-ui(wave 2): migrate containers.html to new primitives
2026-05-21 13:33:22 -04:00
e0cfe80a9e
web-ui(wave 2): migrate home.html to new primitives
...
Swap stylesheet to /dist/app.css. Sidebar markup ported to wd-sidebar /
wd-nav-item / wd-sidebar-* primitives (active state = leading accent dot).
Logout button promoted to wd-btn--ghost--sm--icon.
Hero (portrait, wordmark, tagline) and the 10 illustrated cards keep
their bespoke design — they're a brand moment. Hardcoded oklch values
in the inline style replaced with var(--accent-bright), var(--signal-bad),
var(--bg-base), var(--accent-border), var(--overlay), etc. wherever the
brand palette already provides them.
All JS ids preserved (assetCount, projectCount, recorderCount,
containerCount, nodeCount, jobCount, ingestCount, captureStatus,
tokenBurn, userAvatar, userName, userRole, logoutBtn, systemBuild).
loadStats() poll cycle unchanged.
2026-05-21 13:19:16 -04:00