<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://jumplink.eu/en/blog/tags/gnome/feed.xml</id>
  <title>Pascal Garber – GNOME</title>
  <updated>2026-10-29T00:00:00Z</updated>
  <link rel="self" type="application/atom+xml" href="https://jumplink.eu/en/blog/tags/gnome/feed.xml"/>
  <link rel="alternate" type="text/html" href="https://jumplink.eu/en/blog/tags/gnome/"/>
  <author>
    <name>Pascal Garber</name>
    <uri>https://jumplink.eu/</uri>
  </author>
  <entry>
    <id>https://jumplink.eu/en/blog/learn6502/</id>
    <title>Learn 6502 Assembly, a GNOME app</title>
    <link rel="alternate" href="https://jumplink.eu/en/blog/learn6502/"/>
    <published>2026-10-29T00:00:00Z</published>
    <updated>2026-10-29T00:00:00Z</updated>
    <summary>Learn 6502 Assembly is a GNOME app with tutorial, editor, debugger and a virtual display, based on Nick Morgan&#39;s easy6502.</summary>
    <content type="html">&lt;p&gt;The 6502 is the processor of the Commodore 64, the NES and the Apple II. Nick Morgan&amp;#39;s &lt;a href=&quot;https://github.com/skilldrick/easy6502&quot;&gt;easy6502&lt;/a&gt; is a web tutorial that teaches its assembly language step by step. I turned it into a native GNOME app: &lt;strong&gt;Learn 6502 Assembly&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;What is in it:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;An interactive tutorial&lt;/strong&gt; that walks through the core concepts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A code editor&lt;/strong&gt; with syntax highlighting.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;An assembler and a debugger&lt;/strong&gt; that show registers, flags and memory while the code runs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A virtual display&lt;/strong&gt; where you see the result, which is what makes small games and graphics possible.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;It is written in TypeScript with GJS and libadwaita, and built with &lt;a href=&quot;https://gjsify.org/&quot;&gt;gjsify&lt;/a&gt;. The repository holds more than the desktop app: the assembler, simulator and disassembler live in their own package, &lt;code&gt;@learn6502/core&lt;/code&gt;, and the same code also drives a web version and an Android app. The tutorial content and the translations are separate packages too, and translating happens on Weblate.&lt;/p&gt;
&lt;p&gt;The app is on &lt;a href=&quot;https://flathub.org/apps/eu.jumplink.Learn6502&quot;&gt;Flathub&lt;/a&gt;. The code is GPL-3.0; the tutorial text is CC BY 4.0, as in the original.&lt;/p&gt;</content>
    <category term="GNOME"/>
    <category term="gjsify"/>
  </entry>
  <entry>
    <id>https://jumplink.eu/en/blog/why-gjsify/</id>
    <title>Why gjsify</title>
    <link rel="alternate" href="https://jumplink.eu/en/blog/why-gjsify/"/>
    <published>2026-10-28T00:00:00Z</published>
    <updated>2026-10-28T00:00:00Z</updated>
    <summary>gjsify brings the standard Node.js and web APIs to GJS, so TypeScript apps and npm packages run natively on GNOME.</summary>
    <content type="html">&lt;p&gt;GNOME apps can be written in JavaScript. The runtime is GJS, powered by SpiderMonkey. But GJS is neither Node.js nor a browser: there is no &lt;code&gt;node:fs&lt;/code&gt;, no &lt;code&gt;fetch&lt;/code&gt;, no &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; and no npm ecosystem waiting for you. Many libraries, whether an HTTP client, a game engine or a crypto library, assume APIs that GJS does not have.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://gjsify.org/&quot;&gt;gjsify&lt;/a&gt; fills that gap. It reimplements the Node.js, web and DOM APIs on top of GNOME&amp;#39;s own libraries:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;You write&lt;/th&gt;&lt;th&gt;gjsify runs it on&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;node:fs&lt;/code&gt;, &lt;code&gt;node:net&lt;/code&gt;, &lt;code&gt;node:crypto&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Gio, GLib&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;fetch&lt;/code&gt;, &lt;code&gt;WebSocket&lt;/code&gt;, &lt;code&gt;XMLHttpRequest&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Soup 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; 2D and WebGL&lt;/td&gt;&lt;td&gt;Cairo, Gtk.GLArea&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WebRTC, WebAudio, &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;GStreamer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;node:sqlite&lt;/code&gt;&lt;/td&gt;&lt;td&gt;libsqlite3&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;This makes the standard APIs available in GJS. Libraries written for Node.js or the browser now run directly on GJS, with no browser engine and no Node.js runtime. There is no wrapper server, no bundled Chromium and no shelling out to Node. The result is a real GTK 4 and Adwaita app that you can ship as a Flatpak and that still speaks the language of the wider JavaScript world.&lt;/p&gt;
&lt;h3&gt;And the other way round&lt;/h3&gt;
&lt;p&gt;If you prefer Node.js or Bun, you can keep using them. For that I built the reverse direction too: the GJS APIs, meaning GTK, Adwaita and everything else GObject Introspection offers, are available under those runtimes as well. So every native API runs on every runtime.&lt;/p&gt;
&lt;p&gt;And it behaves the same there. Tests make sure of that: the same tests check the Node.js APIs, the web APIs, the GObject Introspection APIs and the GJS runtime APIs on each runtime, and the result has to be exactly the same everywhere. That is why you can switch the runtime during development without touching the code.&lt;/p&gt;
&lt;p&gt;It opens up other systems as well: with gjsify you can ship GJS apps for macOS and Windows, as an &lt;code&gt;.app&lt;/code&gt; and &lt;code&gt;.dmg&lt;/code&gt;, or as a program folder and &lt;code&gt;.msi&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;What I wanted from it&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Native on GNOME first.&lt;/strong&gt; GJS is the main target.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The ecosystem, unmodified.&lt;/strong&gt; The test is whether npm packages run as they are. The Excalibur.js game engine, WebTorrent, socket.io, three.js, axios and the Anthropic MCP SDK all run on GJS through gjsify, checked against their own upstream tests.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;One source, several runtimes.&lt;/strong&gt; GJS, Node.js, Bun, the browser and NativeScript. Each package says which of them it reaches, and the build picks the right implementation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;No Node.js required.&lt;/strong&gt; Install, build, run, test, publish and the Flatpak step all run on GJS itself.&lt;/li&gt;&lt;/ul&gt;
&lt;h3&gt;Why I build my apps this way&lt;/h3&gt;
&lt;p&gt;I know TypeScript, the web and its tooling well, and I want to write GNOME apps without leaving that. &lt;a href=&quot;https://github.com/gjsify/ts-for-gir&quot;&gt;ts-for-gir&lt;/a&gt; gives me types for GTK and every other introspected library, gjsify gives me the APIs and the toolchain. My own apps, such as &lt;a href=&quot;https://jumplink.eu/beifahrer/&quot;&gt;Beifahrer&lt;/a&gt;, &lt;a href=&quot;https://jumplink.eu/steuererklaerung/&quot;&gt;Steuererklärung&lt;/a&gt; and &lt;a href=&quot;https://flathub.org/apps/eu.jumplink.Learn6502&quot;&gt;Learn 6502 Assembly&lt;/a&gt;, are the first test: if something is missing, I fix it in gjsify instead of working around it in the app.&lt;/p&gt;
&lt;p&gt;The code is on &lt;a href=&quot;https://github.com/gjsify/gjsify&quot;&gt;GitHub&lt;/a&gt;, the documentation at &lt;a href=&quot;https://gjsify.org/gjsify/&quot;&gt;gjsify.org&lt;/a&gt;.&lt;/p&gt;</content>
    <category term="gjsify"/>
    <category term="GNOME"/>
  </entry>
</feed>