npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@lukastan/deckforge

v0.1.0

Published

TypeScript SDK for AI-powered presentation generation. 32 slide types, 15 themes, native charts, finance vertical. Generate executive-ready PowerPoint decks via API.

Downloads

39

Readme

@deckforge/sdk

npm version License: MIT TypeScript

Executive-ready presentations, one API call away.

Generate and render professional PowerPoint decks from TypeScript with an immutable builder API, 32 slide types, 15 themes, and real-time streaming.

npm install @deckforge/sdk

Quick Start

import { DeckForge, Presentation, Slide } from '@deckforge/sdk';

const df = new DeckForge({ apiKey: 'dk_live_...' });

const pptx = await df.render(
  Presentation.create('Q4 Results')
    .theme('corporate-blue')
    .addSlide(Slide.title({ title: 'Q4 2026', subtitle: 'Board Presentation' }))
    .addSlide(Slide.bullets({
      title: 'Key Metrics',
      items: ['Revenue +23% YoY', 'EBITDA $4.2M', 'NRR 118%'],
    }))
    .build()
);

console.log(pptx.download_url); // https://api.deckforge.io/v1/files/...

Five lines of code. A board-ready deck.


Features

  • 32 Slide Types -- Title, bullets, charts, tables, comparisons, timelines, org charts, and 9 finance-specific types (DCF, comps, waterfall, deal overview, returns analysis, capital structure, market landscape, risk matrix, investment thesis).

  • 15 Built-in Themes -- Professionally designed themes with WCAG AA contrast validation: corporate-blue, executive-dark, finance-pro, minimal-light, modern-gradient, and more.

  • 24 Chart Types -- Bar, line, pie, donut, scatter, bubble, waterfall, funnel, treemap, radar, tornado, football field, sensitivity, heatmap, Sankey, Gantt, sunburst, and combo charts.

  • Immutable Builder API -- Fluent, type-safe construction of presentations. Every mutation returns a new instance -- no side effects, easy composition.

  • Real-time Streaming -- Stream AI-generated presentation progress via SSE. Watch slides appear in real time.

  • Finance Vertical -- Purpose-built slide types for investment banking, private equity, and equity research: comp tables, DCF summaries, waterfall bridges, deal overviews, and returns analysis.


Pricing

| Tier | Price | Credits/mo | Rate Limit | Overage | |------|-------|------------|------------|---------| | Starter | Free | 50 | 10 req/min | $0.50/credit | | Pro | $79/mo | 500 | 60 req/min | $0.30/credit | | Enterprise | Custom | 10,000+ | 300 req/min | $0.10/credit |

x402 Per-Call Pricing (machine-to-machine, no subscription required):

| Operation | Price | |-----------|-------| | Render presentation | $0.05 | | Generate from prompt | $0.15 | | Estimate cost | Free | | List themes / slide types | Free |


API Reference

DeckForge Client

import { DeckForge } from '@deckforge/sdk';

const df = new DeckForge({
  apiKey: 'dk_live_...',        // Required
  baseUrl: 'https://api.deckforge.io', // Optional
  timeout: 30_000,              // Optional (ms)
  maxRetries: 2,                // Optional
});

Core Methods

| Method | Description | |--------|-------------| | df.render(ir) | Render a Presentation IR to PPTX. Returns RenderResult with download_url. | | df.renderToBuffer(ir) | Render and download as ArrayBuffer. | | df.estimate(ir) | Estimate credit cost before rendering. Returns CostEstimate. | | df.getJob(jobId) | Poll async job status for large presentations. |

Deck Operations

| Method | Description | |--------|-------------| | df.decks.list(opts?) | List saved decks with pagination. | | df.decks.get(id) | Get deck details by ID. | | df.decks.getIR(id) | Get the raw IR for a deck. | | df.decks.delete(id) | Delete a deck. | | df.decks.appendSlides(id, slides) | Append slides to an existing deck. | | df.decks.replaceSlide(id, index, slide) | Replace a single slide at an index. | | df.decks.reorderSlides(id, order) | Reorder slides by providing new index array. | | df.decks.retheme(id, theme) | Apply a new theme to an existing deck. |

Generation

| Method | Description | |--------|-------------| | df.generate.start(prompt, opts?) | Start AI generation from natural language prompt. | | df.generate.stream(prompt, opts?) | Stream generation progress as AsyncGenerator<ProgressEvent>. |


Builder API

Presentation

import { Presentation } from '@deckforge/sdk';

const ir = Presentation.create('Annual Review')
  .theme('executive-dark')
  .language('en')
  .addSlide(/* ... */)
  .addSlide(/* ... */)
  .build();

The builder is immutable -- every method returns a new PresentationBuilder instance. Call .build() to produce the final PresentationIR object.

Slide Factories

All 32 slide types have typed factory functions:

import { Slide } from '@deckforge/sdk';

// Universal slides
Slide.title({ title: 'Hello World', subtitle: 'Subtitle' })
Slide.agenda({ title: 'Agenda', items: ['Topic 1', 'Topic 2'] })
Slide.bullets({ title: 'Key Points', items: ['Point A', 'Point B'] })
Slide.sectionDivider({ title: 'Section 2' })
Slide.keyMessage({ title: 'Revenue grew 42% YoY' })
Slide.twoColumnText({ title: 'Before & After', left: '...', right: '...' })
Slide.comparison({ title: 'Options', headers: [...], rows: [...] })
Slide.timeline({ title: 'Milestones', items: [...] })
Slide.processFlow({ title: 'Workflow', items: [...] })
Slide.orgChart({ title: 'Leadership' })
Slide.teamSlide({ title: 'Our Team' })
Slide.quoteSlide({ title: 'Quote text', attribution: 'Author' })
Slide.imageWithCaption({ title: 'Product', imageUrl: '...' })
Slide.iconGrid({ title: 'Services', items: [...] })
Slide.statsCallout({ title: 'Metrics', kpis: [...] })
Slide.tableSlide({ title: 'Data', headers: [...], rows: [...] })
Slide.chart({ title: 'Revenue', chart: Chart.bar({ ... }) })
Slide.matrix({ title: 'Priority Matrix', headers: [...], rows: [...] })
Slide.funnel({ title: 'Sales Funnel', items: [...] })
Slide.mapSlide({ title: 'Global Presence' })
Slide.thankYou({ title: 'Thank You', contact: '...' })
Slide.appendix({ title: 'Appendix' })
Slide.qAndA({ title: 'Questions?' })

// Finance slides
Slide.dcfSummary({ title: 'DCF', headers: [...], rows: [...] })
Slide.compTable({ title: 'Comps', headers: [...], rows: [...] })
Slide.waterfallChart({ title: 'EBITDA Bridge', chart: Chart.waterfall({ ... }) })
Slide.dealOverview({ title: 'Transaction', headers: [...], rows: [...] })
Slide.returnsAnalysis({ title: 'Returns', headers: [...], rows: [...] })
Slide.capitalStructure({ title: 'Cap Structure', headers: [...], rows: [...] })
Slide.marketLandscape({ title: 'TAM/SAM/SOM', items: [...] })
Slide.riskMatrix({ title: 'Risks', headers: [...], rows: [...] })
Slide.investmentThesis({ title: 'Thesis', items: [...] })

Chart Factories

All 24 chart types:

import { Chart } from '@deckforge/sdk';

// Standard charts
Chart.bar({ categories: ['Q1', 'Q2'], series: [{ name: 'Rev', values: [10, 15] }] })
Chart.stackedBar({ ... })
Chart.groupedBar({ ... })
Chart.horizontalBar({ ... })
Chart.line({ ... })
Chart.multiLine({ ... })
Chart.area({ ... })
Chart.stackedArea({ ... })
Chart.pie({ categories: ['A', 'B'], values: [60, 40] })
Chart.donut({ ... })
Chart.scatter({ points: [{ x: 1, y: 2 }] })
Chart.bubble({ ... })
Chart.combo({ ... })
Chart.radar({ ... })

// Finance charts
Chart.waterfall({ categories: ['Start', '+Rev', '-Cost', 'End'], values: [100, 30, -10, 120] })
Chart.funnel({ stages: ['Leads', 'Qualified', 'Closed'], values: [1000, 250, 50] })
Chart.treemap({ ... })
Chart.tornado({ ... })
Chart.footballField({ ... })
Chart.sensitivityTable({ ... })
Chart.heatmap({ ... })
Chart.sankey({ ... })
Chart.gantt({ ... })
Chart.sunburst({ ... })

Element Factories

For advanced slide construction:

import { Element } from '@deckforge/sdk';

Element.heading('Title Text')
Element.subheading('Subtitle')
Element.body('Paragraph text...')
Element.bullets(['Item 1', 'Item 2', 'Item 3'])
Element.numberedList(['Step 1', 'Step 2'])
Element.table({ headers: ['Col A', 'Col B'], rows: [['1', '2']] })
Element.kpiCard({ label: 'Revenue', value: '$42M' })
Element.callout({ text: 'Important note', style: 'info' })
Element.image({ url: 'https://...', alt: 'Description' })

Streaming

Generate presentations with real-time progress updates:

const df = new DeckForge({ apiKey: 'dk_live_...' });

for await (const event of df.generate.stream(
  'Create a 15-slide pitch deck for a fintech startup',
  { slide_count: 15, theme: 'modern-gradient' }
)) {
  console.log(`[${event.stage}] ${(event.progress * 100).toFixed(0)}%`);

  if (event.stage === 'complete') {
    console.log('Download:', event.download_url);
  }
}

Progress stages: parsing -> outlining -> writing -> rendering -> complete


Error Handling

The SDK throws typed errors for all failure modes:

import {
  DeckForgeError,
  AuthenticationError,
  ValidationError,
  RateLimitError,
  InsufficientCreditsError,
  NotFoundError,
} from '@deckforge/sdk';

try {
  await df.render(ir);
} catch (err) {
  if (err instanceof RateLimitError) {
    // Automatic retry with backoff (up to maxRetries)
    console.log('Rate limited, retrying...');
  } else if (err instanceof AuthenticationError) {
    console.error('Invalid API key');
  } else if (err instanceof ValidationError) {
    console.error('IR schema error:', err.message);
  } else if (err instanceof InsufficientCreditsError) {
    console.error('Upgrade your plan or add credits');
  }
}

All errors extend DeckForgeError with a statusCode property. The client automatically retries on 429 (rate limit) and 5xx errors up to maxRetries times with exponential backoff.


Finance Slides

DeckForge has first-class support for financial presentations:

import { DeckForge, Presentation, Slide, Chart } from '@deckforge/sdk';

const df = new DeckForge({ apiKey: 'dk_live_...' });

const deck = Presentation.create('Acme Corp - Investment Memo')
  .theme('finance-pro')
  .addSlide(Slide.title({
    title: 'Acme Corp',
    subtitle: 'Investment Committee Memorandum',
  }))
  .addSlide(Slide.investmentThesis({
    title: 'Investment Thesis',
    items: [
      'Market leader in $12B addressable market',
      '30% recurring revenue with 95% net retention',
      'Clear path to 25%+ EBITDA margins by 2028',
    ],
  }))
  .addSlide(Slide.compTable({
    title: 'Public Comparable Companies',
    headers: ['Company', 'EV/Revenue', 'EV/EBITDA', 'P/E'],
    rows: [
      ['Peer A', '8.2x', '22.1x', '35.4x'],
      ['Peer B', '6.5x', '18.3x', '28.7x'],
      ['Peer C', '9.1x', '25.0x', '41.2x'],
      ['Median', '8.2x', '22.1x', '35.4x'],
    ],
  }))
  .addSlide(Slide.dcfSummary({
    title: 'DCF Valuation Summary',
    headers: ['Metric', 'Bear', 'Base', 'Bull'],
    rows: [
      ['Enterprise Value', '$8.2B', '$10.5B', '$13.1B'],
      ['Equity Value', '$6.8B', '$9.1B', '$11.7B'],
      ['Implied Share Price', '$45', '$60', '$78'],
    ],
  }))
  .addSlide(Slide.waterfallChart({
    title: 'EBITDA Bridge',
    chart: Chart.waterfall({
      categories: ['2025 EBITDA', 'Revenue Growth', 'Cost Savings', 'Investments', '2026E EBITDA'],
      values: [100, 30, 15, -10, 135],
    }),
  }))
  .addSlide(Slide.returnsAnalysis({
    title: 'Returns Analysis',
    headers: ['Scenario', 'IRR', 'MOIC', 'Payback'],
    rows: [
      ['Base', '22%', '2.8x', '4.2 years'],
      ['Upside', '28%', '3.5x', '3.5 years'],
      ['Downside', '14%', '1.8x', '5.8 years'],
    ],
  }))
  .build();

const result = await df.render(deck);

Benchmarks

Performance measured on standard cloud infrastructure:

| Operation | Slides | Time | |-----------|--------|------| | Render (PPTX) | 10 slides | <3s | | Render (PPTX) | 30 slides | <8s | | Generate (NL to PPTX) | 10 slides | <12s | | Generate (NL to PPTX) | 30 slides | <15s | | Estimate cost | Any | <100ms | | List themes | -- | <50ms |

Sync rendering (<=10 slides) returns the file directly. Larger decks use async rendering with job polling or SSE streaming.


MCP Integration

DeckForge is also available as an MCP (Model Context Protocol) server, making it discoverable by AI agents like Claude, GPT, and Copilot:

{
  "mcpServers": {
    "deckforge": {
      "command": "python",
      "args": ["-m", "deckforge.mcp.server"]
    }
  }
}

The MCP server exposes 6 tools: render, generate, themes, slide_types, cost_estimate, and pricing.


Requirements

  • Node.js 18+
  • TypeScript 5.5+ (for type-safe builder)

License

MIT


Built by DeckForge -- Professional presentations at API speed.