IceWM 4.1 Window Manager Brings Bug Fixes
As the first new release since IceWM 4.0 released back on New Year’s Day for this X11 window manager, IceWM 4.1 is now available… ⌘ Read more
Mesa 26.2.0 released with lots of improvements for Linux / SteamOS graphics drivers
Mesa 26.2.0 is quite a bumper release bringing a lot of new features across many open source Linux / SteamOS drivers.
Read the full article on GamingOnLinux. ⌘ Read more
Rust Coreutils 0.10 Released With More Security Hardening, Increased GNU Compatibility
Rust Coreutils 0.10 is out today from the uutils project for this alternative to GNU Coreutils. Rust Coreutils 0.10 development focused on additional security hardening plus also increasing the GNU test suite compatibility and robustness… ⌘ Read more
Cloudflare Announces Open-Source Cloudflare OS As AI ‘Operating System’
Cloudflare has open-sourced Cloudflare OS, an Apache 2.0-licensed platform that lets organizations build AI agents, apps, and workflows using curated company data and tools within isolated, governed environments. Despite the name, it is not a traditional operating system but a framework for securely managing organizational AI workloads … ⌘ Read more
dwproton-11.0-10 released with a fix for Honkai: Star Rail
If you want to play various Anime games on Linux like Honkai: Star Rail, dwproton is likely the best one to use with many tweaks to make them playable.
Read the full article on GamingOnLinux. ⌘ Read more
Wild Linker 0.10 Released With GDB Index Support, Mitigation For Btrfs Performance
Wild 0.10 released overnight as this very fast linker for Linux that is written in the Rust programming language and focused on iterative development… ⌘ Read more
FFmpeg 9.0 Released With More Vulkan Acceleration, Animated WebP & More AMD AMF
FFmpeg 9.0 is now available as the latest feature release for this widely used, open-source multimedia library… ⌘ Read more
zlib-rs 0.6.7 Released With LoongArch LSX Optimizations, Use-After-Free Fix
zlib-rs 0.6.7 is out today as the newest version of this “safer zlib” implementation making use of the Rust programming language and aiming to deliver performance on-par with zlib-ng… ⌘ Read more
Ubuntu Touch Making Progress Toward Ubuntu 26.04, Vulkan & App Updates
Following last week’s release of Ubuntu Touch 24.04-2.0 for this community-maintained, mobile flavor of Ubuntu Linux, more details are now available on their upcoming development efforts and eventual transition to an Ubuntu 26.04 base… ⌘ Read more
Box64 v0.4.4 Released With New Box64-Configurator App
Box64 0.4.4 released today as the newest version of this open-source user-space Linux x86_64 emulator for running binaries on 64-bit ARM, RISC-V, and LoongArch systems… ⌘ Read more
NetBSD 11.0 Released With RISC-V Support, Enhanced Linux System Call Compatibility
NetBSD 11.0 officially shipped today as the nineteenth major release of this popular BSD operating system… ⌘ Read more
Servo 0.4 Browser Engine Gets More Websites Rendering Correctly
Servo 0.4 was just released for closing out the month of July. This month the Servo browser engine with its servoshell demo browser began rendering more real-world websites correctly… ⌘ Read more
Skate 3 Recomp 2.0 brings native rendering to the PC port of the Xbox classic Skate 3
Skate 3 Recomp 2.0 brings the classic Xbox 360 version of Skate 3 to modern platforms, and now with a modern renderer using Vulkan (or Direct3D on Windows).
Read the full article on [GamingOnLinux](https://www.gamingonlinux.com/2026/07/skate-3-recomp-2-0-brings-native … ⌘ Read more
Ubuntu Touch 24.04-2.0 Released With Support For Notches & Rounded Corners
Following last month’s beta release, Ubuntu Touch 24.04-2.0 is now available as the latest feature release for this Ubuntu 24.04 LTS derived mobile operating system for select smartphones and tablets… ⌘ Read more
I am sooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOoooooooooooooooo tired of “fast-moving” software. ruff changed a ton of stuff and now all my code bases “need fixing”. Blah.
And SemVer is worth nothing if your 4 year old program with over 16’000 commits is still at “version 0.x”. Blah!
Everything is horrible.
Valve puts up a Proton 11.0-2 Release Candidate for testing
Valve have put up a Release Candidate to test the upcoming Proton 11.0-2 update, to fix up more issues found with Windows games on SteamOS / Linux.
Read the full article on GamingOnLinux. ⌘ Read more
Yet Another Zombie Survivors 1.0 release announced for August
On August 20th, the excellent Yet Another Zombie Survivors 1.0 finally launches - we have a new trailer and new details of what to expect from it.
Read the full article on GamingOnLinux. ⌘ Read more
Lemonade 11.5 Local AI Server Released With Completed Lemonade Router
Just one week after releasing Lemonade 11.0, the Lemonade 11.5 local AI server was released today for this open-source AMD backed project during their AMD Advancing AI event… ⌘ Read more
AMD EPYC Turin With PCIe 5.0 Storage Shows Off Nice Gains On Linux 7.2
Earlier this week was an exciting look at Intel Xe3 graphics performance gains on Linux 7.2 with Intel Core Ultra Series 3 “Panther Lake” hardware. On the other side of the table, with AMD hardware on this forthcoming kernel an area to be excited about are some I/O improvements at least for 5th Gen EPYC with speedy PCIe Gen5 NVMe SSD storage. ⌘ Read more
Faugus Launcher 2.0 rolls out with a new UI and many other enhancements
The idea of Faugus Launcher is to provide a reasonably simple game manager for Linux, as an alternative to Lutris and Heroic.
Read the full article on GamingOnLinux. ⌘ Read more
Oh good 😅
2026/07/19 02:55:52 sync-reaper: observe-only pass — 1152 namespaces, 6 anchored, 1094 undatable, 0 idle candidate(s), 0 reaped
Does this seem right to you so far @david@daiwei.me ? 🤔
2026/07/18 02:55:52 sync-reaper: observe-only pass — 1145 namespaces, 3 anchored, 1089 undatable, 0 idle candidate(s), 0 reaped
So far only 3 users of the Twtxt App have achieved their device settings with a recovery key? 🔑
D7VK 2.0 released with more performance fixes for retro Direct3D games on Linux
Love your classic retro games? D7VK 2.0 is out now to bring more performance improvements for running retro Direct3D games on Linux.
Read the full article on [GamingOnLinux](https://www.gamingonlinux.com/2026/07/d7vk-2-0-released-with-more-performance-fixes-for-retro-direct3d-ga … ⌘ Read more
DXVK 3.0.2 brings bug fixes for Dying Light: The Beast, Halo and more on Linux / SteamOS
Direct 3D 8, 9, 10 and 11 to Vulkan layer DXVK has a new bug fix release out, sorting some issues in specific games to make gaming on Linux / SteamOS better.
Read the full article on [GamingOnLinux](https://www.gamingonlinux.com/2026/07/dxvk-3-0-2-brings-bug-fixes-for-dying-light-the … ⌘ Read more
I really think I should go back to Java.
Writing programs in Python is so exhausting. I want a compiler and I want static typing. No, linters and type checkers and IDEs are not good enough. Compilers catch way more errors in advance.
Rust is also exhausting. They’re constantly adding language features and, at the same time, the runtime library remains tiny and you need 3rd party libraries for everything. Many of those are still at version 0.x (SemVer!) and you can’t rely on anything. Often times, you need the latest Rust nightly compiler.
Go is … I don’t like it. And huge binaries.
I like C as a language, but it’s too fragile. I want to have a proper HashMap every now and then.
None of the above have good GUI libraries, at least not on Linux.
And then there’s Java. This is my fractal renderer that I wrote over 17 years ago:
https://movq.de/v/fcd3c4e557/vid-1784121825.mp4
It’s fast. It has a GUI with custom widgets and those weren’t even hard to make. It still works without changing a single line of code. The source code files have timestamps from 2009 and I just noticed that the JAR file I’m using in the video was compiled in 2010.
Java as a language is relatively easy to learn and to master. There are few surprises. The source code organization with packages is good. Java API docs are clear and well written.
The JVM ramp-up times have improved considerably:
https://movq.de/v/e7314e521e/vid-1784121998.mp4
This isn’t like the Dark Ages anymore. Might even be usable for some CLI tools.
The only thing where Java really sucks is anything close-ish to the kernel. Try issuing an ioctl() … I couldn’t have made my TUI framework in Java, but then again, I wouldn’t have needed to because Swing already exists and it just works.
@balloon-fu-sen@tw.fus.f5.si Thank you for reaching out 👌 I had alraedy done so via Email too a few days back and she upgraded her Pod to yarnd/0.16.x 🎉
Linux 0.11 rewritten in idiomatic Rust, boots in QEMU | Hacker News Fark’n hell, this is some ~50k SLOC of Rust code compared to the original ~8k SLOC of C of the original this was based off of. No doubt this was “vibe coded” for sure, there is no way a human can write 50k SLOC, not in a reasonable timeframe anyway 😅
Hurray, I can now press gg instead of g to go to the top in tt. Much better! :-) Other multi-key combinations are also easily possible now.
I should probably write a real article about this at some point, but here we go. The only downside with my new key binding system is that it breaks tview’s established pattern. You’ve got an InputHandler(), that is implemented using WrapInputHandler(…). It typically then directly implements the switching logic depending on the key press. Something like this:
func (w *Widget) InputHandler() func(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
// WrapInputHandler allows for intercepting key events with SetInputCapture(…)
// from the outside for customization. This handles the default key bindings.
return t.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
switch event.Key() {
case tcell.KeyRune:
if event.Modifiers() == tcell.ModNone {
switch event.Rune() {
case 'k':
w.scrollUp()
return // we already handled the event, stop processing
case 'j':
w.scrollDown()
return
}
}
}
// We didn't handle the key event. Maybe the parent
// widget knows what to do with it.
if handler := w.parent.InputHandler(); handler != nil {
handler(event, setFocus)
}
})
}
From the outside, you can intercept and either stop or continue the widget’s original key handling with a potentially rewritten key event using SetInputCapture(…):
w := NewWidget()
// customized or additional key bindings
w.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
switch event.Key() {
case tcell.KeyUp:
// Rewrite the event, so the "cursor up" key is an alias
// for the vim key binding "k", that is handled by the
// wrapped input handler above. (I know, I know, this is a
// completely unrealistic example, why would anyone use
// cursor keys when there are vim key bindings available?!)
return tcell.NewEventKey(tcell.KeyRune, 'k', tcell.ModNone)
case tcell.KeyRune:
if event.Modifiers() == tcell.ModNone {
switch event.Rune() {
case 'q':
app.Stop()
// we already handled the event, do not pass it
// to the wrapped input handler above
return nil
case 'r':
toggleMessageReadStatus()
return nil
}
}
}
// we didn't handle the event, pass it to the wrapped
// input handler above
return event
}
Since they all expect a single key, I’ve noticed that using multiple dedicated KeyBindings of mine on these different levels kinda breaks multi-key handling with common prefixes. The outer-most KeyBinding captures the prefix, but it can’t transfer it to the inner one if not handled by the outer one. At least not without some more (potentially ugly) changes. So, I now have to work with just a single KeyBindings object for the entire widget chain (if it consists of multiple other widgets or the regular input handler and input capture are in the game). The outside needs to register all its key bind customizations or extensions at the same level that the original widget handles its default ones. Doable by exposing the widget’s KeyBindings instance, but not pretty. You always have to keep this in mind.
With the KeyBindings, it will look like that:
type Widget struct {
parent tview.Primitive
// make it available to children or the outside either by
// direct field access or by providing a getter method
KeyBindings *bind.KeyBindings
}
func NewWidget() *Widget {
w := &Widget{KeyBindings: &bind.KeyBindings{}}
w.KeyBindings. // default key bindings
Bind0(bind.KeySequence('k', w.scrollUp).
Bind0(bind.KeySequence('j', w.scrollDown)
return w
}
func (w *Widget) InputHandler() InputHandler() func(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
return t.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
// also note the missing support for focus transfer at the moment
event = w.KeyBindings.Capture(event)
if event == nil {
return
}
if handler := w.parent.InputHandler(); handler != nil {
handler(event, setFocus)
}
}
}
And then from the outside, or in a child widget:
w := NewWidget()
w.KeyBindings. // additional or customized key bindings
Bind1(bind.KeySequence(tcell.KeyUp), func(*tcell.EventKey) *tcell.EventKey {
return tcell.NewEventKey(tcell.KeyRune, 'k', tcell.ModNone)
}).
Bind0(bind.KeySequence('q'), app.Stop).
Bind0(bind.KeySequence('r'), toggleMessageReadStatus)
When directly working with tview primitives that are not part of custom widget implementations, the following works well so far:
textView := tview.NewTextView().
SetWordWrap(true).
SetText("…")
SetScrollable(true)
textView.SetInputCapture((&bind.KeyBindings{}).
Bind0(bind.KeySequence('q'), app.Stop).
Bind1(bind.KeySequence('g', 'g'), func(*tcell.EventKey) *tcell.EventKey {
return tcell.NewEventKey(tcell.KeyHome, 0, tcell.ModNone)
}).
Capture)
I need to sleep on this some more.
Also, writing very long messages like this one is really not all that fun in tt’s editor. I should absolutely provide a way to shell out to vim.
(Took me about one and a half hours to compose, holy crap. But not only because of not using vim. Although, that might have saved me a quarter hour or so for sure. Proof-reading this message also uncovered quite a few bugs in my real documentation. So, that’s a big win!) Good night!
🥳 Finally! After nearly 4 years, yarnd v0.16.0 “Silver Sojourner” is out! 🚀 Twt Hash v2, SQLite FTS5 search, HTMX-powered UI, first-time setup wizard and literally hundreds of bug fixes 🐛
Release notes: https://git.mills.io/yarnsocial/yarn/releases/tag/0.16.0
Upgrading is fully automatic — the Twt Hash v2 migration re-fetches all feeds on first start, so expect the first cycle to be a bit heavier. Images on Docker Hub as prologic/yarnd:0.16.0 👌
cc @kat@yarn.girlonthemoon.xyz @abucci@anthony.buc.ci @shinyoukai@yume.laidback.moe @eldersnake@we.loveprivacy.club 🙏
There you go: https://movq.de/blog/postings/2026-07-10/0/POSTING-en.html
@GabesArcade@gabesarcade.com The no-JS part is one thing, but you also have to disable the (nowadays common) forced-HTTP-to-HTTPS-redirect, because those old browsers can’t do modern crypto. And make sure that your webserver serves the correct page even if no Host header is sent by the client. And don’t even think about serving UTF-8 or even just putting utf-8 in the content type. 😅 And for the JPEG thumbnails I pass a special flag to ImageMagick so that IBM Web Explorer from OS/2 won’t trip. 🤣 And always use link rel="stylesheet" for CSS, because some browsers render inlined CSS as literal text. And … probably more that I forgot by now. 😂
@david@daiwei.me Not sure, actually. Let’s see. Those are the ones where I still have the original disks (or have bought them on eBay again):
- SuSE Linux 6.4 (it’s a massive 7 CD distro with a huge manual, best thing ever)
- OS/2 2.1
- OS/2 Warp 3 (red and blue spine because
$reasons)
- OS/2 Warp 4
- PC DOS 7
- MS-DOS 6.22
- Windows 3.1
- Windows for Workgroups 3.11
- Windows 95 C
- Windows 98
- Windows NT 4 Workstation (still in the mail, though 😅)
- Windows 2000
- Windows XP Professional (last Windows I ever used on my private PCs)
(Plus a few “classic” office products as can be seen here: https://movq.de/blog/postings/2024-05-23/0/POSTING-en.html )
Set/GetDisabled(…) and PasteHandler(), tt starts up fine and seems to work without issues.
After updating to tview 0.42.0, I also sadly noticed, that the tview.Modal now clears the background and doesn’t simply draw over the already present widget. So, I decided to write my own Dialog widget. This endeavor lead me down the path to actually bring back a custom Button implementation, too. When the button is focused, it surrounds the button text with [ and ]. When not in focus, the brackets are removed. Much better than before (https://twtxt.net/conv/qx3vz4a):

I also use the same buttons in the compose view, too.
🥳 NEW FEED: @dce@hashnix.club
@movq@www.uninformativ.de https://movq.de/blog/postings/2026-07-03/0/POSTING-en.html Oh yeah, the toolbar handles. You could actually move the toolbars around and sometimes even customize them. I have no evidence, but to me it feels like a lot of programs don’t allow that anymore nowadays.
ReactOS Implements First Windows NT6 System Call In Step Toward Vista Compatibility
The ReactOS project that is striving to be the “open-source Windows” with Windows driver and software binary compatibility hit another milestone today. ReactOS to date has primarily targeted Windows NT 5.2 as the architecture from Windows XP and Windows Server 2003 but with an eye toward Windows NT 6.0 for Windows Vista and later compatibility with software. ReactOS has now landed their first NT6 system call… ⌘ Read more
EFS File-System Slated For Removal With Linux 7.3 After 20+ Years Unmaintained
The EFS file-system was used for non-ISO9660 CD-ROMs and disk partitions on SGI IRIX before IRIX 6.0 switched over to XFS. Inside the Linux kernel has been a read-only EFS file-system driver without a maintainer for 20+ years while for Linux 7.3 it’s expected to be removed… ⌘ Read more
RISC-V RVV Vector Performance Benchmarks With The SpacemiT K3 SoC
Since May we have been benchmarking the SpacemiT K3 RISC-V SoC as one of the first to market RISC-V chips supporting the RVA23 profile. The SpacemiT K3 has shown how far RISC-V performance has come in the past half decade and one of the promising elements of this modern RISC-V SoC with its X100/A100 cores is supporting the RISC-V Vector Extension “RVV” 1.0. In this article are some initial benchmarks looking specifically at the RISC-V RVV 1.0 … ⌘ Read more
The mentioned go.{mod,sum} change is already part of tview 0.42.0. After implementing Set/GetDisabled(…) and PasteHandler(), tt starts up fine and seems to work without issues.
Servo Browser Engine Continues Making Much Progress On Less Than $8k Monthly
Released last week was the Servo 0.3 browser engine release along with their latest Servoshell demo browser. Today the project has published their monthly development recap to highlight all of the interesting changes made. Here’s a look at what they accomplished over the past month while doing so on less than $8k in monthly donations… ⌘ Read more
Interesting, HTTPS is almost twice as slow as plain HTTP on my server (~72 ms vs. ~135 ms):
$ hyperfine -r 50 "curl -so /dev/null 'http://movq.de/blog/postings/2024-05-23/0/t/word11a.jpg.jpg'"
Benchmark 1: curl -so /dev/null 'http://movq.de/blog/postings/2024-05-23/0/t/word11a.jpg.jpg'
Time (mean ± σ): 72.7 ms ± 17.2 ms [User: 6.2 ms, System: 4.8 ms]
Range (min … max): 49.5 ms … 99.7 ms 50 runs
$ hyperfine -r 50 "curl -so /dev/null 'https://movq.de/blog/postings/2024-05-23/0/t/word11a.jpg.jpg'"
Benchmark 1: curl -so /dev/null 'https://movq.de/blog/postings/2024-05-23/0/t/word11a.jpg.jpg'
Time (mean ± σ): 135.5 ms ± 28.9 ms [User: 17.8 ms, System: 5.6 ms]
Range (min … max): 93.2 ms … 198.5 ms 50 runs
@movq@www.uninformativ.de Oh my goodness, what an adventure, hahaha! :-) https://movq.de/blog/postings/2026-06-25/0/POSTING-en.html
DXVK 3.0 Released With DXBC-SPIRV For Shader Compilation, Descriptor Heaps By Default
Philip Rebohle announced the release today of DXVK 3.0 as the latest major feature release for this Direct3D 8 / 9 / 10 / 11 implementation atop the Vulkan API for use by Wine and Valve’s Steam Play (Proton)… ⌘ Read more
@lyse@lyse.isobeef.org Mhm, yeah, I also think I like date := time.Date(2026, time.June, 19, /**/ 17, 0, 0, 0, time.UTC) the most. 🤔 (My only gripe with this is that it isn’t obvious whether the third 0 is milli-, micro- or nanoseconds. These days it’s probably nanoseconds, but you never know.)
Servo 0.3 Released With The Demo Browser Becoming More Useful
Servo 0.3 released today as the latest version of this modern browser engine developed in Rust. With Servo 0.3 the demo servoshell browser is becoming more useful and supporting additional modern web features while Servo also continues to possess much potential moving forward on the embedded front as an alternative to the likes of the Chromium Embedded Framework (CEF)… ⌘ Read more
COSMIC Epoch 1.1 Released With COSMIC-Monitor, Compositor Improvements
System76 today released COSMIC Epoch 1.1 as the newest feature release as well as being their first time bumping the minor version number since the December release of COSMIC 1.0… ⌘ Read more
Fwupd 2.0.21 Brings Fixes For More Than 250 Potential Security Issues Found Via AI
While the Fwupd 2.1 series is the latest stable channel for this open-source firmware updating solution, Fwupd 2.0.21 was released today to backport fixes for more than 250 potential security issues recently uncovered in the codebase… ⌘ Read more
Miracle-WM Aiming For v1.0 Later This Year For Mir-Based Wayland Compositor
Miracle-WM 0.10 released on Sunday as the newest feature release for this Mir-based Wayland compositor. With this new release is also acknowledgement they are hoping to cross the “1.0” milestone later in the year… ⌘ Read more
zlib-rs 0.6.4 Released With Fix For Intel Raptor Lake Crash, SIMD Optimizations
As a follow-up to last week’s article around Firefox leveraging zlib-rs and some nice upstream improvements to this Rust-based Zlib implementation, the zlib-rs 0.6.4 release is now available to ship all of these latest enhancements… ⌘ Read more
@movq@www.uninformativ.de Yeah, that would also be fine with me. I certainly do like the “arbitrary” in your comment.
While writing the article, I also thought about something like that:
date := time.Date(2026, 6, 19,
17, 0, 0, 0, time.UTC)
Or possibly:
date := time.Date(
2026, 6, 19,
17, 0, 0, 0, time.UTC,
)
But it’s four lines for a damn timestamp. I also contemplated whether a comment acting as a separator is all that’s needed:
date := time.Date(2026, 6, 19, /**/ 17, 0, 0, 0, time.UTC)
I might like that the most. Not entirely sure yet. It kinda feels like a hack, but still a little elegant. Add your comment on top and we’re golden. Maybe?
I deliberately excluded them as this only distracted from the points I wanted to make. And I also realized that this example was just not ideal at all. Perhaps I should add them nevertheless?
If I ever invented a programming language, a much more human readable timestamp representation of some sort, RFC 3339 or very close to that would be part of that language. Something along the lines of /pattern/ for regexes in certain languages.
@lyse@lyse.isobeef.org Oh wow, we’re talking about such a detailed level. 🤔
I agree with most of what you said.
I probably would have written it like this:
// Arbitrary reference date.
// Y m d H M S nano
date := time.Date(2026, 6, 19, 17, 0, 0, 0, time.UTC)
Would this be better or worse? 😅