Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.
Design & media
iA Presenter
Try itWrite, lint, package and theme iA Presenter presentations. Use when the user mentions iA Presenter, wants slides / a deck / a talk written in Markdown with speaker notes, wants to turn notes or an article into a presentation, set a theme, add images, videos, tables, charts or layouts to slides, or customize fonts/colors via a custom iA Presenter theme (template.json, presets.json, CSS). Produces .iapresenter bundles that open directly in the app. Verified against iA Presenter 2.0.2 on macOS.
What it does
iA Presenter is a **text-first** presentation app (macOS / iOS). You write one Markdown file; the app auto-lays out responsive slides and keeps your speech as speaker notes. This skill covers two jobs:
The skill document
iA Presenter
iA Presenter is a text-first presentation app (macOS / iOS). You write one Markdown file; the app auto-lays out responsive slides and keeps your speech as speaker notes. This skill covers two jobs:
- Authoring decks – writing iA Presenter Markdown, packaging it as a
.iapresenterbundle with a theme pre-selected, linting it, previewing it. - Custom themes –
template.json+presets.json+ CSS in the app's Themes folder.
Everything below was checked against the app's own bundled Help, layouts.json, the
theme files shipped inside iA Presenter 2.0.2, the metadata parser in the app binary,
and live rendering tests. Where community docs disagree with the app, the app wins.
Decision tree
| User wants | Do |
|---|---|
| A new presentation / deck / talk | Author → write text.md, run scripts/new_deck.py, lint, open, review |
| Turn an article / notes / outline into slides | Same as above; speech goes flush-left, only the punchline gets a TAB |
| Fix a deck that "looks wrong" | Run scripts/lint_deck.py, then check references/layouts.md |
| Change look / fonts / colors beyond built-ins | Theme → copy assets/starter-theme, edit, scripts/install_theme.sh |
| Choose a built-in theme | Set "template" in info.json (see Packaging) |
| Export PDF / PPTX / images / HTML | The app does it: File → Export or Command Palette. See references/file-format.md |
Load references progressively: syntax.md and layouts.md for any deck; content-blocks.md
for images/video; charts.md for tables→charts; themes.md + engine-css.md for themes;
file-format.md for bundle/export/automation.
Core model (memorize this)
Kicker line (TAB paragraph right before a heading = small line above it)
# Title ← headings are ALWAYS visible
Visible body text ← a real TAB (\t) at line start puts a paragraph on the slide
This flush-left paragraph is speech. The audience never sees it. ← speaker notes
--- ← three dashes on their own line = next slide
- Visible by default: headings
#–######, images/videos (content blocks), tables, fenced code, display math, charts, footnotes. - Speaker notes by default: paragraphs, lists, blockquotes, definition lists. Prefix
every line of them with a TAB to show them (
⇥- item,⇥> quote). - Never TAB a table or a code fence – that turns it into an indented code block.
- Use real tab characters. Spaces do not work. Editors that convert tabs to spaces will silently break the deck.
// commentlines are author-only.
Authoring workflow
- Frame it – audience, goal, duration, tone. Default speaking rate in the app is 110 wpm, so a 10-minute talk ≈ 1,100 words of notes across ~12–20 slides.
- Write the story first, flush-left, as if it were an email. Then cut it into slides
with
---. One idea per slide. - Promote only what the audience should see: a heading, one TAB line, an image, a table. Do not paste the notes onto the slide. Create tension between what is shown and what is said.
- Shape the layout by shaping cells (blank line = new cell; see below). Add
Layout: …only when auto-layout picks wrong. - Add visuals last:
/assets/photo.jpgcontent blocks,Background: truefor covers. - Pick a theme in
info.jsonthat fits the room; never leave every deck on the default white theme. - Package, lint, open, look –
scripts/new_deck.py,scripts/lint_deck.py, thenopen -a "iA Presenter" deck.iapresenterand inspect the thumbnails (orscripts/preview_deck.shto screenshot). Fix and repeat. - End on a landing line or an ask, not "Thank you / Questions".
Cells and auto-layout (how you "design")
A slide is split into cells by blank lines. iA Presenter picks a layout from the number of cells, whether they contain graphics, the first heading level of each cell, and their order. Verified behaviour:
| You write | You get |
|---|---|
| one heading (+ TAB subtitle, no blank line) | big centered / cover-style title |
## Heading + blank + 2–3 cells | title on top, cells side by side (columns) |
| 2–3 cells, no title | side-by-side split |
| 4+ cells | grid (grid-items-N) |
| heading + blank + image | title with image |
#### caption + image, or image + #### caption | caption above / below the image |
image with Background: true + heading | text over a full-bleed background |
| a lone image | full-bleed image |
Heading levels carry meaning: # cover title (pair with ### for details), ##
centered section/slide title, ###/#### smaller headings, #### + image = caption.
Force a layout with a first line Layout: Name. Verified working: Cover, Title,
Section, Default, Split, Grid, Title-and-Columns, Caption, Caption-Top,
Image. Avoid Layout: Columns – it renders unusably small in 2.0.2; use
Title-and-Columns or plain auto-layout instead. Layout: Grid treats the heading as a
grid cell too; use Title-and-Columns when you want a title row. Details:
references/layouts.md.
Images, video, backgrounds (content blocks)
Put the path alone on a flush-left line, then optional key: value lines directly
under it (no blank line):
/assets/photo.jpg
size: contain
x: right
y: top
/assets/cover.jpg
Background: true
filter: darken
opacity: 60%
/assets/clip.mp4
- Paths:
/assets/(files inside the bundle'sassets/folder),/Theme/(files shipped with the theme), or a remotehttps://…URL that ends in an image extension (.jpg .jpeg .png .apng .gif .webp .tif .tiff .svg) or is anunsplash.comlink. Remote URLs work (verified); URLs without an image extension are treated as plain text. - Keys (case-insensitive):
size: cover|contain,x: left|center|right,y: top|center|bottom,background: true,filter: lighten|darken|grayscale|sepia|blur,opacity: 10%…100%,title:,alt:,class: css-class. Full list and semantics: references/content-blocks.md. - Formats: png/apng, jpg, gif, webp, tif, svg, pdf; video m4v/mp4/mov; YouTube via the Inspector's Visuals tab (or paste the YouTube URL as a content block).
- Classic
also works (no leading slash, spaces as%20), but content blocks are the recommended, controllable form.
Tables → charts
Write a flush-left Markdown table; add metadata lines immediately after it:
| Quarter | Revenue | Cost |
| :------ | ------: | ---: |
| Q1 | 10 | 6 |
| Q2 | 15 | 8 |
Chart: bar
Orientation: horizontal
bar-type: stacked
yLabel: Millions
Chart: bar|line|pie|donut; options Orientation, bar-type: stacked, line-type,
Color-Type: sequential|differential, xLabel, yLabel, xFormat, colors. Charts
use the theme's --graph-data-N palette. See references/charts.md.
Packaging: the .iapresenter bundle
A presentation is a folder named Name.iapresenter:
Name.iapresenter/
├── text.md # the deck
├── info.json # metadata + theme choice
└── assets/ # every file referenced as /assets/…
info.json (verified – the theme is applied on open):
{
"type": "net.daringfireball.markdown",
"creatorIdentifier": "net.ia.presenter",
"version": 2,
"transient": false,
"net.ia.presenter": { "template": "tokyo", "preset": "Default" }
}
template= the theme Name in lowercase, spaces kept:"helvetica"(default),"zurich","basel","copenhagen","vancouver","tokyo","milano","new york","paris","san francisco","la","garamond"(premium), or your custom theme's lowercasedName."sanfrancisco"/"newyork"silently fall back to the default theme.preset= a presetNamefrom that theme'spresets.json: most themes only have"Default"; Helvetica and Garamond have"Light"/"Dark", Basel"Default"/"Dark", Tokyo"Default"/"Light".scripts/install_theme.sh --listprints them.
Build it: python3 scripts/new_deck.py deck.md "My Talk.iapresenter" --theme "new york" --assets ./img --open
(copies referenced images, writes info.json, checks paths). Plain .md files also
open/import in the app (File → Import), but a bundle is what you should hand over.
Verify before you hand over
python3 scripts/lint_deck.py "My Talk.iapresenter"→ zero errors.- Open it:
open -a "iA Presenter" "My Talk.iapresenter". The thumbnail strip shows the rendered slides; hovering a thumbnail shows its speaking time.scripts/preview_deck.shscreenshots the window for you (needs Screen Recording permission). - Check: every slide has something visible; nothing is a wall of text; images load; the theme applied; notes read aloud naturally; the last slide lands.
Custom themes (short version)
Themes live in
~/Library/Containers/net.ia.presenter/Data/Library/Application Support/iA Presenter/Themes//
and consist of template.json (metadata, fonts' display names, Css file, per-layout
Classes, LayoutExamples), presets.json (fonts' CSS names, appearance, colors,
accents, gradients), a CSS file, optional fonts/images and a template.png thumbnail.
- Start from
assets/starter-theme/, renameNameandCss, thenscripts/install_theme.sh path/to/MyTheme. Quit and relaunch the app the first time; afterwards the app hot-reloads the theme in use on every save. - Color naming trap:
DarkBodyTextColoris dark-colored text (used on light backgrounds);LightBodyTextColoris light text for dark mode. Swapping them gives invisible text. - Select it with
"template": "mytheme"(lowercasedName) or in the Design inspector. - Typography is driven by engine CSS variables (
--scale-factor-h1,--font-weight-h2,--case-h1, …) and iA's own selector form[class*="layout-"] > div h1. Backgrounds target.backgrounds .cover-container; inline SVG must usergb()not hex. Full guide: references/themes.md, class/variable catalog: references/engine-css.md.
Gotchas (all verified in 2.0.2)
- TAB, not spaces. A TABbed table or code fence becomes a code block.
- Metadata lines must touch the block they modify (no blank line between).
Layout: Columnsis broken;Layout: Gridswallows the title.templatevalues are lowercase with spaces; wrong values fall back silently.- iA's shipped JSON has trailing commas (lenient parser). Write strict JSON anyway.
- Fonts:
template.jsongets the display name,presets.jsonthe CSS family. - Charts are limited to bar / line / pie / donut; the theme decides colors.
- Web Sharing exists only for licenses bought directly from iA (not App Store).
- The app is not AppleScript-scriptable; automation =
open -a+ UI. Exports go through the UI or the Command Palette added in 2.0.
Resources
references/syntax.md– complete Markdown syntax (from the in-app Help)references/layouts.md– auto-layout rules,Layout:names, CSS classes, verified resultsreferences/content-blocks.md– image/video paths, all metadata keys + valuesreferences/charts.md– table→chart metadatareferences/themes.md– theme files, fonts, backgrounds, gradients, appearance, installreferences/engine-css.md– rendering-engine classes and CSS variables to overridereferences/file-format.md– bundle format,info.json, import/export, shortcuts, automationassets/example-deck.md– a complete deck using every pattern (real tabs inside)assets/starter-theme/– minimal, valid theme to copyscripts/new_deck.py,scripts/lint_deck.py,scripts/install_theme.sh,scripts/preview_deck.sh
Related skills
Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.
Find why your productivity system keeps failing, then apply the smallest fix — capacity math, bottleneck routing, durable local notes.
Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.
Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.
Save, search, and manage personal notes and knowledge bases in Get笔记 on explicit request.
More from daaab
Browse all skillsGive your AI agent a verifiable email address tied to its Base Chain wallet.
NadMail - Email for AI Agents on Monad. Register yourname@nadmail.ai, send emails that micro-invest in meme coins, boost with emo-buy. SIWE auth, no CAPTCHA,...
🔗 WalletConnect Agent - dApp Access for AI. Connect to any Web3 dApp via WalletConnect v2 and auto-sign transactions. Swap tokens, mint NFTs, vote in DAOs,...
🔐 Base Wallet - Crypto Identity for AI Agents. Create wallets, sign messages (SIWE), send transactions programmatically. No browser extensions, no human int...
Build AI phone call reminders with ElevenLabs Conversational AI + Twilio. Free starter guide.
🏷️ Basename Agent - Onchain Identity + Æmail for AI. Register yourname.base.eth and get yourname@basemail.ai — via Donate Buy (recommended), free auto-regis...