@prologic@twtxt.net Seems to work? š§
LLVM 23.1-rc1 Released With AMD Zen 6 & AVX-512 BMM Support, Other Compiler Enhancements
Following the recent code branching for the LLVM 23 series, LLVM 23.1-rc1 was released today in working toward the next stable release of this open-source compiler stack⦠ā Read more
@klaxzy@klaxzy.net Hey, sounds exactly like the company I work(ed) for.
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