Use this when filling the slides array so slides render correctly: no truncation, no missing elements, and a clear story.
Rule of thumb: Stay under the limits below. After editing JSON, run npm run render -- content/your-file.json --output output/check and look at the images/PDF to confirm nothing is cut off or missing.
Mobile-optimized design: Body text is set to 24pt+ (2rem/32px) following LinkedIn carousel best practices for mobile readability. This ensures content remains readable on phones in portrait mode.
Slides are 630×1200px (vertical). Text that exceeds the allowed lines is cut with an ellipsis (…). The engine does not auto-shrink font size.
| Element type | Max lines (approx.) | If you exceed it |
|---|---|---|
| Cover title | 2 | Second line is cut |
| Cover subtitle | 3 | Fourth line is cut |
| Bullet list item | 2 per bullet | Third line is cut |
| Title–paragraph title | 2 | Third line is cut |
| Title–paragraph body | 5 | Sixth line is cut |
| Outro CTA | 2 | Third line is cut |
| Outro supporting text | 4 | Fifth line is cut |
Recommendation: Keep each piece of copy short. Prefer one idea per slide.
Use these as a ceiling. Actual fit depends on word length and font. Note: Body text is now larger (2rem/24pt) for mobile optimization, so effective character counts are slightly lower than before.
| Field | Approx. max | Notes |
|---|---|---|
title |
~100 chars | 2 lines; keep punchy |
subtitle |
~200 chars | 3 lines; one clear sentence or two short |
author |
~40 chars | 1 line |
swipeLabel |
~25 chars | 1 line (e.g. "Swipe for more") |
brandFooter |
~40 chars | 1 line |
Checklist: At least title. Prefer author + subtitle + swipeLabel so the slide feels complete.
| Field | Approx. max | Notes |
|---|---|---|
title |
~80 chars | 1–2 lines; short heading |
bullets |
3–6 items | Required. 4–5 is ideal |
| each item | ~100 chars | 2 lines per bullet max |
Checklist: title + bullets (array with 3–6 strings). No nested bullets; one phrase or short sentence per item.
Avoid: Long bullets like full sentences with multiple clauses. Split into more bullets or shorten.
| Field | Approx. max | Notes |
|---|---|---|
title |
~80 chars | 2 lines max |
body |
~280 chars | 4-5 lines max; 2–3 sentences is ideal (larger font for mobile) |
variant |
— | Use "light" for white bg (alternate decks) |
Checklist: title + body. Add variant: "light" when you want a white slide instead of dark green.
Avoid: Long paragraphs. If the body runs over ~300 chars, shorten or split into another slide.
| Field | Approx. max | Notes |
|---|---|---|
ctaText |
~70 chars | 2 lines; clear and actionable |
supportingText |
~200 chars | 3-4 lines; one short sentence is ideal (larger font for mobile) |
url |
any | Shown in footer; keep readable |
handle |
~30 chars | e.g. @username |
Checklist: ctaText (required). Prefer supportingText and either url or handle so the CTA is clear and actionable.
Avoid: Long CTA (e.g. two full sentences). One short line + one supporting line works best.
- Section divider:
headlineortitle(short). Optional:number,body(1–2 lines). - Quote:
quote(~250 chars / ~5 lines) +author. Optional:role. - Data/stats:
stat(short, e.g. "73%") +explanation(~150 chars). - Two-column:
leftTitle,leftBullets[],rightTitle,rightBullets[]— same number of bullets on each side. - Pros/cons:
pros[]andcons[]— 3–4 items each; keep each item to 1–2 lines. - Before/after:
beforeContent,afterContent— short blocks (~150 chars each). - Numbered steps:
title+steps[](3–5 items); each step 1–2 lines. - Definition:
term+definition(~200 chars). Optional:whyItMatters(1–2 lines). - Image + caption:
imageUrl(required) +caption(1–2 lines). Use a consistent aspect ratio. - Agenda:
sections[](list of section names). Optional:showProgress: true. - Recap:
takeaways[](3–5 items); each 1–2 lines.
- Cover: Include at least
title. Addauthorandsubtitleso the opener is clear; addswipeLabelfor a clear next step. - Content slides: Every slide must have the required fields for its
type(see FRAME_TEMPLATES.md). Missing required fields show as "Untitled" or empty. - Outro: Always set
ctaText. Addurlorhandleso people know where to go; addsupportingTextto explain sharing or next step. - Alternating look: Use
variant: "light"on sometitle-paragraphslides so the deck alternates dark/light and stays easy to scan. - Bullet count: For bullet-list, use 3–6 items. For two-column, keep left and right bullet counts equal.
- Every slide has a
type(or rely on defaulttitle-paragraph). - Cover has
title; optionallyauthor,subtitle,swipeLabel. - Every bullet-list has
titleandbullets(array, 3–6 items). - Every title-paragraph has
titleandbody. - Outro has
ctaText; optionallysupportingText,url, orhandle. - No single field is obviously over the character limits above.
- Run
npm run renderand check the output folder for truncation or missing text.
For full field reference and optional fields, see FRAME_TEMPLATES.md.