assemble-recording-series
Assemble one lecture or talk video from a folder of raw takes, whatever the capture tool wrote - flat screen-capture files, or per-session folders with the…
Skill by tdupu
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/tdupu-assemble-recording-series
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Python package
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/assemble-recording-series
What's inside
- Skill name
assemble-recording-series- Description
- Assemble one lecture or talk video from a folder of raw takes, whatever the capture tool wrote - flat screen-capture files, or per-session folders with the video and a separate mixed audio track. Use when a recording session produced several takes that need selecting, ordering, trimming and joining before anything else is done to them.
- License
- GPL-3.0
- Instructions
- 150 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
Files (5)
- SKILL.md
- assemble.py · scripts/
- discover-takes.py · scripts/
- remap-times.py · scripts/
- trim-dead-air.py · scripts/
SKILL.md (first lines)
# Assemble a series of takes into one video
A recording session leaves a pile of takes: false starts, a take that was
abandoned, two attempts at the same segment, and the good ones. This selects
and joins them. It does **not** add commentary, captions or titles - run
`youtube-color-commentary` on the assembled file afterwards, once the examples
are in their final order and the timestamps are stable.
## Two capture layouts
| Layout | Shape | Audio |
|---|---|---|
| Flat | `NN_topic_take-N.mov` beside each other | in the video file |
| Session folders | `Default_<date>_<n>_<time>/` per take | a separate mixed `.wav` alongside the video |
The session layout is what field recorders and multitrack capture apps write.
Its separate mix is usually the better audio - it is the board mix rather than
whatever the camera picked up - so the manifest can name an audio file per take
and it will be used in place of the embedded track.
Discovery only lists candidates. **Which takes are used, in what order, and
where they are cut is a human decision recorded in a manifest**, never inferred
from filenames: "take-2" is not reliably better than "take-1", and a long take
is not reliably the good one.
## The manifest
`manifest.json`:
```json
{
"output": "assembled/lecture.mp4",
"takes": [
{"video": "rec/Default_1/Default_1.mp4",
"audio": "rec/Default_1/Audio/Live-Mix.wav",
"label": "squaring map on P^1",
"start": 12.0, "end": 880.5},
{"video": "rec/Default_2/Default_2.mp4", "label": "second example"}
],
"excluded": [
{"video": "rec/Default_0/Default_0.mp4", "why": "test recording, 6 seconds"}
]
}
```
`start`/`end` are seconds and both optional. `excluded` is not used by the
build; it exists so the reason a take was dropped survives in the repository
rather than in someone's memory.
## What the build does
1. Normalises every take to one encode (same resolution, frame rate, pixel
format, audio layout). Takes from one session usually already match, but
concatenating mismatched streams produces a file that plays wrongly from the
join onwards rather than failing.
2. Applies each take's trim.
3. Concatenates, and **checks the result against the sum of the trimmed
inputs**. A silently short concatenation is the characteristic failure here,
and it looks fine until someone watches the end.
4. Writes `<output>.manifest.md` beside the video: every take, its source, its
trim, its duration and its start offset in the finished file. Those offsets
are what the commentary step needs, so it is produced automatically rather
than reconstructed later.
## Procedure
1. `scripts/discover-takes.py --root DIR` to list candidates with durations.
2. Watch them. Write `manifest.json`.
3. `scripts/assemble.py --manifest manifest.json` (add `--dry-run` first).
4. Check the reported duration and the offsets in the generated manifest.
4b. Only if the recording wants it: `scripts/trim-dead-air.py --video IN --out
OUT --map OUT.map.json --min-silence N` (no default; see above), then
`scripts/remap-times.py --map OUT.map.json --notes n.json --out n2.json` to
move any existing cue times onto the cut timeline. `--map` is optional but
required for that, so always pass it.
5. Then, and only then, `youtube-color-commentary`.
## A series, not one video
Lecture material usually arrives as a run of recordings that becomes several
published parts, and the parts have to read as one thing. What makes that work
is cheap and worth doing at assembly time, while the structure is in front of
you:
- **Split on take joins, not on the clock.** A part boundary that falls inside
a take cuts an argument in half; the joins are already where the speaker
stopped and restarted. If the author has a slide deck or notes per part, the
blocks usually land on those joins, and that mapping is worth checking before
choosing split points.
- **A short title card on each part**, same design throughout, carrying the
series name, `N / total`, the part's own title, the authors (alphabetical
unless told otherwise), and where the links live. Match the recording's own
palette so the cut into the footage is not a flash.
- **The same opening note on every part**, so a viewer landing in the middle
learns the same things a viewer of part one did.
- **Each part's description carries the whole series list**, so the parts
cross-link without depending on cards or playlists.
Prepending a card shifts every chapter timestamp in that part's description by
the length of the card. Generate the chapters after the card is attached, not
before.
## Dead air, and why the default will ruin a lecture
`scripts/trim-dead-air.py` cuts a gap only when it is both silent and visually
static. That is meant to keep pauses spent writing - but the still check
compares two downscaled frames, so a pause where the pen barely moves reads as
static and is cut. On one lecture it kept 78 of 630 gaps as "writing" and
removed the rest; most of those were the speaker thinking, not idle.
**`--min-silence` is the main lever, and it has no default** - the script
refuses to run until you choose, because the value depends entirely on the
recording. `--still-threshold`, `--noise` and `--keep` also change what is cut. A lecturer pauses for
about that long between phrases, constantly, while writing - so at the default
the tool removes the speaker's own rhythm and the result sounds clipped and
rushed. Measured on one 102-minute lecture: 1.2s cut 552 gaps, 5.4 per minute,
and of the 17 minutes it removed only about 2 were genuine dead air. At 4s it
cut 32 gaps, one every three minutes. The speaker's verdict on 1.2s was that
the rhythm of the speech was destroyed; on the untrimmed version, that it wasFrom tdupu/agent-skills-public, GPL-3.0.
More from tdupu/agent-skills-public
- 0.570score
check-paragraph
tdupu
Judge ONE paragraph of prose (LaTeX allowed) as its stated reader and return a fixed six-line verdict — topic sentence, one idea, reader can follow, claim…
SkillAFreshness: AClaude Code +9 - 0.565score
check-documentation-policy
tdupu
Audit mathcity documentation against POLICY-documentation.md.
SkillAFreshness: AClaude Code +9 - 0.565score
behavior-verify
tdupu
Use when an edit to a skill, an instruction file, or a prompt has to be shown to have changed the agent behavior it was meant to fix.
SkillAFreshness: AClaude Code +9 - 0.565score
check-citations
tdupu
Read-only citation audit for .tex files.
SkillAFreshness: AClaude Code +9 - 0.565score
check-grant-format
tdupu
Audit an NSF proposal folder against Grants/GRANT-FORMAT.md (page limits, fonts, margins, required headings, no URLs in the description, prior-support items…
SkillAFreshness: AClaude Code +9 - 0.565score
check-grant-style
tdupu
Audit an NSF Project Description and Summary against Grants/GRANT-STYLE.md (every project has a plan and names what is new; results in prose with citations…
SkillAFreshness: AClaude Code +9 - 0.565score
check-latex
tdupu
Produce the evidence block the human adjudicator needs to approve or reject a notes.tex (or any notes-tier .tex) change before push/merge.
SkillAFreshness: AClaude Code +9 - 0.565score
check-latex-hygiene
tdupu
Audit LaTeX beads, branches, or .tex diffs against the LaTeX Subdomain Policy (mathcity/subdomains/latex/POLICY.md, LX-rules).
SkillAFreshness: AClaude Code +9 - 0.565score
check-lmfdb-hygiene
tdupu
Audit an LMFDB-type bead, diff, experiment proposal, or live type against the LMFDB Subdomain Policy (mathcity/subdomains/lmfdb/POLICY.md) — labels valid…
SkillAFreshness: AClaude Code +9 - 0.564score
behavior-cause
tdupu
Use when a reproduced agent behavior has to be traced to the artifacts whose text produced it.
SkillAFreshness: AClaude Code +9 - 0.561score
behavior-repro
tdupu
Use as step 1 when a complaint about an agent's behavior has to become evidence, before any cause is diagnosed or any artifact edited.
SkillAFreshness: AClaude Code +9 - 0.561score
adjust-behavior
tdupu
Start here when an agent did something undesired and you suspect the instructions it read — a skill, a project instruction file, a prompt template — rather…
SkillAFreshness: AClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Oct 14, 2026 (14 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- GPL-3.0
- Repository
- github.com/tdupu/agent-skills-public
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from tdupu
- 0.570score
check-paragraph
tdupu
Judge ONE paragraph of prose (LaTeX allowed) as its stated reader and return a fixed six-line verdict — topic sentence, one idea, reader can follow, claim…
SkillAFreshness: AClaude Code +9 - 0.565score
check-documentation-policy
tdupu
Audit mathcity documentation against POLICY-documentation.md.
SkillAFreshness: AClaude Code +9 - 0.565score
behavior-verify
tdupu
Use when an edit to a skill, an instruction file, or a prompt has to be shown to have changed the agent behavior it was meant to fix.
SkillAFreshness: AClaude Code +9 - 0.565score
check-citations
tdupu
Read-only citation audit for .tex files.
SkillAFreshness: AClaude Code +9 - 0.565score
check-grant-format
tdupu
Audit an NSF proposal folder against Grants/GRANT-FORMAT.md (page limits, fonts, margins, required headings, no URLs in the description, prior-support items…
SkillAFreshness: AClaude Code +9 - 0.565score
check-grant-style
tdupu
Audit an NSF Project Description and Summary against Grants/GRANT-STYLE.md (every project has a plan and names what is new; results in prose with citations…
SkillAFreshness: AClaude Code +9
Cite this page
assemble-recording-series skill. Agent Mart. https://agentmart.dev/skills/tdupu-assemble-recording-series (last updated 2026-10-24)