A development workspace that bundles several related projects around GJS (GNOME JavaScript), TypeScript typings for GObject Introspection, and a handful of GNOME apps that build on top of them. Each project lives in its own repository and is pulled in here as a git submodule, so you can clone once and have everything ready to hack on side by side.
This repo is not itself a buildable project — there is no shared package.json, no shared toolchain. It only exists to make cross-project work easy: searching across all sources at once, keeping branches in sync, and sharing a single IDE window.
| Directory | What it is |
|---|---|
| gjsify/ | Node.js, Web, and DOM APIs for GJS. Lets you write GJS apps that use fs, fetch, Buffer, WebSocket, Canvas, WebGL and friends — backed by native GNOME libraries (Soup, Gio, GLib, Cairo, GStreamer, WebKit, …). |
| ts-for-gir/ | Generates TypeScript typings from GObject Introspection (.gir) files. Produces the @girs/* packages that every other project in this workspace uses for type-safe GTK/Adwaita/GJS code. |
| gnome-shell/ | A TypeScript-friendly fork of GNOME Shell — used as a proving ground for typings and tooling against a real-world GJS codebase. |
| easy6502/ | A 6502 assembly learning environment with three frontends (GNOME desktop, web, Android) sharing a common TypeScript core. Real-world consumer of @girs/* and GJS apps. |
| eu.jumplink.Learn6502/ | The Flathub manifest for the Learn6502 desktop app (the GNOME frontend of easy6502). |
| pixel-rpg/map-editor/ | A tile-based RPG map editor built with Excalibur.js (browser) and GTK/Adwaita (GJS desktop) sharing a core. |
| doc-old/ | Archived legacy documentation site. Kept for reference. |
ts-for-gir
│
▼
@girs/* types ─────────┐
│ │
▼ ▼
gjsify ────────▶ easy6502, pixel-rpg, gnome-shell, …
(Node/Web/DOM APIs (apps that run on GJS)
on GNOME libs)
ts-for-gir produces typings from introspection data. gjsify provides the runtime shims so ordinary Node.js and Web code can run under GJS. The apps use both. The upstream GJS runtime itself is not vendored at this level — it lives in gjsify/refs/gjs when a source reference is needed.
Clone everything in one go:
git clone --recurse-submodules git@github.com:gjsify/workspace.git
cd workspaceIf you already cloned without submodules:
git submodule update --init --recursiveEach subproject has its own README and AGENTS.md with build instructions. Start with the one you care about:
cd gjsify && yarn install && yarn build
# or
cd ts-for-gir && yarn install && yarn start
# or
cd easy6502 && yarn install && yarn buildEvery directory above (except pixel-rpg/, which is just a container) is an independent git repository. That means:
- Commits happen inside the submodule.
cd <project>, branch, commit, and push there. - Bumping the pointer is a second step. After pushing in a submodule, come back to the workspace root and run
git add <project> && git committo record the new version here. - Don't run
git submodule updateblindly. It resets submodule working trees to the pinned commit and can discard local work. Checkgit statusinside each submodule first. - Cross-project changes stay in separate commits. One commit never spans two submodules — each repo has its own history.
If you're just using one of the projects (e.g. installing @gjsify/fetch from npm, or trying out the Learn6502 Flatpak), you don't need this workspace — grab the individual project instead.
This workspace is for contributors who regularly touch multiple projects in the same session: making a breaking change in ts-for-gir and updating the consumers, debugging a GJS runtime issue while fixing it in gjsify, prototyping an app feature across easy6502's shared core and the GNOME frontend, and so on.
This workspace itself has no code — only submodule pointers. Each subproject is licensed under its own terms (MIT, LGPL, ISC, Apache 2.0, …); see the individual repositories.