Linkedin Carousel logo

Linkedin Carousel

Community
roslove44
linkedin-carousel

Creates the slides of a LinkedIn carousel, both kinds. Use when the user wants a "LinkedIn carousel", a "LinkedIn document post", a "LinkedIn PDF carousel", a "LinkedIn carousel ad" or "several slides that swipe" for a LinkedIn project. Two paths, and the choice is asked rather than assumed. Either an organic document post (slides assembled into a PDF, what LinkedIn actually paginates as a swipeable carousel in the feed), or a carousel ad in Campaign Manager (1:1 PNG cards). Produces N .tsx templates in a dedicated subfolder sharing a common theme, plus the PDF for the organic path. Requires a project with its brand.md in place.

Overview

Publisherroslove44
Repositorybrand-artisan
Skill namelinkedin-carousel
Stars
5
Forks
0
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by roslove44 on GitHub. Read the source before you install it.

Installation

Install the Linkedin Carousel AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/roslove44/brand-artisan/tree/main/skills/linkedin-carousel
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/roslove44/brand-artisan.git /tmp/brand-artisan
mkdir -p .claude/skills
cp -r /tmp/brand-artisan/skills/linkedin-carousel .claude/skills/linkedin-carousel
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Linkedin Carousel in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Linkedin Carousel on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Linkedin Carousel is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

linkedin-carousel: slides for a LinkedIn carousel

Goal: produce the N slides of a LinkedIn carousel, coherent with each other and aligned with the guidelines. A carousel is not N independent images: it is a series that tells something. Coherence across slides is the heart of the deliverable.

This is a specialization of new-template. Same conventions: the Template contract, assets through brand(), fonts discovered in fonts/, export default ... satisfies Template.

0. Prerequisites (blocking)

The chain project -> template folder -> guidelines must exist:

  • Resolve <project> (from the arguments, otherwise ask).
  • Check templates/<project>/ and brands/<project>/brand.md.
  • Missing guidelines or project -> STOP: ask for /new-project <project> first. No visual without guidelines (CLAUDE.md rule).

1. Which carousel? (blocking, ask first)

"LinkedIn carousel" covers two unrelated formats. Settle it before anything else: it decides the ratio, the number of slides, the amount of text and the deliverable. Don't pick in silence (CLAUDE.md principle #1).

A. Document post (organic)B. Carousel ad (Campaign Manager)
WhereThe regular feed, from a profile or a pageSponsored Content, paid
What you uploadone PDF, LinkedIn paginates itN separate images
Deliverableout/<project>/<name>.pdfout/<project>/<name>/card-*.png
Default ratio4:5, 1080×13501:1, 1080×1080 (only ratio allowed)

Ask, with A pre-selected. "I want a LinkedIn carousel" for a post, a tip series, a mini-guide is path A nine times out of ten: put the question so that it settles in one word ("Document post, the organic one? Or a Campaign Manager carousel ad?"), never so that it reads as a quiz.

Unless the request already settled it. "carousel ad", "for Campaign Manager", "sponsored", a budget -> path B. "document post", "PDF carousel" -> path A. Nothing left to ask then: state the path being taken and move on.

Posting the PNGs is not path A. Several images attached to a LinkedIn post come out as a mosaic of thumbnails, not as slides you swipe. The swipeable carousel in the feed is the document viewer, and it only accepts a document. Hence the PDF: the engine renders the slides, then assembles them.

2. Constraints (to respect)

Path A, document post

PointValueStatus
FilePDF (also PPT, PPTX, DOC, DOCX)Official LinkedIn
Weight≤ 100 MBOfficial LinkedIn
Pages≤ 300Official LinkedIn
Number of slides3 to 10Usage
Ratio4:5 (1080×1350), or 1:1 (1080×1080)Usage
  • PDF over the Office formats: it is the one LinkedIn converts most reliably, and the one the engine produces.
  • 4:5 by default: portrait takes the most vertical space in the feed, which buys dwell time. 1:1 is legitimate, just smaller on mobile.
  • Same size for every slide: LinkedIn takes the ratio of the whole document from its first page, so a stray page gets letterboxed.
  • A document post is read on a phone: the 1080 px width lands around 400 px wide. Body text under ~32 px in the template becomes unreadable there. Keep the headline large and the body short.
  • The post's text goes in the LinkedIn post, not in the slides.

Path B, carousel ad

PointValueStatus
Number of cards2 to 10 (sweet spot 3-5)Official LinkedIn
Ratio1:1 onlyOfficial LinkedIn
Size / card1080×1080 (max 4320×4320)Official LinkedIn
FormatJPG or PNG (non-animated GIF)Official LinkedIn
Weight / card≤ 10 MBOfficial LinkedIn
Headline / card≤ 45 charactersOfficial LinkedIn
  • 1:1 is mandatory: no 4:5 or 9:16 in a LinkedIn carousel ad (this differs from Facebook). Every card at the same format.
  • The intro text and the headlines/links are set in Campaign Manager, not in the image: one idea per card.

3. Frame it (ask, don't guess)

  • Name of the carousel: a kebab-case slug, default linkedin-carousel. It is the subfolder templates/<project>/<name>/. Check it does not exist.
  • Narrative mechanic (see §4): a story, one slide per product, a top N, a tutorial, before/after. It dictates the design.
  • Number of slides, per the table above.
  • Content of each slide: a short message + its role (hook, development, CTA).
  • Read brands/<project>/brand.md: palette, type, logo variants, don'ts. If the project already holds a .tsx, read it as a reference.
  • Read brands/<project>/project.md if it exists: set the tone and the claims (don't invent figures or promises). If absent -> ask for the tone and the message rather than guessing.

4. The spirit: arrange it so it lands

Narrative mechanics (pick ONE)

  • Sequential story: hook -> problem -> solution -> proof -> CTA.
  • One slide = one product / one offer: each slide legible on its own, constant background and position.
  • Top N / tips: slide 1 = the title, slides 2..N = one item each, the last = the CTA. Number the slides.
  • Step-by-step tutorial: one step per slide, each visual self-supporting.
  • Before / after: strong contrast between the first and the last slide.

Slide 1 = the hook

It is the only one fully visible before the swipe: a single message, strong contrast, one element that creates curiosity. Don't explain everything here.

Coherence across slides (the heart of it)

Identical palette and type; the logo in a fixed, discreet position; constant placements; a visual through-line (a color or a progress marker); each slide legible on its own.

LinkedIn tone

A professional audience: a register of added value (an insight, a data point, a business benefit, proof), a measured CTA. Avoid the "aggressive promo" tone.

Rising CTA

Soft at the start, conversion on the last slide. On path A the last slide carries the whole call to action, since a document post has no per-slide link; on path B each card has its own link in Campaign Manager.

5. Write the slides

Structure: one subfolder per carousel, one .tsx per slide, plus a shared theme.ts.

templates/<project>/<name>/
  theme.ts        <- shared palette + layout (pure TS, NO JSX)
  card-1.tsx      <- one slide = one PNG, and one PDF page on path A
  card-2.tsx
  card-3.tsx
  • theme.ts factors out the coherence (palette, SIZE, margins). Pure TS with no JSX: discovery only loads .tsx files, so theme.ts is ignored. Do not create a frame component as a .tsx in this folder: it would be discovered as a fake slide and land in the PDF. The little bit of frame JSX gets repeated in each slide.
  • Naming and order: file order sets the page order of the PDF, and the sort is natural, so card-2 comes before card-10. Number the slides plainly, no padding needed.
  • Colors from theme.ts, assets through brand("<project>/..."), fonts discovered in fonts/; a missing font -> the "missing font" appendix in new-template, never silently.

theme.ts (skeleton)

ts
import type { CSSProperties } from "react";

export const SIZE = { width: 1080, height: 1350 }; // document post, 4:5 (ad: 1080x1080)
export const TOTAL = 5; // number of slides (index + progress)

// <Project> guideline palette (from brands/<project>/brand.md).
export const INK = "#......";
export const ACCENT = "#......";
export const PAPER = "#......";

// Frame shared by every slide: same background, same safe area.
export const frame: CSSProperties = {
	width: "100%",
	height: "100%",
	display: "flex",
	flexDirection: "column",
	justifyContent: "space-between",
	padding: 90, // safe area
	backgroundColor: INK, // opaque background, identical everywhere
};

card-1.tsx (skeleton)

tsx
import type { ReactNode } from "react";
import type { Template } from "brand-artisan";
import { SIZE, frame, PAPER, ACCENT } from "./theme";

function render(): ReactNode {
	return (
		<div style={frame}>
			{/* logo in a fixed position (same corner on every slide) */}
			{/* the hook: a single message, strong contrast */}
			{/* progress marker (e.g. 1/5) */}
		</div>
	);
}

export default { size: SIZE, render } satisfies Template;

(With no title, the PNG comes out under the file's name: out/<project>/<name>/card-1.png.)

6. Assemble and verify

  • npm run typecheck -> green.

  • npm run build -> writes out/<project>/<name>/card-*.png.

  • Path A only, assemble the document:

    bash
    npm run pdf -- <project>/<name>     # -> out/<project>/<name>.pdf

    One slide = one page, each page at the slide's exact size. The command re-renders the slides itself, so it stays right even if build was not run, and it refuses to assemble if one slide has a different ratio from the first, since that page would come out letterboxed in the feed.

  • Check the pages: the expected count, the order, an opaque background, ≤ 100 MB (trivial with flat rendering).

  • Check the visual coherence (palette, type, logo, through-line) and that each slide is legible on its own, body text included, at phone size.

  • Preview the slides: npm run dev then /<project>/<name>. The folder's page carries a PDF button as soon as the document exists, and labels it out of date when a slide is more recent than it.

7. Hand it over (the files are not the delivery)

Rendering the slides is not finishing the job. Left to themselves, users upload the PNGs, because that is what a folder of images invites, and LinkedIn answers with a mosaic of thumbnails. Never sign off on path A with "the cards are ready in out/". Close with a short handover, in your own words, carrying three things:

  • The file to upload. Path A, out/<project>/<name>.pdf, and it alone, through Add a document in the post editor. Path B, the N PNGs, one per card, in Campaign Manager.
  • Why, in one line. LinkedIn paginates a document into slides you swipe; a batch of images is laid out as a mosaic. Say it once, plainly. This is the part that gets missed, so it belongs in the handover and not in a footnote.
  • What the PNGs are still for, on path A. They stay in out/<project>/<name>/ and get reused on their own (an illustration, a post image). They just are not the LinkedIn deliverable.

The PDF goes stale. Editing one slide, adding one, renaming one, all leave the PDF behind. Re-run npm run pdf -- <project>/<name> and hand over the new one, without re-explaining the whole recipe. Same thing for a carousel folder that predates the PDF path, build alone never produced one.

Success criterion: on path A, a PDF of 3-10 pages at a constant ratio, paginated in the intended order, slide 1 catchy and the last slide carrying the CTA, handed over as the thing to upload. On path B, 2-10 cards at 1:1 1080×1080, opaque, visually coherent. In both cases a professional tone, and only colors and type from brand.md.

Frequently asked questions

What does the Linkedin Carousel AI skill do?

Creates the slides of a LinkedIn carousel, both kinds. Use when the user wants a "LinkedIn carousel", a "LinkedIn document post", a "LinkedIn PDF carousel", a "LinkedIn carousel ad" or "several slides that swipe" for a LinkedIn project. Two paths, and the choice is asked rather than assumed. Either an organic document post (slides assembled into a PDF, what LinkedIn actually paginates as a swipeable carousel in the feed), or a carousel ad in Campaign Manager (1:1 PNG cards). Produces N .tsx templates in a dedicated subfolder sharing a common theme, plus the PDF for the organic path. Require...

Why use Linkedin Carousel on TypingMind?

Because you install it once and use it with any model. Linkedin Carousel is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Linkedin Carousel in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/roslove44/brand-artisan/tree/main/skills/linkedin-carousel. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Linkedin Carousel?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Linkedin Carousel?

As many as you like. As long as a model supports skills, you can use Linkedin Carousel with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Linkedin Carousel AI skill free?

Yes. It is published on GitHub by roslove44 under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇