# skailabinfo/claude-video-harness architecture

> Architecture diagram of the GitHub repository skailabinfo/claude-video-harness, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-14). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/skailabinfo/claude-video-harness
- Repository: https://github.com/skailabinfo/claude-video-harness

## Overview

This repository is a Claude Code harness for turning a phone recording into a styled vertical short, with optional reference analysis and Buffer draft preparation. The documented workflow runs from setup and style profiling through transcription, edit decisions, cutting, graphics, rendering, cover creation, and archiving; publication remains user-approved. The graph includes the Remotion composition and its major visual layers. Several agent and script relationships are based on README descriptions rather than sampled implementation, so those edges cite the README; unsampled internals are not inferred.

Main entry points: [`.claude/skills/new-video/SKILL.md`](https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/skills/new-video/SKILL.md) (New video workflow), [`video/src/Composition.tsx`](https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/Composition.tsx) (Video composition), [`.claude/skills/setup/SKILL.md`](https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/skills/setup/SKILL.md) (Setup interview), [`.claude/agents/assembler.md`](https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/agents/assembler.md) (Render assembly)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_setup["Setup and guidance"]
  node_setup_skill["Setup interview<br/>[SKILL.md]"]
  node_profile["Style profile"]
  node_taste["Taste references<br/>[exemplars.md]"]
end

subgraph group_editing["Edit workflow"]
  node_new_video["New video workflow<br/>[SKILL.md]"]
  node_beats["Script beats<br/>[script-beats.md]"]
  node_cut["Pause cutting<br/>[cut.py]"]
  node_matte["Person cutout<br/>[matte.py]"]
  node_audio_agent["Audio workflow<br/>[audio-agent.md]"]
end

subgraph group_rendering["Video composition"]
  node_footage["Footage layer<br/>[Footage.tsx]"]
  node_captions["Timed captions<br/>[Captions.tsx]"]
  node_title["Opening title<br/>[Title.tsx]"]
  node_cards["Cards and stickers<br/>[Card.tsx]"]
  node_panels["Panel animation<br/>[Panel.tsx]"]
  node_sfx["Sound cues<br/>[Sfx.tsx]"]
  node_brand["Brand styling<br/>[brand.ts]"]
  node_composition["Video composition<br/>[Composition.tsx]"]
  node_cover["Cover renders<br/>[Cover.tsx]"]
  node_poster_cover["Poster cover<br/>[PosterCover.tsx]"]
  node_root["Remotion entry<br/>[Root.tsx]"]
end

subgraph group_delivery["Delivery"]
  node_assembler["Render assembly<br/>[assembler.md]"]
  node_master["Master render<br/>[master.sh]"]
  node_archive[("Edit archive")]
  node_publish["Publish workflow<br/>[SKILL.md]"]
end

subgraph group_integrations["External tools"]
  node_buffer["Buffer"]
  node_whisper["Whisper or Scribe"]
  node_reference_services["Reference services"]
end

node_creator(("Creator"))
node_claude["Claude Code"]

node_creator -->|"requests edit"| node_claude
node_claude -->|"starts setup"| node_setup_skill
node_setup_skill -->|"records choices"| node_profile
node_setup_skill -->|"collects references"| node_taste
node_setup_skill -.->|"analyzes examples"| node_reference_services
node_creator -->|"submits take"| node_new_video
node_new_video -->|"transcribes speech"| node_whisper
node_new_video -->|"cuts pauses"| node_cut
node_new_video -->|"makes cutout"| node_matte
node_new_video -->|"requests beat list"| node_beats
node_new_video -.->|"coordinates sound"| node_audio_agent
node_new_video -->|"requests assembly"| node_assembler
node_profile -->|"configures style"| node_brand
node_root -->|"registers composition"| node_composition
node_root -->|"registers still"| node_cover
node_root -->|"registers still"| node_poster_cover
node_composition -->|"renders footage"| node_footage
node_composition -->|"renders captions"| node_captions
node_composition -->|"renders title"| node_title
node_composition -->|"renders overlays"| node_cards
node_composition -->|"places cues"| node_sfx
node_captions -->|"uses reveal"| node_panels
node_cards -->|"uses reveal"| node_panels
node_composition -->|"reads style"| node_brand
node_assembler -->|"runs render"| node_master
node_master -.->|"renders composition"| node_root
node_assembler -->|"creates cover"| node_cover
node_assembler -->|"archives edit"| node_archive
node_creator -.->|"requests draft"| node_publish
node_publish -->|"prepares draft"| node_buffer
node_creator -.->|"approves publication"| node_buffer

click node_setup_skill "https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/skills/setup/SKILL.md"
click node_profile "https://github.com/skailabinfo/claude-video-harness/blob/main/harness.config.json"
click node_taste "https://github.com/skailabinfo/claude-video-harness/blob/main/exemplars.md"
click node_new_video "https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/skills/new-video/SKILL.md"
click node_beats "https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/agents/script-beats.md"
click node_cut "https://github.com/skailabinfo/claude-video-harness/blob/main/video/scripts/cut.py"
click node_matte "https://github.com/skailabinfo/claude-video-harness/blob/main/video/scripts/matte.py"
click node_audio_agent "https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/agents/audio-agent.md"
click node_footage "https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/ui/Footage.tsx"
click node_captions "https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/scenes/Captions.tsx"
click node_title "https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/scenes/Title.tsx"
click node_cards "https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/ui/Card.tsx"
click node_panels "https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/ui/Panel.tsx"
click node_sfx "https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/ui/Sfx.tsx"
click node_brand "https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/brand.ts"
click node_composition "https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/Composition.tsx"
click node_cover "https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/Cover.tsx"
click node_poster_cover "https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/PosterCover.tsx"
click node_root "https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/Root.tsx"
click node_assembler "https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/agents/assembler.md"
click node_master "https://github.com/skailabinfo/claude-video-harness/blob/main/video/scripts/master.sh"
click node_archive "https://github.com/skailabinfo/claude-video-harness/tree/main/edits"
click node_publish "https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/skills/publish/SKILL.md"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_setup_skill,node_profile,node_taste toneBlue
class node_new_video,node_beats,node_cut,node_matte,node_audio_agent toneAmber
class node_footage,node_captions,node_title,node_cards,node_panels,node_sfx,node_brand,node_composition,node_cover,node_poster_cover,node_root toneMint
class node_assembler,node_master,node_archive,node_publish toneRose
class node_buffer,node_whisper,node_reference_services,node_creator,node_claude toneIndigo
```

## Components

### Setup and guidance

- [Setup interview](https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/skills/setup/SKILL.md): `.claude/skills/setup/SKILL.md`
- [Style profile](https://github.com/skailabinfo/claude-video-harness/blob/main/harness.config.json): `harness.config.json`
- [Taste references](https://github.com/skailabinfo/claude-video-harness/blob/main/exemplars.md): `exemplars.md`

### Edit workflow

- [New video workflow](https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/skills/new-video/SKILL.md): `.claude/skills/new-video/SKILL.md`
- [Script beats](https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/agents/script-beats.md): `.claude/agents/script-beats.md`
- [Pause cutting](https://github.com/skailabinfo/claude-video-harness/blob/main/video/scripts/cut.py): `video/scripts/cut.py`
- [Person cutout](https://github.com/skailabinfo/claude-video-harness/blob/main/video/scripts/matte.py): `video/scripts/matte.py`
- [Audio workflow](https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/agents/audio-agent.md): `.claude/agents/audio-agent.md`

### Video composition

- [Footage layer](https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/ui/Footage.tsx): `video/src/ui/Footage.tsx`
- [Timed captions](https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/scenes/Captions.tsx): `video/src/scenes/Captions.tsx`
- [Opening title](https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/scenes/Title.tsx): `video/src/scenes/Title.tsx`
- [Cards and stickers](https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/ui/Card.tsx): `video/src/ui/Card.tsx`
- [Panel animation](https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/ui/Panel.tsx): `video/src/ui/Panel.tsx`
- [Sound cues](https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/ui/Sfx.tsx): `video/src/ui/Sfx.tsx`
- [Brand styling](https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/brand.ts): `video/src/brand.ts`
- [Video composition](https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/Composition.tsx): `video/src/Composition.tsx`
- [Cover renders](https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/Cover.tsx): `video/src/Cover.tsx`
- [Poster cover](https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/PosterCover.tsx): `video/src/PosterCover.tsx`
- [Remotion entry](https://github.com/skailabinfo/claude-video-harness/blob/main/video/src/Root.tsx): `video/src/Root.tsx`

### Delivery

- [Render assembly](https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/agents/assembler.md): `.claude/agents/assembler.md`
- [Master render](https://github.com/skailabinfo/claude-video-harness/blob/main/video/scripts/master.sh): `video/scripts/master.sh`
- [Edit archive](https://github.com/skailabinfo/claude-video-harness/tree/main/edits): `edits`
- [Publish workflow](https://github.com/skailabinfo/claude-video-harness/blob/main/.claude/skills/publish/SKILL.md): `.claude/skills/publish/SKILL.md`

### External tools

- **Buffer**
- **Whisper or Scribe**
- **Reference services**

### Other components

- **Creator**
- **Claude Code**

## Connections

- Creator → Claude Code: requests edit (evidence: `README.md`)
- Claude Code → Setup interview: starts setup (evidence: `README.md`)
- Setup interview → Style profile: records choices (evidence: `README.md`)
- Setup interview → Taste references: collects references (evidence: `README.md`)
- Setup interview → Reference services: analyzes examples (evidence: `README.md`)
- Creator → New video workflow: submits take (evidence: `README.md`)
- New video workflow → Whisper or Scribe: transcribes speech (evidence: `README.md`)
- New video workflow → Pause cutting: cuts pauses (evidence: `README.md`)
- New video workflow → Person cutout: makes cutout (evidence: `README.md`)
- New video workflow → Script beats: requests beat list (evidence: `README.md`)
- New video workflow → Audio workflow: coordinates sound (evidence: `README.md`)
- New video workflow → Render assembly: requests assembly (evidence: `README.md`)
- Style profile → Brand styling: configures style (evidence: `video/src/brand.ts`)
- Remotion entry → Video composition: registers composition (evidence: `video/src/Root.tsx`)
- Remotion entry → Cover renders: registers still (evidence: `video/src/Root.tsx`)
- Remotion entry → Poster cover: registers still (evidence: `video/src/Root.tsx`)
- Video composition → Footage layer: renders footage (evidence: `video/src/Composition.tsx`)
- Video composition → Timed captions: renders captions (evidence: `video/src/Composition.tsx`)
- Video composition → Opening title: renders title (evidence: `video/src/Composition.tsx`)
- Video composition → Cards and stickers: renders overlays (evidence: `video/src/Composition.tsx`)
- Video composition → Sound cues: places cues (evidence: `video/src/Composition.tsx`)
- Timed captions → Panel animation: uses reveal (evidence: `video/src/scenes/Captions.tsx`)
- Cards and stickers → Panel animation: uses reveal (evidence: `video/src/ui/Card.tsx`)
- Video composition → Brand styling: reads style (evidence: `video/src/Composition.tsx`)
- Render assembly → Master render: runs render (evidence: `README.md`)
- Master render → Remotion entry: renders composition
- Render assembly → Cover renders: creates cover (evidence: `README.md`)
- Render assembly → Edit archive: archives edit (evidence: `README.md`)
- Creator → Publish workflow: requests draft (evidence: `README.md`)
- Publish workflow → Buffer: prepares draft (evidence: `README.md`)
- Creator → Buffer: approves publication (evidence: `README.md`)
