skill
linkedin-gif-post-skill
Claude Code skill: turn a resource into a LinkedIn post with an animated GIF in your brand and a caption that sells the click
Set up
Skills are installed by placing their folder where your agent loads skills.
The download comes from github.com/josueh04/linkedin-gif-post-skill itself, not from our server, so what you get is exactly what its author published.
Install instructions come from the README
README
synced Oct 22, 2026A Claude Code skill for anyone who shares research, checklists, guides or playbooks on LinkedIn and gets little back. It reads the resource and your website, then designs an animated graphic for that resource: its own concept, layout and motion, previewing what the resource contains in your colors and fonts. It is not a template with your words swapped in. It renders the graphic locally with HyperFrames, checks it against LinkedIn's limits, and rewrites the caption so the first two lines say what the reader gets.
It comes out of a real production: a frame-by-frame study of eight high-performing lead-magnet posts and 192 posts by their authors, then a week of posts made, measured and remade. Every rule in it exists because a version without it did worse.
[!IMPORTANT] Alpha. The skill and the scripts work end to end on macOS, and the gates pass on every graphic above. Each graphic is composed for its resource from a blank frame, with the method in
compose.md. Two templates ship as worked examples:blankandresearch_bento. The Roadmap says what is next.
Installation
1. Get the skill
git clone https://github.com/josueh04/linkedin-gif-post-skill.git
cp -R linkedin-gif-post-skill/skills/linkedin-gif-post ~/.claude/skills/
pip install pillow numpy
To keep the skill inside one project, copy it into that project's .claude/skills/ instead.
| Need | Detail |
|---|---|
| macOS | Linux should work (untested) |
| Claude Code | Any version with skills |
| Node.js | 22 or newer (HyperFrames requires it) |
| Python | 3.9 or newer, with Pillow and numpy |
| ffmpeg | brew install ffmpeg on macOS |
| Google Chrome | HyperFrames renders through it |
2. Ask for a post
In Claude Code:
Make a LinkedIn GIF post for this research: https://your-site.com/research/your-piece
Our site is https://your-site.com
The skill:
- reads the resource;
- extracts your brand into
brand.jsonand shows it to you; - builds the animation and shows you a contact sheet before it renders;
- renders and gates the GIF;
- writes the caption.
You get graphic.gif, graphic-frame.png and caption.md in posts/<slug>/.
3. Or run it by hand
cd ~/.claude/skills/linkedin-gif-post
python3 scripts/brand_extract.py https://your-site.com --out posts/my-post
python3 scripts/new_animation.py --out posts/my-post --brand posts/my-post/brand.json
# edit posts/my-post/animation/index.html: header, cards, CTA
python3 scripts/snapshot_sheet.py posts/my-post/animation
python3 scripts/render_gif.py posts/my-post/animation
python3 scripts/gif_gate.py posts/my-post/graphic.gif
Why This Skill Exists
#1: The Image Repeats the Caption
The Problem. Most resource posts use a static text card or a stock photo, which gives the scroll no reason to stop and the reader no preview of the resource.
The Fix. The GIF shows the resource itself as a working system. A method appears as a line of stations, the checklist is scanned row by row, and the data is called out pair by pair. The cards are dense on purpose: dense enough to read as a lot of value, too detailed to absorb in the feed.
#2: The First Two Lines Waste the Preview
The Problem. LinkedIn shows about 210 characters before "...see more". Captions spend them on context, a quote chain or a thesis, and the offer shows up in paragraph three.
The Fix. copy.md puts the reader's stake in line 1, one number per line with its meaning, and a numbered list that mirrors the GIF's cards. Lead-magnet captions with a numbered list drew 1.53x their author's usual comments.
#3: Animation That Looks Cheap or Breaks LinkedIn's Limits
The Problem. A screen recording turned into a GIF can be 10 MB and over LinkedIn's 250-frame limit. It can open on a blank frame and cut visibly at the loop.
The Fix. Compositions are HTML with a GSAP timeline, rendered deterministically. gif_gate.py blocks a GIF unless it passes all eight gates: frames, bytes, size, the loop flag, fps, a seamless loop, enough motion, and a solid CTA band. When a GIF runs heavy, weight_map.py shows which area costs the bytes.
#4: Off-Brand Graphics
The Problem. Templates come in someone else's colors and fonts, and a near-copy of a competitor's post reads as a copy.
The Fix. brand_extract.py reads your site's CSS variables, palette, fonts and wordmark, and downloads the fonts (OFL) so renders stay local. Every color and font in the template is a token. analyze_reference.py measures a post you admire, so you can borrow the principle, not the layout.
#5: Every Post Looks the Same
The Problem. A template tool gives every post the same layout with new words, and after the second post the feed sees the same picture again.
The Fix. compose.md is the method for designing from scratch:
- name the resource's shape (a process, a checklist, a transformation, a comparison...);
- write a one-sentence concept;
- sketch the zones;
- plan the beats with a library of seek-safe motion patterns;
- build on a
blankframe that carries only the brand, the header and the CTA.
When a composition works, save_template.py keeps it for the next resource of the same shape.
What's Inside
- SKILL.md: the workflow, from reading the resource to checking the live post, and the rules with their reasons.
- Scripts
brand_extract.py: colors, fonts and logo from a website, intobrand.json.new_animation.py: copies a template into a post folder and applies the brand tokens.snapshot_sheet.py: ten moments of the loop on one sheet, to review before rendering.render_gif.py: renders with HyperFrames and encodes the GIF. If the file is too heavy, it steps down colors, dithering, fps and width.gif_gate.py: the eight release gates.weight_map.py: where a GIF spends its bytes.analyze_reference.py: stats, a frame sheet and a motion heat map of any public LinkedIn post.save_template.py: keeps a composition that worked as a template, with a README to fill in.
- Templates:
blank: the frame only (brand tokens, header slots, the CTA band, an empty timeline), and the starting point for every original composition.research_bento: a worked example for a checklist-plus-data research post.
- References: compose (read it first), design, copy, HyperFrames notes, evidence.
What You Need to Provide
| Input | Required? | How |
|---|---|---|
| The resource | Yes | A URL or a file: the research, checklist, guide or playbook the post shares |
| Your website | Recommended | A URL; the brand is read from its CSS. Without it, you edit the tokens by hand |
| A logo file | Optional | An SVG or PNG. Without it, the template uses your wordmark as text |
| A post you admire | Optional | A LinkedIn URL for analyze_reference.py |
[!NOTE] Everything renders on your machine. The scripts turn off HyperFrames' anonymous telemetry (
DO_NOT_TRACK=1) and unsetGEMINI_API_KEY, so no frames leave the machine.brand_extract.pyfetches only the site you give it and the Fontsource CDN. Claude reads the resource you share, so it is sent to the model as context.
Roadmap
| Phase | What | Status |
|---|---|---|
| 1. Core | The skill, the scripts, brand extraction, caption rules and the gates | Done on macOS |
| 2. Compose from scratch | compose.md, the blank frame, the motion library and save_template.py | Done. Tested with a fresh agent on a new resource |
| 3. More worked examples | Radar, core, constellation and stack as brand-token templates, like the gallery | Next |
| 4. Pilot | Someone outside the project, with their own brand and resource | Next |
| 5. Distribution | A Claude Code plugin and npx skills add | Later |
License
MIT. The bundled fonts are under the SIL Open Font License 1.1 (licenses). It is built on HyperFrames by HeyGen (Apache-2.0) and GSAP, which run at render time and are not bundled. The logos in the gallery belong to their owners and appear only as examples of output.