lottery
🎉🌟✨🎈年会抽奖程序,基于 Express + Three.js的 3D 球体抽奖程序,奖品🧧🎁,文字,图片,抽奖规则均可配置,😜抽奖人员信息Excel一键导入😍,抽奖结果Excel导出😎,给你的抽奖活动带来全新酷炫体验🚀🚀🚀
Render JSX & HTML to SVG or images. 160+ CSS properties supported. Drop-in next/og replacement.
A Rust rendering engine that turns JSX, HTML, and node trees into images. No headless browser required.
Render OpenGraph cards, animated GIFs, video frames, and vector SVG from Node.js, Cloudflare Workers, browsers, or any Rust application.
Drop-in compatible with next/og.
Documentation · Playground · Showcase
Takumi is a rendering pipeline built in Rust for one job: turning markup and CSS into pixels. It parses CSS, lays out the tree, shapes text, composites layers, and encodes the output inside a single binary. A headless-Chromium setup spends around 300 MB of RAM and a browser cold start on the same OG card; Takumi spends a function call.
One engine, every deployment target:
takumi cratePrebuilt binaries ship for macOS, Linux (glibc and musl), and Windows, on x64 and ARM64.
CSS support reaches past the usual OG-image subset:
::before, ::after, :is(), :where()clip-path, backdrop-filter, blend modesbackground-clip: text, conic gradientsbun i takumi-js
import { render } from "takumi-js";
import { writeFile } from "node:fs/promises";
const image = await render(
<div tw="w-full h-full flex items-center justify-center bg-gradient-to-b from-blue-100 to-red-50">
<h1 tw="text-6xl font-bold">Hello from Takumi</h1>
</div>,
{ width: 1200, height: 630 },
);
await writeFile("./output.png", image);
Only a last-resort Latin font ships built in. Load the rest through fonts: a URL, raw bytes, or googleFonts. A weight range or an axes entry loads the variable font, so font-variation-settings drives its axes:
import { render } from "takumi-js";
import { googleFonts } from "takumi-js/helpers";
const image = await render(
<div
tw="w-full h-full flex items-center justify-center"
style={{
fontSize: 72,
fontFamily: "Fraunces",
fontVariationSettings: "'opsz' 72, 'wght' 700",
}}
>
Hello from Takumi
</div>,
{
width: 1200,
height: 630,
fonts: googleFonts([{ name: "Fraunces", weight: "100..900", axes: { opsz: "9..144" } }]),
},
);
Rendering many images? Register the fonts once on a Renderer and reuse it. See Typography & Fonts.
next/og-compatible)import { ImageResponse } from "takumi-js/response";
export function GET() {
return new ImageResponse(
<div tw="w-full h-full flex items-center justify-center bg-gradient-to-b from-blue-100 to-red-50">
<h1 tw="text-6xl font-bold">Hello from Takumi</h1>
</div>,
{ width: 1200, height: 630 },
);
}
import { renderAnimation } from "takumi-js";
import { writeFile } from "node:fs/promises";
const animation = await renderAnimation({
width: 400,
height: 400,
fps: 30,
format: "webp",
scenes: [
{
durationMs: 1000,
node: (
<div tw="w-full h-full flex items-center justify-center">
<div tw="w-32 h-32 bg-blue-500 animate-spin rounded-lg" />
</div>
),
},
],
});
await writeFile("./output.webp", animation);
import { renderSvg } from "takumi-js";
import { writeFile } from "node:fs/promises";
const svg = await renderSvg(
<div tw="w-full h-full flex items-center justify-center bg-gradient-to-b from-blue-100 to-red-50">
<h1 tw="text-6xl font-bold">Hello from Takumi</h1>
</div>,
{ width: 1200, height: 630 },
);
await writeFile("./output.svg", svg);
cargo add takumi
Start from the Rust example.
| Feature | next/og (Satori) |
Takumi |
|---|---|---|
| Runtime | Node / Edge | Node, Edge, CF Workers, Browser, Rust crate |
| Template input | JSX / React | JSX, HTML strings, JSON node trees from any language |
| Layout | Flexbox | Flexbox, CSS Grid, block, inline, float |
| Selectors | Limited | Complex selectors, :is(), :where(), ::before, ::after |
backdrop-filter, blend modes |
✗ | ✅ |
| Animated output | ✗ | WebP / APNG / GIF / video frames |
| Vector SVG output | ✅ Native | ✅ Plus raster and animated output |
| Headless browser | ✗ | ✗ |
ImageResponse API |
✅ Native | ✅ Compatible |
Compare rendering output across providers at image-bench.kane.tw.
More projects in the showcase. Takumi is part of the Vercel OSS Program.
Takumi converts any template into a node tree with three node kinds: container, image, and text. That tree runs through:
calc(), absolute positioning, z-indexThe input contract is a node tree, so any template system that serializes to HTML or JSON can feed it: React, Svelte, Vue, plain strings, or your own serializer in any language.
A time axis threads through the pipeline: the renderer takes a timestamp, so a PNG is the tree at t=0 and a GIF is the same tree sampled across t. CSS @keyframes, the animation shorthand, and Tailwind animation utilities (animate-spin, animate-bounce, arbitrary values) all resolve at render time.
The same layout drives a second backend: renderSvg() (Rust render_svg, behind the svg-backend feature) emits a real <svg> document built from <rect>, <path>, gradients, and glyph outlines, so you can ship scalable vector output instead of pixels. If you reached for satori to get SVG, this is the drop-in path.
flowchart LR
A[Templates] --> N[Node Tree] --> P[Rendering Pipeline]
C[Stylesheets] --> P
R[Resources] --> P
D(Time Axis) -.-> P
P --> F[(Raw Pixels)]
P --> S[Vector SVG]
F --> G[PNG / JPEG / WebP / ICO]
F --> H[GIF / APNG]
F --> I[Video frames]
Loading
| Takumi OG image (source) | Package OG card (source) |
|---|---|
![]() |
![]() |
| Prisma-style API card (source) | X-style social post (source) |
![]() |
![]() |
| Keyframe Animation (source) | shiki-image |
![]() |
More examples: Next.js, Cloudflare Workers, TanStack Start, Svelte, Rust, ffmpeg keyframe animation
Read CONTRIBUTING.md. Covers local setup, test commands, fixture workflow, and changelog process.
We welcome bug reports, feature requests, doc improvements, and new example integrations.
MIT or Apache-2.0
more like this
🎉🌟✨🎈年会抽奖程序,基于 Express + Three.js的 3D 球体抽奖程序,奖品🧧🎁,文字,图片,抽奖规则均可配置,😜抽奖人员信息Excel一键导入😍,抽奖结果Excel导出😎,给你的抽奖活动带来全新酷炫体验🚀🚀🚀
meine 🌒 - A CLI file manager and system utility built with Textual. It combines intuitive command parsing with rich t…
View animated .GIF files in a text console. Renders as ASCII art and/or Unicode art. Extended colors. Linux/Mac/Windows
A Visual Nintendo GameBoy using HTML, CSS, Javascript & WebComponents 👾 (old version)
search projects, people, and tags