{"slug": "build-good-decks-using-your-ai", "title": "Build good decks using your AI", "summary": "Deckloom, an open-source tool by developer Kritik Modi, generates pitch decks, investor overviews, and other slide decks from a single JSON content file and an HTML design template, rendering to PDF via headless Chrome and optionally exporting to .pptx. The tool, available on GitHub, supports AI agents like Codex, Cursor, Copilot, Gemini CLI, Aider, Windsurf, and Zed through an AGENTS.md file, and includes a brand detection script that extracts colors from a codebase while rejecting incoherent palette matches.", "body_md": "Build product decks from code instead of a slide editor. Content is JSON, the\ndesign is one HTML file, and headless Chrome renders it to a PDF at exactly\nPowerPoint's 16:9 page size. Export to `.pptx`\n\nif someone needs one.\n\nPitch decks, investor overviews, one-pagers, sales decks, technical overviews, brochures, conference talks. One content file, many decks.\n\n```\ncontent.json ──► deck.html ──► headless Chrome ──► deck.pdf ──► deck.pptx\n     (words)      (design)        (layout)          (share)      (optional)\n```\n\nNobody makes a deck once. The same twelve facts get recut as an investor overview, a sales deck, a one-pager and a technical brief. A month later the four versions disagree about the numbers, and nobody knows which is current.\n\nThat is a version control problem wearing a design costume. So keep the content in one file, keep the design in another, and render whichever deck you need. A number changes in one place. A rebrand is a few CSS variables. A wording change shows up in a diff.\n\n**Content and design never live in the same file.**\n\n`content.json`\n\nhas the words. `deck.html`\n\nhas the slide types and the brand.\nNeither knows about the other until build time. That is what makes recuts,\nrebrands and reviews cheap.\n\n```\ngit clone https://github.com/kritikmodi/deckloom.git\ncd deckloom\npip install -r requirements.txt && playwright install chromium\n```\n\n**Any agent.** `AGENTS.md`\n\nat the repo root is read natively by Codex, Cursor,\nCopilot, Gemini CLI, Aider, Windsurf, Zed and others.\n\n**Claude Code / claude.ai.** Install as a skill so it loads on demand:\n\n```\ncp -r deckloom ~/.claude/skills/deckloom\n```\n\n**No agent at all.** Plain Python and a headless browser. No vendor SDK, no model\nAPI, nothing to sign up for.\n\n```\ncp templates/deck.html templates/content.example.json .\nmv content.example.json content.json\n\npython3 scripts/build.py                   # -> out/deck.pdf\npython3 scripts/build.py --png             # also one PNG per slide\npython3 scripts/export_pptx.py             # -> out/deck.pptx\n```\n\nThe bundled example renders seven slides covering every slide type, so a clean clone produces a real deck before you have written anything.\n\nWhile writing, open `deck.html`\n\nin a browser and reload. It scrolls as a stack of\nslides on screen and paginates correctly when printed.\n\nName the slides, then list which ones each audience gets:\n\n```\n\"cuts\": {\n  \"investor\": [\"hero\", \"problem\", \"how\", \"traction\", \"close\"],\n  \"onepager\": [\"hero\", \"capabilities\", \"close\"]\n}\npython3 scripts/build.py --cut investor --out out/investor.pdf\npython3 scripts/build.py --cut onepager --out out/onepager.pdf\n```\n\nEvery cut reads from the same slides, so they cannot drift apart.\n\nPoint it at the product's codebase and it works out the palette:\n\n```\npython3 scripts/detect_brand.py ../my-product --write content.json\ntheme\n    accent   #005F96   <- most saturated colour (name match was grey)\n    bg       #0F1117   <- bg (css-var)\n    surface  #1E2026   <- derived from bg (detected value was a different theme)\n    ink      #E6E8EF   <- text (css-var)\n    alert    #FF5A5B   <- danger (css-var)\n\n  rejected (kept the deck coherent)\n    surface #FFFFFF rejected: luma 1.00 vs bg 0.07, not the same theme\n    accent #A8B4C2 rejected: saturation 0.13 is too low to read as an accent\n\n  fonts     Inter\n  icons     lucide-react\n  logos     gui/public/icon/logo-wordmark-dark.svg\n```\n\nIt reads design token files, tailwind configs, CSS custom properties, SCSS and\nLess variables, JS/TS theme objects and the web manifest. Build output is\nskipped, because a `dist/`\n\nfolder is full of vendored component-library CSS that\nis not the brand.\n\nCrucially it checks the palette holds together rather than trusting name matches\nalone. A repo that defines `--surface`\n\nfor its light theme and `--bg`\n\nfor its\ndark one would otherwise produce a white card on a black slide. Rejections are\nprinted, never applied silently.\n\n| Type | For | Notes |\n|---|---|---|\n`title` |\nthe opening claim | eyebrow, two-line headline, proof chips |\n`stats` |\nthe problem, in numbers | three cards, alert-coloured figures |\n`flow` |\nhow it works | left-to-right steps, optional stat panels |\n`features` |\ncapability grid | up to six, two columns |\n`table` |\ncomparison | `+` accent cell, `-` alert cell |\n`quote` |\na customer sentence | the only slide where someone else talks |\n`closing` |\nthe ask | make it specific |\n\nWrap a phrase in `~tildes~`\n\nto colour it with the accent, so copy stays free of\nmarkup. Adding a type is one function in `deck.html`\n\n; page sizing, footers,\nnumbering and print rules are handled for you.\n\n| Path | |\n|---|---|\n`SKILL.md` |\nthe brief: pipeline, slide types, rules for good decks |\n`scripts/build.py` |\ncontent + design to PDF, with cuts and PNG export |\n`scripts/export_pptx.py` |\nPDF to PowerPoint, one image per slide |\n`scripts/detect_brand.py` |\nread colours, fonts, icons and logos out of a codebase |\n`templates/deck.html` |\nthe slide system and design tokens |\n`templates/content.example.json` |\na worked example of every slide type |\n`references/DESIGN.md` |\ntokens, type scale, how to rebrand |\n`references/SLIDE-TYPES.md` |\nwhat each type is for and how it fails |\n`references/PITFALLS.md` |\nread before debugging |\n\nThe PPTX contains one full-bleed image per slide. It presents correctly anywhere\nand survives being emailed, but the text is not editable in PowerPoint. That is\nthe trade: wording changes belong in `content.json`\n\n, not in a copy of the file\nsomeone has on their laptop. If a colleague genuinely needs native editable\nshapes, this is the wrong tool.\n\nDark decks look excellent on screen shares and projectors, and poor when printed\nor presented in a bright room. `references/DESIGN.md`\n\ncovers inverting the\ntokens.\n\nThis is for decks that are mostly type, numbers and diagrams, which is most product decks. It is not an illustration tool.\n\nThe same idea applied to video: [product-video-as-code](https://github.com/kritikmodi/product-video-as-code).\n\nMIT (c) 2026 Kritik Modi - see [LICENSE](/kritikmodi/deckloom/blob/main/LICENSE).", "url": "https://wpnews.pro/news/build-good-decks-using-your-ai", "canonical_source": "https://github.com/kritikmodi/deckloom", "published_at": "2026-08-31 12:00:55+00:00", "updated_at": "2026-08-31 12:23:46.873982+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools"], "entities": ["Deckloom", "Kritik Modi", "GitHub", "Codex", "Cursor", "Copilot", "Gemini CLI", "Aider"], "alternates": {"html": "https://wpnews.pro/news/build-good-decks-using-your-ai", "markdown": "https://wpnews.pro/news/build-good-decks-using-your-ai.md", "text": "https://wpnews.pro/news/build-good-decks-using-your-ai.txt", "jsonld": "https://wpnews.pro/news/build-good-decks-using-your-ai.jsonld"}}