LinkedIn carousel
A carousel is a document upload, not an image post. That single fact decides the format,
and getting it wrong is why most carousels look cropped.
When to use this
Repurposing an article, case study, lesson or set of notes into a LinkedIn carousel.
Also for the hook-and-structure work before any slides exist.
The format, which is not negotiable
- PDF, uploaded as a document. Not a set of images.
- 1080 x 1350 (4:5 portrait). LinkedIn also accepts 1:1, but 4:5 takes the most
vertical space in the feed, so it is the default.
- 8 to 12 slides. Under 8 does not justify the swipe; over 12 and the drop-off is
steeper than the reach gain.
- Fonts embedded. A PDF with linked fonts renders as fallback boxes on LinkedIn's
server-side thumbnailer, and you will not see it in your own preview.
- Under 100 MB, which is never the binding constraint if you are not embedding photos.
The structure that works
| Slide |
Job |
| 1 |
Hook. One claim, large. It has to work as a static thumbnail, because that is all most people see |
| 2 |
Stakes. Why this costs the reader something today |
| 3-9 |
One idea per slide. A heading and at most 25 words. If it needs 40, it is two slides |
| 10 |
Recap. The three things worth remembering |
| 11 |
CTA. One action, spelled out |
Rules that hold across all of them:
- One idea per slide. The most common failure is slide 4 carrying three points because
the source paragraph had three sentences.
- Slide 1 has no context. It cannot say "as I mentioned". It is a cold open.
- Readable at thumbnail size. Headline at least 48pt at 1080 wide. Hold the slide at
20% zoom; if you cannot read the headline, nobody in the feed can.
- No paragraph anywhere. If a slide has a paragraph, it wanted to be an article.
How to run it
Write the outline first, as text. Slide number, headline, body. Get the structure
approved before rendering anything. Regenerating a deck because slide 3 was wrong is
ten seconds; rewriting after design is not.
Put it in a JSON deck file:
{
"theme": { "accent": "#84CC16", "background": "#0B1020", "text": "#F8FAFC" },
"slides": [
{ "kind": "hook", "headline": "Je AI-agent leest je documenten verkeerd",
"sub": "En hij zegt het er niet bij" },
{ "kind": "point", "headline": "03/04/2026",
"body": "3 april of 4 maart. Zonder context is dat een gok, en een gok in je boekhouding." },
{ "kind": "cta", "headline": "Wil je dit goed hebben?",
"body": "Stuur me een bericht.", "handle": "@alisina" }
]
}
Render:
python3 scripts/render.py deck.json -o carousel.pdf
The renderer produces 1080x1350 pages with embedded fonts and reports the page count
and file size so you can check both before uploading.
Check at thumbnail size before you post. Every time.
Writing the hook
The hook slide decides everything downstream. Four openings that work, in rough order of
reliability:
- A cost. "Deze fout kost je een kwartaal aan verkeerde cijfers."
- A contradiction. "Snellere agents maken je trager."
- A concrete number. "Zes van de tien facturen die ik zag hadden een verkeerde datum."
- A named mistake. "De fout die iedereen maakt met SKILL.md."
Openings that do not work: a question the reader can answer with "no", a definition, and
anything beginning "In het huidige digitale landschap".
The accompanying post
The carousel does not stand alone. The post text above it carries the hook again in
plain words and ends with one question. Three to five lines. The first two lines are what
shows before "see more", so the hook has to land there.
Files
scripts/render.py — deck JSON to a 1080x1350 PDF with embedded fonts. No design tool
needed.
references/deck-schema.md — every slide kind and its fields, with layout notes.
1---2name: linkedin-carousel3description: Turn an article, a case or a set of notes into a LinkedIn carousel PDF — slide structure, per-slide copy, and a renderer that produces the exact aspect ratio LinkedIn accepts. Use when asked to make a carousel, a slide deck for social, or to repurpose a long piece into slides.4---56# LinkedIn carousel78A carousel is a document upload, not an image post. That single fact decides the format,9and getting it wrong is why most carousels look cropped.1011## When to use this1213Repurposing an article, case study, lesson or set of notes into a LinkedIn carousel.14Also for the hook-and-structure work before any slides exist.1516## The format, which is not negotiable1718- **PDF**, uploaded as a document. Not a set of images.19- **1080 x 1350** (4:5 portrait). LinkedIn also accepts 1:1, but 4:5 takes the most20 vertical space in the feed, so it is the default.21- **8 to 12 slides.** Under 8 does not justify the swipe; over 12 and the drop-off is22 steeper than the reach gain.23- **Fonts embedded.** A PDF with linked fonts renders as fallback boxes on LinkedIn's24 server-side thumbnailer, and you will not see it in your own preview.25- **Under 100 MB**, which is never the binding constraint if you are not embedding photos.2627## The structure that works2829| Slide | Job |30|-------|-----|31| 1 | **Hook.** One claim, large. It has to work as a static thumbnail, because that is all most people see |32| 2 | **Stakes.** Why this costs the reader something today |33| 3-9 | **One idea per slide.** A heading and at most 25 words. If it needs 40, it is two slides |34| 10 | **Recap.** The three things worth remembering |35| 11 | **CTA.** One action, spelled out |3637Rules that hold across all of them:3839- **One idea per slide.** The most common failure is slide 4 carrying three points because40 the source paragraph had three sentences.41- **Slide 1 has no context.** It cannot say "as I mentioned". It is a cold open.42- **Readable at thumbnail size.** Headline at least 48pt at 1080 wide. Hold the slide at43 20% zoom; if you cannot read the headline, nobody in the feed can.44- **No paragraph anywhere.** If a slide has a paragraph, it wanted to be an article.4546## How to run it47481. **Write the outline first, as text.** Slide number, headline, body. Get the structure49 approved before rendering anything. Regenerating a deck because slide 3 was wrong is50 ten seconds; rewriting after design is not.51522. **Put it in a JSON deck file:**5354 ```json55 {56 "theme": { "accent": "#84CC16", "background": "#0B1020", "text": "#F8FAFC" },57 "slides": [58 { "kind": "hook", "headline": "Je AI-agent leest je documenten verkeerd",59 "sub": "En hij zegt het er niet bij" },60 { "kind": "point", "headline": "03/04/2026",61 "body": "3 april of 4 maart. Zonder context is dat een gok, en een gok in je boekhouding." },62 { "kind": "cta", "headline": "Wil je dit goed hebben?",63 "body": "Stuur me een bericht.", "handle": "@alisina" }64 ]65 }66 ```67683. **Render:**6970 ```bash71 python3 scripts/render.py deck.json -o carousel.pdf72 ```7374 The renderer produces 1080x1350 pages with embedded fonts and reports the page count75 and file size so you can check both before uploading.76774. **Check at thumbnail size before you post.** Every time.7879## Writing the hook8081The hook slide decides everything downstream. Four openings that work, in rough order of82reliability:83841. **A cost.** "Deze fout kost je een kwartaal aan verkeerde cijfers."852. **A contradiction.** "Snellere agents maken je trager."863. **A concrete number.** "Zes van de tien facturen die ik zag hadden een verkeerde datum."874. **A named mistake.** "De fout die iedereen maakt met SKILL.md."8889Openings that do not work: a question the reader can answer with "no", a definition, and90anything beginning "In het huidige digitale landschap".9192## The accompanying post9394The carousel does not stand alone. The post text above it carries the hook again in95plain words and ends with one question. Three to five lines. The first two lines are what96shows before "see more", so the hook has to land there.9798## Files99100- `scripts/render.py` — deck JSON to a 1080x1350 PDF with embedded fonts. No design tool101 needed.102- `references/deck-schema.md` — every slide kind and its fields, with layout notes.