call_end

    • chevron_right

      Steven Deobald: 2025-06-06 Foundation Report

      news.movim.eu / PlanetGnome • 7 June • 4 minutes

    Imagine a punchy, news-broadcast-sounding intro tune and probably some 3D text swinging around a shiny, silver globe. Dun da da dun: The June 6th, 2025 GNOME Foundation Report!

    Sorry. These reports need a little colour or I’m going to get bored of writing them. Also sorry this one is late again! Busy week.

    ## Fundraising

    This week’s big activity (for me) was preparing a fundraising proposal for the Board of Directors at a special meeting on Tuesday. The day before, everyone on staff patiently listened to me shout and spit and sweat and then patiently gave me feedback. Thanks y’all.

    Sidenote: I love the notion of a “special meeting.” I know it’s not meant to feel cute and silly, but it feels very cute and silly. That said, we got a lot done!

    The Board is on-board. Yay. We had a project kickoff the next day. We have a repo, we have some early work done already. I’m not allowed to make any promises. 😉 So you’ll just have to watch this space, I guess.

    ## Treasurer

    During the special meeting, it was voted that we would make an offer to a new Treasurer. I’m really looking forward to this announcement if they accept!

    ## Project Wall!

    The Staff project wall is really taking off, and it feels like we have some momentum with it now. Too many things in flight and too many cards in the “blocked” column, but we’re steadily improving.

    ## Vaultwarden

    Bart’s hooked us up with Vaultwarden for the Foundation’s shared passwords, as our tooling was a little broken and/or scattered previously. Yay! Thanks Bart.

    ## Digital Wellbeing Frontend

    We held a Digital Wellbeing meeting on Tuesday and we now have a Call for Proposals up:

    https://discourse.gnome.org/t/request-for-proposals-digital-wellbeing-frontend/29289

    If you still know C and you want to help take this project over the line, it’s a neat piece of integration work.

    ## 501(c)3s

    I met my friend Brihas, who is also an Executive Director of another 501(c)3. It was good to pick his brain about:

    • Limits to capital retention: Despite a widely-held misconception, there aren’t any.
    • 990 Schedule B redactions: When and why. The GNOME Foundation fully redacts our Schedule Bs… that seemed weird to me at first but he says it’s fairly common, which agrees with what others have told me.
    • How to keep the Board engaged: Whether one has a Working Board or not (we do), “engagement” in this question refers to the level of governance, not execution. He said his organization has found real benefit in a stricter adherence to Policy Governance . I’m inclined toward a stricter form of this model myself, and would encourage potential Board members (this year and in future years) to glance through that Wikipedia page.
    • How to take vacation: He prepares a year in advance. Seems about right.

    ## Meeting The Matts

    I had a chance to sit down with an old friend (Matt Godbolt, of Compiler Explorer fame) and a new friend (Matt Hartley, of Framework Computer fame). We talked variously about how to raise money, the future of the Linux desktop, the “sandwich problem” (that GNOME neither has the name recognition of Linux nor the product recognition of distros), and the fact that every cool kid at Strange Loop 2024 was running a Framework, not a Mac.

    I left both calls super excited to talk to them both again. Great folks. (I also just noticed their respective website have very similar gear favicons.)

    ## Grants

    I got to talk to Richard! He’s still very busy. He had some grant suggestions. It was nice to see him.

    ## End of 10

    I’ve still got an eye toward the https://endof10.org/ project. Increasingly, I have a fantasy of a simple, brightly-coloured A4 that explains how to get started with GNOME, in ~6 steps, if you’re coming from Windows:

    • what’s the equivalent of the “start” button? (do they still… call it that?)
    • how do I run a program?
    • how do I install a program?
    • how do I start the web browser? which one should I use? how do I get chrome[ium]?
    • where are my files?
    • where are my settings?

    Extras for the back side of the paper:

    • “modern” apps: Discord, Slack, Spotify, Telegram, Signal, etc.
    • how to install games
    • GNOME-specific features (virtual desktops and such)
    • core platform apps
    • “everyday” settings: wifi, bluetooth, light/dark mode, etc.
    • GNOME Online Accounts and Office files

    What do you think? Would you want to help with this? Is this a silly idea? Does this already exist somewhere?

    ## Meeting People

    I had a nice conversation with Lorenz, as he’s the only Board candidate I hadn’t spoken to yet. I met Sumana Harihareswara, who is extremely cool and I ran out of time while picking her brain about the various ways the GNOME Foundation can start its own grants program. I got some advice from Federico about how to improve our docs-creation process… among other things, he had the pretty sensible idea of just letting people barf streams of consciousness at me (or other folks comfortable with reStructuredText) and letting the documentation gnomes clean it up before publishing it. Seems legit! I had my first formal feedback session with Rosanna — she had prepared a 5-point structured document and I had to admit to her it was the most rigorous feedback I’ve ever received. 🙂

    ## UN Open Source Week

    I found a couch to crash on in NYC and a cheap flight, so I’ll be there! If you’re in NYC the week of the 16th to the 20th, reach out!

    That’s all for this week. See you in the next one and I’m sorry I didn’t make it in time for TWIG again.

    • wifi_tethering open_in_new

      This post is public

      blogs.gnome.org /steven/2025/06/07/2025-06-06-foundation-report/

    • chevron_right

      Luis Villa: book reports, mid-2025

      news.movim.eu / PlanetGnome • 6 June • 4 minutes

    Some brief notes on books, at the start of a summer that hopefully will allow for more reading.

    Monk and Robot (Becky Chambers); Mossa and Pleiti (Malka Older)

    Summer reading rec, and ask for more recs: “cozy sci-fi” is now a thing and I love it. Characters going through life, drinking hot beverages, trying to be comfortable despite (waves hands) everything. Mostly coincidentally, doing all those things in post-dystopian far-away planets (one fictional, one Jupiter).

    Novellas, perfect for summer reads. Find a sunny nook (or better yet, a rainy summer day nook) and enjoy. (New Mossa and Pleiti comes out Tuesday, yay!)

    Buzz Aldrin, in the Apollo 11 capsule, with a bright window visible and many dials and switches behind him. He is wearing white clothing with NASA patches, but not a full space suit, and is focused on whatever is in front of him, out of frame. A complex socio-technical system, bounding boldly, perhaps foolishly, into the future. ( Original via NASA )

    Underground Empire (Henry Farrell and Abraham Newman)

    This book is about things I know a fair bit about, like international trade sanctions, money transfers, and technology (particularly the intersection of spying and data pipes). So in some sense I learned very little.

    But the book efficiently crystallizes all that knowledge into a very dense, smart, important observation: that some aspects of American so-called “soft” (i.e., non-military) power are in increasingly very “hard”. To paraphrase, the book’s core claim is that the US has, since 2001, amassed what amounts to several, fragmentary “Departments of Economic War”. These mechanisms use control over financial and IP transfers to allow whoever is in power in DC to fight whoever it wants. This is primarily China, Russia, and Iran, but also to some extent entities as big as the EU and as small as individual cargo ship captains.

    The results are many. Among other things, the authors conclude that because this change is not widely-noticed, it is undertheorized, and so many of the players lack the intellectual toolkit to reason about it. Relatedly, they argue that the entire international system is currently more fragile and unstable than it has been in a long time exactly because of this dynamic: the US’s long-standing military power is now matched by globe-spanning economic control that previous US governments have mostly lacked, which in turn is causing the EU and China to try to build their own countervailing mechanisms. But everyone involved is feeling their way through it—which can easily lead to spirals. (Threaded throughout the book, but only rarely explicitly discussed, is the role of democracy in all of this—suffice to say that as told here, it is rarely a constraining factor.)

    Tech as we normally think of it is not a big player here, but nevertheless plays several illustrative parts. Microsoft’s historical turn from government fighter to Ukraine supporter, Meta’s failed cryptocurrency, and various wiretapping comes up for discussion—but mostly in contexts that are very reactive to, or provocative irritants to, the 800lb gorillas of IRL governments.

    Unusually for my past book reports on governance and power, where I’ve been known to stretch almost anything into an allegory for open , I’m not sure that this has many parallels. Rather, the relevance to open is that these are a series of fights that open may increasingly be drawn into—and/or destabilize. Ultimately, one way of thinking about this modern form of power dynamics is that it is a governmental search for “chokepoints” that can be used to force others to bend the knee, and a corresponding distaste for sources of independent power that have no obvious chokepoints. That’s a legitimately complicated problem—the authors have some interesting discussion with Vitalik Buterin about it—and open, like everyone else, is going to have to adapt.

    Dying Every Day: Seneca at the Court of Nero (James Romm)

    Good news: this book documents that being a thoughtful person, seeking good in the world, in the time of a mad king, is not a new problem.

    Bad news: this book mostly documents that the ancients didn’t have better answers to this problem than we moderns do.

    The Challenger Launch Decision (Diane Vaughan)

    The research and history in this book are amazing, but the terminology does not quite capture what it is trying to share out as learnings. (It’s also very dry.)

    The key takeaway: good people, doing hard work, in systems that slowly learn to handle variation, can be completely unprepared for—and incapable of handling—things outside the scope of that variation.

    It’s definitely the best book about the political analysis of the New York Times in the age of the modern GOP. Also probably good for a lot of technical organizations handling the radical-but-seemingly-small changes detailed in Underground Empire .

    Spacesuit: Fashioning Apollo (Nicholas De Monchaux)

    A book about how interfaces between humans and technology is hard. (I mean clothes, but also everything else.) Delightful and wide-ranging; maybe won’t really learn any deep lessons here but it’d be a great way to force undergrads to grapple with Hard Human Problems That Engineers Thought Would Be Simple.

    • wifi_tethering open_in_new

      This post is public

      lu.is /2025/06/book-reports-mid-2025/

    • chevron_right

      Jonathan Blandford: Crosswords 0.3.15: Planet Crosswords

      news.movim.eu / PlanetGnome • 6 June • 3 minutes

    It’s summer, which means its time for GSoC/Outreachy. This is the third year the Crosswords team is participating, and it has been fantastic. We had a noticeably large number of really strong candidates who showed up and wrote high-quality submissions — significantly more than previous years. There were a more candidates then we could handle, and it was a shame to have to turn some down.

    In the end, Tanmay, Federico, and I got together and decided to stretch ourselves and accept three interns for the summer: Nancy , Toluwaleke , and Victor . They will be working on word lists, printing, and overlays respectively, and I’m so thrilled to have them helping out.

    A result of this is that there will be a larger number of Crossword posts on planet.gnome.org this summer. I hope everyone is okay with that, and encourages them so they stay involved with GNOME and Free Software.

    Release

    This last release was mostly a bugfix release. The intern candidates outdid themselves this year by fixing a large number of bugs — so many that I’m releasing this to get them to users. Some highlights:

    • Mahmoud added an open dialog to the game and got auto-download of puzzles working. He also created an arabic .ipuz file to test with which revealed quite a few rendering bugs.
    Arabic Crossword Arabic Crossword
    • Toluwaleke refined the selection code. This was accidentally marked as a newcomer issue, and was absolutely not supposed to be. Nevertheless, he nailed it and has left selection in a much healthier state.
      • [ It’s worth highlighting that the initial MR for this issue is a masterclass in contributions, and one of the best MRs I’ve ever received. If you’re a potential GSoC intern, you could learn a lot from reading it. ]
    • Victor fixed divided cells and a number of small behavior bugs. He also did methodical research into other crossword editors.
    Divided Cells Divided Cells
    • Patel and Soham contributed visual improvements for barred and acrostic puzzles

    In addition, GSoC-alum Tanmay has kept plugging on his Acrostic editor. It’s gotten a lot more sophisticated, and for the first time we’re including it in the stable build (albeit as a Beta). This version can be used to create a simple acrostic puzzle. I’ll let Tanmay post about it in the coming days.

    Coordinates

    Specs are hard, especially for file formats. We made an unfortunate discovery about the ipuz spec this cycle. The spec uses a coordinate system to refer to cells in a puzzle — but does not define what the coordinate system means. It provides an example with the upper left corner being (0,0) and that’s intuitively a normal addressing system. However, they refer to (ROW1, COL1) in the spec, and there are a few examples in the spec that start the upper left at (1, 1).

    When we ran across this issue while writing libipuz we tried a few puzzles in puzzazz (the original implementation) to confirm that (0,0) was the intended origin coordinate. However, we have run across some implementations and puzzles in the wild starting at (1,1). This is going to be pretty painful to untangle, as they two interpretations are largely incompatible. We have a plan to detect the coordinate system being used, but it’ll be a rough heuristic at best until the spec gets clarified and revamped.

    By the Numbers

    With this release, I took a step back and took stock of my little project. The recent releases have seemed pretty substantial, and it’s worth doing a little introspection. As of this release, we’ve reached:

    • 85KLOC total. 60KLOC in the app and 25KLOC in the library
    • 27K words of design docs ( development guide )
    • 126 distinct test cases
    • 33 different contributors. I’m now at 82% of the commits and dropping
    • 6 translations (and hopefully many more some day)
    • Over 100 unencumbered puzzles in the base puzzle sets. This number needs to grow.

    All in all, not too shabby, and not so little anymore.

    A Final Request

    Crosswords has an official flatpak , an unofficial snap , and Fedora and Arch packages. People have built it on Macs, and there’s even an APK that exists. However, there’s still no Debian package. That distro is not my world: I’m hoping someone out there will be inspired to package this project for us.

    • wifi_tethering open_in_new

      This post is public

      blogs.gnome.org /jrb/2025/06/06/crosswords-0-3-15-planet-crosswords/

    • chevron_right

      Jussi Pakkanen: Custom C++ stdlib part 3: The bleedingest edge variant

      news.movim.eu / PlanetGnome • 6 June • 2 minutes

    Implementing a variant type in C++ is challenging to say the least. I tried looking into the libstd++ implementation and could not even decipher where the actual data is stored. There is a lot of inheritance going on and helper classes that seem to be doing custom vtable construction and other metaprogramming stuff. The only thing I could truly grasp was a comment saying // "These go to eleven" . Sadly there was not a comment // Smell my glove! which would seem more suitable for this occasion.

    A modern stdlib does need a variant, though, so I had to implement one. To make it feasible I made the following simplifying assumptions.

    1. All types handled must be noexcept default constructible, move constructible and movable. (i.e. the WellBehaved concept )
    2. If you have a properly allocated and aligned piece of memory, placement new'ing into it works (there may be UB-shenanigans here due to the memory model)
    3. The number of different types that a variant can hold has a predefined static maximum value.
    4. You don't need to support any C++ version older than c++26.
    The last one of these is the biggest hurdle, as C++26 will not be released for at least a year. GCC 15 does have support for it, though, so all code below only works with that.

    The implementation

    At its core, a Pystd variant is nothing more than a byte buffer and an index specifying which type it holds:

    template<typename T...>
    class Variant {
    <other stuff>
    char buf[compute_size<0, T...>()] alignas(compute_alignment<0, T...>());
    int8_t type_id;
    };

    The functions to compute max size and alignment requirements for types are simple to implement. The main problem lies elsewhere, specifically: going from a type to the corresponding index, going from a compile time index value to a type and going from a runtime index to the corresponding type.

    The middle one is the simplest of these. As of C++26 you can directly index the argument pack like so:

    using nth_type = T...[compile_time_constant];

    Going from type to an index is only slightly more difficult:

    Going from a runtime value to a type is the difficult one. I don't know how to do it "correctly", i.e. the way a proper stdlib implementation does it. However, since the number of possible types is limited at compile time, we can cheat (currently only 5 types are supported):

    Unrolling (type) loops like its 1988! This means you can't have variants with hundreds of different types, but in that case you probably need an architectural redesign rather than a more capable variant.

    With these primitives implementing public class methods is fairly simple.

    The end result

    The variant implementation in Pystd and its helper code took approximately 200 lines of code. It handles all the basic stuff in addition to being exception safe for copy operations (implemented as copy to a local variable + move). Compile times remain in fractions of a second per file even though Pystd only has a single public header.

    It works in the sense that you can put different types in to it, switch between them and so on without any compiler warnings, sanitizer issues or Valgrind complaints. So be careful with the code, I have only tested it, not proven it correct.

    No performance optimization or even measurements have been made.


    • wifi_tethering open_in_new

      This post is public

      nibblestew.blogspot.com /2025/06/custom-c-stdlib-part-3-bleedingest-edge.html

    • chevron_right

      Matthew Garrett: How Twitter could (somewhat) fix their encrypted DMs

      news.movim.eu / PlanetGnome • 5 June • 1 minute

    As I wrote in my last post , Twitter's new encrypted DM infrastructure is pretty awful. But the amount of work required to make it somewhat better isn't large.

    When Juicebox is used with HSMs, it supports encrypting the communication between the client and the backend. This is handled by generating a unique keypair for each HSM. The public key is provided to the client, while the private key remains within the HSM. Even if you can see the traffic sent to the HSM, it's encrypted using the Noise protocol and so the user's encrypted secret data can't be retrieved.

    But this is only useful if you know that the public key corresponds to a private key in the HSM! Right now there's no way to know this, but there's worse - the client doesn't have the public key built into it, it's supplied as a response to an API request made to Twitter's servers. Even if the current keys are associated with the HSMs, Twitter could swap them out with ones that aren't, terminate the encrypted connection at their endpoint, and then fake your query to the HSM and get the encrypted data that way. Worse, this could be done for specific targeted users, without any indication to the user that this has happened, making it almost impossible to detect in general.

    This is at least partially fixable. Twitter could prove to a third party that their Juicebox keys were generated in an HSM, and the key material could be moved into clients. This makes attacking individual users more difficult (the backdoor code would need to be shipped in the public client), but can't easily help with the website version[1] even if a framework exists to analyse the clients and verify that the correct public keys are in use.

    It's still worse than Signal. Use Signal.

    [1] Since they could still just serve backdoored Javascript to specific users. This is, unfortunately, kind of an inherent problem when it comes to web-based clients - we don't have good frameworks to detect whether the site itself is malicious.

    comment count unavailable comments
    • chevron_right

      Matthew Garrett: Twitter's new encrypted DMs aren't better than the old ones

      news.movim.eu / PlanetGnome • 5 June • 5 minutes

    When Twitter[1] launched encrypted DMs a couple of years ago, it was the worst kind of end-to-end encrypted - technically e2ee, but in a way that made it relatively easy for Twitter to inject new encryption keys and get everyone's messages anyway. It was also lacking a whole bunch of features such as "sending pictures", so the entire thing was largely a waste of time. But a couple of days ago, Elon announced the arrival of "XChat", a new encrypted message platform built on Rust with (Bitcoin style) encryption, whole new architecture . Maybe this time they've got it right?

    tl;dr - no. Use Signal. Twitter can probably obtain your private keys, and admit that they can MITM you and have full access to your metadata.

    The new approach is pretty similar to the old one in that it's based on pretty straightforward and well tested cryptographic primitives, but merely using good cryptography doesn't mean you end up with a good solution. This time they've pivoted away from using the underlying cryptographic primitives directly and into higher level abstractions, which is probably a good thing. They're using Libsodium's boxes for message encryption, which is, well, fine? It doesn't offer forward secrecy (if someone's private key is leaked then all existing messages can be decrypted) so it's a long way from the state of the art for a messaging client (Signal's had forward secrecy for over a decade!), but it's not inherently broken or anything. It is, however, written in C, not Rust[2].

    That's about the extent of the good news. Twitter's old implementation involved clients generating keypairs and pushing the public key to Twitter. Each client (a physical device or a browser instance) had its own private key, and messages were simply encrypted to every public key associated with an account. This meant that new devices couldn't decrypt old messages, and also meant there was a maximum number of supported devices and terrible scaling issues and it was pretty bad. The new approach generates a keypair and then stores the private key using the Juicebox protocol. Other devices can then retrieve the private key.

    Doesn't this mean Twitter has the private key? Well, no. There's a PIN involved, and the PIN is used to generate an encryption key. The stored copy of the private key is encrypted with that key, so if you don't know the PIN you can't decrypt the key. So we brute force the PIN, right? Juicebox actually protects against that - before the backend will hand over the encrypted key, you have to prove knowledge of the PIN to it (this is done in a clever way that doesn't directly reveal the PIN to the backend). If you ask for the key too many times while providing the wrong PIN, access is locked down.

    But this is true only if the Juicebox backend is trustworthy. If the backend is controlled by someone untrustworthy[3] then they're going to be able to obtain the encrypted key material (even if it's in an HSM, they can simply watch what comes out of the HSM when the user authenticates). And now all they need is the PIN. Turning the PIN into an encryption key is done using the Argon2id key derivation function, using 32 iterations and a memory cost of 16MB (the Juicebox white paper says 16KB, but (a) that's laughably small and (b) the code says 16 * 1024 in an argument that takes kilobytes), which makes it computationally and moderately memory expensive to generate the encryption key used to decrypt the private key. How expensive? Well, on my (not very fast) laptop, that takes less than 0.2 seconds. How many attempts to I need to crack the PIN? Twitter's chosen to fix that to 4 digits, so a maximum of 10,000. You aren't going to need many machines running in parallel to bring this down to a very small amount of time, at which point private keys can, to a first approximation, be extracted at will.

    Juicebox attempts to defend against this by supporting sharding your key over multiple backends, and only requiring a subset of those to recover the original. I can't find any evidence that Twitter's does seem to be making use of this, but all the backends used are under x.com so are presumably under Twitter's direct control. Trusting the keystore without needing to trust whoever's hosting it requires a trustworthy communications mechanism between the client and the keystore. If the device you're talking to can prove that it's an HSM that implements the attempt limiting protocol and has no other mechanism to export the data, this can be made to work. Signal makes use of something along these lines using Intel SGX for contact list and settings storage and recovery, and Google and Apple also have documentation about how they handle this in ways that make it difficult for them to obtain backed up key material. Twitter has no documentation of this, and as far as I can tell does nothing to prove that the backend is in any way trustworthy.

    On the plus side, Juicebox is written in Rust, so Elon's not 100% wrong. Just mostly wrong.

    But ok, at least you've got viable end-to-end encryption even if someone can put in some (not all that much, really) effort to obtain your private key and render it all pointless? Actually no, since you're still relying on the Twitter server to give you the public key of the other party and there's no out of band mechanism to do that or verify the authenticity of that public key at present. Twitter can simply give you a public key where they control the private key, decrypt the message, and then reencrypt it with the intended recipient's key and pass it on. The support page makes it clear that this is a known shortcoming and that it'll be fixed at some point, but they said that about the original encrypted DM support and it never was, so that's probably dependent on whether Elon gets distracted by something else again. And the server knows who and when you're messaging even if they haven't bothered to break your private key, so there's a lot of metadata leakage.

    Signal doesn't have these shortcomings. Use Signal.

    [1] I'll respect their name change once Elon respects his daughter

    [2] There are implementations written in Rust, but Twitter's using the C one with these JNI bindings

    [3] Or someone nominally trustworthy but who's been compelled to act against your interests - even if Elon were absolutely committed to protecting all his users, his overarching goals for Twitter require him to have legal presence in multiple jurisdictions that are not necessarily above placing employees in physical danger if there's a perception that they could obtain someone's encryption keys

    comment count unavailable comments
    • chevron_right

      Code of Conduct Committee: Transparency report for May 2025

      news.movim.eu / PlanetGnome • 4 June • 4 minutes

    Transparency report for July 2024 to May 2025 – GNOME Code of Conduct Committee

    GNOME’s Code of Conduct is our community’s shared standard of behavior for participants in GNOME. This is the Code of Conduct Committee’s periodic summary report of its activities from July 2024 to May 2025.

    The current members of the CoC Committee are:

    • Anisa Kuci
    • Carlos Garnacho
    • Christopher Davis
    • Federico Mena Quintero
    • Michael Downey
    • Rosanna Yuen

    All the members of the CoC Committee have completed Code of Conduct Incident Response training provided by Otter Tech, and are professionally trained to handle incident reports in GNOME community events.

    The committee has an email address that can be used to send reports: conduct@gnome.org as well as a website for report submission: https://conduct.gnome.org/

    Reports

    Since July 2024, the committee has received reports on a total of 19 possible incidents. Of these, 9 incidents were determined to be actionable by the committee, and were further resolved during the reporting period.

    • Report about an individual in a GNOME Matrix room acting rudely toward others. A Committee representative discussed the issue with the reported individual and adjusted room permissions.
    • Report about an individual acting in a hostile manner toward a new GNOME contributor in a community channel. A Committee representative contacted the reported person to provide a warning and to suggest methods of friendlier engagement.
    • Report about a discussion on a community channel that had turned heated. After going through the referenced conversation, the Committee noted that all participants were using non-friendly language and that the turning point in the conversation was a disagreement over a moderator’s action. The committee contacted the moderator and reminded them to use kinder words in the future.
    • Report related to technical topics out of the scope of the CoC committee. The issue was forwarded to the Board of Directors.
    • Report about members’ replies in community channels; after reviewing the conversation the CoC committee decided that it was not actionable. The conversation did not violate the Code of Conduct.
    • Report about inappropriate and insulting comments made by a member in social moments during an offline event. The CoC Committee sent a warning to the reported person.
    • Report against two members making comments the reporter considered disrespectful in a community channel. After reading through the conversation, the Committee did not see any violations to the CoC. No actions were taken.
    • Report on someone using abrasive and aggressive language in a community channel. After reading the conversation, the Committee agrees with this assessment. As this person had previously been found to have violated the CoC, the Committee has banned the person from the channel for one month.
    • Report about ableist language in a GitLab merge request. The reported person was given warning not to use such language.
    • Report against GNOME in general without any specifics. A request for more information was sent, and after no reply after a number of months, the issue has been closed with no action.
    • Report against the moderating team’s efforts to keep discussions within the Code of Conduct. No action was taken.
    • Report about a contributor being aggressive to the reporter who is working with them, on multiple occasions. The CoC committee talked both to the reporter and the reported person, and also to other people working with them in order to solve the disagreements. The result was that the reporter had some patterns on their behavior that made it difficult to collaborate with them too. The conclusion was that all parties acknowledged their wrong behaviors and will work on improving that and be more collaborative.
    • Report about a disagreement with a maintainer’s decision. The report was non-actionable.
    • Report about a contributor who set up harassment campaigns against Foundation and non-Foundation members. This person has been suspended indefinitely from participation in GNOME.
    • Report about a moderator being hostile in community channels; this was not the first report we received about this member so they got banned from the channel.
    • Report about a blog syndicated in planet.gnome.org . The committee evaluated the blog in question and found it not to contravene the CoC, so it took no action afterwards.
    • Five reports, unrelated to each other, with technical support requests. These were marked as not actionable.
    • Report with a general comment about GNOME, marked as not actionable.
    • A question about where to report security issues; informed the reporter about security@gnome.org.

    Changes to the CoC Committee procedures

    The Foundation’s Executive Director commissioned an external review of the CoC Committee’s procedures in October of 2024. After discussion with the Foundation Board of Directors, we have made the following changes to the committee procedures :

    • Establish a “chain of command” for requesting tasks to be performed by sysadmins after an incident report.
    • Clarify the procedures for notifying affected people and teams or committees after a report.
    • Clarify the way notifications are made about a report’s consequences, and update the Committee’s communications infrastructure in general.
    • Specify how to handle reports related to Foundation staff or contractors.

    The history of changes can be seen in this merge request to the repository for the Code of Conduct.

    CoC Committee blog

    We have a new blog at https://conduct.gnome.org/blog/ , where you can read this transparency report. In the future, we hope to post materials about dealing with interpersonal conflict, non-violent communication, and other ideas to help the GNOME community.

    Meetings of the CoC committee

    The CoC committee has two meetings each month for general updates, and weekly ad-hoc meetings when they receive reports. There are also in-person meetings during GNOME events.

    Ways to contact the CoC committee

    • https://conduct.gnome.org – contains the GNOME Code of Conduct and a reporting form.
    • conduct@gnome.org – incident reports, questions, etc.
    • wifi_tethering open_in_new

      This post is public

      conduct.gnome.org /2025/06/04/transparency-report-for-may-2025/

    • chevron_right

      Alley Chaggar: Compiler Knowledge

      news.movim.eu / PlanetGnome • 4 June • 3 minutes

    Intro

    I apologize that I’m a little late updating my blog, but over the past two weeks, I’ve been diving into Vala’s compiler and exploring how JSON (de)serialization could be integrated. My mentor, Lorenz, and I agreed that focusing on JSON is a good beginning.

    Understanding the Vala Compiler

    Learning the steps it takes to go from Vala code to C code is absolutely fascinating.

    Vala’s Compiler 101

    • The first step in the compiler is the lexical analysis. This is handled by valascanner.vala , where your Vala code gets tokenized, which breaks up your code into chunks called tokens that are easier for the compiler to understand.

       switch (begin[0]) {
            case 'f':
                if (matches (begin, "for")) return TokenType.FOR;
                break;
            case 'g':
                if (matches (begin, "get")) return TokenType.GET;
                break;
      </pre>
      The code above is a snippet of Vala's scanner, it's responsible for recognizing specific keywords like 'for' and 'get' and returning the appropriate token type.
      
      
    • Next is syntax analysis and the creation of the abstract syntax tree (AST). In Vala, it’s managed by valaparser.vala , which checks if your code structure is correct, for example, if that pesky ‘}’ is missing.

       inline bool expect (TokenType type) throws ParseError {
      	if (accept (type)) {
      		return true;
      	}
        
      	switch (type) {
      	case TokenType.CLOSE_BRACE:
      		safe_prev ();
      		report_parse_error (new ParseError.SYNTAX ("following block delimiter %s missing", type.to_string ()));
      		return true;
      	case TokenType.CLOSE_BRACKET:
      	case TokenType.CLOSE_PARENS:
      	case TokenType.SEMICOLON:
      		safe_prev ();
      		report_parse_error (new ParseError.SYNTAX ("following expression/statement delimiter %s missing", type.to_string ()));
      		return true;
      	default:
      		throw new ParseError.SYNTAX ("expected %s", type.to_string ());
      	}
      }
       </pre>
      This is a snippet of Vala's parser, it tries to accept a specific token type, like again that '}'. If '}' is there, it continues parsing. Else if not, it throws a syntax error.
      
      
    • Then comes semantic analysis, the “meat and logic,” as I like to call it. This happens in valasemanticanalyzer.vala , where the compiler checks if things make sense. Do the types match? Are you using the correct number of parameters?

       public bool is_in_constructor () {
            unowned Symbol? sym = current_symbol;
            while (sym != null) {
                if (sym is Constructor) {
                    return true;
                }
                sym = sym.parent_symbol;
            }
            return false;
        }
      </pre>
      This code is a snippet of Vala's semantic analyzer, which helps the compiler understand if the current code is a constructor. Starting from the current symbol, which represents where the compiler is in the code, it then moves through its parent symbols. If it finds a parent symbol that is a constructor, it returns true. Else if the parent symbol is null, it returns false.
      
      
    • After that, the flow analysis phase, located in valaflowanalyzer.vala , analyzes the execution order of the code. It figures out how control flows through the program, which is useful for things like variable initialization and unreachable code.

       public override void visit_lambda_expression (LambdaExpression le) {
      	var old_current_block = current_block;
      	var old_unreachable_reported = unreachable_reported;
      	var old_jump_stack = jump_stack;
      	mark_unreachable ();
      	jump_stack = new ArrayList ();
        
      	le.accept_children (this);
        
      	current_block = old_current_block;
      	unreachable_reported = old_unreachable_reported;
      	jump_stack = old_jump_stack;
      	}
      </pre></code>
      
      The snippet of Vala's flow analyzer ensures that control flow, like unreachable code or jump statements, is properly analyzed within the lambda expression.
      
      
    • After all that, we now want to convert the Vala code into C code using a variety of Vala files in the directories ccode and codegen .

    All of these classes inherit from valacodevisitor.vala , which is basically the mother of classes that provides the visit_* methods that allow each phase in the compiler to walk the source code tree.

    I know this brief isn’t all of what there is to understand about the compiler, but it’s a start. Also, let’s take a moment to appreciate everyone who has contributed to Vala’s compiler design, it’s truly an art 🎨

    The Coding Period Begins!!!

    Now that GSoC’s official coding period is here, I’m continuing my research on how to implement JSON support.

    Right now, I’m still learning the codegen phase AKA the phase of converting vala into C, I’m exploring json glib and starting to work on a valajsonmodule.vala in the code gen.

    Another thing I want to work on is the Vala docs. The docs aren’t bad, but I’ve realized the information is pretty limited the deeper you get into the compiler.

    I’m excited that this is starting to slowly make sense, little by little.

    • wifi_tethering open_in_new

      This post is public

      alleych.github.io /gnome/compiler-knowledge/

    • chevron_right

      Ignacy Kuchciński: Using Portals with unsandboxed apps

      news.movim.eu / PlanetGnome • 4 June • 4 minutes

    Nowadays XDG Desktop Portal plays an important part in interaction between apps and the system, providing much needed security and unifying the experience, regardless of the desktop environment or toolkit you're using. While one could say it was created for sandboxed Flatpak apps, portals could bring major advantages to unsandboxed, host apps as well:

    - Writing universal code: you don't need to care about writing desktop-specific code, as different desktops and toolkits will provide their own implementations

    - Respecting the privacy of the user: portals use a permission system, which can be granted, revoked and controlled by the user. While host apps could bypass them, user can still be presented with dialogs, which will ask for permission to perform certain actions or obtain information.

    Okay, so they seem like a good idea after all. Now, how do we use them?

    More often than not, you don't actually have to manually call the D-Bus API - for many of the portals, toolkits and desktop will interact with them on your behalf, exposing easy to use high-level APIs. For example, if you're developing an app using GTK4 on GNOME and want to inhibit suspend or logout, you would call gtk_application_inhibit which will actually prefer using the Inhibit portal over directly talking to gnome-session-manager. There are also convenience libraries to help you, available for different programming languages.

    That sounds easy, is that all? Unfortunately, there are some caveats.

    The fact that we can safely say that flatpaks are first-class citizen when interacting with portals, compared to host apps, is a good thing - they offer many benefits, and we should embrace them. However, in the real world there are many instances of apps installed without sandbox, and the transition will take time, so in the meantime we need to make sure they play correctly with portals as well.

    One such instance is the getting the information about the app - in flatpak land, it's obtained from a special .flatpak-info file located in the sandbox. In the host apps though, xdg-desktop-portal tries to parse the app id from the systemd unit name, only accepting "app-" prefixed format, specified in the XDG standardization for applications . This works for some applications, but unfortunately not all, at least at this time. One such example is D-Bus activated apps, which are started with "dbus-" prefixed systemd unit name, or the ones started from the terminal with even different prefixes. In all those cases, the app id exposed to the portal is empty.

    One major problem, when xdg-desktop-portal doesn't have access to the app-id, is undoubtedly failure of inhibiting logout/suspend when using the Inhibit portal. Applications on GNOME using GTK4 will call gtk_application_inhibit , which in turn calls xdg-desktop-portal-gtk inhibit portal implementation, which finally talks to the gnome-session-manager D-Bus API. However, it requires app-id to function correctly, and will not inhibit the session without it. The situation should get better in the next release of gnome-session but it could still cause problems for the user, not knowing the name of the application that is preventing logout/suspend.

    Moreover, while not as critical, other portals also rely on that information in some way. Account portal used for obtaining the information about the user will mention the app display name when asking for confirmation, otherwise will call it the "requesting app", which the user may not recognize, and is more likely to cancel. Location portal will do the same, and Background portal won't allow autostart if it's requested.

    GNOME Shell logout dialog when Nautilus is copying files, inhibiting indirectly via portal


    How can we make sure our host apps play well with portals?

    Fortunately, there are many ways to make sure your host app interacts correctly with portals. First and foremost, you should always try to follow the XDG cgroup pathname standardization for applications . Most desktop environments already follow the standard, and if they don't, you should definitely report it as a bug. There are some exceptions, however - D-Bus activated apps are started by the D-Bus message bus implementations on behalf of desktops, and currently they don't put the app in the correct systemd unit. There is an effort to fix that on the dbus-broker side , but these things take time, and there is also the case of apps started from the terminal, which have different unit names altogether.

    When for some reason your app was launched in a way that doesn't follow the standard, you can use the special interface for registering with XDG Desktop Portal, the host app Registry , which overwrites the automatic detection. It should be considered a temporary solution, as it is expected to be eventually deprecated (with the details of the replacement specified in the documentation), nevertheless it lets us fix the problem at present. Some toolkits, like GTK, will register the application for you, during the GtkApplication startup call.

    There is one caveat, though - it needs to be the first call to the portal, otherwise it will not overwrite the automatic detection. This means that when relying on GTK to handle the registration, you need to make sure you don't interact with the portal before the GtkApplication startup chain-up call. So no more gtk_init in main.c, which on Wayland uses Settings portal to open display, all such code needs to be moved just after the application startup chain-up. If for some reason you really cannot do that, you'll have to call the D-Bus method yourself, before any portal interaction is made.

    The end is never the end...

    If you made it this far, congratulations and thanks for taking this rabbit hole with me. If it's still not enough, you can check out the ticket I reported and worked on in nautilus, giving even more context to how we ended up here. Hope you learned something that will make your app better :)
    • wifi_tethering open_in_new

      This post is public

      ignapk.blogspot.com /2025/06/using-portals-with-unsandboxed-apps.html