The operating system and workshop for the YouTube channel "Coding without Pants" — calm, funny, informative videos where a Hawaii dad builds one small useful thing per episode, usually simple enough his pantsless 4-year-old can use it (the Pantsless Test).
One tiny cwp CLI over flat files runs two loops:
- The Channel Loop — move an episode through
idea → scripted → built → recorded → edited → published, draft copy in the channel voice via theclaudeCLI, and assemble paste-ready YouTube metadata. It removes the specific frictions that kill hobby channels; it is not a CMS. - The Pantsless Build (the heart of the channel) — the kid says what he wants, local Whisper
transcribes it, AI distills a build brief, one-shot
claude -pgenerates a self-contained kid-usableindex.htmltoy, and an automated verify+repair loop proves it works before he sees it. Then he uses it on camera. The code you build is the thing you publish.
CAPTURE DISTILL BUILD REVEAL
kid rattles ──► faster-whisper ──► claude -p one-shot ──► he uses it on
off his wish + kid-gateway + verify + repair loop camera (Pantsless
(record clip) → build brief → verified index.html Test)
| Layer | Tool | Why |
|---|---|---|
| Language / runtime | Python 3.12+ | stdlib tomllib, argparse — keeps the tool tiny |
| Package / env | uv |
fast, reproducible |
| Metadata | TOML (meta.toml) |
human-editable, atomically written |
| Episode project | self-contained HTML | runs in any browser from file://; passes the Pantsless Test |
| AI drafting + build | claude CLI (claude -p) |
the one-shot generation primitive (OAuth; no API key in repo) |
| Speech-to-text | faster-whisper (local, CTranslate2) |
a child's voice never leaves the machine |
| Toy verification | Playwright (headless Chromium) | console + keypoint checks on generated toys |
| Quality | pytest, ruff, mypy | tests gate every build step |
No backend, no database, no server, no ports, no PyTorch.
- Windows 11 + PowerShell (developed there; nothing is Windows-specific by design)
- Python 3.12+ and
uvon PATH - The
claudeCLI installed and authenticated (needed forcwp draft/brief/build; everything else works without it)
uv sync # venv + deps (tomli-w, faster-whisper, playwright)
uv run playwright install chromium # once, for the toy verifier
uv run cwp seed # once — materializes the 12-episode idea bank (idempotent)
uv run cwp --helpcwp seed creates the 12 starter episodes (plan §5.5) as idea-status folders under
episodes/; it is idempotent (safe to re-run — it skips seqs already present) and the manual
dogfood steps (M1/M1.5/M2) reference those episodes, so run it once before them. The first
cwp capture downloads the Whisper model once (~460 MB), then runs fully offline.
# Channel Loop
uv run cwp idea "a button that burps the alphabet" # fast idea capture
uv run cwp new "The Sock-Matching Machine (Two Sum, But Socks)"
uv run cwp list # derived episode table + cycle time
uv run cwp show 003 # detail for one episode
uv run cwp next # which episode to work on + its next action
uv run cwp draft 003 script # AI draft in the channel voice
uv run cwp status 003 recorded # advance/change the lifecycle state
uv run cwp publish 003 --url https://youtu.be/XXXX
# The Pantsless Build
uv run cwp capture 005 --audio clips/wish.wav # local Whisper → transcript
uv run cwp brief 005 # noisy transcript → build brief
uv run cwp build 005 # generate + verify + repair → project/index.htmlThe full command surface: seed, idea, new, list, show, next, status,
draft, publish, capture, brief, build, version (cwp --help).
- One repo, two loops — every episode's browser toy lives beside the tooling that made it.
- Folder-as-id, derived index — the episode list is scanned from
episodes/*/meta.tomlon every run; drift is structurally impossible. - One-shot generation made dependable — a calibrated verifier (static checks + headless
Playwright keypoints, golden + single-defect garbage fixtures) gates every generated toy;
≤2 evidence-fed repairs, atomic commit,
needs_humanon exhaustion. Never ship a broken toy. - AI is an assistant, never a dependency — every
claude/whisper path degrades gracefully. - Kid privacy by construction — audio and transcripts never committed (whole
capture/dir git-ignored), local speech-to-text only, a redact-names guard on every text artifact derived from the kid's speech, and a publish-moment checklist (including YouTube "Made for Kids").
coding_without_pants/
├── plan.md # the full project plan (source of truth)
├── voice.md # channel voice — SoT for drafts
├── build-contract.md # one-shot generation contract — SoT for builds
├── pantsless-test.md # the 4-point kid-usability checklist
├── src/cwp/ # cli, config, episodes, lifecycle, drafting, publishing,
│ # capture, brief, verify, build, templates
├── episodes/NNN-slug/ # the workshop: meta.toml, script.md, brief.md, project/index.html
├── tests/ # per-module + golden/garbage verifier fixtures + e2e smoke
└── docs/ # research notes, production notes, plan review
Automated build complete — all 11 code steps of plan.md §14 shipped (issues
#2–#12 closed), 409 tests passing, 0 type errors, 0 lint violations. Both loops are built end
to end: the full Channel Loop (seed/idea/new/list/show/next/status/draft/publish)
and the Pantsless Build (capture/brief/build), a toy verifier calibrated against golden +
single-defect fixtures (with a network-block belt so untrusted generated HTML can't phone home),
the reliability-core build loop (generate → verify → repair → commit, never ships a broken toy),
the 12-episode idea bank via cwp seed, and an end-to-end smoke gate proving both loops
round-trip. The verifier and build engine each passed a full six-lens /review-deep gate.
Remaining before v1 is operator-only (needs real claude + Whisper + the kid): M1
(dogfood the Channel Loop → a paste-ready publish.md), M1.5 (solo live-toolchain Pantsless
dry-run before the kid), M2 (the kid session — the heart of the channel). v1 acceptance: one
episode reaches a paste-ready publish.md, and one real kid clip goes capture → brief → build → a
verified, kid-usable toy end-to-end. Plan review: docs/plan-review-fable.md.