pptx://¶
Status: ✅ Native authoring + read/convert. pptx:// is a Helix-native surface for Microsoft PowerPoint .pptx
(Office Open XML / PresentationML) presentations.
Powered by a pure-Go OOXML writer built into Helix — no library, no cgo,
no external service. The whole .pptx package (content types, theme, slide
master, slide layouts, notes master, slides, media) is generated from the
standard library (archive/zip + string assembly).
pptx:// complements docling:// (which reads Office documents into
Markdown/JSON but cannot write one): pptx:// is the authoring half —
it creates, converts and reads .pptx decks. It is the presentation
counterpart to docx:// (Word) and xlsx:// (Excel).
URI shape¶
pptx:///abs/path/to/deck.pptx?op=extract_text
pptx://relative/out.pptx?op=create
pptx://?file=/tmp/out.pptx&op=from_markdown
The path may be inside the authority (pptx://out.pptx), absolute
(pptx:///abs/out.pptx), or supplied via file= or the HelixPptxFile
header (per-message override).
Operations (op=)¶
| op | input body | output | notes |
|---|---|---|---|
extract_text (default) |
— | plain text | Self-contained OOXML walk over every slide; works on any .pptx. Aliases: read, parse. |
create |
structured presentation model | writes .pptx |
The authoring op. Alias: write. See Presentation model below. |
from_markdown |
Markdown string | writes .pptx |
One slide per heading; list items become bullets (indent → level). |
to_markdown |
— | Markdown string | Exports a deck to a Markdown outline (title → #, bullets → -). |
info |
— | map[string]any |
Structural counts: slides, notes, images, sizeBytes. |
Write ops (create/from_markdown) stamp HelixPptxFileWritten (absolute
path). Read ops stamp HelixPptxFilePath / HelixPptxFileName.
Presentation model (op=create)¶
The body is a JSON/Starlang object the writer walks. The slide array may be
keyed slides or body (both accepted). Optional deck metadata:
title, subject, author, company, and widescreen (default true =
16:9; false = 4:3).
- set-body:
starlang: |
{
title: "Q3 Review",
author: "Helix",
slides: [
{ layout: "title", title: "Quarterly Review", subtitle: "FY2026 Q3" },
{ layout: "titleContent", title: "Highlights", bullets: [
{ text: "Revenue up 15 percent", bold: true },
{ text: "Two new regions", level: 1 } ] },
{ layout: "titleContent", title: "Numbers", table: {
headers: ["Metric", "Value"],
rows: [ ["Growth", "15%"], ["Churn", "2%"] ] } },
{ layout: "twoContent", title: "Compare",
left: [ { text: "Pros" }, { text: "Fast", level: 1 } ],
right: [ { text: "Cons" }, { text: "New", level: 1 } ] },
{ layout: "titleContent", title: "Screenshot",
image: { path: "/tmp/chart.png" },
notes: "Explain the dashboard." }
]
}
- target: "pptx://x?op=create"
Slide layouts (layout)¶
layout |
placeholders used | aliases |
|---|---|---|
titleContent (default) |
title + body (bullets / table / image) | content, titleAndContent |
title |
centred title + subtitle | titleSlide, cover |
section |
section title + subtitle | sectionHeader, divider |
twoContent |
title + left & right columns | two, comparison, columns |
titleOnly |
title only | — |
blank |
free content, no placeholders | empty |
All six standard layouts are emitted into every deck's slide master, so the file opens in PowerPoint with the correct layout gallery.
Slide fields¶
| field | type | applies to | meaning |
|---|---|---|---|
title |
string | all with a title | slide title |
subtitle |
string | title, section |
subtitle line (falls back to text) |
bullets |
[]bullet |
body layouts | rich bullets (see below) |
body |
[]string |
body layouts | plain paragraphs (level-0 bullets, no glyph) |
text |
string | body layouts | single block of text |
left / right |
[]bullet |
twoContent |
the two columns |
table |
table | body / blank | a table shape |
image / images |
image(s) | body / blank | inline picture(s) |
notes |
string | all | speaker notes (adds a notes slide) |
bg |
hex RRGGBB |
all | solid slide background |
A bullet is { text, level, bold, italic, color (RRGGBB), size (pt),
noBullet }. An image is { path | data (base64) + format (png|jpeg|gif),
x, y, w, h (inches), alt } — omit geometry to fit the body area. A table
is { headers[], rows[][], widths[] (inches), x, y, w }; the header row is
styled (fill + bold) and body rows are banded.
When a body slide has both bullets and a table/image, the bullets take the
top half and the visual the bottom half automatically; use explicit x/y
to override.
Templates / outlines (op=from_markdown)¶
Feed a Markdown outline and each ATX heading (# …) starts a new slide;
list items and plain lines below it become that slide's bullets, with two
spaces of indent per bullet level. --- on its own line forces a new slide.
This is the natural “agent emits Markdown → deck” path.
- set-header: { name: HelixPptxFile, starlang: 'headers["out-path"]' }
- target: "pptx://x?op=from_markdown" # body is the Markdown string
URI parameters¶
| name | type | default | description |
|---|---|---|---|
file |
string | — | Target (write) / source (read) .pptx. Also via URI path or HelixPptxFile. |
op |
enum | extract_text |
extract_text \| create \| from_markdown \| to_markdown \| info. |
Headers¶
Per-message overrides (in): HelixPptxFile, HelixPptxOp.
Producer outputs (out): HelixPptxFileWritten (write ops),
HelixPptxFilePath / HelixPptxFileName (read ops),
HelixPptxTextLength (extract_text),
HelixPptxSlideCount / HelixPptxNotesCount / HelixPptxImageCount (info).
Example routes¶
Author a deck at the end of an HTTP request:
workflows:
- id: generate-deck
trigger:
uri: http-server://0.0.0.0:8092/deck
steps:
- set-header:
name: HelixPptxFile
starlang: payload.path
- set-body:
starlang: '{ slides: [ { layout: "title", title: "Report" } ] }'
- target: "pptx://x?op=create"
Turn agent-authored Markdown into slides:
workflows:
- id: markdown-to-slides
trigger:
uri: seda://deck-export
steps:
- set-header: { name: HelixPptxFile, starlang: 'headers["out-path"]' }
- target: "pptx://x?op=from_markdown" # body is the Markdown outline
Extract text from dropped .pptx files for RAG / search:
workflows:
- id: ingest-slides
trigger:
uri: "file:///var/data/inbox?include=.*\\.pptx$&recursive=true&delay=2s&noop=false"
steps:
- set-header: { name: HelixPptxFile, starlang: 'headers["HelixFilePath"]' }
- target: "pptx://x?op=extract_text"
- target: seda://index-document
Related Helix surfaces¶
| surface | purpose |
|---|---|
pptx:// (this component) |
Author / convert / read .pptx presentations |
docx:// |
Author / convert / fill / read .docx |
xlsx:// |
Read/write Excel workbooks |
pdf:// |
PDF extract / form-fill / split / rotate |
docling:// |
Read .pptx/.docx/.pdf/html/image → Markdown/JSON (external docling-serve) |