{
  "schemaVersion": "1.0",
  "item": {
    "slug": "ai-presentation-maker",
    "name": "AI Presentation Maker",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/jeffjhunter/ai-presentation-maker",
    "canonicalUrl": "https://clawhub.ai/jeffjhunter/ai-presentation-maker",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/ai-presentation-maker",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=ai-presentation-maker",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "assets/presentation-helper.sh",
      "references/export-gamma.sh",
      "references/export-html-slides.py",
      "references/export-pptx.py",
      "references/slide-templates.py",
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/ai-presentation-maker"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/ai-presentation-maker",
    "agentPageUrl": "https://openagent3.xyz/skills/ai-presentation-maker/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ai-presentation-maker/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ai-presentation-maker/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "🎤 AI Presentation Maker",
        "body": "The interview-driven pitch deck generator for your OpenClaw agent.\n\nTell it what you built. Tell it who's in the room. Pick an angle. Get a complete slide deck with speaker notes — built from facts, not fantasies."
      },
      {
        "title": "⛔ AGENT RULES — READ BEFORE DOING ANYTHING",
        "body": "Use EXACT text from this file. Do not paraphrase menus, slide type names, or instructions. Copy them verbatim.\nNEVER tell the user to open a terminal or run commands. You have the exec tool. USE IT. Run every command yourself via exec.\nOne step at a time. Interview questions go 1-2 at a time. Never dump the full questionnaire.\nNEVER overwrite existing presentation files without asking. If the file exists, ask before replacing.\nFACTUAL VALIDATION IS MANDATORY. Before generating any slide, check for speculative language. Flag it. The user decides what stays.\nScope: ~/workspace/presentations/ only. All file operations stay under this directory.\nUSE THE HELPER SCRIPT FOR ALL FILE OPERATIONS. Never construct raw shell commands with user input. Always route through assets/presentation-helper.sh.\nSpeaker notes are required. Every slide gets \"What to say\" and \"What NOT to say\" notes. No exceptions.\nNo made-up numbers. If the user hasn't provided a specific stat, don't invent one. Use \"[INSERT ACTUAL NUMBER]\" as placeholder and flag it.\nRespect the user's voice. If they talk casually, the deck should feel casual. If they're formal, match it. The interview captures this."
      },
      {
        "title": "🛡️ Helper Script — Security Layer",
        "body": "All file operations go through assets/presentation-helper.sh. This script enforces sanitization in code, not in prompt instructions.\n\nFirst-run: Copy the helper to the workspace:\n\ncp assets/presentation-helper.sh ~/workspace/presentations/helper.sh\nchmod +x ~/workspace/presentations/helper.sh\n\nUsage:\n\n# Create workspace\n~/workspace/presentations/helper.sh init\n\n# Save presentation metadata (JSON from stdin)\n~/workspace/presentations/helper.sh save-meta < /tmp/pres_meta.json\n\n# Save slide deck (Markdown from stdin)\n~/workspace/presentations/helper.sh save-deck <pres_id>\n\n# List presentations\n~/workspace/presentations/helper.sh list\n\n# Get presentation metadata\n~/workspace/presentations/helper.sh get-meta <pres_id>\n\n# Get slide deck\n~/workspace/presentations/helper.sh get-deck <pres_id>\n\n# Delete presentation\n~/workspace/presentations/helper.sh delete <pres_id>\n\n# Sanitize a string\n~/workspace/presentations/helper.sh sanitize-string \"user input\""
      },
      {
        "title": "🔍 Post-Install Check",
        "body": "🚨 AGENT: Run this FIRST before showing any menu.\n\n# Check for existing workspace\nls ~/workspace/presentations/config.yaml 2>/dev/null\n\n# Check for AI Persona OS\nls ~/workspace/SOUL.md ~/workspace/AGENTS.md 2>/dev/null | wc -l\n\n# Check export dependencies\nwhich python3 2>/dev/null && echo \"HTML export: ✅ (recommended)\" || echo \"HTML export: ❌ (needs python3)\"\necho \"Gamma export: ✅ (always available)\"\nwhich pandoc 2>/dev/null && echo \"PDF export: ✅\" || echo \"PDF export: ❌ (install pandoc — or use HTML print)\"\nwhich python3 2>/dev/null && python3 -c \"import pptx; print('PPTX export: ✅')\" 2>/dev/null || echo \"PPTX export: ❌ (install python3 + python-pptx)\"\n\nIf config.yaml exists → workspace is set up. Show:\n\n\"🎤 Presentation Maker is ready. You have X decks saved. Say create presentation to start a new one or list presentations to see what you've got.\"\n\nIf config.yaml is missing → fresh install. Show the welcome message:\n\n🚨 AGENT: OUTPUT THE EXACT TEXT BELOW VERBATIM.\n\n🎤 Welcome to AI Presentation Maker!\n\nI build slide decks from your actual work — not templates\nstuffed with placeholder text.\n\nHere's how it works:\n\n1. 🎯 I interview you (5 min)\n   What you built, who's in the room, what matters\n\n2. 🧭 I suggest angles (pick one)\n   3-5 ways to frame your story\n\n3. 📊 I generate your deck\n   Slides + speaker notes + factual validation\n\n4. ✏️ You refine\n   Add details, change tone, cut slides\n\n5. 📦 Export\n   Markdown (default), PPTX, or PDF\n\nEvery number in your deck comes from YOU.\nNo made-up ROI. No fake projections.\n\nReady? Say \"create presentation\" to start.\n\nWait for explicit confirmation before proceeding."
      },
      {
        "title": "Create Workspace",
        "body": "AGENT: Run on first use.\n\nmkdir -p ~/workspace/presentations/{decks,exports,archive}\ncp assets/presentation-helper.sh ~/workspace/presentations/helper.sh\nchmod +x ~/workspace/presentations/helper.sh"
      },
      {
        "title": "Default Config",
        "body": "Write ~/workspace/presentations/config.yaml:\n\n# AI Presentation Maker — Configuration\n# Edit directly or say \"edit config\" in chat\n\ndefaults:\n  tone: \"conversational\"  # professional | conversational | humorous | technical\n  max_slides: 20\n  include_speaker_notes: true\n  factual_validation: true     # Flag speculative language\n  include_mistakes_slide: true  # Authenticity builder\n  include_costs_slide: true     # Real investment breakdown\n\nexport:\n  default_format: \"html\"\n  html_theme: \"spark\"   # terminal | executive | spark | clean\n  per_slide_html: false  # true = individual HTML files per slide (keynote quality)\n  formats_available:\n    markdown: true\n    html: true        # Zero dependencies — recommended\n    gamma: true       # Zero dependencies — for Gamma.app users\n    pptx: false       # Set true after installing python-pptx\n    pdf: false        # Set true after installing pandoc (or use HTML print)\n\nspeaker:\n  name: \"\"           # Set during first presentation or say \"edit config\"\n  title: \"\"\n  company: \"\"\n  bio: \"\"\n\nbranding:\n  cta_links: []\n  training_links: []\n  coupon_codes: []\n\nAGENT: If AI Persona OS is detected, pull speaker info from SOUL.md or AGENTS.md if available. Ask user to confirm."
      },
      {
        "title": "The Interview",
        "body": "When user says \"create presentation\", \"new deck\", \"build slides\", \"make a pitch deck\", or similar:\n\nAGENT: Follow this interview flow. Ask 1-2 questions per message. Be conversational. Adapt based on their answers — skip redundant questions, dig deeper on thin answers."
      },
      {
        "title": "Phase 1: The Subject (1 message)",
        "body": "\"What's this presentation about? Give me the short version — what did you build, do, or accomplish?\"\n\nCapture: Core subject. This seeds everything.\n\nIf they give a thin answer (e.g., \"my AI project\"), follow up:\n\n\"Tell me more — what specifically did you build? What does it do? How long did it take?\""
      },
      {
        "title": "Phase 2: The Audience (1 message)",
        "body": "\"Who's in the room?\n\nHow many people?\nWhat do they do? (founders, developers, executives, students...)\nWhat are they hoping to learn or get from this?\"\n\nCapture: Audience profile. Drives tone, depth, and angle selection."
      },
      {
        "title": "Phase 3: The Speaker (1 message)",
        "body": "\"Quick — your name, title, and one sentence of credibility. What makes you the person to give this talk?\"\n(If I already have your speaker info from config, I'll use that — just confirm.)\n\nCapture: Speaker identity. Goes on title slide and shapes authority framing.\n\nIf config already has speaker info: Show it and ask to confirm or update."
      },
      {
        "title": "Phase 4: The Work (1-2 messages)",
        "body": "This is the most important phase. Get SPECIFICS.\n\n\"Now the meat — what did you actually do? I need real details:\n\nWhat was built or created?\nHow long did it take?\nWhat results do you have so far? (actual numbers only)\nWhat did it cost? (hardware, software, time)\nWhat went wrong? (mistakes are gold for presentations)\"\n\nCapture: Factual foundation. Every claim in the deck traces back to this.\n\nIf they skip costs: Ask specifically:\n\n\"What about costs? Hardware, software subscriptions, time invested — even rough numbers make the deck more credible.\"\n\nIf they skip mistakes: Ask specifically:\n\n\"Any mistakes or things that didn't work the first time? Audiences love authenticity — it builds trust faster than success stories.\""
      },
      {
        "title": "Phase 5: The Angle (1 message)",
        "body": "Based on everything gathered, generate 3-5 presentation angles.\n\nAGENT — Angle generation rules:\n\nEach angle is a distinct FRAMING of the same content — not different topics\nEach angle implies a different audience takeaway\nName each angle with a punchy title (3-6 words)\nAdd one sentence explaining the angle's focus\nConsider these angle categories:\n\nCost/Time Savings — \"We did X for $Y in Z hours\"\nCapability Expansion — \"Now we can do things we couldn't before\"\nNew Business Model — \"This changes how we make money\"\nCompetitive Advantage — \"While others are still doing X, we're doing Y\"\nPersonal Transformation — \"How this changed my approach to everything\"\nDemocratization — \"Anyone can do this now, here's how\"\nBehind the Scenes — \"Here's exactly how we built it, warts and all\"\n\nPresent like this:\n\n🧭 Here are 5 angles for your deck:\n\n1. [Punchy Title]\n   [One sentence explaining the focus]\n\n2. [Punchy Title]\n   [One sentence explaining the focus]\n\n3. [Punchy Title]\n   [One sentence explaining the focus]\n\n4. [Punchy Title]\n   [One sentence explaining the focus]\n\n5. [Punchy Title]\n   [One sentence explaining the focus]\n\nWhich one resonates? (pick a number or describe your own)\n\nCapture: Selected angle. This determines the narrative arc of the entire deck."
      },
      {
        "title": "Phase 6: Resources & CTA (1 message)",
        "body": "\"Last thing — any resources to include?\n\nLinks to share? (tools, courses, websites)\nCoupon codes or special offers?\nWhat's the ONE thing you want people to do after this talk? (sign up, book a call, visit a URL, join a community)\"\n\nCapture: CTA and resources. Goes on closing slides.\n\nIf they say \"nothing\": That's fine. Not every deck needs a hard CTA."
      },
      {
        "title": "Interview Complete → Generate Deck",
        "body": "After all 6 phases, confirm the brief:\n\n🎤 PRESENTATION BRIEF\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n📌 Subject: [subject]\n👥 Audience: [size] [roles] — [what they want]\n🎙️ Speaker: [name], [title]\n🧭 Angle: [selected angle]\n💰 Costs: [summary]\n📊 Results: [summary]\n❌ Mistakes: [summary]\n🎯 CTA: [what they should do after]\n\nGenerating your deck now...\n\nThen proceed to Deck Generation."
      },
      {
        "title": "Slide Structure",
        "body": "The agent generates slides based on the selected angle and gathered data. Not every deck needs all slide types — the agent selects the relevant ones based on content."
      },
      {
        "title": "Core Slides (always included)",
        "body": "SLIDE 1: Title Slide\n\nPresentation title (from the selected angle)\nSpeaker name + title\nEvent/date (if provided)\n\nSLIDE 2: The Hook\n\nONE fact-based statement that grabs attention\nMust be verifiable from the interview data\nNo speculation. Example: \"Yesterday, I built a lead gen system in 5 hours for $40/month. It sent 20 emails and got a reply by midnight.\"\n\nSLIDE 3: The Problem\n\nThe verified pain point the audience has\nMust connect to what was built\nDraw from audience profile (Phase 2)\n\nSLIDE 4: What We Built\n\nConcrete description of the work\nTimeline\nScreenshots/evidence descriptions (agent notes where visuals should go)\n\nSLIDE 5: What It Does\n\nCapabilities as a list or table\nEach capability must be real (no \"coming soon\" features unless flagged)\n\nSLIDE 6: Real Results\n\nActual numbers from the interview\nNo rounding up. No \"approximately.\" Use exact figures.\nIf results are early/limited: \"Early results from [timeframe]:\" — frame as an experiment, not a case study"
      },
      {
        "title": "Situational Slides (included when relevant data exists)",
        "body": "SLIDE: Investment / Real Costs\n\nHardware, software, time — actual numbers\nInclude if: user provided cost data\nFormat as a simple breakdown table\n\nSLIDE: Mistakes & What We Learned\n\nReal failures from the interview\nWhat went wrong → what was fixed → what was learned\nInclude if: user shared mistakes AND config.include_mistakes_slide: true\n\nSLIDE: Why Now\n\nWhat changed that made this possible/easier\nHistorical context — \"You could have done this before, but...\"\nInclude if: the work involves new technology or methodology\n\nSLIDE: DIY Path\n\nHow the audience could replicate this themselves\nTools, steps, approximate time/cost\nInclude if: audience profile suggests they want to do it themselves\n\nSLIDE: What We're Testing\n\nExperiments in progress, framed honestly\n\"We're currently testing...\" not \"This will...\"\nInclude if: user mentioned ongoing experiments\n\nSLIDE: Potential (WITH CAVEATS)\n\nConservative projections ONLY\nMUST include caveat language: \"Based on early results, IF current trends hold...\"\nInclude if: user explicitly wants projections\n⚠️ Flag this slide for factual review\n\nSLIDE: What You Could Build\n\nFramework for the audience to apply to their own context\nNot prescriptive — suggestive. \"Here's a framework for thinking about this.\"\nInclude if: audience is builders/doers"
      },
      {
        "title": "Closing Slides (always included)",
        "body": "SLIDE: The Offer / CTA\n\nClear single action for the audience\nInclude links, codes, URLs from Phase 6\nIf no CTA was provided → make this a \"Where to Learn More\" slide\n\nSLIDE: Q&A\n\nSimple closer\nInclude speaker contact info\nInclude resource links"
      },
      {
        "title": "Speaker Notes Format",
        "body": "Every slide MUST include speaker notes in this format:\n\n### Speaker Notes — [Slide Title]\n\n**What to say:**\n[2-4 bullet points of what the speaker should communicate]\n[Include specific numbers to reference]\n[Include transitions to the next slide]\n\n**What NOT to say:**\n[1-2 things to avoid]\n[Common traps: overpromising, speculation, competitor bashing]\n\n**Timing:** ~[X] minutes\n\n**Visual aids:** [Screenshots, demos, or props to reference]\n\nAGENT: \"What NOT to say\" is critical. Common entries:\n\n\"Don't promise specific ROI numbers you haven't verified\"\n\"Don't compare to competitors by name\"\n\"Don't say 'this will definitely...' — say 'based on what we've seen...'\"\n\"Don't skip the costs slide — transparency builds trust\"\n\"Don't apologize for early results — frame as experiments\""
      },
      {
        "title": "Factual Validation",
        "body": "🚨 MANDATORY: Run this check before showing the generated deck to the user.\n\nScan every slide for:\n\nFlagPatternAction🔴 Speculative\"could save\", \"might generate\", \"potential to\", \"up to\", \"estimated\"Flag and suggest rewording to factual language🔴 Unverified numberAny number not from the interview dataReplace with [INSERT ACTUAL NUMBER] placeholder🟡 ProjectionFuture tense claims about resultsAdd caveat: \"Based on early results, IF trends hold...\"🟡 Superlative\"best\", \"fastest\", \"only\", \"first\"Flag — user must confirm or remove🟢 Hedged OK\"We're testing\", \"Early results suggest\", \"In our experience\"No action — these are honest framings\n\nAfter generation, show a validation summary:\n\n📋 FACTUAL VALIDATION\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n🔴 Speculative claims found: [X]\n🟡 Projections needing caveats: [X]\n🟢 Factual claims verified: [X]\n\n[List each flag with slide number and the flagged text]\n\nFix these? (yes / show me / leave as-is)"
      },
      {
        "title": "Tone Profiles",
        "body": "The deck's language adapts to the selected tone:\n\nProfessional\n\nFormal language, no contractions\nData-forward, minimal storytelling\n\"The system processed 20 outreach emails within the first 6 hours of deployment.\"\n\nConversational (DEFAULT)\n\nContractions, natural language\nStory-driven with data supporting\n\"We built this thing yesterday. Sent 20 emails. Got a reply by midnight.\"\n\nHumorous\n\nSelf-deprecating, light\nMistakes slide is emphasized\n\"So naturally, the first thing it did was email the wrong person. We fixed that.\"\n\nTechnical\n\nJargon-appropriate, architecture-focused\nInclude system diagrams, stack details\n\"The pipeline uses JSON-based lead storage with cron-triggered sequence management.\""
      },
      {
        "title": "Asset Planning (Before Generation)",
        "body": "After the interview and outline are complete, but BEFORE generating slides, plan all visual assets.\n\nAGENT: Run this checklist before generating any slides:"
      },
      {
        "title": "Asset Checklist",
        "body": "Image needs — Which slides need images? (screenshots, product photos, diagrams)\n\nMap each image to a specific slide in the outline\nIf user mentioned a demo → screenshot slide\nIf user mentioned data → plan a big_number or comparison slide\nIf user has a logo → title and closing slides\n\n\n\nQR codes — Does the CTA include a URL?\n\nGenerate QR codes BEFORE slide generation (not during)\nSave to ~/workspace/presentations/assets/{pres_id}/\n\n\n\nData visualization — Any numbers that need charts or infographics?\n\nPlan the visualization type (comparison table, big number, timeline)\nMatch to a slide type from the template gallery\n\n\n\nMissing assets — What's missing?\n\nUse [IMAGE: description of what's needed] placeholder\nTell user: \"I need a screenshot of [X] to complete slide [N]. Can you provide one?\"\n\nAGENT: Never generate slides with broken image paths. If an image isn't available, use a placeholder description or skip the image slide entirely."
      },
      {
        "title": "Custom Style Instruction",
        "body": "If the user wants a custom look beyond the 4 built-in themes, build a style_instruction object:\n\n{\n  \"aesthetic_direction\": \"A stark, high-contrast design for maximum stage presence.\",\n  \"color_palette\": \"Background: #1A1A1A, Title: #FFFFFF, Body: #B3B3B3, Accent: #00E676\",\n  \"typography\": \"Font Family: Roboto. Headline: 64px, Body: 32px, Caption: 18px.\"\n}\n\nPass this to the template engine:\n\npython3 references/slide-templates.py \\\n  --style-instruction '{\"aesthetic_direction\":\"...\",\"color_palette\":\"Background: #1A1A1A, Title: #FFFFFF, Body: #B3B3B3, Accent: #00E676\",\"typography\":\"Font Family: Roboto. Headline: 64px, Body: 32px.\"}' \\\n  --theme custom --type title --title \"My Talk\" --output slide_01.html\n\nAGENT: When user asks for custom colors/fonts:\n\nAsk for their brand colors (background, text, accent)\nAsk for font preference (or default to Inter)\nBuild the style_instruction JSON\nGenerate all slides using --theme custom --style-instruction '{...}'"
      },
      {
        "title": "Quality Checklist (Post-Generation)",
        "body": "After generating all slides, run this QA check BEFORE showing to user.\n\nAGENT: Run this checklist after EVERY deck generation. Report any issues found."
      },
      {
        "title": "Automated Checks",
        "body": "CheckWhat To VerifyAction If FailedStyle consistencyAll slides use same theme colors/fontsRe-generate with correct themeContent integrityEvery interview fact appears in slidesAdd missing contentOne idea per slideNo slide has more than 2-3 bullet pointsSplit into multiple slidesOverflow preventionNo text exceeds 6 lines per slide bodySplit or trimImage validationAll src= paths exist or are placeholdersReplace with [IMAGE: description]AccessibilityAll <img> tags have alt attributesAdd descriptive alt textLink validationAll URLs in CTA/closing are reachableFlag broken linksSpeaker notesEvery slide has \"What to say\" notesAdd notes for bare slidesFactual validationNo speculative language (already handled)Run validation engine"
      },
      {
        "title": "Text Length Rules",
        "body": "ElementMaximumIf ExceededSlide title8 wordsShorten or split into title + subtitleBullet point15 wordsRewrite more conciselyBullets per slide5 itemsSplit into 2 slidesBody paragraph3 sentencesConvert to bullets or splitSpeaker note4 sentences per sectionTrim to essentials\n\nAGENT: After QA, report:\n\"✅ Quality check complete: [N] slides, [N] issues found.\"\nThen list any issues with slide numbers."
      },
      {
        "title": "Long Text Auto-Split",
        "body": "If a slide's content exceeds the maximum (5 bullets or 3 paragraphs), automatically split:\n\nKeep the original title for the first slide\nAdd \"(cont'd)\" to the title for subsequent slides\nSplit content at natural break points (paragraph breaks, after 3rd bullet)\nEach resulting slide must pass the text length rules\n\nAGENT: When interview data produces too much content for one slide:\n\"That's a lot of great content. I'm splitting it across 2 slides to keep each one clean and readable.\""
      },
      {
        "title": "Missing Sections",
        "body": "If the interview is incomplete (e.g., user skipped the costs question):\n\nDo NOT generate a costs slide with made-up numbers\nDo NOT silently skip the slide\nDO tell the user: \"I notice we didn't cover costs. Want me to add a costs slide? I'll need the real numbers.\"\nDO generate remaining slides normally"
      },
      {
        "title": "Missing Images",
        "body": "If a slide references an image that doesn't exist:\n\nFor screenshots: Replace with a styled placeholder box saying [Screenshot: description]\nFor QR codes: Skip the QR element, keep the link text visible\nFor logos: Use text-only version of the name\nNever leave a broken <img> tag in the output"
      },
      {
        "title": "Unusual Content",
        "body": "All numbers: If interview only provided one or two data points, use big_number slides instead of tables\nNo mistakes: If user says \"we didn't make mistakes\" → skip mistakes slide entirely, don't force it\nNo CTA: If user has no links/offers → use a simple closing slide with contact info only\nVery short talk: If user wants 3-5 slides, use only: title, one content, closing"
      },
      {
        "title": "In-Chat Commands",
        "body": "CommandWhat It Doescreate presentationStart the interview → generate a new decklist presentationsShow all saved decks with dates and slide countsshow [name]Display a saved deck in chatedit [name]Re-open a deck for changesadd slide [name]Add a new slide to an existing deckremove slide [name] [#]Remove a slide by numberreorder [name]Show slides and let user drag/reorderchange tone [name] [tone]Rewrite deck in a different toneexport [name] [format]Export to markdown/html/gamma/pptx/pdfspeaker notes [name]Show just the speaker notesvalidate [name]Re-run factual validationduplicate [name]Copy a deck for a different audience/anglearchive [name]Move to archivedelete [name]Delete permanently (asks to confirm)presentation helpShow all commands\n\nAGENT: Recognize natural language. \"Make me a pitch deck\" = create presentation. \"Show me my slides\" = list presentations. \"Export it as PowerPoint\" = export [last deck] pptx. Be flexible."
      },
      {
        "title": "Editing & Refinement",
        "body": "When user says \"edit [name]\" or asks to change a deck:"
      },
      {
        "title": "Quick Edits",
        "body": "The agent should handle these naturally:\n\nUser SaysAgent Does\"Add real costs\"Asks for cost details, adds/updates Investment slide\"Remove projections\"Strips all projection language, removes Potential slide if needed\"Add [specific detail]\"Adds to the relevant slide or creates a new one\"Make it shorter\"Suggests slides to cut, asks for approval\"Make it longer\"Suggests slides to add based on interview data\"Change the tone to [X]\"Rewrites all slides in the new tone\"Add a mistake\"Asks what went wrong, adds to Mistakes slide\"Update the results\"Asks for new numbers, updates Results slide\"Change the angle\"Re-generates deck with new angle (keeps all data)\"Add speaker notes\"Generates notes for any slides missing them\"Move slide X to position Y\"Reorders slides"
      },
      {
        "title": "Major Revisions",
        "body": "If the user wants a fundamentally different deck:\n\n\"That's a big change. Want me to keep the same interview data and just re-generate with the new angle? Or start fresh?\""
      },
      {
        "title": "Markdown (Default)",
        "body": "Every presentation is stored as Markdown at ~/workspace/presentations/decks/{pres_id}.md.\n\nMarkdown format:\n\n# [Presentation Title]\n*[Speaker Name] — [Title]*\n*[Date]*\n\n---\n\n## Slide 1: [Slide Title]\n\n[Slide content]\n\n> **Speaker Notes:**\n> **Say:** [what to say]\n> **Don't say:** [what not to say]\n> **Timing:** ~X min\n\n---\n\n## Slide 2: [Slide Title]\n\n[Slide content]\n\n...\n\n---\n\n## Resources\n\n- [Link 1]\n- [Link 2]\n\n---\n\n*Generated by AI Presentation Maker — Facts, not fantasies.*"
      },
      {
        "title": "🎨 Template Gallery",
        "body": "When generating HTML slides, the user picks a theme and the agent selects slide types from the gallery. The agent can also generate per-slide HTML files for maximum control."
      },
      {
        "title": "Choosing a Theme",
        "body": "AGENT: Ask the user to pick a theme BEFORE generating HTML slides. Show this menu:\n\n🎨 Pick a visual theme for your slides:\n\n1. 🖥️  Terminal    — Dark + green, terminal window frames. Hacker/tech vibe.\n2. 🏢  Executive   — Navy + gold, clean serif headings. Boardroom ready.\n3. ⚡  Spark       — Purple/teal gradient, modern sans-serif. Startup energy.\n4. ✨  Clean       — White + charcoal, Swiss minimal. Universal and professional.\n5. 🎨  Custom      — Tell me your brand colors and I'll build a custom theme.\n\nWhich one? (pick a number or describe what you want)\n\nIf the user describes something custom (e.g., \"red and black\" or \"playful\"), map to the closest theme and say: \"Going with [Theme] — closest match. I can tweak colors after.\""
      },
      {
        "title": "Slide Type Gallery",
        "body": "The agent selects from these 11 premade slide layouts. Each is a distinct HTML template optimized for stage readability (1280×720, 64-96px headlines).\n\nTypeNameWhat It's ForKey FieldstitleTitle SlideHero opener — name, subtitle, speakertitle, subtitle, speakersectionSection DividerBreak between major sectionstitle, subtitletextSimple TextBullet points or paragraphstitle, bodytext_and_imageText + ImageSplit layout — text left, image righttitle, body, image_pathbig_numberBig NumberONE massive stat as hero elementnumber, label, contextcomparisonComparisonSide-by-side (before/after, old/new)title, left/right columnsscreenshotScreenshotFull-width image with caption overlaytitle, image_path, captionquoteQuoteLarge pull quote with attributionquote_text, attributiontimelineTimelineStep-by-step process or chronologytitle, steps[]qr_codeQR CodeQR hero + CTA link + scan prompttitle, qr_image_path, link_textclosingClosing / CTAFinal slide with links and contacttitle, cta_text, links[], speaker\n\nAGENT: When generating a deck, select slide types based on the interview data.\nMapping guide:\n\nHook fact → big_number or title\nProblem statement → text\nWhat we built → text or text_and_image (with screenshot)\nResults → big_number (for hero stat) + text (for detail)\nCosts → comparison (old way vs new way)\nMistakes → text (with bullets)\nQuote from user or testimonial → quote\nProcess/timeline → timeline\nCTA with link/QR → qr_code\nClosing → closing"
      },
      {
        "title": "Generating Per-Slide HTML",
        "body": "For maximum visual control, generate each slide as its own HTML file:\n\npython3 references/slide-templates.py \\\n  --theme terminal \\\n  --type big_number \\\n  --number \"71\" \\\n  --label \"Leads Imported\" \\\n  --context \"In under 5 minutes\" \\\n  --output ~/workspace/presentations/exports/slide_04.html\n\nAGENT: When user asks for \"beautiful slides\" or \"stage-ready slides\" or \"keynote quality\":\n\nAsk which theme (show the menu above)\nGenerate the markdown deck first (for content)\nThen generate per-slide HTML files using slide-templates.py\nEach slide gets its own .html file in the exports folder\nTell user: \"Your slides are individual HTML files in exports/. Open each in a browser — they're stage-ready at 1280×720.\""
      },
      {
        "title": "Combined Deck vs Per-Slide Files",
        "body": "ApproachBest ForHowCombined deck (export-html-slides.py)Presenting from one file, quick sharingArrow keys navigate between slidesPer-slide files (slide-templates.py)Maximum visual control, custom layouts per slideEach slide is a standalone HTML fileBothBest of both worldsGenerate per-slide for design, combined for presenting\n\nAGENT: Default to the combined deck for most users. Only use per-slide when the user specifically wants individual files or asks for \"beautiful\" / \"stage-ready\" / \"keynote-quality\" slides."
      },
      {
        "title": "🌐 HTML Slides (Recommended)",
        "body": "Zero dependencies beyond Python 3 standard library. No pip installs.\n\nBeautiful, self-contained HTML presentation you can:\n\nPresent directly in any browser (full-screen, arrow key navigation)\nPrint to PDF with pixel-perfect slide-per-page layout (Ctrl+P)\nShare as a single file — no server, no internet required\nToggle speaker notes live during presentation (press N)\n\n3 built-in themes:\n\nThemeVibeBest ForgradientDeep purple/teal, modernFounder/startup audiences (DEFAULT)darkNavy/red, dramaticStage presentations, evening eventslightClean white/blueCorporate, enterprise audiences\n\nWhen user says \"export as html\", \"make beautiful slides\", \"export for presenting\", or similar:\n\n~/workspace/presentations/helper.sh export-html {pres_id} gradient\n\nAGENT: Ask about theme:\n\"Which vibe? Gradient (modern, default), Dark (dramatic stage look), or Light (clean corporate)?\"\n\nHTML slide features:\n\n⌨️ Arrow keys / space to navigate slides\n📱 Touch/swipe on mobile\n🎙️ Press N to toggle speaker notes panel\n🖨️ Print button — each slide = one page, notes hidden\n📊 Progress bar at bottom\n📐 Responsive — works on any screen size\n\nAfter export: \"Your slides are at exports/{name}.html. Open in any browser to present. Press N for speaker notes. Print (Ctrl+P) for a beautiful PDF.\""
      },
      {
        "title": "🟣 Gamma.app Export",
        "body": "Zero dependencies. Pure shell script.\n\nExports clean markdown optimized for Gamma.app import. Gamma auto-designs your slides — you just provide the content.\n\nWhat the Gamma export does:\n\nStrips all speaker notes (Gamma doesn't import them)\nRemoves note-style blockquotes and metadata lines\nCleans \"Slide N:\" prefixes from headings\nEach ## heading becomes a Gamma \"card\"\nPure content — Gamma auto-styles everything\n\nWhen user says \"export for gamma\", \"gamma export\", \"I want to use gamma\":\n\n~/workspace/presentations/helper.sh export-gamma {pres_id}\n\nAGENT: After Gamma export, show these instructions:\n\"Your Gamma-ready file is at exports/{name}_gamma.md.\nTo import into Gamma:\n\nGo to gamma.app → New → Paste text\nPaste the markdown content or upload the .md file\nGamma turns each heading into a designed card\nPick a theme and click Generate\""
      },
      {
        "title": "PPTX Export",
        "body": "Requires: python3 + python-pptx (pip install python-pptx)\n\nWhen user says \"export as powerpoint\" or \"export pptx\":\n\nCheck: python3 -c \"import pptx\" 2>/dev/null\nIf missing → \"Install with: pip install python-pptx. Want me to try?\"\nIf available → run references/export-pptx.py\nSave to ~/workspace/presentations/exports/{pres_id}.pptx"
      },
      {
        "title": "PDF Export",
        "body": "Requires: pandoc — OR use the HTML Print button (recommended)\n\nWhen user says \"export as pdf\":\n\nRecommend HTML route first: \"The HTML slides have a built-in Print button that creates a beautiful PDF. Want to try that instead?\"\nIf user wants pandoc: check which pandoc, run export\nSave to ~/workspace/presentations/exports/{pres_id}.pdf"
      },
      {
        "title": "Export Comparison",
        "body": "FormatDependenciesVisual QualityBest ForMarkdownNoneContent onlyEditing, version control, sharingHTML SlidesPython 3 only⭐⭐⭐⭐⭐Presenting, printing, sharing as fileGammaNoneGamma designs itUsers who want AI-designed slidesPPTXpython-pptx⭐⭐⭐PowerPoint users, corporatePDFpandoc⭐⭐Static distribution"
      },
      {
        "title": "Presentation Metadata (JSON)",
        "body": "Stored at ~/workspace/presentations/decks/{pres_id}.json:\n\n{\n  \"presentation_id\": \"[generated 8-char hex]\",\n  \"name\": \"[user-friendly name]\",\n  \"created\": \"[ISO timestamp]\",\n  \"updated\": \"[ISO timestamp]\",\n  \"speaker\": {\n    \"name\": \"[from interview]\",\n    \"title\": \"[from interview]\",\n    \"company\": \"[from interview]\"\n  },\n  \"audience\": {\n    \"size\": 0,\n    \"roles\": [],\n    \"interests\": [],\n    \"description\": \"[from interview]\"\n  },\n  \"angle\": {\n    \"title\": \"[selected angle title]\",\n    \"description\": \"[angle description]\"\n  },\n  \"tone\": \"conversational\",\n  \"work\": {\n    \"subject\": \"[what was built/done]\",\n    \"timeline\": \"[how long it took]\",\n    \"results\": {},\n    \"costs\": {},\n    \"mistakes\": []\n  },\n  \"resources\": {\n    \"cta\": \"[primary call to action]\",\n    \"links\": [],\n    \"coupon_codes\": []\n  },\n  \"slides\": [\n    {\n      \"slide_number\": 1,\n      \"slide_type\": \"title\",\n      \"title\": \"[slide title]\"\n    }\n  ],\n  \"validation\": {\n    \"speculative_flags\": 0,\n    \"projection_flags\": 0,\n    \"verified_claims\": 0,\n    \"last_validated\": \"[timestamp]\"\n  }\n}"
      },
      {
        "title": "Duplicate for Different Audiences",
        "body": "When user says \"duplicate [name]\" or \"I need this for a different audience\":\n\nCopy the metadata JSON\nGenerate new presentation_id\nAsk: \"Same content, different audience? Tell me about the new audience.\"\nRe-run Phase 2 (Audience) and Phase 5 (Angle) only\nRe-generate the deck with new angle/tone\nSave as a new presentation\n\nThis lets users create multiple versions of the same talk for different events."
      },
      {
        "title": "Configuration Reference",
        "body": "FieldTypeDefaultDescriptiondefaults.tonestringconversationalprofessional / conversational / humorous / technicaldefaults.max_slidesnumber20Maximum slides per deckdefaults.include_speaker_notesbooleantrueAuto-generate speaker notesdefaults.factual_validationbooleantrueFlag speculative languagedefaults.include_mistakes_slidebooleantrueInclude authenticity slidedefaults.include_costs_slidebooleantrueInclude investment breakdownexport.default_formatstringhtmlDefault export formatexport.html_themestringsparkterminal / executive / spark / cleanexport.per_slide_htmlbooleanfalseGenerate individual HTML files per slideexport.formats_available.*booleanvariesWhich export formats are readyspeaker.*string\"\"Default speaker info (reused across decks)branding.cta_linksarray[]Default CTA links for all decksbranding.training_linksarray[]Default training resource linksbranding.coupon_codesarray[]Default coupon codes"
      },
      {
        "title": "Input Sanitization Rules",
        "body": "⚠️ PRIMARY DEFENSE: The helper script (~/workspace/presentations/helper.sh) enforces sanitization in code.\n\nSecondary rules for edge cases:\n\nStrip shell metacharacters from all user input before exec\nJSON writes go through the helper's save-meta command with validation\nHeredocs use quoted delimiters (<< 'EOF') to prevent expansion\nLength limits: Presentation name ≤ 100 chars, slide content ≤ 5000 chars per slide\nNever pass unsanitized user input to exec. No exceptions."
      },
      {
        "title": "What This Skill Does NOT Do",
        "body": "Does NOT use external slide APIs. References to slide_initialize, slide_edit, and slide_present in some OpenClaw guides are Manus-specific tools not available here. This skill generates HTML/Markdown files directly.\nDoes NOT make up numbers. Every stat comes from your interview answers. Missing data gets a [INSERT] placeholder.\nDoes NOT predict the future. Projections are conservative, caveated, and flagged for your review.\nDoes NOT replace practice. A great deck with a bad delivery is still a bad presentation. Use the speaker notes.\nDoes NOT access files outside ~/workspace/presentations/ without explicit permission.\nDoes NOT require internet for presenting. HTML slides are self-contained (fonts are loaded from Google Fonts CDN but slides degrade gracefully without them)."
      },
      {
        "title": "Why This Exists",
        "body": "Most presentations are built backwards. People open a template, fill in slides, and try to find a story. The result is generic decks with made-up projections and no soul.\n\nAI Presentation Maker works forwards. You tell it what actually happened. It finds the story. Every number is real. Every claim is verified. Every mistake is included because authenticity sells better than perfection.\n\nThe interview takes 5 minutes. The deck takes 30 seconds. The refinement takes however long you want. And when you stand up to present, you know every word is true."
      },
      {
        "title": "Who Built This",
        "body": "Jeff J Hunter is the creator of the AI Persona Method and founder of the world's first AI Certified Consultant program.\n\nHe runs the largest AI community (3.6M+ members) and has been featured in Entrepreneur, Forbes, ABC, and CBS. As founder of VA Staffer (150+ virtual assistants), Jeff has spent a decade building systems that let humans and AI work together effectively.\n\nAI Presentation Maker is part of the AI Persona ecosystem — the same system Jeff uses to build his own keynotes."
      },
      {
        "title": "Want to Make Money with AI?",
        "body": "Most people burn API credits with nothing to show for it.\n\nThis skill gives you the pitch deck. But if you want to turn AI into actual income, you need the complete playbook.\n\n→ Join AI Money Group: https://aimoneygroup.com\n\nLearn how to build AI systems that pay for themselves."
      },
      {
        "title": "Connect",
        "body": "Website: https://jeffjhunter.com\nAI Persona Method: https://aipersonamethod.com\nAI Money Group: https://aimoneygroup.com\nLinkedIn: /in/jeffjhunter"
      },
      {
        "title": "License",
        "body": "MIT — Use freely, modify, distribute. Attribution appreciated.\n\nAI Presentation Maker — Facts, not fantasies. 🎤"
      }
    ],
    "body": "🎤 AI Presentation Maker\n\nThe interview-driven pitch deck generator for your OpenClaw agent.\n\nTell it what you built. Tell it who's in the room. Pick an angle. Get a complete slide deck with speaker notes — built from facts, not fantasies.\n\n⛔ AGENT RULES — READ BEFORE DOING ANYTHING\nUse EXACT text from this file. Do not paraphrase menus, slide type names, or instructions. Copy them verbatim.\nNEVER tell the user to open a terminal or run commands. You have the exec tool. USE IT. Run every command yourself via exec.\nOne step at a time. Interview questions go 1-2 at a time. Never dump the full questionnaire.\nNEVER overwrite existing presentation files without asking. If the file exists, ask before replacing.\nFACTUAL VALIDATION IS MANDATORY. Before generating any slide, check for speculative language. Flag it. The user decides what stays.\nScope: ~/workspace/presentations/ only. All file operations stay under this directory.\nUSE THE HELPER SCRIPT FOR ALL FILE OPERATIONS. Never construct raw shell commands with user input. Always route through assets/presentation-helper.sh.\nSpeaker notes are required. Every slide gets \"What to say\" and \"What NOT to say\" notes. No exceptions.\nNo made-up numbers. If the user hasn't provided a specific stat, don't invent one. Use \"[INSERT ACTUAL NUMBER]\" as placeholder and flag it.\nRespect the user's voice. If they talk casually, the deck should feel casual. If they're formal, match it. The interview captures this.\n🛡️ Helper Script — Security Layer\n\nAll file operations go through assets/presentation-helper.sh. This script enforces sanitization in code, not in prompt instructions.\n\nFirst-run: Copy the helper to the workspace:\n\ncp assets/presentation-helper.sh ~/workspace/presentations/helper.sh\nchmod +x ~/workspace/presentations/helper.sh\n\n\nUsage:\n\n# Create workspace\n~/workspace/presentations/helper.sh init\n\n# Save presentation metadata (JSON from stdin)\n~/workspace/presentations/helper.sh save-meta < /tmp/pres_meta.json\n\n# Save slide deck (Markdown from stdin)\n~/workspace/presentations/helper.sh save-deck <pres_id>\n\n# List presentations\n~/workspace/presentations/helper.sh list\n\n# Get presentation metadata\n~/workspace/presentations/helper.sh get-meta <pres_id>\n\n# Get slide deck\n~/workspace/presentations/helper.sh get-deck <pres_id>\n\n# Delete presentation\n~/workspace/presentations/helper.sh delete <pres_id>\n\n# Sanitize a string\n~/workspace/presentations/helper.sh sanitize-string \"user input\"\n\n🔍 Post-Install Check\n\n🚨 AGENT: Run this FIRST before showing any menu.\n\n# Check for existing workspace\nls ~/workspace/presentations/config.yaml 2>/dev/null\n\n# Check for AI Persona OS\nls ~/workspace/SOUL.md ~/workspace/AGENTS.md 2>/dev/null | wc -l\n\n# Check export dependencies\nwhich python3 2>/dev/null && echo \"HTML export: ✅ (recommended)\" || echo \"HTML export: ❌ (needs python3)\"\necho \"Gamma export: ✅ (always available)\"\nwhich pandoc 2>/dev/null && echo \"PDF export: ✅\" || echo \"PDF export: ❌ (install pandoc — or use HTML print)\"\nwhich python3 2>/dev/null && python3 -c \"import pptx; print('PPTX export: ✅')\" 2>/dev/null || echo \"PPTX export: ❌ (install python3 + python-pptx)\"\n\n\nIf config.yaml exists → workspace is set up. Show:\n\n\"🎤 Presentation Maker is ready. You have X decks saved. Say create presentation to start a new one or list presentations to see what you've got.\"\n\nIf config.yaml is missing → fresh install. Show the welcome message:\n\n🚨 AGENT: OUTPUT THE EXACT TEXT BELOW VERBATIM.\n\n🎤 Welcome to AI Presentation Maker!\n\nI build slide decks from your actual work — not templates\nstuffed with placeholder text.\n\nHere's how it works:\n\n1. 🎯 I interview you (5 min)\n   What you built, who's in the room, what matters\n\n2. 🧭 I suggest angles (pick one)\n   3-5 ways to frame your story\n\n3. 📊 I generate your deck\n   Slides + speaker notes + factual validation\n\n4. ✏️ You refine\n   Add details, change tone, cut slides\n\n5. 📦 Export\n   Markdown (default), PPTX, or PDF\n\nEvery number in your deck comes from YOU.\nNo made-up ROI. No fake projections.\n\nReady? Say \"create presentation\" to start.\n\n\nWait for explicit confirmation before proceeding.\n\nSetup (First Run Only)\nCreate Workspace\n\nAGENT: Run on first use.\n\nmkdir -p ~/workspace/presentations/{decks,exports,archive}\ncp assets/presentation-helper.sh ~/workspace/presentations/helper.sh\nchmod +x ~/workspace/presentations/helper.sh\n\nDefault Config\n\nWrite ~/workspace/presentations/config.yaml:\n\n# AI Presentation Maker — Configuration\n# Edit directly or say \"edit config\" in chat\n\ndefaults:\n  tone: \"conversational\"  # professional | conversational | humorous | technical\n  max_slides: 20\n  include_speaker_notes: true\n  factual_validation: true     # Flag speculative language\n  include_mistakes_slide: true  # Authenticity builder\n  include_costs_slide: true     # Real investment breakdown\n\nexport:\n  default_format: \"html\"\n  html_theme: \"spark\"   # terminal | executive | spark | clean\n  per_slide_html: false  # true = individual HTML files per slide (keynote quality)\n  formats_available:\n    markdown: true\n    html: true        # Zero dependencies — recommended\n    gamma: true       # Zero dependencies — for Gamma.app users\n    pptx: false       # Set true after installing python-pptx\n    pdf: false        # Set true after installing pandoc (or use HTML print)\n\nspeaker:\n  name: \"\"           # Set during first presentation or say \"edit config\"\n  title: \"\"\n  company: \"\"\n  bio: \"\"\n\nbranding:\n  cta_links: []\n  training_links: []\n  coupon_codes: []\n\n\nAGENT: If AI Persona OS is detected, pull speaker info from SOUL.md or AGENTS.md if available. Ask user to confirm.\n\nCreating a Presentation\nThe Interview\n\nWhen user says \"create presentation\", \"new deck\", \"build slides\", \"make a pitch deck\", or similar:\n\nAGENT: Follow this interview flow. Ask 1-2 questions per message. Be conversational. Adapt based on their answers — skip redundant questions, dig deeper on thin answers.\n\nPhase 1: The Subject (1 message)\n\n\"What's this presentation about? Give me the short version — what did you build, do, or accomplish?\"\n\nCapture: Core subject. This seeds everything.\n\nIf they give a thin answer (e.g., \"my AI project\"), follow up:\n\n\"Tell me more — what specifically did you build? What does it do? How long did it take?\"\n\nPhase 2: The Audience (1 message)\n\n\"Who's in the room?\n\nHow many people?\nWhat do they do? (founders, developers, executives, students...)\nWhat are they hoping to learn or get from this?\"\n\nCapture: Audience profile. Drives tone, depth, and angle selection.\n\nPhase 3: The Speaker (1 message)\n\n\"Quick — your name, title, and one sentence of credibility. What makes you the person to give this talk?\"\n\n(If I already have your speaker info from config, I'll use that — just confirm.)\n\nCapture: Speaker identity. Goes on title slide and shapes authority framing.\n\nIf config already has speaker info: Show it and ask to confirm or update.\n\nPhase 4: The Work (1-2 messages)\n\nThis is the most important phase. Get SPECIFICS.\n\n\"Now the meat — what did you actually do? I need real details:\n\nWhat was built or created?\nHow long did it take?\nWhat results do you have so far? (actual numbers only)\nWhat did it cost? (hardware, software, time)\nWhat went wrong? (mistakes are gold for presentations)\"\n\nCapture: Factual foundation. Every claim in the deck traces back to this.\n\nIf they skip costs: Ask specifically:\n\n\"What about costs? Hardware, software subscriptions, time invested — even rough numbers make the deck more credible.\"\n\nIf they skip mistakes: Ask specifically:\n\n\"Any mistakes or things that didn't work the first time? Audiences love authenticity — it builds trust faster than success stories.\"\n\nPhase 5: The Angle (1 message)\n\nBased on everything gathered, generate 3-5 presentation angles.\n\nAGENT — Angle generation rules:\n\nEach angle is a distinct FRAMING of the same content — not different topics\nEach angle implies a different audience takeaway\nName each angle with a punchy title (3-6 words)\nAdd one sentence explaining the angle's focus\nConsider these angle categories:\nCost/Time Savings — \"We did X for $Y in Z hours\"\nCapability Expansion — \"Now we can do things we couldn't before\"\nNew Business Model — \"This changes how we make money\"\nCompetitive Advantage — \"While others are still doing X, we're doing Y\"\nPersonal Transformation — \"How this changed my approach to everything\"\nDemocratization — \"Anyone can do this now, here's how\"\nBehind the Scenes — \"Here's exactly how we built it, warts and all\"\n\nPresent like this:\n\n🧭 Here are 5 angles for your deck:\n\n1. [Punchy Title]\n   [One sentence explaining the focus]\n\n2. [Punchy Title]\n   [One sentence explaining the focus]\n\n3. [Punchy Title]\n   [One sentence explaining the focus]\n\n4. [Punchy Title]\n   [One sentence explaining the focus]\n\n5. [Punchy Title]\n   [One sentence explaining the focus]\n\nWhich one resonates? (pick a number or describe your own)\n\n\nCapture: Selected angle. This determines the narrative arc of the entire deck.\n\nPhase 6: Resources & CTA (1 message)\n\n\"Last thing — any resources to include?\n\nLinks to share? (tools, courses, websites)\nCoupon codes or special offers?\nWhat's the ONE thing you want people to do after this talk? (sign up, book a call, visit a URL, join a community)\"\n\nCapture: CTA and resources. Goes on closing slides.\n\nIf they say \"nothing\": That's fine. Not every deck needs a hard CTA.\n\nInterview Complete → Generate Deck\n\nAfter all 6 phases, confirm the brief:\n\n🎤 PRESENTATION BRIEF\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n📌 Subject: [subject]\n👥 Audience: [size] [roles] — [what they want]\n🎙️ Speaker: [name], [title]\n🧭 Angle: [selected angle]\n💰 Costs: [summary]\n📊 Results: [summary]\n❌ Mistakes: [summary]\n🎯 CTA: [what they should do after]\n\nGenerating your deck now...\n\n\nThen proceed to Deck Generation.\n\nDeck Generation\nSlide Structure\n\nThe agent generates slides based on the selected angle and gathered data. Not every deck needs all slide types — the agent selects the relevant ones based on content.\n\nCore Slides (always included)\n\nSLIDE 1: Title Slide\n\nPresentation title (from the selected angle)\nSpeaker name + title\nEvent/date (if provided)\n\nSLIDE 2: The Hook\n\nONE fact-based statement that grabs attention\nMust be verifiable from the interview data\nNo speculation. Example: \"Yesterday, I built a lead gen system in 5 hours for $40/month. It sent 20 emails and got a reply by midnight.\"\n\nSLIDE 3: The Problem\n\nThe verified pain point the audience has\nMust connect to what was built\nDraw from audience profile (Phase 2)\n\nSLIDE 4: What We Built\n\nConcrete description of the work\nTimeline\nScreenshots/evidence descriptions (agent notes where visuals should go)\n\nSLIDE 5: What It Does\n\nCapabilities as a list or table\nEach capability must be real (no \"coming soon\" features unless flagged)\n\nSLIDE 6: Real Results\n\nActual numbers from the interview\nNo rounding up. No \"approximately.\" Use exact figures.\nIf results are early/limited: \"Early results from [timeframe]:\" — frame as an experiment, not a case study\nSituational Slides (included when relevant data exists)\n\nSLIDE: Investment / Real Costs\n\nHardware, software, time — actual numbers\nInclude if: user provided cost data\nFormat as a simple breakdown table\n\nSLIDE: Mistakes & What We Learned\n\nReal failures from the interview\nWhat went wrong → what was fixed → what was learned\nInclude if: user shared mistakes AND config.include_mistakes_slide: true\n\nSLIDE: Why Now\n\nWhat changed that made this possible/easier\nHistorical context — \"You could have done this before, but...\"\nInclude if: the work involves new technology or methodology\n\nSLIDE: DIY Path\n\nHow the audience could replicate this themselves\nTools, steps, approximate time/cost\nInclude if: audience profile suggests they want to do it themselves\n\nSLIDE: What We're Testing\n\nExperiments in progress, framed honestly\n\"We're currently testing...\" not \"This will...\"\nInclude if: user mentioned ongoing experiments\n\nSLIDE: Potential (WITH CAVEATS)\n\nConservative projections ONLY\nMUST include caveat language: \"Based on early results, IF current trends hold...\"\nInclude if: user explicitly wants projections\n⚠️ Flag this slide for factual review\n\nSLIDE: What You Could Build\n\nFramework for the audience to apply to their own context\nNot prescriptive — suggestive. \"Here's a framework for thinking about this.\"\nInclude if: audience is builders/doers\nClosing Slides (always included)\n\nSLIDE: The Offer / CTA\n\nClear single action for the audience\nInclude links, codes, URLs from Phase 6\nIf no CTA was provided → make this a \"Where to Learn More\" slide\n\nSLIDE: Q&A\n\nSimple closer\nInclude speaker contact info\nInclude resource links\nSpeaker Notes Format\n\nEvery slide MUST include speaker notes in this format:\n\n### Speaker Notes — [Slide Title]\n\n**What to say:**\n[2-4 bullet points of what the speaker should communicate]\n[Include specific numbers to reference]\n[Include transitions to the next slide]\n\n**What NOT to say:**\n[1-2 things to avoid]\n[Common traps: overpromising, speculation, competitor bashing]\n\n**Timing:** ~[X] minutes\n\n**Visual aids:** [Screenshots, demos, or props to reference]\n\n\nAGENT: \"What NOT to say\" is critical. Common entries:\n\n\"Don't promise specific ROI numbers you haven't verified\"\n\"Don't compare to competitors by name\"\n\"Don't say 'this will definitely...' — say 'based on what we've seen...'\"\n\"Don't skip the costs slide — transparency builds trust\"\n\"Don't apologize for early results — frame as experiments\"\nFactual Validation\n\n🚨 MANDATORY: Run this check before showing the generated deck to the user.\n\nScan every slide for:\n\nFlag\tPattern\tAction\n🔴 Speculative\t\"could save\", \"might generate\", \"potential to\", \"up to\", \"estimated\"\tFlag and suggest rewording to factual language\n🔴 Unverified number\tAny number not from the interview data\tReplace with [INSERT ACTUAL NUMBER] placeholder\n🟡 Projection\tFuture tense claims about results\tAdd caveat: \"Based on early results, IF trends hold...\"\n🟡 Superlative\t\"best\", \"fastest\", \"only\", \"first\"\tFlag — user must confirm or remove\n🟢 Hedged OK\t\"We're testing\", \"Early results suggest\", \"In our experience\"\tNo action — these are honest framings\n\nAfter generation, show a validation summary:\n\n📋 FACTUAL VALIDATION\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n🔴 Speculative claims found: [X]\n🟡 Projections needing caveats: [X]\n🟢 Factual claims verified: [X]\n\n[List each flag with slide number and the flagged text]\n\nFix these? (yes / show me / leave as-is)\n\nTone Profiles\n\nThe deck's language adapts to the selected tone:\n\nProfessional\n\nFormal language, no contractions\nData-forward, minimal storytelling\n\"The system processed 20 outreach emails within the first 6 hours of deployment.\"\n\nConversational (DEFAULT)\n\nContractions, natural language\nStory-driven with data supporting\n\"We built this thing yesterday. Sent 20 emails. Got a reply by midnight.\"\n\nHumorous\n\nSelf-deprecating, light\nMistakes slide is emphasized\n\"So naturally, the first thing it did was email the wrong person. We fixed that.\"\n\nTechnical\n\nJargon-appropriate, architecture-focused\nInclude system diagrams, stack details\n\"The pipeline uses JSON-based lead storage with cron-triggered sequence management.\"\nAsset Planning (Before Generation)\n\nAfter the interview and outline are complete, but BEFORE generating slides, plan all visual assets.\n\nAGENT: Run this checklist before generating any slides:\n\nAsset Checklist\n\nImage needs — Which slides need images? (screenshots, product photos, diagrams)\n\nMap each image to a specific slide in the outline\nIf user mentioned a demo → screenshot slide\nIf user mentioned data → plan a big_number or comparison slide\nIf user has a logo → title and closing slides\n\nQR codes — Does the CTA include a URL?\n\nGenerate QR codes BEFORE slide generation (not during)\nSave to ~/workspace/presentations/assets/{pres_id}/\n\nData visualization — Any numbers that need charts or infographics?\n\nPlan the visualization type (comparison table, big number, timeline)\nMatch to a slide type from the template gallery\n\nMissing assets — What's missing?\n\nUse [IMAGE: description of what's needed] placeholder\nTell user: \"I need a screenshot of [X] to complete slide [N]. Can you provide one?\"\n\nAGENT: Never generate slides with broken image paths. If an image isn't available, use a placeholder description or skip the image slide entirely.\n\nCustom Style Instruction\n\nIf the user wants a custom look beyond the 4 built-in themes, build a style_instruction object:\n\n{\n  \"aesthetic_direction\": \"A stark, high-contrast design for maximum stage presence.\",\n  \"color_palette\": \"Background: #1A1A1A, Title: #FFFFFF, Body: #B3B3B3, Accent: #00E676\",\n  \"typography\": \"Font Family: Roboto. Headline: 64px, Body: 32px, Caption: 18px.\"\n}\n\n\nPass this to the template engine:\n\npython3 references/slide-templates.py \\\n  --style-instruction '{\"aesthetic_direction\":\"...\",\"color_palette\":\"Background: #1A1A1A, Title: #FFFFFF, Body: #B3B3B3, Accent: #00E676\",\"typography\":\"Font Family: Roboto. Headline: 64px, Body: 32px.\"}' \\\n  --theme custom --type title --title \"My Talk\" --output slide_01.html\n\n\nAGENT: When user asks for custom colors/fonts:\n\nAsk for their brand colors (background, text, accent)\nAsk for font preference (or default to Inter)\nBuild the style_instruction JSON\nGenerate all slides using --theme custom --style-instruction '{...}'\nQuality Checklist (Post-Generation)\n\nAfter generating all slides, run this QA check BEFORE showing to user.\n\nAGENT: Run this checklist after EVERY deck generation. Report any issues found.\n\nAutomated Checks\nCheck\tWhat To Verify\tAction If Failed\nStyle consistency\tAll slides use same theme colors/fonts\tRe-generate with correct theme\nContent integrity\tEvery interview fact appears in slides\tAdd missing content\nOne idea per slide\tNo slide has more than 2-3 bullet points\tSplit into multiple slides\nOverflow prevention\tNo text exceeds 6 lines per slide body\tSplit or trim\nImage validation\tAll src= paths exist or are placeholders\tReplace with [IMAGE: description]\nAccessibility\tAll <img> tags have alt attributes\tAdd descriptive alt text\nLink validation\tAll URLs in CTA/closing are reachable\tFlag broken links\nSpeaker notes\tEvery slide has \"What to say\" notes\tAdd notes for bare slides\nFactual validation\tNo speculative language (already handled)\tRun validation engine\nText Length Rules\nElement\tMaximum\tIf Exceeded\nSlide title\t8 words\tShorten or split into title + subtitle\nBullet point\t15 words\tRewrite more concisely\nBullets per slide\t5 items\tSplit into 2 slides\nBody paragraph\t3 sentences\tConvert to bullets or split\nSpeaker note\t4 sentences per section\tTrim to essentials\n\nAGENT: After QA, report: \"✅ Quality check complete: [N] slides, [N] issues found.\" Then list any issues with slide numbers.\n\nEdge Case Handling\nLong Text Auto-Split\n\nIf a slide's content exceeds the maximum (5 bullets or 3 paragraphs), automatically split:\n\nKeep the original title for the first slide\nAdd \"(cont'd)\" to the title for subsequent slides\nSplit content at natural break points (paragraph breaks, after 3rd bullet)\nEach resulting slide must pass the text length rules\n\nAGENT: When interview data produces too much content for one slide: \"That's a lot of great content. I'm splitting it across 2 slides to keep each one clean and readable.\"\n\nMissing Sections\n\nIf the interview is incomplete (e.g., user skipped the costs question):\n\nDo NOT generate a costs slide with made-up numbers\nDo NOT silently skip the slide\nDO tell the user: \"I notice we didn't cover costs. Want me to add a costs slide? I'll need the real numbers.\"\nDO generate remaining slides normally\nMissing Images\n\nIf a slide references an image that doesn't exist:\n\nFor screenshots: Replace with a styled placeholder box saying [Screenshot: description]\nFor QR codes: Skip the QR element, keep the link text visible\nFor logos: Use text-only version of the name\nNever leave a broken <img> tag in the output\nUnusual Content\nAll numbers: If interview only provided one or two data points, use big_number slides instead of tables\nNo mistakes: If user says \"we didn't make mistakes\" → skip mistakes slide entirely, don't force it\nNo CTA: If user has no links/offers → use a simple closing slide with contact info only\nVery short talk: If user wants 3-5 slides, use only: title, one content, closing\nIn-Chat Commands\nCommand\tWhat It Does\ncreate presentation\tStart the interview → generate a new deck\nlist presentations\tShow all saved decks with dates and slide counts\nshow [name]\tDisplay a saved deck in chat\nedit [name]\tRe-open a deck for changes\nadd slide [name]\tAdd a new slide to an existing deck\nremove slide [name] [#]\tRemove a slide by number\nreorder [name]\tShow slides and let user drag/reorder\nchange tone [name] [tone]\tRewrite deck in a different tone\nexport [name] [format]\tExport to markdown/html/gamma/pptx/pdf\nspeaker notes [name]\tShow just the speaker notes\nvalidate [name]\tRe-run factual validation\nduplicate [name]\tCopy a deck for a different audience/angle\narchive [name]\tMove to archive\ndelete [name]\tDelete permanently (asks to confirm)\npresentation help\tShow all commands\n\nAGENT: Recognize natural language. \"Make me a pitch deck\" = create presentation. \"Show me my slides\" = list presentations. \"Export it as PowerPoint\" = export [last deck] pptx. Be flexible.\n\nEditing & Refinement\n\nWhen user says \"edit [name]\" or asks to change a deck:\n\nQuick Edits\n\nThe agent should handle these naturally:\n\nUser Says\tAgent Does\n\"Add real costs\"\tAsks for cost details, adds/updates Investment slide\n\"Remove projections\"\tStrips all projection language, removes Potential slide if needed\n\"Add [specific detail]\"\tAdds to the relevant slide or creates a new one\n\"Make it shorter\"\tSuggests slides to cut, asks for approval\n\"Make it longer\"\tSuggests slides to add based on interview data\n\"Change the tone to [X]\"\tRewrites all slides in the new tone\n\"Add a mistake\"\tAsks what went wrong, adds to Mistakes slide\n\"Update the results\"\tAsks for new numbers, updates Results slide\n\"Change the angle\"\tRe-generates deck with new angle (keeps all data)\n\"Add speaker notes\"\tGenerates notes for any slides missing them\n\"Move slide X to position Y\"\tReorders slides\nMajor Revisions\n\nIf the user wants a fundamentally different deck:\n\n\"That's a big change. Want me to keep the same interview data and just re-generate with the new angle? Or start fresh?\"\n\nExport\nMarkdown (Default)\n\nEvery presentation is stored as Markdown at ~/workspace/presentations/decks/{pres_id}.md.\n\nMarkdown format:\n\n# [Presentation Title]\n*[Speaker Name] — [Title]*\n*[Date]*\n\n---\n\n## Slide 1: [Slide Title]\n\n[Slide content]\n\n> **Speaker Notes:**\n> **Say:** [what to say]\n> **Don't say:** [what not to say]\n> **Timing:** ~X min\n\n---\n\n## Slide 2: [Slide Title]\n\n[Slide content]\n\n...\n\n---\n\n## Resources\n\n- [Link 1]\n- [Link 2]\n\n---\n\n*Generated by AI Presentation Maker — Facts, not fantasies.*\n\n🎨 Template Gallery\n\nWhen generating HTML slides, the user picks a theme and the agent selects slide types from the gallery. The agent can also generate per-slide HTML files for maximum control.\n\nChoosing a Theme\n\nAGENT: Ask the user to pick a theme BEFORE generating HTML slides. Show this menu:\n\n🎨 Pick a visual theme for your slides:\n\n1. 🖥️  Terminal    — Dark + green, terminal window frames. Hacker/tech vibe.\n2. 🏢  Executive   — Navy + gold, clean serif headings. Boardroom ready.\n3. ⚡  Spark       — Purple/teal gradient, modern sans-serif. Startup energy.\n4. ✨  Clean       — White + charcoal, Swiss minimal. Universal and professional.\n5. 🎨  Custom      — Tell me your brand colors and I'll build a custom theme.\n\nWhich one? (pick a number or describe what you want)\n\n\nIf the user describes something custom (e.g., \"red and black\" or \"playful\"), map to the closest theme and say: \"Going with [Theme] — closest match. I can tweak colors after.\"\n\nSlide Type Gallery\n\nThe agent selects from these 11 premade slide layouts. Each is a distinct HTML template optimized for stage readability (1280×720, 64-96px headlines).\n\nType\tName\tWhat It's For\tKey Fields\ntitle\tTitle Slide\tHero opener — name, subtitle, speaker\ttitle, subtitle, speaker\nsection\tSection Divider\tBreak between major sections\ttitle, subtitle\ntext\tSimple Text\tBullet points or paragraphs\ttitle, body\ntext_and_image\tText + Image\tSplit layout — text left, image right\ttitle, body, image_path\nbig_number\tBig Number\tONE massive stat as hero element\tnumber, label, context\ncomparison\tComparison\tSide-by-side (before/after, old/new)\ttitle, left/right columns\nscreenshot\tScreenshot\tFull-width image with caption overlay\ttitle, image_path, caption\nquote\tQuote\tLarge pull quote with attribution\tquote_text, attribution\ntimeline\tTimeline\tStep-by-step process or chronology\ttitle, steps[]\nqr_code\tQR Code\tQR hero + CTA link + scan prompt\ttitle, qr_image_path, link_text\nclosing\tClosing / CTA\tFinal slide with links and contact\ttitle, cta_text, links[], speaker\n\nAGENT: When generating a deck, select slide types based on the interview data.\n\nMapping guide:\n\nHook fact → big_number or title\nProblem statement → text\nWhat we built → text or text_and_image (with screenshot)\nResults → big_number (for hero stat) + text (for detail)\nCosts → comparison (old way vs new way)\nMistakes → text (with bullets)\nQuote from user or testimonial → quote\nProcess/timeline → timeline\nCTA with link/QR → qr_code\nClosing → closing\nGenerating Per-Slide HTML\n\nFor maximum visual control, generate each slide as its own HTML file:\n\npython3 references/slide-templates.py \\\n  --theme terminal \\\n  --type big_number \\\n  --number \"71\" \\\n  --label \"Leads Imported\" \\\n  --context \"In under 5 minutes\" \\\n  --output ~/workspace/presentations/exports/slide_04.html\n\n\nAGENT: When user asks for \"beautiful slides\" or \"stage-ready slides\" or \"keynote quality\":\n\nAsk which theme (show the menu above)\nGenerate the markdown deck first (for content)\nThen generate per-slide HTML files using slide-templates.py\nEach slide gets its own .html file in the exports folder\nTell user: \"Your slides are individual HTML files in exports/. Open each in a browser — they're stage-ready at 1280×720.\"\nCombined Deck vs Per-Slide Files\nApproach\tBest For\tHow\nCombined deck (export-html-slides.py)\tPresenting from one file, quick sharing\tArrow keys navigate between slides\nPer-slide files (slide-templates.py)\tMaximum visual control, custom layouts per slide\tEach slide is a standalone HTML file\nBoth\tBest of both worlds\tGenerate per-slide for design, combined for presenting\n\nAGENT: Default to the combined deck for most users. Only use per-slide when the user specifically wants individual files or asks for \"beautiful\" / \"stage-ready\" / \"keynote-quality\" slides.\n\n🌐 HTML Slides (Recommended)\n\nZero dependencies beyond Python 3 standard library. No pip installs.\n\nBeautiful, self-contained HTML presentation you can:\n\nPresent directly in any browser (full-screen, arrow key navigation)\nPrint to PDF with pixel-perfect slide-per-page layout (Ctrl+P)\nShare as a single file — no server, no internet required\nToggle speaker notes live during presentation (press N)\n\n3 built-in themes:\n\nTheme\tVibe\tBest For\ngradient\tDeep purple/teal, modern\tFounder/startup audiences (DEFAULT)\ndark\tNavy/red, dramatic\tStage presentations, evening events\nlight\tClean white/blue\tCorporate, enterprise audiences\n\nWhen user says \"export as html\", \"make beautiful slides\", \"export for presenting\", or similar:\n\n~/workspace/presentations/helper.sh export-html {pres_id} gradient\n\n\nAGENT: Ask about theme: \"Which vibe? Gradient (modern, default), Dark (dramatic stage look), or Light (clean corporate)?\"\n\nHTML slide features:\n\n⌨️ Arrow keys / space to navigate slides\n📱 Touch/swipe on mobile\n🎙️ Press N to toggle speaker notes panel\n🖨️ Print button — each slide = one page, notes hidden\n📊 Progress bar at bottom\n📐 Responsive — works on any screen size\n\nAfter export: \"Your slides are at exports/{name}.html. Open in any browser to present. Press N for speaker notes. Print (Ctrl+P) for a beautiful PDF.\"\n\n🟣 Gamma.app Export\n\nZero dependencies. Pure shell script.\n\nExports clean markdown optimized for Gamma.app import. Gamma auto-designs your slides — you just provide the content.\n\nWhat the Gamma export does:\n\nStrips all speaker notes (Gamma doesn't import them)\nRemoves note-style blockquotes and metadata lines\nCleans \"Slide N:\" prefixes from headings\nEach ## heading becomes a Gamma \"card\"\nPure content — Gamma auto-styles everything\n\nWhen user says \"export for gamma\", \"gamma export\", \"I want to use gamma\":\n\n~/workspace/presentations/helper.sh export-gamma {pres_id}\n\n\nAGENT: After Gamma export, show these instructions: \"Your Gamma-ready file is at exports/{name}_gamma.md.\n\nTo import into Gamma:\n\nGo to gamma.app → New → Paste text\nPaste the markdown content or upload the .md file\nGamma turns each heading into a designed card\nPick a theme and click Generate\"\nPPTX Export\n\nRequires: python3 + python-pptx (pip install python-pptx)\n\nWhen user says \"export as powerpoint\" or \"export pptx\":\n\nCheck: python3 -c \"import pptx\" 2>/dev/null\nIf missing → \"Install with: pip install python-pptx. Want me to try?\"\nIf available → run references/export-pptx.py\nSave to ~/workspace/presentations/exports/{pres_id}.pptx\nPDF Export\n\nRequires: pandoc — OR use the HTML Print button (recommended)\n\nWhen user says \"export as pdf\":\n\nRecommend HTML route first: \"The HTML slides have a built-in Print button that creates a beautiful PDF. Want to try that instead?\"\nIf user wants pandoc: check which pandoc, run export\nSave to ~/workspace/presentations/exports/{pres_id}.pdf\nExport Comparison\nFormat\tDependencies\tVisual Quality\tBest For\nMarkdown\tNone\tContent only\tEditing, version control, sharing\nHTML Slides\tPython 3 only\t⭐⭐⭐⭐⭐\tPresenting, printing, sharing as file\nGamma\tNone\tGamma designs it\tUsers who want AI-designed slides\nPPTX\tpython-pptx\t⭐⭐⭐\tPowerPoint users, corporate\nPDF\tpandoc\t⭐⭐\tStatic distribution\nData Structure\nPresentation Metadata (JSON)\n\nStored at ~/workspace/presentations/decks/{pres_id}.json:\n\n{\n  \"presentation_id\": \"[generated 8-char hex]\",\n  \"name\": \"[user-friendly name]\",\n  \"created\": \"[ISO timestamp]\",\n  \"updated\": \"[ISO timestamp]\",\n  \"speaker\": {\n    \"name\": \"[from interview]\",\n    \"title\": \"[from interview]\",\n    \"company\": \"[from interview]\"\n  },\n  \"audience\": {\n    \"size\": 0,\n    \"roles\": [],\n    \"interests\": [],\n    \"description\": \"[from interview]\"\n  },\n  \"angle\": {\n    \"title\": \"[selected angle title]\",\n    \"description\": \"[angle description]\"\n  },\n  \"tone\": \"conversational\",\n  \"work\": {\n    \"subject\": \"[what was built/done]\",\n    \"timeline\": \"[how long it took]\",\n    \"results\": {},\n    \"costs\": {},\n    \"mistakes\": []\n  },\n  \"resources\": {\n    \"cta\": \"[primary call to action]\",\n    \"links\": [],\n    \"coupon_codes\": []\n  },\n  \"slides\": [\n    {\n      \"slide_number\": 1,\n      \"slide_type\": \"title\",\n      \"title\": \"[slide title]\"\n    }\n  ],\n  \"validation\": {\n    \"speculative_flags\": 0,\n    \"projection_flags\": 0,\n    \"verified_claims\": 0,\n    \"last_validated\": \"[timestamp]\"\n  }\n}\n\nDuplicate for Different Audiences\n\nWhen user says \"duplicate [name]\" or \"I need this for a different audience\":\n\nCopy the metadata JSON\nGenerate new presentation_id\nAsk: \"Same content, different audience? Tell me about the new audience.\"\nRe-run Phase 2 (Audience) and Phase 5 (Angle) only\nRe-generate the deck with new angle/tone\nSave as a new presentation\n\nThis lets users create multiple versions of the same talk for different events.\n\nConfiguration Reference\nField\tType\tDefault\tDescription\ndefaults.tone\tstring\tconversational\tprofessional / conversational / humorous / technical\ndefaults.max_slides\tnumber\t20\tMaximum slides per deck\ndefaults.include_speaker_notes\tboolean\ttrue\tAuto-generate speaker notes\ndefaults.factual_validation\tboolean\ttrue\tFlag speculative language\ndefaults.include_mistakes_slide\tboolean\ttrue\tInclude authenticity slide\ndefaults.include_costs_slide\tboolean\ttrue\tInclude investment breakdown\nexport.default_format\tstring\thtml\tDefault export format\nexport.html_theme\tstring\tspark\tterminal / executive / spark / clean\nexport.per_slide_html\tboolean\tfalse\tGenerate individual HTML files per slide\nexport.formats_available.*\tboolean\tvaries\tWhich export formats are ready\nspeaker.*\tstring\t\"\"\tDefault speaker info (reused across decks)\nbranding.cta_links\tarray\t[]\tDefault CTA links for all decks\nbranding.training_links\tarray\t[]\tDefault training resource links\nbranding.coupon_codes\tarray\t[]\tDefault coupon codes\nInput Sanitization Rules\n\n⚠️ PRIMARY DEFENSE: The helper script (~/workspace/presentations/helper.sh) enforces sanitization in code.\n\nSecondary rules for edge cases:\n\nStrip shell metacharacters from all user input before exec\nJSON writes go through the helper's save-meta command with validation\nHeredocs use quoted delimiters (<< 'EOF') to prevent expansion\nLength limits: Presentation name ≤ 100 chars, slide content ≤ 5000 chars per slide\nNever pass unsanitized user input to exec. No exceptions.\nWhat This Skill Does NOT Do\nDoes NOT use external slide APIs. References to slide_initialize, slide_edit, and slide_present in some OpenClaw guides are Manus-specific tools not available here. This skill generates HTML/Markdown files directly.\nDoes NOT make up numbers. Every stat comes from your interview answers. Missing data gets a [INSERT] placeholder.\nDoes NOT predict the future. Projections are conservative, caveated, and flagged for your review.\nDoes NOT replace practice. A great deck with a bad delivery is still a bad presentation. Use the speaker notes.\nDoes NOT access files outside ~/workspace/presentations/ without explicit permission.\nDoes NOT require internet for presenting. HTML slides are self-contained (fonts are loaded from Google Fonts CDN but slides degrade gracefully without them).\nWhy This Exists\n\nMost presentations are built backwards. People open a template, fill in slides, and try to find a story. The result is generic decks with made-up projections and no soul.\n\nAI Presentation Maker works forwards. You tell it what actually happened. It finds the story. Every number is real. Every claim is verified. Every mistake is included because authenticity sells better than perfection.\n\nThe interview takes 5 minutes. The deck takes 30 seconds. The refinement takes however long you want. And when you stand up to present, you know every word is true.\n\nWho Built This\n\nJeff J Hunter is the creator of the AI Persona Method and founder of the world's first AI Certified Consultant program.\n\nHe runs the largest AI community (3.6M+ members) and has been featured in Entrepreneur, Forbes, ABC, and CBS. As founder of VA Staffer (150+ virtual assistants), Jeff has spent a decade building systems that let humans and AI work together effectively.\n\nAI Presentation Maker is part of the AI Persona ecosystem — the same system Jeff uses to build his own keynotes.\n\nWant to Make Money with AI?\n\nMost people burn API credits with nothing to show for it.\n\nThis skill gives you the pitch deck. But if you want to turn AI into actual income, you need the complete playbook.\n\n→ Join AI Money Group: https://aimoneygroup.com\n\nLearn how to build AI systems that pay for themselves.\n\nConnect\nWebsite: https://jeffjhunter.com\nAI Persona Method: https://aipersonamethod.com\nAI Money Group: https://aimoneygroup.com\nLinkedIn: /in/jeffjhunter\nLicense\n\nMIT — Use freely, modify, distribute. Attribution appreciated.\n\nAI Presentation Maker — Facts, not fantasies. 🎤"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/jeffjhunter/ai-presentation-maker",
    "publisherUrl": "https://clawhub.ai/jeffjhunter/ai-presentation-maker",
    "owner": "jeffjhunter",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/ai-presentation-maker",
    "downloadUrl": "https://openagent3.xyz/downloads/ai-presentation-maker",
    "agentUrl": "https://openagent3.xyz/skills/ai-presentation-maker/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ai-presentation-maker/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ai-presentation-maker/agent.md"
  }
}