Transform ideas into stunning presentations in seconds. Write your content, pick a style, and let AI handle the rest β no design skills required.
- Save Hours β What used to take hours now takes minutes
- Professional Results β Every slide looks polished and cohesive
- Zero Learning Curve β If you can write markdown, you can create presentations
- Iterate Fast β Generate multiple variants instantly and pick your favorite
- π§ͺ DeepResearch β Turn a one-line idea into a researched, reviewable outline via Valyu
- π¨ Two-Tone Style Transfer β Dark curtain plates (cover/transition/ending) + light teaching plates (content), with shared accents/motifs
- πΌοΈ Slide References β Attach slide-specific photos or image globs in the outline
- π Outline Articles β Declare source markdown/PDF references once at the top
- π§ Role-Aware Render β Routes each slide to the matching style plates by role (cover / transition / content / ending)
- π Multiple Variants β Generate several design options per slide
- π― Selective Regeneration β Redo specific slides without starting over
- β‘ Parallel Generation β Concurrent API calls with configurable concurrency
- π Auto PDF β Combined slide PDF + speech-notes PDF
- π¬ Narrated Video β TTS + ffmpeg turns slides and
[Speech:]tags into MP4 - π Multi-Provider β OpenRouter (text + images) and Volcengine/Doubao Seedream (images)
pip install -r requirements.txt
cp .env.example .env # add your API keysFour tasks β research β outline β render β present:
# 1. Research: idea.md β research.md
python3 -m src.research.cli
# 2. Outline: research.md β outline_16.md, outline_25.md, outline_36.md
python3 -m src.outline.cli
# 3. Render: two-tone style refs β slide images + PDF
python3 -m src.render.style.cli # base_noncontent β base_content β cover/transition/content
python3 -m src.render.cli
# 4. Present: slide PNGs + [Speech:] tags β narrated MP4 (requires ffmpeg)
python3 -m src.present.cli --output work/image_YYYYMMDD_HHMMSSThen curate (delete variants you don't love) and polish (--page to regenerate individual slides).
π‘ Steps 1β2 share
./work/β edit files between steps. Style CLI writes five plates understyle/(style_base_noncontent.png,style_base_content.png,style_cover.png,style_transition.png,style_content.png). Render routes plates by slide role and writes images towork/image_YYYYMMDD_HHMMSS/+ PDFs towork/. Present writespresentation_video_YYYYMMDD_HHMMSS.mp4towork/(install ffmpeg first).
# Render: pick a different outline, or skip interactive style prompts
python3 -m src.render.style.cli --outline work/outline_25.md
python3 -m src.render.style.cli --pick 1,1,2,1,3 # base_noncontent,base_content,cover,transition,content
# Render: multiple variants per slide
python3 -m src.render.cli --copy 4
# Render: longer outline + selective regeneration
python3 -m src.render.cli --outline work/outline_36.md --page "1,3,5-7"
# Render: rebuild PDF after curating (no API calls)
python3 -m src.render.cli --pdf-only --output work/image_20260520_220006
python3 -m src.render.cli --pdf-only --output work/image_20260520_220006 --variant 1
# Render: explicit style plates + article references
python3 -m src.render.cli --style "style/*.png" --article "docs/*.pdf"
# Present: TTS + video from curated slides (MiniMax TTS)
python3 -m src.present.cli --output work/image_20260520_220006 --variant 1
# Present: clone your voice from a short reference recording (clean WAV/MP3)
python3 -m src.present.cli --output work/image_20260520_220006 \
--reference-audio work/voice_sample.wav
# Present: remux only after TTS MP3s already exist (no API calls)
python3 -m src.present.cli --output work/image_20260520_220006 --mux-only| Option | Description |
|---|---|
--work |
Work directory (default: work/) |
--mode |
Valyu mode: fast / standard / heavy / max |
--categories |
Comma-separated datasource categories (see below) |
--valyu-api-key |
Valyu API key override |
--resume |
Resume polling from research_state.json |
--task-id |
Resume a specific task ID |
--fresh |
Start new task even if state file exists |
Categories: research, healthcare, patents, markets, company, economic, predictions, legal, politics, cybersecurity, transportation
| Option | Description |
|---|---|
--work |
Work directory (default: work/) |
--slides |
Content slide counts (default: 16,25,36) |
--api-key |
OpenRouter API key override |
--txt-model |
Text model override |
--proxy |
HTTP/HTTPS proxy for OpenRouter |
| Option | Description |
|---|---|
--work |
Work directory (default: work/) |
--outline |
Outline file (default: work/outline_16.md) |
--candidates |
Candidates per stage (default: 4, max: 12) |
--pick |
Pre-select indices: base_noncontent,base_content,cover,transition,content |
--provider |
openrouter or volcengine |
--api-key |
API key override |
--proxy |
HTTP/HTTPS proxy (OpenRouter only) |
| Option | Description |
|---|---|
--work |
Work directory (default: work/) |
--outline |
Outline file (default: work/outline_16.md) |
--style |
Style image(s)/glob, repeatable (default: style/*.png) |
--copy |
Variants per slide (default: 1) |
--page |
Pages to generate, e.g. 1,3,5-7 |
--article |
Article path(s)/glob, repeatable (.pdf, .md) |
--output |
Output dir (default: work/image_YYYYMMDD_HHMMSS/); PDFs go to --work |
--provider |
openrouter or volcengine |
--api-key |
API key override |
--proxy |
HTTP/HTTPS proxy (OpenRouter only) |
--balance-only |
Print OpenRouter credits and exit |
--no-balance |
Skip credits line after run |
--pdf-only |
Rebuild PDFs from existing PNGs in --output dir (no API calls); speech PDF always uses first variant per slide |
--variant |
With --pdf-only: variant filter for slides PDF only, e.g. 1 or 1,2 |
Credits: After each OpenRouter run, remaining credits are printed unless
--no-balance. Requires an OpenRouter Management API key β setOPENROUTER_MANAGEMENT_API_KEYor[openrouter] management_api_keyin.env.
| Option | Description |
|---|---|
--work |
Work directory (default: work/) |
--outline |
Outline file (default: work/outline_16.md; falls back to snapshot in --output) |
--output |
Render image directory with slide_p##_v##.png (required) |
--page |
Slides to include, e.g. 1,3,5-7 |
--variant |
Variant filter, e.g. 1 or 1,2 |
--api-key |
MiniMax API key override |
--tts-model |
MiniMax TTS model (default: speech-2.8-hd) |
--voice |
TTS voice (default: Chinese (Mandarin)_Lyrical_Voice) |
--reference-audio |
WAV/MP3/FLAC of your voice for MiniMax voice cloning |
--voice-id |
Saved MiniMax voice ID (alternative to --reference-audio) |
--mux-only |
Skip TTS; mux existing slide_p##_v##.mp3 files (no API calls) |
--silent-seconds |
Duration for slides without speech (default: 3.0) |
Prerequisite: ffmpeg and
ffprobemust be on your PATH.Voice clone:
--reference-audiouploads reference audio and clones voice dynamically via MiniMax.
style/ # style-reference plates (default --style glob)
βββ style_base_noncontent.png # dark curtain base (cover/transition/ending)
βββ style_base_content.png # light content base (teaching slides)
βββ style_cover.png # cover-slide reference (dark)
βββ style_transition.png # transition/roadmap reference (dark)
βββ style_content.png # content-slide reference (light)
βββ style_candidates/ # all candidates + contact sheets
work/
βββ idea.md # seed: title, audience, core message
βββ research.md # DeepResearch report with citations
βββ research_state.json # (transient) in-progress task state
βββ source.md # optional custom source material
βββ style_base.md # shared style + narrative scaffold
βββ outline_16.md # 16 content-slide outline
βββ outline_25.md # 25 content-slide outline
βββ outline_36.md # 36 content-slide outline
βββ image_YYYYMMDD_HHMMSS/ # render output (slide PNGs)
βββ presentation_slides_YYYYMMDD_HHMMSS.pdf # combined slide deck
βββ presentation_speech_YYYYMMDD_HHMMSS.pdf # A4: first image per slide + speech notes
βββ presentation_video_YYYYMMDD_HHMMSS.mp4 # narrated slide video
# PPT Outline: My Presentation
[Articles: @docs/research.md, @docs/report.pdf]
---
## Slide 1: Introduction
- **Key point:** Why this matters
- Core insight: One takeaway the audience should remember
[Reference: photos/founder.png]
[Visual: Split-screen hero; light content background; Reference style: style_content.png, style_base_content.png]
[Speech: Conversational presenter narration for this slide]
---
## Appendix: Global Visual Requirements
- **Theme:** Two-tone deck β white/light content slides; dark curtain for cover, transitions, ending. Accents: Primary #2563EB, Accent #10B981
- **Fonts:** Title / body families and sizes| Tag | Purpose |
|---|---|
[Visual: ...] |
Layout, composition, diagrams, icons, motifs; name the correct style plates for the slide role |
[Speech: ...] |
Presenter narration (used by present + speech PDF) |
[Reference: ...] |
Slide-specific image refs (place immediately before [Visual:]; leading @ accepted) |
[Articles: ...] |
Top-of-outline text reference declarations |
## Appendix: ... |
Deck-wide text constraints only (theme/hex, fonts/sizes; state two-tone backgrounds) |
Include 3β6 transition slides (titles prefixed Roadmap:) with progress bar N/total markers. Render attaches dark plates to cover/transition/ending and light plates to content slides.
work/
βββ image_YYYYMMDD_HHMMSS/
β βββ outline_16.md # outline snapshot used for this run
β βββ slide_p01_v01.png # Slide 1, variant 1
β βββ slide_p01_v01.mp3 # TTS audio (after present)
β βββ slide_p01_v02.png # Slide 1, variant 2
β βββ slide_p02_v01.png # Slide 2, variant 1
βββ presentation_slides_YYYYMMDD_HHMMSS.pdf # all slides in one PDF
βββ presentation_speech_YYYYMMDD_HHMMSS.pdf # A4: first image per slide + speech notes
βββ presentation_video_YYYYMMDD_HHMMSS.mp4 # narrated MP4
Copy .env.example β .env and fill in your keys. INI-style sections:
| Section | Used by | Key settings |
|---|---|---|
| (preamble) | All | provider, max_concurrent, proxy |
[openrouter] |
Outline / Render (when provider = openrouter) |
api_key, management_api_key, img_model, txt_model, use_proxy |
[volcengine] |
Render (when provider = volcengine) |
api_key, img_model, txt_model, use_proxy |
[minimax] |
Present (+ future text/image) | api_key, img_model, txt_model, use_proxy, optional tts_model, tts_voice |
[valyu] |
Research | api_key, mode, categories, use_proxy |
- Research β
[valyu]for DeepResearch - Outline β
txt_modelfrom the activeprovidersection (falls back across[openrouter],[volcengine],[minimax]) - Render β
img_modelfrom the activeprovider(src.render.style.cli+src.render.cli) - Present β MiniMax TTS via
[minimax]tts_model/tts_voiceor--tts-model/--voice(defaults:speech-2.8-hd,Chinese (Mandarin)_Lyrical_Voice) with optional voice cloning - Global
proxyapplies when a section'suse_proxy = true; section-levelproxyoverrides are still supported ark_api_keyin the preamble aliases[volcengine] api_key
See LICENSE file for details.
Happy Sliding! π¨β¨ Transform your markdown into beautiful presentations in minutes, not hours.