Takumi
Use this skill when work touches Takumi / takumi-js: rendering JSX, HTML, or node trees to PNG/JPEG/WebP/ICO/SVG/animations without Chromium; ImageResponse OG routes; fonts/images/emoji; Tailwind tw vs full stylesheets; or migrating from next/og / Satori.
Workflow
- Inspect the local surface before changing code:
- Packages:
takumi-js(preferred all-in-one), optionally@takumi-rs/core,@takumi-rs/wasm,@takumi-rs/helpers. - Version: target v2 (current
2.5.x). Treat v1 APIs (loadFonts,fetchedResources,createImageResponse) as legacy. - Runtime: Node (native) vs Edge / Cloudflare Workers / browser (WASM).
takumi-jsauto-picks; pin platform natives for cross-compile deploys. - Entry:
render/renderSvg/renderAnimationvsImageResponsefromtakumi-js/response. - Styling path: inline
style, built-intw,<style>, or compiled CSS viastylesheets.
- Packages:
- Refresh docs when the user asks for latest behavior, the installed major is unclear, or work touches v2 resource options / animation. Start from source-map.md.
- For install, packages,
render/ImageResponse, inputs, and canvas sizing, use setup-core.md. - For fonts, images, emoji,
tw, and stylesheets, use fonts-images-styling.md. - For formats, DPR, SVG, animation, and raw/ffmpeg frames, use formats-animation.md.
- For Next.js, TanStack Start, Workers, Astro, and other hosts, use frameworks.md.
- For v2 upgrades, Satori/
next/ogmigration, and troubleshooting, use pitfalls-migration.md. - Prefer
bun/bunxin command examples. Never copy Fumadocs annotations ([!code --],[!code highlight]) into generated code.
Judgment
- Default to
render(node, options)ornew ImageResponse(node, options). UseRendererfrom@takumi-rs/coreonly to reuse font/image caches across many renders. - Always
awaitrender,renderSvg, andrenderAnimation(and napi/WASMRenderermethods). - Put
w-full h-full(orwidth/height: 100%) on the root — the canvas size alone does not stretch the root. - Pass fonts per call via
fonts. Built-in last-resort is Geist Latin (~400–800). Register anything else (CJK, custom brands). Genericsans-serifresolves to registered families, not the built-in. - Prefer
googleFontsfromtakumi-js/helpersfor Google families; weight ranges /axesload variable fonts. twis a built-in Tailwind subset with no Preflight (UA margins remain). For full Tailwind v4 + themes, compile CSS and passstylesheets.- Bare
<div>isdisplay: block(CSS), not flex — unlike Satori. Explicitdisplay: flexfrom old templates still works. - When user input can influence remote
src/ background URLs, setimages.allowUrl(SSRF). PreferfetchCachefor hot shared URLs. - Prefer native
@takumi-rs/coreon Node for multi-threaded renders; WASM is single-threaded. - Drop-in for
next/og: swap import totakumi-js/response. Skip Chromium / Satori+sharp pipelines unless the project already depends on them for non-Takumi reasons.
Verification
Prefer the repo's existing checks. For meaningful Takumi work, include the relevant subset:
- Typecheck route handlers / render scripts (
ImageResponse,RenderOptions). - Smoke-render one static OG (
1200×630) and open the bytes (or hit the route). - Confirm root fills the canvas; use
drawDebugBorder: truewhen layout looks wrong. - For CJK/custom type, confirm
fonts/googleFontsand no tofu glyphs. - On deploy: native binding present for the target OS/arch (or WASM path on Workers).
- After v1→v2: re-check
await,fonts/imagesoptions, andnew ImageResponse(jsx, opts).