Rendering Backends
VeloxKit ships with three rendering backends. The default auto mode picks the best one for the machine at startup β no configuration needed for most apps.
The memory story
The backend choice is the single biggest factor in your app's RAM footprint:
| Backend | Hello World RSS | Calculator RSS | Requires |
|---|---|---|---|
| TinySkia (CPU) | ~97 MB | ~99 MB | Nothing β pure CPU |
| FemtoVG (OpenGL) | ~103 MB | ~153 MB | OpenGL / GPU |
| Vello (wgpu compute) | ~285 MB | ~328 MB | DX12 / Metal / Vulkan |
TinySkia at 97 MB is what makes VeloxKit's headline number possible. It is not a fallback or a limited mode β it is the default for most hardware and produces visually identical output to Vello at typical UI complexity.
auto (default)
auto queries the GPU adapter at startup and picks the appropriate backend:
No GPU / software adapter (WARP, llvmpipe) β TinySkia
Integrated GPU (Intel UHD, Apple M-series) β TinySkia
Intel Arc discrete GPU β FemtoVG
NVIDIA / AMD discrete GPU β VelloYou don't need to set anything β this is the default when renderMode is omitted.
// veloxkit.config.ts β auto is the default, this is explicit
window: {
renderMode: 'auto'
}The selected backend and adapter are logged at startup:
[velox] renderMode=auto β skia (Intel(R) UHD Graphics 770, IntegratedGpu)
[velox] renderMode=auto β vello (NVIDIA GeForce RTX 4080, DiscreteGpu)auto picks TinySkia on the vast majority of laptops and office machines (all iGPU hardware). Vello is selected only on machines with a dedicated NVIDIA or AMD GPU.
skia β TinySkia (CPU rasterizer)
Pure CPU rendering via tiny-skia (opens in a new tab). Zero GPU memory β no wgpu device allocation, no buffer pools, no compute pipelines.
window: { renderMode: 'skia' }- ~97 MB RSS on hello-world
- No GPU required
- Fastest cold start (no shader compilation)
- Full visual parity with Vello at typical UI density
- Best choice for: productivity apps, low-end hardware, VMs, headless/CI
femtovg β FemtoVG (OpenGL)
GPU-accelerated rendering via FemtoVG (opens in a new tab) β a lightweight OpenGL triangle tessellation renderer. Lighter than Vello because it avoids wgpu's compute pipeline overhead.
window: { renderMode: 'femtovg' }- ~103 MB hello-world, ~153 MB on a richer app (Calculator)
- GPU-accelerated anti-aliasing and smooth animations
- Works on OpenGL ES β broader hardware support than DX12/Vulkan
- Best choice for: Intel Arc systems, mid-range hardware, smooth animation-heavy apps
gpu / vello β Vello (wgpu compute)
GPU compute rendering via wgpu (opens in a new tab) + Vello (opens in a new tab). The highest quality backend β analytically anti-aliased gradients, shadows, and glyphs rendered directly on the GPU.
window: { renderMode: 'gpu' } // explicit Vello GPU path- ~285β328 MB RSS (wgpu device + resource pool + V8)
- Best visual quality for gradients, shadows, high-density content
- Required for 3D Canvas
- Requires DX12 (Windows), Metal (macOS), or Vulkan (Linux)
- Best choice for: visual showcase apps, games, apps with heavy 3D content
renderMode: 'cpu' uses Vello's Cranelift CPU path (~35β40 MB cheaper than GPU Vello, but heavier than TinySkia):
window: { renderMode: 'cpu' } // Vello on CPU β still ~250 MBChoosing explicitly
| Goal | Setting |
|---|---|
| Minimum RAM on any hardware | 'skia' |
| Smooth GPU animations, broad support | 'femtovg' |
| Best visual quality, dGPU required | 'gpu' |
| Headless / CI / no display | 'skia' |
| 3D Canvas | 'gpu' only |
| Let VeloxKit decide (recommended) | 'auto' (default) |
Force skia at runtime without changing config:
VELOX_CPU_RENDER=1 veloxkit devFallback chain
If a backend fails to initialise (driver crash, missing GPU), VeloxKit falls back:
vello β fail β femtovg β fail β skia
femtovg β fail β skia
skia β fail β ERRORThe fallback is logged. Production apps should test on their target hardware to avoid silent fallbacks.
See also
- veloxkit.config.ts reference β
window.renderModefield - Renderer & engine selection guide β full heuristics matrix and persona recommendations