• 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

      Thibault Martin: TIL that Kubernetes can give you a shell into a crashing container

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

    When a container crashes, it can be for several reasons. Sometimes the log won't tell you much about why the container crashed, and you can't get a shell into that container because... it has already crashed. It turns out that kubectl debug can let you do exactly that.

    I was trying to ship Helfertool on our Kubernetes cluster. The firs step was to get it to work locally in my Minikube. The container I was deploying kept crashing, with an error message that put me on the right track: Cannot write to log directory. Exiting.

    The container expected me to mount a volume on /log so it could write logs, which I did. I wanted to run a quick test from within the container to see if I could create a file in that directory. But when your container has already crashed you can't get a shell into it.

    My better informed colleague Quentin told me about kubectl debug , a command that lets me create a copy of the crashing container but with a different COMMAND .

    So instead of running its normal program, I can ask the container to run sh with the following command

    $ kubectl debug mypod -it \
        --copy-to=mypod-debug \
        --container=my-pods-image \
        -- sh
    

    And just like that I have shell inside a similar container. Using this trick I could confirm that I can't touch a file in that /log directory because it belongs to root while my container is running unprivileged.

    That's a great trick to troubleshoot from within a crashing container!

    • Pl chevron_right

      This Week in GNOME: #244 Recognizing Hieroglyphs

      news.movim.eu / PlanetGnome • 0:00 • 4 minutes

    Update on what happened across the GNOME project in the week from April 03 to April 10.

    GNOME Core Apps and Libraries

    Blueprint

    A markup language for app developers to create GTK user interfaces.

    James Westman reports

    blueprint-compiler is now available on PyPI. You can install it with pip install blueprint-compiler .

    GNOME Circle Apps and Libraries

    Hieroglyphic

    Find LaTeX symbols

    FineFindus reports

    Hieroglyphic 2.3 is out now. Thanks to the exciting work done by Bnyro, Hieroglyphic can now also recognize Typst symbols (a modern alternative to LaTeX). Hardware-acceleration will now be preferred, when available, reducing power-consumption.

    Download the latest version from FlatHub .

    hieroglyphic_typst_symbols.wOxbuouY_Z2f6K8J.webp

    Amberol

    Plays music, and nothing else.

    Emmanuele Bassi says

    Amberol 2026.1 is out, using the GNOME 50 run time! This new release fixes a few issues when it comes to loading music, and has some small quality of life improvements in the UI, like: a more consistent visibility of the playlist panel when adding songs or searching; using the shortcuts dialog from libadwaita; and being able to open the file manager in the folder containing the current song. You can get Amberol on Flathub .

    amberol-2026-1.P7qMWOfZ_ZEOvUr.webp

    Third Party Projects

    Alexander Vanhee says

    A new version of Bazaar is out now. It features the ability to filter search results via a new popover and reworks the add-ons dialog to include a page that shows more information about a specific entry. If you try to open an add-on via the AppStream scheme, it will now display this page, which is useful when you want to redirect users to install an add-on from within your app.

    Also, please take a look at the statistics dialog — it now features a cool gradient.

    Check it out on Flathub

    bazaar_filter.BEY1Y2IA_Z2ct3wc.webp

    bazaar_addon.CpggJJ7h_1ucB0G.webp

    bazaar_gradient.Bo85-k8K_Z1FCB1D.webp

    dabrain34 reports

    GstPipelineStudio 0.5.1 is out now. It’s a great pleasure to announce this new version allowing to deal with DOT files directly. Check the project web page for more information or the following blog post for more details about the release.

    gps_screenshot.CLpepb66_Z1zRPBI.webp

    Anton Isaiev announces

    RustConn (connection manager for SSH, RDP, VNC, SPICE, Telnet, Serial, Kubernetes, MOSH, and Zero Trust protocols)

    Versions 0.10.9–0.10.14 landed with a solid round of usability, security, and performance work.

    Staying connected got easier. If an SSH session drops unexpectedly, RustConn now polls the host and reconnects on its own as soon as it’s back. Wake-on-LAN works the same way: send the magic packet and RustConn connects automatically once the machine boots. You can also right-click any connection to check if the host is online, and a new “Connect All” option opens every connection in a folder at once. For RDP there’s a Mouse Jiggler that keeps idle sessions alive.

    Terminal Activity Monitor is a new per-session feature that watches for output activity or silence, which is handy for long-running jobs. You get notifications as tab icons, toasts, and desktop alerts when the window is in the background.

    Security got a lot of attention. RDP now defaults to trust-on-first-use certificate validation instead of blindly accepting everything. Credentials for Bitwarden and 1Password are no longer visible in the process list. VNC passwords are zeroized on drop. Export files are written with owner-only permissions. Dangerous custom arguments are blocked for both VNC and FreeRDP viewers.

    Hoop.dev joins as the 11th Zero Trust provider. There’s also a new custom SSH agent socket setting that lets Flatpak users connect through KeePassXC, Bitwarden, or GPG-based SSH agents, something the Flatpak sandbox previously made difficult.

    Smoother on HiDPI and 4K. RDP frame rendering skips a 33 MB per-frame copy when the data is already in the right format. Highlight rules, search, and log sanitization patterns are compiled once instead of on every keystroke or terminal line.

    GNOME HIG polish. Success notifications now use non-blocking toasts instead of modal dialogs. Sidebar context menus are native PopoverMenus with keyboard navigation and screen reader support. Translations completed for all 15 languages.

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

    rustconn.B0H0ecFv_Z8nore.webp

    Phosh

    A pure wayland shell for mobile devices.

    Guido announces

    Phosh 0.54 is out:

    There’s now a notification when an app fails to start, the status bar can be extended via plugins, and the location quick toggle has a status page to set the maximum allowed accuracy.

    On the compositor side we improved X11 support, making docked mode (aka convergence) with applications like emacs or ardour more fun to use.

    The on screen keyboard Stevia now supports Japanese and Chinese input via UIM, has a new us+workman layout and automatic space handling can be disabled.

    There’s more - see the full details here .

    phosh-app-failed-to-start-notification.cQ6G-QDG_Z2u7AWC.webp

    Documentation

    Emmanuele Bassi announces

    The GNOME User documentation project has been ported to use Meson for its configuration, build, and installation. The User documentation contains the desktop help and the system administration guide, and gets published on the user help website , as well as being available locally through the Help browser . The switch to Meson improved build times, and moved the tests and validation in the build system. There’s a whole new contribution guideline as well. If you want to help writing the GNOME documentation, join us in the Docs room on Matrix !

    Shell Extensions

    Weather O’Clock

    Display the current weather inside the pill next to the clock.

    Cleo Menezes Jr. reports

    Weather O’Clock 50 released with fluffier animations: smooth fades between loading, weather and offline states; instant temperature updates; first-fetch spinner; offline indicator; GNOME Shell 45–50 support; and various bug fixes.

    Get it on GNOME Extensions

    Follow development

    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

      Jakub Steiner: Moving to Zola

      news.movim.eu / PlanetGnome • 0:00 • 3 minutes

    Zola

    I've finally gotten around to porting this blog over to Zola . I've been running on Jekyll for years now, after originally conceiving this blog in Middleman (and PHP initially). But time catches up with everything, and the friction of maintaining Ruby dependencies eventually got to me.

    The Speed

    I can't stress this enough — Zola is fast . Not "for a static site generator" fast. Just fast. My old Jekyll setup needed a good few seconds to rebuild after a change. Zola builds in milliseconds. The entire site rebuilds almost before I can release the key. It's not critical for a site that gets updated 5 times a year, but it's still impressive.

    No Dependencies

    This is the big one. Every time you leave a project alone for a few months and come back, you know it's not just going to magically work. The gem versions drift, Bundler gets confused, and suddenly you're down a rabbit hole of version conflicts. The only reason all our Jekyll projects were reasonably easy to work with was locking onto Ruby 3.1.2 using rvm . But at some point the layers of backwardism catch up with you.

    Zola is a single binary. That's it. No bundle install , no Gemfile, no "works on my machine" prayers. Download, run, done. It even embeds everything — syntax highlighting, image processing, Sass compilation (if you haven't embraced the modern CSS light yet) — all built-in. The site builds the same on any machine with zero setup.

    The Heritage

    Zola started life as Gutenberg in 2015/2016, a learning project for Rust by Vincent Prouillet . He was using Hugo before, but hated the Go template engine. That spawned Tera , the Jinja2-inspired template engine that Zola uses.

    The project got renamed to Zola in 2018 when the name conflicts with Project Gutenberg got too annoying. It's pure Rust, which means it's fast, memory-safe, and ships as a tiny static binary.

    Asset Colocation

    One thing I've always focused on for this blog architecture wise is the structure — images and media live right alongside the post, not stuffed into some shared /images/ folder somewhere like most Jekyll sites seem to do. Zola calls this "asset colocation," and it's a first-class feature. No plugins needed. Just put your images in the same folder as your index.md , reference them directly, and Zola handles the rest.

    This is how I'd already been running things with Jekyll, so the port was refreshingly painless on that front.

    The Templating

    The main work was porting the templates. It was the main shostopper when Bilal suggested Zola a couple of years ago. I was hoping something with liquid to pop up, but it seems like people running their own blogs is not a Tik Tok trend. Zola uses Tera instead of Liquid. The syntax is similar enough to get by, but there's enough branches in your path to stumble on. The error messages actually make sense though and point you at the problem, which is a refreshing change from debugging broken Liquid includes.

    The Improvements

    Beyond speed, I've been cleaning up things the old theme dragged along:

    • Dark mode without JavaScript : The original Klise theme injected a script to toggle themes. The new setup uses CSS-only theming via custom properties, no flash of wrong theme, no JS required.
    • Legibility : I'm getting older, and apparently so are my readers. Font sizes bumped up, contrast dialled in. What looked crisp at 30 looks muddy at 50.

    The site's cleaner now, light by default, faster to build, and I don't need to invoke Ruby just to write a blog post. The experience was so damn good, it motivated me to jump at a much larger project I'm hopefully going to post about next.

    Previously .

    • Pl chevron_right

      Michael Meeks: 2026-04-09 Thursday

      news.movim.eu / PlanetGnome • 23 hours ago

    • Pl chevron_right

      Andy Wingo: wastrel milestone: full hoot support, with generational gc as a treat

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

    Hear ye, hear ye: Wastrel and Hoot means REPL!

    Which is to say, Wastrel can now make native binaries out of WebAssembly files as produced by the Hoot Scheme toolchain, up to and including a full read-eval-print loop. Like the REPL on the Hoot web page , but instead of requiring a browser, you can just run it on your console. Amazing stuff!

    try it at home

    First, we need the latest Hoot. Build it from source , then compile a simple REPL:

    echo '(import (hoot repl)) (spawn-repl)' > repl.scm
    ./pre-inst-env hoot compile -fruntime-modules -o repl.wasm repl.scm
    

    This takes about a minute. The resulting wasm file has a pretty full standard library including a full macro expander and evaluator.

    Normally Hoot would do some aggressive tree-shaking to discard any definitions not used by the program, but with a REPL we don’t know what we might need. So, we pass -fruntime-modules to instruct Hoot to record all modules and their bindings in a central registry, so they can be looked up at run-time. This results in a 6.6 MB Wasm file; with tree-shaking we would have been at 1.2 MB.

    Next, build Wastrel from source , and compile our new repl.wasm :

    wastrel compile -o repl repl.wasm
    

    This takes about 5 minutes on my machine: about 3 minutes to generate all the C, about 6.6MLOC all in all, split into a couple hundred files of about 30KLOC each, and then 2 minutes to compile with GCC and link-time optimization (parallelised over 32 cores in my case). I have some ideas to golf the first part down a bit, but the the GCC side will resist improvements.

    Finally, the moment of truth:

    $ ./repl
    Hoot 0.8.0
    
    Enter `,help' for help.
    (hoot user)> "hello, world!"
    => "hello, world!"
    (hoot user)>
    

    statics

    When I first got the REPL working last week, I gasped out loud: it’s alive, it’s alive!!! Now that some days have passed, I am finally able to look a bit more dispassionately at where we’re at.

    Firstly, let’s look at the compiled binary itself. By default, Wastrel passes the -g flag to GCC, which results in binaries with embedded debug information. Which is to say, my ./repl is chonky: 180 MB!! Stripped, it’s “just” 33 MB. 92% of that is in the .text (code) section. I would like a smaller binary, but it’s what we got for now: each byte in the Wasm file corresponds to around 5 bytes in the x86-64 instruction stream.

    As for dependencies, this is a pretty minimal binary, though dynamically linked to libc :

    linux-vdso.so.1 (0x00007f6c19fb0000)
    libm.so.6 => /gnu/store/…-glibc-2.41/lib/libm.so.6 (0x00007f6c19eba000)
    libgcc_s.so.1 => /gnu/store/…-gcc-15.2.0-lib/lib/libgcc_s.so.1 (0x00007f6c19e8d000)
    libc.so.6 => /gnu/store/…-glibc-2.41/lib/libc.so.6 (0x00007f6c19c9f000)
    /gnu/store/…-glibc-2.41/lib/ld-linux-x86-64.so.2 (0x00007f6c19fb2000)
    

    Our compiled ./repl includes a garbage collector from Whippet , about which, more in a minute. For now, we just note that our use of Whippet introduces no run-time dependencies.

    dynamics

    Just running the REPL with WASTREL_PRINT_STATS=1 in the environment, it seems that the REPL has a peak live data size of 4MB or so, but for some reason uses 15 MB total. It takes about 17 ms to start up and then exit.

    These numbers I give are consistent over a choice of particular garbage collector implementations: the default --gc=stack-conservative-parallel-generational-mmc , or the non-generational stack-conservative-parallel-mmc , or the Boehm-Demers-Weiser bdw . Benchmarking collectors is a bit gnarly because the dynamic heap growth heuristics aren’t the same between the various collectors; by default, the heap grows to 15 MB or so with all collectors, but whether it chooses to collect or expand the heap in response to allocation affects startup timing. I get the above startup numbers by setting GC_OPTIONS=heap-size=15m,heap-size-policy=fixed in the environment.

    Hoot implements Guile Scheme , so we can also benchmark Hoot against Guile. Given the following test program that sums the leaf values for ten thousand quad trees of height 5:

    (define (quads depth)
      (if (zero? depth)
          1
          (vector (quads (- depth 1))
                  (quads (- depth 1))
                  (quads (- depth 1))
                  (quads (- depth 1)))))
    (define (sum-quad q)
      (if (vector? q)
          (+ (sum-quad (vector-ref q 0))
             (sum-quad (vector-ref q 1))
             (sum-quad (vector-ref q 2))
             (sum-quad (vector-ref q 3)))
          q))
    
    (define (sum-of-sums n depth)
      (let lp ((n n) (sum 0))
        (if (zero? n)
            sum
            (lp (- n 1)
                (+ sum (sum-quad (quads depth)))))))
    
    
    (sum-of-sums #e1e4 5)
    

    We can cat it to our repl to see how we do:

    Hoot 0.8.0
    
    Enter `,help' for help.
    (hoot user)> => 10240000
    (hoot user)>
    Completed 3 major collections (281 minor).
    4445.267 ms total time (84.214 stopped); 4556.235 ms CPU time (189.188 stopped).
    0.256 ms median pause time, 0.272 p95, 7.168 max.
    Heap size is 28.269 MB (max 28.269 MB); peak live data 9.388 MB.
    

    That is to say, 4.44s, of which 0.084s was spent in garbage collection pauses. The default collector configuration is generational, which can result in some odd heap growth patterns; as it happens, this workload runs fine in a 15MB heap. Pause time as a percentage of total run-time is very low, so all the various GCs perform the same, more or less; we seem to be benchmarking eval more than the GC itself.

    Is our Wastrel-compiled repl performance good? Well, we can evaluate it in two ways. Firstly, against Chrome or Firefox, which can run the same program; if I paste in the above program in the REPL over at the Hoot web site , it takes about 5 or 6 times as long to complete, respectively. Wastrel wins!

    I can also try this program under Guile itself: if I eval it in Guile, it takes about 3.5s. Granted, Guile’s implementation of the same source language is different, and it benefits from a number of representational tricks, for example using just two words for a pair instead of four on Hoot+Wastrel. But these numbers are in the same ballpark, which is heartening. Compiling the test program instead of interpreting is about 10× faster with both Wastrel and Guile, with a similar relative ratio.

    Finally, I should note that Hoot’s binaries are pretty well optimized in many ways, but not in all the ways. Notably, they use too many locals, and the post-pass to fix this is unimplemented , and last time I checked (a long time ago!), wasm-opt didn’t work on our binaries. I should take another look some time.

    generational?

    This week I dotted all the t’s and crossed all the i’s to emit write barriers when we mutate the value of a field to store a new GC-managed data type, allowing me to enable the sticky mark-bit variant of the Immix-inspired mostly-marking collector . It seems to work fine, though this kind of generational collector still baffles me sometimes .

    With all of this, Wastrel’s GC-using binaries use a stack-conservative , parallel , generational collector that can compact the heap as needed. This collector supports multiple concurrent mutator threads, though Wastrel doesn’t do threading yet. Other collectors can be chosen at compile-time, though always-moving collectors are off the table due to not emitting stack maps.

    The neat thing is that any language that compiles to Wasm can have any of these collectors! And when the Whippet GC library gets another collector or another mode on an existing collector, you can have that too.

    missing pieces

    The biggest missing piece for Wastrel and Hoot is some kind of asynchrony, similar to JavaScript Promise Integration (JSPI) , and somewhat related to stack switching . You want Wasm programs to be able to wait on external events, and Wastrel doesn’t support that yet.

    Other than that, it would be lovely to experiment with Wasm shared-everything threads at some point.

    what’s next

    So I have an ahead-of-time Wasm compiler. It does GC and lots of neat things. Its performance is state-of-the-art. It implements a few standard libraries, including WASI 0.1 and Hoot. It can make a pretty good standalone Guile REPL. But what the hell is it for?

    Friends, I... I don’t know! It’s really cool, but I don’t yet know who needs it. I have a few purposes of my own (pushing Wasm standards, performance work on Whippet, etc), but you or someone you know needs a wastrel, do let me know at wingo@igalia.com : I would love to be able to spend more time hacking in this area.

    Until next time, happy compiling to all!

    • Pl chevron_right

      Thibault Martin: TIL that Helix and Typst are a match made in heaven

      news.movim.eu / PlanetGnome • 1 day ago • 1 minute

    I love Markdown with all my heart. It's a markup language so simple to understand that even people who are not software engineers can use it in a few minutes.

    The flip side of that coin if that Markdown is limited. It can let you create various title levels, bold, italics, strikethrough, tables, links, and a bit more, but not so much.

    When it comes to more complex documents, most people resort to full fledged office suite like Microsoft Office or LibreOffice. Both have their merits, but office file formats are brittle and heavy.

    The alternative is to use another more complex markup language. Academics used to be into LaTeX but it's often tedious to use. Typst emerged more recently as a simpler yet useful markup language to create well formatted documents.

    Tinymist is a language server for Typst. It provides the usual services a Language server provides, like semantic highlighting, code actions, formatting, etc.

    But it really stands out by providing a live preview feature that keeps your cursor in sync in Helix when you are clicking around in the live preview!

    I only had to install it with

    $ brew install tinymist
    

    I then configured Helix to use tinymist for Typst documents, enabling live preview along the way. This happens of course in ~/.config/helix/languages.toml

    [language-server.tinymist]
    command = "tinymist"
    config = { preview.background.enabled = true, preview.background.args = ["--data-plane-host=127.0.0.1:23635", "--invert-colors=never", "--open"] }
    
    [[language]]
    name = "typst"
    language-servers = ["tinymist"]
    

    A warm thank you to my lovely friend Felix for showing me the live preview mode of tinymist!

    • Pl chevron_right

      Michael Meeks: 2026-04-08 Wednesday

      news.movim.eu / PlanetGnome • 1 day ago

    • To work early, writing and planning, team call. Dug up an old mail of mine on inflated claims around tenders which seem to become a topic.
    • Encouraging partner call, sync with Chris and then Philippe.
    • Published the next strip: A Community Organizer - "aligning the community"
    • Had the first Collabora Office Technical Committee call - missing Miklos' careful preparation, next week will be better no doubt.
    • Interesting chat with an old FLOSS hand.
    • Band practice in the evening.
    • Pl chevron_right

      Michael Meeks: 2026-04-07 Tuesday

      news.movim.eu / PlanetGnome • 2 days ago

    • Up early, mail chew, planning call, sync with Julie & Thorsten. Lunch, catch-up with Anna & Andras.
    • Poked at an update in response to TDF's blog with Chris.
    • TDF board call, Staff + Board + MC with no community questions - surreal, Dennis arrived but too late for the questions I suppose.
    • Read Die L%C3%B6sung which someone pointed me to.