dav1d 1.5.4 Brings AV1 Decoding To OS/2
While the VideoLAN developers are busy these days working on dav2d for AV2 video decoding, they haven’t let up work on dav1d and recently released dav1d 1.5.4 for continuing to enhance this leading open-source, CPU-based AV1 decoder… ⌘ Read more
libx11-compat Is Working To Implement Xlib Atop SDL For Wayland, macOS, Android
For helping to keep X11 clients running in a modern Linux desktop world with Wayland or even for running on macOS or Android, there is now yet-another option being developed with libx11-compat. The libx11-compat project is working to re-implement the Xlib client library atop SDL2/SDL3 interfaces for allow broad underlying platform coverage… ⌘ Read more
Cryptsetup 2.8.7 Released To Deal With Fallout Of Linux’s Rushed AF_ALG Deprecation
Linux’s cryptsetup for configuring and managing encrypted storage devices is ready with a new version as the developers work to deal with the recent deprecation of the Linux AF_ALG interface… ⌘ Read more
@movq@www.uninformativ.de Similar to my Go IDE at work. GoLand hangs so often in this giant code base. :-D (But it could also be one or the other snake oil that’s forcefully installed and fucks with me every day.)
@david@daiwei.me Hahaha! The thing is, it doesn’t taste as good in summer as in winter for some unknown reason. Two or three decades ago I asked my grandma to bake some of her amazing gingerbread in summer. But she always refused, claiming that this only really works in winter. Of course, I didn’t believe that. Finally, after years of begging and pleading, she finally made a tray. And to my surprise, she was right. It wasn’t bad, no, no, not at all. It was really yummy. But the gingerbread in winter was just better. :-/
Maybe I should give it a shot myself. Perhaps she slightly changed the recipe on purpose. So that I will never break the tradition of seasonal food again. :-P It worked, at least I never asked her to bake gingerbread in summer again. :-D
Qualcomm Posts Linux Patches For X2 Elite Extreme Powered ASUS Zenbook A16
Following recent Linux kernel patches enabling the Snapdragon X2 Elite powered Lenovo Yoga Slim 7x Gen11 and HP EliteBook X G2q X2 Elite laptops to boot outside of Windows 11 on ARM, Qualcomm engineers have now posted a new patch series for getting the X2 Elite Extreme powered ASUS Zenbook A16 working on Linux… ⌘ Read more
Harebrained Schemes’ new survival horror RPG ‘GRAFT’ gets a story trailer
Harebrained Schemes are working towards release on their next game following their split from Paradox Interactive, with the survival horror RPG ‘GRAFT’.
Read the full article on [GamingOnLinux](https://www.gamingonlinux.com/2026/07/harebrained-schemes-new-survival-horror-rpg-graft-gets-a-story … ⌘ Read more
@thecanine@twtxt.net Always love your work ! 👌
jenny stuff aside, I received zero bug reports or code contributions since leaving GitHub in 2018.
@movq@www.uninformativ.de Finally, your software is just perfect and finished by now, no need to report non-existing bugs or send in code changes. :-) How many tickets and merge requests did you get before moving to your own server?
I have to admit that I use git format-patch so rarely, I always have to pull it up from my shell history. Haven’t used git send-email even once. I definitely have to look into that soon. Wanted to do that for several years. I typically upload the patch to my server and send a link via IRC.
Maybe I was just very unlucky, but my experience is that you can perfectly ignore people and their work who only do it for the “fame”. It’s almost always been from inferior quality to say the least.
@movq@www.uninformativ.de Works good. I fully get and support your reasoning behind that change. There’s only one downside. Quickly looking at some code snippets in the browser helps me to quickly judge whether it’s worth to clone a repo or not. Oh well. :-) After all I know that movqware always is.
After many months of hard™ work, I’ve finally been able to get Mu (µ) lang to a point where the duplication of machine code / assembly between the ARM64/AMD64 and Mach-O and ELF formats are not all eliminated. This now means that writing a new backend target os/arch for Mu is now relatively simple to do, or far less duplicated work/effort.
@david@daiwei.me @lyse@lyse.isobeef.org Oh, I wish it was for work. I’d usually abstain from going if don’t get to choose either the location, or the company. But, both? HEeeeeLL No!! 😆
tt. I run into this bug almost daily for weeks now.
@prologic@twtxt.net A screenshot won’t help in this case, as you don’t see anything. :-D It starts off just fine with a conversation tree like that:
Unknown conversation root
└╴Read reply
└╴Read subreply
Everything works. After reloading the feeds, a new message becomes part of the conversation, so the conversation e.g. looks:
Unknown conversation root
└╴Read reply
├╴Read subreply
└╴Unread subreply
However, the bug is that the whole conversation is not shown at all. None of the three (or four with the root) messages appear in the message tree view. My recursive SQL determining the messages to display is clearly broken.
Posting the review and plan here for posterity as it is related to this thread: https://canvas.mills.io/a/6QVGjzRW
The PR(s) as-is will likely not go ahead I’m afraid. More work to be done, but this is basically all about the “Recovery” story and how to anchor and notion of an “account” without well umm an account 🤣
Collabora announce a preview of Holo Core, an AArch64 port of Arch Linux for Steam Frame
Open source firm Collabora who work with Valve (Steam), just announced a preview of Holo Core - the aarch64 port of Arch Linux for Steam Frame.
Read the full article on [GamingOnLinux](https://www.gamingonlinux.com/2026/07/collabora-announce-a-preview-of-holo-co … ⌘ Read more
Bethesda roadmap: more Fallout is coming, Starfield support continues, but Elder Scrolls VI is the main priority
Bethesda Game Studios have given a rare update into their roadmap of what they’re working on, and it sounds like quite exciting news.
Read the full article on [GamingOnLinux](https://www.gamingonlinux.com/2026/07/beth … ⌘ Read more
Valve say the Team Fortress 2 MvM update is still coming and they’re still working on it
After the usual silence we’ve come to expect from Valve on everything, they gave a short blog post on the upcoming MvM update for Team Fortress 2.
Read the full article on [GamingOnLinux](https://www.gamingonlinux.com/2026/07/valve-say-the-team-fortress-2-mvm-up … ⌘ Read more
@aelaraji@aelaraji.com That’s totally fine if you work at the beach. :-)
@david@daiwei.me Not sure if you only mean the code segments or in general. In theory, a general darker text color for read messages would probably work. The thing is that regular white on black is quite standard. In Newsboat, new articles are red (I opted for yellow here) and read ones white. I found that useful and kinda copied it for tt.
In theory, it’s Gitea anyway. So it should work.
I trip over this in our code at work all the time.
Python has this concept of “properties”:
class Oink:
def __init__(self):
self._foo = 3
@property
def my_property(self):
return self._foo
a = Oink()
print(a.my_property)
my_property() is a method but it can be used as if it were a field.
This can also be used to define a setter:
class Oink:
def __init__(self):
self._foo = 3
@property
def my_property(self):
return self._foo
@my_property.setter
def my_property(self, value):
self._foo = 123 * value
Because, for some reason, Python people don’t like getters and setters. Instead, they hide it behind a property.
The result is, when you read this:
a.my_property = 5
print(a.my_property)
You have no idea that this actually calls a method.
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.
@prologic@twtxt.net seems to be working just fine mate! Thanks for your efforts and especially making the upgrade painless.
Just depends, if I get overwhelmed and can’t keep up with demand, I’ll insist on a Gitea Issue(s) so I can organise the work.
@david@daiwei.me I agree, the App (https://twtxt.app) really does work quite nicely 👌
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!
@david@daiwei.me The one with www is correct: https://www.uninformativ.de/twtxt.txt is the canonical URL used in the url = metadata field. (For historical reasons, it also works without www and even with http.)
@balloonfu-sen@yarn.girlonthemoon.xyz Such tilde(s), etc, could in theory just run a twtd instance per user, or if I was convinced enough to make twtd also multi-user capable (optionally) that would also work. But many ~tilde(s) barely implement the Twtxt specs we continue to build and improve (albiet slowly and carefully).
@balloonfu-sen@yarn.girlonthemoon.xyz That should work. LMK if you run into any issues!
@david@daiwei.me Ta, I continued my fun with studying the tcell and cbind code bases for key bindings. My plan is to eventually not only support custom key bindings in the tt configuration file, but also to enable multi-key sequences, such as gg to jump to the top of a list/tree. Or use other vim-like navigation movements like 7j or 25gg etc.
And it turns out there are only a hand full oft tcell/cbind version combinations that work together. Only if all stars align, there’s chance of success. I will probably end up pulling cbind in to simplify my life. There are situations where tcell.EventKey’s triple of key, modifiers and rune are not all that intuitive to me. Let’s see.
@bender@twtxt.net All the other ones worked but this broke? What’s different here? To which twt hash should this be a reply? 🤔
Friday, my love, we meet again. I am going to take you to lunch, and pamper you. I will led you to believe you are the only one in my life, but then, as the working day sunsets, I shall leave you at the door, like a stood up girl by her prom date.
Weekend babies, here we come! 😂
@movq@www.uninformativ.de tell me about it! I try to enjoy the time I have available, regardless of being working time, or not. I admit it is quite hard!
@aelaraji@aelaraji.com At least your feed works as well your avatar 😅
@arne@uplegger.eu You have Matrix at work? No Teams, Google Chat, Slack, Discord, whatever, but Matrix? Really? Where do you work, is this Socialist Russia?!
@movq@www.uninformativ.de There is nothing like that on Linux, because you don’t need it. Everything just works!
FYi 👋 I’m aware of an optimist precomputed hashing bug on the new twtxt.app 🤯 Trying to work with @bender@twtxt.net remotely on my vacation yo fix it 🤣
Okay, wow. Windows NT 4 wasn’t part of my timeline back then, so this is the first time I’m seeing it in action. And this thing came with IE 2, which I’ve also never seen before. (That’s interesting, because I remember using IE even on Win 3.x, but apparently that was already IE 3?)
It also makes me really happy to see my website work in these old browsers. Fullscreen images are “broken” because those are PNG or WebP, but the rest works just fine. 🥳
I am watching Zatoichi the blind swordsman today. I also have a mountain of clothes to fold. Then work comes tomorrow. 😅
@david@raw.githubusercontent.com your fork worked, and this is a fork, of your fork. Let’s fork’em!
Hello everyone ! 👋 Behold I bring you (after many years) the launch of the Twtxt App 😅 – Ye, this is a Desktop and Mobile app built as a Progressive Web App (PWA) using a little framework (Swag) I put together iafter some experiments @xuu@txt.sour.is and I did in Go and HTMX and Service Workers.
The App is offline-first and supports installing to Desktop and Mobile (add to Home screen) and supports a number of publishing backends, including Yarn.social’s yarnd Pod, Github, Codeberg/Gitea, and a little tiny twtd Twtxt server (See: https://git.mills.io/yarnsocial/twtd).
Please try it out, no need for any account(s) or such, works with your existing feed(s) (as long as the publishing backends work well enough for you!). Please give me feedback! 🙏
Also, did you know the Twtxt Search Engine is back? 🎉
842,000 American Households Lost Power Today During a Heatwave
As America began celebrating its 250th birthday Saturday, 842,000 homes reported power outages, notes ABC News. Figures from tracking site PowerOutage showed states in America’s Northeast and Midwest were impacted by severe weather and extreme heat.
That number, which will fluctuate throughout the day as crews work to restore power, is for households … ⌘ Read more
FSF Shares Update on ‘LibrePhone’ and New Automated Site Monitoring Tool
At the end of 2025, the FSF launched LibrePhone project, which is working to “better understand and reverse-engineer the nonfree blobs used by a great majority of (if not all) system on a chip designs available today.” The FSF’s summer newsletter shares this update:
We started with researching the proprietary files in Android phone … ⌘ Read more
KWin Compositor In KDE Plasma 6.8 Drops Support For Desktop OpenGL
Along with releasing Plasma 6.7.2 this week, KDE developers continue to be quite busy working on new features and improvements for the Plasma 6.8 release while also furthering along fixes for future Plasma 6.7 point releases… ⌘ Read more
GNOME 51 Alpha Released With Numerous Enhancements
In working toward the stable GNOME 51 desktop release due out in September, today marks the alpha release of GNOME 51… ⌘ Read more
Coreboot + AMD openSIL On MSI Ryzen Motherboard Now Works With Windows 11
With 3mdeb’s Dasharo port of AMD openSIL and Coreboot running on the Gigabyte EPYC motherboard, 3mdeb engineers have been devoting more time to their bring-up of Coreboot+openSIL on the MSI PRO B850-P consumer motherboard for desktop AMD Ryzen. They now even have Microsoft Windows 11 working atop this open-source firmware alternative along with other features implemented… ⌘ Read more
Linux Preparing To Retire Its 32-bit MSR Interfaces
Currently measuring in at 32 patches, SUSE engineer Juergen Gross has been leading the effort to end the Linux kernel’s usage of their 32-bit model specific register (MSR) interfaces so the more modern 64-bit interfaces can be exclusively used. This allows for better code unification and cleaning up the MSR code… ⌘ Read more
@arne@uplegger.eu Foo, bar, and baz! Does it work? Is the houseplant happy?
Test! It works now.
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.