Skip to main content

compono

Agent-oriented, code-based PPTX generation. Describe a deck as typed primitives — an LLM agent never writes raw coordinates or touches OOXML.

compono lets an LLM agent (or a human) describe a slide deck as data — headers, bullet text, stats, tables, charts, images, process sequences, shapes — and get back a real, editable .pptx file. The agent never writes raw x/y/w/h coordinates: a constraint-based layout resolver computes every position from a small set of typed primitives.

Every rendered element is a genuine, editable native shape (p:sp, p:pic, p:graphicFrame) — never a flattened image or embedded video. Open the result in PowerPoint and drag a box around; it's a real object, not a picture of one.

Why compono

Ask an LLM to write raw python-pptx (or drive a browser-based renderer like pptx.js) and you get code littered with hand-picked EMU coordinates — the model has to simultaneously invent content and do pixel-perfect layout math it's genuinely bad at. The usual failure modes: overlapping boxes, text running off the slide, margins that drift slide to slide, titles crammed against the edge. None of that is a content problem; it's a coordinates problem.

compono removes coordinates from the agent's job entirely:

  • You describe intent, not geometry. {"primitive": "grid", "columns": 2, ...}, not left=Inches(0.6), top=Inches(1.9), width=.... A directional, flexbox-style resolver computes every real position.
  • A cheap pre-flight check, before paying render cost. validate(spec) catches schema errors, layout impossibilities, and text overflow — measured against real glyph metrics, not guessed — in milliseconds, with no file write. Bad specs get a structured {slide, primitive, field, error, detail, fix} back, not a broken .pptx or a stack trace.
  • A design-quality pass, still optional. review(spec) — contrast, whitespace, image-fit, font-size-near-overflow, style — flags things a human designer would notice that "renders successfully" doesn't catch.
  • Nothing is ever a flattened image. Every primitive is a real, editable OOXML shape or graphicFrame. A generated table is a real table; a generated chart has live, editable series data. Open the file and it's actually still a deck, not a picture of one.

The result: an agent's job shrinks to "pick the right primitives and content," and a resolver + validator handle everything spatial.

Install

pip install compono
# or
uv add compono

Quickstart

from compono import render_deck

spec = {
    "slides": [
        {
            "header": {"title": "Q3 Results", "subtitle": "Engineering team"},
            "body": [
                {
                    "primitive": "text",
                    "mode": "bullets",
                    "content": [
                        "Shipped the new layout resolver",
                        "Cut render time by 40%",
                        "Zero overflow bugs in production",
                    ],
                    "emphasis_indices": [1],
                }
            ],
        }
    ]
}

report = render_deck(spec, "deck.pptx")
print(report.pptx_path, report.warnings)

Or from the command line:

compono validate spec.json
compono render spec.json -o deck.pptx

How an agent should use this

The intended loop is validate, fix, render — not "render and hope":

  1. Build a spec (plain dict/JSON — whatever your tool-calling naturally produces).
  2. validate(spec) — cheap, no file write. If .valid is False, apply each error's fix field directly and re-validate.
  3. Optionally review(spec) once it validates — apply suggestions that matter for this deck, ignore the rest; it never blocks anything.
  4. render_deck(spec, output_path) — writes the real .pptx. It refuses to write anything on a validation failure, so a broken spec never produces a broken file.

compono reference (or compono.reference() in Python) prints the same full reference an MCP client or Claude Code skill would get — useful if you're wiring up a different agent framework and want the whole primitive catalog and error shape in one shot.

Documentation

  • Getting started — install, quickstart, core concepts
  • API reference — verbs, error shape, the feedback loop, design review
  • Primitives — full catalog, image placeholders, worked examples
  • Templates and fontsDeck.template, font_family
  • CLI
  • MCP servercompono-mcp, and what to do when compono has no context
  • Inspire — scan liked decks into a style profile/skill, structure and style only, never literal content
  • Claude Code plugin
  • Examples — rendered screenshots across genres, from real examples/*.json specs

(Absolute links, not relative — this README is also rendered as-is on PyPI, which can't resolve links to other files in the repo.)

Agents: the full reference in one file is compono reference / compono.reference(), or skills/compono/SKILL.md — that's the doc written for you, not this page.

Contributing

See CONTRIBUTING.md for dev setup, branching, and code style. If you're using Claude Code, .claude/README.md describes the build-workflow skill, review subagent, and commit/format hooks set up for this repo.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

compono-0.1.8.tar.gz (37.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

compono-0.1.8-py3-none-any.whl (45.2 kB view details)

Uploaded Python 3

File details

Details for the file compono-0.1.8.tar.gz.

File metadata

  • Download URL: compono-0.1.8.tar.gz
  • Upload date:
  • Size: 37.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for compono-0.1.8.tar.gz
Algorithm Hash digest
SHA256 44d00cb04b6b4ebb54941e8a99ff37c50a0922a41d2a81a8dee4a94c30681342
MD5 262a0381dc9d33bd9b01bddc909f7c82
BLAKE2b-256 da071bef1c7f82dac235f58cfe8a00e4cb5043133eb10f5f94a34389ede438af

See more details on using hashes here.

File details

Details for the file compono-0.1.8-py3-none-any.whl.

File metadata

  • Download URL: compono-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 45.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.13 {"installer":{"name":"uv","version":"0.12.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for compono-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 d3c95b2e0f37e7569f1a80814f3b693a2650e20bb281e5961e89363a7dea542b
MD5 b67b71f869f3a68c13dc156a55f107ad
BLAKE2b-256 7b8340bba9448eba9afe8daf6c483aee4e661db76c9c8b16a8af938c948d4b11

See more details on using hashes here.

Release history Release notifications | RSS feed

0.3.0

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

This release

0.1.8 This release

2 files

0.1.7

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page