linebender/vello
A GPU compute-centric 2D renderer.
Healthy across the board
Permissive license, no critical CVEs, actively maintained — safe to depend on.
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit today
- ✓11 active contributors
- ✓Distributed ownership (top contributor 45% of recent commits)
- ✓Apache-2.0 licensed
- ✓CI configured
- ✓Tests present
Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Healthy" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/linebender/vello)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card
This card auto-renders when someone shares https://repopilot.app/r/linebender/vello on X, Slack, or LinkedIn.
Ask AI about linebender/vello
Grounded in the actual source code. Pick a starter question or write your own.
Onboarding doc
Onboarding: linebender/vello
Generated by RepoPilot · 2026-06-24 · Source
🎯Verdict
GO — Healthy across the board
- Last commit today
- 11 active contributors
- Distributed ownership (top contributor 45% of recent commits)
- Apache-2.0 licensed
- CI configured
- Tests present
<sub>Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests</sub>
⚡TL;DR
Vello is a GPU compute-centric 2D renderer written in Rust that uses wgpu to render large 2D scenes with near-interactive performance. Unlike traditional PostScript-style renderers (Skia, Cairo), it parallelizes sorting and clipping work via prefix-sum algorithms to avoid CPU bottlenecks and intermediary textures, making it the rendering backend for Xilem GUI toolkit. Monorepo structure: core vello package with vello_encoding (scene encoding) and vello_shaders (WGSL compute shaders); examples/ contains headless, run_wasm, scenes, simple, and with_winit demos; sparse_strips/ is experimental hybrid CPU/GPU branch; doc/ has ARCHITECTURE.md explaining prefix-sum rendering pipeline.
👥Who it's for
Rust GUI framework developers (especially Xilem contributors), graphics engineers building interactive 2D applications, and developers needing high-performance vector graphics rendering without the CPU/memory overhead of traditional renderers like Cairo or Skia.
🌱Maturity & risk
Alpha state: actively maintained with regular CI/CD (GitHub Actions in .github/workflows/), but significant features like blur/filters (#476), glyph caching (#204), and GPU memory allocation strategy (#366) are still in progress. Last version is 0.8.0 with MSRV 1.88, but production use should expect breaking changes.
Moderate risk: alpha state with known conflation artifacts (#49), no glyph caching yet (performance regression for text-heavy scenes), and several open architectural decisions around GPU memory. Dependencies include wgpu 29.0.1 and complex WGSL shader code (277KB); single primary maintainer risk in Linebender org suggests community-driven but not widely distributed.
Active areas of work
Active development on blur/filter effects, glyph caching improvements, and memory allocation strategy refinement based on open issues. Recent work includes WGSL shader optimization and workspace structure cleanup (sparse_strips branch suggests active experimentation with alternative rendering paths).
🚀Get running
Clone: git clone https://github.com/linebender/vello.git && cd vello. Install: rustup install 1.88 (to match MSRV in Cargo.toml). Run: cargo run -p with_winit to launch the interactive demo with winit.
Daily commands:
cargo run -p with_winit for interactive GUI example, cargo run -p headless --release for headless rendering, cargo run -p run_wasm for WebAssembly build.
🗺️Map of the codebase
vello/Cargo.toml— Root workspace configuration defining all member crates, dependencies, and feature flags for the GPU compute-centric renderer.doc/ARCHITECTURE.md— High-level design document explaining the GPU compute pipeline, shader architecture, and data flow through the renderer.vello_shaders— Core GPU shader code (compute and graphics) implementing the rendering pipeline and path operations on the GPU.vello_encoding— Encoding layer that transforms 2D graphics primitives into GPU-consumable command buffers and intermediate representations.examples/with_winit/src/main.rs— Primary example showing how to integrate Vello with a windowed application, demonstrating the public API surface.Cargo.lock— Locked dependency versions ensuring reproducible builds across the workspace and examples.README.md— Project overview describing Vello as a GPU compute-centric 2D renderer and linking to architecture documentation.
🧩Components & responsibilities
- vello::RenderContext (Rust, wgpu) — Orchestrates per-frame rendering: encodes Scene, submits GPU work, manages framebuffer lifecycle.
- Failure mode: GPU command submission fails → panic or graceful error propagation; OOM on large scenes.
- vello_encoding::Encoder (Rust (SIMD for path math)) — Converts high-level Scene (paths, fills, strokes, text) into flat GPU command buffer; handles path subdivision and clip stacks.
- Failure mode: Malformed command buffer → GPU shader errors or visual artifacts; insufficient buffer space → OOM.
- GPU Compute Shaders (binning, rasterization) (WGSL, GPU compute) — Parallel processing: assigns paths to tiles, rasterizes fills/strokes, evaluates blend modes.
- Failure mode: Shader compilation error → initialization panic; workgroup size mismatch → undefined behavior or hang.
- glifo::GlyphAtlas (Rust, freetype/fonttools, GPU textures) — Manages font rasterization and texture atlasing; caches rendered glyphs for reuse.
- Failure mode: Font load failure → panic; atlas overflow → dropped glyphs or visual corruption.
🔀Data flow
Application (Scene definition)→vello_encoding::Encoder— Scene contains paths, strokes, fills, clips, text; serialized into command buffer.vello_encoding (Command buffer)→undefined— undefined
🛠️How to make changes
Add a new rendering feature (e.g., new blend mode or effect)
- Define the feature enum variant and serialization in encoding layer (
vello_encoding/src/lib.rs) - Implement GPU compute/graphics shader logic in WGSL (
vello_shaders) - Update RenderContext pipeline to pass feature data to GPU (
vello/src/lib.rs) - Add integration test or example demonstrating the new feature (
examples/scenes/src/test_scenes.rs)
Add a new scene type (e.g., custom SVG dialect or chart renderer)
- Create a new module under examples/scenes/src/ (e.g., chart.rs) (
examples/scenes/src/lib.rs) - Implement parsing/composition into Scene using vello_encoding primitives (
examples/scenes/src/chart.rs) - Register the scene in examples/scenes/src/lib.rs for display in UI (
examples/scenes/src/lib.rs) - Add test assets (e.g., SVG or data files) to examples/assets/ (
examples/assets)
Integrate Vello into a new windowing/graphics framework
- Create new example crate (e.g., examples/custom_framework/Cargo.toml) (
examples/custom_framework/Cargo.toml) - Implement rendering loop using vello::RenderContext and wgpu Device/Queue (
examples/custom_framework/src/main.rs) - Reference examples/with_winit/src/main.rs for event handling and resize patterns (
examples/with_winit/src/main.rs) - Add crate to workspace members in root Cargo.toml (
Cargo.toml)
🔧Why these technologies
- Rust + wgpu — Safe, zero-copy abstractions over GPU compute; cross-platform (Metal, Vulkan, DX12, WebGPU).
- GPU compute shaders (WGSL) — Massive parallelism for 2D path rasterization; superior throughput vs. CPU-bound renderers.
- Monorepo workspace (Cargo) — Tight coupling between encoding, shaders, and core API; easy cross-crate refactoring and version management.
- Virtual textures + sparse binning — Efficient memory layout for dynamic 2D content; avoids redundant GPU transfers.
⚖️Trade-offs already made
-
GPU compute-centric design (not immediate-mode)
- Why: Batch GPU dispatch amortizes overhead; better for complex scenes with many primitives.
- Consequence: Higher latency per single frame; less suitable for instant-response UI interactions but excellent throughput for animation/complex graphics.
-
Monolithic shader pipeline vs. modular compositors
- Why: Simplifies coordination; single GPU dispatch per frame eliminates synchronization overhead.
- Consequence: Adding custom blend modes or effects requires shader recompilation; less plug-and-play than immediate-mode APIs.
-
wgpu as GPU abstraction (vs. raw platform APIs)
- Why: Cross-platform WebGPU/WGPU compatibility; reduces maintenance burden.
- Consequence: Some GPU features unavailable on WebGPU tier; WebAssembly version may be slower than native.
🚫Non-goals (don't propose these)
- Real-time physics or particle simulation (not a game engine).
- 3D rendering (purely 2D graphics focus).
- Retained-mode scene graph (stateless encoder model).
- CPU-fallback rendering (GPU-only, requires device with compute support).
- Direct SVG standard compliance (uses own scene representation).
🪤Traps & gotchas
Edition is 2024 (rust-version = 1.88), which may have limited IDE/tool support. WGSL shaders require wgpu 29.0.1+ precisely (version mismatch breaks compute dispatch). The sparse_strips/ experimental branch is included but not recommended for production—it's an alternative rendering approach still under research. No environment variables required, but GPU drivers must support compute shaders (requires feature detection in wgpu).
🏗️Architecture
💡Concepts to learn
- Prefix sum (scan) algorithms — Core to Vello's parallelization strategy—used to determine tile allocation, path segment distribution, and rasterization work distribution across GPU threads without sequential CPU sorting
- Compute shaders (WGSL) — Vello is compute-centric; rendering happens in WGSL compute kernels rather than graphics pipeline, enabling fine-grained parallelism for path rasterization and clipping
- PostScript/PDF path rendering model — Vello's public API mimics PostScript semantics (fill, stroke, clip paths); understanding fill rules, path composition, and clipping stacks is essential for using the API correctly
- Tile-based rendering — Vello divides the framebuffer into tiles and allocates work per-tile; understanding tile sizes, memory layout, and tile prefix-sum passes explains performance characteristics
- Bezier curve flattening and rasterization — Paths must be converted from Bezier curves to line segments then to pixels; Vello's compute shaders handle this parallelized; kurbo crate provides the math
- Antialiasing via coverage maps — Vello computes per-pixel coverage from path edges in parallel; understanding coverage accumulation and blend modes is needed for correctness in final rendering
- GPU memory layout and WGPU binding groups — Scene data, tile state, and intermediate buffers must be laid out for GPU compute access; WGPU binding groups organize storage buffers—understanding this is critical for debugging performance and correctness
🔗Related repos
linebender/xilem— Primary consumer of Vello; Xilem is the Rust GUI framework using Vello as its rendering backendlinebender/piet— Predecessor project; Vello is designed as a successor with GPU compute focus, same PostScript-inspired API designgfx-rs/wgpu— Core dependency; wgpu provides GPU abstraction layer over WebGPU, WebGL, Vulkan, Metal—Vello's compute dispatch relies on itlinebender/kurbo— Companion crate for Bezier curve and path operations; used for path flattening and geometry calculations in Vellogooglei18n/fontations— Font parsing and rendering; Vello depends on it for glyph metrics and COLR/CBDT colored font support (see examples/assets/ test glyphs)
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add integration tests for shader compilation across platforms
The vello_shaders crate handles GPU shader compilation (WGSL, Metal, SPIR-V). Currently, there's no explicit integration test suite validating shader compilation succeeds on different backends (wgpu, Metal, DX12). This would catch shader regressions early and ensure cross-platform correctness before release.
- [ ] Create vello_shaders/tests/ directory with integration tests
- [ ] Add test that compiles core shaders (found in vello_shaders/src/) with each wgpu backend
- [ ] Verify shader compilation output matches expected SPIR-V/Metal/DX12 formats
- [ ] Integrate into .github/workflows/ci.yml to run on Linux/macOS/Windows
Implement missing_docs enforcement and complete doc comments for public APIs
The workspace lints already forbid missing_docs (rust.missing_docs = 'warn'), but the codebase has incomplete coverage. The vello, vello_encoding, and vello_shaders crates expose public APIs without doc comments. Completing these would improve maintainability and enable docs.rs to render full API documentation.
- [ ] Run
cargo doc --no-depsto identify missing doc comments in vello/src/lib.rs and public modules - [ ] Add /// doc comments with examples for all public functions, types, and structs in vello/src/
- [ ] Upgrade workspace lints from 'warn' to 'forbid' for rust.missing_docs
- [ ] Verify all examples in doc comments compile by running cargo test --doc
Extract render command API documentation from examples/scenes into a standalone guide
The examples/scenes/ and examples/with_winit/ folders demonstrate how to use Vello's rendering API, but there's no formal API guide (unlike doc/ARCHITECTURE.md and doc/vision.md). Creating a doc/RENDERING_API.md would document the Scene builder pattern, coordinate systems, and layering found in examples/scenes/src/lib.rs.
- [ ] Create doc/RENDERING_API.md documenting the Scene builder API and common patterns
- [ ] Extract and explain key examples from examples/scenes/src/lib.rs (SVG rendering, text layout, image handling)
- [ ] Document coordinate systems, transforms, and clipping behavior with code examples
- [ ] Link from README.md and main doc/ARCHITECTURE.md for discoverability
🌿Good first issues
- Add integration tests for vello_encoding scene roundtripping (vello_tests/src/ exists but few tests; add tests that encode/decode complex scenes with transforms, clipping, gradients)
- Document the WGSL shader modules in vello_shaders/src/compute/ with inline comments explaining tile prefix-sum pass and rasterization kernel (code exists but algorithms are underdocumented for new contributors)
- Implement missing benchmark suite for memory allocation patterns (open issue #366 suggests GPU memory strategy needs profiling; add criterion benches in vello/benches/ for tile allocation under various scene sizes)
⭐Top contributors
Click to expand
Top contributors
- @LaurenzV — 45 commits
- @laurenz-canva — 14 commits
- @waywardmonkeys — 11 commits
- @xStrom — 10 commits
- @taj-p — 6 commits
📝Recent commits
Click to expand
Recent commits
9e706bb— Add two more benchmarks for alpha fill rendering (#1615) (LaurenzV)be54e6b— [hybrid]: Truncate gradient luts after upload (#1627) (taj-p)fab8887—vello_hybrid: support blurred rounded rects fast path (#1610) (waywardmonkeys)821b3fb— sparse_strips: Don't enablestdfeature when probing is enabled (#1614) (LaurenzV)ac0a35b— vello_hybrid: Rename may_have_opacities to may_have_transparency (#1613) (upsuper)39ec863— Remove recordings from sparse strips renderers (#1611) (LaurenzV)4445fb3— ci: Update toactions/checkout@v6(#1618) (waywardmonkeys)02c2501— Slightly rewrite theconvolvemethod (#1612) (LaurenzV)1716631— Update wgpu badge. (#1609) (xStrom)c55a2b5— vello: Keep image atlas residency across renders (#1558) (waywardmonkeys)
🔒Security observations
The Vello codebase demonstrates good security practices with a well-maintained Linebender lint set enforcing safe Rust patterns (forbidding unsafe_op_in_unsafe_fn, non_ascii_idents, etc.). No hardcoded secrets, injection vulnerabilities, or misconfigured infrastructure were detected in the provided structure. The primary concerns are: (1) the invalid edition '2024' in Cargo.toml which should be corrected to a supported edition, (2) incomplete lint configuration that requires completion, and (3) ensuring experimental workspace members maintain security standards. No Docker or exposed service vulnerabilities are apparent. The project uses secure dual licensing (Apache-2.0 OR MIT) and maintains proper dependency management through Cargo.lock.
- Medium · Rust Edition 2024 in Cargo.toml —
Cargo.toml - [workspace.package]. The workspace specifies edition = '2024', which is not a valid Rust edition as of the latest stable releases. Valid editions are 2015, 2018, and 2021. This configuration may cause build failures or unexpected behavior. Fix: Change 'edition = "2024"' to 'edition = "2021"' or the appropriate supported edition version. - Low · Incomplete Workspace Lints Configuration —
Cargo.toml - [workspace.lints] section. The workspace lints configuration in Cargo.toml appears to be truncated with 'rust.' without a complete lint name, which could indicate incomplete configuration or a copy-paste error. Fix: Complete the truncated lint configuration line and ensure all intended lints are properly defined. - Low · Missing MSRV Documentation Consistency —
Cargo.toml - [workspace.package]. The comment references keeping RUST_MIN_VER in sync across multiple files (.github/workflows/ci.yml, README.md, CHANGELOG.md). Without visibility into these files, there's a risk of version inconsistency. Fix: Implement automated checks or CI/CD rules to verify MSRV consistency across all referenced files during version updates. - Low · Sparse Strips Directory in Workspace —
Cargo.toml - [workspace] members. The workspace includes many experimental or alternate implementation paths in the 'sparse_strips' directory. These may not receive the same security scrutiny as the main vello crate. Fix: Ensure experimental branches are clearly marked, have appropriate feature flags, and are not exposed in the default build. Regular security audits should cover all workspace members.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/linebender/vello shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live linebender/vello
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/linebender/vello.
What it runs against: a local clone of linebender/vello — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in linebender/vello | Confirms the artifact applies here, not a fork |
| 2 | License is still Apache-2.0 | Catches relicense before you depend on it |
| 3 | Default branch main exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 30 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of linebender/vello. If you don't
# have one yet, run these first:
#
# git clone https://github.com/linebender/vello.git
# cd vello
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of linebender/vello and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "linebender/vello(\\.git)?\\b" \\
&& ok "origin remote is linebender/vello" \\
|| miss "origin remote is not linebender/vello (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
&& ok "license is Apache-2.0" \\
|| miss "license drift — was Apache-2.0 at generation time"
# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 4. Critical files exist
test -f "vello/Cargo.toml" \\
&& ok "vello/Cargo.toml" \\
|| miss "missing critical file: vello/Cargo.toml"
test -f "doc/ARCHITECTURE.md" \\
&& ok "doc/ARCHITECTURE.md" \\
|| miss "missing critical file: doc/ARCHITECTURE.md"
test -f "vello_shaders" \\
&& ok "vello_shaders" \\
|| miss "missing critical file: vello_shaders"
test -f "vello_encoding" \\
&& ok "vello_encoding" \\
|| miss "missing critical file: vello_encoding"
test -f "examples/with_winit/src/main.rs" \\
&& ok "examples/with_winit/src/main.rs" \\
|| miss "missing critical file: examples/with_winit/src/main.rs"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 30 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~0d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/linebender/vello"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.
Embed this chat in your README →
Drop this iframe anywhere — the widget runs against the same live analysis cache as the main app.
<iframe src="https://repopilot.app/embed/linebender/vello" width="100%" height="500" style="border:1px solid #d0d7de; border-radius:8px;" allow="microphone" loading="lazy" ></iframe>