Skip to content
Home

pitch-prep · The authoring contract

Pitch-shape what your AI writes.

Your AI's HTML dashboards, reports, and writeups — presented at full viewport in your Pitch deck on first generation. pitch-prep is the one-file skill your agent loads once. It teaches what Pitch shows and how decks are built — so the content you ask for lands first try, and slots into whatever deck you're putting together. Works with Claude, Cursor, Codex, ChatGPT, and any other agent that reads instruction files.

Ships with every Pitch release. Free. No account.

What the skill teaches your AI.

Two jobs. One file. The mechanical contract for the content your agent generates, plus a brief on the deck it slots into.

Primary

Pitch-shape the content.

The main job: make sure the HTML, Markdown, or other file your AI writes presents cleanly. ~16:9 viewport. Above-the- fold framing. Explicit body backgrounds. Atomic writes so the watcher doesn't catch half-rendered output. Filename hygiene for the slide rail. Reserved keys your slide JS shouldn't bind. Whatever your agent generates — recap chart, annotated dashboard, narrative summary, talking-points — lands first try.

Also

Brief on the deck.

When you ask the agent to drop the result into an existing .pitch deck — or to spin one up from scratch and wire in references to your existing dashboards (Tableau, Salesforce), docs (Notion, Confluence), or slides (M365, Google Slides) — it knows the deck shape. Manifest schema, supported slide kinds, project layout. Curatable through Pitch's editor without surprise.

This is a mechanical contract, not a style guide. Pitch is medium-neutral — slides keep their own look. The skill tells your agent how Pitch's viewport, file watcher, and present-mode keybindings work, so the artifacts it writes show up on stage without re-work.

The slide shape

Design for ~16:9. Pitch's window is resizable but 16:9 is the canonical presentation aspect — don't author portrait or 4:3 layouts. Lead with above-the-fold content; vertical scroll works, but assume the viewer may only see what's visible at first paint. Each slide is self-contained — no shared site-wide headers, footers, or nav. Set an explicit body { background: ... } so the slide doesn't show through to the deck's black or white background.

Six file kinds

Default to HTML for generated slides. Other options:

.html
Default. Interactive, scripts run, can load external resources.
.md
Plain prose. Rendered as a single scrollable slide.
.pdf
Use if the source is already a PDF; don't generate new ones for slides.
.png / .jpg / .svg
Pre-rendered visuals.

Remote URLs (Salesforce, Gong, Figma) are added by the user through Pitch's editor, not through filesystem writes. Don't try to "add a remote slide" by writing into the manifest.

What works inside a slide

HTML slides render in an Electron WebContentsView — a full Chromium browser. Modern web stack, no compatibility quirks.

Works: all standard web APIs (fetch, XHR, WebSockets, ES modules, async/await, localStorage, Canvas, WebGL, SVG, CSS animations), network access (REST APIs, CDN assets, auth-protected endpoints), interactivity (clicks, form input, hover, drag/drop).

Doesn't work: no native OS access from slide JS, no IPC with Pitch chrome, no shared state between slides — each loads fresh.

Reserved keys in Present mode — Pitch intercepts these; slide JS won't see them. Left/Right, Space, Shift+Space, PageUp/PageDown, Home/End drive deck navigation; F toggles fullscreen; B blacks out; Esc exits Present. Up/Down scroll within the slide if it scrolls, otherwise pass through. Don't bind slide-internal actions to any reserved key.

Live reload — write atomically

Pitch watches every referenced file and reloads the open slide on change (~150ms). The one rule that makes the iterate-with-AI loop work:

Write each file atomically. Write to a temp file then rename() into place, or use your tool's atomic-write primitive. Never write a partial file at the slide's path.

If your agent writes incrementally (open → truncate → stream → close), Pitch will catch an intermediate state and the viewer sees a half-rendered slide. This applies equally to imperative writes ("rewrite slide 3 now") and scheduled writes ("regenerate this dashboard every 15 minutes"). Cadence doesn't matter; per-write atomicity does.

Stamp time-sensitive data

If a slide displays data fetched at generation time (dashboards, status pages, anything with numbers), include a visible timestamp the viewer can read. Pitch's live reload tells the system the HTML changed; it does not tell the viewer the data is fresh. A six-hour-old dashboard looks identical to a one-minute-old one without one. Even a small Generated: <ISO timestamp> footer is enough.

Filename hygiene

The filename surfaces in Pitch's slide rail. For HTML and Markdown, Pitch auto-detects the rail title from the file's <title> tag or first <h1>. Use clear, descriptive filenames like pipeline-overview.html, not output-1.html or dashboard_2026_05_20.html. Don't include timestamps or UUIDs in filenames — they make the rail unreadable.

Paths and the .pitch manifest

A Pitch deck is a .pitch JSON file at <project-root>/pitch/<name>.pitch. References inside it are project-relative paths. Slide files themselves can live anywhere inside the project root.

Rules of thumb: write slide files inside the project root (the folder containing the pitch/ subfolder). Don't write into the pitch/ subfolder — that's manifest territory. Don't edit the .pitch manifest unless explicitly told to; slide order, titles, and inclusion are user-curated through Pitch's editor.

The manifest description field

The .pitch manifest has an optional description field (≤500 chars) authored in the editor's settings popover under "Notes." When present, your agent reads it first — it's the freshest signal of who the deck is for and what shape it should take. Example: "For the senior leadership review on June 12. Audience: exec staff. Tone: informative and direct."

If description is absent or empty, the skill falls back to README.md at the project root if one exists. Both are additive when present.

What the skill tells your AI not to do

Don't unify slide styling. Don't write a 2,000-word essay and call it a slide. Don't edit the .pitch manifest. Don't add navigation, headers, or breadcrumbs that assume a multi-page site. Don't use timestamped or UUID filenames. Don't stream partial content into a slide file. Don't bind slide-internal interactions to reserved keys. Don't display time-sensitive data without a timestamp.

Install in your AI tool.

Download the zip, then drop it into your tool's skills surface. The contract loads automatically the next time your agent works on Pitch-shaped content.

Claude Code & Claude CoWork

Copy the entire pitch-prep/ folder into one of:

  • ~/.claude/skills/ — user-scoped; loads in every project.
  • <project-root>/.claude/skills/ — project-scoped; loads only inside that project.

The Claude runtime decides when to load SKILL.md based on its description frontmatter. No further configuration.

Cursor, ChatGPT, Codex, GitHub Copilot, Cline, others

Each tool has its own instructions surface (Cursor's .cursorrules, ChatGPT's custom-GPT system prompt, Codex's preamble, etc.). Open SKILL.md from the unzipped folder, copy everything below the YAML frontmatter, and paste it into your tool's instructions file.

The contract is plain Markdown — no tool-specific syntax — so the same body works across every agent that loads instruction files.

Updates. The zip ships with every Pitch release. Re-grab the latest pitch-prep.zip and replace the folder in your skills directory to pick up contract changes — or just keep an eye on the release notes.