iamlukethedev / herald-slides
Make and change presentations in Herald Slides, the presentation editor in Herald OS - a deck from a topic (an outline first, a title slide, one idea a slide, short bullets, speaker notes, a closing slide), decks from a Herald Docs document and slides of a Herald Sheets range, layouts chosen for the content, the slide master and its layouts (a logo, slide numbers, a footer and the date on every slide, placeholders, backgrounds), themes and custom themes in a brand's colours, transitions, gradients, flowcharts and diagrams with grouped shapes and connectors, table borders, speaker notes for every slide, pictures, tables, text boxes and shapes, reordering, duplicating and hiding slides, find and replace, saving PowerPoint files and exporting PDFs, all through the slides tool
Herald Slides
Herald Slides is the presentation editor built into Herald OS. It opens and saves PowerPoint files
(.pptx), and the person watches every change land in the Slides window. Use the slides tool
whenever they want a deck made or changed: "make a deck about our Q3 results", "turn my report
into slides", "put the budget table on a slide", "add our logo and slide numbers", "make it
darker", "draw the approval process as a flowchart", "export it as a PDF".
The workflow
Find the deck.
slides action=listshows the presentations open in Herald Slides: name,
path, unsaved edits, the one in front (active), its slide in front and what is selected.slides action=list_alladds what is open in Herald Docs and Sheets, andos_ui action=state
carries the same list asoffice. "This slide" is the slide in front. Name a deck by its file
(presentation="~/Documents/Q3 review.pptx") or by its tab (presentation="Q3 review"); left
out, a call works on the one in front.Read before you change anything.
slides action=readgives the size, theme, transition,
header and footer, and each slide's number, id, layout, title, text, speaker notes, whether it
is hidden, its own theme, transition and background where it has them, and its elements with
their ids, boxes in points, groups and what each connector joins (slide=3for one). Name a
slide by its number (1 is the first), its id or its title; left out, a call works on the slide
in front. Name an element by its id fromread(or its number in the slide's list).slides action=find text="Q2"lists the slides where something appears.Write the words yourself. Titles are short (a few words, no full stop).
bodyis one line
a bullet; two spaces or a tab at the start of a line go a level deeper.One call, one step. Every call is one step the person can undo (Ctrl+Z, ⌘Z on a Mac, or
slides action=undo, withsteps=3for several). Land a whole change in one call. Several
changes go in oneslides action=edit(below), never a string of small calls.Check. Read the deck back (
slides action=read) and say in a sentence what you made or
changed.
An open deck changes in its window. A file that is not open is read, changed and written straight
back to disk: the person is asked first every time, Herald backs the original up the first time
it writes over it, and it refuses when the file holds something it cannot keep (see the end).
Then open it (slides action=open path="~/Documents/Q3 review.pptx"; the answer lists the slides
and what Herald shows differently from the file) and work in the window, above all before naming
elements, whose ids a file that is not open may not keep from one call to the next.
A deck from a topic
Plan the outline first: the story in 6 to 12 slide titles, from the opening question to
the answer. When the person wants to see the outline before you build it, give it and wait;
otherwise build it straight away.One idea a slide. A title slide (the deck's title, and a line with who and when), then a
slide for each point, a section slide between the parts of a long deck, and a closing slide
(the takeaway, the next steps, or the question to discuss).Short, parallel bullets: three to five a slide, each a few words, all built the same way
("Cut costs", "Grow sales", "Hire two engineers"). The detail goes in the speaker notes, in
full sentences: what to say on that slide.- Make it in one call, with a theme that suits the audience:
slides action=new name="Q3 review" theme=herald slides=[
{"layout": "title", "title": "Q3 review", "body": "Finance team · October 2026"},
{"title": "Where we landed", "body": "Revenue up 12%\nCosts flat\nMargin at 18%", "notes": "Lead with revenue: it beat the plan by 4 points, mostly from the new subscription tier."},
{"layout": "two-content", "title": "Subscriptions vs one-off sales", "body": ["Subscriptions\n Up 31%\n Churn 2.1%", "One-off sales\n Down 6%\n Mostly hardware"], "notes": "The mix keeps moving to subscriptions."},
{"layout": "section", "title": "Next quarter", "body": "What we will change"},
{"title": "Three priorities", "body": "Raise prices on the base tier\nCut delivery times\nHire two support staff", "notes": "Ask for a decision on prices today."},
{"title": "Thank you", "body": "Questions and next steps", "notes": "Close on the price decision."}
]Finish it on the master in one
edit: slide numbers and a footer, the logo if they have
one (below).
path saves the new deck at once (a new .pptx, never over a file that exists): give it only
when the person said where.
From a document or a sheet
A document becomes a deck:
slides action=from_document document="~/Documents/Report.docx"
makes a new presentation named after it as one step, as File > New from Document does: a title
slide from its title, then each heading's slides of bullets (its paragraphs and list items, list
levels kept), going on over "(continued)" slides as they need; a top heading with headings under
it makes a section header; pictures go beside their text or on slides of their own, and tables,
quotes and code on slides of their own. Fields read as the text they show, and notes as their
raised numbers with their text in the speaker notes.level=2makes only the second-level
headings start slides (deeper ones become bullets, higher ones section headers);notes=true
is for a talk with a script (every paragraph in the speaker notes, short bullets on the slides);presentation=adds the slides to the end of a deck instead. Then read it and tidy it in oneedit: shorter titles, thin slides merged, a closing slide, a theme.Figures from a sheet: `slides action=insert_range workbook="~/Documents/Budget.xlsx"
range="A1:D6" slide="Costs"` puts the range on the slide as a table, as its cells show
(formatted numbers and dates), in place of the slide's empty text placeholder or under its
title (x,y,widthplace it yourself;range=selectiontakes what is selected in an open
workbook). `slides action=addslidefrom_sheet workbook="~/Documents/Budget.xlsx" range="A1:D30"
title="Budget" after="Costs"` makes a Title Only slide of it, going on over more slides with the
header row repeated when it is long. Keep a table to what matters (a few rows and columns), and
add a summary slide with the two or three figures to remember.
Layouts for the content
title: the deck's first slide;bodyis the line under the title.title-content: a title and bullets, the default.two-content: two columns, for comparisons, before and after, pros and cons. Givebodyas a
list of two bodies and name both sides in the title ("Rent vs buy").comparison: two columns, each under a bold heading of its own.section: a big title and a line under it, between the parts of a long deck.title-only: a title and the room under it, for a table, a picture, a diagram or a big number.blank: nothing, for a picture that fills the slide.picture-caption: a title, a picture on the right and a caption on the left (bodyis the
caption;add_imagewithout a place fills the picture's spot).
A big number reads best alone: a title-only slide, then `add_text text="12%" size="120"
bold=true align=center` (sizes go from 4 to 400 points) with a smaller line under it. Change a
slide's layout with set_slide layout=two-content; its text moves into the new layout's places.
The slide master and its layouts
What every slide shares lives on the slide master, and what every slide of one layout shares on
that layout: change the master or a layout rather than every slide. slides action=read_master
shows the master's background, placeholders and elements, each layout with the slides on it, and
the header and footer.
Slide numbers, a footer, the date: `setheaderfooter number=true footer="Acme ·
Confidential" skipTitle=true(date=true dateFormat=dmy, ordateText="Q3 2026"`). They go in
the master's own places on every slide; never draw them as text boxes.A logo on every slide:
add_logo source="~/Pictures/logo.png" corner=top-right(clear of
the footer;layout=titlefor title slides only).Drawings on every slide: `addmastershape kind=rect x=0 y=0 width=960 height=12
fill=accent1(a band),addmastertext text="Draft",addmasterimage` (a watermark);layout=puts them on one layout's slides.remove_from_master elements=[...]takes them off.Placeholders:
set_placeholder role=title size="36" color=accent1restyles the master's
title, and every layout's and slide's title that still looked like it follows;layout=andwhich=(the second text oftwo-contentis 2) reach one layout's,x,y,width,heightmove it.Backgrounds:
set_background layout=master gradient="background2 to background"behind every
slide,layout=sectionfor section slides,slide="1, 7"for some slides;source=a picture.show_master_graphics show=false slide=1hides the logo and bands on a slide (a cover photo),layout=on a layout's slides;rename_layout, andreset_masterputs Herald's own master
back (it asks the person first, asremove_from_masterdoes).
Themes and backgrounds
theme (on new, or slides action=set_theme theme=midnight) changes the colours and fonts
everywhere they come from the theme, and keeps what was picked by hand: herald (white with navy
text and blue accents, the default), midnight (dark navy with light text, for big screens and
keynotes), paper (warm cream with serif type, for stories and teaching), graphite (dark grey
with yellow accents), forest (pale with green accents), coral (warm peach and coral, friendly),mono (black and white with a red accent, stark), ocean (pale blue and teal, calm), aurora
(deep blue with a soft glow, bold), dune (a cream-to-sand gradient with serif headings), slate
(cool off-white with blue accents, sober), blossom (a pale pink gradient) and ember (dark warm
brown with orange accents). set_theme slide="3, 4" gives some slides a theme of their own.
Custom themes: for a brand, `make_theme name="Acme" from=slate colors={"accent1": "#e4002b",
"text": "#1d1d1b"} headingFont="Futura" apply=true` saves a theme of the person's own for every
deck and puts it on this one.list_themeslists Herald's and theirs (by id and name);delete_themetakes one away and asks first. Keep text readable on its backgrounds.set_slide background=accent1colours one slide (a section slide, the closing slide);set_background gradient="navy to teal" angle=45gives slides a gradient. Colours are#rrggbb,
names likenavy, or theme coloursaccent1toaccent6,textandbackground, which follow
the theme when it changes.size=standardonnewmakes a 4:3 deck instead of 16:9.
Transitions
slides action=set_transition kind=push slide=all gives every slide (and the deck) one transition;
without slide=all it is the slide in front's own, or slide="2-4"'s. Kinds: none, fade,push, wipe, cover, uncover, split and zoom; direction is the way the new slide
moves (left comes in from the right, right, up, down; in or out for split and zoom),duration its seconds (0.5). Keep to one quiet kind for a whole deck; a different one marks a
section.
Speaker notes, order and hiding
Notes for every slide: read the deck, then write them all in one
editwith asetSlideper
slide ({"op": "setSlide", "slide": "2", "notes": "..."}): what to say, in full sentences,
about a minute a slide, with the numbers on the slide explained.move_slide slide="Risks" to=last(a number,firstorlast),duplicate_slide slide=3
(a copy right after it, notes and all),set_slide slide=7 hidden=true(skipped when
presenting, still in the file), andremove_slide slide=4, which deletes it and asks the
person first.- Presenting is the person's: they start it from the Slides window.
Pictures, tables, text and shapes
Boxes are in points from the top-left: a wide slide is 960 by 540, a standard one 720 by 540.
Without a place, things go in the middle or into the slide's empty placeholder.
Pictures from files (PNG, JPEG, GIF, WebP or BMP): `slides action=add_image slide=3
source="~/Pictures/team.jpg"; withx,y,width,height,fit=contain` (all of it),cover(fills the box, cut to fit) orstretch;fit=slidefills the whole slide. Use the
person's pictures, or ones they ask you to find or make.Tables: `slides action=add_table slide="Prices" cells=[["Plan", "Price"], ["Base", "$9"],
["Pro", "$19"]](the first row is the header); orinsert_range` from Herald Sheets. Lines:set_cell_borders range="A1:C1" sides=bottom color=accent1 width=2(sidesouter, inner, all,
top, bottom, left, right or none; cells as a sheet names them, orrow 1,column 2).- Text boxes:
add_text text="Draft" x=40 y=480 size="18" color=accent2. Shapes: `add_shape kind=roundRect x=600 y=380 width=300 height=100 fill=accent1 text="New in
Q3".kind` is any of PowerPoint's presets by name, in families: rectangles, basic shapes
(hexagon,can,cloud,heart,lightningBolt…), brackets and braces, arrows
(rightArrow,chevron,bentArrow,uturnArrow…), math (mathPlus,mathEqual…),
flowchart (flowChartProcess,flowChartDecision,flowChartTerminator,flowChartInputOutput,flowChartDocument…), stars and banners (star5,star12,wave) and
callouts (wedgeRoundRectCallout,cloudCallout…); words like circle, star, cylinder or decision
work too.Gradients:
gradient="accent1 to accent2" angle=0onadd_shape, or `set_fill
elements=["shape-2"] gradient=...(fill=` a colour, or none) on what is there.
Diagrams: groups and connectors
A flowchart is shapes joined by connectors: add the shapes (flowChartTerminator for start and
end, flowChartProcess for steps, flowChartDecision for questions) in rows or columns with room
between them, then add_connector from="shape-1" to="shape-2" for each arrow. A connector is glued
to the two shapes' nearest connection sites and follows them when they move; kind=elbow bends at
right angles, curved curves, arrow puts its head at the end (the default), the start, both or
neither; connection_sites element=... lists a shape's sites for fromSite and toSite. Build a
whole diagram in one edit (an addShape per box, then an addConnector per arrow, naming the
shapes by their numbers on the slide). Then group elements=[...] makes it one thing to move,rotate elements=[...] degrees=90 turns elements together, ungroup takes a group apart, andconvert_to_shapes turns a file's SmartArt into shapes that can be edited.
Several changes as one step
slides action=edit edits=[...] makes every change in order as ONE step to undo, and if one
fails, none is made. Each edit sees the deck as the ones before left it: a slide one edit adds can
be named by its title in the next, and an edit without a slide lands where the one before went.
The ops: addSlide, setSlide, duplicateSlide, moveSlide, removeSlide, addText,addShape, addImage, addTable, setTheme and replace; and, with the same arguments as the
actions of the same words, setBackground, addMasterText, addMasterShape, addMasterImage,addLogo, removeFromMaster, setPlaceholder, showMasterGraphics, renameLayout,resetMaster, setHeaderFooter, setTransition, group, ungroup, rotate,convertToShapes, addConnector, setCellBorders, setFill and addSlideFromSheet. A batch
that removes a slide or something from the master asks the person first, as the action alone does.
slides action=edit edits=[
{"op": "addSlide", "title": "Approval", "layout": "title-only"},
{"op": "addShape", "kind": "flowChartTerminator", "x": 80, "y": 230, "width": 160, "height": 70, "text": "Request"},
{"op": "addShape", "kind": "flowChartDecision", "x": 400, "y": 210, "width": 160, "height": 110, "text": "Under $500?"},
{"op": "addShape", "kind": "flowChartProcess", "x": 720, "y": 230, "width": 160, "height": 70, "text": "Approve"},
{"op": "addConnector", "from": "2", "to": "3"},
{"op": "addConnector", "from": "3", "to": "4"},
{"op": "setHeaderFooter", "number": true, "skipTitle": true},
{"op": "setTransition", "kind": "fade", "slide": "all"}
]slides action=replace find="Q2" replacement="Q3" changes titles, text, shapes, tables and notes
everywhere (all=false only the first; leaving out replacement deletes the matches).
Saving and exporting
Never save unless the person asks. An open deck keeps its unsaved edits (its tab says so), and
they save with Ctrl+S (⌘S on a Mac) or ask you to."Save it":
slides action=save. Saving over the deck's own file asks the person every time;
the first time Herald writes over a file it shows what it cannot keep, and the original goes to
Herald's Office backups.A deck never saved needs a place:
slides action=save to="~/Documents/Q3 review.pptx". A file
that exists is replaced only withoverwrite=true, which asks first.A PDF:
slides action=export_pdfwrites a page a slide (hidden slides left out) to a new file
in ~/Documents, orto="~/Desktop/Q3 review.pdf". Say where it went.
What Herald Slides cannot do yet
No animations (a file's animations and automatic timings are not kept), no charts (a file's
charts are approximated, and its SmartArt shows as a drawing until convert_to_shapes), videos
shown as their poster frame, sounds left out, and no comments, macros, embedded fonts, sections
or custom shows. Opening a file lists what it had. Say so plainly, and offer what works: a table
or a big-number slide in place of a chart, a diagram of shapes and connectors in place of
SmartArt, a picture exported from Herald Canvas in place of a drawing, a duplicated slide with one
more bullet in place of a build animation.