Overview
What makes gjsify different
Three worlds, one runtime
GNOME, Node.js, and the Web have lived in separate runtimes for a decade. gjsify dissolves the boundary — every API lands inside one SpiderMonkey process and shares the same memory, the same event loop, the same GTK main context.
- Gtk 4 widgets
- libadwaita
- GIO file / network / DBus
- GStreamer pipelines
- WebKit, libsoup, Cairo
fs·net·http(s)stream·events·processcrypto·worker_threadsutil·buffer·url- 44 of the 50 stdlib modules
fetch·WebSocket· SSECanvas 2D· WebGL · WebGPU bridge- WebRTC · WebAudio · Gamepad
FormData· Streams · Crypto- DOM events, Mutation/Resize observers
One SpiderMonkey process. One TypeScript codebase. Zero glue between worlds.
For example
Ship a browser game engine — without shipping a browser.
Excalibur.js renders directly into a Gtk.GLArea through gjsify's WebGL bridge.
Pointer, keyboard, and gamepad input flows through GTK4 event controllers, dispatched as W3C DOM events.
Audio runs on GStreamer through the Web Audio API. The whole game lives in one process — the same
one that draws the Adwaita window around it. No WebKit.WebView, no IPC bridge, no
embedded Chromium.
Where to go next
Section titled “Where to go next”- How It Works — the build pipeline: auto-aliasing,
--globals auto, native prebuilds - Coverage — how complete the Node, Web and bridge surfaces already are
- Showcases — end-to-end apps that run unchanged on GJS and in the browser
- Getting Started — scaffold and run your first app