Files
deckcraft/docs/control-protocol.md
alexanderalber e8c4c60884 Home: the title bar's Home button opens the start screen (#17) (#49)
It ran file.new, so each click silently added another blank presentation
and looked like it did nothing. Home is now a UI command (app.home) that
shows the start screen over the open presentations, with a "Back to …"
button; Escape or Home again goes back. Creating or opening a presentation
from it leaves it. While it's open, keys don't reach the hidden
presentation (only app shortcuts and Escape). ui.inspect reports `home`.

generated with Claude Code
2026-10-10 06:19:38 -04:00

2.5 KiB
Raw Permalink Blame History

Control protocol

Start the app with --control <port>. The server listens on 127.0.0.1 only and speaks JSON lines: one request object per line, one reply per line.

{"id": 1, "method": "engine.execute", "params": {"command": "shape.insert", "params": {"preset": "roundRect", "rect": [100, 100, 240, 120], "text": "Hello"}}}
{"id": 1, "ok": true, "result": {"id": 258}}

Coordinates are slide points (1/72 inch; a 16:9 slide is 960 × 540) unless noted.

Method Params What it does
engine.execute / ui.menu.invoke / command {command, params} Run any command (see engine.commands; deckcraft-cli describe ID documents one)
engine.commands — Every command: id, label, menu path, shortcut, params doc, enabled / disabled reason
document.inspect — Slides, sections, layouts, shapes, selection
ui.inspect — UI state, active tool, window/canvas/slide rects, dialog, Home (start screen over the open presentations), slide show state, documents, perf (fps, render ms)
ui.tool.select {tool, preset?} select, text, shape + preset, any preset name, curve, freeform, scribble, pen, highlighter, eraser
ui.pointer {events: [{kind: down|drag|up|move|doubleclick|tripleclick, x, y, mods?}], mods?} Drive the active tool in slide points through the same code path as the mouse
ui.key / ui.text {key, shift?, alt?, cmd?} / {text} Keyboard input (also drives a running slide show)
ui.move / ui.click / ui.drag screen points Real egui pointer input — reaches every widget, menu and pane
ui.set {tab?, view?, pane?, notes?, zoom?, brightness?, ruler?, gridlines?, guides?, …} UI state (returns the full state)
ui.dialog.open / ui.dialog.close {id, fields?} Open or close a dialog by id; fields pre-fills its fields (About: {"tab": "contributors"} or "models")
ui.screenshot {path?} PNG of the whole window (base64 when no path)
ui.render {path?, slide?, scale?} Render a slide headlessly
ui.resize / ui.focus Window control
show.start / show.end {from?: slide index, presenter?, reading?} Slide show
app.open / app.save / app.export / app.quit {path, …} Files (export takes the file.export params, e.g. {"path": "deck.pdf", "layout": "handouts", "perPage": 3})

The MCP server (deckcraft-cli mcp, see mcp.md) wraps the same methods for Claude and other agents; deckcraft-cli app METHOD [JSON] sends one request from a shell.