🚧 VeloxKit is pre-release software. APIs may change before v1.0. Get started β†’
Documentation
Core Concepts
Rendering Backends

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:

BackendHello World RSSCalculator RSSRequires
TinySkia (CPU)~97 MB~99 MBNothing β€” pure CPU
FemtoVG (OpenGL)~103 MB~153 MBOpenGL / GPU
Vello (wgpu compute)~285 MB~328 MBDX12 / 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                     β†’  Vello

You 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 MB

Choosing explicitly

GoalSetting
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 dev

Fallback chain

If a backend fails to initialise (driver crash, missing GPU), VeloxKit falls back:

vello   β†’ fail β†’ femtovg β†’ fail β†’ skia
femtovg β†’ fail β†’ skia
skia    β†’ fail β†’ ERROR

The fallback is logged. Production apps should test on their target hardware to avoid silent fallbacks.

See also