call_end

    • Pl chevron_right

      Aryan Kaushik: Open Forms is now 0.4.0 - and the GUI Builder is here

      news.movim.eu / PlanetGnome • 3 months from now • 3 minutes

    Open Forms is now 0.4.0 - and the GUI Builder is here

    A quick recap for the newcomers

    Ever been to a conference where you set up a booth or tried to collect quick feedback and experienced the joy of:

    • Captive portal logout
    • Timeouts
    • Flaky Wi-Fi drivers on Linux devices
    • Poor bandwidth or dead zones

    Meme showcasing wifi fails when using forms

    This is exactly what happened while setting up a booth at GUADEC. The Wi-Fi on the Linux tablet worked, we logged into the captive portal, the chip failed, Wi-Fi gone. Restart. Repeat.

    Meme showing a person giving their child a book on 'Wifi drivers on linux' as something to cry about

    We eventually worked around it with a phone hotspot, but that locked the phone to the booth. A one-off inconvenience? Maybe. But at any conference, summit, or community event, at least one of these happens reliably.

    So I looked for a native, offline form collection tool. Nothing existed without a web dependency. So I built one.

    Open Forms is a native GNOME app that collects form inputs locally, stores responses in CSV, works completely offline, and never touches an external service. Your data stays on your device. Full stop.

    Open Forms pages

    What's new in 0.4.0 - the GUI Form Builder

    The original version shipped with one acknowledged limitation: you had to write JSON configs by hand to define your forms.

    Now, I know what you're thinking. "Writing JSON to set up a form? That's totally normal and not at all a terrible first impression for non-technical users." And you'd be completely wrong, to me it was normal and then my sis had this to say "who even thought JSON for such a basic thing is a good idea, who'd even write one" which was true. I knew it and hence it was always on the roadmap to fix, which 0.4.0 finally fixes.

    Open Forms now ships a full visual form builder.

    Design a form entirely from the UI - add fields, set labels, reorder things, tweak options, and hit Save. That's it. The builder writes a standard JSON config to disk, same schema as always, so nothing downstream changes.

    It also works as an editor. Open an existing config, click Edit, and the whole form loads up ready to tweak. Save goes back to the original file. No more JSON editing required.

    Open forms builder page

    Libadwaita is genuinely great

    The builder needed to work well on both a regular desktop and a Linux phone without me maintaining two separate layouts or sprinkling breakpoints everywhere. Libadwaita just... handles that.

    The result is that Open Forms feels native on GNOME and equally at home on a Linux phone, and I genuinely didn't have to think hard about either. That's the kind of toolkit win that's hard to overstate when you're building something solo over weekends.


    The JSON schema is unchanged

    If you already have configs, they work exactly as before. The builder is purely additive, it reads and writes the same format. If you like editing JSON directly, nothing stops you. I'm not going to judge, but my sister might.

    Also thanks to Felipe and all others who gave great ideas about increasing maintainability. JSON might become a technical debt in future, and I appreciate the insights about the same. Let's see how it goes.

    Install

    Snap Store

    snap install open-forms
    

    Flatpak / Build from source

    See the GitHub repository for build instructions. There is also a Flatpak release available .

    What's next

    • A11y improvements
    • Maybe and just maybe an optional sync feature
    • Hosting on Flathub - if you've been through that process and have advice, please reach out

    Open Forms is still a small, focused project doing one thing. If you've ever dealt with Wi-Fi pain while collecting data at an event, give it a try. Bug reports, feature requests, and feedback are all very welcome.

    And if you find it useful - a star on GitHub goes a long way for a solo project. 🙂

    Open Forms on GitHub

    • Pl chevron_right

      Lucas Baudin: Improving Signatures in Papers: Malika's Outreachy Internship

      news.movim.eu / PlanetGnome • 3:00 • 1 minute

    Last week was the end of Malika' internship within Papers about signatures that I had the pleasure to mentor. After a post about the first phase of Outreachy, here is the sequel of the story.

    Nowadays, people expect to be able to fill and sign PDF documents. We previously worked on features to insert text into documents and signatures needed to be improved.

    There is actually some ambiguity when speaking about signatures in PDFs: there are cryptographic signatures that guarantee that a certificate owner approved a document (now denoted by "digital" signatures) and there are also signatures that are just drawings on the document. These latter ones of course do not guarantee any authenticity but are more or less accepted in various situations, depending on the country. Moreover, getting a proper certificate to digitally sign documents may be complicated or costly (with the notable exception of a few countries providing them to their residents such as Spain).

    Papers lacked any support for this second category (that I will call "visual" signatures from now on). On the other hand, digital signing was implemented a few releases ago, but it heavily relies on Firefox certificate database 1 and in particular there is no way to manage personal certificates within Papers.

    During her three months internship, Malika implemented a new visual signatures management dialog and the corresponding UI to insert them, including nice details such as image processing to import signature pictures properly. She also contributed to the poppler PDF rendering library to compress signature data.

    Then she looked into digital signatures and improved the insertion dialog, letting users choose visual signatures for them as well. If all goes well, all of this should be merged before Papers 51!

    New signature dialog

    Malika also implemented a prototype that allows users to import certificates and also deal with multiple NSS databases. While this needs more testing and code review 2 , it should significantly simplify digital signing.

    I would like to thank everyone who made this internship possible, and especially everyone who took the time to do calls and advise us during the internship. And of course, thanks to Malika for all the work she put into her internship!

    1

    or on NSS command line tools.

    2

    we don't have enough NSS experts, so help is very welcomed .

    • Pl chevron_right

      This Week in GNOME: #240 Big Reworks

      news.movim.eu / PlanetGnome • 1 day ago • 3 minutes

    Update on what happened across the GNOME project in the week from March 06 to March 13.

    GNOME Core Apps and Libraries

    Files

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

    Peter Eisenmann announces

    For version 50 Files aka nautilus has retrieved many bug fixes, tiny niceties and big reworks. The most prominent are:

    • Faster thumbnail and icon loading
    • Pop-out property dialogs for free-floating windows
    • Reworked batch rename mechanism and highligths for replaced text
    • Shorter file operation descriptions in sidebar
    • Support for multiple simulatenous file type search filters
    • Case-insensitive pathbar completions
    • Dedicated dialog for grid view captions
    • Reduced memory usage
    • Internal modernizations including usage of Blueprint and glycin
    • Increased test coverage (23% 📈 37%)

    A big thank you to all contributing coders and translators! 🙌

    Document Viewer (Papers)

    View, search or annotate documents in many different formats.

    lbaudin says

    Malika’s Outreachy internship just ended! If all goes well, her work on improving signatures in Papers should land during next cycle. Read more about it here .

    Libadwaita

    Building blocks for modern GNOME apps using GTK4.

    Alice (she/her) 🏳️‍⚧️🏳️‍🌈 says

    I released libadwaita 1.9! Read the accompanying blog post to see what’s new

    Third Party Projects

    Haydn Trowell says

    Typesetter, the minimalist Typst editor, now speaks more languages. With the latest update, you can now use it in Chinese, French, Spanish, Turkish, and German. Thanks to Dawn Chan, Philippe Charlanes, XanderLeaDaren, Roger Weissenbrunner, Sabri Ünal, and Sebastian Kern for their time and effort!

    Get in on Flathub: https://flathub.org/apps/net.trowell.typesetter

    If you want to help bring Typesetter to your language, translations can be contributed via Weblate ( https://translate.codeberg.org/engage/typesetter/ ).

    Anton Isaiev announces

    I am incredibly excited to share the latest news about RustConn, covering the massive journey from version 0.9.4 to 0.9.15! This release cycle focused on making the app’s internal architecture as robust as its features. During this time, we closed dozens of feature requests and fixed numerous critical bugs.

    Here are the most important improvements from the recent updates:

    • Flawless Flatpak Experience: I completely resolved issues with importing Remmina configurations inside the sandbox and fixed specific SSH password prompt display bugs in environments like KDE.
    • Memory-Level Security: I introduced strict zeroing of Bitwarden master passwords in memory immediately after use. Additionally, I completely dropped the external sshpass dependency to enhance overall security.
    • Advanced Connections: The native SPICE client is now enabled by default. For RDP sessions, I added a convenient “Quick Actions” menu (one-click access to Task Manager, PowerShell, etc.), and for VNC, I introduced flexible encoding options.
    • Code & UI Cleanup: I completed a major refactoring of the UI modules (some became 5x lighter!), which eliminated text-clipping issues in dialogs and significantly improved application performance.

    I want to express a huge thank you to everyone who uses RustConn and takes the time to provide feedback! Your positive reviews and comments are the main thing that motivates me to work on the project every single day. At the same time, your bug reports and feature ideas are exactly what make these releases possible. Thank you for being such an amazing community!

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

    image.Dq1BuM4E_Y1Xsy.webp

    Mikhail Kostin announces

    Vinyl is a new (one more :D) music player. Vinyl built on rust with relm4 . The first stable version already available on Flathub and provides features:

    • Simple user-friendly interface inspired by amberol.
    • Basic media controls.
    • Lyrics (.lrc) support
    • MPRIS support for controlling Vinyl from other applications.
    • Save playlist and track/position of track, that played before the app close

    preview1.i_C0WAj7_Z5fp5b.webp

    Gir.Core

    Gir.Core is a project which aims to provide C# bindings for different GObject based libraries.

    Marcel Tiede reports

    GirCore released new C# bindings in version 0.8.0-preview.1 . It incldues new GTK composite template support and added bindings for GdkWayland-4.0.

    Miscellaneous

    GNOME OS

    The GNOME operating system, development and testing platform

    Valentin David announces

    GNOME OS now has kmscon enabled by default. Kmscon is a KMS/DRM userspace terminal that replaces the Linux virtual terminals (the ones from ctrl-alt-f#). It is a lot more configurable. So next time you try to debug GNOME Shell from a virtual terminal and the font is too small, press “ctrl +”.

    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!

    • Pl chevron_right

      Alice Mikhaylenko: Libadwaita 1.9

      news.movim.eu / PlanetGnome • 1 day ago • 6 minutes

    Screenshot of Characters, libadwaita demo and Highscore, demoing AdwSidebar in each

    Another slow cycle, same as last time. Still, a few new things to showcase.

    Sidebars

    Screenshot of the new sidebar in libadwaita demo and Characters

    The most visible addition is the new sidebar widget. This is a bit confusing, because we already had widgets for creating windows with sidebars - AdwNavigationSplitView and AdwOverlaySplitView , but nothing to actually put into the sidebar pane. The usual recommendation is to build your own sidebar using GtkListBox or GtkListView , combined with the .navigation-sidebar style class.

    This isn't too difficult, but the result is zero consistency between different apps, not unlike what we had with GtkNotebook -based tabs in the past:

    Screenshot of sidebars in various apps: libadwaita demo (no icons, no sections), Characters (icons, sections with non-dimmed labels, thicker rows), Confy (thinner rows, icons, but no sections), Chronograph (no sections, icons, and bold text, also no selection), Foliate (sections with smaller dimmed labels, icons, thin rows), Files (sections with separators, thin rows with dimmed icons), Iotas (no sections, even more dimmed icons, thick rows, number badges on the right), Sysprof (sections as separators, non-dimmed icons, thin rows, still number badges)

    It's even worse on mobile. In the best scenario it will just be a strangely styled flat list. Sometimes it will also have selection, and depending on how it's implemented it may be impossible to activate the selected row, like in libadwaita demo.

    So we have a pre-built one now. It doesn't aim to support every single use case (sidebars can get very complex, see e.g. GNOME Builder ), but just to be good enough for the basic situations.

    How basic is basic? Well, it has selection, sections (with or without titles), tooltips, context menus, a drop target, suffix widgets at the end of each item's row, auto-activation when hovered during drag-n-drop.

    A more advanced feature is built-in search filter - via providing a GtkFilter and a placeholder page.

    And that's about it. There will likely be more features in future, like collapsible sections and drag source on items, rather than just a drop target, but this should already be enough for quite a lot of apps. Not everything, but that's not the goal here.

    Internally, it's using GtkListBox . This means that it doesn't scale to thousands of items the way GtkListView would, but we can have much tighter API and mobile integration.

    Now, let's talk about mobile. Ideally sidebars on mobile wouldn't really be sidebars at all. This pattern inherently requires a second pane, and falls apart otherwise. AdwNavigationSplitView already presents the sidebar pane as a regular page, so let's go further and turn sidebars into boxed lists. We're already using GtkListBox , after all.

    So - AdwSidebar has the mode property. When set to ADW_SIDEBAR_MODE_PAGE , it becomes a page of boxed lists - indistinguishable from any others. It hides item selection, but it's still tracked internally. It can still be changed programmatically, and changes when an item is activated. Once the sidebar mode is set back to ADW_SIDEBAR_MODE_SIDEBAR , it will reappear.

    Internally it's nothing special, as it just presents the same data using different widgets.

    The adaptive layouts page has a detailed example for how to create UIs like this, as well as the newly added section about overlay sidebars that don't change as drastically.

    View switcher sidebar

    Screenshot of AdwViewSwitcherSidebar in sidebar and page modes

    Once we have a sidebar, a rather obvious thing to do is to provide a GtkStackSidebar replacement. So AdwViewSwitcherSidebar is exactly that.

    It works with AdwViewStack rather than GtkStack , and has all the same features as existing view switcher, as well as an extra one - sections.

    To support that, AdwViewStackPage has new API for defining sections - the :starts-section and :section-title properties, while the AdwViewStack:pages ) model is now a section model.

    Like regular sidebars, it supports the boxed list mode and search filtering.

    Unlike other view switchers or GtkStackSidebar , it also exposes AdwSidebar 's item activation signal. This is required to make it work on mobile.

    Demo improvements

    The lack of sidebar was the main blocker for improving libadwaita demo in the past. Now that it's solved, the demo is at last, fully adaptive. The sidebar has been reorganized into sections, and has icons and search now.

    This also unblocks other potential improvements, such as having a more scalable preferences dialog .

    Reduced motion

    While there isn't any new API, most widgets with animations have been updated to respect the new reduced motion preference - mostly by replacing sliding/scaling animations with crossfades, or otherwise toning down animations when it's impossible:

    • AdwDialog open/close transitions are crossfades except for the swipe-to-close gesture
    • AdwBottomSheet transition is a crossfade when there's no bottom bar, and a slide without overshooting if there is
    • AdwNavigationView transition is a crossfade except when using the swipe gestures
    • AdwTabOverview transition is a crossfade

    AdwOverlaySplitView is unaffected for now. Same for toasts, those are likely small enough to not cause motion sickness. If it turns out to be a problem, it can be changed later.

    I also didn't update any of the deprecated widgets, like AdwLeaflet . Applications still using those should switch to the modern alternatives.

    The prefers-reduced-motion media feature is available for use from app CSS as well, following the GTK addition.

    Other changes

    • AdwAboutDialog rows that contain links have a context menu now. Link rows may become a public widget in future if there's interest.

      Screenshot of the Support Questions and Report an Issue rows in about dialog, with a context menu with the following entries: Open Link, Copy Link Address
    • GTK_DEBUG=builder diagnostics are now supported for all libadwaita widgets. This can be used to find places where <child> tags are used in UI when equivalent properties exist.

    • Following GTK, all GListModel implementations now come with :item-type and :n-item properties, to make it easier to use them from expressions.

    • The AdwTabView:pages model implements sections now: one for pinned pages and one for everything else.

    • AdwToggle has a new :description property that can be used to set accessible description for individual toggles separately from tooltips.

    • Adrien Plazas improved accessibility in a bunch of widgets. The majority of this work has been backported to 1.8.x as well. For example, AdwViewSwitcher and AdwInlineViewSwither now read out number badges and needs attention status.

    • AdwNoneAnimationTarget now exists for situations where animations are used as frame clock-based timers, as an alternative to using AdwCallbackAnimationTarget with empty callback.

    • AdwPreferencesPage will refuse to add children of types other than AdwPreferencesGroup , instead of overlaying them over the page and then leaking them after the page is destroyed. This change was backported to 1.8.2 and subsequently reverted in 1.8.3 as it turned out multiple apps were relying on the broken behavior.

    • Maximiliano made non-nullable string setter functions automatically replace NULL parameters with empty strings, since allowing NULL breaks Rust bindings, while rejecting them means apps using expressions get unexpected criticals - for example, when accessing a non-nullable string property on an object, and that object itself is NULL .

    • As mentioned in the 1.8 blog post, style-dark.css , style-hc.css and style-hc-dark.css resources are now deprecated and apps using them will get warnings on startup. Apps are encouraged to switch to a single style.css and conditionally load styles using media queries instead.

    • While not a user-visible change (hopefully!), the internal stylesheet has been refactored to use prefers-contrast media queries for high contrast styles instead of 2 conditionally loaded variants - further reducing the need on SCSS, even if not entirely replacing it just yet. (the main blocker is @extend , as well nesting and a few mixins, such as focus ring)

    Future

    A big change in works is a revamp of icon API. GTK has a new icon format that supports stateful icons with animated transitions, variable stroke weight, and many other capabilities. Currently, libadwaita doesn't make use of this, but it will in future.

    In fact, a few smaller changes are already in 1.9: all of the internal icons in libadwaita itself, as well as in the demo and docs, have been updated to use the new format.


    Thanks to the GNOME STF Team for providing the funding for this work. Also thanks to the GNOME Foundation for their support and thanks to all the contributors who made this release possible.


    Because 2026 is such an interesting period of time to live in, I feel I should explicitly say that libadwaita does not contain any AI slop, nor does allow such contributions , nor do I have any plans to change that. Same goes for all of my other projects, including this website.

    • Pl chevron_right

      Sebastian Wick: Redefining Content Updates in Wayland

      news.movim.eu / PlanetGnome • 3 days ago • 3 minutes

    The Wayland core protocol has described surface state updates the same way since the beginning: requests modify pending state, commits either apply that state immediately or cache it into the parent for synchronized subsurfaces. Compositors implemented this model faithfully. Then things changed.

    Buffer Readiness and Compositor Deviation

    The problem emerged from GPU work timing. When a client commits a surface with a buffer, that buffer might still have GPU rendering in progress. If the compositor applies the commit immediately, it would display incomplete content—glitches. If the compositor submits its own GPU work with a dependency on the unfinished client work, it risks missing the deadlines for the next display refresh cycles and even worse stalling in some edge cases.

    To get predictable timing, the compositor needs to defer applying commits until the GPU work finishes. This requires tracking readiness constraints on committed state.

    Mutter was the first compositor to address this by implementing constraints and dependency tracking of content updates internally. Instead of immediately applying or caching commits, Mutter queued the changes in what we now call content updates, and only applied them when ready. Critically, this was an internal implementation detail. From the client’s perspective, the protocol semantics remained unchanged. Mutter had deviated from the implementation model implied by the specification while maintaining the observable behavior.

    New Protocols on Unstable Foundations

    When we wanted better frame timing control and a proper FIFO presentation modes on Wayland, we suddenly required explicit queuing of content updates to describe the behavior of the protocols. You can’t implement FIFO and scheduling of content updates without a queue, so both the fifo and commit-timing protocols were designed around the assumption that compositors maintain per-surface queues of content updates.

    These protocols were implemented in compositors on top of their internal queue-based architectures, and added to wayland-protocols. But the core protocol specification was never updated. It still described the old “apply or cache into parent state” model that has no notion of content updates, and per-surface queues.

    We now had a situation where the core protocol described one model, extension protocols assumed a different model, and compositors implemented something that sort of bridged both.

    Implementation and Theory

    That situation is not ideal: If the internal implementation follows the design which the core protocol implies, you can’t deal properly with pending client GPU work, and you can’t properly implement the latest timing protocols. To understand and implement the per-surface queue model, you would have to read a whole bunch of discussions, and most likely an implementation such as the one in mutter. The implementations in compositors also evolved organically, making them more complex than they actually have to be. To make matter worse, we also lacked a shared vocabulary for discussing the behavior.

    The obvious solution to this is specifying a general model of the per-surface content update queues in the core protocol. Easier said than done though. Coming up with a model that is sufficient to describe the new behavior while also being compatible with the old behavior when no constraints on content updates defer their application was harder than I expected.

    Together with Julian Orth, we managed to change the Wayland core protocol , and I wrote documentation about the system.

    Recently Pekka Paalanen and Julian Orth reviewed the work, which allowed it to land. The updated and improved Wayland book should get deployed soon, as well.

    The end result is that if you ever have to write a Wayland compositor, one of the trickier parts to get right should now be almost trivial. Implement the rules as specified, and things should just work. Edge cases are handled by the general rules rather than requiring special knowledge.

    • Pl chevron_right

      Andy Wingo: nominal types in webassembly

      news.movim.eu / PlanetGnome • 4 days ago • 4 minutes

    Before the managed data types extension to WebAssembly was incorporated in the standard, there was a huge debate about type equality. The end result is that if you have two types in a Wasm module that look the same, like this:

    (type $t (struct i32))
    (type $u (struct i32))
    

    Then they are for all intents and purposes equivalent. When a Wasm implementation loads up a module, it has to partition the module’s types into equivalence classes. When the Wasm program references a given type by name, as in (struct.get $t 0) which would get the first field of type $t , it maps $t to the equivalence class containing $t and $u . See the spec , for more details.

    This is a form of structural type equality . Sometimes this is what you want. But not always! Sometimes you want nominal types , in which no type declaration is equivalent to any other. WebAssembly doesn’t have that, but it has something close: recursive type groups . In fact, the type declarations above are equivalent to these:

    (rec (type $t (struct i32)))
    (rec (type $u (struct i32)))
    

    Which is to say, each type is in a group containing just itself. One thing that this allows is self-recursion, as in:

    (type $succ (struct (ref null $succ)))
    

    Here the struct’s field is itself a reference to a $succ struct, or null (because it’s ref null and not just ref ).

    To allow for mutual recursion between types, you put them in the same rec group, instead of each having its own:

    (rec
     (type $t (struct i32))
     (type $u (struct i32)))
    

    Between $t and $u we don’t have mutual recursion though, so why bother? Well rec groups have another role, which is that they are the unit of structural type equivalence. In this case, types $t and $u are not in the same equivalence class, because they are part of the same rec group. Again, see the spec .

    Within a Wasm module, rec gives you an approximation of nominal typing. But what about between modules? Let’s imagine that $t carries important capabilities, and you don’t want another module to be able to forge those capabilities. In this case, rec is not enough: the other module could define an equivalent rec group, construct a $t , and pass it to our module; because of isorecursive type equality, this would work just fine. What to do?

    cursèd nominal typing

    I said before that Wasm doesn’t have nominal types. That was true in the past, but no more! The nominal typing proposal was incorporated in the standard last July. Its vocabulary is a bit odd, though. You have to define your data types with the tag keyword :

    (tag $v (param $secret i32))
    

    Syntactically, these data types are a bit odd: you have to declare fields using param instead of field and you don’t have to wrap the fields in struct .

    They also omit some features relative to isorecursive structs, namely subtyping and mutability. However, sometimes subtyping is not necessary, and one can always assignment-convert mutable fields, wrapping them in mutable structs as needed.

    To construct a nominally-typed value, the mechanics are somewhat involved; instead of (struct.new $t (i32.const 42)) , you use throw :

    (block $b (result (ref exn))
     (try_table
      (catch_all_ref $b)
      (throw $v (i32.const 42)))
     (unreachable))
    

    Of course, as this is a new proposal, we don’t yet have precise type information on the Wasm side; the new instance instead is returned as the top type for nominally-typed values, exn .

    To check if a value is a $v , you need to write a bit of code:

    (func $is-v? (param $x (ref exn)) (result i32)
      (block $yep (result (ref exn))
       (block $nope
        (try_table
         (catch_ref $v $yep)
         (catch_all $nope)
         (throw_ref (local.get $x))))
       (return (i32.const 0)))
      (return (i32.const 1)))
    

    Finally, field access is a bit odd; unlike structs which have struct.get , nominal types receive all their values via a catch handler.

    (func $v-fields (param $x (ref exn)) (result i32)
      (try_table
       (catch $v 0)
       (throw_ref (local.get $x)))
      (unreachable))
    

    Here, the 0 in the (catch $v 0) refers to the function call itself: all fields of $v get returned from the function call. In this case there’s only one, othewise a get-fields function would return multiple values. Happily, this accessor preserves type safety: if $x is not actually $v , an exception will be thrown.

    Now, sometimes you want to be quite strict about your nominal type identities; in that case, just define your tag in a module and don’t export it. But if you want to enable composition in a principled way, not just subject to the randomness of whether another module happens to implement a type structurally the same as your own, the nominal typing proposal also gives a preview of type imports . The facility is direct: you simply export your tag from your module, and allow other modules to import it. Everything will work as expected!

    fin

    Friends, as I am sure is abundantly clear, this is a troll post :) It’s not wrong, though! All of the facilities for nominally-typed structs without subtyping or field mutability are present in the exception-handling proposal.

    The context for this work was that I was updating Hoot to use the newer version of Wasm exception handling, instead of the pre-standardization version. It was a nice change, but as it introduces the exnref type, it does open the door to some funny shenanigans, and I find it hilarious that the committee has been hemming and hawwing about type imports for 7 years and then goes and ships it in this backward kind of way.

    Next up, exception support in Wastrel , as soon as I can figure out where to allocate type tags for this new nominal typing facility. Onwards and upwards!

    • Pl chevron_right

      Andy Wingo: free trade and the left, ter: mises and my apostasy

      news.movim.eu / PlanetGnome • 6 March 2026 • 8 minutes

    Good evening. Let’s talk about free trade!

    Last time, we discussed Marc-William Palen’s Pax Economica , which looks at how the cause of free trade was taken up by a motley crew of anti-imperialists, internationalists, pacifists, marxists, and classical liberals in the nineteenth century. Protectionism was the prerogative of empire—only available to those with a navy—and it so it makes sense that idealists might support “peace through trade”. So how did free trade go from a cause of the “another world is possible” crowd to the halls of the WTO? Did we leftists catch a case of buyer’s remorse, or did the goods delivered simply not correspond to the order?

    To make an attempt at an answer, we need more history. From the acknowledgements of Quinn Slobodian’s Globalists :

    This book is a long-simmering product of the Seattle protests against the World Trade Organization in 1999. I was part of a generation that came of age after the Cold War's end. We became adolescents in the midst of talk of globalization and the End of History. In the more hyperactive versions of this talk, we were made to think that nations were over and the one indisputable bond uniting humanity was the global economy. Seattle was a moment when we started to make collective sense of what was going on and take back the story line. I did not make the trip north from Portland but many of my friends and acquaintances did, painting giant papier-mâché fists red to strap to backpacks and coming back with takes of zip ties and pepper spray, nights in jail, and encounters with police—tales they spun into war stories and theses. This book is an apology for not being there and an attempt to rediscover in words what the concept was that they went there to fight.

    Slobodian’s approach is to pull on the thread that centers around the WTO itself. He ends up identifying what he calls the “Geneva School” of neoliberalism: from Mise’s circle in Vienna, to the International Chamber of Commerce in Paris, to the Hayek-inspired Mont Pèlerin Society, to Petersmann of the WTO precursor GATT organization, Röpke of the Geneva Graduate Institute of International Studies, and their lesser successors of the 1970s and 1980s.

    The thesis that Slobodian ends up drawing is that neoliberalism is not actually a laissez-faire fundamentalism, but rather an ideology that placed the value of free-flowing commerce above everything else: above democracy, above sovereignty, above peace, and that as such it actually requires active instutional design to protect commerce from the dangers of, say, hard-won gains by working people in one country (Austria, 1927), expropriation of foreign-owned plantations in favor of landless peasants (Guatemala, 1952), internal redistribution within countries transitioning out of minority rule (South Africa, 1996), decolonization (1945-1975 or so), or just the election of a moderate socialist at the ballot box (Chile, 1971).

    Now, dear reader, I admit to the conceit that if you are reading this, probably you are a leftist also, and if not, at least you are interested in understanding how it is that we think, with what baubles do we populate our mental attics, that sort of thing. Well, friend, you know that by the time we get to Chile and Allende we are stomping and clapping our hands and shouting in an extasy of indignant sectarian righteousness. And that therefore should we invoke the spectre of neoliberalism, it is with the deepest of disgust and disdain: this project and all it stands for is against me and mine. I hate it like I hated Henry Kissinger, which is to say, a lot, viscerally, it hurts now to think of it, rest in piss you bastard .

    two theologies

    And yet, I’m still left wondering what became of the odd alliance of Marx with Manchester liberalism. Palen’s Pax Economica continues to sketch a thin line through the twentieth century, focusing on showing the continued presence of commercial-peace exponents despite it not turning out to be our century. But the rightward turn of the main contingent of free-trade supporters is not explained. I have an idea about how it is that this happened; it is anything but scholarly, but here we go.

    Let us take out our coarsest brush to paint a crude story: the 19th century begins in the wake of the American and French revolutions, making the third estate and the bourgeoisie together the revolutionary actors of history. It was a time in which “we” could imagine organizing society in different ways, the age of the utopian imaginary, but overlaid with the structures of the old, old money, old land ownership, revanchist monarchs, old power, old empire. In this context, Cobden’s Anti-Corn Law League was insurgent, heterodox, asking for a specific political change with the goal of making life on earth better for the masses. Free trade was a means to an end. Not all Cobdenites had the same ends, but Marx and Manchester both did have ends, and they happened to coincide in the means.

    Come the close of the Great War in 1918, times have changed. The bourgeoisie have replaced the nobility as the incumbent power, and those erstwhile bourgeois campaigners now have to choose between idealism and their own interest. But how to choose?

    Some bourgeois campaigners will choose a kind of humanist notion of progress; this is the thread traced by Palen, through the Carnegie Endowment for International Peace , the Young Women’s Christian Association, the Haslemere Group , and others.

    Some actors are not part of the hegemonic bourgeoisie at all, and so have other interests. The newly independent nations after decolonization have more motive to upend the system than to preserve it; their approach to free trade has both tactical and ideological components. Tactical, in the sense that they wanted access to first-world markets, but also sometimes some protections for their own industries; ideological, in the sense that they often acted in solidarity with other new nations against the dominant powers. In addition to the new nations, the Soviet bloc had its own semi-imperial project, and its own specific set of external threats; we cannot blame them for being tactical either.

    And then you have Ludwig von Mises. Slobodian hints at Mises’ youth in the Austro-Hungarian empire, a vast domain of many languages and peoples but united by trade and the order imposed by monarchy. After the war and the breakup of the empire, I can only imagine—and here I am imagining, this is not a well-evidenced conclusion—I imagine he felt a sense of loss. In the inter-war, he holds court as the doyen of the Vienna Chamber of Commerce, trying to put the puzzle pieces back together, to reconstruct the total integration of imperial commerce, but from within Red Vienna . When in 1927, a court decision acquitted a fascist milicia that fired into a crowd, killing a worker and a child , the city went on general strike, and workers burned down the ministry of justice. Police responded violently, killing 89 people and injuring over 1000. Mises was delighted: order was restored.

    And now, a parenthesis. I grew up Catholic, in a ordinary kind of way. Then in my early teens, I concluded that if faith meant anything, it has to burn with a kind of fervor; I became an evangelical Catholic, if such is a thing. There were special camps you could go to with intense emotional experiences and people singing together and all of that is God, did you know? Did you know? The feelings attenuated over time but I am a finisher, and so I got confirmed towards the end of high school. I went off to university for physics and stuff and eventually, painfully, agonizingly concluded there was no space for God in the equations.

    Losing God was incredibly traumatic for me. Not that I missed, like, the idea of some guy, but as someone who wants things to make sense, to have meaning, to be based on something, anything at all: losing a core value or morality invalidated so many ideas I had about the world and about myself. What is the good life, a life well led? What is true and right in a way that is not contingent on history? I am embarrassed to say that for a while I took the UN declaration of human rights to be axiomatic.

    When I think about Mise’s reaction to the 1927 general strike in Vienna, I think about how I scrambled to find something, anything, to replace my faith in God. As the space for God shrank with every advance in science, some chose to identify God with his works, and then to progressively ascribe divine qualities to those works: perhaps commerce is axiomatically Good, and yet ineffable, in the sense that it is Good on its own, and that no mortal act can improve upon it. How else can we interpret Hayek’s relationship with the market except as awe in the presence of the divine?

    This is how I have come to understand the neoliberal value system: a monotheism with mammon as godhead. There may be different schools within it, but all of the faithful worship the same when they have to choose between, say, commerce and democracy, commerce and worker’s rights, commerce and environmental regulation, commerce and taxation, commerce and opposition to apartheid. It’s a weird choice of deity. Now that God is dead, one could have chosen anything to take His place, and these guys chose the “global economy”. I would pity them if I still had a proper Christian heart.

    means without end

    I think that neoliberals made a miscalculation when they concluded that the peace of doux commerce is not predicated on justice. Sure, in the short run, you can do business with Pinochet’s Chile, privatize the national mining companies, and cut unemployment benefits, but not without incurring moral damage; people will see through it, in time, as they did in Seattle in 1999. Slobodian refers to the ratification of the WTO as a Pyrrhic victory; in their triumph, neoliberals painted a target on their backs.

    Where does this leave us now? And what about Mercosur? I’m starting to feel the shape of an answer, but I’m not there yet. I think we’ll cover the gap between Seattle and the present day in a future dispatch. Until then, let’s take care of one other; as spoke the prophet Pratchett, there’s no justice, just us.

    • Pl chevron_right

      Allan Day: GNOME Foundation Update, 2026-03-06

      news.movim.eu / PlanetGnome • 6 March 2026 • 2 minutes

    This post is the latest in my series of GNOME Foundation updates. I’m writing these in my capacity as Foundation President, where I’m busy managing a lot of what’s happening at the organisation at the moment. Each of these posts is a report on what happened over a particular period, and this post covers the current week as well as the previous one (23rd February to 6th March).

    Audit time

    I’ve mentioned the GNOME Foundation’s audit on numerous occassions previously. This is being conducted as a matter of routine, but it is our first full formal audit, so we have been learning a lot about what’s involved.

    This week has been the audit fieldwork itself, which has been quite intense and a lot of work for everyone involved. The audit team consists of 5 people, most of whom are accountants of different grades. Our own finance team has been meeting with them three times a day since Tuesday, answering questions, doing walkthroughs of our systems, and providing additional documents as requested.

    A big part of the audit is cross-referencing and checking documentation, and we have been busy responding to requests for information throughout the week. On last count, we have provided 140 documents to the auditors this week alone, on 20 different themes, including statements, receipts, contracts, invoices, sponsorship agreements, finance reports, and so on.

    We’re expecting the draft audit report in about three weeks. Initial signs are good!

    GUADEC 2026

    Planning activity for GUADEC 2026 has continued over the past two weeks. That includes organising catering, audio visual facilities, a photographer, and sponsorship work.

    Registration for the event is now open. The Call for Papers is also open and will close on 13 March – just one week away! If you would like to present this year, please submit an abstract!

    If you would like travel sponsorship for GUADEC, there are two deadlines to submit a request: 15th March (for those who need to book travel early, such as if they need a visa) and 24th May (for those with less time pressure).

    LAS 2026

    This year’s Linux App Summit is happening in Berlin, on the 16th and 17th May, and is shaping up to be a great event. As usual we are co-organizing the event with KDE, and the call for proposals has just opened. If you’d like to present, you have until 23rd March to submit a paper.

    The Travel Committee will be accepting travel applications for LAS attendees this year, so if you’d like to attend and need travel assistance, please submit a request no later than 13th April.

    Infrastructure

    On the infrastracture side, GNOME’s single sign on service has been integrated with blogs.gnome.org, which is great for security, as well as meaning that you won’t need to remember an extra password for our WordPress instance. Many thanks to miniOrange for providing us with support for their OAuth plugin for WordPress, which has allowed this to happen!

    That’s it for my update this week. In addition to the highlights that I’ve mentioned, there are quite a number of other activities happening at the Foundation right now, particularly around new programs, some of which we’re not quite ready to talk about, but hope to provide updates on soon.

    • Pl chevron_right

      This Week in GNOME: #239 Accessibility Contributions

      news.movim.eu / PlanetGnome • 6 March 2026 • 5 minutes

    Update on what happened across the GNOME project in the week from February 27 to March 06.

    GNOME Core Apps and Libraries

    Calendar

    A simple calendar application.

    Hari Rana | TheEvilSkeleton (any/all) 🇮🇳 🏳️‍⚧️ reports

    Everyone, rejoice 🙌

    Georges livestreamed himself reviewing and merging accessibility contributions in GNOME Calendar again, specifically the entirety of merge request !564 , which introduces keyboard-navigable month cells. As a result, as of GNOME 50, GNOME Calendar’s month view will be fully navigable with a keyboard for the first time in its history !

    Here’s a quick explanation of how to navigate:

    • When tabbing between events, focus moves chronologically. This means that focus continues to move down until there are no event widgets overlaying the current cell. Then, focus moves to the topmost event widget in the next cell or row. Tabbing backwards with Shift+Tab moves in the opposite direction.
    • On the last event widget, pressing Tab moves the focus to the adjacent month cell. Conversely, pressing Ctrl+Tab on any event widget has the same effect.
    • Pressing an activation button (such as Enter or Space) displays the popover for creating an event. Additionally, pressing and holding the Shift key while pressing the arrow keys selects every cell between the start and end positions until the Shift key is released, which displays the popover with the selected range.

    The only high-level goal that needs work now is conveying these information with assistive technologies properly.

    Both merge requests !564 and !598 took us almost an entire year to explore various approaches and finally settle on the best one for our use case. Everything was done voluntarily, relying solely on support from donors and those who share these posts, without any financial backing from other entities. In contrast, most, if not all, calendar apps backed by trillion-dollar companies still don’t offer proper keyboard navigation across their views. In many cases, they haven’t even reached feature parity. If it is not too much trouble, please consider funding my accessibility work on GNOME . Thank you! ♥️

    GTK

    Cross-platform widget toolkit for creating graphical user interfaces.

    Emmanuele Bassi reports

    GTK 4.22.0 is now available for application developers! Lots of changes happened in this development cycle:

    • a new SVG-based format for symbolic icons, including state-based animations
    • GtkSvg , a paintable that renders (animated) SVG efficiently
    • GtkAccessibleHypertext , an interface for accessible object containing links
    • GTK now relies on the settings portal, under Wayland
    • improved language filtering in the font selection dialog
    • a new reduced motion setting, complete with media query, for controlling the amount and type of animations in widgets
    • GskRenderReplay , a new API for replaying render nodes
    • the backdrop-filter CSS property is now supported
    • GtkPopoverBin is a new widget that you can use to show a popover menu on a widget

    GTK 4.22 is going to be available in the GNOME 50 run time.

    Python Bindings (PyGObject)

    Python language bindings for GNOME platform libraries.

    Arjan reports

    PyGObject 3.56.0 has just been released. Major features include: better integration with GObject’s lifecycle ( do_constructed , do_dispose ), a simpler way to deal with Python wrapper objects, and cleanup of legacy code.

    A write-up of the most important changes can be found at https://pygobject.gnome.org/news/pygobject-3-56.html .

    This is a stable release, so you can find it on PyPI , as well as the GNOME download server .

    Third Party Projects

    Ronnie Nissan announces

    This week I released concessio v0.3.0 adding support for umask conversions. This was a requested feature. I also added umask explanition to the help dialog. Hope you will like it.

    You can get Concessio from Flathub

    concessio-v0.3.0-umask-page.B3B6bQWS_Z2YlkB.webp

    Ans Ibrahim says

    Memento , the movie tracking app, got updates this week with version 1.1.0 and 1.1.1 :

    • IMDb rating support in movie details and refresh flow
    • Localization improvements, including French translations
    • UI and navigation polish, plus layout fixes

    Also highlighting the original 1.0.0 features:

    • Watchlist management with search, sorting, and pagination
    • Play history tracking with date, place, and optional comments
    • Movie details with cast/crew and external links
    • Dashboard and top-people insights

    dashboard-overview.BTLLCxuY_Z1CDiz6.webp

    Marcel Tiede announces

    There is a new community project Maui.Gtk that integrates GTK via the GirCore C# bindings as a linux backend for Microsoft’s MAUI .

    Rat Cornu says

    ratic is a new music player in construction, built with gtk-rs and relm4 . The first version was released this week, with:

    • Support of most music files
    • Sort and group by album, artist, full-text searching
    • Dynamic blurred background with light/dark modes
    • A music queue with several play modes
    • Support of MPRIS controls
    • Internationalization support using weblate (currently only english and french) It still misses a lot of features, but it will continue to grow in the following weeks, so do not hesitate to test it, open an issue or even come talk with us in the matrix room !

    ratic_preview_main.DbwUSOFf_Z25Y3vP.webp

    Ronnie Nissan announces

    Just today I published Embellish v0.7.0. This version adds support for custom fonts.

    • Add a custom font using a url pointing to a zip or tar.xz file
    • Export all the custom fonts
    • Import custom fonts either from a file or by copy pasting them in the import dialog
    • The import dialog using GtkSourceView to color highlight the json data

    Tip: you can add any font, not just NerdFonts making Embellish a really useful tool in my biased opinion.

    You can get Embellish from Flathub

    embellish-v0.7.0-main-page.CRMisurb_NEttl.webp

    embellish-v0.7.0-import-dialog.0VACNsnN_138LRp.webp

    Parabolic

    Download web video and audio.

    Nick reports

    Parabolic V2026.3.0-beta1 is here!

    This release contains many new features, fixes and a new macOS build of the GNOME app! We are asking all users to help test this release and the new macOS build, if possible (as I personally do not own a Mac so I rely on users in the community to work with me in testing). Thank you for any help in advanced! 😃

    Here’s the full changelog:

    • Added macOS app for the GNOME version of Parabolic
    • Added Windows portable version of Parabolic
    • Added the ability to specify a preferred frame rate for video downloads in the Parabolic’s settings
    • Added the ability to automatically translate embedded metadata and chapters to the app’s language on supported sites. This can be turned off in Converter settings
    • Added the ability to update deno from within the app
    • Added thumbnail image preview to add download dialog and downloads view
    • Added failed filter to downloads view
    • Improved selection of playlist video formats when resolutions are specified
    • Improved selection of playlist audio formats on Windows when bitrates are specified
    • Improved cropping of audio thumbnails
    • Improved handling of long file names, they will now be truncated if too long
    • Removed unsupported cookie browsers on Windows. Manual txt files should be used instead
    • Updated yt-dlp

    Parabolic_V2026.2.0.BBxr5_C5_Z1jVJEy.webp

    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!