|
| 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