GitHub Resume Promo Video (Clone-Ready Pipeline)
Final video structure (total duration ≤28s, default ≈24.5s):
- Dynamic Cover (5.5s): A real screenshot of the target GitHub profile page, transformed via continuous perspective from 'cross-section lying flat in the distance' to 'upright tilted close-up', with a light gradient ground and soft shadow, followed by a white flash transition.
- Project Cards × 3 (6–6.5s each): GitHub white repository cards in the same style — repository name, subtitle, red/blue large numbers rolling from 0 to actual Star/Fork counts, 4 README summary lines sliding in one by one, and technical tags fading in at the bottom. Cards 1 and 2 are the two repos with the highest Stars; Card 3 is an 'More Projects' overview (large number = total repos / contributions in the last year).
- Paper Strip Ending (4.5s): Paper strips pasted one by one (username / @github / nickname / representative work · Star count, last strip with red background), with a large circular avatar (pink outline) zooming in on the right side.
- Music: User-provided audio file (see notes), no voiceover.
Hard Rules
- Cover must be a real captured page frame: Use
scripts/capture_frame.pyto capture yourself, or use a headless browser screenshot. Do not use AI to generate/redraw the profile page (it will fabricate repository names and fake data), and do not reuse screenshots provided by others as the cover without attribution. - All on-screen text comes only from config: Numbers, repository names, summary lines are all locally typeset (PIL), without using AI video generation to carry text — this is the fundamental reason why this pipeline has zero text errors and no irrelevant brand logos throughout the video.
- Project introductions must be based on actual README reading: Sort by Star count and take the top 2–3 projects, open their READMEs, distill each into 4 one-sentence summaries, then write them into the config. Merely using the repository list description as a substitute is not acceptable. If the 3rd Star-ranked project is thin on content (e.g., README has only one line), merge it into Card 3's overview and explain this during delivery.
- Frame-by-frame self-check before delivery: At minimum, check the cover's starting frame, each card's fully-formed frame, and the ending frame; if any text or number issues are found, fix them before delivery and honestly inform the user of any remaining imperfections.
Steps
1. Research the Account
- Open
https://github.com/<user>?tab=repositories&sort=stargazersto get the Star ranking and counts. - Open the profile page to confirm: display name, followers, total repositories, contributions in the last year, pinned repositories.
- Open the README for each of the top 2–3 Star-ranked projects, write 4 summary points per project (function/features/technology/characteristics), and list 4–6 technical tags.
2. Prepare Assets (assets/)
python3 scripts/capture_frame.py <user> assets/page_frame.png # Homepage screenshot (real frame)
curl -L https://github.com/<user>.png -o assets/avatar.png # Avatar (or crop from homepage)
# BGM: Place the user-provided audio in assets/bgm.m4a (optional)
3. Write Config
Copy examples/config.example.json to config.json, then fill in the real data and summaries from step 1 (paths relative to the config directory or use absolute paths).
4. Render
python3 scripts/render_promo.py --config config.json --out out.mp4
Requires: Python 3 + Pillow + numpy, ffmpeg, Noto Sans CJK font (the script will search common paths automatically).
5. Frame-by-Frame Self-Check and Deliver
Use ffmpeg to extract one frame at 0.4s / the midpoint of each segment / the end, and verify: numbers match Star counts, text has no misalignment, the cover is a real page, and the ending strips are complete. Send the final video to the user along with a 'structure explanation + known imperfections' note.
Config Field Quick Reference
| Field | Description |
|---|---|
username / display_name | Account name / display name (used in ending strips) |
page_frame / avatar / bgm | Asset paths; bgm can be null (no music) |
cards | Exactly 3 cards: {name, sub, n1, l1, n2, l2, rows[4], chips[]}; n1/l1 are red large number + label (e.g., 303 / Stars), n2/l2 are blue (e.g., 33 / Forks); Card 3 can use Repositories / Contributions |
finale_strips | 4 paper strip texts, last strip automatically gets red background |
durations | Optional: {cover, cards[3], finale} in seconds; total minus transitions should be ≤28 |
Notes
- Music Copyright: This repository does not include any BGM. Only use audio provided by the user or that you have the rights to use; do not redistribute audio tracks extracted from others' videos.
- The screenshot service (thum.io) may return a placeholder image on the first request due to normal queuing; the script handles this by fetching twice.
- The absence of irrelevant brand logos (like Apple) throughout the video is a design result (local rendering with no external assets), requiring no additional processing.