Install
openclaw skills install @daaab/ia-presenterWrite, 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.
openclaw skills install @daaab/ia-presenteriA 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:
.iapresenter
bundle with a theme pre-selected, linting it, previewing it.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.
| 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.
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
#–######, images/videos (content blocks), tables,
fenced code, display math, charts, footnotes.⇥- item, ⇥> quote).// comment lines are author-only.---. One idea per slide.Layout: … only when auto-layout picks wrong./assets/photo.jpg content blocks, Background: true for covers.info.json that fits the room; never leave every deck on the
default white theme.scripts/new_deck.py, scripts/lint_deck.py, then
open -a "iA Presenter" deck.iapresenter and inspect the thumbnails (or
scripts/preview_deck.sh to screenshot). Fix and repeat.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.
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
/assets/<file> (files inside the bundle's assets/ folder), /Theme/<file>
(files shipped with the theme), or a remote https://… URL that ends in an image
extension (.jpg .jpeg .png .apng .gif .webp .tif .tiff .svg) or is an
unsplash.com link. Remote URLs work (verified); URLs without an image extension are
treated as plain text.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. also works (no leading slash, spaces as %20), but
content blocks are the recommended, controllable form.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.
.iapresenter bundleA 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 lowercased Name. "sanfrancisco" / "newyork" silently fall back to
the default theme.preset = a preset Name from that theme's presets.json: most themes only have
"Default"; Helvetica and Garamond have "Light"/"Dark", Basel "Default"/"Dark",
Tokyo "Default"/"Light". scripts/install_theme.sh --list prints 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.
python3 scripts/lint_deck.py "My Talk.iapresenter" → zero errors.open -a "iA Presenter" "My Talk.iapresenter". The thumbnail strip shows the
rendered slides; hovering a thumbnail shows its speaking time. scripts/preview_deck.sh
screenshots the window for you (needs Screen Recording permission).Themes live in
~/Library/Containers/net.ia.presenter/Data/Library/Application Support/iA Presenter/Themes/<Name>/
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.
assets/starter-theme/, rename Name and Css, then
scripts/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.DarkBodyTextColor is dark-colored text (used on light
backgrounds); LightBodyTextColor is light text for dark mode. Swapping them gives
invisible text."template": "mytheme" (lowercased Name) or in the Design inspector.--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 use rgb() not hex. Full
guide: references/themes.md, class/variable catalog:
references/engine-css.md.Layout: Columns is broken; Layout: Grid swallows the title.template values are lowercase with spaces; wrong values fall back silently.template.json gets the display name, presets.json the CSS family.open -a + UI. Exports go through
the UI or the Command Palette added in 2.0.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