Sonesta is an agent-focused Python CLI for creating PowerPoint decks from structured JSON specs.
It is built for deterministic, local-first deck generation:
- create and mutate slide specs through the CLI
- validate presentations or individual slides
- inspect normalized deck state as JSON
- render
.pptxoutput without GUI automation
Core project commands:
sonesta initsonesta new presentation <name>sonesta new slide <presentation.json> <slide-id> [--preset blank|body|title]sonesta validate <presentation.json-or-slide.json>sonesta inspect <presentation.json-or-slide.json> --format jsonsonesta render <presentation.json>sonesta render-slide <presentation.json> <slide-id>
Deck and slide management:
sonesta slides list <presentation.json>sonesta slides add <presentation.json> --slide <slide.json>sonesta slides remove <presentation.json> <slide-id> [--delete-files]sonesta slides rename <presentation.json> <slide-id> <new-slide-id>sonesta slides duplicate <presentation.json> <slide-id> <new-slide-id>sonesta slides move <presentation.json> <slide-id> --after <slide-id>sonesta slides elements <presentation.json> <slide-id>sonesta slides notes <presentation.json> <slide-id>sonesta slides set-notes <presentation.json> <slide-id> --text "..."sonesta slides clear-notes <presentation.json> <slide-id>
Element mutation commands:
sonesta slides add-text|update-textsonesta slides add-image|update-imagesonesta slides add-shape|update-shapesonesta slides add-table|update-tablesonesta slides add-chart|update-chartsonesta slides remove-element <presentation.json> <slide-id> <element-id>
Resource discovery:
sonesta themes --project-root <path>sonesta templates --project-root <path>sonesta assets list --project-root <path>sonesta assets inspect <asset-path>
textimageshapetablechart
- theme loading from
.sonesta/themes/<name>.json - template loading from
.sonesta/templates/<name>.json - named slot-based placement
- explicit
x/y/w/hplacement - speaker notes via
notes_path - table
column_widths - chart
title,show_legend, andvalue_format - text bullets and paragraph payloads
- image
fitmodes:contain,cover,stretch z_index-aware render ordering
PYTHONPATH=src python3 -m sonesta init .
PYTHONPATH=src python3 -m sonesta new presentation demo
PYTHONPATH=src python3 -m sonesta new slide presentations/demo/presentation.json overview --preset blank
PYTHONPATH=src python3 -m sonesta slides add-text presentations/demo/presentation.json overview headline \
--text "Lorem Ipsum Overview" --x 1 --y 1 --w 4 --h 0.6 --style headline
PYTHONPATH=src python3 -m sonesta slides add-text presentations/demo/presentation.json overview bullets \
--bullets-json '["Lorem ipsum dolor sit amet","Sed do eiusmod tempor","Ut enim ad minim veniam"]' \
--x 1 --y 1.8 --w 5 --h 2.2 --style body
PYTHONPATH=src python3 -m sonesta validate presentations/demo/presentation.json --format json
PYTHONPATH=src python3 -m sonesta render presentations/demo/presentation.json --format jsonThis creates a .pptx under .sonesta/builds/demo/demo.pptx.
Basic reference deck:
Lorem ipsum demo deck:
Useful example commands:
PYTHONPATH=src python3 -m sonesta validate examples/basic/presentations/demo/presentation.json --format json
PYTHONPATH=src python3 -m sonesta render examples/basic/presentations/demo/presentation.json --format json
PYTHONPATH=src python3 -m sonesta inspect examples/presentations/lorem_demo/presentation.json --format json
PYTHONPATH=src python3 -m sonesta render-slide examples/presentations/lorem_demo/presentation.json overview --format json.sonesta/
presentations/
assets/
Run tests with:
PYTHONPATH=src pytest -q