Make Thumbnail
Skill8 starsChanged 5 months agoMITView on GitHub
Design and render a 1280x720 YouTube thumbnail for one of your videos, on your own brand, using the bundled Thumbnail Studio. Headline-first layout with a hero visual on the right, distilled from 22+ iterations of design corrections. Takes the packaging concept from your channel plan. No accounts needed for the render.
- Reads credentials
In this repository101 other files it gives its agents.
- templates/CLAUDE.mdCLAUDE.md
- Add a FieldSkill
- Assemble Content PackSkill
- Assemble PackSkill
- Audit My AutomationsSkill
- Audit My DataSkill
- automate-thisSkill
- Brand My WorkspaceSkill
- Break Down A ChannelSkill
- Build Brand StrategySkill
- Build Customer VoiceSkill
- Build DocumentSkill
- Build FormSkill
- Build Knowledge Base From DocsSkill
- Build My ProofSkill
- Build My VoiceSkill
- Build Social StrategySkill
- Build SpreadsheetSkill
- Build Work Order ProcessSkill
- Cash Flow ForecastSkill
- Coach My CallsSkill
- Compare DocumentsSkill
- Connect A ToolSkill
- Delegate This WorkSkill
- Describe A ProductSkill
- Design My ScenesSkill
- Design Nurture SequenceSkill
- draft-replySkill
- Email Me A ReportSkill
- Estimate My BASSkill
- Extract DocumentSkill
- Find My Next MoveSkill
- Five Day ChallengeSkill
- Follow-up RadarSkill
- Form RadarSkill
- Get Found OnlineSkill
- Grill Me On This DecisionSkill
- import-from-anywhereSkill
- lead-triageSkill
- Learn My BusinessSkill
- Lint DocumentSkill
- Lint FormSkill
- Lint Nurture SequenceSkill
- log-this-callSkill
- make-it-happenSkill
- Make My VideoSkill
- Make Product DemoSkill
- Make Social PostSkill
- missed-call-recoverySkill
- Nurture HealthSkill
- Onboard Team MemberSkill
- Outstanding DocumentsSkill
- Outstanding InvoicesSkill
- Package My VideoSkill
- Plan My AdsSkill
- Plan My ContentSkill
- Plan My RoadmapSkill
- Plan My YouTubeSkill
- Prep For CallSkill
- Price My WorkSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
6 rules. About 0 are common, 3 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 58
If a plan-my-youtube pipeline row or a <slug>.script.json packaging block exists for this video, read it first: the working title, the …
- Very specific: line 64
A working title already picked?: If yes (from the channel plan or the owner), reuse it for SEO consistency.
- Distinctive: line 90
Run the interactive helper:
- Distinctive: line 120
Make sure the dev server is running:
- Distinctive: line 159
If something looks off in the rendered PNG that looked fine in the browser, the JSDoc has a "Common mistakes" section worth reading.
- Very specific: line 198
Publish is optional: If the operator wants the PNG to stay local (post manually to YouTube studio), skip publish.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Make Thumbnail
You're helping the owner design and render a YouTube thumbnail for one
of their videos using the bundled studio at studio/thumbnails/. The
studio is a Vite + React + Puppeteer pipeline producing 1280x720 PNGs
that can either stay local or be uploaded to the owner's workspace (when
connected). The thumbnail carries the owner's own brand, read from the
root brand/brand.json, so every render is on their palette and their
name.
Where the concept comes from. Inside the YouTube factory, the packaging concept (title options, angle, thumbnail concept) arrives from
plan-my-youtube's pipeline row for the video, so you are executing a concept rather than inventing one. The studio's craft is brand-agnostic: it renders on whatever brandbrand/brand.jsoncarries, for any kind of video.
One studio, one brand. The bundled studio/thumbnails/ on the root
brand/brand.json is the home, and that resolves itself for a single-brand
install. If the working directory happens to hold a second thumbnail studio or
a second brand kit (an owner running two businesses), confirm which brand this
video belongs to before rendering and say which studio you used. Never render
into a studio locked to a different brand: off-brand output, and its own lint
will reject it.
The design rules + title patterns + banned framings live in three canonical files inside the studio (read them BEFORE designing anything, not after):
| File | What's in the header |
studio/thumbnails/YOUTUBE_TITLES.md | YouTube title patterns + description template + banned word table + lint rules |
studio/thumbnails/src/templates/YouTubeThumbnail.jsx (JSDoc lines 1-250) | Canonical layout, full brand palette, headline writing guide, hero UI master rule, common mistakes |
studio/thumbnails/src/templates/heroes/index.js (header comment) | The 6 hero family patterns, step-by-step "add a hero" instructions, anti-patterns |
The methodology distilled from those three is also summarised at
knowledge/youtube-thumbnail-method.md.
Step 1 — Confirm the brief
If a plan-my-youtube pipeline row or a <slug>.script.json packaging
block exists for this video, read it first: the working title, the
angle, and the thumbnail concept are already chosen there, so you're
executing a concept, not inventing one. Otherwise, ask the owner for:
- What's the video about? One-sentence outcome the viewer gets.
- A working title already picked? If yes (from the channel plan or the owner), reuse it for SEO consistency. If no, you'll generate one following the YOUTUBE_TITLES.md patterns, on the owner's brand.
- Hero family — what's the visual centrepiece going to be? This is
the step whose size varies, so be honest with the owner about which
path they're on:
- A shipped hero fits, so reuse it (quick, JSON-only). The registry
(
heroes/index.js) ships two families. The CRM/workspace surfaces (pipeline, contacts, forms, approvals, e-signing, reports, and so on) carry software topics. And three topic-agnostic starter heroes carry trade and tutorial videos:step-checklist(a numbered how-to stepper),before-after(a starting-point to now transformation), andbig-number(one bold stat, cost, or result). So a plumbing how-to reusesstep-checklistand a "real cost of X" video reusesbig-number: set"hero": "<key>"insamples.jsonand you're on the fill-in-JSON path. - Nothing fits, so a new hero gets authored (the rare case now). Only
when none of the stock heroes carry your topic. An unknown key falls
back to the generic activity card, which fails the squint test, so
author a genuinely new React hero component and register it (real React
work, following the "Adding a hero" steps in
heroes/index.js), not a JSON edit. Say so before you start. With the starter heroes in stock, a trade or tutorial video usually reuses one, so this is the exception.
- A shipped hero fits, so reuse it (quick, JSON-only). The registry
(
Step 2 — Add the design to samples.json
Run the interactive helper:
cd studio/thumbnails
npm run makeIt asks for a key (lowercase, kebab-case), headline (4-7 words), accent
word (which word in the headline gets the brand gradient fill), and the
hero registry key. Writes a new entry to src/data/samples.json.
If the helper isn't available (the operator interrupted it / running
non-interactively), edit src/data/samples.json directly. The minimum
shape is:
"my-video-key": {
"composition": null,
"template": "youtube-thumbnail",
"data": {
"headline": "Forms That Auto-Fill Your CRM",
"accentWord": "Auto-Fill",
"hero": "forms",
"title": "How to Build & Send Forms in Your Workspace"
}
}Step 3 — Iterate in the browser
Make sure the dev server is running:
npm run dev # opens at http://localhost:3210The left sidebar shows the new design. Click it. The right pane renders
the live preview at actual pixel dimensions. Tweak samples.json or the
hero / template files — Vite hot-reloads.
Quality checks before declaring it shipped:
- Title check — does the title pass YOUTUBE_TITLES.md's own rules (it owns the word band and the lint, so read it rather than a copy here), and does it lead with the viewer's outcome?
- Headline check — does the on-thumbnail headline have one accent word that appears VERBATIM in the title? Read the JSDoc in YouTubeThumbnail.jsx.
- Hero check — does the hero look like real product UI (not a configurator)? Read the heroes/index.js header.
- Guardrails — no third-party vendor names visible in the thumbnail, no
invented number or claim, and the headline names something concrete rather
than a vague mood (a vague headline is a craft failure: there is nothing for
the eye to catch). Whether the owner frames it as a win or as a problem they
solve is THEIR call, not this skill's
(
knowledge/content-rules.md).
Step 4 — Render to PNG
npm run shoot <design-key>That runs puppeteer + real Chrome and writes the PNG to
studio/thumbnails/output/. Opens it automatically when done. Inspect
it at 100% — there are CSS features (background-clip:text, backdrop-
filter) that ONLY render correctly via real Chrome, not via in-browser
rasterisation libraries.
If something looks off in the rendered PNG that looked fine in the browser, the JSDoc has a "Common mistakes" section worth reading.
Step 5 — Publish (optional, when connected)
The keyless deliverable is the rendered PNG. If the operator has a connected
workspace, you can also upload the PNG to their own workspace, in the
Files > Images area under a YouTube Thumbnails folder:
npm run publish <design-key>Auth resolves the same way as the BOS Python tools: $TRUSTPAGER_API_KEY
env var first, then ~/.claude/bos.json. The script handles
idempotency — re-running publish with the same design key skips if the
file's unchanged, renames if the title shifted, replaces only on
--replace.
To publish every design in one shot:
npm run publish -- --all # skip existing
npm run publish -- --all --replace # wipe + re-uploadHard rules
- Don't invent design rules. The three canonical files in the studio (README, YOUTUBE_TITLES.md, the templates JSDoc) are the source of truth — they distil real corrections from 22+ iterations. Read them.
- The operator owns the title. Generate a draft if asked, but don't ship without their nod.
- Render before declaring done. A design that looks right in the
Vite dev server can still misrender in puppeteer if it uses unusual
CSS features. Run
npm run shootand look at the actual PNG. - Examples ≠ inspiration to copy. The 6 PNGs in
studio/thumbnails/examples/are the studio's bundled example thumbnails. They show the design DNA but are not templates to clone verbatim. - Publish is optional. If the operator wants the PNG to stay local
(post manually to YouTube studio), skip publish. The shoot output in
studio/thumbnails/output/is the deliverable.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

