I’ve been an unapologetic fan of the Lenovo “classic” 7 row keyboard in the ThinkPad X220 and have been using the external version of it ever since. This USB laptop keyboard chassis is called the SK-8855 which was manufactured in the late 2000s and early 2010s and is now essentially unobtainium from everywhere. The SK-8855 features a TrackPoint but lacks a trackpad – which is actually a feature for me. It’s rarely available on eBay as new-old stock for several hundred dollars. Over the last 10 years I’ve replaced the keyboard several times due to literally wearing it out, and finding genuine NMB replacement keyboards is getting harder and harder — but not impossible.
For the last 10 years I’ve dealt with a few little quirks. Sometimes the controller board essentially sh*ts itself and crashes, but it could always be coaxed back into life by removing and reinserting the USB-A plug. It’s also guilty of missing a quick left-shift press, so typing fast my sentences never get capitalized. Over the years a few people have commented on my lack of grammar skills and until very recently I had this controller board to blame.
After over 15 years of being blamed for all my typos, the controller board gave up completely. This gave me the “opportunity” to replace it with a modern converter board and bring it into the 2020s. A good analogy is putting a Tesla electric drive-train in a classic Ferrari with a blown engine.
This required removing some plastic supports, which made me feel like the worst computer peripheral conservator in existence. After removing the USB-C connector the new controller could be mounted and wired up to the existing USB wire.
In most part it worked as a keyboard, but was set up with the en_US keymap and didn’t do anything for the # key for instance. I ran the provided non-free win32 tool in Wine but that just showed some really tiny Chinese text. It also crashed a lot and I couldn’t work out the pinmap format that it was writing.
After being inspired by Christian, I asked Claude to analyse the updater binary and tell me what it knew, and after allowing it device access it essentially reverse engineered the hardware. I actually bought two new controller boards and so I was a little more comfortable letting Claude actually drive the keyboard itself — and every now and then it would ask me to press specific keys and tell it if certain LEDs were on or off. After a full day of Claude-ing (never leave a hardware geek alone with minimal chores for a weekend day…) I had two things:
xykbms-gtk is a GTK4 standlone version of the vendor tool that works in Linux using hidraw. Using this I could swap, remap and disable keys and change all the other parameters on the controller board. I’ve not submitted this to Flathub as it’s 80% AI generated and more than niche; if you’re soldering stuff into a SK-8855 then you’re more than qualified to do meson build. It does work remarkably well considering I had no kind of datasheet or firmware source code for the controller at all.
The other thing was a fwupd plugin for this new keyboard controller. I actually manually created the fwupd plugin template with lots of TODOs in the right place to define the structure and then pointed Claude at the protocol documentation it had created for the GTK4 tool and asked it to fix all the TODOs in the plugin. After another couple of hours of questions and verb-ing from Claude we had a fully functional fwupd plugin that could not only update the firmware on the controller but could also write a “pinmap” that could reconfigure the keyboard between en_US and en_GB etc. I think this worked so well because we have so many self tests and linters in fwupd; Claude was forced to do the right thing before it could even run git commit.
The keyboard pinmap wasn’t really a “firmware” per-se, so I then also got Claude to create a WriteBlob method that allows fwupd to write a raw payload on a CFI-type device. This will also be super useful in the future to flash SPI devices with the existing CH341a and CH347 plugins. This is only available for CFI flash devices and for users that authenticate with the admin password – for obvious reasons.
I then wrote the GNOME Firmware code to be able to flash a CFI image from the GUI. It’s not beautiful yet and we probably need a dedicated app, or a dedicated “mode” in gnome-firmware to make flashing CFI devices safe and easy. I’ll add a screenshot when I’m happy with the UX.
I’m using this keyboard right now, and maybe it can last another 15 years of abuse from me.
Walking up to the Fedora & CentOS booth on the first day of DevConf US in Boston, I was not quite sure what to expect.
Although I have attended the Czech Republic variant of DevConf several times, this was my first time attending the US event.
I was there as part of Red Hat’s joint Fedora and CentOS community presence.
What I found over those two days was not just a chance to hand out stickers and talk to Fedora Linux users.
It was a useful reminder in what the Fedora event strategy needs to become.
The setting: Red Hat tech on a university campus 🔗
DevConf US is a community conference focused on developers and Red Hat technologies.
Being held on the Boston University campus during the academic semester meant we knew we would see students.
What I did not fully anticipate was how the increased student presence here would reshape what I thought our booth should accomplish.
Alongside my colleagues Shaun McCance, Matthew Miller, Amy Marrich, and To Hung Sze, we staffed a joint Fedora and CentOS table.
We kept the booth table light, compared to other events.
We did not have any laptop demos, elaborate staging, or any fancy technical displays.
We brought ourselves and our trusty Pelican event box full of stickers, lanyards, pins, and swag.
Most people who stopped by the table already knew Fedora, or at least recognized the logo.
Most were students, but not all.
We also met faculty members, industry professionals, and contributors to other open source projects.
However, there was an unmistakable pattern among the students who approached us.
For nearly all of them, their first real exposure to Linux happened in university computer science labs.
And in university labs, Ubuntu is almost universally the default.
For these students, Ubuntu was not simply a distribution preference.
For them, Ubuntu was Linux.
What surprised me most was that they were not defensive about it.
They were genuinely curious.
They wanted to understand what else was out there, how different systems fit together, and why alternative distributions mattered.
The subsequent conversations with those students are some of the most interesting, fun conversations to have at a Fedora booth.
That curiosity opened the door to talk about Fedora’s foundational place in the broader Linux ecosystem.
When you use Fedora, you are standing directly at the upstream source of enterprise Linux everywhere.
For the curious, the pitch goes something like this.
Every three years, Fedora branches to become the foundation for CentOS Stream, which in turn feeds directly into Red Hat Enterprise Linux (RHEL).
However, the reach does not stop with Red Hat products, which is often unknown to most students.
Downstream enterprise rebuilds like AlmaLinux and Rocky Linux trace their lineage back through CentOS Stream to Fedora.
Furthermore, hyperscalers stand out as interesting downstream operating systems too.
For example, Amazon Linux is derived from Fedora Linux.
And this year, Microsoft announced that Azure Linux, their custom hypervisor container OS, will base its future architecture on Fedora.
So, when you study and use Fedora, you are not just learning another distribution.
You are standing at the mouth of the river.
You see the innovations before they flow into every major cloud provider and enterprise datacenter in the world.
The students understood that value proposition immediately.
They grasped the architectural power of being upstream.
However, the conversations that truly resonated were not about packaging flags or kernel versions.
They were about careers.
Students were asking how to build practical skills, how to level up beyond coursework, and what industry engineering teams actually look for.
A handful asked specifically about how to contribute to open source and get involved with Fedora.
That is where I realized what our booth was missing.
We had no clear call to action.
We could explain the architecture, and we could illustrate the ecosystem on a whiteboard, but we could not smoothly shepherd someone from curiosity to contribution.
We lacked a concrete on-ramp.
We had no printed guide explaining the first three steps to take after leaving the venue.
We had no five-minute interactive exercise someone could complete right at the table to earn something tangible.
Instead, we offered a sprawling overview of "everything you can do in Fedora," which is paralyzing when you are just getting started.
What hackathons taught me about student engagement 🔗
Years ago, as a student at RIT and a Fedora Ambassador, I staffed more than a few Fedora booths at collegiate hackathons like HackMIT and Bitcamp.
Back then, I learned a vital lesson about engaging students: they need hands-on, achievable activities.
Students need something doable, self-contained, and repeatable.
Most importantly, they need something they can earn.
A unique reward, like an event badge or a milestone achievement, creates an enduring memory.
A standard sticker gets lost in a backpack; a challenge you solved at a booth creates a personal reason to stay connected to the community.
Executing a commercial trade-show booth strategy at a student-heavy venue does not work.
Commercial attendees often browse passively for vendor solutions; students are actively planning their futures and want to understand how distributed engineering collaboration functions in the real world.
Free Software and open source are precisely that, but we have to frame them to meet their goals.
If we want to translate curiosity into long-term community contributors, our playbook needs three tangible upgrades:
Tailored on-ramp materials:
Brief, well-structured guides that explain what our sub-projects do and provide clear first tasks for beginners.
Audience-specific talking points:
Equipping booth ambassadors with prompts geared toward early-career engineers, highlighting the practical career value of public upstream contributions.
Interactive booth challenges:
Short, five-minute exercises that allow attendees to make a small contribution, file a test ticket, or solve a puzzle right at the table.
So, should Fedora & CentOS return to DevConf US?
Absolutely.
DevConf US is a fantastic venue, but next time we must arrive prepared for the audience in the room.
The curiosity is already there.
We just need to build the bridge that lets them cross over into upstream work.
One of the things you get to do after being laid off is a lot of reflection, but also to revisit all the old projects you used to contribute to.
One of them was Pidgin: “the universal chat client”.
The new Pidgin 3 app icon and a handful emoji
I designed the original emoticon set for version 2 and helped redesign the user interface when the project was renamed from Gaim after a legal dispute.
I’ve been meaning to start live streaming my weekly app icon work to share a look in the kitchen of the icon design process, but once I gathered the courage to start a test run, the experience wasn’t amazing.
I need something I can return to consistently without needing a new plan every time…
So why not create a base set of 1,447 emoji for Pidgin in GNOME-style exclusively live on stream? What could go wrong?
Here’s the design file to keep me accountable, so I can’t sneakily make progress offline!
Twitch
I’ll be chipping away at it a few times a week. Follow me on Twitch to get a notification when I go live. We’ll grab a cup of tea, put on some music, and get through the winter.
If you want to support my design work for Free and Open Source projects, I’m always looking for more sponsors.
I started this blog 22 years ago now (I don’t recommend going back to the start), and for the last 5 years I wrote a monthly “status update” post, aiming to mainly write about interesting stuff I might have done in the world of open source software, which I hoped in turn would motivate me to do more interesting stuff in open source software.
The world changed a lot in that time. If I started now this would probably be a podcast with 16 listeners, instead of being a WordPress blog with 16 subscribers.
I’ve spent a lot of time this year reading and thinking about the impact of large language models on the tech industry and open source. Its interesting because this feels like the moment, whether we like it or not, hacker culture goes mainstream. This week the world’s major news outlets had to figure out what PHP is.
That the BBC’s cyber correspondent didn’t know PHP existed has caused some joking and debate online.
24 years ago I was figuring out what PHP is. Jonathan Atkinson, who I met in a forum that was nominally about writing video games in QBASIC, asked me to make a wiki in PHP. So I did.
All I knew about wikis was that, it’s like a regular website except anyone can edit it. I named the project: Wiki! Here’s a quote from the README:
How do I install it?
It's best run in its own directory. Create it one. You'll also want a directory for nodes,
or you could keep them in the base wiki dir. Either way, the nodes directory has to be
chmod'ed to 777.
You might raise your eyebrows at that comment if you aren’t yourself a teenage hacker discovering web development.
Wiki! did have a login system, and the passwords were even stored as MD5 hashes rather than plain text, as I heard that was good practice. In hindsight, an attacker who knew how to set the HTTP Cookie header could impersonate anyone, like this: Cookie: wikiticket=admin.
Here is a snippet of the file edit.php. Note that $node and $title are inputs you can set via a POST request, or even via URL parameters like edit.php?title="/etc/passwd":
$t=$title;
if ($node) {
// Write new data
//
$file=fopen($nodedir.$t.".wiki", "w+");
$node=stripslashes(ereg_replace("(\r\n|\n|\r)","<br>", $node)); // Linebreak to <br>
fputs($file, $node."\n");
Even if you just learned what PHP is today, you might see that this is not an entirely secure design.
Anyway, at the time I was proud of my work, and I needed somewhere to host it. So, as you would in 2002, I registered the name “wiki” on sourceforge.net and uploaded the project code.
Sourceforge, for those who haven’t yet reached middle age, was the 2000’s equivalent of Github. It allowed projects to have their own website, as long as they included the Sourceforge logo somewhere, and the website could use PHP. Perfect, I thought, the project’s website will be a wiki!
Looking back now through archive.org, I can see this code actually ran in public for many years.
I have a local copy from around this time, which includes indexjon.wiki:
Sam, there are some serious bugs in this wiki. I keep on getting 'document contains no data' errors; get me on AIM.
Welcome to grove.swoo.net. You may or may not be interested in the [weblog].
JonathanA - 29/8/02 - 11:36 am
JonathanA - 29/8/02 - 07:36 am
One is “Non chiederci la parola che squadri da ogni lato” by Eugenio Montale, written in 1923, and presumably posted by a fan. Does anyone know what it’s about? A machine translation suggests it might discuss “the crisis of certainty faced by contemporary man”. The other is “Anecdote for Fathers” by William Wordsworth, in Russian via an unnamed translator.
Let’s just sit with that for a moment. Imagine what happens in 2026 if a trivially exploitable PHP website hosted by a US corporation goes online: it’ll be mining bitcoin, serving pornography and drowning in racist and antisemitic spam, probably all within the same day.
In 2003, over the course of six months, my naive implementation of a wiki was gifted with… two rather thoughtful poems.
Fast forward another year. I was about to turn 18 years old, was studying for A levels and mostly concerned with hanging out in the park drinking cheap cider and learning to play the guitar. I was certainly not thinking about this rather flawed chunk of PHP code that I’d written two years earlier, but via the magic of archive.org we can see that various people were genuinely trying to use it as a wiki: https://web.archive.org/web/20041121113508/http://wiki.sourceforge.net
In hindsight, perhaps it attracted so much attention because I’d literally taken the subdomain: http://wiki.sourceforge.net/, unintentionally boosting the SEO reach quite a bit. The site was still active right up until 2007.
I can’t find it now, but I do remember receiving an email at some point from sourceforge.net noting that they’d taken down the wiki! website after discovering it was a major security risk. And at some point they must have (quite reasonably) reclaimed the project name as well, since http://sourceforge.net/projects/wiki no longer exists. It will always live on in my heart, though, and for the moment at: https://web.archive.org/web/20021014172056/http://sourceforge.net/projects/wiki/
The world has changed significantly since I was a teenage hacker. Some of what I learned in those days is completely obsolete, such as the QBASIC programming language and VGA graphics. I am a world expert in these irrelevant topics.
Other stuff that I picked up in the early 2000s has become the foundation of my career as an operating systems developer: C programming, Linux distributions and an gradual induction into open source desktop world via Planet GNOME. And good old PHP, of course. Who knew that, a quarter way through the 21st century, PHP would be front page news?
Age 18, I didn’t tell anyone in the real world that I’d written a wiki because it’d be the first time they’d heard the word “wiki”. The word evoked exotic and mysterious feelings of Hawaii in 2002. Now it universally evokes Wikipedia. People are learning about password hygiene and PHP. The arrival of AI on the scene, to me, fits into this bigger picture that began in the last century: we, the Computer People, are becoming Mainstream.
Lots of internal changes to clean up caches, improve performance, lower peak memory consumption, avoid crashes.
If you’re looking for user visible changes there is
Pdf Export using Typst
A new article list layout with larger thumbnails (the old layout is still available)
A re-designed article view menu (thanks Tobias Bernard)
Much improved Gtk HTML view
Its now possible to continue listening to a podcast while browsing other content
Lots of other goodies in the complete changelog. Check it out on the flathub beta channel.
This week, my first contributions to GTK were merged!
GTK now implements the applicationShouldHandleReopen:hasVisibleWindows: delegate method on macOS. This method gets called when an app that is already running gets reactivated, for example when the user clicks its dock icon again, double-clicks the app in Finder, or clicks on the media controls in control center. This is important for apps that keep running after their window has been closed. A typical use case is a music player that continues playback in the background. Before this, reactivating such an app gave it no chance to respond, so there was no way to bring the window back. Now, the GtkApplication now receives the activate signal, just as it does on GNOME when an already running application gets launched again. Apps that already handle activate by presenting or recreating their main window will get the expected behavior on macOS now as well without any platform-specific code.
The second contribution is a small fix, which solves an issue that the native “traffic lights” controls (close, minimize and zoom) stayed visible, even when the window had asked for no window buttons to be shown.
Maybe some of you can guess which app needed these fixes :)
A long-standing bug that caused the “unresponsive page” dialog to reappear forever when the page became responsive again while the dialog was shown has been fixed. As an additional refinement, the dialog will be closed automatically if WebKit reports that the page starts responding again.
Several upstream dependencies released security fixes so we bundled them into Fractal 14.2 to make sure that everything runs smoothly until the next release!
As usual, you can also help make sure the next major version is solid by using Fractal Nightly. Help on fixing our remaining bugs is of course always appreciated!
Saldo 0.9.0 is now available. Saldo is a FinTS banking application that connects to your bank and displays your balances and transactions.
This release modernises the application’s user interface with current libadwaita widgets and redesigns the account creation, transfer, category and settings dialogs for a more consistent experience. It also introduces an option to reset the database, updates the FinTS bank database, and resolves several issues affecting background operation, password changes and account refreshing. Available at Flathub: https://flathub.org/de/apps/org.tabos.saldo
🎉 New Release Announcement: GstPipelineStudio v0.7.1 🎉
GstPipelineStudio version 0.7.1 is out! This bugfix release refreshes the application icon, now drawn in the GStreamer colors, and makes pipeline import keep the links to pads created at runtime.
What’s new in 0.7.1:
Application icon redrawn in the GStreamer red, green and blue, with the node graph running right to left
Importing a gst-launch description keeps links to pads that only appear at runtime (urisourcebin, demuxer outputs)
Big Buck Bunny preset switched to the AV1/Opus sample
Highlights of the 0.7.x series:
New application icon
Nodes colored by type: source, transform, sink
Swap a node for an alternative element from its context menu
Tags tab listing tags from bus messages
Sortable columns in the element and pipeline lists
Suggestions reuse a compatible free element already in the graph
Space bar toggles play/pause, s stops the pipeline
Explicit properties are kept when importing a pipeline
German translation added
Participants:
Stéphane Cerveau — maintainer and main contributor
Custom Command Toggle lets you add fully customizable toggle buttons to the Quick Settings menu. Turn shell commands, services, or your own scripts into toggles integrated directly into the GNOME panel.
Key Features:
Run commands or launch scripts from toggle buttons
Configure initial toggle states and startup behavior
Create custom dropdown menus from toggle buttons
Synchronize toggle states with a command’s output
Assign keyboard shortcuts to buttons
Import and export button configurations
The latest release adds support for creating dropdown menus on toggle buttons to run additional commands, adding even more functionality to your toggling experience. Italian, Dutch, and French translations have been added thanks to some contributions from the community. Other improvements include some under the hood bug fixes and performance improvements.
GNOME Latam 2026 brings together developers, system administrators, educators, designers, and open source enthusiasts from across Latin America. Building on previous regional collaborations, including our work with CCOSS, the event is more than a conference: it’s a community effort to grow, empower, and sustain the GNOME ecosystem in the region.
The program will include keynotes, technical workshops, panel discussions, and networking sessions, both in person and online. Our goal is to share knowledge and build lasting collaboration across borders.
Our Mission
To drive the adoption, development, and sustainability of GNOME and its software ecosystem in Latin America, while promoting the core values of free software: freedom, collaboration, openness, and transparency.
We believe access to technology should be universal, and that diverse perspectives, from experienced contributors to newcomers joining through community initiatives like CCOSS, are essential to inclusive innovation.
Goals
Outreach: Showcase the latest developments, roadmaps, and releases in the GNOME ecosystem.
Learning: Offer sessions for everyone, from users getting started with free software to developers who want to contribute code, design, or QA to GNOME.
Regional community: Strengthen the network of free software communities in Latin America through mentorship and collaboration with partners such as CCOSS.
Accessibility and inclusion: Use a hybrid format to remove geographic barriers and welcome participants from all backgrounds.
Get Involved
Code of Conduct: All in-person and online activities follow the GNOME Code of Conduct to ensure a safe, respectful, and harassment-free environment for everyone.
We hope to see you in Mérida or online!
GNOME Latam Team
latam@gnome,org
That’s all for this week!
See you next week, and be sure to stop by #thisweek:gnome.org with updates on your own projects!
As of today, Flathub Discourse is read-only.
Existing threads stay available, but it is no longer possible to start new
topics or reply.
We opened the forum back in 2020 as a place for asynchronous
communication that isn't GitHub issues or IRC. Realistically, it never took
off, becoming another issue tracker to keep an eye on. A forum where people
post and wait for an answer that never comes is worse than no forum at all.
Problems with an app: the issue tracker of its repository, linked as
"Manifest" on the app's Flathub page. Issues with Flathub itself go to
flathub/flathub.
App requests: Flathub doesn't take them. Ask the app's developers to
submit it, or do it yourself.
Runtime announcements: runtime projects such as freedesktop-sdk are
welcome to post them on this blog.
Thanks to everyone who answered questions there over the years.
Time for a new Crosswords release! This is a good one. This past cycle features two major changes: the game got a major visual overhaul, and the Acrostic Editor is no longer in Beta.
This release is dedicated to Luciana. She contributed the adorable artwork for libipuz, and is a budding cruciverbalist. She’s currently having a bit of a tough go of it healthwise, so please join me in sending her good wishes. We’re all rooting for you!
New Game Layout
The game mode got a complete rework this cycle. We moved the Across /Down labels into the header, and added independent header bars for each column. This work was designed by “gnoman”, who did a fabulous initial mockup, and then provided a lot of additional feedback as we iterated through possibilities. The end result looks so much better than before, and is orders of magnitude better than anything I dreamed of when I started this project.
Initial mockup from “gnoman”
Every aspect of the game looks better, especially single-column mode. That now has a bottom drawer for the clues. Take a look at how it resizes:
I had to heavily adjust the reflow animation to deal with the updated appearance. For better or worse, this layout cannot be done with stock GTK/libadwaita containers and needs a complex custom layout widget. It’s a pain to edit, but it also means that we control every stage of the animation process. We handle things from reparenting buttons to panel changes. The direction switching even cross-fades between the label and the toggle instead of snapping. It’s a small thing, but it makes the whole animation silky smooth.
“Gnoman” also contributed animated SVGs for the “How to Play” dialog. Florian migrated us to the new GTK SVG animation framework, and we’ve ended up with an even slicker, charming intro screen.
Acrostic Editor Is No Longer Beta
A few years ago, Tanmay added acrostic support to the game. This puzzle type was fun-looking! But since we didn’t have a ready source of them, he started working on editor so we could write our own. He got something basic working but it wasn’t reliably usable. The problem was the grid autofill feature: it was just too slow. It worked by doing a DFS through the possible anagrams with a random answer shape. Sometimes it found results, most of the time it did not.
This cycle, I went back to try and fix it and now have something usable. As sometimes is the case, the trick to get it working turned out to be really simple: We just had to try a new random shape after 30K iterations or so. It was a small change to the code — just a counter. But we ended up with something that could find grids with regularity.
Once that started working I went back and fixed up the rest of the workflow. The Quote/Source entries are now instant apply and you can manually edit entries in the list. There’s an info panel that gives acrostic stats and an overlay pane to mark progress. It looks a lot better — and works! I’ve used it to create three acrostics already and have more coming. Take a look:
New Generic Widgets
As part of working on the Acrostic Editor, I wrote some new widgets. These are not crosswords-specific, and are written so that people can cut-and-paste them into their app (if it’s GPLv3 compatible). They’re targeted for internal use but maybe would be useful for others.
The more interesting of the two is XwdRichTextRow. It’s an alternative for AdwEntryRow that uses a GtkTextView instead of a GtkEntry. It has two features that the libadwaita widget doesn’t:
An :n-rows property to set the number of visible rows. If set to 1, it matches the pixel extents of AdwEntryRow. But larger numbers will provide additional lines of editable space. A vertical scrollbar is provided once the row count gets large enough.
Rich text editing. It supports bold, italic, strikethrough etc, and provides a convertor from pango markup to-and-from the widget. I wrote it in such a way that a markdown convertor could be written as well.
It’s not as comprehensive as AdwEntryRow yet: it doesn’t support prefix/suffix widgets, emojis, or an apply button, and there are probably a lot of bugs. It also will never support GtkEditable, due to the GtkTextBuffer underpinnings. But it may be useful and fill a niche that I, at least, have felt a void for a while.
I also wrote XwdInfoButton, which is basically a simple menu button that creates explanatory popovers. It should be used sparingly, but for a really complex app like the editor I think it can help demystify some sections. It takes a markdown string as its format.
Info Popover
Let me know if you have any interest in using these widgets.
Non-Distro Builds, And a Plea For Help
Crosswords has built on macOS for a while thanks to Vinny’s heroics, but nothing stopped us from breaking it. He’s fixed that: we now have a macOS arm64 CI job, building against Homebrew with Apple clang. Now macOS-specific errors can be caught at commit time.
Vinny also provided an MR for building bundles as part of the build process! I’d love to have bundles available to go with the flatpaks we create. However, I have neither a Mac to test on, nor the skills to evaluate this MR. I would deeply appreciate if anyone can help test and evaluate this!
Crosswords running on a Mac
Florian also did another build of Crosswords for Android and created another APK. It’s still pretty buggy, but it’s significantly better than the previous release. I think we can get it usable with a little more effort.
Android Build
Other Features
A grab bag of the rest:
The metadata tab now has rich text editing throughout and was reorganized into a vertical layout.
The Language and Country rows let you set the puzzle’s $LANG and Charset. A new layer warns about letters that aren’t in the alphabet. It was shockingly complex to write.
Rows for setting $LANG
Word lists now show synonyms in clue definitions.
Definition and synonyms of “RAISE”
The Editor preview window uses the real game widget.
We enabled large text for printing. Toluwaleke did most of the work already a few releases back, it just needed a template.
Added support for the Czech CH digraph, mirroring the existing Dutch IJ digraph.
Laureen has been steadily working on a grid generator for vocab puzzles. None of it is visible yet — it’s all generator code — but it’s a solid basis for the next game type.
I fixed a massive leak with all the PuzzleTasks. Turns out we weren’t freeing them at all due to a ref loop. Not a big deal with the normal autofill behavior, but once we started running it every keypress the leak grew fast.
Thanks!
This release, thanks to:
Rosanna for tireless help with UI word-smithing and editing, as well as endless patience.
“Gnoman” for the amazing design for the revamped play mode, the animated SVGs, and general design support.
Tobias for design support and advice throughout the Circle process.
Florian for the port to GTK4’s new SVG widget and other fixes.
Vinny for macOS input method support and the macOS arm64 CI job, and in general amazing build gardening.
Michel for build and license advice.
Laureen for continued work on the vocab editor.
Federico for general advice.
Alice for general advice, and for fixing my issues with libadwaita.
Eleanor, Sophia, Michael, and Rosanna for puzzle play-testing (coming soon!)
A few days ago systemd gained tools which allow you to monitor Varlink traffic. A new Varlink service (io.systemd.VarlinkMonitor) allows you to set up a ring buffer which will get filled with packets containing the traffic which matches the filters you provide. This provides the functionality that org.freedesktop.DBus.Monitoring provides for D-Bus. A new varlinkctl monitor verb allows you to use this feature in terminals and scripts. This provides the functionality that dbus-monitor provides for D-Bus and uses io.systemd.VarlinkMonitor under the hood. If you pass --json short to varlinkctl monitor, it produces JSON-seq which can be passed into jq --seq to further process the captured data.
I presented this in the broader context of observability with Varlink at All Systems Go. Slides and video of the talk are available online.
This is a good start, but I think we should add more tooling around it. Especially Bustle would be an interesting target because it would allow us to capture D-Bus and Varlink at the same time and get a global view of what is going on in our systems again.
There's only a few places I get to take visiting friends to in Liberec. Sadly at the moment almost all of them are out of service. The city dam, Harcovská přehrada, is one of them. A fraction of the size of a neighboring Mšeno, it's set close to the middle of the city and is a wonderful walk/running place, despite only half having a foot path.
In the autumn of 2022, a full reconstruction finally began, a mere century after the dam was built. Quite a massive operation, with 26,000 cubic meters of silt dug out, the original masonry injected with a fresh waterproof jacket from a brand new gallery dug right under the dam, and the bottom outlets were swapped for beefier ones. Being a listed landmark, the dam got to keep its pretty face while the guts were replaced. A three-year job that -- in the finest local tradition -- took a bit longer and cost north of EUR 20 million. It's worth noting that Liberec is one if not the most indebted cities in Czechia.
In the meantime the city had a moonscape where its living room used to be. I went to investigate the drained bowl like everyone else and came back with a portrait short of the eerie emptiness, set to an electronica track that goes by Spore Structure:
This year the water finally came back. Not yet finished, the lake is once again the city's front yard, has a refurbished beach, and a dam that's now rated to pass a 10,000-year flood. A figure I sincerely hope remains purely theoretical. To celebrate, I did the only reasonable thing: sent up a flying camera and cut the results to a tune. Sadly the dam claimed another one of my birds (currently the score is 2:0). A mistake had cost me one of older 5" as a broken OSD, ancient battery and water can lead to brisk ends. Luckily the tandem flight with a friend was done on my 4" and I have a video to share above.
The soundtrack was composed, as is the tradition around here, on the Dirtywave M8. Should watching atmospheric drum & bass slowly materialize out of a tracker over the course of a couple of hours sound like your idea of an evening, the recorded stream is up on YouTube.
After the initial summer release of Contributor Atlas I can now announce the next version and additional dataset.
This release now supports multi-project communities, a lot of polish and a few visualization which are either fun or insightful. Hopefully both.
The new dataset is the GNOME community with many of its projects and their contributors. Have fun exploring over at https://balooii.pages.gitlab.gnome.org/contributor-atlas/
This week we had quite a few nice improvements land to Calendar this week, including a lot of clean-up and back-end improvements, and a few user facing changes. Thank you to all the amazing community members for their efforts to make Calendar even better this week!
Decrementing and Incrementing Years in the Month Spin Button
In the month spin button, going to the previous month from January will now jump to December of the previous year. Similarly, going to the next month from December will jump to January next year.
This had been a long requested feature for quite a while. It seemed easy to implement, but it ended up being more difficult than desired. Since Calendar has several views, many of the widgets’ properties are shared. When one of the widgets changes, every widget updates accordingly, which made it difficult to have the years and months changing at the same time. This required building on top of the optimisations made to the date chooser that landed a few weeks ago.
To make it easier to control Calendar using just keyboard shortcuts, we added the ability to use Ctrl+/Ctrl- to zoom in and out of the week view. This joins the ability to zoom in and out the week view using a trackpad or holding down Ctrl and scrolling the mouse wheel.
The month view in Calendar is split into rows, with each row representing a week in a given month. The number of rows in the month view was hardcoded to 5 to span all the weeks in one month. While this works for most people, for users with non-standard display sizes or busier schedules, a hardcoded 5 rows was too limiting.
The first steps to make the month view more flexible landed this week, with the ability to change the number of rows displayed in the month view. This feature is still experimental, currently requiring the user to change the value through an internal setting using a program like dconf editor, but exposing this option in the user interface is planned for later this cycle.
Hello, I am pleased to announce a new stable release.
Cambalache is a WYSIWYG (What You See Is What You Get) tool that allows you to create and edit user interfaces for @GTK 4 and 3 applications.
This new version depends on @gnome SDK 51 and includes all new properties and types from Gtk and Adwaita! It also removes the file hash from the project file which should prevent unnecessary git conflicts.
This week I released Haystack, a new GNOME app for editing OpenQA needles. OpenQA is an automated test tool for operating systems, and it uses needles (annotated screenshots) to verify the output. Haystack makes it easy and convenient to create and maintain needles.
Typesetter, the Typst editor for focused writing, gets its biggest update yet with version 0.16.
The headline feature is sandbox-compatible multi-file projects. Typesetter now uses a new default archive-based project format, .typz, that keeps your document and everything it references (images, imports, and other assets) together in a single file. Projects work the same wherever you open them, and they’re easy to share and back up. Because Typesetter now only ever needs access to the files you explicitly open, never entire folders, multi-file Typst projects now work easily and reliably within the Flatpak sandbox.
A project can hold as many sub-files as you like, so you can split a long document into chapters or sections, keep reusable functions and styles in their own files, and bring everything together with #include and #import statements.
This replaces the previous “project folder” workflow, which was required to make imported files available to single-file .typ documents. That approach presupposed access to whole directories, which the sandbox is designed to prevent, and it was easy to get wrong. Removing it means there is now one secure, consistent way to include files in a document.
Typesetter can still open and edit standalone .typ documents, but they can no longer reference external files. To include assets in an existing document, open it and choose “Save As Project” when prompted, then add the files through the navigator.
Other noteworthy features include:
GUI bibliography manager: You can now add and edit references through a dedicated graphical interface.
Adjustable preview pane: The preview pane can now be manually resized to suit your workflow.
Comments navigator: A new navigator lets you list, view, and jump directly to author comments throughout your document.
New templates: Typesetter now includes several additional templates to help you get started with new documents. (More to come.)
Since the previous release announcement, Typesetter has also gained advanced export to HTML and Markdown, making it easier to share documents in other formats.
There have also been a range of performance improvements, bug fixes, and smaller feature updates across the application, continuing Typesetter’s focus on being a fast, distraction-free writing environment.
Kaori an open-source comic reader for GNOME, which allows you to discover, download and read comics with a beautiful libadwaita UI and natural touchpad gestures.
The name Kaori is a small tribute to Kaori Miyazono from Your Lie in April, a character who left a lasting impression on me.
A new update to Kotoba, the Japanese–English dictionary app, is live on Flathub. This release includes some code cleanup, internal optimizations, and an upgrade to the GNOME 51 runtime.
Moose — A native GTK and libadwaita app for local and cloud AI chats
Moose 0.6.0 is out! I started Moose to give local AI a comfortable home on the Linux desktop. This release brings cloud models into the app while making it clearer what you share and where it goes. Connect to Ollama Cloud, Groq, OpenAI, Anthropic, or Google Gemini with your own API key, stored in your desktop keyring. When you want to keep inference on your device, Local Only restricts it to Ollama managed by Moose.
For remote providers, choose whether Moose asks before sharing messages in each chat or remembers your choice across chats with that provider. Files have a separate permission. You can review the context before it is sent and reset permissions in Privacy settings.
I’m especially happy with the new Files view. It gives attachments and library documents a place of their own: search and filter them, preview a file, find its original folder, return to a related chat, or attach it to the current conversation. There’s also a broader local model catalog for chat, vision, reasoning, and coding. Waiting and reasoning indicators are clearer, and remote Ollama connections now require HTTPS.
Conversations, drafts, and the document library stay on your device. Content you choose to share with a remote provider is handled under that provider’s data policy. If you give Moose a try, I’d love to hear what you think.
This week I had a design discussion with Philipp Sauberzweig about Lockpicker. Before making some bigger changes, I decided to start with the low-hanging fruit. So this release mainly focuses on minor adjustments and some bug-fixes that were already in the main branch of the code. The biggest visible changes are a hash picker that includes the custom modules, the ability to select/unselect rules by drag and drop, and the proper use of Adw Comborows throughout the application instead of the old Gtk pickers.
Lockpicker is a tool to help you to recover passwords based on a hash, it’s essentially a GUI front-end to hashcat. You can get it on Flathub here.
Gitte, a simple Git client for GNOME built with GTK4, libadwaita and Relm4, just got its 0.11.0 release! 🎉
The headline feature this time is search in the commit graph: you can now find commits directly in the graph using the same search syntax as the commit log. Search also learned to match commit IDs and ID prefixes (short IDs), and author searches now match email addresses as well as names. And with the new sidebar search (Ctrl+K), you can quickly filter branches, tags and remote branches.
Commit messages got a few new tools, too. You can add trailers using configurable templates, set defaults per repository, and sign off commits with your identity. When squashing commits, trailers are merged, and edited commit messages are preserved when a history rewrite pauses. There is also a new button in the commit details to copy the complete message.
Amending a commit is now much more flexible: you can edit all changes from the previous commit, including unstaging changes to remove them from that commit.
A few more things can now be tailored to your repositories. You can choose whether they open in Changes, Current Branch or Commit Graph, either globally or per repository. Gitte also picks up a logo.png in the repository root, following the project-logo convention used by GNOME. logo.gif, logo.jpg and logo.jpeg are supported, too.
On the UI side, selection handling in the working copy and stashes views is smoother, with selections restored after refreshes and filtering. The repository name now shows up when the sidebar is collapsed, preferences tabs and repository settings have been reorganised, and spacing, compact-mode padding, diff icons and layouts with long translations got some polish.
And of course there is the usual pile of fixes: discarding hunks or selected lines during a rebase no longer runs into hunk-index errors, file names containing wildcard characters are handled correctly, and conflict diffs are loaded against HEAD. Status errors are now reported instead of making the working copy look empty, and diffs use consistent path prefixes regardless of your Git configuration. Failed clone attempts no longer risk deleting an existing destination folder, rebases resume correctly when commit signing is enabled, and notification messages display characters such as < and & correctly. macOS also got more reliable detection of command-line tools.
Under the hood there are updated German and Ukrainian translations, fresh dependencies and bundled Git and Git LFS versions, and a move to the GNOME 51 Flatpak runtime.
Bouncer 51 is out! It may be fall here, but it was time for some spring cleaning. This release includes a bunch of small cleanups. The most siginificant user-facing change is the upgrade to GNOME 51. Get it from Flathub. I hope you enjoy it!
We are calling for volunteers to help the GNOME Extensions team with code reviews and Shexli linter improvements. If you are interested in joining the review team or helping with Shexli, please reach out to us in the GNOME Extensions Matrix channel.
This rule was introduced because standalone GJS files have a different architecture than standard modules. They run the mainloop in the global scope, which should never be done by extensions in a shell process. To make it clear during code review that these files are standalone scripts rather than modules loaded into the shell process, they must start with the GJS shebang.
Beautiful music controls for the top bar: a minimal animated indicator and a compact card with cover art, a seek bar and playback controls, for any MPRIS player.
After the last post, many people sent in feature requests, and a lot of them are now in. Thanks to everyone who wrote in!
Recent updates bring:
a new icon (grey hills in fog) and a matching spectrum shape, Waves, where the hills drift by and rise with the sound
an optional “Follow all sound” mode: the spectrum reacts to any sound on the system, including calls and games, not only the player
a lighter panel icon that runs on its own timer instead of the frame clock, with a frames-per-second setting (10–60)
an option to show the playing app’s icon in the panel, next to the equalizer or in its place
album art can be turned off, so nothing is fetched from the web
equalizer bars can use the system accent colour (GNOME 47 and later)
right click on the panel button can play/pause or skip instead of opening the menu
wide video thumbnails fill the cover square instead of being squeezed
It’s been two years since my initial post about making GNOME OS an end-user general purpose OS. Today, we’re excited to announce that we’ve hit a major milestone!
TL;DR: We’re launching a new edition called “GNOME OS Preview”, which is built from the latest stable GNOME release. This means that GNOME OS is no longer just a nightly OS for GNOME developers and testers!
The Road to Stable
Even though GNOME OS has been usable on real hardware for a few years now, its appeal was limited. We’ve only had the Nightly edition, which is constantly rebuilt to ship the latest git commit of every GNOME component (and a few others, like systemd and Flatpak). This form of GNOME OS is extremely useful, since GNOME developers and designers can daily-drive it to test the latest changes. However, it’s not something we’d recommend to non-developers.
Over the past year, we’ve seen a lot of adoption of GNOME OS Nightly amongst GNOME developers, especially following the success of last year’s Summer of GNOME OS challenge. This has led to a significant uptick in contributions and initiatives aimed at improving user and developer experience. For instance:
Thanks to Jonas Dreßler’s, Valentin David’s, and Sebastian Wick’s zswap enablement efforts, GNOME OS now handles devices with limited amounts of RAM without OOM stalls. Jonas also found a hack that lets GNOME OS dynamically grow the usable on-disk swap space on-demand, which makes zswap perform significantly better than usual.
The recently released Test Center app allows you to install CI builds of Flatpak apps from a merge request, making it super easy to test experimental changes before they are even merged. On GNOME OS Nightly, Test Center can do the same with system components by applying them as a system extension.
Jordan Petridis’s new Toolpak project aims to provide a clean solution for distributing and installing command-line applications that developers need in a cross-distro fashion, similarly to how Flatpak and Flathub work for graphical apps.
Of course, long-term our goal is an OS for the broader public. We’re working on this across a number of different fronts, including:
Enablement for systemd-homed across the stack, allowing for stronger per-user disk encryption and other benefits.
Experimental work in the kernel to solve a bunch of limitations we’ve run into with filesystems. Ada Magicat went on a deep dive on her recent All Systems Go talk!
Deep integration between systemd-homed and the session’s keyring, to increase security of the session’s lock screen. Dhanuka Warusadura gave a lightning talk at All Systems Go about his work on this.
A new feature-complete installer, to replace the current placeholder installer. Julian Sparber also gave a talk about this at All Systems Go, with a live demo!
Support for delta updates in systemd-sysupdate, to avoid downloading a full 2 GB image every time.
Better integration with the TPM, including a graphical TPM recovery UI. Currently, trying to type a TPM recovery key into Plymouth is rather difficult.
Improved support for ARM hardware, including some specific models of phones. Abderrahim Kitouni gave a lightning talk at GUADEC this year about the current installation process.
Shipping our pre-installed apps as Flatpaks, and reworking the app release process to unify the build definitions between GNOME OS, the GNOME Nightly Apps Flatpak repo, and Flathub.
An STF project focused on Flatpak and Portals, which will enable broader app support on GNOME OS (like VPNs!). You can learn more from the announcement blog post.
Some of these areas require lots more work before they’re ready for prime time, and even once they’re ready it’s not clear that it’ll be possible to migrate existing GNOME OS installations to use these new features. At FOSDEM this year, we discussed this issue and decided that we won’t declare GNOME OS as “stable” until we can confidently commit to maintaining a clear long-term upgrade path for existing installations.
However, we also don’t think that all these things need to be in place before GNOME OS can be used by more people than it is today. It’s not ready for the masses yet, but it is ready for early adopters that aren’t quite adventerous enough to run a nightly OS.
Introducing GNOME OS Preview
GNOME OS Preview is the current GNOME OS Nightly, but without the “nightly” aspect. Instead, it’s built from the latest stable GNOME release (GNOME 51.1, at the time of writing). GNOME OS Preview lives in the same branches on GitLab as the stable org.gnome.Platform Flatpak runtimes.
GNOME OS Preview is only a few weeks old, so it has only seen limited real-life testing so far. We therefore expect people will uncover some issues initially. That said, Preview is significantly more stable than Nightly, which dozens of people have been daily driving without major issues for over a year. Thus, we’re feeling confident that Preview is going to be reliable enough for daily use by non-developer enthusiasts.
In all likelihood, GNOME OS Preview will be with us for a few years. However, we are explicitly not promising updates in perpetuity. If you’re not OK with re-installing your OS in a few years to switch to GNOME OS Stable, this is not for you yet. But if you’ve already been curious about giving GNOME OS a try, this is the moment!
GNOME OS Preview is available for download on the newly-refreshed os.gnome.org! GNOME OS Nightly is still available from there too. As always, you can reach us on Matrix at #gnome-os:gnome.org or via the gnome-os tag on Discourse
Epic just announced the upcoming version 2 of their Linux implementation of Easy Anti-Cheat. It’s based on using the Linux eBPF security module to monitor what’s happening, and then a bunch of extra infrastructure to make sure this can’t be bypassed. The core part of this is requiring secure boot be enabled (ensuring that modified kernels can’t be used), using measured boot to verify that secure boot is enabled and which keys are used (to prevent you from just signing your own modified kernel), and then doing remote attestation, a mechanism where the TPM generates a signed copy of the boot measurements and passes that off to a server which verifies it came from a real TPM, verifies that you have secure boot enabled and are using the right keys, and presumably then allows you into the game.
This is all fine as long as you can prove that the measurements provided are real, and that’s actually a lot harder than you might think. First, we can simply make up our own quote signed with our own key and say that it came from a TPM. This is avoided by every TPM having an Endorsement Key (or EK) and an associated certificate, with that certificate being signed by the TPM vendor. If you have a list of all the legitimate TPM vendors and their CA keys, you can verify that the measurements came from a real TPM. Easy enough. So we need to get the measurements from a real TPM, and the one on our motherboard contains the measurements that were generated by the firmware and bootloader, and we can’t reset those at runtime without resetting the TPM, which… oh huh there’s actually nothing stopping us from doing that at runtime, as long as we have access to the hardware. Many desktop boards have the TPM on a small plugin module with a standard pinout that includes a reset pin. Simply short that to ground briefly and the TPM is back in its initial state, and userland can write whatever measurements it wants to it. Boot a modified kernel which lies to the eBPF code? As long as you replay the expected log values from a boot with secure boot on and a trusted kernel, the TPM will still happily provide a legitimate set of measurements that’ll satisfy the checker.
What if the TPM is less accessible, either because it’s mounted directly to the motherboard or it’s inside the CPU or chipset? That’s going to be trickier. But here’s the thing. The quote needs to come from a TPM, but not necessarily the TPM on your motherboard. TPMs these days are usually connected via the Serial Peripheral Interface, usually referred to as SPI. Microchip make a USB to SPI bridge, and there’s a Linux driver. Wire one of those up with an appropriate header and you can plug in an easily available TPM module intended for plugging into a motherboard, and now we tell the kernel to ignore the motherboard TPM and make /dev/tpmrm0 point at the USB one and program it with a set of trusted measurements and once again everything is going to look just fine (yes obviously the eBPF code can look for this, but we’re running a modified kernel so we can just lie to the eBPF code).
Remote attestation on PCs just doesn’t work that well in environments where you can’t associate a specific TPM with a specific system, which is basically everywhere except enterprises. But maybe that doesn’t matter and cheaters wouldn’t be willing to spend the $20 or so it’d take to produce one of these things? That would seem somewhat surprising, but it’s not impossible. And obviously any server-side cheat detection that triggers could then block that specific TPM, meaning they’d need to go and get another TPM, and maybe that ends up being enough to discourage people from bothering. From a practical level, this may be sufficient. But at a technical level? It’s not great.