Pitch Deck Design Specification
Status: Definitive reference (supersedes all previous pitch deck prompts)
Last updated: 2026-03-20
Script: solanasis-scripts/generate-pitch-deck.py (~1,540 lines, python-pptx)
Output: Solanasis_Pitch_Deck.pptx → PDF at solanasis-site/public/downloads/solanasis-pitch-deck.pdf
Short URL: go.solanasis.com/pitch-deck
Previous Prompts (Historical Only)
These documents are superseded by this spec. Keep them for lessons-learned context:
pitch-deck-rebuild-prompt.md(v1: original 11-slide rebuild)pitch-deck-styling-overhaul-prompt.md(v2: spacing + footer fixes)pitch-deck-complete-overhaul-prompt.md(v3: styling + content polish)
1. Design Philosophy
This deck is handed to managing partners and compliance officers at firms managing generational wealth. It must look like it came from a firm that belongs in the same conversation as Kroll, Visory, and Agio.
Guiding principles:
- Professional services aesthetic, not tech startup energy
- Every word earns its place; no filler, no jargon-for-jargon’s-sake
- Confident but not arrogant; authoritative but not salesy
- Specific over vague (“14 findings mapped to SEC examination priorities” > “comprehensive analysis”)
- Short, punchy sentences
2. Brand Palette
Colors
| Name | Hex | Usage |
|---|---|---|
| Navy | #020532 | Primary dark, slide titles, card headings |
| Deep Navy | #091652 | Gradient stop, CTA card fill, subtle accents |
| Copper | #C47A3D | Primary accent, accent rules, pills, key text, CTA links |
| Copper Hover | #D4945E | Founder quote text |
| Parchment | #FEF9F1 | Light slide backgrounds |
| Warm Stone | #F0EBE4 | Muted card fills (outer columns slide 4, “Before” card slide 7) |
| Charcoal | #111827 | Body text on light slides |
| White | #FFFFFF | Text on dark slides, card fills |
| Slate Blue | #374273 | Disclaimers, “Before” card accents |
Fonts
| Font | Role | Source |
|---|---|---|
| Playfair Display | Slide titles (display headings) | Google Fonts |
| Montserrat | Body text, card headings, all UI text | Google Fonts |
| Libre Baskerville | Accent text (quotes, subtitles, closing italics) | Google Fonts |
Slide Dimensions
- 16:9 widescreen: 13.333” x 7.5”
- Margins: 0.8” left/right, 0.6” top
3. Spacing Constants
These values are defined as Python constants in the script and must be consistent across ALL slides.
| Constant | Value | Purpose |
|---|---|---|
TITLE_MARGIN_TOP | Inches(0.6) | Top of slide to top of title |
TITLE_TO_SUBTITLE | Inches(0.15) | Title bottom to subtitle top |
SUBTITLE_TO_CONTENT | Inches(0.25) | Subtitle bottom to first content |
CARD_INTERNAL_PAD_TOP | Inches(0.15) | Inside card: top edge to text |
CARD_INTERNAL_PAD_LR | Inches(0.2) | Inside card: left/right padding |
CARD_INTERNAL_PAD_BOT | Inches(0.12) | Inside card: bottom edge to text |
CARD_HEADING_SPACE_AFTER | Pt(8) | Heading-to-body gap (single-frame) |
CARD_HEADING_SPACE_AFTER_INCHES | Inches(0.08) | Heading-to-body gap (two-frame) |
CARD_BODY_LINE_SPACING | 1.5 | Card body line spacing |
TITLE_LINE_SPACING | 1.15 | Slide title / card heading line spacing |
BODY_LINE_SPACING | 1.5 | General body text line spacing |
ACCENT_RULE_TO_TEXT | Inches(0.15) | Accent rule to text below it |
CONTENT_TO_FOOTER | Inches(0.3) | Last content to footer |
Line Spacing Rules
| Element | Value |
|---|---|
| Slide titles (Playfair 36pt) | 1.15 |
| Card headings (14-16pt bold Montserrat) | 1.15 |
| Card body text (11-13pt) | 1.5 |
| Bullet lists | 1.4 |
| Footer/footnote text | 1.2 |
| Italic subtitles (Libre Baskerville) | 1.4 |
| CTA card text | 1.5 |
Never use 1.8. That is document-grade spacing, not presentation-grade.
4. Card System Architecture
The Problem: Heading Alignment
When cards sit side-by-side and headings wrap to different line counts, body text starts at inconsistent Y positions. A single text frame with both heading and body means body text is pushed down by longer headings.
The Solution: Two-Frame Cards
Every card uses two separate text frames overlaid on a rounded-rect background:
- Heading frame - Fixed height (
heading_zone_height), sized to fit the tallest heading on that slide. All cards on the same slide use the same zone height. - Body frame - Starts at a fixed Y offset:
card_top + PAD_TOP + heading_zone_height + 0.08"
This ensures body text always starts at the same Y position regardless of heading length.
heading_zone_height Per Slide
| Slide | Cards | Tallest Heading | Zone Height |
|---|---|---|---|
| 2 (Problem) | 4 gap cards | ”Untested Incident Plan” (2 lines) | Inches(0.55) |
| 4 (Who We Are) | 3 columns | ”Your Compliance Consultant” (2 lines) | Inches(0.65) |
| 5 (Who We Serve) | 3 tall cards | ”RIAs and Financial Advisors” (2 lines) | Inches(0.65) |
| 7 (Composite) | 2 Before/After | Both 1 line | Inches(0.4) |
| 8 (Next Steps) | 3 path cards | All 1 line | Inches(0.4) |
| 9 (Services) | 6 service cards | ”Disaster Recovery Verification” (2 lines) | Inches(0.55) |
Implementation
_create_two_frame_card()- Creates background + heading frame + body frame, returns all threeadd_card()- Convenience wrapper for simple title+body cards (uses_create_two_frame_cardinternally)- For complex cards (badges, bullets, styled runs): call
_create_two_frame_card()directly and populate the body frame manually
Corner Radius
CORNER_RADIUS = 5000 (subtle professional). Default python-pptx is 16667, which is too round.
5. Hyperlink Color Fix (LibreOffice)
The Problem
LibreOffice Impress ignores run.font.color.rgb on hyperlink runs and applies its
own theme-based hyperlink color (default blue). This makes footer links invisible on
navy backgrounds. Setting solidFill on a:rPr does not override this behavior.
The Solution (Three-Part)
-
Theme override: After building all slides, modify the presentation theme’s
a:hlinkanda:folHlinkcolor scheme entries to WHITE. This makes LibreOffice render all hyperlinked text in white._set_theme_hyperlink_colors(prs, WHITE) -
Belt-and-suspenders solidFill: The
add_hyperlink_run()helper also inserts asolidFillelement ona:rPrBEFOREhlinkClick(OOXML schema ordering matters). This helps in PowerPoint even if the theme fix doesn’t apply. -
Shape-level click for non-white links: The CTA link (“go.solanasis.com/intro”) needs to be COPPER, not white. Solution: don’t use
hlinkClickon the text run at all. Instead, style the text as copper viaadd_run(), and make the entire CTA card clickable viacta_card.click_action.hyperlink.address.
What Does NOT Work
- Setting
run.font.color.rgbalone (LibreOffice ignores it on hyperlinks) - Adding
solidFilltoa:rPrwithout the theme change (LibreOffice still uses theme blue) solidFillafterhlinkClickin the XML tree (violates OOXML element ordering)
6. Accent Rules
All horizontal accent lines use add_accent_rule():
| Location | Width | Height | Color |
|---|---|---|---|
| Cover slide (below logo) | Inches(4) | Pt(3) | Copper |
| Before closing lines (slides 2, 6, 7, 9) | Inches(3) | Pt(3) | Copper |
| CTA slide (below title) | Inches(3) | Pt(3) | Copper |
All accent rules are Pt(3). Previous versions incorrectly used Pt(4) on slides 1 and 11.
7. Slide-by-Slide Content Spec
Slide 1: Cover (Navy Gradient)
- Background: Navy → Deep Navy → Copper gradient (135 degrees)
- Logo: top-left,
solanasis-logo-horizontal-dark.png, 2.8” wide - Copper accent rule below logo
- Title: “Cybersecurity and Operational Resilience for Wealth Management” (36pt Playfair, white, bold). No company name prefix; logo provides branding.
- Body: “Your clients trust you with generational wealth. We make sure your systems deserve that trust.” (16pt Montserrat, parchment)
- Founder quote: “After 23 years building and securing business systems, the pattern is always the same; the controls are there, they just haven’t been tested.” (15pt Libre Baskerville italic, copper hover)
- Audience line: RIAs, estate planning firms, family offices (14pt, parchment)
- Key line: “Examination-ready in 10 business days.” (18pt, copper, bold)
- Footer: solanasis.com | hi@solanasis.com | Boulder, CO (12pt, ALL WHITE, clickable hyperlinks)
Slide 2: The Problem (Parchment)
- Title: ‘“Probably Compliant” Doesn’t Survive an Examination’
- Subtitle: controls exist but haven’t been tested
- 4 gap cards: Backups Untested, Stale WISP, Vendor Blind Spots, Untested Incident Plan
- Closing with “quiet drift” and “false comfort” as copper bold signature terms
- Accent rule before closing
Slide 3: The Urgency (Parchment)
- Title: “Can You Prove Your Security Controls Work?”
- Two-column regulatory cards (deep navy border):
- Left: RIAs / SEC Regulation S-P / June 3, 2026 copper pill badge / bullet requirements
- Right: Estate Planning Attorneys / ABA Rules 1.1 & 1.6
- Closing italic question centered
Slide 4: Who We Are (Parchment)
- Title: “We Coordinate With Everyone. We Replace No One.” (exact phrasing, non-negotiable)
- Subtitle: three-party positioning (compliance consultant / Solanasis / IT provider)
- 3 columns: outer (warm stone), center (navy fill, copper border, Pt(2))
- Column 1: “Your Compliance Consultant” / Regulatory strategy, exam prep, Form ADV
- Column 2: “Solanasis” / Cybersecurity verification, disaster recovery testing, vendor risk assessment
- Column 3: “Your IT Provider” (no ”/ MSP”; attorneys may not know that term)
- Centered text in columns (appropriate for short content)
Slide 5: Who We Serve (Parchment)
- Title: “Built for Wealth Management”
- 3 tall cards with framework badges:
- RIAs: SEC Exam Priorities, Regulation S-P, Colorado DORA, NIST CSF
- Estate Planning Attorneys: ABA Rules, State Bar Guidance, NIST CSF
- Family Offices: no badges (shorter body text)
Slide 6: The Assessment (Parchment)
- Title: “Examination-Ready in 10 Business Days”
- Italic subtitle: “Your team’s involvement: 3-4 hours over 10 business days. Fixed scope. Fixed fee.”
- Copper pill badge bar: SEC, Reg S-P, ABA 1.1 & 1.6, DORA, NIST CSF
- Two columns: “What We Do” (checkmark items) + “What You Get” (bold label + description)
- Accent rule + closing italic
Slide 7: Composite Findings (Parchment)
- Title: “What We Typically Find”
- Italic disclaimer: “Composite example based on real engagement patterns.”
- Before card (warm stone, slate blue accents): 4 bullet items with emphasized tails
- After card (white, copper accents): 4 bold-label findings
- Accent rule + closing line
Slide 8: Next Steps (Parchment)
- Title: “After the Assessment, You Decide”
- Italic subtitle: “Three paths forward. No lock-in.”
- 3 path cards with numbered copper circles:
- “You Run the Plan” - structured handoff
- “Remediation Sprint” - 2-4 weeks hands-on
- “Fractional CISO” - monthly cadence, month-to-month (NOT “CSRO”; CISO is recognized in financial services)
- No footnote (previous meta-commentary about “see next slide” was removed; the next slide speaks for itself)
Slide 9: Services Grid (Parchment)
- Title: “Beyond the Assessment”
- Italic subtitle: “Targeted capabilities for firms that need more than a roadmap.”
- 3x2 grid: card_height 2.2”, title Pt(14), body Pt(12)
- Services: Security Assessments, Disaster Recovery Verification, Secure Data Migrations, CRM Setup & Optimization, Secure Systems Integration, Responsible AI Implementation
- Body text as line-separated items (not bullet points)
- Accent rule + closing italic
Slide 10: Team (Parchment)
- Title: “The Team Behind the Assessment”
- Subtitle: “23+ years of combined experience…”
- 2 team cards with circular headshots (ellipse geometry, copper border 1.5pt)
- Bios in third-person executive summary voice, not resume bullets
- Photo size: 1.6” diameter
Slide 11: CTA (Navy solid)
- Title: “Let’s See Where You Stand” (38pt, parchment) + copper accent rule
- Left: “What Makes Us Different” + 3 differentiator items (copper bold label + parchment description)
- Right: CTA card (deep navy fill, copper border Pt(2)):
- “Book a 30-Minute Intro Call”
- Description of what happens on the call
- 3 features: Fixed Scope, Fixed Fee, 10 Business Days
- “go.solanasis.com/intro” in COPPER (not a run-level hyperlink; the card shape is clickable)
- Footer: solanasis.com | hi@solanasis.com | 303-900-8969 | Boulder, CO (12pt, ALL WHITE)
- Logo bottom-left
8. Voice Rules (Non-Negotiable)
These rules apply to ALL text in the deck:
- Zero em dashes (use semicolons, periods, or commas instead)
- Zero banned words: genuinely, seamless, frictionless, SMBs, audit
- “examination” not “audit” everywhere
- Signature terms must appear: “quiet drift”, “false comfort” (slide 2)
- No jargon the audience won’t know. RIA managing partners know “CISO”; they don’t know “CSRO” or “MSP”
- Consistent punctuation: periods at end of card body text
Cross-reference: solanasis-site/content-style-guide.md for full voice rules.
9. Assets and File Paths
| Asset | Path |
|---|---|
| Generator script | solanasis-scripts/generate-pitch-deck.py |
| PPTX output | Solanasis_Pitch_Deck.pptx (project root) |
| PDF deploy target | solanasis-site/public/downloads/solanasis-pitch-deck.pdf |
| Logo (dark bg) | solanasis-site/public/images/logo/solanasis-logo-horizontal-dark.png |
| Headshot: Dmitri | solanasis-site/public/images/team/dmitri-sunshine.jpg |
| Headshot: Patrick | solanasis-site/public/images/team/patrick-mcheyser.jpg |
| Short URL | go.solanasis.com/pitch-deck |
| Rebuild prompt | solanasis-docs/sales/pitch-deck-rebuild-prompt.md |
| Design spec | solanasis-docs/sales/pitch-deck-design-spec.md (this file) |
10. Generation, QA, and Deploy Process
Generate
cd solanasis-scripts && python generate-pitch-deck.pyConvert to PDF (LibreOffice headless)
"C:/Program Files/LibreOffice/program/soffice.exe" --headless --convert-to pdf \
../Solanasis_Pitch_Deck.pptx --outdir ..Render to PNG (300 DPI, for visual QA)
import fitz
doc = fitz.open('../Solanasis_Pitch_Deck.pdf')
for i, page in enumerate(doc):
pix = page.get_pixmap(dpi=300)
pix.save(f'../../_screenshots/2026-03-20/pitch-deck-slide-{i+1:02d}.png')Screenshots go to _screenshots/{YYYY-MM-DD}/ per project rules.
Visual QA Checklist (EVERY Slide)
Text Visibility:
- All text fully visible (no clipping, overflow, truncation)
- No text overlaps other text
- Hyperlink text is correct color (not LibreOffice default blue)
- Footer text legible on dark backgrounds
- No text smaller than 11pt
Card Alignment:
- Card body text on same slide starts at consistent Y position
- No text jammed against card borders (minimum 0.15” padding)
Line Spacing:
- Title text tightly spaced (1.15, not loose)
- Card body readable but compact (1.5, not 1.8-level loose)
- Bullet lists slightly tighter (1.4) than body paragraphs
Overall:
- Looks like it came from a professional services firm, not a startup
- Every slide matches Kroll/Agio quality standard
Voice QA
- Zero em dashes
- Zero banned words (genuinely, seamless, frictionless, SMBs, audit)
- “examination” not “audit”
- Signature terms present (quiet drift, false comfort)
- Date: June 3, 2026 (Regulation S-P)
- URL: go.solanasis.com/intro
- “We Coordinate With Everyone. We Replace No One.” exact phrasing
Deploy
# Copy PDF
cp ../Solanasis_Pitch_Deck.pdf ../solanasis-site/public/downloads/solanasis-pitch-deck.pdf
# Commit script
cd solanasis-scripts && git add generate-pitch-deck.py
git commit -m "fix: pitch deck — [description of changes]"
# Commit PDF
cd ../solanasis-site && git add public/downloads/solanasis-pitch-deck.pdf
git commit -m "chore: update pitch deck PDF"
# Push both
cd ../solanasis-scripts && git push origin main
cd ../solanasis-site && git push origin mainVerify: curl -sI https://go.solanasis.com/pitch-deck should return 302 to the PDF.
11. What NOT to Change
- Color palette - keep all brand colors exactly as defined
- Font families - keep Playfair Display, Montserrat, Libre Baskerville
- Slide count - keep 11 slides
- Slide order - keep current order
- Image assets - do not modify logos or headshots
- Copper pills/badges - keep design and content
- Circular headshots - keep ellipse geometry (it works)
- Three-party model - compliance consultant / Solanasis / IT provider
- “Examination” language - never say “audit”
12. Lessons Learned (Why These Decisions Exist)
-
LibreOffice hyperlink override is theme-level, not run-level. Setting
run.font.color.rgband evensolidFillona:rPrdoes nothing for hyperlinks in LibreOffice. You must modify the theme’sa:hlinkcolor scheme entry. For links that need a different color than the theme, use shape-levelclick_actioninstead of run-levelhlinkClick. -
Card heading alignment requires separate text frames.
MSO_ANCHOR.TOPanchors the frame, not individual paragraphs. When heading and body share a frame, body position depends on heading wrap length. The only reliable fix is two separate text frames with body starting at a fixed Y offset. -
1.8x line spacing is document-grade, not presentation-grade. 1.5x for body, 1.15x for titles, 1.4x for bullets. Question defaults early.
-
set_shrink_autofit()only works in PowerPoint. LibreOffice (which generates our PDF) ignores it. Size everything correctly. Keep it as a PowerPoint safety net. -
Render at 300 DPI and zoom into every region. Thumbnail-level QA misses that “solanasis.com” is blue while ”|” next to it is white. Compare adjacent text elements.
-
“CSRO” is not a recognized title. The wealth management audience knows “CISO” but not “CSRO” (Chief Security and Resilience Officer). Use standard industry titles.
-
“MSP” is jargon for attorneys. Estate planning attorneys may not know what a Managed Service Provider is. “Your IT Provider” is universally understood.
-
Meta-commentary about the deck itself is unprofessional. “See next slide for…” is filler. The next slide speaks for itself.
-
Cover title doesn’t need the company name. When the logo is right above the title, repeating “Solanasis:” is redundant. Let the title do its job.