v5.4.5 · charts · GIFs · video · 22+ filters

Draw anything.
From a script.

Apexify.js is a programmatic visual library for Node.js — render charts, images, GIFs, slides and video on the server with one TypeScript API, powered by Rust under the hood.

22+
Image filters
35+
Video features
8+
Chart kinds
100%
TypeScript
output / bg-aurora-grid.png
Background
Background: bg-aurora-grid
rendered with apexify.js
src/render.ts
await painter.createCanvas({
  width: 960, height: 540,
  gradientBg: { type: 'linear', colors: aurora },
  bgLayers: [{ type: 'presetPattern',
    pattern: { type: 'grid', size: 6 } }],
  noiseBg: { intensity: 0.04 },
});
Charts
Backgrounds
Text effects
GIFs
Video
22+ filters
Pattern fills
Pixel ops
Path2D
Image masks
Color analysis
Batch / chain
Charts
Backgrounds
Text effects
GIFs
Video
22+ filters
Pattern fills
Pixel ops
Path2D
Image masks
Color analysis
Batch / chain

What you can build

One library, a whole studio of outputs.

Every tile below is a real, generated PNG from this codebase. Click through to the matching guide.

Charts that look designed

Charts that look designed

Bar, line, pie, donut, radar, polar, combo, comparison — all share one styling vocabulary.

Cinematic backgrounds

Cinematic backgrounds

Layered gradients, presets, noise, blend modes.

GIFs from frames

GIFs from frames

Animate any sequence, control disposal, watermark, encode.

Type with attitude

Type with attitude

Gradients, glows, strokes, curved text, measured layouts.

Programmatic slides

Programmatic slides

Compose chart + image + text on a canvas, export to PNG.

Shapes & masks

Shapes & masks

Eight primitives, clipping, paint order, filter pipelines.

Code → output

A handful of lines. A finished PNG.

Same TypeScript surface, whether you're rendering a chart, a slide, a banner, or a 60-frame GIF.

src/render-chart.ts
Edit live
import { ApexPainter } from 'apexify.js';

const painter = new ApexPainter();

const { buffer } = await painter.createChart({
  kind: 'line',
  width: 960,
  height: 540,
  series: [
    { name: 'Revenue', data: revenue, fill: 'gradient' },
    { name: 'Target',  data: target,  dashed: true   },
  ],
  smooth: true,
  palette: 'sunset',
  legend: { position: 'top' },
  background: { gradient: aurora },
});

await fs.promises.writeFile('chart.png', buffer);
out/chart.png · 960 × 540
● rendered
Generated line chart

Performance

TypeScript on the surface. Rust underneath.

Built on @napi-rs/canvas — a Rust-native binding that ships memory-efficient pipelines, smart caching, and parallel-safe batch & chain operations for big workloads.

@napi-rs/canvasRust SIMDBatch / chain

Relative throughput

higher is better
Apexify · @napi-rs/canvasLead100
sharp78
node-canvas64
jimp (pure JS)22

Numbers are illustrative — measure on your own workload. Apexify gets the lead by composing Rust-backed canvas + image filters + chart layout on a single buffer instead of round-tripping through multiple libraries.

The full picture

What other libraries don't ship in the box.

Pixel processing, charts, GIFs, video, and composition behind a single TypeScript surface — instead of stitching together four packages.

FeatureApexifysharpnode-canvasjimpfabric.js
Rust-backed perf
TypeScript-first
22+ image filters
Chart generation
GIF creation
Video pipeline (FFmpeg)
Pattern + noise + blends
Owner-supported
Built-inPartialNot included
last reviewed · v5.4.5

Showcase

Every image below was rendered with this library.

No mockups, no placeholders. Tap any tile to inspect, or open the matching recipe in the gallery.

Browse all in gallery

Stop hand-designing every asset.
Render them.

One install, one TypeScript API. From a quick chart PNG to a 60-frame GIF or a stitched MP4 — everything you'd need a design tool, a charting lib, and an image lib for, in a single import.