penpot/render-wasm
Andrey Antukh 52b8560b70 Merge branch 'staging-render' into develop 2025-12-30 15:30:56 +01:00
..
docs Improve setting svg attrs in wasm 2025-10-24 10:35:30 +02:00
macros 🔧 Autogenerate serialization values for wasm enums (#7296) 2025-09-16 12:29:14 +02:00
src 🐛 Fix using cache on first zoom after pan 2025-12-30 10:03:24 +01:00
.gitignore Rename to render-wasm and make it load using dynamic import 2024-10-23 17:18:04 +02:00
Cargo.lock 🔧 Autogenerate serialization values for wasm enums (#7296) 2025-09-16 12:29:14 +02:00
Cargo.toml 🔧 Autogenerate serialization values for wasm enums (#7296) 2025-09-16 12:29:14 +02:00
README.md 📚 Add schemas and links to render-wasm README 2025-06-17 14:06:46 +02:00
_build_env Make render wasm import on worker http cache aware 2025-12-11 13:27:20 +01:00
build Merge remote-tracking branch 'origin/staging' into develop 2025-12-12 12:16:41 +01:00
build.rs 🔧 Autogenerate serialization values for wasm enums (#7296) 2025-09-16 12:29:14 +02:00
lint 🎉 Update skia binares to 0.87.0 2025-08-21 07:38:46 +02:00
package.json 🐛 Fix issues on build processs related to render-wasm 2025-12-11 12:41:19 +01:00
test ♻️ Refactor wasm loading strategy on worker 2025-12-09 19:41:19 +01:00
watch Make render wasm import on worker http cache aware 2025-12-11 13:27:20 +01:00
watch_test 🎉 Update skia binares to 0.87.0 2025-08-21 07:38:46 +02:00
yarn.lock 🐛 Fix issues on build processs related to render-wasm 2025-12-11 12:41:19 +01:00

README.md

Penpot WASM render

This is the canvas-based WebAssembly render engine for Penpot.

Rust & Emscripten

This project is a Rust crate that targets Emscripten (wasm32-unknown-emscripten).

We use wasm32-unknown-emscripten compilation target:

  • It compiles Rust code into WASM
  • It generates the JavaScript code (“glue”) to load and run the WASM code

How Rust, Emscripten, and WASM are connected

Skia

We use Skia, an Open Source 2D graphics library. In particular, the render engine uses Skia via custom binaries of the rust-skia crate.

How to build

With the Penpot Development Environment running, create a new tab in the tmux.

cd penpot/render-wasm
./build

You can also use ./watch to run the build on every change.

The build script will compile the project and copy the .js and .wasm files to their correct location within the frontend app.

Architecture overview

Edit your local frontend/resources/public/js/config.js to add the following flags:

  • enable-feature-render-wasm to enable this render engine.
  • enable-render-wasm-dpr (optional), to enable using the device pixel ratio.

How to test

We currently have two types of tests:

  • Unit tests
cd penpot/render-wasm
./test

Technical documentation