Batch-1 product comparison¶
Source of every cell: the per-app docs in this folder (CLI help, live MCP tools/list, command catalogues, repo source and docs). "Verified" means I ran or read it; docs claims that I did not run are marked in the per-app files. Researched 2026-10-25.
Matrix¶
| VectorCraft | DeckCraft | PhotoCraft | PdfCraft | DesignCraft | |
|---|---|---|---|---|---|
| Reference product | Illustrator | PowerPoint | Photoshop | Acrobat Pro | InDesign |
| Native format | .vectorcraft (JSON, gzip optional, base64 or blob images) |
.deckcraft (zip: JSON + media) |
.pcraft (zip or dir: manifest + zstd tiles) |
.designcraft (zip: document.json + assets) |
|
| Page-like unit | artboard (0-based, free on pasteboard) | slide (0-based, has id) | none (artboards, layer comps) | page (1-based) | page in spread (mixed bases) |
| Reads | svg, pdf, ai, eps, psd, png/jpg/..., dxf, emf/wmf, Affinity | deckcraft, pptx, md/txt outline | psd/psb, tiff, ora, pdn, kra, svg, flat rasters, raw, heic | pdf; images/txt to pdf | designcraft, idml, indd (unverified); places images/pdf pages/docx/rtf/md/xlsx |
| Writes | vectorcraft, svg, pdf, ai, eps, dxf, emf/wmf, png/jpg/gif/webp/tif/bmp/tga, psd | deckcraft, pptx, pdf, png/jpg, gif, md/txt | pcraft, psd/psb, tiff, ora, flat rasters; pdf (raster only) | pdf, pdf/a, png/jpg/tif, docx/pptx/html/rtf, txt | designcraft, idml, pdf (X-4, A-2b), epub, html, pptx, txt/rtf, png |
| Export PDF | yes, per artboard range | yes, art rasterised | raster only | native | yes, real text |
| PDF fonts embedded vs outlined | both (advanced.outlineText) |
embedded only | n/a | n/a (as-is) | embedded only |
| Export PNG | yes | yes | yes | yes (pages) | yes (per page) |
| Export SVG | yes | no | no | no | no |
| Import PDF as editable | yes (vector art) | no | no | native | no (placed graphic only) |
| Place image | file.place |
insert.picture |
file.placeEmbedded/Linked |
page_add_image |
file.place |
| Text edit | text objects | shape text (text.set) |
type layers | page_add_text, fragile edit |
frame + story (story.setText) |
| Page add/remove/reorder | artboard.* | slide.* | no | page_* | layout.pages.* |
| Command count (installed CLI) | 802 | ~321 | 935 | 175 tools | 527 |
| CLI batch | run --cmd/--commands/--export (JSON lines) |
run --cmd id=json --save (stops on first error, saves nothing) |
run, batch (folder), droplet, serve (JSON lines) |
run --script, batch --steps |
run, script (--keep-going) |
| CLI structured output | JSON per step | text (--print) |
JSON per command | JSON/text | text |
| MCP tools (live) | 32 | 25 | 25 | 175 (compact mode available) | 26 |
| MCP generic command tool | yes | yes | yes | yes (command_run, tool_call) |
yes (execute) |
| Bindable engine crates | doc, format, svg, pdf, render, text, pathops... | model, format, pptx, pdf, render, text | doc, format, io, psd, codecs, compose, vector | cos, model, organize, edit, create, render, export | doc, format, idml, pdf, render, compose |
-engine crate heavy? |
yes (wasmi plugins) | yes (media codecs) | yes (craft-print, rayon) | yes (ocr, js, sign) | yes (craft-print) |
| Existing Python binding | none in repo; DeckCraft/PdfCraft via pydoccraft (extraction only) | pydoccraft (read/render/convert) | none | pydoccraft | none |
| Repo HEAD (local) | b12a52f7 2026-10-14 |
9859da39 2026-10-14 |
4e7a17cd 2026-10-15 |
dc41044b 2026-10-15 |
a930276f 2026-10-15 |
All five repos are MIT OR Apache-2.0, Rust edition 2024, rust 1.95. craft-libs (8f5a2831614e632f91ad367f7af2a6e5b61b9529, 2026-10-15) holds shared craft-pdf (hayro + krilla), craft-cms, craft-print, craft-settings, craft-ui, craft-atomic, craft-quit; DeckCraft, DesignCraft and VectorCraft PDF crates depend on craft-pdf.
Version skew (must be resolved before pinning)¶
Installed CLI versions and local checkouts disagree: VectorCraft CLI 0.16.0 vs workspace 0.11.0; DeckCraft 0.10.0 vs 0.7.0; PhotoCraft 0.15.1 (built from commit 60c87b988, 2026-10-23) vs checkout 0.9.0 HEAD dated 2026-10-15; PdfCraft 0.13.0 vs 0.8.0; DesignCraft 0.12.0 vs 0.8.0. artcraft-in-a-box pins release tags v0.16.0 / v0.15.1 / v0.12.0 for the same apps. So either the workspace version field lags the release tags, or the checkouts are behind. All CLI facts here describe the installed binaries; crate facts describe the local checkouts. I did not fetch from the network.
Cross-app observations for a Document -> Page -> Frame API¶
- Every product is "a command registry plus JSON params". Each exposes the whole app as
id + JSONthroughrun/execute/command_run. A genericcall_command(id, params)escape hatch is cheap everywhere, but ids and flag shapes differ per app (file.savevsdoc_save,--cmd id=jsonvs--cmd id --params json), so the unified layer needs an adapter per product. - Page concept is not uniform. Illustrator-style artboards (free-floating, no ordering semantics), slides (ordered, with ids), spread pages (facing pairs, parents), PDF pages, and raster documents with no pages at all. Model
Pageas optional/derived for PhotoCraft (one implicit page, artboards as extra pages is a lossy choice). - Index bases and rect conventions clash. 0-based (artboards, slides) vs 1-based (PDF, DesignCraft exports); DeckCraft rects
[x,y,w,h], DesignCraft rects[x0,y0,x1,y1], PhotoCraft in pixels, others in points, all y-down in the command layer. The unified API should fix one convention and convert at the adapter. - Frame vs story. DesignCraft separates text frames from threaded stories; DeckCraft/VectorCraft attach text to the object; PhotoCraft has type layers; PdfCraft has content-stream text runs (editing existing runs is fragile). A
TextFrameshould carry geometry and a reference to text content, not embed it. - Font policy cannot be uniform. Only VectorCraft can write outlined text (PDF and SVG). DeckCraft and DesignCraft always embed subsets; PhotoCraft's PDF is raster. For the spec's "visual fidelity" conversion variant, report
outline_fontsas unsupported for four of five routes rather than faking it. - Fidelity and editability variants differ by route. DeckCraft PDF rasterises slide art (fidelity is fine, text layer still searchable); PhotoCraft PDF is raster-only; VectorCraft is the only importer of PDF as editable art. Round trips must be measured; docs here do not prove them.
- Native assets differ.
.pcraftand.designcraftare content-addressed/zipped;.vectorcraftinlines base64 or trailing blobs;.deckcraftzips media. Referencing native assets from a.mcruftpackage means storing the native file as an opaque member plus a preview, not translating it. - Rust bindability is real but no product ships Python bindings. Use the model/format/pdf/render crates, avoid
*-engine(drags in codecs, wasmi, OCR, JS, print spoolers) unless command-level editing is required; pydoccraft proves the pattern for DeckCraft/PdfCraft. Command-level editing in-process needs an engine crate and is the expensive path. - Subprocess CLI is the lowest-friction route to command-level editing (all five have headless
run), but bundling five 120-200 MB binaries per wheel conflicts with small wheels; the CLI binaries are not source-built here. Decide per product: in-process crates for read/render/convert, CLI or engine crate for edits. - MCP is not a stable contract. Tool counts and names differ (25-175), PhotoCraft's server uses a different stack, and GUI-driving tools are mixed in with document tools. Treat MCP as a discovery aid and the command catalogue as the real surface; pin the product revision because the catalogues are large and change weekly.