From investment-banking
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.
npx claudepluginhub rodaquino-omni/crowtech-healthcare-finance --plugin investment-bankingThis skill uses the workspace's default tool permissions.
- **Ask the user**: Single-slide or multi-slide (3-4 slides)?
Provides Ktor server patterns for routing DSL, plugins (auth, CORS, serialization), Koin DI, WebSockets, services, and testApplication testing.
Conducts multi-source web research with firecrawl and exa MCPs: searches, scrapes pages, synthesizes cited reports. For deep dives, competitive analysis, tech evaluations, or due diligence.
Provides demand forecasting, safety stock optimization, replenishment planning, and promotional lift estimation for multi-location retailers managing 300-800 SKUs.
Data Sources:
Required Metrics:
Normalization: consistent currency; consistent scale ($mm or $bn, not mixed).
Before Building: print outline with 4-5 actual-number bullets per item; print style choices (fonts, hex colors, chart types); get user alignment.
CRITICAL: You MUST create ONE slide at a time and get user approval before proceeding to the next slide.
For EACH slide:
soffice --headless --convert-to pdf presentation.pptx
pdftoppm -jpeg -r 150 -f 1 -l 1 presentation.pdf slide
YOU MUST CHECK FOR THESE SPECIFIC ISSUES ON EVERY PAGE:
The #1 goal is MAXIMUM information density. A busy executive should understand the entire company story in 30 seconds. Fill every quadrant.
Per quadrant targets:
Information packing techniques:
If a quadrant looks sparse, add more: segment/geo breakdowns, customer concentration, recent contract wins, guidance vs. consensus, insider ownership.
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: header + bullets in SAME textbox; space_after = Pt(6) after header, Pt(3) between bullets; don't hardcode gaps; if content overflows, reduce font 1pt.
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:
// CORRECT: Single textbox with bullet list
slide.addText(
[
{ text: 'Headquarters: Dallas, Texas; Founded 2005', options: { bullet: { indent: 10 }, breakLine: true } },
{ text: 'Employees: 8,400 across 14 states', options: { bullet: { indent: 10 }, breakLine: true } },
{ text: 'CEO: Chris Reading; CFO: Carey Hendrickson', options: { bullet: { indent: 10 }, breakLine: true } },
{ text: 'Market Cap: $1.4B; FY24 Revenue: $630M', options: { bullet: { indent: 10 }, breakLine: true } },
{ text: 'Segments: Outpatient PT (100%); Medicare 42% of revenue', options: { bullet: { indent: 10 } } }
],
{ x: 0.45, y: 0.95, w: 4.5, h: 2.6, fontSize: 11, fontFace: 'Arial', valign: 'top', paraSpaceAfter: 6 }
);
Bullet formatting tips:
bullet: { indent: 10 } — controls indentationparaSpaceAfter: 6 — paragraph spacing in pointsTitle case for titles (not ALL CAPS), left-aligned
Consistent fonts everywhere including tables
Company's brand colors — research via web search, do not guess
Follow brand guidelines if provided
See examples/USPH_Strip_Profile_Example.pptx for layout inspiration. Adapt colors to each company's brand.
Must pass "30-second comprehension test".
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
PptxGenJS uses inches. 4:3 = 10" × 7.5". x: left→right (0–10); y: top→bottom (0–7.5). Leave 0.3" margin.
┌─────────────────────────────────────────────────────────────────┐
│ 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
Company Name (Ticker) — example: U.S. Physical Therapy, Inc. (USPH)
slide.addText('U.S. Physical Therapy, Inc. (USPH)', { x: 0.3, y: 0.2, w: 9.4, h: 0.35, fontSize: 18, bold: true });
| 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 — table OR chart, not both |
| 4 | x=5.0, y=3.7, w=4.7, h=3.5 | Public: 1Y stock chart + top shareholders. Private: recent developments or ownership/M&A history |
| Element | Size | Notes |
|---|---|---|
| Slide title | 24pt | Bold, brand color |
| Quadrant headers | 14pt | Bold, accent bar |
| Body/bullets | 11pt | Regular |
| Table text | 10pt | 9pt for dense tables |
| Chart labels | 9pt | Short labels |
| Source/footer | 8pt | Bottom |
CRITICAL: If text overflows, REDUCE font size by 1pt and re-render.
Each quadrant header MUST have a colored accent bar to the left:
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 on headers (brand color); thin horizontal divider between top and bottom quadrants; company logo top-right if available; subtle gridlines in tables (light gray #CCCCCC).
Multi-slide profiles: include 2-3 actual PptxGenJS charts. Never use placeholder divs or static images.
Single-slide profiles: use tables for financials; only add a chart if it replaces the table.
| 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 |
Horizontal Bar (bottom-right quadrant for 4:3):
slide.addChart(pptx.charts.BAR, [{
name: 'FY2024 Revenue by Region',
labels: ['Northeast', 'Southeast', 'Midwest', 'West'],
values: [210, 165, 145, 110]
}], {
x: 5.0, y: 4.1, w: 4.5, h: 3.0,
barDir: 'bar', chartColors: ['1F4E79'], showValue: true,
dataLabelFontSize: 10, catAxisLabelFontSize: 10, valAxisLabelFontSize: 10,
dataLabelFormatCode: '$#,##0.0M',
title: 'Revenue by Geography', titleFontSize: 12, titleBold: true
});
Pie Chart (bottom-right quadrant for 4:3):
slide.addChart(pptx.charts.PIE, [{
name: 'Payor Mix',
labels: ['Medicare', 'Commercial', 'Medicaid', 'Self-pay'],
values: [42, 44, 9, 5]
}], {
x: 5.0, y: 4.1, w: 4.5, h: 3.0,
showPercent: true, showLegend: true, legendPos: 'r',
dataLabelFontSize: 10, legendFontSize: 10,
chartColors: ['1F4E79', '4472C4', '70AD47', 'BFBFBF'],
title: 'Payor Mix FY24', titleFontSize: 12, titleBold: true
});
Line Chart (full width for subsequent slides):
slide.addChart(pptx.charts.LINE, [{
name: 'Revenue ($M)',
labels: ['FY21', 'FY22', 'FY23', 'FY24', 'FY25E'],
values: [480, 540, 590, 630, 680]
}], {
x: 0.3, y: 1.2, w: 9.4, h: 5.5,
chartColors: ['1F4E79'], showValue: true, lineSmooth: true,
dataLabelFontSize: 11, catAxisLabelFontSize: 11, valAxisLabelFontSize: 11,
title: 'Revenue Trend & Forecast', titleFontSize: 14, titleBold: true
});
Always use native PptxGenJS tables or charts — NEVER plain text prose or HTML tables.
// 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', '$630M', '$680M'],
['YoY Growth', '+6.8%', '+7.9%'],
['EBITDA', '$114M', '$125M'],
['EBITDA Margin', '18.1%', '18.4%'],
['EPS', '$2.10', '$2.35'],
['Market Cap', '$1.4B', '—'],
['EV/EBITDA', '13.5x', '12.3x']
], {
x: 0.45, y: 4.1, w: 4.3, h: 3.0,
fontFace: 'Arial', fontSize: 10,
border: { pt: 0.5, color: 'CCCCCC' },
valign: 'middle',
colW: [1.8, 1.25, 1.25]
});
❌ Incorrect: Plain text like Note: FY2024 revenue growth +6.8%, Net Income $25M...
❌ Incorrect: HTML tables that don't convert properly to PowerPoint
For projections, use Bear/Base/Bull cases in structured tables.
Note: Reference the PPTX skill for PowerPoint file creation.