Avatar of This Week in GNOME

This Week in GNOME

@thisweek

#272 Shiny Icons

Update on what happened across the GNOME project in the week from October 23 to October 30.

GNOME Fellowship

Sophie (she/her) says

GNOME RFC Process, many fixes in glycin, CMYK images in Loupe, and more: Learn about my work in October as part of the GNOME Fellowship.

GNOME Core Apps and Libraries

Files ↗

Providing a simple and integrated way of managing your files and browsing your file system.

Peter Eisenmann announces

Many MRs have landed in Files since the 51.1 release! Here are some highlights:

  • Jakub Steiner made some ✨shiny✨ new placeholder icons
  • Khalid Abu Shawarib removed blocking I/O, so Files feels snappier
  • Khalid also added more file operation tests and fixed issues an automated audit turned up
  • Sivaprasad Murali brought operation error messages in line with the HIG
  • Corey Berla fixed a security issue with emptying the trash on removable devices
  • Jordan Petridis set up automated testing on GNOME OS in GitLab CI
  • “Programejt” made sure overly long content text in the properties dialog doesn’t get ellipsized
  • Peter Eisenmann taught the “Open With” app search to also match executable names

Software ↗

Lets you install and update applications and system extensions.

Philip Withnall says

Thanks to sysprof profiling by Jeff Fortin and code review by Georges, gnome-software has had some nice speedups in icon loading and downloading this week, which should make icons show up a lot faster in app listings, and reduce bandwidth and disk usage. See https://gitlab.gnome.org/GNOME/gnome-software/-/merge_requests/2466

Calendar ↗

A simple calendar application.

Georges Stavracas (feaneron) announces

GNOME Calendar continues to evolve with a few user facing and accessibility improvements in the past week. Thank you to everyone who submitted patches that landed this week, and everyone who reviewed and gave feedback on them!

Folding Search Results

Previously, searching in Calendar showed all instances of matching recurring events. Last week, we managed to merge a long-awaited patch that improves this behaviour by folding all instances of a matching recurring event into a single row! This makes searching for events cleaner and easier to parse, as the results are no longer flooded with irrelevant duplicates.

See !808, by John Cardullo; reviewed by Niklas Wimmer, Alen Galinec, Zelda Ahmed, and Georges Stavracas

Focus Selected Date First

Continuing the long effort to make GNOME Calendar more keyboard accessible, we landed a small tweak that improves the behaviour when tabbing into the sidebar’s and event editor’s date chooser grid. Instead of focusing the first cell in the grid, focus is now properly moved to the currently selected date’s cell. This matches the expected behavior when tabbing into other grids or lists, to first focus the currently selected item.

See !869, by Hari Rana; reviewed by Niklas Wimmer

Improved Screen Reader Output

To make Calendar more accessible, grid cells in the month view and date chooser will announce the month and day of the cell when focused. Previously, these cells only announced the day of the month, which made it very difficult for users to identify which month they were currently in!

See !886 and !887, by Arak; reviewed by Hari Rana and Niklas Wimmer

GLib ↗

The low-level core library that forms the basis for projects such as GTK and GNOME.

Philip Withnall announces

Support for XDG intents has landed in GLib, thanks to work by Ignacy Kuchciński (based on implementation work by Sebastian Wick and spec work by many others). This is the groundwork for allowing apps to register themselves as supporting opening commands in a terminal, or handling certain URI schemes. Work is ongoing to implement these specific intents. See the specification and the implementation in GLib.

GNOME Circle Apps and Libraries

Alexander Vanhee reports

Bazaar has hit half a million downloads on Flathub! To celebrate, I’ve fixed our most upvoted issue: the Bazaar Flatpak can now install apps from user remotes. Try it today with the beta on the GNOME Nightly remote, and report any issues you may face, especially on that niche distro only you and your grandma use.

Third Party Projects

Mark announces

GitY 2026.7 is now out! No longer is GitY simply a git repository viewer you can now manage your repositories directly. Many features have been added this year to make it a modern version of GitG. The most recent changes include:

  • Add tags and branches
  • Remove tags, branches, and stashes
  • Commit diffs show images being added, changed, or removed (if you’re curious on the technical details it uses glycin)
  • Search branches, tags, and stashes with CTRL-SHIFT-F
  • Live repository refresh is now available as an option (default off)
  • Can turn off the summary of lines changed per diff

Download from Flahub: https://flathub.org/en/apps/com.markdeepwell.GitY

Nathan Perlman reports

Rewaita got an update to v1.1.8 this week! This update was mostly focused on adding new features and filling in some of the odd blanks in the theming.

What’s new?

  • Added gtksourceview theme support (the editor part Gedit and Builder)
  • Finally added hot reloading for GTK4
  • Fixed Firefox 157.0 theming issues
  • Moved user guide to Github wiki
  • Unrelated to GNOME but Rewaita now has Cinnamon desktop support

Hope you all enjoy! Give Rewaita a try if you haven’t, once you get sucked in you’ll never want to go back. And if do you like it make sure to leave a star on Github. Installs are available of Flathub and the AUR.

Rat Cornu reports

Ratic got a new version 0.4.5 this week!

This is not a big update, but it greatly improve performances: it is now instantaneous to reload the datas already cached during previous launches. Furthermore, scrolling in the application no longer make it lag, and the image cache size can been limited to control RAM consumption.

You can check the new version on Flathub, on the repo, or even come discuss with us on our matrix room!

Thanks again for all the people that contribute to the localization on weblate!

Anton Isaiev reports

RustConn 0.24 is out - a connection manager for SSH, RDP, VNC, SPICE, Telnet, Serial, Kubernetes, Web and Zero Trust, built with GTK4 and Libadwaita.

Since 0.23:

  • Faster SSH connects (no process spawns on the UI thread) and a Bitwarden performance pass
  • “Set Up Key Authentication…” - generate or reuse an SSH key, install it, verify, switch over
  • Terminal .rsc scripting + OSC 52 remote clipboard
  • RDP clipboard direction control, QUIC proxy preset, richer MobaXterm import/export
  • Embedded browser in the Snap (now on core26)
  • Loopback-only tunnels and stdin-fed Bitwarden secrets

Thanks to Christian Petri, Naim Shafiev and all the contributors and translators who drove this cycle. And thanks to everyone who files bugs and supports the project - this cycle was driven largely by the issues you reported. If you’d like to support development, the repo has a Sponsor link.

https://github.com/totoshko88/RustConn https://flathub.org/apps/io.github.totoshko88.RustConn https://snapcraft.io/rustconn/

Daniel Elia announces

Convey 51.0 has been released!

Since 50.2-1 it has become a much more polished mail client; narrow windows and mobile layouts work better, notifications are clearer, with several showing at once, and spell-checking has proper dictionary support.

  • Subject shown above the conversation
  • Per-address signatures, with images
  • Drag to resize images in the composer
  • Unread filter in the search bar
  • Unsubscribe from mailing lists
  • Reply to List action
  • Local Starred folder for IMAP accounts
  • Folders in a sidebar on mobile

I’m working on adding a “Favourites” section to the sidebar, so folders from any account can be shown at the top of the sidebar, and there’s still bugs to be fixed, all planned for 51.1

Lastly, a big thank-you the community for getting so involved with the development of Convey, its first release to Flathub was a little over a month ago, and it’s seen much more adoption than I expected!

Check it out on Flathub, and check out the repo here

Fractal ↗

Matrix messaging app for GNOME written in Rust.

Kévin Commaille reports

Only a week went by since our previous security-related update, and several upstream dependencies released even more security fixes so we bundled them into Fractal 14.3 to make sure that everything keeps running smoothly until the next release!

This version is available right now on Flathub.

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!

Crosswords ↗

A crossword puzzle game and creator.

jrb announces

GNOME Crosswords 0.3.19 is out! This version features a redesigned game layout, with smooth animations and a new bottom sheet for clues in mobile mode. In the editor, acrostics are now out of Beta, with a much faster generator and an easier grid-building workflow. Also new: rich text in puzzle metadata, synonyms in word lists, large print templates, and tons of bug fixes.

A plea for help: We received an experimental merge request to build macOS bundles. As that’s outside my expertise, I’d love help testing the game and reviewing the changes. Please take a look or let me know if you can help.

Get it on Flathub! (Editor)

GNOME Websites

Philipp Sauberzweig announces

The Inter font has been installed on the GNOME WordPress instance. You can now use it on your personal GNOME blog to ensure consistency with GNOME’s web typography standards.

Shell Extensions

Tomáš Gažovič announces

RSS Feed v10

RSS Feed reached version 10, a jubilee release for the extension.

The main new features:

  • Starred articles: kept in their own group, even after they drop out of the feed or the feed is removed
  • Configurable article actions: up to three hover buttons per article and separate actions for the left, middle and right mouse button: open, mark as read or unread, star, dismiss, mark older as read, copy link
  • Dismiss and restore: hide articles you do not want to see and bring them all back from the header menu
  • Article history: articles stay stored after they drop out of the feed, up to a per-feed limit

Since the extension was ported to modern GNOME Shell earlier this year, it has passed 1000 downloads. Thank you to everyone who installed it, reported issues and sent feedback!

Missing something in your RSS workflow? Share your idea in Feature Requests on GitHub Discussions, I read every one.

Miscellaneous

GNOME OS ↗

The GNOME operating system, development and testing platform

Ada Magicat reports

It has been a busy week with tons of fixes and 2 new contributors! Welcome John Adams and Lars Ellinger. Check out what they worked on:

  • Lars added support for the LDAC codec to our pipewire builds. This will provide higher audio quality for bluetooth headsets that support it. !35267
  • John contributed 3 different fixes for Nvidia and snapd:
    • Adapting our firmware installation for the new 615 Nvidia driver. !5122
    • Making Nvidia graphics cards work inside snap applications. !5146
    • Fixed a regression with snapd’s apparmour profiles. !5123

We haven’t been sitting still either:

  • Hari, Jonas and Valentin ironed out various issues with our zswap setup. !5090, !5101, !5118, !5135
    • While it used to be a nightly-only feature, we think it is now rebust enough for everyone, so we enabled zswap in OS Preview as well.
  • We now enable the extra-codecs feature by default. This was introduced earlier this year to expand codec support, but it required users to enable it manually. !5109
  • Jonas enabled speaker support on the Dell XPS 14 and other modern Intel laptops. !5119
  • Our installer now offers to erase the user’s drive before installation. !5112
  • Valentin backported a few CUPS patches to fix printing !5009, !5097
  • Minor documentation touchups by Hari, zyxhere, Jonas and Tobias !4994, !5056, !5092, !5105

Events

Evangelos “GeopJr” Paterakis 🏳️‍⚧️🏳️‍🌈 says

Come visit us in FOSSCOMM, Athens!

We will have a booth this weekend in the University of West Attica on 31st October and 1st November.

There will be t-shirts, stickers and community members available to chat!

https://2026.fosscomm.gr/

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!

Avatar of Jussi Pakkanen

Jussi Pakkanen

@jpakkane

A slightly better ThreadPoolExecutor in Pystd through types

In the previous post we looked at a simple multithreaded task executor that behaves roughly like its Python standard library counterpart. The biggest missing feature was being able to return values from run tasks via future objects. In a fully dynamic language like Python this is fairly straightforward, whereas in a language with static typing, such as C++, things are trickier.

The simplest solution is merely to make your Executor class a template, parameterized by the function you want to run. The obvious downside is code bloat. If your program has an Executor<Foo> and Executor<Bar>, all of their code is duplicated in the binary, even though 90% of it is probably the same. Also, due to the magic of template instantiation, compilation is slower. Another downside is that you can't run tasks that do different things, especially having different return value types, with one Executor.

I set about trying to solve both of these issues at the same time. It turned out that if you are willing to tolerate just a little bit of OO and one extra malloc per task, one can get a fairly nice solution. As a task executor is used for things that run for a long time and consume a lot of resources, the overhead is insignificant for most use cases. And if it absolutely, positively matters to someone, they are going to roll their own anyway. Trying to cater to those use cases would be a waste of effort in any case.

These requirements point to a fairly obvious solution. The executor deals with TypeErasedFuture/Promise types that store all the task metadata via good ol' void pointers and virtual functions. The concrete Future and Promise tasks are just type safe shims on top of them. The entire implementation required the use of only two reinterpret_casts, which is quite surprising. I would have expected more, but sometimes you get lucky, I guess.

The Executor gets to remain a concrete class. The only template in it is the submit method that preserves the type erased task and returns a typed future object.

Using this is not quite a simple as its Python counterpart, but still fairly easy. After you have written a class that implements the executor's task interface, submitting work and consuming the results is done like this.

If the return value had been something other than void, .get() would return a reference to the result object. The tradeoff between the ease of use provided by maximal templateism and minimal code generation is clearly visible in the extra boilerplate code you need to write to get things going. But in return you get both reduced binary size and faster compile times. Whether that is an improvement or a detriment is up to you.

This code is not going to win any robustness prizes (though, in the modern day of AI garbage, you never know), but the end result is more than adequate for a single evening work. 

Getting Google Cast on my Soundbar

I have a Samsung Q800A soundbar. It ships with built-in support for the Apple Airplay protocol, but I’m not really an Apple kind of guy so that’s never been particularly helpful for me. So, instead, I have a Chromecast Audio plugged into it via TOSLINK, and that works fine - except for the fact that there’s no way to explicitly pick TOSLINK as the audio input. Instead, there’s a “Digital In” option that refers to both the optical in and eARC input from a TV. Not inherently a problem, given I’m unlikely to be watching TV while listening to music, but my TV is a Samsung Frame, a device that’s intended to display art whenever someone is standing nearby, and which infuriatingly generates an eARC signal even if it’s only in art mode and isn’t going to make any noise. This switches the soundbar away from optical and I get sad. I could plug a video cast device into the HDMI port on the soundbar and cast audio to that, but then the art would get replaced with album covers whenever I’m playing music, and again that’s not quite the ambience I want. Still, none of this is that important.

Until I learned that the Australian version of the soundbar does have Google Cast support. The firmware image was downloadable from Samsung support, so I grabbed that, but unfortunately found that it was encrypted. However, if I downloaded the firmware image for the US model, the encrypted blob was identical - there’s no difference in the underlying firmware between the two of them. So, how come one has support, and the other doesn’t?

I’d need an unencrypted copy of the firmware to have a real chance of figuring this out, and the easiest way to get one was to just run an ebay watch for a broken model of the same series. Once I had one in my hands I used hot air to remove the eMMC storage from the device, cleaned up the chip, and then stuck it in one of these adapters to read it on a local system. Samsung uses a weird in-house filesystem called VDFS4 on some of their devices and this was one of them, so I needed to cobble together a kernel that was compatible with their source dump for this device (not all VDFS drivers seem to be able to read all VDFS filesystems), but eventually I had it all extracted, and then I got distracted by other stuff, so let’s fast forward to this week.

Samsung makes use of a modified version of the Android Debug Bridge called sdb, which is included in the Tizen SDK. The firmware showed that this device had sdbd on it, and it would be executed if a network device called “huart0” was plugged in. Samsung does, thankfully, provide the source code for their GPLed components, so I could dig through that to discover that drivers/net/usb/usbnet.c had a bunch of references to huart (which apparently stands for “HyperUART”). If CONFIG_SAMSUNG_USBNET_HYPERUART_IFNAME is set, and if the ethernet device is using either the asix or ax88179_178a drivers, and if “/opt/etc/HyperUART_IP_Addr”1 isn’t just “0”, it sets the interface name to “huart0” and in turn triggers sdbd startup. So now I just needed to figure out how to set /opt/etc/HyperUART_IP_Addr to something else.

Some digging revealed a binary called wap-factory that referenced the file, which then led to /usr/share/mobile-mgr/jsons/com.samsung.audio.waapp-verification-test.json which mentioned a “SetUartOnOff” call, which brought me here2, which led me into a bit of a rabbit hole about the Samsung WAM protocol. Long story short, you connect to either port 55001 or 56001 and make two requests over the same connection:

1
2
3
4
5
6
7
8
9
GET /connect HTTP/1.1
Host: 192.168.87.126:56001
User-Agent: SamsungMultiroom/1.0
Connection: interactive

GET /UIC?cmd=%3Cname%3ESetUartOnOff%3C/name%3E%3Cp%20type%3D%22str%22%20name%3D%22uartOnOff%22%20val%3D%22on%22/%3E HTTP/1.1
Host: 192.168.87.126:56001
User-Agent: SamsungMultiroom/1.0
Connection: interactive

and then plug in an asix chipset ethernet adapter into the USB port (which on mine is micro-B, so I needed an OTG adapter), and suddenly it’s sitting there on 192.168.250.250 and will speak sdb to you. sdb root on switches it into root mode, and sdb shell now gives you a root shell. I was in, and now I could investigate what was happening.

First up, there was a process called “com.samsung.audio.google-cast-control-app” running, which seemed like a good start. Unfortunately it wasn’t doing anything. After some tracing I found that it was making a call to Samsung at startup time, and getting back a response telling it that Cast support wasn’t available. The request (which was helpfully dumped to stdout when I ran this by hand) included the country code, in my case “US”. Repeating the request by hand with curl and changing the code to “AU” told me it was supported, so now I needed to figure out how to get the soundbar to believe it was Australian. Some digging showed it was reading this from a config variable called db/comss/countrycode, and running

1
buxton2ctl set-string system db/comss/countrycode AU

got me past that gate. Now, however, it was complaining that it couldn’t provision a key. /usr/apps/com.samsung.audio.google-cast-control-app/shared/res included a bunch of encrypted blobs and an app called teeStoreKey.elf, and tracing com.samsung.audio.google-cast-control-app showed it was trying to call that, but it seemed like it was failing with a permissions issue. Running com.samsung.audio.google-cast-control-ap directly as root triggered key provisioning successfully, and a few seconds later the rest of the Cast API came up and I could talk to port 8443 with standard Cast API calls. Unfortunately it still wasn’t working as a Cast device, though - it wasn’t advertising itself via mDNS and so nothing could see it. Querying the /setup/eureka_info endpoint gave me a clue - the ’tos_accepted’ field was false. Normally this would be set as part of initial device setup, but the Samsung app wasn’t doing that because it didn’t think the device had Cast support. It turns out that POSTing some json with {“tos_accepted”: true} to setup/set_eureka_info made it work, and suddenly there was an additional Cast device available to me.

(Update: I realised I didn’t mention anything about why it was doing key provisioning in the first place! The Cast protocol doesn’t enforce cryptographic identity as such, but Google’s reference client implementation which is what almost everything uses verifies that the device is presenting an identity that chains back to Google. Unsurprisingly they don’t want the private key material to be easily extractable and used to produce clone devices, so it’s all supposed to be encrypted and only accessible to some sort of trusted execution environment, which is why keys here need to be loaded into Trustzone and never be visible in the clear to the main OS)

Mission accomplished. Unfortunately the device vanished from my Smartthings home aferwards, presumably because there’s a mismatch between its reported country code and my account country. To get around that I’d somehow need to get com.samsung.audio.google-cast-control-app to either change the query without changing the global device country, or to ignore the response from Samsung (it does this every 24 hours, ugh), and that’s made more annoying by the fact that this thing will only execute signed binaries. Although, weirdly, one of the signed binaries shipped is a full Python interpreter, so if I cared enough I could probably cobble together enough Python to execute arbitrary binaries. I currently don’t.

More modern soundbars don’t implement the listener on port 55001 or 56001. I don’t know how you get sdb working on them.


  1. Yes, it reads a file directly from in-kernel ↩︎

  2. Good god I hate reading this kind of slop ↩︎

Avatar of Sophie Herold

Sophie Herold

@sophieherold

GNOME Fellowship October 2026

The GNOME Foundation is supporting contributors with its fellowship program. You can help expand the fellowship program with a donation.

After the release of GNOME 51 in the previous month, this month was the time were people noticed the first regressions and bugs. Hence, a lot of work went into bug fixes this month.

RFC Process Landed

GNOME now has a project-wide RFC process. There were a few changes that happened this month, which further simplified the process and removed the special role of teams.

Since we have a consensus on a process now, I will supplement it with further documentation soon.

glycin

The CMYK support has been merged. You can check my last blog post for more details.

Another big change this month is the move from libjxl to jxl-rs. This is the same decoder now used by Chromium and Firefox. Thanks a lot to Wonwoo for the contribution and for all the people who fixed upstream issues that the GNOME implementation revealed.

Other than that, there were a lot of smaller things to address in glycin, most due to the GNOME 51 release:

    • Fix image loading getting stuck on systems with lowered sysctl net.core.wmem_default #334
    • Fix libglycin’s get_mime_types blocking main thread !487
    • Fix orientation not parsed correctly for some images with MakerNote Exif tag #332
    • Fix memory growth via filling up the channel in image-rs loader for animated images #338
    • Fix animation threads in image-rs not terminated until the loader process exits !491
    • Canonicalize loader paths when reading config #340
    • Fix Exif decoder panic I #329
    • Move JPEG XL loaders into the image-rs loader while keeping the C-based editor separate !495
    • Fix some .cur-files being detected as TGA files #345
    • Fix Exif decoder panic II #346
    • Fix libglycin panic in construction of GlyPixelDensity with invalid data #347

Image Viewer (Loupe)

Loupe benefits from the new CMYK support in glycin. Here is a comparison of nightly Loupe vs Loupe 50.

Loupe app window showing a dominantly green image with moss and a pink blurred flower in the background
Loupe with latest glycin showing the CMYK image correctly and indicating the CMYK color model under Image Format.
Very similar image to the previous one. Only difference being that the colors are oversaturated and "CMYK" isn't mentioned in the image properties.
Loupe 51 showing wrong colors for a CMYK image with ICC profile. This ICC profile oversaturates the colors to print on uncoated paper that will absorb a lot of ink.

There are also some fixes that landed in Loupe this month:

    • Set physical dimensions of generated intermediate PDF for printing correctly #417 #613
    • Fix fractional scaling potentially blurring image rendering (see “Snapping”) #326
    • Show if image uses CMYK color model !621

Other Work

I reviewed Resources, which is currently incubating as a replacement GNOME Core app for System Monitor. I found a few minor issues. Other than that, the app is close to being ready for GNOME Core. A review from the Design Team is still outstanding.

A topic that has been causing me a headache for a while has been how to properly implement memory limitations for glycin and thumbnailer sandboxes. There currently is no perfect solution. It looks like I will go with cgroups outside Flatpaks created via StartTransientUnit, at least for glycin. I’m happy that we finally have a decision.

Support the GNOME Project

The GNOME Fellowships are funded by our community. If you would like to help the GNOME project to stay sustainable, please consider donating.

Donate to GNOME

Avatar of Cassidy James Blaede

Cassidy James Blaede

@cassidyjames

Updates to the Blog

I’ve been wanting to get back into more frequent blogging instead of just posting half-thought-out toots to Mastodon, turning them into a rambling thread, and then losing the thought to the depths of social media… but every time I try to write something, there are a bunch of changes I want to make to my website so I get overwhelmed and do something else. 😅

Between the recent Matrix Conference (another blog post I need to write…), travel, and taking a couple of days off of work to recover, I decided to tackle some of those changes to hopefully reduce the mental block for the future: I finally added pagination and tags, plus imported a bunch of my writing from other sites! As long as I’m here, I figured I should document the changes as a blog post, too.

Pagination

As my blog has grown (I have posts as from over a decade ago!), dropping every post onto a single index page has started to get a bit unwieldy. I knew Jekyll had a pagination plugin, but I hadn’t set it up. I finally did that, with nicely-styled back/forward buttons.

Newer button, page 4 of 7, older button

It’s a little thing, but something I’d been putting off for too long.

Tags

With over a hundred and fifty posts, even paging through the blog is not a great experience if you’re looking for something specific. I went through and tagged every blog post by topic: e.g. GNOME, Design, Flatpak & Flathub, How-To, and Web Development.

Tags on a post

I also wanted a way to format the tags nicely (e.g. Star Wars for the starwars tag) and provide some more context, so I added a data file to my Jekyll site to optionally provide a display name and description for each tag. Hover the tags to see the descriptions, or check out the new tag listing to browse all of the available topics!

Importing my writing

Pagination and tags help a lot because now because: my blog has way more posts! I’ve imported my writing from elementary and Android Police so it’s all accessible from one place.

I wrote a ton for the elementary Tumblr, Medium publication, and blog during the decade-plus I contributed and then worked full-time on elementary; release announcements, AppCenter Spotlights, design rationale, developer tips, and more. I’d copied some of my work here in the past, but most of it was still only accessible on the elementary blog—or was lost to the depths of Medium and Tumblr. I finally spent the time to import the 80+ remaining posts I authored. Where the posts are still available on the elementary blog, I made sure to point the canonical URL there to avoid leeching any search engine juice from the original site; I just want to make it convenient to read my stuff in one place, but don’t want to mess up search engine ranking or anything. You can check out the entire archive on my site under the elementary tag.

Similarly (though on a much smaller scale), I contributed a few posts to Android Police before they were bought out and strip-mined by Valnet—the company described by former writers as unethical that acquires news sites and immediately lays off their staff, and threatens to sue journalists for reporting on them. Since the topics I wrote about may be of interest to readers of my blog, I added those posts as redirects (with the ability to serve them from the site directly if they ever disappear). You can peruse those posts under the Android tag.

If I find more of my writing across the Internet, I plan to pull it into this blog in a similar way; either cross-posted directly or at least indexed here with a redirect to the original.

What’s next?

I know not to promise anything (especially timelines!) but here are some things I’d like to work on next for my blog:

  • Per-tag styling (e.g. a unique accent color)
  • Find some of my more verbose Mastodon threads and turn them into blog posts
  • Automatically-generated social cards by default
  • Search while keeping everything static
  • Address whatever other issues I’ve opened
  • Write more!

If anything in this post sounded interesting, my website is open source! Check out the source code or commit history to learn how I did things. I can’t promise I did everything the right way, but it works!

Avatar of Richard Hughes

Richard Hughes

@hughsie

SK-8855 in the year 2026

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.

DevConf US 2026: Lessons Learned About Reaching Students in Open Source & Linux

DevConf US 2026: Lessons Learned About Reaching Students in Open Source &amp; Linux

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.

Meeting the "Ubuntu is Linux" generation 🔗

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.

Upstream at the mouth of the river 🔗

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 missing on-ramp 🔗

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.

Modernizing our student event strategy 🔗

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.

Avatar of Hylke Bons

Hylke Bons

@hbons

1,447 emoji? We'll do it live

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.

Meanwhile, after a huge rewrite, Pidgin 3 is making progress towards a first release and I’ve been helping out here and there with a new app icon and some status symbols for the development releases.

Emoji

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.

Or a “sub” as the kids call it these days.

25th October 2026

Hello,

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.

Clip of BBC website. Text: "Cyber correspondent Joe Tidy says he didn't know PHP existed until yesterday morning -- it's "one of those things we take for granted", he says.

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.

Here it is around launch day in 2002: https://web.archive.org/web/20021012080349/http://wiki.sourceforge.net/wiki

Screenshot of archive.org link above

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

Those bugs went unfixed forever, and six months later, the front page text had been replaced with two poems, one in Italian and one in Russian: https://web.archive.org/web/20030420205758/http://wiki.sourceforge.net

Shot of above archive.org link

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

Screenshot of archive.org link above

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.

Avatar of This Week in GNOME

This Week in GNOME

@thisweek

#271 Good News

Update on what happened across the GNOME project in the week from October 16 to October 23.

GNOME Circle Apps and Libraries

Jan Lukas announces

Newsflash 6.0 beta is available

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.

GNOME Core Apps and Libraries

GTK ↗

Cross-platform widget toolkit for creating graphical user interfaces.

Felix reports

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 :)

Web ↗

Web browser for the GNOME desktop.

adrian announces

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.

Third Party Projects

Fractal ↗

Matrix messaging app for GNOME written in Rust.

Kévin Commaille reports

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!

This version is available right now on Flathub.

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!

Solitaire ↗

Play Patience Games

Will Warner reports

Solitaire 51.1 is out! Here is what’s new:

  • Added the Hungarian translation
  • Updated translations: Slovenian, Ukrainian, Kazakh, Swedish
  • Made the game centered vertically
  • Made double-pressing move cards to the waste in Tri-Peaks
  • Added a deletion button for unfinished games
  • Made the card placeholder darker in the light theme

Jan-Michael Brummer announces

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

dabrain34 reports

🎉 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
  • Translations contributed through Weblate

🚀 Upgrade Now!

To get the latest version of GstPipelineStudio, visit the project’s page and check out the Changelog for more details.

Happy streaming! 🎬📡

Shell Extensions

storageb announces

Create your own Quick Settings toggle buttons!

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.

The extension is available on GNOME Extensions. For more information, see the documentation.

Events

Daniel Galleguillos Cruz says

GNOME Latam 2026: Call for Participation

We’re excited to announce GNOME Latam 2026, the regional gathering of the GNOME community in Latin America!

  • Dates: November 12–14, 2026
  • Venue: Universidad Anáhuac Mayab, Mérida, Yucatán, Mexico
  • Format: Hybrid (in-person sessions with online streaming and remote participation)
  • Event page & registration: https://events.gnome.org/e/latam2026

About the Event

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!

Avatar of Flathub

Flathub

@flathubblog

Flathub Discourse is now read-only

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.

Here's where to go instead:

  • Help with packaging and submissions: the Flathub Matrix channel, or the Flatpak channel for questions about Flatpak itself.
  • 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.

Crosswords 0.3.19 — New Layout and Acrostic Editor

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"
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!)

Peace