From marketing
Guides conversational creation of Excalidraw presentations, slide decks, diagrams for pitches, explainers, flows. Outputs .excalidraw JSON or injects into excalidraw.com via browser automation.
npx claudepluginhub naveedharri/benai-skills --plugin marketingThis skill uses the workspace's default tool permissions.
Create compelling visual presentations through a collaborative, conversation-driven process. Every presentation is co-designed with the user — never assumed.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Automates semantic versioning and release workflow for Claude Code plugins: bumps versions in package.json, marketplace.json, plugin.json; verifies builds; creates git tags, GitHub releases, changelogs.
Create compelling visual presentations through a collaborative, conversation-driven process. Every presentation is co-designed with the user — never assumed.
This is a guided conversation, not an assembly line. You walk through 7 phases with the user, collecting input, proposing ideas, and building slides one at a time with approval at each step. The goal is a presentation that feels like THEIRS, not a template.
Rules:
AskUserQuestion for all structured decision points (2-4 options with descriptions)Run this silently at the start of every session. Do NOT ask the user anything yet.
Look for .excalidraw/brand.md in the working directory.
Look for .claude/product-marketing-context.md in the working directory.
If either config was found, mention it in one line:
"I found your saved brand config — I'll use it unless you want to start fresh."
If neither was found, say nothing — proceed directly to Phase 1.
Ask 2-3 structured questions to understand what the user needs. Use AskUserQuestion for each.
This determines the narrative arc suggestion in Phase 3.
question: "What type of presentation are you creating?"
header: "Type"
options:
- label: "Pitch deck"
description: "Persuade someone — sell an idea, product, or strategy"
- label: "Explainer"
description: "Break down a concept, system, or process so people understand it"
- label: "Tutorial / How-to"
description: "Step-by-step guide teaching someone how to do something"
- label: "Process / Architecture diagram"
description: "Map out a system, workflow, or technical architecture"
multiSelect: false
This shapes complexity level and tone.
question: "Who will see this presentation?"
header: "Audience"
options:
- label: "Clients / Prospects"
description: "External stakeholders you want to impress or persuade"
- label: "Internal team"
description: "Colleagues who need clarity, not polish"
- label: "Investors"
description: "People evaluating your idea — need credibility and vision"
- label: "Social media / Educational"
description: "Public audience — needs to be visually striking and self-explanatory"
multiSelect: false
This determines emphasis, visual weight, and CTA approach.
question: "What should this presentation accomplish?"
header: "Goal"
options:
- label: "Persuade"
description: "Sell an idea — emphasis on benefits, proof, and call to action"
- label: "Educate"
description: "Teach a concept — emphasis on clarity, progression, and examples"
- label: "Document"
description: "Capture a process — emphasis on accuracy, completeness, and structure"
- label: "Impress"
description: "Showcase results — emphasis on metrics, visuals, and impact"
multiSelect: false
After collecting answers: Summarize back to the user in one sentence:
"Got it — a [type] for [audience] to [motivation]. Let's figure out the look and feel."
If .excalidraw/brand.md was found in Phase 0:
question: "I found your saved brand style. What would you like to do?"
header: "Brand"
options:
- label: "Use saved brand (Recommended)"
description: "Apply your existing colors, fonts, and tone"
- label: "Start fresh"
description: "Set up brand style from scratch"
multiSelect: false
If they choose "Use saved brand," skip to Phase 3.
question: "How should I get your brand style?"
header: "Style source"
options:
- label: "Scrape my website"
description: "I'll extract colors, fonts, and tone from your URL"
- label: "I'll describe it"
description: "Tell me your colors, tone, and vibe"
- label: "Use a clean default"
description: "Professional blue/gray palette — looks good on everything"
- label: "Match a reference"
description: "Provide a screenshot or link and I'll match the style"
multiSelect: false
Option A — Scrape website:
WebFetch to extract: dominant colors, font style, tone (professional/playful/bold/minimal)Option B — Manual description:
Ask with AskUserQuestion:
question: "What's your brand's visual tone?"
header: "Tone"
options:
- label: "Professional"
description: "Clean lines, muted colors, corporate feel"
- label: "Playful"
description: "Bright colors, rounded shapes, friendly vibe"
- label: "Bold"
description: "High contrast, strong colors, makes a statement"
- label: "Minimal"
description: "Lots of whitespace, subtle colors, elegant"
multiSelect: false
Then ask: "What's your primary brand color and an accent color? (e.g., '#1971c2 blue, #d97757 orange' — or just describe them like 'dark blue and coral')"
Option C — Clean default:
Use the built-in palette from references/design-principles.md. No further questions needed.
Option D — Match reference: Ask the user to provide a screenshot or link. Extract the visual style and confirm.
After collecting brand info, save to .excalidraw/brand.md:
# Brand Configuration
## Visual Identity
- Primary Color: #HEX (Name)
- Accent Color: #HEX (Name)
- Tone: Professional / Playful / Bold / Minimal
- Font Preference: Clean (fontFamily 2) / Hand-drawn (fontFamily 1)
## Source
- Origin: Website extraction / Manual / Preset / Reference match
- URL: (if applicable)
## Learned Preferences
<!-- Updated after each session -->
## Session History
<!-- Appended after each session -->
---
*Last updated: YYYY-MM-DDTHH:MM:SSZ*
Create the .excalidraw/ directory if it doesn't exist.
This is the core collaborative phase. It's a conversation, not a data dump.
Ask the user:
"Do you have content ready — notes, a transcript, an article, bullet points — or should we build the narrative together?"
If content is provided:
If no content — go to Step 3.2.
Ask in small groups (2-3 questions at a time). Never dump all questions at once.
Group A:
"What's the core message? If the audience remembers ONE thing, what should it be?" "What are the 3-5 key points that support this message?"
Group B:
"Any specific data, quotes, examples, or comparisons to include?" "What should the audience DO after seeing this? (your call to action)"
Synthesize their answers into a coherent content brief before continuing.
Based on the content + intent from Phase 1, propose 2-3 narrative structures using AskUserQuestion:
question: "Which narrative flow fits your story best?"
header: "Structure"
options:
- label: "Problem → Solution → Proof"
description: "Start with the pain, show your fix, prove it works. Best for pitches."
- label: "Before → After → How"
description: "Show the old way vs. the new way, then explain the steps. Best for tutorials."
- label: "What → Why → How"
description: "Define the concept, explain why it matters, show how it works. Best for explainers."
- label: "Status Quo → Tension → Resolution"
description: "Build tension around a problem, then resolve it. Best for persuasion."
multiSelect: false
Only show arcs that make sense for their content type. If the user chose "Process / Architecture diagram" in Phase 1, you might offer:
Propose a slide sequence as a numbered list. For each slide, show:
references/design-principles.md)Example:
Here's my proposed flow:
1. "The Problem" — Visual metaphor: heavy weight crushing down, red tones,
one dominant shape showing the pain
2. "Why It Happens" — Tangled web radiating from a central knot, showing
interconnected root causes (not a list of boxes)
3. "Our Solution" — Winding path from dark/cramped (left) to open/bright
(right), showing the transformation journey
4. "The Results" — Giant "47%" as the visual anchor, with small supporting
context around it. The number IS the slide.
5. "Next Steps" — Single bold shape with CTA, clean and spacious
Want to add, remove, or reorder anything?
Important: When proposing visual concepts, think ILLUSTRATION — describe what the slide would look like as a drawing, not which layout template to use. "Hub & spoke" or "2x2 grid" are fallbacks, not defaults.
Wait for the user to confirm or adjust before proceeding.
This is where slides get built. One at a time. For EACH slide:
Before generating any JSON, describe the plan as a visual picture — what would someone SEE, not what template you're using:
**[SLIDE 1: The Problem]**
**What you'll see:** A large, heavy dark shape dominates the center — it
feels oppressive, like a weight pressing down. Three smaller red shapes
are being crushed underneath it, each labeled with a specific pain point.
The visual immediately communicates "something is wrong and heavy."
**Shapes used:** Large ellipse (the problem), small compressed rectangles
(the pain points), downward arrows showing pressure
**Mood:** Tense, urgent — red/dark tones, high contrast
Describe the illustration, not the template. "Hub & spoke with 4 nodes" tells the user nothing about what they'll see. "A central sun with 4 planets orbiting at different distances" paints a picture.
question: "Does this visual approach work for Slide 1?"
header: "Slide 1"
options:
- label: "Go ahead"
description: "Build it as described"
- label: "Try a different layout"
description: "I'd prefer a different diagram type"
- label: "Simpler"
description: "Fewer elements, more whitespace"
- label: "More detailed"
description: "Add more information and visual elements"
multiSelect: false
Once approved:
references/element-reference.md for JSON specsreferences/design-principles.md for visual design philosophyBefore building any slide, generate a unique groupId. All elements within a slide MUST share the same groupId.
const slideGroupId = `slide${N}-group-${Math.random().toString(36).substr(2, 6)}`;
Slide 1: x=0, y=0 Slide 2: x=900, y=0
Slide 3: x=0, y=600 Slide 4: x=900, y=600
Slide 5: x=0, y=1200 Slide 6: x=900, y=1200
Each slide occupies ~800x500px. Leave 100px gaps between slides.
Read references/chrome-automation.md for the full injection workflow.
After injecting:
question: "How does Slide N look?"
header: "Review"
options:
- label: "Looks great, next slide"
description: "Move on to the next slide"
- label: "Adjust colors/style"
description: "The layout is fine but the colors or styling need tweaking"
- label: "Redo layout"
description: "The visual approach isn't working — try a different diagram type"
- label: "Edit text/content"
description: "The visuals are fine but the text needs changes"
multiSelect: false
Iterate until approved, then proceed to the next slide.
This skill uses the Claude in Chrome extension to inject slides directly into excalidraw.com.
Check if extension is available using tabs_context_mcp
If NOT available, tell the user:
To inject slides into Excalidraw, please install the Claude in Chrome extension: https://chromewebstore.google.com/detail/claude-in-chrome/anthropic
Once installed, restart Chrome and try again.
Alternatively, I can save slides as .excalidraw JSON files you can import.
If available, proceed with injection per references/chrome-automation.md
Note: Chrome extension check can happen earlier in the flow (during Phase 4 when first slide is ready). Don't block the collaborative design phases on extension availability.
After all slides are injected:
"All slides are on the canvas. Want to adjust any slide before we finalize?"
If the user wants changes, go back to Phase 4 for the specific slide.
If Chrome extension isn't available, save the complete presentation:
.excalidraw JSON file in the working directorypresentation-name.excalidraw — open it in excalidraw.com via File → Open."Update .excalidraw/brand.md with any style preferences learned during the session:
Add an entry to the Session History section of .excalidraw/brand.md:
## Session History
### YYYY-MM-DD — [Presentation Title]
- Type: Pitch deck for investors
- Slides: 6
- Style notes: Preferred minimal layouts, liked hub & spoke for architecture
- Adjustments: Made Slide 3 simpler, changed accent from orange to teal
"Your presentation is ready! Here's a summary of what we built:
- [N] slides using [narrative arc]
- Brand config saved to
.excalidraw/brand.md- [File location or 'injected into excalidraw.com']"
(async () => {
const elements = [ /* slide elements here */ ];
const clipboardData = {
type: "excalidraw/clipboard",
elements: elements,
files: {}
};
await navigator.clipboard.writeText(JSON.stringify(clipboardData));
return "Slide ready";
})()
Then paste with cmd+v (Mac) or ctrl+v (Windows/Linux).
| Purpose | Light | Dark |
|---|---|---|
| Primary/Blue | #a5d8ff | #1971c2 |
| Success/Green | #b2f2bb | #2f9e44 |
| Warning/Yellow | #fff3bf | #f08c00 |
| Danger/Red | #ffc9c9 | #e03131 |
| Neutral/Gray | #e9ecef | #495057 |
| Text | — | #1e1e1e |
| Accent/Orange | — | #d97757 |
These are overridden by brand colors from Phase 2 when available.
1 = Virgil (hand-drawn, casual)2 = Helvetica (clean, professional — default for presentations)3 = Cascadia (code/monospace)