# Template: Pitch Deck Reproducible, validated pitch-deck generation — one token-resolved content source renders to six real artifacts: short/medium/long decks, each as both PDF and PPTX. **Location:** git-tracked public exemplar at `projects/templates/template_pitch_deck/` in the public template checkout. ## When to use this template Use this template when you need a pitch, grant report, or recurring stakeholder update treated as a build artifact — bound to live repository facts, validated for unresolved tokens and pitch-deck cliché, and regenerable byte-for-byte from source rather than hand-maintained in a proprietary slide tool. The flagship shipped content pitches [`template_template`](../template_template/) — this monorepo's own autopoietic meta-project — to a meta-science / science-integrity audience. If your research subject renders as a manuscript instead, start from [`template_code_project`](../template_code_project/) or [`template_template`](../template_template/). Full roster: [`projects/AGENTS.md`](../../AGENTS.md#permanent-canonical-exemplars). ## Publication and rendering **template_pitch_deck: Reproducible, Validated Pitch-Deck Generation** · v1.0.0 · MIT · Daniel Ari Friedman Concept DOI: [10.5281/zenodo.21281509](https://doi.org/10.5281/zenodo.21281509) | Version DOI: [10.5281/zenodo.21281510](https://zenodo.org/records/21281510) | Repository: [docxology/template-pitch-deck](https://github.com/docxology/template-pitch-deck) Publishing surface — 20 platforms, 2 published: | Platform | Tier | Status | Reference | Credentials | | --- | --- | --- | --- | --- | | zenodo | first-class | ✅ published | [10.5281/zenodo.21281509](https://doi.org/10.5281/zenodo.21281509) | `ZENODO_API_TOKEN` | | github | first-class | ✅ published | [docxology/template-pitch-deck](https://github.com/docxology/template-pitch-deck) | `GITHUB_TOKEN` | | arxiv | first-class | ⚪ available | — | — | | pypi | first-class | ⚪ available | — | `PYPI_TOKEN`, `TESTPYPI_TOKEN` | | ipfs_pinata | first-class | ⚪ available | — | `PINATA_JWT` | | ipfs_web3storage | first-class | ⚪ available | — | `WEB3_STORAGE_TOKEN` | | software_heritage | first-class | ⚪ available | — | — | | github_pages | first-class | ⚪ available | [docxology/template-pitch-deck](https://github.com/docxology/template-pitch-deck) | `GITHUB_TOKEN` | | cloudflare_pages | first-class | ⚪ available | — | `CLOUDFLARE_API_TOKEN` | | netlify | first-class | ⚪ available | — | `NETLIFY_AUTH_TOKEN` | | huggingface_hub | first-class | ⚪ available | — | `HUGGINGFACE_TOKEN`, `HF_TOKEN` | | osf | first-class | ⚪ available | — | `OSF_TOKEN` | | amazon_kdp | documented | 🟡 planned | — | `AMAZON_KDP_EMAIL`, `AMAZON_KDP_PASSWORD` | | google_play_books | documented | 🟡 planned | — | `GOOGLE_PLAY_BOOKS_SERVICE_ACCOUNT_JSON` | | gumroad | documented | 🟡 planned | — | `GUMROAD_ACCESS_TOKEN` | | leanpub | documented | 🟡 planned | — | `LEANPUB_API_KEY` | | lulu | documented | 🟡 planned | — | `LULU_CLIENT_KEY`, `LULU_CLIENT_SECRET` | | draft2digital | documented | 🟡 planned | — | `DRAFT2DIGITAL_API_TOKEN` | | stripe | documented | 🟡 planned | — | `STRIPE_SECRET_KEY`, `STRIPE_PUBLISHABLE_KEY` | | ingramspark | documented | 🟡 planned | — | `INGRAMSPARK_CLIENT_ID`, `INGRAMSPARK_CLIENT_SECRET` | _Keywords: pitch deck, slide generation, reproducible research communication, meta-science infrastructure, science integrity, token validation, PPTX, PDF rendering._ _Status legend: ✅ published (durable identifier recorded in `config.yaml`) · 🔵 reserved (identifier reserved but not yet registered by final publication) · ⚪ available (adapter implemented and locally verifiable) · 🟡 planned. This block is generated — edit `manuscript/config.yaml`, then regenerate with `uv run python -m infrastructure.publishing.status_report --project --write`._ - Canonical renderer: [docxology/template](https://github.com/docxology/template) with `--project templates/template_pitch_deck` - Tracked outputs: [`output/`](output/) in this project; public output files above 50 MB stay out of git. ## Overview - **Rendering primitives (generic, new to this repo):** `infrastructure/rendering/slide_deck.py` (ReportLab PDF) and `infrastructure/rendering/pptx_deck.py` (python-pptx, opt-in) — both consume the same `DeckContent` model and the same font-size constants (imported, not re-declared), so a PDF and a PPTX built from identical content carry identical slide counts, text, and type sizing. The PPTX renderer rewrites OOXML ZIP metadata to fixed timestamps after save, making identical decks byte-identical across runs. `infrastructure/rendering/mermaid_figure.py` renders standalone Mermaid diagrams to PNG for embedding. - **Theme:** black + white base plus three configurable highlight colors (`infrastructure.rendering.slide_deck.DeckTheme`), set under `manuscript/config.yaml`'s `project_config.deck.theme` block. Ships monochrome red by default; `config.yaml.example` demonstrates a distinct multi-accent palette. - **Slide variety:** six layout kinds — `title`, `section`, `content`, `stat` (large highlighted number + label), `quote` (pull-quote + attribution), `diagram` (full-bleed figure) — sized for real presentation use (36pt titles, 18pt body, 68pt stat callouts), not default-document body text. - **Six real visualizations, two chart families:** `scripts/15_generate_diagrams.py` renders three Mermaid flowcharts (two-layer architecture, the actual 10-stage core pipeline, a 9-node integrity-gate stack — every node names a real file/script in this repo); `scripts/16_generate_charts.py` renders three matplotlib charts via `src/chart_rendering.py` — a per-exemplar coverage bar chart, a test-count-vs-coverage scatter, and a donut chart of `infrastructure/`'s own subpackage sizes (`src/infra_facts.py`, live `git ls-files` counts). All six read real repo state; none are decorative-only shapes. - **Diligence deep-links, two layers deep, and gate-enforced:** any slide may carry a `source` citation (a repo-relative path); `manuscript/config.yaml`'s `project_config.deck.source_base_url` turns it into a real clickable hyperlink in both the PDF and the PPTX. `src/diligence_audit.py`'s citation-coverage check runs both as a standalone script (`scripts/30_audit_diligence.py`) AND inside `render_orchestration.py` itself — an uncited fact-bearing slide blocks that deck length's render, not just a separate skippable check. **Every slide also gets its own scannable QR code** (`src/standalone_slides.py`) pointing at that exact slide's own standalone, real, citable Markdown page under `output/slides_standalone/` — so a photo of a projected or printed slide traces back to its precise source, not just the deck as a whole (the QR resolves once `output/` is committed and pushed; it's a real generated file locally either way). - **A "Scientific integrity, by construction" content section** (medium/long decks): enumerates the project's own real integrity mechanisms — CI-enforced no-mocks policy, coverage floors, the reproducibility invariant, the gate stack, and the per-exemplar coverage chart — reviewed by both an Advisor second opinion and a Cato cross-vendor audit before shipping (see `ISA.md` Decisions for what each caught and how it was fixed). - **A "What's actually inside infrastructure/" content section** (medium/long decks): live subpackage/file counts (`src/infra_facts.py`, reusing the same introspection `docs/_generated/COUNTS.md` is built from) plus the subpackage-size donut chart — the shared infra layer is a real, inspectable inventory, not an asserted abstraction. - **An expanded "ask"** (all three lengths): adoption, funding conversations, and consulting availability, stated plainly with no fabricated numbers or committed terms. - **Token resolution + honesty:** `src/deck_tokens.py::build_deck_tokens` reads every fact live from the repository (test counts, coverage %, DOI, exemplar roster, infra subpackage/file counts — see `docs/_generated/COUNTS.md`, `infrastructure/project/public_scope.py`, and `src/infra_facts.py`); `src/token_resolution.py` raises if any `{{TOKEN}}` in the content source has no resolved value. - **Cliché lint:** `src/cliche_lint.py` runs a word-boundary-safe denylist of pitch-deck stock phrases over every resolved slide. ## Quick Start From the public template repo root: ```bash uv run python projects/templates/template_pitch_deck/scripts/10_audit_deck_content.py uv run python projects/templates/template_pitch_deck/scripts/15_generate_diagrams.py uv run python projects/templates/template_pitch_deck/scripts/16_generate_charts.py uv run python projects/templates/template_pitch_deck/scripts/20_render_decks.py uv run python projects/templates/template_pitch_deck/scripts/30_audit_diligence.py uv run pytest projects/templates/template_pitch_deck/tests/ \ --cov=projects/templates/template_pitch_deck/src --cov-fail-under=90 -v ./run.sh --project templates/template_pitch_deck --pipeline --core-only ``` PPTX rendering requires the opt-in dependency group: `uv sync --group rendering-pptx`. Without it, the render script still produces the three PDFs and logs a warning instead of failing. ## Directory Structure | Folder | Contents | |--------|----------| | `manuscript/` | `deck_content_{short,medium,long}.yaml` (the pitch content), `config.yaml` (+ `.example`), plus the standard "about this template" manuscript chapters | | `scripts/` | Thin orchestrators: `10_audit_deck_content.py`, `15_generate_diagrams.py`, `16_generate_charts.py`, `20_render_decks.py`, `30_audit_diligence.py` | | `src/` | Content loading, token resolution, cliché lint, diligence audit, repo-fact sourcing — no layout/drawing code | | `tests/` | Full suite, 90%+ coverage on `src/` | | `output/` | `pdf/`, `pptx/`, `figures/`, `slides_standalone/` — six deck artifacts, rendered diagrams, and one Markdown page per slide | ## Pipeline Outputs | Artifact | Path | |----------|------| | Short/medium/long PDF decks | `output/pdf/template_template_pitch_{short,medium,long}.pdf` | | Short/medium/long PPTX decks | `output/pptx/template_template_pitch_{short,medium,long}.pptx` | | Rendered diagrams | `output/figures/*.png` | | Per-slide standalone pages (QR deep-link targets) | `output/slides_standalone/template_template_{short,medium,long}/slide_NN.md` | ## Template integrity - Forward backlog: [`TODO.md`](TODO.md). - Copy-and-customize config: [`manuscript/config.yaml.example`](manuscript/config.yaml.example). - Project validation: `uv run pytest projects/templates/template_pitch_deck/tests/ --cov=projects/templates/template_pitch_deck/src --cov-fail-under=90`. - Repo drift validation: `uv run python scripts/audit/check_template_drift.py --strict`.