Skip to content

Commit a8a8bb7

Browse files
committed
docs(media): keep video off GitHub, document where media lives
Only GIFs that a public page embeds stay in docs/images/: the five README GIFs plus subagent-demo-20260724.gif, which the published "mission control" article hotlinks from master. Seven GIFs nothing embeds leave the tree (their masters are kept in the maintainer's local media library). .gitignore now blocks *.mp4/*.webm/*.mov/*.m4v/*.mkv/*.avi/*.gif outside docs/images/*.gif (and the promo branch's Remotion inputs), so a video can only be committed with an explicit `git add -f`. docs/media-assets.md records the rule: what is tracked and where it is embedded, website media (pr/website/assets, deployed separately), release clips on the design-assets branch, and the local library layout. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 1a692f5 commit a8a8bb7

10 files changed

Lines changed: 87 additions & 0 deletions

‎.gitignore‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,23 @@ tmp/
8484
# added there). No trailing slash so it still matches the symlink, not just dirs.
8585
/public
8686

87+
# Video never goes to GitHub (docs/media-assets.md). The only tracked moving
88+
# images are the GIFs a public page embeds, in docs/images/; masters, promo cuts,
89+
# drafts and captures live in the local media library pr/media/ (ignored above).
90+
# The promo branch tracks its Remotion render inputs, so those stay addable.
91+
# A deliberate exception elsewhere takes `git add -f`.
92+
*.mp4
93+
*.webm
94+
*.mov
95+
*.m4v
96+
*.mkv
97+
*.avi
98+
*.gif
99+
!/docs/images/*.gif
100+
!/scripts/remotion/public/**/*.mp4
101+
!/scripts/remotion/public/**/*.webm
102+
!/scripts/remotion/public/**/*.gif
103+
87104
# Opt-in gesture overlay runtime assets: large MediaPipe wasm + model (~27 MB)
88105
# fetched at build/install by scripts/fetch-gesture-assets.mjs, kept out of git.
89106
# (The gesture bundle itself, gesture-codeman.js, IS tracked — built from

‎CLAUDE.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,8 @@ All in `~/.codeman/`: `state.json` (sessions, settings, respawn, orchestrator, c
302302

303303
**Generated top-level dirs** (all gitignored — don't edit or commit): `dist/` (esbuild output), `out/`, `coverage/`, `test-results/`, `tmp/`, `screenshots-echo-diag/`. The committed gesture bundle (`src/web/public/gesture/gesture-codeman.js`) IS tracked, but its runtime wasm/model assets (`src/web/public/gesture/wasm/`, `*.task`) are fetched and gitignored.
304304

305+
**Videos and GIFs**: only GIFs a public page embeds are tracked (`docs/images/`), and `.gitignore` blocks `*.mp4`/`*.webm`/`*.mov`/`*.gif` everywhere else. Masters, promo cuts, drafts and captures live in the local, gitignored media library `pr/media/` (guide `pr/media/README.md`, generated `INVENTORY.md` via `node pr/media/inventory.mjs`); never leave a render in `tmp/` or `out/`. A GIF leaving `docs/images/` needs a hotlink check first (articles embed raw `master` URLs). → `docs/media-assets.md`
306+
305307
## Testing
306308

307309
**`npm test` is the gate and is safe to run bare** — it runs `config/vitest.ci.config.ts`, exactly what CI runs, so local green means CI green.

‎docs/images/codeman-demo.gif‎

-859 KB
Binary file not shown.
-1.16 MB
Binary file not shown.

‎docs/images/subagent-demo-new.gif‎

-583 KB
Binary file not shown.

‎docs/images/subagent-demo-opt.gif‎

-4.27 MB
Binary file not shown.
-207 KB
Binary file not shown.

‎docs/images/tiles-crt-20261010.gif‎

-2.71 MB
Binary file not shown.
-2.67 MB
Binary file not shown.

‎docs/media-assets.md‎

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# Media assets: videos and GIFs
2+
3+
Codeman produces a lot of video: README GIFs, website loops, release-note clips, promo videos and their drafts, raw screen captures. This page says where each kind lives and which of them belong in git.
4+
5+
## The rule
6+
7+
**Only media that a public page embeds is pushed to GitHub. Everything else stays on the maintainer's machine, in the local media library.**
8+
9+
| Kind | Where it lives | On GitHub? |
10+
| --- | --- | --- |
11+
| GIFs the README, the wiki or a published article embeds | `docs/images/` on `master` | yes |
12+
| Release-note and media-kit clips | the orphan `design-assets` branch | yes, but never on `master` |
13+
| getcodeman.com videos and GIFs | `pr/website/assets/` (local, deployed to Cloudflare Pages) | no |
14+
| Masters, promo videos, drafts, shorts, feature clips, raw captures | `pr/media/` (the local media library) | no |
15+
| Remotion render inputs for the promo videos | `scripts/remotion/public/` on the unpushed promo branch | no |
16+
17+
`.gitignore` enforces it: `*.mp4`, `*.webm`, `*.mov`, `*.m4v`, `*.mkv`, `*.avi` and `*.gif` are ignored everywhere except `docs/images/*.gif`, plus `scripts/remotion/public/`, whose render inputs the promo branch tracks. A video that really must be committed needs `git add -f`, which makes the exception visible in review.
18+
19+
A GIF that leaves `docs/images/` stays in git history, so removing it does not shrink a clone. The rule keeps new weight out and the tree honest about what is actually used.
20+
21+
## Tracked GIFs (`docs/images/`)
22+
23+
| File | Embedded in | Shows |
24+
| --- | --- | --- |
25+
| `tiles-crt-stats-1600-20261010.gif` | README hero (en + zh-CN) | six live agents in the tile grid, powering on and off with the CRT animation, header stats on |
26+
| `tile-grid-20261009.gif` | README, Tile Grid section | the Tiles button opening six live sessions side by side, and closing them |
27+
| `zerolag-demo-20260728.gif` | README, wiki `Input-And-Voice`, `packages/xterm-zerolag-input/README.md`, CHANGELOG, getcodeman.com docs | instant local echo next to slow server echo, on two phones |
28+
| `codeman-tab-states-20261010.gif` | README, Tab Alerts section | annotated tab states: working, blocked on a question, idle |
29+
| `codeman-skill-crt-20261010.gif` | README, agent skill section | one prompt to Claude Code spawning and driving two worker sessions through the skill |
30+
| `subagent-demo-20260724.gif` | the "mission control" article on dev.to, Hashnode and Medium (hotlinked from `master`) | subagent windows fanning out |
31+
32+
Before removing one, search for hotlinks: `README*.md`, `docs/wiki/`, `packages/*/README.md`, `CHANGELOG.md`, the site (`pr/website/`), and published articles, which link `raw.githubusercontent.com/Ark0N/Codeman/master/docs/images/<file>` and break silently.
33+
34+
On 2026-10-13, seven GIFs that no page embedded left `docs/images/` and moved into the library: `codeman-demo.gif`, `codeman-skill-20261010.gif`, `subagent-demo-new.gif`, `subagent-demo-opt.gif`, `tab-alerts-glow-20260815.gif`, `tiles-crt-20261010.gif`, `tiles-crt-stats-20261010.gif`.
35+
36+
### Adding or replacing a README GIF
37+
38+
1. Keep the master (the lossless MP4 or the full-size GIF) in `pr/media/clips/<feature>/`, or in the project folder it came from.
39+
2. Commit only the size the README shows, named `<feature>-<YYYYMMDD>.gif`, and keep it lean: the current ones are 0.8 to 7 MB.
40+
3. A replaced GIF leaves `docs/images/` in the same commit, unless something outside the repo hotlinks it (see above).
41+
42+
## Website media (getcodeman.com)
43+
44+
The site is built and deployed from `pr/website/` (gitignored) with `pr/deploy-site.sh`. Its videos and GIFs sit in `pr/website/assets/` because that directory is what gets uploaded: they are web cuts (1280 to 1600 px wide, high CRF, posters next to them) derived from masters in the library. `pr/site-notes.md` records how each one was cut and from which master. A few superseded files stay deployed on purpose, so links that point at them keep resolving.
45+
46+
## Release notes and the media kit (`design-assets` branch)
47+
48+
GitHub releases and the Announcements discussions embed clips from the orphan `design-assets` branch (`release-1.40/`, `release-1.41/`, `media-kit-2026-10/`). They are referenced by a commit-pinned raw URL, so the branch can change later without breaking old notes, and none of it ever touches `master`.
49+
50+
## The local media library (`pr/media/`)
51+
52+
`pr/` is gitignored, so the library is never pushed. It holds every master, every finished promo cut and every superseded draft in one tree:
53+
54+
```
55+
pr/media/
56+
README.md curated guide: what each collection is, which cut is current, where it is published
57+
INVENTORY.md generated list of every file (size, length, resolution, fps, date, published-or-not)
58+
inventory.mjs regenerates INVENTORY.md: node pr/media/inventory.mjs
59+
videos/<production>/ finished promo videos; superseded renders in drafts/
60+
shorts/<episode>/ per-feature cuts of a promo; older sets in drafts/
61+
clips/<feature>/ feature loops and GIF masters (README / site / release clips start here)
62+
crt-gifs/ CRT tile-animation loops
63+
files-one-click-20261011/ the Files panel loop project (own README)
64+
screenshots-hq/ high-res stills and their capture masters
65+
raw-captures/ unedited screen recordings, safe to prune
66+
```
67+
68+
Two working directories keep files the library only archives, because tools read them from fixed paths: `pr/website/assets/` (the deploy upload) and the promo worktree's `scripts/remotion/public/` (Remotion's `staticFile()` inputs). Renders still land in `scripts/remotion/out/` and are filed into `pr/media/videos/<production>/` once checked. A finished render never goes to `tmp/`.

0 commit comments

Comments
 (0)