linkedin-carousel — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited linkedin-carousel (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Generates LinkedIn carousel PDFs from content briefs. Four HTML templates rendered through Playwright. Output is a single multi-page PDF ready for upload as a LinkedIn document post.
Before generating any carousel, verify the user has personalized brand-config.yaml. Look for these placeholder values:
owner_name: "Your Name"company: "Your Company"website: "yourwebsite.com"footer_line: "your name | yourwebsite.com"If ANY of those are still at placeholder defaults, pause and ask the user to fill them in. Offer to:
brand-config.yaml for them (ask for: name, company, website, professional tagline, preferred primary color in hex)assets/logo.svg (or .png) and a square headshot at assets/headshot.png (500x500 minimum)Only after brand setup is complete, proceed to carousel generation.
Code is reproducible. Image generation is not. PPTX text rendering is inconsistent across viewers. Controlled HTML + Playwright gives pixel-perfect consistency across runs and slides.
The user provides one of:
| Input type | What to do |
|---|---|
| Raw text / bullets | Parse directly into slide structure |
| URL | Fetch with WebFetch, extract the core argument, then structure |
| Uploaded docx / pdf | Read the file, extract the argument, then structure |
They may also specify:
executive-minimal (default), training-breakdown, quote-forward, mobile-optimizedbrand (default) or mobile (higher contrast for small screens)| Template | Visual feel | Best for |
|---|---|---|
executive-minimal | Clean typography, generous whitespace, muted accents | C-suite content, strategy takes |
training-breakdown | Numbered steps, structured grid. Dual-purpose: also works as in-room training slides | Workshop recaps, frameworks |
quote-forward | Alternating full-bleed slides with big pull quotes | Thought leadership, manifestos |
mobile-optimized | Oversized type (min 48px body), highest contrast | Feed-first content, mobile readers |
{
"template": "executive-minimal",
"palette": "brand",
"cover": {"hook": "...", "subline": "..."},
"slides": [
{"title": "...", "body": "..."}
],
"takeaway": {"title": "...", "body": "..."},
"cta": {"primary": "Follow for more on X", "secondary": "yourwebsite.com"}
} python3 <skill-directory>/scripts/render.py \
--content /path/to/content.json \
--brand-config <skill-directory>/brand-config.yaml \
--output /path/to/output.pdfLinkedIn allows up to 20 slides per document post. Rarely exceed 12.
Each slide renders at 1080x1350 px (4:5 portrait). LinkedIn's recommended document post ratio.
One-time install:
pip install playwright jinja2 pyyaml --break-system-packages
python3 -m playwright install chromiumbrand-config.yaml.assets/headshot.png is missing, the CTA slide falls back to the user's initials on a colored circle. Acceptable but personalization is stronger.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.