# skill.md — Faceless Video Pipeline (starter template from antist.ai)

> Skill-Centric Workflow: before writing any code, your agent fills this file in.
> During the project, the agent KEEPS UPDATING it — new pitfalls, changed plans, done/undone.
> Any future agent (or future you) reads this file first and continues seamlessly.
> Method & updates: https://antist.ai/methodology · contact: Antisubmissivist@gmail.com

---
name: faceless-video-pipeline
description: Zero-budget faceless video pipeline — script → own voice → aligned subtitles → coded visuals
status: planning   # planning | building | weekly-operation
last_updated: <!-- agent: keep current -->
---

## 1. Goal & success criteria
- Output: <length> min videos, <language>, cadence: <weekly/biweekly>
- Success = one command turns (script.md + voice.m4a) into upload-ready MP4
- NOT goals: facecam, live streaming, editing-software timelines

## 2. Architecture decision
- Chosen: full code pipeline (see https://antist.ai/scenarios/faceless-videos)
- Rejected: all-SaaS (subscription cost), all-AI voice (voice IS the brand)
- Revisit when: channel revenue > $<threshold>/mo → consider automating more steps

## 3. Tool stack (fill exact versions once installed)
| Step | Tool | Version | Notes |
|---|---|---|---|
| Script draft | Ollama / <model> | | local, free |
| Recording | phone voice memo | | 44.1kHz+, quiet room |
| Transcribe + align | Whisper | | use --word_timestamps |
| Visuals | Remotion | | one composition per episode format |
| Audio mix + mux | FFmpeg | | BGM ducking via sidechaincompress |
| Memory / notes | Obsidian vault | | this file lives there too |

## 4. Repo layout
- <path>/pipeline/  — Remotion project + scripts
- <path>/episodes/<date>-<slug>/ — script.md, voice.m4a, out.mp4
- Source of truth for episode status: this file's §7

## 5. Known pitfalls (append as you hit them)
- Whisper hallucinates punctuation on long silences → trim silence first (ffmpeg silenceremove)
- Remotion renders are CPU-bound → render at night, or lower concurrency
- BGM louder than voice = instant viewer drop-off → ducking is not optional
- <!-- agent: append new pitfalls here, dated -->

## 6. Commands (the whole factory)
```bash
# transcribe + align
whisper voice.m4a --language <lang> --word_timestamps True --output_format json
# render visuals
npx remotion render <CompositionId> out/visual.mp4 --props=episode.json
# mix + final mux
ffmpeg -i visual.mp4 -i voice_clean.m4a -i bgm.mp3 -filter_complex "<ducking chain>" final.mp4
```

## 7. Episode log (newest first)
| Date | Episode | Status | Notes |
|---|---|---|---|
| | | | |

## 8. Open questions / next improvements
- <!-- agent: keep an honest list; delete items only when done or explicitly dropped -->
