Commit the how-to videos, and embed each in its guide #223

Merged
cruelacid merged 2 commits from worktree-nec-129-publish into main 2026-09-30 10:02:21 +01:00
Owner

The last of NEC-129: the finished videos are committed, the guides embed them, and the voice they are narrated from is in the repository.

What lands

  • brand/videos/: all nine cuts (five videos, 16:9 and 9:16; video 4 is portrait only), each with its .srt, plus an upload note per video (title, description whose first line links the guide, which file goes to YouTube, Shorts and Reels). Video 3's description states what the server can see, per docs/video-scripts.md. Nothing in any cut shows server internals.
  • brand/voice/cedric.wav: the reference Chatterbox clones, byte-identical to clconsole's (sha256 1979402c…). The default voice is now cedric.wav; cedric3 is gone here and on clconsole, and the first recording it replaced has been removed there.
  • The guides embed the video. ![caption](video/<name>.mp4) renders a <video controls preload="none"> with a captions track (WebVTT, from the narration) and a poster; "portrait" narrows video 4. /security gets video 3 from the page, so security-model.md is untouched. The CSP is unchanged: native controls need no script, and there is no media-src, so default-src 'self' serves them.
  • Two harness fixes: ffmpeg now gets no stdin. It read the pipe it was handed and blocked, which is what hung video 4's render for 20 minutes (the same command took 14 s with -nostdin) and left two ffmpeg processes running for eight hours. A render timeout now sends SIGKILL.

Verification

  • Site: npm test 17/17, including two new renderer tests. Each is mutation-checked: dropping the missing-file rule fails one, dropping the captions track fails the other. node build.mjs publishes the 15 video files, the deploy workflow's executable-content check passes, and _headers still carries script-src 'none'. Headless-Chrome screenshots of /docs/invite-someone/, /docs/add-a-shared-folder/ (portrait) and /security show the poster and native controls in place.
  • Every video re-rendered from its take with the renamed voice, at the same durations as before.
  • pnpm test, pnpm -r typecheck and pnpm lint pass.

Task: NEC-129

Changelog

Each how-to guide on nectenda.com now opens with a short video of it.

🤖 Generated with Claude Code

https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt

The last of NEC-129: the finished videos are committed, the guides embed them, and the voice they are narrated from is in the repository. ## What lands - **`brand/videos/`**: all nine cuts (five videos, 16:9 and 9:16; video 4 is portrait only), each with its `.srt`, plus an upload note per video (title, description whose first line links the guide, which file goes to YouTube, Shorts and Reels). Video 3's description states what the server *can* see, per `docs/video-scripts.md`. Nothing in any cut shows server internals. - **`brand/voice/cedric.wav`**: the reference Chatterbox clones, byte-identical to clconsole's (sha256 `1979402c…`). The default voice is now `cedric.wav`; `cedric3` is gone here and on clconsole, and the first recording it replaced has been removed there. - **The guides embed the video.** `![caption](video/<name>.mp4)` renders a `<video controls preload="none">` with a captions track (WebVTT, from the narration) and a poster; `"portrait"` narrows video 4. `/security` gets video 3 from the page, so `security-model.md` is untouched. **The CSP is unchanged**: native controls need no script, and there is no `media-src`, so `default-src 'self'` serves them. - **Two harness fixes**: ffmpeg now gets no stdin. It read the pipe it was handed and blocked, which is what hung video 4's render for 20 minutes (the same command took 14 s with `-nostdin`) and left two ffmpeg processes running for eight hours. A render timeout now sends SIGKILL. ## Verification - Site: `npm test` 17/17, including two new renderer tests. Each is mutation-checked: dropping the missing-file rule fails one, dropping the captions track fails the other. `node build.mjs` publishes the 15 video files, the deploy workflow's executable-content check passes, and `_headers` still carries `script-src 'none'`. Headless-Chrome screenshots of `/docs/invite-someone/`, `/docs/add-a-shared-folder/` (portrait) and `/security` show the poster and native controls in place. - Every video re-rendered from its take with the renamed voice, at the same durations as before. - `pnpm test`, `pnpm -r typecheck` and `pnpm lint` pass. Task: NEC-129 ## Changelog Each how-to guide on nectenda.com now opens with a short video of it. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
A render handed ffmpeg a pipe on stdin that never closed, and ffmpeg
reads stdin for keyboard commands: video 4's render sat at 0% CPU
holding its last frames until the 20-minute timeout, and the same
command finished in 14 s with -nostdin. Two such renders were still
running eight hours after their timeouts, because a blocked ffmpeg
ignores SIGTERM. Every ffmpeg call now gets no stdin, the final encode
runs with -nostdin, and the timeout sends SIGKILL.

The default voice is cedric.wav, the recording now committed as
brand/voice/cedric.wav, in place of cedric3.wav.

Task: NEC-129

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
Commit the how-to videos, and embed each in its guide
All checks were successful
Release note / release-note (pull_request) Successful in 15s
CI / build (pull_request) Successful in 5m24s
CI / e2e (pull_request) Successful in 6m18s
CI / promote (pull_request) Has been skipped
e9d2216249
brand/videos/ holds every finished cut with its subtitles and an upload
note (title, description, which file goes where), and brand/voice/ the
recording they are narrated from. The 16:9 cut of each is embedded in
its guide, video 4's portrait cut in its own, and video 3 on /security:
a plain <video controls> with a captions track and a poster, served from
the site itself, because the CSP forbids scripts and frames. The CSP is
unchanged. security-model.md is unchanged too: the page places the
video, the document does not.

The guide renderer takes ![caption](video/<name>.mp4), and refuses a
video whose MP4, captions or poster is missing.

Task: NEC-129

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
cruelacid force-pushed worktree-nec-129-publish from e9d2216249
All checks were successful
Release note / release-note (pull_request) Successful in 15s
CI / build (pull_request) Successful in 5m24s
CI / e2e (pull_request) Successful in 6m18s
CI / promote (pull_request) Has been skipped
to 059aee2c40
All checks were successful
Release note / release-note (pull_request) Successful in 18s
CI / build (pull_request) Successful in 5m11s
CI / e2e (pull_request) Successful in 6m10s
CI / promote (pull_request) Has been skipped
Deploy site / deploy (push) Successful in 53s
CI / build (push) Successful in 5m17s
CI / e2e (push) Successful in 6m3s
CI / promote (push) Successful in 31s
2026-09-30 09:56:03 +01:00
Compare
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Nectenda/nectenda!223
No description provided.