<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://jumplink.eu/en/blog/feed.xml</id>
  <title>Pascal Garber – Logbook</title>
  <updated>2026-10-30T00:00:00Z</updated>
  <link rel="self" type="application/atom+xml" href="https://jumplink.eu/en/blog/feed.xml"/>
  <link rel="alternate" type="text/html" href="https://jumplink.eu/en/blog/"/>
  <author>
    <name>Pascal Garber</name>
    <uri>https://jumplink.eu/</uri>
  </author>
  <entry>
    <id>https://jumplink.eu/en/blog/new-site/</id>
    <title>A new jumplink.eu, with a new look</title>
    <link rel="alternate" href="https://jumplink.eu/en/blog/new-site/"/>
    <published>2026-10-30T00:00:00Z</published>
    <updated>2026-10-30T00:00:00Z</updated>
    <summary>Time for a redesign. More colour, more life, and the view from the Cuxhaven dike at the top of every page.</summary>
    <content type="html">&lt;p&gt;It was time for a redesign again. The old design had become too grey, too heavy on text and out of date:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://jumplink.eu/blog/2026/new-site-old.webp&quot; alt=&quot;The old site: a grey single-column CV with a photo and a pixel font&quot; loading=&quot;lazy&quot;&gt;&lt;/figure&gt;
&lt;h3&gt;The look&lt;/h3&gt;
&lt;p&gt;I did not want to give up the pixel-art look, but I wanted more colour and more life on the page. I live in Cuxhaven, so every page opens with the view from the dike: sky, sea and, on the horizon, the Kugelbake, the town&amp;#39;s landmark beacon. If your system is set to dark mode it is evening, with moon and stars; otherwise it is day.&lt;/p&gt;
&lt;p&gt;The scene moves. The waves roll, container ships, fishing cutters and gulls pass by during the day, shooting stars and aircraft at night. If you asked your system for less motion, you get a calm still picture instead.&lt;/p&gt;
&lt;p&gt;On the home page I stand in front of the water myself, as a pixel figure. It was made with AI, but locally on my own computer: with ComfyUI, the FLUX.2 Klein 4B model and the &lt;code&gt;pixel-art-sprite_limbicnation&lt;/code&gt; LoRA.&lt;/p&gt;
&lt;p&gt;Everything else stays calm: text stands free on the background with hardly any boxes, set in Adwaita Sans, GNOME&amp;#39;s typeface. The only pixel font left is the one for my name in the sky. A few words are borrowed from the RPGs I like: the CV lists quests and items, the skills form a small skill tree, and the blog is the Logbook.&lt;/p&gt;
&lt;p&gt;By the way, a small hint: click the moon or the sun to switch between day and night. Maybe a few more little gimmicks will turn up over time. :)&lt;/p&gt;
&lt;p&gt;The site sets no cookies, has no tracking and loads nothing from other servers. The old site is kept in the repository under the tag &lt;code&gt;v2-riba&lt;/code&gt;.&lt;/p&gt;</content>
    <category term="Website"/>
    <category term="Pixelart"/>
  </entry>
  <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>