DeckCraft¶
Evidence key: [CLI] = deckcraft-cli 0.10.0 help/run; [MCP] = live tools/list; [src] = repo docs/source; [unverified].
Purpose and reference product¶
Presentation app (Microsoft PowerPoint clone). Repo storytold/deckcraft, MIT OR Apache-2.0. Git HEAD 9859da39255c0262cd592bb57101d7f2fa961f72 (2026-10-14). Workspace version 0.7.0; installed CLI 0.10.0 (version skew, see README.md).
Native file format¶
.deckcraft [src: crates/format]: ZIP containing a JSON manifest plus media; lossless for the DeckCraft model, forward compatible. .slidecraft is read as an alias [src: file-format-parity.md]. The model (deckcraft-model) has presentations, masters, layouts, slides, shapes, text, themes, transitions, animations. Default slide 960x540 pt.
Readable / writable formats¶
- Read [CLI convert/run help + src]:
.deckcraft,.pptx;.potx/.ppsxread as presentations;.txtoutline and.md(headings = slides) throughslide.fromOutline. Not read:.ppt,.pptm,.odp, PDF, SVG pictures. - Write [CLI
convert]:.deckcraft,.pptx,.pdf,.txt/.md(outline),.png/.jpg(first slide orfile.exportwithslide/all),.gif(animated, one frame per slide)..potx/.ppsxare written with.pptxcontent type [src]. - PDF export [src: file-format-parity.md]: slides, notes pages, handouts (1-9 per page), selectable text layer with embedded font subsets, links, bookmarks; slide artwork is rasterised (gap 14).
file.exportparams list no outline-text option (verified from command text).
CLI surface [CLI]¶
Subcommands: info, render, render-transition, convert IN OUT, run, commands, describe CMD, app, mcp, bench, links, --version.
- run [--in FILE | --sample] [--cmd ID[=JSON]]... [--save OUT] [--export OUT [--export-params JSON]] [--print]: no --in starts a new deck with an empty title slide. Commands run in order; if one fails, run stops and saves nothing (verified: deckcraft-cli: unknown command ..., exit 1). --print shows each answer (slide.new → {"id":260,"index":1}). Slide indices 0-based; rect = [x,y,w,h] pt, y down; shape ids resolve on the current slide only.
- --save writes .deckcraft/.pptx/.pdf/.md; --export writes png/jpg/pdf/pptx/gif.
Command catalogue [CLI commands, counted by regex, approx.]¶
About 321 commands. Groups: format 46, shape 33, table 21, file 19, slide 19, insert 18, text 16, arrange 15, design 14, smartArt 13, edit 12, picture 12, animation 11, review 11, media 9. Key ids:
- File: file.new {theme,template,size}, file.open {path}, file.openBytes, file.save {path,format: deckcraft|pptx}, file.saveAs, file.saveBytes, file.export {path, format: png|jpeg|pptx|deckcraft|outline|pdf|gif, slide, all, slides, scale, layout: slides|notes|handouts, perPage, paper, dpi, ...}, file.render, file.info.
- Slides (page ops): slide.new {layout,title,...}, slide.duplicate, slide.delete {index|ids}, slide.move {from,to}, slide.go, slide.hide, slide.layout, slide.notes, slide.inspect, slide.fromOutline, slide.reuse (import slides from another deck).
- Content: insert.picture {path|data, rect}, insert.textBox {rect,text}, insert.table, insert.chart, shape.insert {preset,rect,text}, text.set {id,text}, text.get, text.find/replace, text.insert.
MCP surface [MCP]¶
deckcraft-cli mcp (0.10.0), 25 tools: list_commands, run_command, batch, new_presentation, open_presentation, save_presentation, export, inspect_document, inspect_slide, render_slide, add_slide, go_to_slide, add_shape, add_text_box, set_text, insert_picture, insert_table, insert_chart, select, pointer, select_tool, key, type_text, screenshot, call_app. Headless in-process by default; --connect attaches to a running app [unverified for deckcraft; flag shape from help of others]. Source: crates/mcp (hand-written JSON-RPC).
Rust crates (24 in crates/)¶
| crate | role | bindable as library? | notable deps |
|---|---|---|---|
| model | presentation/slide/shape/text model | yes | serde, unicode-segmentation |
| format | .deckcraft zip+JSON, outline import/export |
yes | zip, serde_json |
| pptx | OOXML PresentationML import/export | yes | quick-xml, zip |
| PDF export (slides, notes, handouts) | yes (needs craft-libs craft-pdf) |
craft-pdf (krilla), kurbo | |
| render | slide to pixels | yes | vello_cpu, skrifa |
| text, fonts, geom, color, anim, metafile | layout, font db, geometry, colour, animation timing, EMF/WMF | yes | harfrust, skrifa, kurbo |
| engine | session, undo, command registry, pointer tools | yes, but heavy | links media (video/audio decoders), i_overlay |
| media, av1, h264, hevc, vp9, opus, ogg, isobmff, matroska, bitstream | clean-room codecs and containers | no (not needed for doc work) | rayon, symphonia |
| mcp | MCP server | no | - |
| ui-egui | GUI | no | egui |
pydoccraft already links deckcraft-model/pdf/pptx/render from a fork at rev 16de1ca8... (see vendors.md).
Operations relevant to mcruft¶
| operation | route |
|---|---|
| add/remove/reorder slides | slide.new/delete/move/duplicate, 0-based |
| PDF, embedded fonts | file.export format:pdf (subsets embedded; art rasterised) |
| PDF, outlined fonts | not available (no switch found) |
| PNG | file.export format:png, render, file.render |
| SVG export | none |
| import PDF | not supported |
| place image | insert.picture {path, rect} (PNG/JPEG/GIF/BMP/TIFF/WebP; SVG not rendered [src]) |
| text frame edit | insert.textBox, text.set {id,text}, MCP set_text |
| single-page PDF | file.export format:pdf slides:[i] (param exists; not run by me) |
Known gaps vs PowerPoint [src: docs/gaps.md]¶
PPTX corpus is only self-authored decks; round-trip drops some media options; SVG pictures do not render; no printing; only Regular/Bold/Italic font faces; PDF export rasterises slide art; English-only UI; no .ppt/.pptm/.odp. File-format dimension self-scored ~58% ready (estimate).