| Crates.io | takumi |
| lib.rs | takumi |
| version | 0.65.0 |
| created_at | 2025-06-12 12:33:14.482895+00 |
| updated_at | 2026-01-21 14:15:39.942492+00 |
| description | Render your React components to images. |
| homepage | https://takumi.kane.tw |
| repository | https://github.com/kane50613/takumi |
| max_upload_size | |
| id | 1709737 |
| size | 14,740,442 |
Takumi is a library with different parts to render your React components to images. This crate contains the core logic for layout, rendering.
Checkout the Quick Start if you are looking for napi-rs / WASM bindings.
use takumi::{
layout::{
node::{ContainerNode, TextNode, NodeKind, Node},
Viewport,
style::Style,
},
rendering::{render, RenderOptionsBuilder},
GlobalContext,
};
// Create a node tree with `ContainerNode` and `TextNode`
let mut node = NodeKind::Container(ContainerNode {
children: Some(Box::from([
NodeKind::Text(TextNode {
text: "Hello, world!".to_string(),
style: None, // Construct with `StyleBuilder`
tw: None, // Tailwind properties
preset: None,
}),
])),
preset: None,
style: None,
tw: None, // Tailwind properties
});
// Create a context for storing resources, font caches.
// You should reuse the context to speed up the rendering.
let mut global = GlobalContext::default();
// Load fonts
global.font_context.load_and_store(include_bytes!("../../assets/fonts/geist/Geist[wght].woff2"), None, None);
// Create a viewport
let viewport = Viewport::new(Some(1200), Some(630));
// Create render options
let options = RenderOptionsBuilder::default()
.viewport(viewport)
.node(node)
.global(&global)
.build()
.unwrap();
// Render the layout to an `RgbaImage`
let image = render(options).unwrap();
woff2: Enable WOFF2 font support.woff: Enable WOFF font support.svg: Enable SVG support.rayon: Enable rayon support.Takumi wouldn't be possible without the following works: