call_end

    • Pl chevron_right

      Jussi Pakkanen: Converting Chapterizer from Cairo + Pango to CapyPDF

      news.movim.eu / PlanetGnome • Yesterday - 20:56 • 1 minute

    Chapterizer (not a great name, I know) is a tool I wrote to generate books. Originally used Cairo and Pango to generate PDF files. It works and was fairly easy to get started but has its own set of downsides:

    • Cairo always produces RGB PDFs, which are not accepted by printing houses
    • Cairo does not handle advanced PDF features like trim boxes
    • Pango aligns text at the top of each line, but for high quality text output you have to do baseline alignment
    • Pango is designed to "always print something", which is to say it does transparent font substitution for example when the chosen font does not have some glyph
    I have also created CapyPDF to generate "proper" PDF. Over the holidays I finalized porting Chapterizer to use CapyPDF. The pipeline is now surprisingly simple. First you read in the source text, then it is shaped with Harfbuzz and then written to a PDF file with CapyPDF.

    It was grunt work. Nothing about it was particularly difficult, just dealing with the same old issues like the fact that in PDF the page's origin is at bottom left, whereas in Cairo it is at the top left.

    Anyhow, now that it is done we can actually test the performance of CapyPDF with a somewhat realistic setup. Currently creating a 40 page document takes 0.4 seconds which comes down to 0.01 seconds per page. Which is fast enough for me.

    • Pl chevron_right

      Jussi Pakkanen: New year, new Pystd epoch, or evolving an API without breaking it

      news.movim.eu / PlanetGnome • 3 days ago - 11:00 • 1 minute

    One of the core design points of Pystd has been that it maintains perfect API and ABI stability while also making it possible to improve the code in arbitrary ways. To see how that can be achieved, let's look at what creating a new "year epoch" looks like. It's quite simple. First you run this script pystdscript.png

    Then you add the new files to Meson build targets (I was too lazy to implement that in the script). Done. For extra points there is also a new test that mixes types of pystd2025 and pystd2026 just to verify that things work.

    As everything is inside a yearly namespace (and macros have the corresponding prefix) the symbols do not clash with each other.

    At this point in time pystd2025 is frozen so old apps (of which there are, to be honest, approximately zero) keep working forever. It won't get any new features, only bug fixes. Pystd2026, on the other hand, is free to make any changes it pleases as it has zero backwards compatibility guarantees.

    Isn't code duplication terribly slow and inefficient?

    It can be. Rather than handwaving about it, lets measure. I used my desktop computer which has an AMD Ryzen 7 3700X.

    Compiling Pystd from scratch and running the test suite (with code for both 2025 and 2026) in both debug and optimized modes takes 3 seconds in total (1s for debug, 2s for optimized). This amounts to 2*13 compiler invocations, 2 static linker invocations and 2*5 dynamic linker invocations.

    Compiling a helloworld with standard C++ using -O2 -g also takes 3 seconds. This amounts to a single compiler invocation.

    • Pl chevron_right

      This Week in GNOME: #230 Happy New Year!

      news.movim.eu / PlanetGnome • 3 days ago - 00:00 • 4 minutes

    Update on what happened across the GNOME project in the week from December 19 to January 02.

    GNOME Core Apps and Libraries

    Image Viewer (Loupe)

    Browse through images and inspect their metadata.

    Sophie (she/her) announces

    Image Viewer (Loupe) 48.2 and 49.2 have been released with the following fixes:

    • Considerably increased speed for listing other images in folders, especially for remote locations. This allows for switiching to other images to become available much quicker.
    • Fix panics, probably occuring when using an action like ‘copy’, and then closing the window. The crash causes all other windows to close.
    • Fix the creation date for images that don’t provide a timezone. It was displayed as if the recorded date and time was in UTC.
    • Fix zooming in not working via the zoom menu if the resulting zoom state would still fit the image inside the window.
    • Check if the is-hidden property is available before reading it. This avoids warnings being printed when browsing images on remote locations.
    • Fix the missing beginning of user comments in the metadata.

    Loupe 50.alpha has been released as well with better error messages when files cannot be read, design fixes for always visible scrollbars (a11y), and added a limit to the zoom-out, such that the image is still visible.

    Glycin 2.1.alpha was released with XPM and XBM support, making it possible to remove the last unsandboxed image loader on Fedora.

    Maps

    Maps gives you quick access to maps all across the world.

    mlundblad says

    Maps has seen some redesigns for GNOME 50. Place information is now shown in the sidebar (which has moved to the left) on desktop, and using a bottom sheet on mobile (using an AdwMultiLayout). Also public transit itinerary displaying has seen a redesign, using flow boxes for the overview list (with possibly multiple lines displaying long journeys with many legs), and “track segments” when showing details about a trip, displayed using the line colors

    place-info-sidebar.CHnMFICp_rI3iD.webp

    place-info-mobile.DOD8rk3U_Z1bfq0E.webp

    transit-itinerary-overview.Di3fKMYJ_Xaa0P.webp

    transit-journey-details.BUBUQ7_G_BK9LO.webp

    GNOME Circle Apps

    Ignacy Kuchciński (ignapk) announces

    Constrict by Wartybix was accepted into GNOME Circle!

    It compresses your videos to your chosen file size — useful for uploading to services with specific file size limits.

    Congratulations and welcome! 🎉

    https://flathub.org/apps/io.github.wartybix.Constrict

    io.github.wartybix.Constrict.CWEYsuZg_1YUAnL.webp

    Third Party Projects

    vallabhvidy announces

    Happy new year 🥳🥳 The first minor release (v0.2.0) of Cube Timer was released on 1st January 🥳 Since the last TWIG update, the app has received a number of improvements and new features:

    • Support for 2×2, 4×4, 5×5, 6×6, 7×7, Skewb, Megaminx, Pyraminx, and Clock.

    • The user interface is now responsive and adapts to phone size.

    • New preferences were added to customize timer behavior and interface.

      cube_timer_mobile.DJyTtYCx_hsEXP.webp

    Alexander Vanhee reports

    Just before the new year, the Bazaar app store received its 0.7.0 update, bringing features like Flathub account support and a category with apps for your desktop environment.

    Flathub account support allows you to log in using any login method supported by Flathub. You can then bookmark apps on their pages for easy access in the future, which is ideal for keeping track of apps you want to hold onto after a reinstall.

    On the category page, you will now find a new tile for either “Adwaita” or “KDE”. The Adwaita tile allows you to view all the apps listed on arewelibadwaitayet , while the KDE tile shows all apps published by the KDE project.

    Later in the week, I looked into adding support for displaying app permissions, helping you better understand how apps break the sandbox.

    Lastly, we switched our app icon after hearing that the old “tag” icon was confusing for new users on distros where the app is preinstalled, with the added benefit that the new icon better fits the idea of a bazaar.

    bazaar-adwaita.CVR8uqcf_1I4gm8.webp

    bazaar-flathub-login.kowjQn2c_nRoPi.webp

    bazaar-permissions.D74BRJGb_Z2eQYFh.webp

    bazaar-new-logo.CphgZ7o0_16Xdf6.webp

    Gir.Core

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

    Marcel Tiede says

    GirCore development update: First Bits for GTK composite template support just landed. See sample . Binding for template children is still missing and more support from source generators will be added. Stay tuned for more updates along the way.

    Miscellaneous

    Guillaume Bernard reports

    Merge Requests pushes are now available in GNOME Damned Lies! We recently updated the workflow in Damned Lies and you can now set the type of push of each module (direct push [the original way], GitLab Merge Request, GitHub Pull Request). At the moment, you will have to ask one of the coordinators to change the type of push for each module.

    What will happen to the original workflow? Nothing for translators and/or reviewers but a very small change for commiters. When committing, if the module’s configuration requires a Merge Request or a Pull Request, a new branch will be creating from the branch you’re translating. For instance, a new branch update-translation-fr-from-gnome-48 is created, push to the repository and a merge request is then opened through the command line. We retrieve the link to the merge request and post it as a comment in the workflow. Workflow now has another, new, state: « Merge Request is Waiting Approval ».

    There are more things to do with this feature: automatically archive the workflow when the commit is merged, track all the merge requests for a module, allow module maintainers to update this setting themselves, etc. But it requires more changes and, as usual, contributions are welcome!

    Sophie (she/her) says

    I wrote a blog post with some fun numbers about GNOME: GNOME in 2025: Some Numbers

    Events

    Kristi Progri reports

    We are happy to announce that GUADEC 2026 will be held in A Coruña, Spain! For more information, please check the link: https://discourse.gnome.org/t/guadec-2026-to-be-held-in-a-coruna-spain/33193

    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

      Lennart Poettering: Mastodon Stories for systemd v259

      news.movim.eu / PlanetGnome • 6 days ago - 23:00 • 1 minute

    On Dec 17 we released systemd v259 into the wild .

    In the weeks leading up to that release (and since then) I have posted a series of serieses of posts to Mastodon about key new features in this release, under the #systemd259 hash tag. In case you aren't using Mastodon, but would like to read up, here's a list of all 25 posts:

    I intend to do a similar series of serieses of posts for the next systemd release (v260), hence if you haven't left tech Twitter for Mastodon yet, now is the opportunity.

    My series for v260 will begin in a few weeks most likely, under the #systemd260 hash tag.

    In case you are interested, here is the corresponding blog story for systemd v258 , here for v257 , and here for v256 .

    • Pl chevron_right

      Sam Thursfield: Musical update

      news.movim.eu / PlanetGnome • 27 December • 2 minutes

    Like many software engineers, I sometimes see my career as 20 years of failing to become a professional musician. Although its true that in the software industry we get to stay in better hotels than most independent musicians can afford. And we rarely have to work Saturday nights.

    Its difficult to combine two passions sometimes, but I am thankful for these opportunities to part of great independent music projects… it’s always fascinating to make music and see people connecting with it, however that is.

    Here are some highlights from 2025.

    Note: the embedded videos below seem to disappear in RSS feeds.. thanks WordPress.

    Muaré

    If you like funk , then here’s a tune for you by Muaré . Available on all streaming platforms and also here on Bandcamp . Despite being a trombonist, on this tune you can hear me playing Hammond organ Yamaha Reface YC organ… one of the word’s most fun instruments to play.

    URL: https://youtu.be/ml9DIaIMwik

    Brais Ninguén and Couto 90

    If you’re after reggae then have a whole new album, which just came out yesterday, by Brais Ninguen and Couto 90 . That’s myself on trombone. First time I’ve participated in a full album project, and the first time I’ve made noises that will be scratched onto a vinyl record. Decades of listening to ska and reggae finally put to good use!

    The full album is out on Spotify and other streaming platforms, or you can hear a couple of tunes on Bandcamp under the name “Phase II” .

    URL: https://youtu.be/8NsMjjsM2ls


    This was recorded in the amazing Escusalla Sonora studio in the Galician mountains, with Javier Vicalo who is something of a legend in the reggae scene. Check out his discography for more great reggae.

    Rafael Briceño

    Finally here’s a tune from Rafael Briceño, a talented musician from Venezuela who is recording an entire album in video form, under the name “Ensarta”. This one was a challenge. I’ve been doing my best to listen to Willie Colon and Ruben Blades but I don’t have decades of salsa experience to draw on. You don’t make great art without leaving your comfort zone though!

    URL: https://youtu.be/sHxPwsCIMcc

    If you like Rafa’s music.. which is likely… you can find a whole album named “De Regreso A Casa” on Spotify from a few years ago.

    Here is to more music in 2026. Go make some art!!

    • Pl chevron_right

      Sophie Herold: GNOME in 2025: Some Numbers

      news.movim.eu / PlanetGnome • 27 December • 3 minutes

    As some of you know, I like aggregating data. So here are some random numbers about GNOME in 2025. This post is not about making any point with the numbers I’m sharing. It’s just for fun.

    So, what is GNOME? In total, 6 692 516 lines of code. Of that, 1 611 526 are from apps. The remaining 5 080 990 are in libraries and other components, like the GNOME Shell. These numbers cover “the GNOME ecosystem,” that is, the combination of all Core, Development Tools, and Circle projects. This currently includes exactly 100 apps. We summarize everything that’s not an app under the name “components.”

    GNOME 48 was at least 90 % translated for 33 languages. In GNOME 49 this increased to 36 languages. That’s a record in the data that I have, going back to GNOME 3.36 in 2020. The languages besides American English are: Basque, Brazilian Portuguese, British English, Bulgarian, Catalan, Chinese (China), Czech, Danish, Dutch, Esperanto, French, Galician, Georgian, German, Greek, Hebrew, Hindi, Hungarian, Indonesian, Italian, Lithuanian, Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian (Latin), Slovak, Slovenian, Spanish, Swedish, Turkish, Uighur, and Ukrainian. There are 19 additional languages that are translated 50 % or more. So maybe you can help with translating GNOME to Belarusian, Catalan (Valencian), Chinese (Taiwan), Croatian, Finnish, Friulian, Icelandic, Japanese, Kazakh, Korean, Latvian, Malay, Nepali, Norwegian Bokmål, Occitan, Punjabi, Thai, Uzbek (Latin), or Vietnamese in 2026?

    Talking about languages. What programming languages are used in GNOME? Let’s look at GNOME Core apps first. Almost half of all apps are written in C. Note that for these data, we are counting TypeScript under JavaScript.

    C: 44.8%, Vala: 20.7%, Rust: 10.3%, Python: 6.9%, JavaScript: 13.8%, C++ 3.45%. Share of GNOME Core apps by programming language.

    The language distribution for GNOME Circle apps looks quite different with Rust (41.7 %), and Python (29.2 %) being the most popular languages.

    C: 6%, Vala, 13%, Rust 42%, Python 29%, JavaScript 10%, Crystal 1% Share of GNOME Circle apps by programming language.

    Overall, we can see that with C, JavaScript/TypeScript, Python, Rust, and Vala, there are five programming languages that are commonly used for app development within the GNOME ecosystem.

    But what about components within GNOME? The default language for libraries is still C. More than three-quarters of the lines of code for components are written in it. The components with the largest codebase are GTK (820 000), GLib (560 000), and Mutter (390 000).

    Lines of code for components within the GNOME ecosystem.

    But what about the remaining quarter? Line of code are of course a questionable metric. For Rust, close to 400 000 lines of code are actually bindings for libraries. The majority of this code is automatically generated. Similarly, 100 000 lines of Vala code are in the Vala repository itself. But there are important components within GNOME that are not written in C: Orca, our screen reader, boasts 110 000 lines of Python code. Half of GNOME Shell is written in JavaScript, adding 65 000 lines of JavaScript code. Librsvg and glycin are libraries written in Rust, that also provide bindings to other languages.

    We are slowly approaching the end of the show. Let’s take a look at the GNOME Circle apps most popular on Flathub. I don’t trust the installation statistics on Flathub, since I have seen indications that for some apps, the number of installations is surprisingly high and cyclic. My guess is that some Linux distribution is installing these apps regularly as part of their test pipeline. Therefore, we instead check how many people have installed the latest update for the app. Not a perfect number either, but something that looks much more reliable. The top five apps are: Blanket, Eyedropper, Newsflash, Fragments, and Shortwave. Sometimes, it needs less than 2 000 lines of code to create popular software.

    And there are 862 people supporting the GNOME Foundation with a recurring donation. Will you join them for 2026 on donate.gnome.org ?

    • Pl chevron_right

      Asman Malika: Everybody Struggles

      news.movim.eu / PlanetGnome • 22 December • 2 minutes

    There’s a quiet assumption that once you’re accepted into a program, an internship, or a new opportunity, things are supposed to click. That confidence should come automatically. That the struggle somehow ends at the door.

    It doesn’t.

    Lately, my struggle has been feeling like I should already know more than I do.

    I’m an intern working with a large codebase that was unfamiliar at first. On the surface, everything looked final, I read the documentation, followed discussions, and tried to understand the flow. But when I began contributing, I realized that understanding a codebase and working inside it are two very different things. Functions referenced other functions I had not seen. Libraries behaved in ways I didn’t fully understand yet. I spent hours chasing what seemed like a simple issue, only to realize I misunderstood something basic.

    What makes this harder isn’t just the technical difficulty, it’s the voice in my head. The one that says, “Everyone else gets this faster.” The one that whispers, “You’re behind.” The one that asks, “What if I disappoint the people who believed in me?”

    That voice is convincing. Especially when you’re surrounded by smart people who ask sharp questions and navigate complex topics with ease. It’s easy to compare your confusion to their clarity and conclude that the problem is you.

    But here’s what I’m slowly learning: struggling is not a sign of failure. It’s a sign of being in the right place. Every time I get stuck, I’m forced to read more carefully. Every time I ask a question, I learn something I wouldn’t have learned alone. Every mistake shows me how the system actually works, not how I assumed it worked. The struggle is uncomfortable, yes, but it’s also doing real work on me.

    I’m also learning the difference between struggling silently and struggling with support. When I finally ask for help, the response is rarely judgment. More often, it’s reassurance: “Yeah, that part is confusing.” Or, “I struggled with that too.” Moments like that remind me that nobody arrives fully formed.

    Everybody struggles. Even the people who look confident. Even the people whose code you admire. The difference isn’t who struggles and who doesn’t, it’s who keeps going despite it.

    So if you’re in a place where things feel hard, where progress feels slow, where doubt shows up uninvited: you’re not alone. This is part of learning. This is part of growing. And this, too, counts as progress.

    • Pl chevron_right

      Jussi Pakkanen: An uncomfortable but necessary discussion about the Debian bug tracker

      news.movim.eu / PlanetGnome • 22 December • 4 minutes

    Note: this post represents my personal opinions as a Debian maintainer of a single package (Meson). It is not my intention to throw anyone involved in the service under a bus, but some things about it are not good and need to be spoken aloud (in my opinion anyway, other people may disagree and that is fine).

    There was a post called Configuring a mail transfert [sic] agent to interact with the Debian bug tracker on Planet Debian. It contained the following statement:

    using an email client to create or modify bug reports is not a bad idea per se

    Indeed it is not. However, using an email client as the only way of modifying bugs (which is how the Debian bug tracker works) is not only a bad idea, it is terrible idea . To me managing bugs is so awful that it is actively pushing me away from contributing to Debian . The bug statuses on Meson are not kept up to date because I prefer that to having to deal with the bug tracker. I suspect I am not alone in this. In any case it is a major hurdle for new developers and might even cause some people to drop out entirely [1].

    Why is it like this?

    The Debian bug tracker was originally implemented in 1993 or thereabouts. Pretty much everything IT related was different back then. Manipulating things via email actually made sense at the time. Sadly, the world changed completely but volunteers working on the bug tracker did not have the resources to update it [2]. The end result is a classical legacy system: one that works and does the thing it needs to  do but which no new developer wants to touch.

    Notable updates to the system would require major resources, which the project does not have.

    FWICT there have been attempts to migrate the tracker to e.g. Bugzilla or Gitlab, but none of those has come even close to succeeding.

    Why is the UX bad?

    There is no web UI for manipulating bug data. Instead you write an email in a custom format , send that to a specific email address and wait for things to happen.

    The main problem here is not the format as such, it is the fact that the user has to do the work of the computer :

    • Every time you need to manipulate bugs, you need to open the documentation page to remind yourself what the actual syntax is. A program would get it right automatically every time.
    • Get it wrong? Sucks to be you. A program would get it right automatically every time.
    • Send it to the wrong email address? Sucks to be you. And the person whose bug you just altered. A computer program would get it right automatically every time.
    • And so on.

    I suspect most Debian developers who spend a lot of time on this have written their own custom scripts for their use cases. But having hundreds of ersatz tools for common tasks seems suboptimal.

    As an extra cherry on the cake, the bug tracker will send you an email every! single! time! you edit or comment on any bug. Not only does the service waste your time by forcing you to write syntactically correct batch processing commands by hand, it also wastes it by forcing you to keep deleting spam [3].

    How does security on the system work?

    It doesn't. The email interface is 100% open. Anyone can edit any bug in any way just by sending a suitably crafted email to the control address [3]. If a 4chan script kiddie would want to screw up the entire Debian bug repository, they could do so fairly easily.

    There is an actual term for this approach: security through obscurity . The fact that the main bug tracker of the OS that runs the world does not have strict authentication in place does not fill me with warm fuzzies.

    What would be a way forward?

    A one-shot conversion to a different bug tracker is out of the question. Instead the situation could be improved incrementally, for example:

    1. Create a new web service that parses the existing bug data and displays it in a "rich" format.
    2. Update the UI so that registered users can change the state of the bug (close, duplicate, etc).
    3. Make the UI send a suitably formatted control email to the backend.
    4. Bless the new web service as an official way of editing bugs (hosted under debian.org and all that)
    5. Edit the backend service so it only accepts emails from the web UI and registered Debian developers and maintainers
    6. Change the backend to something else or improve it for the new UI [optional].
    Steps 1 to 3 can be done by a single person or a small team. Since you (probably) don't have access to the backend service, you need to parse the bug state from the current tracker's status page ( example here ). That is a bit gnarly, but should be doable. If someone is looking for a personal project for the holiday season, this is something to consider.

    Steps 4 to 6 would take months or years of full time work. Given that this approach was first suggested almost exactly 25 years ago , it is unlikely that resources for it would materialize out of thin air any time soon.

    [1] My speculation.

    [2] Also my speculation.

    [3] You could use email filtering rules but that is again extra work for every user. A better option is not spamming (one thank-you email for new contributors is fine, more than that is not).

    [4] Last time I checked at least. I have personally manipulated all sorts of bugs via email even before I was a Debian maintainer. No registration. No checks. Not even GPG signing.

    • Pl chevron_right

      Marcus Lundblad: Xmas & New Year's Maps

      news.movim.eu / PlanetGnome • 21 December • 3 minutes


    It's that time of year again in (Norther Hemisphere) winter when year's drawing to an end. Which means it's time for the traditional Christmas Maps blogpost.

    Sometimes you hear claims about Santa Claus living at the North Pole (though in Rovaniemi, Finland, I bet they would disagree…). Turns out there's a North Pole near Fairbanks, Alaska as well:


    😄

    OK, enough smalltalk… now on to what's happened since the last update (for the GNOME 49 release in September).

    Sidebar Redesign

    Our old design when it comes to showing information about places has revolved around the trusted old “popover” menu design which has served us pretty well. But it also had it's drawbacks.

    For one it was never a good fit on small screen sizes (such as on phones). Therefore we had our own “home-made” place bar design with a separate dialog opening up when clicking the bar to reveal full details.

    After some discussions and thinking about this, I decided to try out a new approach utilizing the MultiLayout component from libadwaita which gives the option to get an adaptive “auxillary view” widget which works as a sidebar on desktop, and a bottom sheet on mobile.

    Now the routeplanner and place information views have both been consolidated to both reside in this new widget.

    Clicking the route button will now open the sidebar showing the routeplanner, or the bottom sheet depending on the mode.

    And clicking a place icon on the map, or selecting a search result will open the place information, also showing in the sidebar, or bottom sheet.

    multiview-route-planner-sidebar.png
    Route planner showing in sidebar in desktop mode

    multiview-route-planner-bottom-sheet.png
    Routeplanner showing in bottom sheet in mobile/narrow mode

    multiview-route-planner-bottom-sheet-plan.png
    Routeplanner showing public transit itineraries in bottom sheet

    multiview-placeview-sidebar.png
    Showing place information in sidebar in desktop mode

    multiview-placeview-bottom-sheet.png
    Showing place information in bottom sheet in mobile mode

    Redesigning Public Transit Itinerary Rendering

    The displaying of public transit itineraries has also seen some overhaul.

    First I did a bit of redesign of the rows representing journey legs, taking some queues from the Adwaita ExpanderRow style. Improving a bit compared to the old style which had been carried over from GTK 3.

    transit-itinerary-redesign.png
    List of journey legs, with the arrow indicating possibilty to expand to reveal more information

    transit-itinerary-redesign-expanded.png

    List of journey legs, with one leg “expanded” to show intermediate stops made by a train

    Improving further on this Jalen Ng contributed a merge request implementing an improvement to the overview list utilizing Adwaita WrapBoxes to show more complete information the different steps of each presented itinerary option in the overview when searching for travel options with public transit.

    transit-plan-wrapbox.png
    Showing list of transit itineraries each consisting of multiple journey legs

    Jalen also started a redesign of rendering of itineraries (this merge request is still being worked on).

    redesign-transit-itinerary.png
    Redesign of transit itinerary display. Showing each leg as a “track segment“ using the line's color

    Hide Your Location

    We also added the option to hide the marker showing your own location. One use for this e.g. if you want to make screenshots without revealing your exact location.

    show-location-setting-menuitem.png
    Menu to toggle showing your location marker

    And that's not All…

    On top of this some other things. James Westman added support global-state expressions to libshumate's vector tile implementation. This should allow us to e.g. refactor the implementation of light and dark styles and language support in our map style without “recompiling”  the stylesheet at runtime.

    James also fixed a bug sometimes causing the application to freeze when dragging the window between screens when a route is being displayed.

    This fix has been backported to the 49.3 and 48.8 releases which has been tagged today as an early holiday gift.

    And that's all for now, merry holidays, and  happy new year!