Workflow

1. Clarify Requirements

2. Research & Planning

Data Sources:

Required Metrics:

Normalization:

Before Building:

3. Slide-by-Slide Creation

CRITICAL: You MUST create ONE slide at a time and get user approval before proceeding to the next slide.

For EACH slide:

  1. Create ONLY this one slide with PptxGenJS
  2. MANDATORY: Convert to image for review - You MUST convert slides to images so you can visually verify them:
    soffice --headless --convert-to pdf presentation.pptx
    pdftoppm -jpeg -r 150 -f 1 -l 1 presentation.pdf slide
  3. MANDATORY VISUAL REVIEW: You MUST carefully examine the rendered slide image before proceeding:
  4. If ANY overlap or cutoff is detected: Fix immediately using these strategies in order:
  5. Show slide image to user with download link
  6. STOP and wait for explicit user approval before creating the next slide. Do NOT proceed until user confirms.

YOU MUST CHECK FOR THESE SPECIFIC ISSUES ON EVERY PAGE:


Slide Format Requirements

Information Density is Critical

The #1 goal is MAXIMUM information density. A busy executive should understand the entire company story in 30 seconds. Fill every quadrant to capacity.

Per quadrant targets:

Information packing techniques:

If a quadrant looks sparse, add more:

Line spacing - use single textbox per section:

def add_section(slide, x, y, w, header_text, bullets, header_size=10, bullet_size=8):
    """Header + bullets in single textbox with natural spacing"""
    tb = slide.shapes.add_textbox(x, y, w, Inches(len(bullets) * 0.18 + 0.3))
    tf = tb.text_frame
    tf.word_wrap = True

    # Header paragraph
    p = tf.paragraphs[0]
    p.text = header_text
    p.font.bold = True
    p.font.size = Pt(header_size)
    p.font.color.rgb = RGBColor(0, 51, 102)
    p.space_after = Pt(6)  # Small gap after header

    # Bullet paragraphs
    for bullet in bullets:
        p = tf.add_paragraph()
        p.text = bullet
        p.font.size = Pt(bullet_size)
        p.space_after = Pt(3)
    return tb

Key spacing principles:


Visual Reference

See examples/Nike_Strip_Profile_Example.pptx for layout inspiration. Adapt colors to each company's brand.


First Page Layout

Must pass "30-second comprehension test" for a busy executive.

Slide Setup (CRITICAL)

Use 4:3 aspect ratio (standard IB pitch book format):

const pptx = new pptxgen();
pptx.layout = 'LAYOUT_4x3';  // 10" wide × 7.5" tall - MUST USE THIS

Slide Coordinate System

PptxGenJS uses inches. 4:3 slide = 10" wide × 7.5" tall.

First Page Positioning (in inches)

┌─────────────────────────────────────────────────────────────────┐
│ y=0.2  Title: Company Name (Ticker)                             │
├────────────────────────────┬────────────────────────────────────┤
│ y=0.6  Company Overview    │ y=0.6  Business & Positioning      │
│ x=0.3, w=4.7               │ x=5.0, w=4.7                       │
│ h=3.0                      │ h=3.0                              │
├────────────────────────────┼────────────────────────────────────┤
│ y=3.7  Key Financials      │ y=3.7  Stock/Recent Developments   │
│ x=0.3, w=4.7               │ x=5.0, w=4.7                       │
│ h=3.5                      │ h=3.5                              │
└────────────────────────────┴────────────────────────────────────┘
                                                            y=7.5

Title Section (y=0.2)

Company Name (Ticker) - Example: Tesla, Inc. (TSLA)

slide.addText('Tesla, Inc. (TSLA)', { x: 0.3, y: 0.2, w: 9.4, h: 0.35, fontSize: 18, bold: true });

4-Quadrant Layout (y=0.6 to y=7.2)

Quadrant Position Content
1 x=0.3, y=0.6, w=4.7, h=3.0 Company Overview: HQ, founded, key stats, business summary (4-5 bullets)
2 x=5.0, y=0.6, w=4.7, h=3.0 Business & Positioning: revenue drivers, products/services, competitive position, growth drivers (4-5 bullets)
3 x=0.3, y=3.7, w=4.7, h=3.5 Key Financials: Revenue, EBITDA, margins, EPS, FCF + Valuation (Mkt Cap, EV, multiples) — table OR chart, not both
4 x=5.0, y=3.7, w=4.7, h=3.5 For public companies: 1Y stock price chart + top shareholders. For private: Recent developments or Ownership/M&A history

Font Sizes - USE THESE EXACT VALUES

Element Size Notes
Slide title 24pt Bold, company brand color
Quadrant headers 14pt Bold, with accent bar
Body/bullet text 11pt Regular weight
Table text 10pt Use 9pt for dense tables
Chart labels 9pt Keep labels short
Source/footer 8pt Bottom of slide

CRITICAL: If text overflows, REDUCE font size by 1pt and re-render.

Visual Accents (REQUIRED)

Each quadrant header MUST have a colored accent bar to the left:

// Add accent bar for quadrant header
slide.addShape(pptx.shapes.RECTANGLE, {
  x: 0.3, y: 0.6, w: 0.08, h: 0.25,
  fill: { color: 'E31937' }  // Use company brand color
});
slide.addText('Company Overview', {
  x: 0.45, y: 0.6, w: 4.5, h: 0.3, fontSize: 14, bold: true, fontFace: 'Arial'
});

Visual elements to include:

First Page Formatting


Subsequent Pages: Free-Form Layouts


Charts (Multi-Slide Profiles)

For multi-slide profiles: Include 2-3 actual PptxGenJS charts. Never use placeholder divs or static images.

For single-slide profiles: Use tables for financials (more space-efficient). Only add a chart if it replaces the table, not in addition to it.

Data Type Chart Type
Revenue trends Line or column (multi-year)
Geographic breakdown Horizontal bar
Product mix Pie with percentages
Financial comparison Column
Stock price (1Y daily) Line

Chart Code Examples

Horizontal Bar (fits in bottom-right quadrant for 4:3 slide):

slide.addChart(pptx.charts.BAR, [{
  name: 'FY2024 Revenue by Region',
  labels: ['North America', 'EMEA', 'China', 'APLA'],
  values: [21.4, 13.6, 7.6, 6.7]
}], {
  x: 5.0, y: 4.1, w: 4.5, h: 3.0,  // Fits in bottom-right quadrant (4:3)
  barDir: 'bar', chartColors: ['FF6B35'], showValue: true,
  dataLabelFontSize: 10, catAxisLabelFontSize: 10, valAxisLabelFontSize: 10,
  dataLabelFormatCode: '$#,##0.0B',
  title: 'Revenue by Geography', titleFontSize: 12, titleBold: true
});

Pie Chart (fits in bottom-right quadrant for 4:3 slide):

slide.addChart(pptx.charts.PIE, [{
  name: 'Product Mix',
  labels: ['Footwear', 'Apparel', 'Equipment'],
  values: [68, 29, 3]
}], {
  x: 5.0, y: 4.1, w: 4.5, h: 3.0,  // Fits in bottom-right quadrant (4:3)
  showPercent: true, showLegend: true, legendPos: 'r',
  dataLabelFontSize: 10, legendFontSize: 10,
  chartColors: ['FF6B35', '2C2C2C', '4A4A4A'],
  title: 'Revenue Mix FY24', titleFontSize: 12, titleBold: true
});

Line Chart (full width for subsequent slides):

slide.addChart(pptx.charts.LINE, [{
  name: 'Revenue ($B)',
  labels: ['FY21', 'FY22', 'FY23', 'FY24', 'FY25E'],
  values: [44.5, 46.7, 48.5, 51.4, 54.2]
}], {
  x: 0.3, y: 1.2, w: 9.4, h: 5.5,  // Full width for 4:3 slide
  chartColors: ['FF6B35'], showValue: true, lineSmooth: true,
  dataLabelFontSize: 11, catAxisLabelFontSize: 11, valAxisLabelFontSize: 11,
  title: 'Revenue Trend & Forecast', titleFontSize: 14, titleBold: true
});

Financial Data Formatting

Always use native PptxGenJS tables or charts - NEVER plain text prose or HTML tables.

Use slide.addTable() for financial data (fits in bottom-left quadrant for 4:3 slide):

// Add header with accent bar first
slide.addShape(pptx.shapes.RECTANGLE, {
  x: 0.3, y: 3.7, w: 0.08, h: 0.25, fill: { color: 'E31937' }
});
slide.addText('Key Financials & Valuation', {
  x: 0.45, y: 3.7, w: 4.5, h: 0.3, fontSize: 14, bold: true, fontFace: 'Arial'
});

// Financial data table
slide.addTable([
  [{ text: 'Metric', options: { bold: true, fill: '003366', color: 'FFFFFF' } },
   { text: 'FY24', options: { bold: true, fill: '003366', color: 'FFFFFF' } },
   { text: 'FY25E', options: { bold: true, fill: '003366', color: 'FFFFFF' } }],
  ['Revenue', '$51.4B', '$54.2B'],
  ['YoY Growth', '+6.0%', '+5.5%'],
  ['EBITDA', '$8.9B', '$9.5B'],
  ['EBITDA Margin', '17.3%', '17.5%'],
  ['EPS', '$3.42', '$3.75'],
  ['Market Cap', '$185B', '—'],
  ['EV/EBITDA', '12.5x', '11.7x']
], {
  x: 0.45, y: 4.1, w: 4.3, h: 3.0,  // Below header in bottom-left quadrant
  fontFace: 'Arial', fontSize: 10,
  border: { pt: 0.5, color: 'CCCCCC' },
  valign: 'middle',
  colW: [1.8, 1.25, 1.25]  // Column widths
});

Incorrect: Plain text like Note: FY2024 revenue growth +1.0%, Net Income $5.1B...Incorrect: HTML tables that don't convert properly to PowerPoint

For projections, use Bear/Base/Bull case scenarios in structured tables.


Quality Checklist

First Page

All Slides

Note: Reference the PPTX skill for PowerPoint file creation.