Pitch Deck Rebuild: Comprehensive Restart Prompt

Context

Solanasis is a cybersecurity verification firm targeting wealth management (RIAs, estate planning attorneys, family offices). This is a client-facing sales asset that will be 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 — not like a hastily-assembled startup pitch.

The current generator script (solanasis-scripts/generate-pitch-deck.py, 1,246 lines, python-pptx) produces a 10-slide 16:9 PPTX. The text content is correct (v4 + v5 refinements already merged). The visual output is unprofessional and has multiple layout failures that must be fixed.


Your Mission

Rewrite the layout and visual presentation of generate-pitch-deck.py so the output looks like a polished, enterprise-grade pitch deck for a professional services firm in wealth management. Do NOT rewrite the text content — fix how it’s rendered.

Then: generate, convert to PDF, visually verify every single slide with zoomed-in screenshots, deploy to the website, and push.


Step 1: Planning Phase (Do This FIRST)

Before writing any code:

  1. Read the current script (solanasis-scripts/generate-pitch-deck.py) end to end
  2. Generate the current output and convert to PDF:
    cd solanasis-scripts && python generate-pitch-deck.py
    "C:/Program Files/LibreOffice/program/soffice.exe" --headless --convert-to pdf ../Solanasis_Pitch_Deck.pptx --outdir ..
  3. Convert PDF pages to images for inspection:
    import fitz  # PyMuPDF (already installed)
    doc = fitz.open('Solanasis_Pitch_Deck.pdf')  # or current v3 name
    for i, page in enumerate(doc):
        pix = page.get_pixmap(dpi=200)
        pix.save(f'slide_{i+1}.png')
  4. Read each slide image with the Read tool (it’s multimodal) and catalog every visual issue
  5. Read the documentation listed below
  6. Create a detailed plan for fixing every issue before writing any code

Specific Visual Issues to Fix

CRITICAL: Text Overlapping on Nearly Every Slide

On slides 1, 2, 3, 4, and 6, the title text overlaps with the subtitle or body text directly below it. This appears to be a z-ordering + positioning problem where text boxes are stacked on top of each other with insufficient vertical spacing. When rendered by LibreOffice, the overlapping text creates an unreadable mess.

Root cause: Hardcoded Inches() Y-positions don’t account for how much vertical space the previous text element actually consumed. A 36pt Playfair Display title that wraps to 2 lines needs more space than a 1-line title, but the Y-position of the next element is fixed.

Fix requirements:

  • Every text element must have a clear vertical gap (minimum 0.2”) from the element above
  • No two text boxes may overlap in their Y-ranges
  • Calculate Y-positions sequentially — each element’s Y = previous element’s Y + previous element’s height + gap
  • For titles that might wrap, budget enough height (e.g., a 36pt title in a 10” wide box can fit ~30 chars/line; count the characters and calculate lines needed)

CRITICAL: Headshots Are Raw Rectangles (Slide 9)

The team headshots render as plain rectangular JPEGs. Every professional pitch deck uses circular headshot crops. This is the single most obviously amateur element.

Fix requirements:

  • Apply oval/ellipse clip mask to both headshot images
  • In python-pptx, this requires modifying the picture shape’s preset geometry XML from rect to ellipse
  • Ensure the crop renders correctly in both PowerPoint AND LibreOffice (test the PDF output, not just the PPTX)
  • Add a thin copper border around the circular headshot if possible (optional but professional)

Text Clipped / Cut Off at Boundaries

On slide 3, the title “Can You Prove Your Security Controls Work?” is cut off — the word “Work?” wraps to a second line that gets truncated. On slide 6, the title “Examination-Ready in 10 Business Days” similarly overflows.

Fix requirements:

  • Allocate enough height for title text boxes to accommodate wrapping
  • For 36pt Playfair Display in a 10-11” wide box, budget at least Inches(1.0) for titles that might wrap to 2 lines
  • Verify every title actually renders fully visible in the PDF

Cards Have Excessive Empty Space or Cramped Text

On slide 5, the three tall cards have wildly inconsistent content density — the RIA card is short, the Attorney card is dense, and the Family Offices card has text crammed into the top then a huge empty void below.

Fix requirements:

  • Use MSO_ANCHOR.TOP for card text (already done, but verify)
  • Size cards to the densest card’s content, not the lightest
  • Apply set_shrink_autofit() to every card as a safety net
  • Consider reducing card height where there’s obvious empty space

Amateur Decorative Elements

The horizontal rules inside Slide 4’s three-column cards are made of Unicode box-drawing characters (━━━━━━━━). This looks cheap and renders inconsistently across fonts.

Fix requirements:

  • Replace Unicode character rules with actual shape elements (thin add_shape_rect lines), or
  • Use a paragraph with a bottom border, or
  • Simply remove them if they don’t add value

Inconsistent Margins and Alignment

Elements across slides don’t align to a consistent grid. Some slides have content starting at different X positions. Cards on the same slide have different internal padding.

Fix requirements:

  • Define and enforce consistent margins: MARGIN_LEFT = Inches(0.8), MARGIN_TOP = Inches(0.6)
  • All body content should start at the same X position across slides
  • Card internal margins should be consistent: Inches(0.2) on all sides minimum
  • Bottom margin: nothing should extend below Inches(7.2) on a 7.5” slide

Font Rendering in LibreOffice

LibreOffice may not have Playfair Display, Montserrat, or Libre Baskerville installed. When these fonts are missing, it falls back to generic serif/sans-serif, which looks completely different from the intended brand.

Fix requirements:

  • Check if the brand fonts are installed on this machine: look for them in C:\Windows\Fonts\ or C:\Users\zasya\AppData\Local\Microsoft\Windows\Fonts\
  • If not installed, download and install them from Google Fonts before generating
  • Alternatively, consider embedding fonts in the PPTX (python-pptx doesn’t support this natively, but the PPTX can reference them)
  • At minimum, verify the PDF output uses the correct fonts, not fallbacks

Rounded Corners Too Heavy

The rounded rectangle borders (especially on slides 2 and 5) are thick and look like a children’s UI, not a professional financial services document.

Fix requirements:

  • Card borders should be subtle: Pt(1) or Pt(1.5) for most cards, Pt(2) maximum for the highlighted Solanasis card on Slide 4
  • The current Pt(2) and Pt(3) borders are too heavy
  • Reduce corner radius by adjusting the rounded rectangle’s adjustment value if possible

No Visual Hierarchy in Cards

All cards on a slide look identical in weight. There’s no differentiation between primary, secondary, or supporting content.

Fix requirements:

  • On Slide 4, the center Solanasis column should be visually distinct (already has navy fill — verify the contrast is strong)
  • On Slide 8, the three path cards should feel like a progression (subtle differences in treatment)
  • Consider subtle background shading differences or border weight variations

Overall Whitespace and Breathing Room

The deck feels cramped. Professional pitch decks from firms like Kroll and Visory have generous whitespace. Content doesn’t fill every inch of every slide.

Fix requirements:

  • Minimum 0.3” gap between major sections (title → subtitle, subtitle → content, content → footer)
  • Cards should have at least 0.15” internal padding on all sides
  • The closing lines at the bottom of slides should have clear space above them (accent rule + gap)
  • Don’t try to fill the full 7.5” height on every slide — leaving 1”+ of empty space at the bottom is fine and preferable to cramming

Documentation to Read

FilePurposePriority
solanasis-scripts/generate-pitch-deck.pyThe script to fixREAD FIRST
cowork-pitch-deck-prompt.mdBrand identity, voice rules, complete QA checklist, all 10 slides contentREAD — this is the authoritative reference
pitch-deck-content-v4-wealth-management.mdVoice-refined slide content (10 slides) with visual direction notesREAD
pitch-deck-competitive-analysis-and-v5.mdCompetitor analysis + v5 refinements (already merged into script)SKIM — context for why certain design choices matter
pitch-deck-voice-review.mdVoice critique that shaped v4REFERENCE
solanasis-site/content-style-guide.mdWebsite voice/style guide, terminologyREFERENCE

Obsolete files (do NOT use for content):

  • pitch-deck-content-draft.md (v1, generic SMB)
  • pitch-deck-content-v2.md (v2, generic SMB)
  • pitch-deck-content-v3-wealth-management.md (v3, 12-slide version, superseded by v4)

Text Content Already Correct (Do NOT Rewrite)

The script already has all the right words. These v5 refinements are merged:

  • Slide 1: Founder voice quote with semicolon, audience list with family offices
  • Slide 3: “Can You Prove Your Security Controls Work?” title
  • Slide 4: Subtitle about sitting between compliance consultant and IT provider
  • Slide 5: Family Offices as third card
  • Slide 6: “3-4 hours over 10 business days. Fixed scope. Fixed fee.”
  • Slide 7: “Every finding includes the specific regulatory reference…” closing
  • Slide 8: Services footnote (minimal)
  • Slide 9: Third-person bios
  • Slide 10: “prioritizing right now” CTA language, “10-Day Turnaround, Fixed Fee”

Focus entirely on layout, spacing, margins, element sizing, and visual polish.


Brand Constants (already in script)

Navy:        #020532   (dark backgrounds, headers)
Deep Navy:   #091652   (links, card fills)
Copper:      #C47A3D   (accents, CTAs, badges, headings on dark bg)
Copper Hover:#D4945E   (hover states)
Parchment:   #FEF9F1   (light slide backgrounds)
Warm Stone:  #F0EBE4   (alternating sections, muted cards)
Charcoal:    #111827   (body text on light bg)
White:       #FFFFFF   (card backgrounds)
Slate Blue:  #374273   (muted/footnote text)

Fonts:
  Headings:  Playfair Display (Google Fonts), bold
  Body:      Montserrat (Google Fonts), regular/semibold
  Accent:    Libre Baskerville (Google Fonts), italic

Slide: 13.333 x 7.5 inches (16:9)
Margins: 0.8" left/right, 0.6" top

Slide-by-Slide Spec (Layout Intent)

Slide 1: Cover (Navy→Deep Navy→Copper gradient)

  • Top: Logo (horizontal dark variant), top-left
  • Upper-middle: Copper accent rule (4pt, ~4” wide)
  • Middle: Title (40pt Playfair Display, white, bold) — must NOT overlap body text below
  • Below title: Body text (16pt, parchment) — “Your clients trust you…”
  • Below body: Founder quote (15pt Libre Baskerville italic, copper hover)
  • Below quote: Audience line (14pt, parchment)
  • Below audience: Key line (18pt, copper, bold) — “Examination-ready in 10 business days.”
  • Bottom: Contact info (11pt, slate blue)
  • Key spacing: Each element should be clearly separated; ~0.15-0.25” gaps between text blocks

Slide 2: The Problem (Parchment)

  • Title: 36pt, navy — “Probably Compliant” Doesn’t Survive an Examination
  • Subtitle: 14pt, charcoal — one-liner about security controls
  • 4 cards in a row: copper border (Pt(1.5)), white fill, ~2.75” wide, height sized to fit densest card
  • Below cards: Copper accent rule
  • Closing: Two paragraphs with “quiet drift” and “false comfort” highlighted in copper bold
  • Key spacing: Cards should start ~0.2” below subtitle; closing text ~0.2” below accent rule

Slide 3: The Urgency (Parchment)

  • Title: 36pt — must have enough height for 2 lines if it wraps
  • Two columns: Equal width, deep navy border (Pt(1.5)), sized to fit ALL content including bullets
  • Copper pill badge: “June 3, 2026” — positioned cleanly inside or on the left card, not overlapping the border
  • Closing: Italic line at bottom, centered
  • Key issue: The left column has header + subhead + intro + 3 long bullets — it needs at least 4.5” of card height

Slide 4: Who We Are (Parchment)

  • Title + subtitle: Must not overlap each other
  • 3 columns: Center column (Solanasis) visually highlighted with navy fill + copper border. Outer columns warm stone.
  • Inside columns: Replace Unicode horizontal rules with actual thin line shapes or remove them
  • Closing: Line at bottom about “verify that the security controls between them actually work”

Slide 5: Who We Serve (Parchment)

  • Title: One line
  • 3 tall cards: Equal height, sized to the densest card (Card 2: Attorneys has a long paragraph + 3 badges)
  • Body font: 11pt to help dense cards fit
  • Key issue: Cards should not have huge voids at the bottom — size to content + reasonable padding

Slide 6: The Assessment (Parchment)

  • Title: May wrap to 2 lines — budget height accordingly
  • Subtitle: Italic, 16pt — must be below title, not overlapping
  • Regulatory pills: Row of copper badges below subtitle
  • Two text columns: “What We Do” (checkmarks) and “What You Get” (bold labels)
  • Closing: Accent rule + italic line

Slide 7: Composite Findings (Parchment)

  • Title + italic subtitle
  • Two cards side by side: Before (warm stone, slate blue border) and After (white, copper border)
  • Closing: Accent rule + one-liner
  • Key: Balance content density between the two cards

Slide 8: Next Steps (Parchment)

  • Title + italic subtitle
  • 3 path cards with numbered copper circles above
  • Card body: 12pt, centered text
  • Services footnote: Small, centered, slate blue at bottom

Slide 9: The Team (Parchment) — MOST WORK NEEDED

  • Title
  • 2 team cards with:
    • CIRCULAR headshot (oval clip mask, ~1.4” diameter) with optional thin copper border
    • Name (14pt bold navy)
    • Title (11pt italic copper)
    • Bio paragraph (11pt charcoal)
  • “By the Numbers” section below cards:
    • Section title centered
    • 3 stat columns: large number (40pt Playfair Display copper) + description (11pt charcoal)
  • Key: Headshots must render as circles in both PPTX and PDF. Test the PDF output.

Slide 10: CTA (Navy background)

  • Title (38pt parchment) + accent rule
  • Left: “What Makes Us Different” header + 3 differentiator items (copper label + parchment description)
  • Right: CTA card (deep navy fill, copper border) with booking info + 3 feature checkmarks + URL
  • Bottom: Logo + contact line
  • Key: Logo and contact must not run off the bottom of the slide (keep above 7.2”)

Technical Guidance

Helper: Text Height Estimation

from math import ceil
 
def estimate_text_height(text, font_size_pt, box_width_inches, line_spacing=1.2):
    """Estimate the height needed for text in a box."""
    chars_per_line = (box_width_inches * 72) / (font_size_pt * 0.55)
    num_lines = ceil(len(text) / max(chars_per_line, 1))
    line_height_inches = (font_size_pt * line_spacing) / 72
    return num_lines * line_height_inches

Use this to calculate box heights and Y-positions dynamically instead of hardcoding.

Helper: Circular Headshot

def add_circular_picture(slide, image_path, left, top, size):
    """Add a picture cropped to a circle."""
    from lxml import etree
    pic = slide.shapes.add_picture(str(image_path), left, top, size, size)
    spPr = pic._element.spPr
    # Replace rectangle geometry with ellipse
    prstGeom = spPr.find(qn("a:prstGeom"))
    if prstGeom is not None:
        spPr.remove(prstGeom)
    new_prstGeom = etree.SubElement(spPr, qn("a:prstGeom"))
    new_prstGeom.set("prst", "ellipse")
    etree.SubElement(new_prstGeom, qn("a:avLst"))
    return pic

Test that this renders correctly in the PDF — if LibreOffice doesn’t honor ellipse geometry on pictures, you may need an alternative approach (e.g., create an oval shape and fill it with the image via blipFill XML).

Helper: Shrink-to-Fit Safety Net (already in script)

def set_shrink_autofit(shape_or_tf):
    """Enable shrink-text-on-overflow (preserves font ratios)."""
    # ... already implemented, apply to ALL text-heavy shapes

Output File Naming

Change OUTPUT_PPTX from Solanasis_Pitch_Deck_v3.pptx to Solanasis_Pitch_Deck.pptx. One canonical name, no version suffixes.

Font Installation Check

Before generating, verify brand fonts are available:

ls /c/Windows/Fonts/Playfair* /c/Windows/Fonts/Montserrat* /c/Windows/Fonts/LibreBaskerville* 2>/dev/null
ls "/c/Users/zasya/AppData/Local/Microsoft/Windows/Fonts/Playfair"* 2>/dev/null

If missing, download from Google Fonts and install before generating.


Visual QA Process (MANDATORY Before Deploy)

This is where the previous session failed. Do not skip or rush this.

  1. Generate PPTX + convert to PDF
  2. Convert all PDF pages to PNG using PyMuPDF (already installed):
    import fitz
    doc = fitz.open('Solanasis_Pitch_Deck.pdf')
    for i, page in enumerate(doc):
        pix = page.get_pixmap(dpi=200)
        pix.save(f'slide_{i+1}.png')
  3. Read each PNG with the Read tool (multimodal) — this gives you a high-res view of every slide
  4. For each slide, verify ALL of the following:
    • Title text is fully visible, not clipped or overflowing
    • No text overlapping other text anywhere
    • Cards contain all their text with visible padding on all sides
    • Consistent left margins across slides
    • Proper spacing between all adjacent elements (no elements touching or cramped)
    • Headshots are circular (slide 9) — not rectangular
    • Logo renders as an image (not a blank box)
    • Copper accent colors are visible on accent rules, pills, highlights
    • Fonts look correct (not system fallback fonts)
    • Bottom of slide has breathing room (content doesn’t extend to the very edge)
    • Overall impression: “Does this look like it came from a serious professional services firm?”
  5. If ANY issue is found: fix the script, regenerate, and re-inspect that slide
  6. Only proceed to deploy after all 10 slides pass

Deploy Steps

# Copy PDF to site
cp ../Solanasis_Pitch_Deck.pdf solanasis-site/public/downloads/solanasis-pitch-deck.pdf
 
# Build and test
cd solanasis-site && npx astro build
npx playwright test
 
# Commit script (solanasis-scripts repo)
cd ../solanasis-scripts && git add generate-pitch-deck.py
git commit -m "Rebuild pitch deck layout for professional visual quality"
 
# Commit PDF (solanasis-site repo)
cd ../solanasis-site && git add public/downloads/solanasis-pitch-deck.pdf
git commit -m "Update pitch deck PDF with rebuilt layout"
 
# Push both
cd ../solanasis-scripts && git push origin main
cd ../solanasis-site && git push origin main

Verify: go.solanasis.com/pitch-deck → 302 → solanasis.com/downloads/solanasis-pitch-deck.pdf


Voice Compliance Checklist

  • Zero em dashes (—) in any slide content (OK in Python docstrings/comments)
  • Zero banned words: genuinely, seamless, frictionless, SMBs, audit
  • Uses “examination” not “audit”
  • Signature terms present: “quiet drift”, “false comfort”
  • Date: June 3, 2026 (Regulation S-P)
  • Numbers: 23+, 52%, 95%+
  • URL: go.solanasis.com/intro
  • Three-party model: compliance consultant / Solanasis / IT provider
  • “We Coordinate With Everyone. We Replace No One.” exact phrasing

What Went Wrong in Previous Sessions (Lessons)

  1. Text overlap was the #1 issue and wasn’t caught. The builder hardcoded Y-positions without checking if the previous element’s text actually fit in its allocated space. Result: titles rendered on top of subtitles on 5+ slides. Fix: Calculate Y-positions sequentially based on estimated text height.

  2. Rectangular headshots look terrible. The builder dropped raw JPEGs onto the slide without any circular clipping. This is the most obviously amateur element. Fix: Apply ellipse preset geometry to picture shapes.

  3. Visual QA was a rubber stamp, not a real review. Screenshots were taken but issues like overlapping text were visible and not caught. The senior reviewer only grepped the Python source code for voice compliance — never actually looked at the rendered output. Fix: Read each slide as a PNG image with the multimodal Read tool and inspect every element.

  4. LibreOffice font rendering. If brand fonts aren’t installed, the fallback fonts look completely different. Fix: Verify font installation before generating.

  5. “Shrink to fit” is not a substitute for correct sizing. The set_shrink_autofit() XML attribute was applied everywhere as the primary fix, but it only works in PowerPoint — LibreOffice ignores it. Fix: Calculate correct sizes; use shrink-to-fit only as a safety net.

  6. Versioned output files create confusion. Multiple _v2, _v3 files accumulated. Fix: Single canonical filename, overwritten each time.

  7. Unicode box-drawing characters for decorative rules look cheap. The ━━━━ characters render differently depending on font and app. Fix: Use actual shape elements for decorative lines.

  8. Card borders too thick. Pt(2) and Pt(3) borders on rounded rectangles look heavy and informal. Fix: Use Pt(1) to Pt(1.5) for a subtle, professional look.


File Inventory

Files to modify:

  • solanasis-scripts/generate-pitch-deck.py — the generator script (the only file you edit)

Output files (generated, not manually edited):

  • Solanasis_Pitch_Deck.pptx — in project root (intermediate)
  • Solanasis_Pitch_Deck.pdf — in project root (intermediate)
  • solanasis-site/public/downloads/solanasis-pitch-deck.pdf — deployed copy

Image assets (used by the script, do not modify):

  • solanasis-site/public/images/logo/solanasis-logo-horizontal-dark.png
  • solanasis-site/public/images/team/dmitri-sunshine.jpg
  • solanasis-site/public/images/team/patrick-mcheyser.jpg

Documentation (read before starting):

  • solanasis-docs/sales/pitch-deck-rebuild-prompt.md — this file
  • cowork-pitch-deck-prompt.md — brand, voice rules, QA checklist
  • pitch-deck-content-v4-wealth-management.md — authoritative slide content
  • pitch-deck-competitive-analysis-and-v5.md — competitor context, v5 refinements

Obsolete (ignore):

  • pitch-deck-content-draft.md, pitch-deck-content-v2.md, pitch-deck-content-v3-wealth-management.md

Test baseline: 226/227 Playwright tests passing (1 pre-existing mobile-nav flake)