Read, create, and modify Apple Keynote (.key) presentations. Use when the user asks about .key files, wants summaries, needs to understand slide content, or wants to create/edit decks.
Work with Apple Keynote (.key) presentations: extract text, export images, create new decks, add slides, set text, and populate entire decks from JSON.
$ARGUMENTS is a file path, glob pattern, or instruction. If empty, default to all .key files in the current working directory.
.key file)extract-text — get slide text, titles, and presenter notes:
osascript .claude/skills/keynote/scripts/extract-text.applescript "<absolute-path>"
export-images — export slides as PNGs:
osascript .claude/skills/keynote/scripts/export-images.applescript "<absolute-path>" "./.claude/keynote/images/<name>"
create-deck — create a new Keynote file using the talk-basic theme:
osascript .claude/skills/keynote/scripts/create-deck.applescript "<absolute-path-in-.claude/keynote>"
delete-slides — remove slides by number/range:
osascript .claude/skills/keynote/scripts/delete-slides.applescript "<absolute-path-in-.claude/keynote>" "<slide-spec>"
<slide-spec> accepts comma-separated numbers and ranges: "3,5,10-15,20"
add-slides — append slides with a specific master layout:
osascript .claude/skills/keynote/scripts/add-slides.applescript "<deck-path>" "<master-name>" <count>
Example: osascript .claude/skills/keynote/scripts/add-slides.applescript "./.claude/keynote/deck.key" "Title Only" 5
set-slide-text — set title, subtitle, and body on a single slide:
osascript .claude/skills/keynote/scripts/set-slide-text.applescript "<deck-path>" <slide-number> "<title>" "<subtitle>" "<body>"
Pass "" for unused fields. For Title layout, <body> sets the footer/author field. For Title Only layout, <body> creates a freeform text box below the subtitle.
populate-deck — create and populate an entire deck from a JSON file:
osascript .claude/skills/keynote/scripts/populate-deck.applescript "<deck-path>" "<slides.json>"
Slide 1 is reused for the first JSON entry; additional slides are appended. Processes in batches of 5 to avoid timeouts.
| Layout | text item 1 | text item 2 | text item 3+ |
|---|---|---|---|
| Title | footer/author (y=934) | big title (y=203) | subtitle (y=569) |
| Section | center text (y=357) | — | — |
| Title Only | title (y=85) | subtitle (y=187) | — (no body placeholder) |
| Blank | — | — | — |
The scripts detect which layout a slide uses by checking the y-position of text item 1:
> 900 → Title layout> 300 → Section layout< 200 → Title Only layoutEach layout has duplicate/extra text items (items 4+) that are ignored. Item at y=1030 is a logo/watermark placeholder.
Body text on Title Only slides: Since there is no body placeholder, body content is injected via make new text item as a freeform text box positioned at y=300. These are starting points for manual editing.
Each newline in the body field becomes a separate bullet point. Use \n (literal newline) to separate bullets in JSON:
{"body": "First bullet\nSecond bullet\nThird bullet"}
For a subtitle line without a bullet (on Title Only), use the subtitle field, not the body field.
[
{"master": "Title", "title": "Deck Title", "subtitle": "A subtitle", "body": "", "author": "Your Name"},
{"master": "Title Only", "title": "Slide Title", "subtitle": "Lead-in line", "body": "Bullet 1\nBullet 2\nBullet 3"},
{"master": "Section", "title": "Section Name"},
{"master": "Blank"}
]
Title, Section, Title Only, Blank
slides.json file following the format aboveosascript .claude/skills/keynote/scripts/create-deck.applescript "./.claude/keynote/deck.key"osascript .claude/skills/keynote/scripts/populate-deck.applescript "./.claude/keynote/deck.key" "./.claude/keynote/slides.json"set-slide-text to fix individual slides, or delete-slides + add-slides to restructureScripts that modify files enforce a .claude/keynote directory constraint — they refuse to run if the target path does not contain ".claude/keynote". Read-only scripts (extract-text, export-images) can operate on any .key file.
Save all outputs to ./.claude/keynote/ in the current working directory. Before writing any output, run mkdir -p ./.claude/keynote/images.
./.claude/keynote/images/<presentation-name>/./.claude/keynote/./.claude/keynote/./.claude/keynote/When creating new presentations, first read .claude/skills/keynote/style-guide.md. Follow the visual design, narrative structure, and content patterns described there to match your established presentation style.
slide N of doc immediately after creation in the same tell block. Use direct references from make new slide or operate in a separate open/save/close cycle.populate-deck script handles this automatically.populate-deck script requires Python 3 (for JSON parsing)