GJSify
Node.js & Web APIs,
running on GJS
Bring the full TypeScript ecosystem to GJS: fs, net, http, fetch, WebSocket, Canvas2D, WebGL and more, all running natively on Linux.
Get started in seconds
$ npx @gjsify/cli create my-app
or run npx @gjsify/cli --help to explore all commands
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.
Project Coverage
116 of 119 pillar entries implemented
Every category in STATUS.md's summary table, rendered as a live progress bar. The data file is regenerated from STATUS.md on every build, so the bars never lag behind reality.
Web Platform Coverage
34 of 59 web standards
Coverage of relevant W3C and WHATWG standards, including 10 APIs that are explicitly out of scope for desktop GTK apps (Service Worker, FS Access, Web Bluetooth, …).
Node.js API Coverage
38 of 41 Node.js modules
User-facing Node modules backed by GLib, Gio, Soup, and native Vala bridges. 3 deprecated or browser-irrelevant modules ship as stubs so dependency checks resolve.
DOM ↔ GTK Bridges
Standard DOM elements, rendered natively
App code uses standard HTML elements. Each bridge translates the DOM lifecycle to a GTK widget — Cairo for 2D, OpenGL via libepoxy for WebGL, GStreamer for video, WebKit for iframes.
HTMLCanvasElement (2D) Gtk.DrawingArea @gjsify/canvas2d Cairo + PangoCairo
HTMLCanvasElement (WebGL/WebGL2) Gtk.GLArea @gjsify/webgl Vala/gwebgl + libepoxy
HTMLIFrameElement WebKit.WebView @gjsify/iframe WebKit 6.0
HTMLVideoElement Gtk.Picture @gjsify/video GStreamer + gtk4paintablesink
Native Vala bridges
@gjsify/terminal-native Posix.isatty + ioctl TIOCGWINSZ + termios for @gjsify/tty
@gjsify/sab-native Cross-process shared memory + futex atomics for @gjsify/worker_threads
@gjsify/tls-native Direct OpenSSL access for @gjsify/tls
@gjsify/http-soup-bridge Native Soup integration helpers for @gjsify/http
@gjsify/http2-native nghttp2 bridge for h2c, push streams, flow control
@gjsify/webrtc-native GLib.Idle signal marshalling for webrtcbin's streaming-thread callbacks
Integration Tests
21 npm packages, end-to-end
Real-world libraries whose own test suites (or a curated subset) run unmodified against @gjsify/*. Catches regressions that polyfill-internal tests would miss.
Parsing
Build tooling
Filesystem
Process & CLI
Networking
Streams & workers
Peer-to-peer