Skip to main content

Stories Behind Satori

by Shu

The potential candidates for Satori included:

  • Canvas-based solutions lacked dynamic behaviors (e.g., layout) and APIs.
  • Web Browser-based solutions were too slow
  • SVG-based solutions were the perfect balance of the two, being fast and dev-friendly (HTML/CSS)

However, SVG solutions lacked layout support. Given that SVG and HTML + CSS are alike, we can convert HTML and CSS to SVG. We can calculate the elements' positions through a layout engine and convert them into SVG markups.

This is already done by an open-source project facebook/yoga. Converting it into WASM will also benefit by targeting Web Workers. Using a WASM-based approach also unlocked the possibility of running it on edge. Introducing support for WebAssembly at the Edge.

After simplifying the syntax with JSX and simple CSS, Shu used RazrFalcon/resvg and yisibl/resvg-js to convert the SVG image to PNG.

The Vercel team dogfooded this for a while. They also added Google Font's ?text= API, containing a specific subset of the CJK library and rendering things on the fly. The same applies to emojis.