Overview
GJSify is a TypeScript framework for native Linux apps. You build GTK 4 / Adwaita applications, games and CLI tools against the APIs you already know — Node.js modules, Web standards, the DOM — and GJSify maps them onto the GNOME platform.
The runtime is a build-time decision, not an architecture decision:
- On GJS, GNOME’s JavaScript runtime, GJSify implements the Node.js and Web APIs on top of Gio, libsoup, Cairo and friends.
- On Node.js, Bun and Deno, GJSify implements the GJS side —
gi://imports and the GObject type system — through the node-gi reverse bridge, which runs the same unchanged GObject-Introspection code on Linux, macOS and Windows. - In the browser, the same source runs as a web app, with the Adwaita design system carried over as Web Components.
This also makes GJSify a bridge between the web and the native desktop in both directions: web code runs inside native GTK windows, and the native look and feel travels to the web. See Runtimes for the full picture of what runs where.
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”- Getting Started — scaffold and run your first app
- Runtimes — GJS, Node.js, Deno, Bun and the browser: what runs where
- 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