Skip to content

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
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)