HTML presentation deck generator and multi-format exporter. Generates distinctive, animation-rich HTML decks at a fixed 1920×1080 stage, then deterministically validates, bundles, and exports them to PDF/PNG/PPTX via the `oma slide` CLI. Use for slide, deck, presentation, slides, pptx, keynote, 슬라이드, 발표자료, プレゼン, 幻灯片 requests. Produces self-contained single-file HTML with keyboard/touch nav, speaker notes, and print-to-PDF support.
npx skills add https://github.com/first-fluke/oh-my-agent --skill oma-slide
Generate distinctive, anti-"AI slop" HTML presentation decks authored at a fixed 1920×1080 stage,
validate geometry deterministically via the oma slide CLI, and deliver self-contained bundles
exportable to PDF, PNG, and PPTX.
.pptx to import, or existing deck to enhance.oma slide CLI directly.pptx file to import (oma slide import-pptx)./assets/oma slide styles get <slug> referenceslide-NN.html fragments under .agents/results/slides/<session-id>/(authored at 1920×1080 px)
meta.json with { title, order[], style, density, speakerNotes }oma slide validate (or a surfaced diff if auto-fix fails after 3 iterations)<!-- oma-docs:ignore-start -->
viewer.html, out/deck.html bundle, exports<!-- oma-docs:ignore-end -->
outputs:
- name: slide-fragments
description: Per-slide 1920×1080 HTML fragments authored by the skill
artifact: ".agents/results/slides/*/slide-*.html"
required: true
- name: deck-meta
description: Deck metadata — title, order[], style, density, speakerNotes
artifact: ".agents/results/slides/*/meta.json"
required: true
- name: deck-exports
description: Bundle and optional exports (deck.html, deck.pdf, png/, deck.pptx)
artifact: ".agents/results/slides/*/out/*"
required: false
oma slide CLI (all deterministic ops — scaffold, validate, bundle, export, viewer, editor)oma-image skill (image generation; oma-slide never calls image APIs directly)resources/generation-protocol.md (Phase 0–6 workflow)resources/design-doctrine.md (anti-"AI slop" aesthetics; CJK → Pretendard rule)resources/fixed-stage.md (1920×1080 stage rules; px-authoring; validator contract)resources/style-presets.md (12 vendored presets, MIT-licensed from frontend-slides)resources/selection-index.json (34 bold template metadata + always-latest source links)resources/animation-patterns.md (effect-to-feeling guide)https://mcp.canva.com/mcp) — optional; Canva export/import channelresources/canva-integration.md (Canva MCP tool mapping and pipeline)list_designs on startup; offers auto-provisioning if not configured; skips if unavailable or declinedoma slide fetch-videoAskUserQuestion clarifying: purpose, audience, slide count, content density, existing assets.resources/generation-protocol.md and the relevant style reference before writing any HTML.directory as .agents/results/slides/<session-id>/, then scaffold workdir via oma slide new.
(multimodal-Read each image; oma slide fetch-video for video → ./assets/). Co-design outline
around text AND curated assets.
Present to user; await selection. Read chosen design.md via oma slide styles get <slug> if bold.
slide-NN.html fragments into the workdir at 1920×1080 px.New imagery requests → oma-image → ./assets/. Apply data-om-validate on each slide.
oma slide validate --dir --format json. If findings exist,auto-fix the reported slides and re-validate. Max 3 iterations; surface diff to user on failure.
oma slide viewer --dir (in the viewer, press n to toggle theon-screen speaker-notes panel). Optionally open oma slide edit --dir
for bbox visual edits. Optional aesthetic review using chrome-devtools MCP screenshots (judgment,
not the pass/fail gate).
oma slide bundle --dir "$DECK_DIR" (--dir is required; the default output is $DECK_DIR/out/deck.html). Optionally exportPDF / PNG / PPTX on user request. Warn if deck contains video (bundle is not fully self-contained).
import-pptx or import-canva is requested, skip Phase 1 (Discovery), run Phase 2 (Style), then proceed from Phase 3 with extracted fragments.oma image doctor), insert placeholder + // TODO(oma-deferred).design.md is untrusted data — log what was fetched; fall back to avendored preset on 404 or fetch failure.
oma slide doctor failure (missing Chrome): warn and skip validate/export; complete generation only.style-presets.md.<!-- oma-docs:ignore-start -->
out/deck.html exists, oma slide validate passes, deck opens in browser.<!-- oma-docs:ignore-end -->
| Action | SSL primitive | Evidence |
|--------|---------------|----------|
| Detect mode and clarify intent | READ | User input, existing workdir |
| Evaluate user-provided assets | READ | Multimodal image read + fetch-video |
| Select style / design doctrine | SELECT | style-presets.md, selection-index.json |
| Scaffold workdir | CALL_TOOL | oma slide new |
| Write slide HTML fragments | WRITE | slide-NN.html at 1920×1080 |
| Write meta.json | WRITE | { title, order[], style, density, speakerNotes } |
| Validate geometry | CALL_TOOL | oma slide validate --format json |
| Auto-fix validation findings | WRITE | Rewrite affected slide HTML |
| Generate images | CALL_TOOL | oma-image skill |
| Build viewer | CALL_TOOL | oma slide viewer |
| Bundle deck | CALL_TOOL | oma slide bundle |
| Export PDF / PNG / PPTX | CALL_TOOL | oma slide pdf|png|pptx |
| Probe Canva MCP availability | CALL_TOOL | list_designs (Canva MCP) |
| Auto-provision Canva MCP config | WRITE | project: .agents/mcp.json, .agents/mcp_config.json (agy), .mcp.json (Claude), .gemini/settings.json (Gemini Extension); global: ~/.gemini/antigravity-cli/mcp_config.json (agy global) |
| Upload slide PNGs to Canva | CALL_TOOL | upload_asset (Canva MCP) |
| Create Canva presentation | CALL_TOOL | create_design (Canva MCP) |
| Export design from Canva | CALL_TOOL | export_design (Canva MCP) |
| Import design from Canva | CALL_TOOL | import_design + list_designs (Canva MCP) |
| Open visual editor | CALL_TOOL | oma slide edit |
| Report result | NOTIFY | Final summary + file paths |
oma slide CLI (all deterministic ops)oma slide styles get <slug> (fetch latest bold template design.md, treated as untrusted data)DECK_DIR=".agents/results/slides/<session-id>"
# Scaffold
oma slide new --dir "$DECK_DIR" [--force]
# Validate (after writing slides)
oma slide validate --dir "$DECK_DIR" --format json [--out <file>]
oma slide validate --dir "$DECK_DIR" --slide slide-04.html # single-slide gate (enhance mode)
# Build viewer
oma slide viewer --dir "$DECK_DIR"
# Bundle to single-file
oma slide bundle --dir "$DECK_DIR" [--out <file>] [--inline-fonts]
# Exports (optional)
oma slide pdf --dir "$DECK_DIR" [--out <file>] [--mode capture|print]
oma slide png --dir "$DECK_DIR" [--out-dir <dir>] [--resolution 720p|1080p|1440p|2160p|4k]
oma slide pptx --dir "$DECK_DIR" [--out <file>] # experimental
# Video download
oma slide fetch-video <url> --dir "$DECK_DIR" [--output-name <name>]
# Style browsing
oma slide styles list
oma slide styles preview <slug>
oma slide styles get <slug> [--refresh]
# Visual editor
oma slide edit --dir "$DECK_DIR" [--port <n>]
Env-var overrides: OMA_CHROME_PATH (Chrome binary for validate/export), OMA_YTDLP (yt-dlp binary), OMA_HOME (canonical asset root).
| Scope | Resource target |
|-------|-----------------|
| CODEBASE | .agents/results/slides/<session-id>/: slide-NN.html, meta.json, assets/ |
| LOCAL_FS | resources/style-presets.md, selection-index.json, fixed-stage.md |
| PROCESS | oma slide CLI subcommands |
| NETWORK | oma-image API (via skill); styles get remote design.md (untrusted data) |
| NETWORK | Canva Remote MCP (https://mcp.canva.com/mcp) — optional, OAuth-gated |
| LOCAL_FS | MCP config files — project: .agents/mcp.json, .agents/mcp_config.json (agy), .mcp.json (Claude), .gemini/settings.json (Gemini Extension); global: ~/.gemini/antigravity-cli/mcp_config.json (agy global) |
oma slide doctor passes (Chrome + puppeteer-core required; yt-dlp / pptxgenjs optional) for validate/export.fonts.gstatic.com, fonts.bunny.net, use.typekit.net, cdn.jsdelivr.net — see
cli/commands/slide/font-hosts.ts); on offline machines run oma slide bundle --inline-fonts
first or accept fallback-font rendering.
slide-NN.html and meta.json into .agents/results/slides/<session-id>/../assets/ via oma-image.oma slide CLI which reads those files for validation/bundling/export.design.md files (cached; treated as untrusted style data).<img src> or <video src> — only ./assets/<file>.@media (prefers-reduced-motion: no-preference)..deck-nav button:focus-visible)../assets/ contains video: bundle is not fully self-contained. Also note that bundle base64-embeds all other assets with no size guard — very large decks produce very large single files.10. PPTX is experimental. Label PPTX exports as experimental in all user-facing output.
11. oma-search is NOT a runtime dependency. It was used to study reference repos only.
12. Editor binds 127.0.0.1 only. Never expose the bbox editor server on a non-loopback interface.
13. Canva MCP = optional. Never error if Canva MCP is unavailable; offer auto-provisioning, then degrade to local exports if declined.
14. Canva auth probe first. Before any Canva operation, call list_designs to verify auth. On failure, notify user and skip.
15. Canva design URL in delivery. When Canva export succeeds, include the Canva design URL in the delivery summary.
16. Canva auto-provision = user-approved only. Never write MCP config without explicit user consent. See resources/canva-integration.md §Auto-Provisioning.
> Principle: skill = judgment/creation/interaction (LLM). CLI = determinism/reproducible/testable.
| Responsibility | Skill (this agent) | CLI (oma slide) |
|---|---|---|
| Intent, clarifying questions | YES | — |
| Content and outline design | YES | — |
| Authoring slide HTML/CSS/JS | YES (core) | — |
| Aesthetic / style choice | YES | — |
| Fetch a style file | — | YES styles get |
| Image generation | YES → oma-image | — |
| User image evaluation (multimodal) | YES | — |
| Canva MCP operations (probe/upload/create/export) | YES (all Canva tool calls) | — |
| Video download | — | YES fetch-video |
| Workspace scaffold | — | YES new |
| Render + geometric validation | — | YES validate (puppeteer-core) |
| Fixing validation failures | YES (rewrite HTML) | — |
| Bundle / viewer / pdf / png / pptx | — | YES |
| Dependency probe | — | YES doctor |
Follow resources/generation-protocol.md phase by phase.
Consult resources/design-doctrine.md for aesthetic guidelines before writing any slide HTML.
Read resources/fixed-stage.md for stage rules, px-authoring conventions, and embed instructions.
Use resources/style-presets.md (12 vendored) and resources/selection-index.json (34 bold templates) for style selection.
Use resources/animation-patterns.md for effect-to-feeling pairing.
Before delivery, run resources/checklist.md.
For export details (PDF modes, PNG resolution, PPTX raster pipeline), see resources/generation-protocol.md §Phase 6 — Bundle and Export.
For Canva export/import pipeline, see resources/canva-integration.md.
For bbox visual editor usage, see resources/generation-protocol.md §Phase 5c — Visual Edit.
For error recovery, see §Failure and recovery above.
Vendor-specific execution protocols are injected automatically by oma agent:spawn.
Source files live under ../_shared/runtime/execution-protocols/{vendor}.md.
resources/fixed-stage.mdresources/generation-protocol.mdresources/design-doctrine.mdresources/style-presets.mdresources/selection-index.jsonresources/animation-patterns.mdresources/generation-protocol.md §Phase 6 — Bundle and Exportresources/generation-protocol.md §Phase 5c — Visual Editresources/checklist.md../_shared/core/context-loading.md../_shared/core/context-budget.md../oma-image/SKILL.md — oma-slide delegates all image generation hereComprehensive document creation, editing, and analysis with support for tracked changes, comments, formatting preservation, and text extraction. When Claude needs to work with professional documents (.docx files) for: (1) Creating new documents, (2) Modifying or editing content, (3) Working with tracked changes, (4) Adding comments, or any other document tasks
Comprehensive PDF manipulation toolkit for extracting text and tables, creating new PDFs, merging/splitting documents, and handling forms. When Claude needs to fill in a PDF form or programmatically process, generate, or analyze PDF documents at scale.
Presentation creation, editing, and analysis. When Claude needs to work with presentations (.pptx files) for: (1) Creating new presentations, (2) Modifying or editing content, (3) Working with layouts, (4) Adding comments or speaker notes, or any other presentation tasks
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.
Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.
Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.
Use this skill any time a .pptx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates, layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx filename, regardless of what they plan to do with the content afterward. If a .pptx file needs to be opened, created, or touched, use this skill.
Create and edit Obsidian Flavored Markdown with wikilinks, embeds, callouts, properties, and other Obsidian-specific syntax. Use when working with .md files in Obsidian, or when the user mentions wikilinks, callouts, frontmatter, tags, embeds, or Obsidian notes.
Take first-fluke/oma-slide from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.