21 Nov 2025
Planet GNOME
Jakub Steiner: 12 months instead of 12 minutes
Hey Kids! Other than raving about GNOME.org being a static HTML, there's one more aspect I'd like to get back to in this writing exercise called a blog post.

I've recently come across an apalling genAI website for a project I hold deerly so I thought I'd give a glimpse on how we used to do things in the olden days. It is probably not going to be done this way anymore in the enshittified timeline we ended up in. The two options available these days are - a quickly generated slop website or no website at all, because privately owned social media is where it's at.
The wanna-be-catchy title of this post comes from the fact the website underwent numerous iterations (iterations is the core principle of good design) spanning over a year before we introduced the redesign.
So how did we end up with a 3D model of a laptop for the hero image on the GNOME website, rather than something generated in a couple of seconds and a small town worth of drinking water or a simple SVG illustration?
The hero image is static now, but used to be a scroll based animation at the early days. It could have become a simple vector style illustration, but I really enjoy the light interaction of the screen and the laptop, especially between the light and dark variants. Toggling dark mode has been my favorite fidget spinner.
Creating light/dark variants is a bit tedious to do manually every release, but automating still a bit too hard to pull off (the taking screenshots of a nightly OS bit). There's also the fun of picking a theme for the screenshot rather than doing the same thing over and over. Doing the screenshooting manually meant automating the rest, as a 6 month cycle is enough time to forget how things are done. The process is held together with duct tape, I mean a python script, that renders the website image assets from the few screenshots captured using GNOME OS running inside Boxes. Two great invisible things made by amazing individuals that could go away in an instant and that thought gives me a dose of anxiety.

This does take a minute to render on a laptop (CPU only Cycles), but is a matter of a single invocation and a git commit. So far it has survived a couple of Blender releases, so fingers crossed for the future.
Sophie has recently been looking into translations, so we might reconsider that 3D approach if translated screenshots become viable (and have them contained in an SVG similar to how os.gnome.org is done). So far the 3D hero has always been in sync with the release, unlike in our Wordpress days. Fingers crossed.
21 Nov 2025 7:44am GMT
This Week in GNOME: #226 Exporting Events
Update on what happened across the GNOME project in the week from November 14 to November 21.
GNOME Core Apps and Libraries
Calendar ↗
A simple calendar application.
Hari Rana | TheEvilSkeleton (any/all) 🇮🇳 🏳️⚧️ says
Thanks to FineFindus, who previously worked on exporting events as
.icsfiles, GNOME Calendar can now export calendars as.icsfiles, courtesy of merge request !615! This will be available in GNOME 50.
Hari Rana | TheEvilSkeleton (any/all) 🇮🇳 🏳️⚧️ says
After two long and painful years, several design iterations, and more than 50 rebases later, we finally merged the infamous, trauma-inducing merge request !362 on GNOME Calendar. This changes the entire design of the quick-add popover by merging both pages into one and updating the style to conform better with modern GNOME designs. Additionally, it remodels the way the popover retrieves and displays calendars, reducing 120 lines of code.
The calendars list in the quick-add popover has undergone accessibility improvements, providing a better experience for assistive technologies and keyboard users. Specifically: tabbing from outside the list will focus the selected calendar in the list; tabbing from inside the list will skip the entire list; arrow keys automatically select the focused calendar; and finally, assistive technologies now inform the user of the checked/selected state.
Admittedly, the quick-add popover is currently unreachable via keyboard because we lack the resources to implement keyboard focus for month and week cells. We are currently trying to address this issue in merge request !564, and hope to get it merged for GNOME 50, but it's a significant undertaking for a single unpaid developer. If it is not too much trouble, I would really appreciate some donations, to keep me motivated to improve accessibility throughout GNOME and sustain myself: https://tesk.page/#donate
This merge request allowed us to close 4 issues, and will be available in GNOME 50.
Files ↗
Providing a simple and integrated way of managing your files and browsing your file system.
Peter Eisenmann says
Files landed two big changes by Khalid Abu Shawarib this week.
The first change adds a bunch of tests, bringing the total coverage of the huge code base close to 30%. This will prevent regressions in previously uncovered areas such as bookmarking or creating files.
The second change is more noticeable as the way thumbnails are loaded was largely rewritten to finally make full use of GTK4's recycling views. It took a lot of code detangling to get thumbnails to load asynchronously, but the result is a great speedup, making thumbnails show as fast as never before. 🚀
Attached is a comparison of reloading a folder before and after the change
Libadwaita ↗
Building blocks for modern GNOME apps using GTK4.
Alice (she/her) 🏳️⚧️🏳️🌈 announces
as of today, libadwaita has support for the new reduced motion preference, both supporting the
@media (prefers-reduced-motion: reduce)query from CSS, and using simple crossfade transitions where appropriate (e.g. inAdwDialog,AdwNavigationViewandAdwTabOverview
Alice (she/her) 🏳️⚧️🏳️🌈 reports
libadwaita has deprecated the
style-dark.css,style-hc.cssandstyle-hc-dark.cssresources thatAdwApplicationautomatically loads. They still work, but will be removed in 2.0. Applications are recommended to switch tostyle.cssand media queries for dark and high contrast styles
GTK ↗
Cross-platform widget toolkit for creating graphical user interfaces.
Matthias Clasen reports
This weeks GTK 4.21.2 release includes initial support for the CSS backdrop-filter property. The GSK APIs enabling this are new copy/paste and composite render nodes, which allow flexible reuse of the 'background' at any point in the scene graph. We are looking forward to your experiments with this!
GLib ↗
The low-level core library that forms the basis for projects such as GTK and GNOME.
Philip Withnall says
Luca Bacci has dug into an intermittent output buffering issue with GLib on Windows, which should fix some CI issues and opt various GLib utilities into more modern features on Windows - https://gitlab.gnome.org/GNOME/glib/-/merge_requests/4788
Third Party Projects
Alain announces
Planify 4.16.0 - Natural dates, smoother flows, and smarter task handling
This week, Planify released version 4.16.0, bringing several improvements that make task management faster, more intuitive, and more predictable on GNOME.
The highlight of this release is natural language date parsing, now enabled by default in Quick Add. You can type things like "tomorrow 3pm", "next Monday", "25/12/2024", or "ahora", and Planify will automatically convert it into a proper scheduled date. Spanish support has also been added, including expressions like mañana, pasado mañana, próxima semana, and more.
Keyboard navigation got a boost too:
- Ctrl + D now opens the date picker instantly
- Ctrl + K toggles "Keep adding" mode
- And several shortcuts were cleaned up for more predictable behavior
Planify also adds label management in the task context menu, making it easier to add or remove labels without opening the full editor.
For calendar users, event items now open a richer details popover, with automatic detection of Google Meet and Microsoft Teams links, making online meetings just one click away.
As always, translations, bug fixes, and general UI refinements round out the update.
Planify 4.16.0 is available now on Flathub
Jan-Willem reports
This week I released Java-GI version 0.13.0, a Java language binding for GNOME and other libraries that support GObject-Introspection, based on OpenJDK's new FFM functionality. Some of the highlights in this release are:
- Bindings for LibRsvg, GstApp (for GStreamer) and LibSecret have been added
- The website for Java-GI has its own domain name now: java-gi.org, and this is also used in all module- and package names
- Thanks to GObject-Introspection's extensive testsuite, I've implemented over 900 testcases to test the Java bindings, and fixed many bugs along the way.
I hope that Java-GI will help Java (or Kotlin, Scala, Clojure, …) developers to create awesome new GNOME apps!
Quadrapassel ↗
Fit falling blocks together.
Will Warner says
Quadrapassel 49.2 is out! Here is whats new:
- Updated translations: Ukrainian, Russian, Brazilian Portuguese, Chinese (China), Slovenian, Georgian
- Made the 'P' key pause the game
- Replaced the user help docs with a 'Game Rules' dialog
- Stopped the menu button taking focus
- Fixed a bug where the game's score would not be recorded when the app was quit
- Added total rows and level information to scores
Phosh ↗
A pure wayland shell for mobile devices.
Guido announces
Phosh 0.51.0 is out:
There's a new quick setting that allows to toggle location services on/off and the ☕ quick setting can now disable itself after a certain amount of time (check here on how to configure the intervals). We also add added a toggle to enable automatic brightness from the top panel and when enabled the brightness slider acts as an offset to the current brightness value.
The minimum brightness of the 🔦 brightness slider can now be configured via
hwdb/udevallowing one go to lower values then the former hard coded 40%. The configuration is maintained in gmobile.If you're using Phosh on a Google Pixel 3A XL you can now enjoy haptic feedback when typing on the on screen keyboard (like users on other devices) and creating notch configurations for new devices should now be simpler as our tooling can take screen shots of the resulting UI element layout in Phosh for you.
There's more, see the full details at here
GNOME Websites
Emmanuele Bassi says
After a long time, the new user help website is now available and up to date with the latest content. The new help website replaces the static snapshot of the old library-web project, but it is still a work in progress, and contributions are welcome. Just like in the past, the content is sourced from each application, as well as from the gnome-user-docs repository. If you want to improve the documentation of GNOME components and core applications, make sure to join the #docs:gnome.org room.
Shell Extensions
Pedro Sader Azevedo announces
Foresight is a GNOME Shell extension that automatically enters the activities view on empty workspaces, making it faster to open apps and start using your computer!
This week, it gained support for GNOME 49, courtesy of gabrielpalassi. This is the second time in a row that Foresight gained support for a newer GNOME Shell version thanks to community contributions, which I'm immensely grateful for. I'm also very grateful to Just Perfection, who single-handedly holds so many responsibilities in the GNOME Shell extensions ecosystem.
The latest version of Foresight is available at EGO: https://extensions.gnome.org/extension/7901/foresight/
Happy foretelling 🔮👣
Miscellaneous
revisto reports
The Persian GNOME community was featured at the Debian 13 Release Party at Sharif University in Iran. The talk introduced GNOME, explained how the Persian community came together, highlighted its contributions (GTK/libadwaita apps, GNOME Circle involvement, translations, and fa.gnome.org), and invited newcomers to participate and contribute.
Recording available (Farsi): https://youtu.be/UPmNNygNQuc
GNOME Foundation
ramcq reports
The GNOME Foundation board has shared details about our recently-approved balanced budget for 2024-25, as well as a note to share our thanks to Karen Sandler, as she has decided to step down from the board.
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!
21 Nov 2025 12:00am GMT
19 Nov 2025
Planet GNOME
Philip Withnall: Parental controls screen time limits backend
Ignacy blogged recently about all the parts of the user interface for screen time limits in parental controls in GNOME. He's been doing great work pulling that all together, while I have been working on the backend side of things. We're aiming for this screen time limits feature to appear in GNOME 50.
High level design
There's a design document which is the canonical reference for the design of the backend, but to summarise it at a high level: there's a stateless daemon, malcontent-timerd, which receives logs of the child user's time usage of the computer from gnome-shell in the child's session. For example, when the child stops using the computer, gnome-shell will send the start and end times of the most recent period of usage. The daemon deduplicates/merges and stores them. The parent has set a screen time policy for the child, which says how much time they're allowed on the computer per day (for example, 4h at most; or only allowed to use the computer between 15:00 and 17:00). The policy is stored against the child user in accounts-service.
malcontent-timerd applies this policy to the child's usage information to calculate an 'estimated end time' for the child's current session, assuming that they continue to use the computer without taking a break. If they stop or take a break, their usage - and hence the estimated end time - is updated.
The child's gnome-shell is notified of changes to the estimated end time and, once it's reached, locks the child's session (with appropriate advance warning).
Meanwhile, the parent can query the child's computer usage via a separate API to malcontent-timerd. This returns the child's total screen time usage per day, which allows the usage chart to be shown to the parent in the parental controls user interface (malcontent-control). The daemon imposes access controls on which users can query for usage information. Because the daemon can be accessed by the child and by the parent, and needs to be write-only for the child and read-only for the parent, it has to be a system daemon.
There's a third API flow which allows the child to request an extension to their screen time for the day, but that's perhaps a topic for a separate post.
So, at its core, malcontent-timerd is a time range store with some policy and a couple of D-Bus interfaces built on top.
Per-app time limits
Currently it only supports time limits for login sessions, but it is built in such a way that adding support for time limits for specific apps would be straightforward to add to malcontent-timerd in future. The main work required for that would be in gnome-shell - recording usage on a per-app basis (for apps which have limits applied), and enforcing those limits by freezing or blocking access to apps once the time runs out. There are some interesting user experience questions to think about there before anyone can implement it - how do you prevent a user from continuing to use an app without risking data loss (for example, by killing it)? How do you unambiguously remind the user they're running out of time for a specific app? Can we reliably find all the windows associated with a certain app? Can we reliably instruct apps to save their state when they run out of time, to reduce the risk of data loss? There are a number of bits of architecture we'd need to get in place before per-app limits could happen.
Wrapping up
As it stands though, the grant funding for parental controls is coming to an end. Ignacy will be continuing to work on the UI for some more weeks, but my time on it is basically up. With the funding, we've managed to implement digital wellbeing (screen time limits and break reminders for adults) including a whole UI for it in gnome-control-center and a fairly complex state machine for tracking your usage in gnome-shell; a refreshed UI for parental controls; parental controls screen time limits as described above; the backend for web filtering (but more on that in a future post); and everything is structured so that the extra features we want in future should bolt on nicely.
While the features may be simple to describe, the implementation spans four projects, two buses, contains three new system daemons, two new system data stores, and three fairly unique new widgets. It's tackled all sorts of interesting user design questions (and continues to do so). It's fully documented, has some unit tests (but not as many as I'd like), and can be integration tested using sysexts. The new widgets are localisable, accessible, and work in dark and light mode. There are even man pages. I'm quite pleased with how it's all come together.
It's been a team effort from a lot of people! Code, design, input and review (in no particular order): Ignacy, Allan, Sam, Florian, Sebastian, Matthijs, Felipe, Rob. Thank you Endless for the grant and the original work on parental controls. Administratively, thank you to everyone at the GNOME Foundation for handling the grant and paperwork; and thank you to the freedesktop.org admins for providing project hosting for malcontent!
19 Nov 2025 11:39pm GMT
17 Nov 2025
planet.freedesktop.org
Lennart Poettering: Mastodon Stories for systemd v258
Already on Sep 17 we released systemd v258 into the wild.
In the weeks leading up to that release I have posted a series of serieses of posts to Mastodon about key new features in this release, under the #systemd258 hash tag. It was my intention to post a link list here on this blog right after completing that series, but I simply forgot! Hence, in case you aren't using Mastodon, but would like to read up, here's a list of all 37 posts:
- Post #1: systemctl start -v
- Post #2: Home areas
- Post #3: systemd-resolved delegate zones
- Post #4: Foreign UID range
- Post #5: /etc/hostname ??? wildcards
- Post #6: Quota on /tmp/
- Post #7: ConcurretnySoftMax= + ConcurrencyHardMax=
- Post #8: Product UUID in ConditionHost=
- Post #9: Context OSC terminal sequences
- Post #10: uki-url Boot Loader Spec Type #1 fields
- Post #11: rd.break= boot breakpoints
- Post #12: Factory Reset Rework
- Post #13: systemd-resolved DNS Configuration Change IPC Subscription API
- Post #14: io.systemd.boot-entries.extra= SMBIOS Type #11 Key
- Post #15: Bring Your Own Firmware
- Post #16: userdb record aliases
- Post #17: systemd-validatefs and its xattrs
- Post #18: Offline Signing of Artifacts
- Post #19: PAMName= in services hooked up to ask-password protocol
- Post #20: x-systemd.graceful-option= mount option
- Post #21: systemd-userdb-load-credentials.service
- Post #22: systemd-vmspawn --grow-image=a
- Post #23: systemd-notify --fork
- Post #24: $TERM auto-discovery
- Post #25: Rebooting/Powering off systemd-nspawn containers via hotkey
- Post #26: ExecStart= | modifier
- Post #27: systemctl reload reloads confexts
- Post #28: Server side userdb filtering
- Post #29: Quota on StateDirectory= and friends
- Post #30: systemd-analyze unit-shell
- Post #31: /etc/issue.d/ drop-in for AF_VSOCK CID
- Post #32: fsverity in systemd-repart
- Post #33: AcceptFileDescriptor= + PassPIDFD=
- Post #34: Tab completion in interactive systemd-firstboot
- Post #35: rd.systemd.pull= kernel command line option/Boot into tarball
- Post #36: ConditionKernelModuleLoaded=
- Post #37: systemd-analyze chid
- Post #38: homectl list-signing-keys/get-signing-key/add-signing-key/remove-signing-key
- Post #39: DDI Image Filters
- Post #40: Android USB Debugging udev rules
- Post #41: systemd-vmspawn's --smbios11= switch
- Post #42: $MAINPIDFDID + $MANAGERPIDFDID
- Post #43: $DEBUG_INVOCATION=1 Respected by all systemd services
- Post #44: LoaderDeviceURL EFI Variable and systemd.pull='s origin kernel command line switch
- Post #45: cgroupv1 removal
- Post #46: ProtectHostname=private
- Post #47: homectl adopt + homectl register
- Post #48: systemd-machined Varlink APIs
- Post #49: DeferTrigger and "lenient" job mode
- Post #50: Automatic Removal of foreign UID owned delegate subgroups in the per-user service manager
- Post #51: Per-user ask-password protocol
- Post #52: PrivateUsers=full
- Post #53: LoadCredentialEncrypted= in the per-user service manager
- Post #54: dissect_image builtin in systemd-udevd
- Post #55: BPF Delegation via Tokens
I intend to do a similar series of serieses of posts for the next systemd release (v259), hence if you haven't left tech Twitter for Mastodon yet, now is the opportunity.
We intend to shorten the release cycle a bit for the future, and in fact managed to tag v259-rc1 already yesterday, just 2 months after v258. Hence, my series for v259 will begin soon, under the #systemd259 hash tag.
In case you are interested, here is the corresponding blog story for systemd v257, and here for v256.
17 Nov 2025 11:00pm GMT
Rodrigo Siqueira: XDC 2025
It has been a long time since I published any update in this space. Since this was a year of colossal changes for me, maybe it is also time for me to make something different with this blog and publish something just for a change - why not start talking about XDC 2025?
This year, I attended XDC 2025 in Vienna as an Igalia developer. I was thrilled to see some faces from people I worked with in the past and people I'm working with now. I had a chance to hang out with some folks I worked with at AMD (Harry, Alex, Leo, Christian, Shashank, and Pierre), many Igalians (Žan, Job, Ricardo, Paulo, Tvrtko, and many others), and finally some developers from Valve. In particular, I met Tímur in person for the first time, even though we have been talking for months about GPU recovery. Speaking of GPU recovery, we held a workshop on this topic together.
The workshop was packed with developers from different companies, which was nice because it added different angles on this topic. We began our discussion by focusing on the topic of job resubmission. Christian began sharing a brief history of how the AMDGPU driver started handling resubmission and the associated issues. After learning from erstwhile experience, amdgpu ended up adopting the following approach:
- When a job cause a hang, call driver specific handler.
- Stop the scheduler.
- Copy all jobs from the ring buffer, minus the job that caused the issue, to a temporary ring.
- Reset the ring buffer.
- Copy back the other jobs to the ring buffer.
- Resume the scheduler.
Below, you can see one crucial series associated with amdgpu recovery implementation:
The next topic was a discussion around the replacement of drm_sched_resubmit_jobs() since this function became deprecated. Just a few drivers still use this function, and they need a replacement for that. Some ideas were floating around to extract part of the specific implementation from some drivers into a generic function. The next day, Philipp Stanner continued to discuss this topic in his workshop, DRM GPU Scheduler.
Another crucial topic discussed was improving GPU reset debuggability to narrow down which operations cause the hang (keep in mind that GPU recovery is a medicine, not the cure to the problem). Intel developers shared their strategy for dealing with this by obtaining hints from userspace, which helped them provide a better set of information to append to the devcoredump. AMD could adopt this alongside dumping the IB data into the devcoredump (I am already investigating this).
Finally, we discussed strategies to avoid hang issues regressions. In summary, we have two lines of defense:
- IGT: At the IGT level, we can have more tests that insert malicious instructions into the ring buffer, forcing the driver into an invalid state and triggering the recovery process.
- HangTest suite: HangTest suite is a tool that simulates some potential hangs using Vulkan. Some tests are already available in this suite, but we should explore more creative combinations for trying to trigger hangs.
This year, as always, XDC was super cool, packed with many engaging presentations which I highly recommend everyone check out. If you are interested, check the schedule and the presentation recordings available on the X.Org Foundation Youtube page. Anyway, I hope this blog post marks the inauguration of a new era for this site, where I will start posting more content ranging from updates to tutorials. See you soon.
17 Nov 2025 12:00am GMT
15 Nov 2025
planet.freedesktop.org
Simon Ser: Status update, November 2025
Hi!
This month a lot of new features have added to the Goguma mobile IRC client. Hubert Hirtz has implemented drafts so that unsent text gets saved and network disconnections don't disrupt users typing a message. He also enabled replying to one's own messages, changed the appearance of short messages containing only emoji, upgraded our emoji library to Unicode version 16, fixed some linkifier bugs and added unit tests.

Markus Cisler has added a new option in the message menu to show a user's profile. I've added an on-disk cache for images (with our own implementation, because the widely used cached_network_image package is heavyweight). I've been working on displaying network icons and blocking users, but that work is not finished yet. I've also contributed some maintenance fixes for our webcrypto.dart dependency (toolkit upgrades and CI fixes).
The soju IRC bouncer has also got some love this month. delthas has contributed support for labeled-response for soju clients, allowing more reliable matching of server replies with client commands. I've introduced a new icon directive to configure an image representing the bouncer. soju v0.10.0 has been released, followed by soju v0.10.1 including bug fixes from Karel Balej and Taavi Väänänen.
In Wayland news, wlroots v0.19.2 and v0.18.3 have been released thanks to Simon Zeni. I've added support for the color-representation protocol for the Vulkan renderer, allowing clients to configure the color encoding and range for YCbCr content. Félix Poisot has been hard at work with more color management patches: screen default color primaries are now extracted from the EDID and exposed to compositors, the cursor is now correctly converted to the output's primaries and transfer function, and some work-in-progress patches switch the renderer API from a descriptive model to a prescriptive model.
go-webdav v0.7.0 has been released with a patch from prasad83 to play well with Thunderbird. I've updated clients to make multi-status errors non-fatal, returning partial data alongside the error.
I've released drm_info v2.9.0 with improvements mentioned in the previous status update plus support for the TILE connector property.
See you next month!
15 Nov 2025 10:00pm GMT




