--- name: fsi-strip-profile description: | Creates professional investment banking strip profiles (company profiles) for pitch books, deal materials, and client presentations. Generates 1-4 information-dense slides with quadrant layouts, charts, and tables. --- ## Workflow ### 1. Clarify Requirements - **Ask the user**: Single-slide or multi-slide (3-4 slides)? - **Ask the user**: Any specific focus areas or topics to emphasize? - **Only after user confirms**, proceed to research ### 2. Research & Planning **Data Sources:** - **Primary**: Company filings (BamSEC, SEC EDGAR - "Item 1. Business", MD&A), investor presentations, corporate website - **Market data**: Bloomberg, FactSet, CapIQ (price, shares, market cap, net debt, EV, ownership) - **Estimates**: FactSet/CapIQ consensus for NTM revenue, EBITDA, EPS - **News**: Press releases from last 90 days, M&A activity, guidance changes **Required Metrics:** - **Financials**: Revenue, EBITDA, margins (%), EPS, FCF for ±3 years - **Valuation**: Market Cap, EV, EV/Revenue, EV/EBITDA, P/E multiples - **Growth**: YoY growth rates (%) - **Ownership**: Top 5 shareholders with % ownership - **Segments**: Product mix and/or geographic mix (% breakdown) **Normalization:** - Convert all amounts to consistent currency - Scale consistently ($mm or $bn throughout, not mixed) **Before Building:** - Print outline to chat with 4-5 bullet points per item (actual numbers, no placeholders) - Print style choices: fonts, colors (hex codes), chart types for each data set - Get user alignment: "Does this outline and visual strategy align with your vision?" ### 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: ```bash 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: - **Text overlap check**: Scan every text element - do any labels, bullets, or titles collide with each other? - **Text cutoff check**: Is any text truncated at boundaries? Are all words fully visible? - **Chart boundary check**: Do charts stay within their containers? Are ALL axis labels fully visible? - **Quadrant integrity**: Does content in one quadrant bleed into adjacent quadrants? 4. **If ANY overlap or cutoff is detected**: Fix immediately using these strategies in order: - **First**: Reduce font size (go down 1-2pt) - **Second**: Shorten text (abbreviate, remove less critical info) - **Third**: Adjust element positions or container sizes - **Re-render and verify again** - do not proceed until all text fits cleanly 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:** - Table rows colliding with text below them - Chart x-axis labels cut off at bottom - Long bullet points wrapping into adjacent content - Quadrant content bleeding into adjacent quadrants - Title text overlapping with content below - Legend text overlapping with chart elements - Footer/source text colliding with main content --- ## 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:** - **Company Overview**: 6-8 bullets minimum (HQ, founded, employees, CEO/CFO, market cap, ticker, industry, key stat) - **Business & Positioning**: 6-8 bullets (revenue drivers, products, market share %, competitive moat, customer count, geographic mix) - **Key Financials**: Table with 8-10 rows OR chart + 4-5 key metrics (Revenue, EBITDA, margins, EPS, FCF, growth rates, valuation multiples) - **Fourth quadrant**: 5-7 bullets (ownership %, recent M&A, developments, catalysts) **Information packing techniques:** - Combine related facts: "HQ: Austin, TX; Founded: 2003; 140K employees" - Always include numbers: "$50B revenue" not "large revenue" - Add context: "EBITDA margin: 25% (vs. 18% industry avg)" - Include YoY changes: "Revenue: $125M (+28% YoY)" - Use percentages: "Enterprise: 62% of revenue" **If a quadrant looks sparse, add more:** - Segment breakdowns with % - Geographic revenue splits - Customer concentration (top 10 = X%) - Recent contract wins with $ values - Guidance vs. consensus - Insider ownership % **Line spacing - use single textbox per section:** ```python 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:** - Put header + bullets in SAME textbox (no separate header textbox) - Use `space_after = Pt(6)` after header, `Pt(3)` between bullets - Don't hardcode gaps - let paragraph spacing handle it naturally - If content overflows, reduce font by 1pt rather than removing content --- - **3-4 dense slides** - use quadrants, columns, tables, charts - **Bullets for ALL body text** - NEVER paragraphs. **Use ONE textbox per section with all bullets inside** - do NOT create separate textboxes for each bullet point. Use PptxGenJS bullet formatting: ```javascript // CORRECT: Single textbox with bullet list - each array item becomes a bullet // Position in top-left quadrant (Company Overview) - after header with accent bar slide.addText( [ { text: 'Headquarters: Austin, Texas; Founded 2003', options: { bullet: { indent: 10 }, breakLine: true } }, { text: 'Employees: 140,000+ globally across 6 continents', options: { bullet: { indent: 10 }, breakLine: true } }, { text: 'CEO: Elon Musk; CFO: Vaibhav Taneja', options: { bullet: { indent: 10 }, breakLine: true } }, { text: 'Market Cap: $850B (#6 globally by market cap)', options: { bullet: { indent: 10 }, breakLine: true } }, { text: 'Segments: Automotive (85%), Energy (10%), Services (5%)', options: { bullet: { indent: 10 } } } ], { x: 0.45, y: 0.95, w: 4.5, h: 2.6, fontSize: 11, fontFace: 'Arial', valign: 'top', paraSpaceAfter: 6 } ); // WRONG: Multiple separate textboxes for each bullet - causes alignment issues // slide.addText('Headquarters: Austin', { x: 0.5, y: 1.0, bullet: true }); ``` **Bullet formatting tips:** - `bullet: { indent: 10 }` - controls bullet indentation (smaller = tighter) - `paraSpaceAfter: 6` - space after each paragraph in points - Pack multiple related facts into each bullet (e.g., "HQ: Austin; Founded: 2003") - Include specific numbers and percentages for information density - **Title case** for titles (not ALL CAPS), left-aligned - **Consistent fonts** everywhere including tables - **Company's brand colors** - YOU MUST research actual brand colors via web search before creating slides. Do not guess or assume colors. - **Follow brand guidelines if provided** ### 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): ```javascript 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**. - **x**: horizontal position from left edge (0 = left, 10 = right) - **y**: vertical position from top edge (0 = top, 7.5 = bottom) - **Content must stay within bounds** - leave 0.3" margin on all sides ### 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)` ```javascript 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: ```javascript // 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:** - Accent bars next to all section headers (brand color) - Thin horizontal divider line between top and bottom quadrants - Company logo in top-right corner if available - Subtle gridlines in tables (light gray #CCCCCC) ### First Page Formatting - **Font: Arial** (or as specified by user/brand guidelines) - **Quadrant titles**: Title Case (not ALL CAPS), e.g., "Company Overview" not "COMPANY OVERVIEW" - **Bullets**: Bold key terms at start, e.g., "**Market Position:** Leading global manufacturer..." - White background only — no boxes, fills, or shading - Section headers: bold text, follow brand guidelines for styling - All quadrants equally sized and aligned --- ## Subsequent Pages: Free-Form Layouts - Two-column (40/60 or 50/50), full-slide charts, or sidebar layouts - Each page elaborates on first page content - Maintain consistent typography and color scheme - Suggested flow: Products/Market → Financial Analysis → Leadership --- ## 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):** ```javascript 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):** ```javascript 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):** ```javascript 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): ```javascript // 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 - [ ] Title section with company name, ticker, industry - [ ] Exactly 4 equal quadrants below title - [ ] All bullets, no paragraphs, 1 line max each - [ ] Financials in table or chart (not both) ### All Slides - [ ] No text overflow or cutoff - [ ] Consistent fonts and colors throughout - [ ] Charts render correctly - [ ] No placeholder text - all actual data - [ ] Consistent scaling ($mm or $bn, not mixed) - [ ] Sources cited - [ ] Investment banking quality (GS/MS/JPM standard) **Note:** Reference the **PPTX skill** for PowerPoint file creation.