name: kortix-presentation description: Use when creating, editing, extracting, or validating Kortix/Suna .pptx slide decks, pitch decks, or presentations — produces on-brand decks (Kortix colors, Roobert type, symbol logo) and schema-validates them against OOXML before delivery.
Kortix Presentations
On-brand Kortix .pptx decks. This skill carries the full Anthropic pptx engine — pptxgenjs creation, OOXML unpack/edit/pack, LibreOffice rendering, and schema validation against the ECMA-376 / ISO-IEC 29500 XSDs — and applies the Kortix visual + verbal identity on top.
Before starting
Read the product marketing context first: if product-marketing.md exists, read it and reuse what it covers — only ask for what is task-specific or genuinely missing.
- Brand source (visual): Read
../brand-guidelines/SKILL.md— colors, Roobert typography, logo rules, shadows, spacing. It is the source of truth; if a request conflicts, say so and offer the closest on-brand option. - Messaging source (copy): Read
../internal-comms/SKILL.mdfor positioning, terminology, and the banned-phrases list before writing any on-slide text.
Choosing an approach
| Objective | Technique | Reference |
|---|---|---|
| Extract text/data | python -m markitdown deck.pptx (+ python scripts/thumbnail.py deck.pptx for a visual grid) |
— |
| Edit an existing deck / template | unpack → edit XML → validate → pack | editing.md |
| Create a deck from scratch | pptxgenjs (Node) | pptxgenjs.md |
Requirements: Node + pptxgenjs; Python 3 + lxml + defusedxml (the validator); LibreOffice (soffice) + Poppler (pdftoppm) for visual QA; markitdown for content QA. If lxml/defusedxml are missing in a managed environment, install them in a venv. The Kortix sandbox has these preinstalled.
Kortix brand rules (override generic slide defaults)
- Color: Kortix neutrals — light
FFFFFF/0A0A0A, dark0A0A0A/FAFAFA— plus exactly one accent per deck from the brand palette (blue2B91F7is the default; yellowCCA300, orangeD18B19, green8AD693, purpleAB80D6, redF14B4C). Never a rainbow. Accent at 10–15% visual weight. (Ignore generic "derive accent from content" advice — brand-guidelines is authoritative.) - Type: Roobert (headings + body), Roobert Mono for product nouns / paths / commands; fall back to Inter, then system sans. Weights Regular/Medium/Semibold only. Sizes per the brand-guidelines scale.
- Logo: composite the Kortix symbol top-left on 16:9 surfaces — never generate, redraw, or restyle it. Recolor to surface: near-black
0A0A0Aon light, whiteFAFAFAon dark. Never the white mark on a light background. One mark per surface. - Voice: direct, product-grounded (sessions, repos, sandboxes, skills, change requests). Banned: "unlock productivity", "seamless", "revolutionary", and generic AI claims with no mechanism (see internal-comms).
- Shadows / spacing: subtle shadows only (brand-guidelines scale, low opacity, small offset — no glow); 0.5" minimum slide margins, 0.3–0.5" between blocks.
Design (slides-specific)
- Structure: dark title + conclusion, light content in between ("sandwich") — or commit to dark throughout for a premium feel.
- One structural motif repeated on every slide: rounded card frames OR a consistent header bar OR background color blocks OR bold typographic weight. Pick one, carry it across.
- Layout variety for interest — two-column, labeled rows, 2×2 / 2×3 grids, half-bleed background + overlay, full-width stat callout. Don't repeat one layout; don't fall back to plain title + bullets.
- Data display: large stat callouts (60–72pt number + small label), comparison columns, timeline / process flows.
Never (AI-slide hallmarks)
- NEVER an accent line under a title. NEVER colored side borders on cards (
border-left: 3px solid …). NEVER gradient fills on shapes or text. NEVER center body text (titles only). NEVERbullet: trueon large/stat text or on every element. NEVER leave an orphan icon-backdrop shape (if the icon fails to render, remove its circle too). NEVER generic filler phrases.
Source citations
Every slide using web-sourced information needs a bottom-of-slide attribution with hyperlinked source names — addText with an array of segments, each source name carrying a hyperlink.url. Use "Source:" (singular). Never raw URLs in the text; never a plain unlinked list.
QA — required, do not skip (work from the skill directory)
Content QA:
python -m markitdown out.pptx— check for missing content, typos, order. For templates also runpython -m markitdown out.pptx | grep -iE "xxxx|lorem|ipsum|this.*(page|slide).*layout"and fix any hits.Repair + schema validation (the correctness gate):
python scripts/repair.py /abs/out.pptx # fixes pptxgenjs OOXML defects + element order ( cd scripts/office && python validate.py /abs/out.pptx ) # run from office/ so its `validators` import resolves; pass an ABSOLUTE pathFix every reported XSD error and re-run until it prints
All validations PASSED!. (Raw pptxgenjs output is not schema-valid untilrepair.pyruns — it emitsnotesMasterIdLstout of order.)Visual QA:
python scripts/office/soffice.py --headless --convert-to pdf --outdir . out.pptx→pdftoppm -jpeg -r 150 out.pdf slide→ls slide-*.jpg. Inspect every slide (fresh eyes / subagent) for stray dots, overlaps, text overflow/cutoff, footer collisions, gaps < 0.3", margins < 0.5", misaligned columns, low contrast, and leftover placeholders. Re-render fixed slides withpdftoppm -f N -l N.Fix-and-verify cycle: fix issues, then re-run step 2 (validate) and step 3 (render). At least one cycle before delivery — fixes create new problems.
Math
Render equations with Unicode math symbols only — not OMML or equation images (LibreOffice can't display either during visual QA).