Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

slide-cli

Package Overview
Dependencies
Maintainers
1
Versions
16
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

slide-cli

CLI to create beautiful slide cards (9:16, 16:9, 1:1) from JSON + HTML templates

latest
Source
npmnpm
Version
1.1.3
Version published
Maintainers
1
Created
Source

slide-cli

npm version total downloads CI license bun ko-fi

A TypeScript CLI to create beautiful slide cards from JSON data + HTML templates. Supports 9:16 (Stories/Reels), 16:9 (presentations/YouTube), and 1:1 (feed) aspect ratios.

slide create        --data ./templates/minimal/sample.json --template minimal --out ./output
slide list          [--verbose]
slide add-template  <path>  [--force]

Installation

From npm (end users)

npm install -g slide-cli
slide --help

Requires: Node.js ≥ 18 · Chrome/Chromium (bundled via Puppeteer)

From source (contributors)

git clone https://github.com/doum1004/slide-cli.git
cd slide-cli
bun install       # Bun is required for building and running tests
bun run build     # outputs to dist/
npm link          # exposes the `slide` command globally
slide --help

Requires: Bun ≥ 1.0 (build + test only) · Node.js ≥ 18 (runtime)

Why both Bun and Node?

The published dist/ runs on Node — so any end user with Node can install and use slide via npm without touching Bun. Bun is only needed locally to build (bun build) and run tests (bun test). This avoids the Windows issue where npm link detected Bun and generated a .ps1 wrapper that caused Puppeteer to hang silently.

Quick start (from source)

bun install
bun run build
slide list --verbose
slide create --data ./templates/minimal/sample.json --template minimal 

Commands

slide create

slide create --data ./templates/minimal/sample.json --template minimal --out ./output
FlagDefaultDescription
-d, --data <file>(required)Path to data JSON
-t, --template <id>(required)Template id or name
-o, --out <dir>./outputOutput directory
-f, --format <png|jpg>jpgScreenshot format
--no-imagesoffSkip screenshots (HTML only)
--allow-missing-imagesoffRender slides without unresolvable image slots instead of aborting

Output:

output/
├── slide-1.html   slide-1.jpg
├── slide-2.html   slide-2.jpg
│   …
├── index.html     ← presentation viewer
├── data.json      ← copy of your input
└── manifest.json  ← machine-readable index (slideIndex, htmlPath, imagePath)

Backends and agents should read manifest.json to get the ordered image paths:

const manifest = JSON.parse(fs.readFileSync(`${outDir}/manifest.json`, "utf-8"));
const images = manifest.slides
  .filter(s => s.imagePath)
  .map(s => path.join(outDir, s.imagePath));

slide list

slide list
slide list --verbose    # full slot schema

slide add-template

slide add-template ./my-template/
slide add-template ./my-template/ --force

Data JSON format

{
  "title": "My Presentation",
  "slides": [
    {
      "layout": "minimal",
      "heading": "Less is more",
      "body": "Simplicity is the ultimate sophistication.",
      "label": "Chapter 01",
      "accent": "#c8b89a",
      "bg": "#0f0e0c"
    }
  ]
}

Built-in templates

idRatioRequired slotsStylePreview
minimal9:16headingClean typographic slide, Fraunces serif
minimal-wide16:9headingClean typographic two-column layout
bold-title9:16titleHigh-contrast editorial, gradient background
bold-title-wide16:9titleHigh-contrast editorial, widescreen
quote-card9:16quoteElegant pull-quote card with attribution
quote-card-wide16:9quotePull-quote card, widescreen
insight9:16headingInsight card with optional background image
insight-wide16:9headingWidescreen insight card with background image
insight29:16headingInsight card v2 — bold heading, body, image
insight2-wide16:9headingWidescreen insight card v2
spotlight9:16image, headingImage-forward spotlight, photo top
spotlight-wide16:9image, headingWidescreen spotlight, image right
overlay9:16headlineTransparent overlay for video compositing
video-overlay9:16Transparent 9:16 overlay layers for shorts
video-overlay-wide16:9Transparent 16:9 overlay layers for video

Tip: Run slide preview --all to regenerate preview images locally, or slide preview <template-id> for a single template.

Creating a custom template

my-template/
├── template.json    ← manifest + slot definitions
└── template.html    ← Handlebars HTML at your chosen dimensions

template.json

Set aspectRatio, width, and height to match your target format:

aspectRatiowidthheightUse case
"9:16"10801920Instagram Stories, TikTok, Reels
"16:9"19201080YouTube thumbnails, presentations
"1:1"10801080Instagram feed, Twitter/X
{
  "name": "My Template",
  "id": "my-template",
  "version": "1.0.0",
  "description": "Short description",
  "aspectRatio": "16:9",
  "width": 1920,
  "height": 1080,
  "slots": [
    { "id": "headline", "type": "text",  "label": "Headline",   "required": true },
    { "id": "bg",       "type": "color", "label": "Background", "required": false, "default": "#fff" }
  ]
}

Slot types: text · color · image · number · url

template.html

Match width and height in CSS to the values in your manifest:

<!DOCTYPE html><html>
<head><style>
  html, body { width: 1920px; height: 1080px; background: {{bg}}; }
</style></head>
<body>
  <h1>{{headline}}</h1>
  {{#if subtitle}}<p>{{subtitle}}</p>{{/if}}
  <footer>{{slideIndex}} / {{totalSlides}}</footer>
</body></html>

Always available: {{slideIndex}} · {{totalSlides}} · {{title}}
Helpers: {{#if}} · {{upper val}} · {{lower val}} · {{default val "fallback"}}

Presentation viewer

The generated index.html has:

  • ← → keys or buttons · Space = autoplay · F = fullscreen
  • Home/End · touch/swipe support
  • Speed selector · progress bar · dot nav

Template storage

PathPurpose
~/.slide-cli/templates/User templates (via add-template)
<install>/dist/templates/Built-in templates (shipped with the package)

User templates take priority over built-ins on id collision.

Docker

Production (installs from npm):

docker build -t slide-cli .
docker run --rm -v $(pwd)/output:/work/output slide-cli \
  slide list
docker run --rm -v $(pwd)/output:/work/output slide-cli \
  slide create --data ./templates/minimal/sample.json --template minimal

Local dev (installs from local build):

bun run build
docker build -f Dockerfile.dev -t slide-cli-dev .

DATA

Visitors

License

MIT

Keywords

slides

FAQs

Package last updated on 06 May 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts