Skip to content
Back to skills

Deck Ai

ASecurity

Generate modern presentation decks (PDF) from markdown content. Local open-source alternative to Gamma — uses Slidev for layouts and Unsplash for imagery. Invoke when the user asks to "make a deck", "build slides from this", or "turn this into a presentation".

  • 112 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 23, 2026
ai-agentspythongobashnodeapi

Works with

  • claude code
  • api

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 5 files and shows the line behind each finding

Scanned September 23, 2026

npx -y skills add assafkip/kipi-system --skill deck-ai --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Deck Ai?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Deck Ai
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/assafkip-deck-ai/badge)](https://www.skillsdirectory.com/skills/assafkip-deck-ai)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: deck-ai
user-invocable: false
description: Generate modern presentation decks (PDF) from markdown content. Local open-source alternative to Gamma — uses Slidev for layouts and Unsplash for imagery. Invoke when the user asks to "make a deck", "build slides from this", or "turn this into a presentation".
---

# deck-ai

Turn plain markdown into a themed, image-rich slide deck exported as PDF.
Closest open-source equivalent to Gamma. Runs locally. No subscription.

## What this skill does

1. Reads source markdown (slides separated by `---`).
2. Picks a layout + image keyword per slide. Two modes:
   - **LLM mode** (preferred): Claude writes `decisions.json` directly using the Write tool. No extra API call.
   - **Rules mode** (fallback): deterministic regex picks. Used when the skill is invoked from a non-LLM harness.
3. Fetches images from Unsplash by keyword.
4. Renders the whole thing to PDF via Slidev.

## When to invoke

Triggers: "make a deck", "turn this into slides", "slide version of X",
"build a presentation from this", "gamma-style deck".

Do NOT invoke for plain editing / rewriting of existing slide content.
Do NOT invoke if the user wants a PPTX specifically (use `python-pptx` instead).

## Required setup (first run)

### Prerequisites
- Node 18+ and `pnpm` on the user's machine. If missing:
  ```
  brew install node
  npm install -g pnpm
  ```

### API key
- **Unsplash** (required): https://unsplash.com/oauth/applications — only the **Access Key**.
- Key lives in `.env` at the calling instance root:
  ```
  echo 'UNSPLASH_ACCESS_KEY=<your-key>' >> ./.env
  ```
- Never commit `.env`. Never paste the key into any file in this skill.
- No separate Anthropic key needed — when this skill runs inside Claude Code, Claude itself writes `decisions.json`.

### Install workspace (one-time per instance)
```
bash <skill>/scripts/setup.sh ./deck-workspace
```
This creates a local Slidev workspace with themes installed.
Takes ~1-2 minutes first run. Subsequent runs reuse it.

## Workflow (per deck)

```
# 1. Preflight: key + deps must be present
bash <skill>/scripts/check_env.sh ./deck-workspace

# 2. (LLM mode) Claude reads <input.md>, decides layout + image keyword
#    per slide, and WRITES ./deck-workspace/decisions.json with the Write
#    tool (schema below). Skip this step when running outside Claude.

# 3. Generate Slidev markdown from source
#    LLM mode:
python3 <skill>/scripts/generate.py <input.md> ./deck-workspace/slides.raw.md \
    --theme seriph --decisions ./deck-workspace/decisions.json
#    Rules mode (no decisions file):
python3 <skill>/scripts/generate.py <input.md> ./deck-workspace/slides.raw.md --theme seriph

# 4. Fill image placeholders from Unsplash
python3 <skill>/scripts/fetch_images.py ./deck-workspace/slides.raw.md

# 5. Export PDF
bash <skill>/scripts/render.sh ./deck-workspace ./deck-workspace/slides.raw.md ./deck.pdf
```

### decisions.json schema (step 2)

One object per slide, in source order. `generate.py` validates this file
and exits non-zero on any violation.

```json
[
  {"layout": "cover",       "image_keyword": "sunrise mountains"},
  {"layout": "image-right", "image_keyword": "student classroom"},
  {"layout": "center",      "image_keyword": null},
  {"layout": "end",         "image_keyword": null}
]
```

Rules Claude must follow when writing `decisions.json`:

- `layout` is one of: `cover`, `center`, `statement`, `two-cols`, `image-right`, `image-left`, `quote`, `end`, `default`.
- Slide 1 must be `cover`.
- If a slide has `<!-- layout: X -->` in the source, use that layout.
- `image_keyword` is 1-3 concrete nouns suitable for stock photo search. Required for `cover`, `image-right`, `image-left`. `null` for every other layout.
- No brand names, no anime character names, no abstract concepts. Use the underlying physical scene instead.

Good keywords: `library books`, `koi fish`, `child drawing`, `mountain sunrise`.
Bad keywords: `Naruto`, `loneliness`, `theme of courage`, `The Ordinary World`.

## Source markdown format

Slides separated by a line containing only `---`. First slide is the cover.

Example:
```
# Deck Title

Subtitle line.

---

# Second slide

Body content here.

<!-- layout: image-right -->

Anime anchor: Naruto.

---

# Homework

Optional closing text.
```

## Layouts

See `references/layout-catalog.md` for the full enum and pick rules.
Force a layout by adding `<!-- layout: <name> -->` in a slide body.

## Image keywords

Use concrete nouns in `{{IMG:keyword}}` placeholders. 1-3 words.
Good: `mountain sunrise`, `library books`, `child drawing`.
Bad: `feeling of wonder`, `theme of courage` (abstract concepts return weak results).

## Themes

Default: `@slidev/theme-seriph` (clean serif, modern).
Fallback: `@slidev/theme-default` (sans-serif, minimal).

Install more themes in the workspace:
```
cd ./deck-workspace && pnpm add @slidev/theme-<name>
```
Browse: https://sli.dev/resources/theme-gallery

## Limitations

- Slidev renders via Playwright Chromium on first export (adds ~30s).
- Unsplash free tier: 50 requests/hour. Reuse keywords if hitting the limit.
- PDF export does not preserve interactive elements (embeds, live code).
- Slide source must be standard markdown. HTML-heavy content may break layout.

## Troubleshooting

| Symptom | Fix |
|---|---|
| `pnpm: command not found` | `npm install -g pnpm` |
| `UNSPLASH_ACCESS_KEY not set` | Add to `.env` at calling dir |
| Images all say "no image found" | Keywords too abstract. Use concrete nouns. |
| PDF export hangs | First run downloads Chromium. Let it finish. |
| Layout looks wrong | Check `<!-- layout: X -->` hint or let rules pick |

## What this skill does NOT do (v2)

- AI-generated images (Unsplash stock only; could add Flux/Ideogram later)
- Brand theme editor (use provided themes or install more via pnpm)
- Per-slide image retries (one Unsplash result per keyword; no ranking)

Files in this skill

  • SKILL.md5.8 KB
  • references/layout-catalog.md1.7 KB
  • scripts/check_env.sh763 B
  • scripts/fetch_images.py1.8 KB
  • scripts/render_pptx.py17.6 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.