Skip to content
SnapDOMGitHub★ 8K
Showcase

Showcase: live capture and export demos

Start with Basic capture to export an element as an image. The Plugins section adds optional outputs; Labs contains custom experiments built on captures.

SnapDOM vs html2canvas

Capture the same element to canvas five times with each library and compare the average time in this browser.

SnapDOM vs html2canvas SnapDOM vs dom-to-image

This is the benchmark test element to be captured by both libraries.
SnapDOM
Waiting to start...
html2canvas
Waiting to start...

Basic capture

Hello SnapDOM!

Transforms & shadows

Transformed + Shadow

Capture it just with outerTransforms / outerShadows.

Animated transition

🕺💃

I'm dancing and changing color!

Orbit CSS toolkit - Go to repo

Video frame Core

Capture the current frame of a <video> along with its surrounding interface. Press play, then capture a frame. This demo uses a CORS-enabled sample video.

Web fonts

Unique Typography!

Web fonts with embedFonts: true.

Shadow DOM

Canvas

Export formats

Export as
PNG, JPG & WebP.

Pseudo-elements

This element has pseudo-elements.

Clip-path

This shape uses clip-path

Background blend mode

CSS background-blend-mode: multiply. A gradient image (sky + grass) blended with a blue overlay. SnapDOM captures the final rendered result.

Gradient × blue overlay = tinted result

Iframe (same-origin)

Inputs & textarea

Masking effects

CSS radial mask
PNG circle mask
SVG mask
Linear gradient mask

CORS proxy (useProxy)

Image preview (background)
CORS proxy by Corsfix

Full-page capture

Plugins

Plugins add PDF, editable SVG, HTML, ASCII and agent context, change the captured copy, or record new frames as GIF and video. PDF, Vector and Stream install separately; the other plugins ship in @zumer/snapdom-plugins. Each demo links to its plugin reference.

Prepare the copy

Hide private fields Plugin

redact-inputs masks emails and phone numbers in the capture. The live form keeps its values. Options and docs.

Your profile

Timestamp Plugin

timestamp-overlay stamps the capture time in a corner, useful for receipts and bug reports. Options and docs.

Invoice INV-1042

Interface design$840
Implementation$560
Total$1,400

Replace text Plugin

replace-text swaps strings or regular expressions in the capture only. Here DRAFT becomes APPROVED and the date is hidden. Options and docs.

Contract review

Status: DRAFT

Signed on 2026-10-15 by North Studio.

Filters and tint Plugin

filter applies a CSS filter preset to the capture; color-tint lays a colour over it. The page itself does not change. Options and docs, and the Color tint page.

Snap ✨

Warm gradient, white text, one emoji.

Export

PDF with selectable text Plugin

pdf adds toPdf(): a paginated PDF with selectable, searchable text and clickable links. Reference.

Delivery report

Three interface screens shipped and ready for implementation.

MilestoneStatus
NavigationApproved
Capture demosIn review

Project source

Editable SVG Plugin

vector adds toVector(): SVG text and shapes for a vector editor. Use the separate toFigma() clipboard export for Figma. Reference.

Orbit / 03

HTML export Plugin

The html-export plugin returns a self-contained HTML snapshot with styles, fonts and images inlined. The preview opens that document in a sandboxed <iframe>. Options and docs.

Provisioning manifest

A surface with varied controls and a pseudo-element dot.

SHF · 2.4 GHz

ASCII art Plugin

ascii-export adds toAscii(), which redraws the capture as plain text characters: dark areas become dense characters, light areas stay blank. The cube is CSS, spinning; the export freezes whatever angle it has when you click. Options and docs.

SNAPDO
3DSpinning, as text

Record

GIF recording Plugin

The gif-export plugin records the live element frame by frame and returns an animated GIF. Recording starts when you call toGif(). Options and docs.

00

Video recording Plugin

The video-export plugin records the live element using MediaRecorder. The browser selects a supported MP4 or WebM format; check Blob.type for the result. Options and docs.

00

Live stream Plugin

The stream plugin keeps a canvas in step with a live element and repaints only the boxes that changed. The first frame is a full capture. Later updates patch isolated regions when possible; complex changes repaint a wider region or the full frame. Type in the card and watch the canvas follow. Reference.

Type here, the canvas follows

Each box repaints on its own when it changes.

live00
import { stream } from '@zumer/snapdom-stream'

const live = stream(el, { onFrame: f => console.log(f.full ? 'full' : 'patch', f.rects, f.ms) })
await live.ready
document.body.append(live.canvas)
// later: live.stop()

Context for agents

Text context for LLMs Plugin

context-export adds toContext(): the captured UI as a short text outline with roles, text and state. Options and docs.

Checkout

PlanTeam, yearly
Seats3
Total$288

Element map for agents Plugin

agent-map numbers every interactive element on the image and returns a JSON map with each one's name, role and position. Options and docs.

Sign in

Labs

Experiments built on captures, running live below.

Video overlay

News, sports and stream overlays written in HTML and CSS, over live video as liquid glass. More about the video overlay lab

WebRTC overlay

An HTML scorebug composited onto video and sent as a WebRTC track; the viewer gets the graphics inside the video. More about the WebRTC overlay lab

Stop motion

Pose a figure, capture each frame, play it back as a flipbook. More about the stop motion lab

Paint on a capture

Paint on top of a captured image. More about the paint canvas lab

Target range

Shoot at a capture and watch the holes pile up. More about the target range lab

Capture stages

Compare a capture that stops early with a full render, timed side by side. More about the capture stages lab

Live mirror

Type into a card and see it mirrored live on a WebGL surface. More about the WebGL live mirror lab

ASCII mirror

Type in a card and watch it redrawn as ASCII art on every change: the stream plugin feeds each frame to asciiFromCanvas(). More about this lab.

Seamless DOM

Editable text rendered through WebGL without a visible seam. More about the WebGL seamless DOM lab

Shattered capture

Break a capture into pieces with WebGL physics. More about the WebGL shatter lab

Into the dock

A settings panel captured once with the html-in-canvas engine and folded into a dock with a WebGL shader, next to the same frame from the raw API and the SVG engine. More about this lab.

Automatic repeat captures

Poll an element 20 times and compare full captures with reused ones.

Pikachu
Pikachu 35 HP

⚡ Electric · caught × 0

Nothing captured yet
pending
Nothing captured yet
pending
new capture reused capture

Pikachu artwork via PokeAPI. Pokémon © Nintendo / Game Freak.

SVG and html-in-canvas

The same element through the default SVG engine and the html-in-canvas engine, which Chrome 157 ships without a flag. The lab compares them and checks every plugin; the guide says when to pick which.

Target for html-in-canvas

One target, two SnapDOM rendering engines.

Nothing captured yet
Nothing captured yet

Ecosystem

Tools built on SnapDOM

SnapEye gives coding agents visual evidence. SnapSurf navigates and verifies web pages. SnapDiff runs visual regression tests against saved baselines.

Compare the tools and see how they work together