Get the FREE Ultimate OpenClaw Setup Guide →

automating-keynote

npx machina-cli add skill SpillwaveSolutions/automating-mac-apps-plugin/automating-keynote --openclaw
Files (1)
SKILL.md
4.1 KB

Automating Keynote (JXA-first, AppleScript discovery)

Contents

Relationship to the macOS automation skill

  • This skill focuses on Keynote-specific automation (documents, slides, charts).
  • Use automating-mac-apps for cross-app workflows or general macOS scripting foundations.
  • Assumes Apple Events knowledge from the related skill.
  • PyXA Installation: To use PyXA examples in this skill, see the installation instructions in automating-mac-apps skill (PyXA Installation section).

Core Framing

  • JXA (JavaScript for Automation) enables macOS app scripting with JavaScript syntax.
  • AppleScript dictionaries define Keynote's object model—discover via Script Editor.
  • JXA objects are specifiers: read with methods like .name(), write with assignments.
  • Production scripts use JXA for reliability; AppleScript for prototyping.
  • Important: The JXA Path() function is required when specifying file paths to Keynote (e.g., for images, exports, or opening documents). Use Path("/path/to/file") instead of plain strings.

Workflow (default)

  1. Discover terms in Script Editor > File > Open Dictionary > Keynote.
  2. Prototype minimal AppleScript: tell application "Keynote" to get name of document 1.
  3. Port to JXA: Application("Keynote").documents[0].name() with try-catch blocks.
  4. Validate with read-only probes: Application("Keynote").documents.length > 0.
  5. Use UI scripting only when dictionary lacks features (e.g. Application("System Events")).

Quick Examples

Prototype (AppleScript):

tell application "Keynote"
    get name of document 1
end tell

Production (JXA):

const keynote = Application("Keynote");
if (keynote.documents.length > 0) {
    console.log(keynote.documents[0].name());
}

Create Slide:

const doc = keynote.documents[0];
const slide = doc.slides.push(keynote.Slide({baseSlide: doc.masterSlides['Title - Center']}));
slide.defaultTitleItem.objectText = "New Slide";

Add Image to Slide (note Path() usage):

const slide = doc.slides[0];
const img = keynote.Image({
  file: Path("/Users/you/Desktop/diagram.png"),  // Path() required!
  position: { x: 100, y: 100 },
  width: 800
});
slide.images.push(img);

Validation Checklist

After implementing Keynote automation:

  • Verify Keynote is running and accessible
  • Test slide creation with master slide assignment
  • Confirm image paths use Path() function
  • Check text rendering in default text items
  • Validate export operations complete without errors

When Not to Use

  • For cross-platform presentation automation (use PowerPoint with Python libraries)
  • When AppleScript alone suffices (skip JXA complexity)
  • For web-based presentations (Google Slides, reveal.js)
  • For non-macOS platforms

What to load

  • Keynote JXA basics + runtime caveats: automating-keynote/references/keynote-basics.md
  • Keynote recipes (slides, text, images, export): automating-keynote/references/keynote-recipes.md
  • Deck generator example: automating-keynote/references/keynote-deck-generator.md
  • Chart-aware deck pattern: automating-keynote/references/keynote-chart-aware-deck.md
  • Advanced workflows (charts bridge, magic move, UI scripting): automating-keynote/references/keynote-advanced.md
  • PyXA (Python) practical examples: automating-keynote/references/keynote-pyxa.md
  • PyXA API Reference (complete class/method docs): automating-keynote/references/keynote-pyxa-api-reference.md

Source

git clone https://github.com/SpillwaveSolutions/automating-mac-apps-plugin/blob/main/plugins/automating-mac-apps-plugin/skills/automating-keynote/SKILL.mdView on GitHub

Overview

Automating Keynote enables scripting Keynote with JXA, using AppleScript dictionaries to map the app’s object model. It covers documents, slides, text, shapes, images, tables, charts, transitions, and a UI scripting fallback. The workflow emphasizes dictionary discovery, Path() for file paths, and robust error handling.

How This Skill Works

Start by inspecting Keynote’s AppleScript dictionary in Script Editor, then prototype with AppleScript and port to JXA using Application('Keynote') and specifiers. Production scripts use JXA objects and Path() for file paths, wrapped in try-catch blocks for reliability. If the dictionary lacks needed features, UI scripting with System Events is used as a fallback.

When to Use It

  • When asked to create Keynote presentations or automate slide decks
  • When performing JXA Keynote scripting or AppleScript dictionary discovery
  • When generating presentations programmatically
  • When loading assets like images, charts, or master slides into a deck
  • When you need a robust document lifecycle and slide management workflow

Quick Start

  1. Step 1: Open Script Editor and load Keynote's dictionary to understand available commands
  2. Step 2: Prototype a small AppleScript fragment, then port it to JXA using Application('Keynote')
  3. Step 3: Replace string paths with Path('/path/to/file') and test with a sample presentation

Best Practices

  • Discover the Keynote dictionary in Script Editor before coding any automation
  • Port from AppleScript to JXA incrementally and validate with read-only probes
  • Always use Path() for file paths to Keynote assets (images, exports, opens)
  • Prefer Keynote's object model over fallback UI scripting whenever possible
  • Wrap calls in try-catch and test against a running Keynote instance

Example Use Cases

  • Prototype (AppleScript): tell application 'Keynote' get name of document 1
  • Production (JXA): const keynote = Application('Keynote'); if (keynote.documents.length > 0) { console.log(keynote.documents[0].name()); }
  • Create Slide: const doc = keynote.documents[0]; const slide = doc.slides.push(keynote.Slide({baseSlide: doc.masterSlides['Title - Center']})); slide.defaultTitleItem.objectText = 'New Slide';
  • Add Image to Slide (Path() usage): const slide = doc.slides[0]; const img = keynote.Image({ file: Path('/Users/you/Desktop/diagram.png'), position: { x: 100, y: 100 }, width: 800 }); slide.images.push(img);
  • Validation probe: Application('Keynote').documents.length > 0

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers