muos/amd64 that boots into a running shell, with a tiny little vfs, UNIX-like semantics, syscalls, read/write, etc. It works pretty nicely, and aside from a small Assembly "nucleus", most of the Kernel and Userspace is written in Mu.
@movq@www.uninformativ.de It’s “shaping” up to where I think I want it to go 😅
Next heat wave coming up?

Still a few days to go, luckily, and these models aren’t super accurate … we’ll see …
muos/amd64 that boots into a running shell, with a tiny little vfs, UNIX-like semantics, syscalls, read/write, etc. It works pretty nicely, and aside from a small Assembly "nucleus", most of the Kernel and Userspace is written in Mu.
@david@daiwei.me It’s somewhat expected to have a fair bit of Assembly (machine code) to get some of the bits you need going. But I think I can reduce this a bit. Let’s see…
@lyse@lyse.isobeef.org Bingo!
Oh, yeah, newsboat is good. For this particular use case, I explicitly needed a graphical feed reader, though. 😅 I ended up using Thunderbird, which has its own interesting way of configuring/adding feeds:
https://movq.de/v/a3557e3dc9/vid-1784952576.mp4
Why are feeds categorized as “Mail”? What’s going on with that “Add” button on the left of the dialog? Why does the dialog indicate that there’s a folder called “list-files Recent Commits” which doesn’t really exist in the end? (Why does it take about 1-2 seconds to load 25 feed items?) And so on.
Fedora 45 Looks To Begin Phasing Out In-Kernel Crypto Userspace API
Going along with the upstream Linux 7.2 kernel deprecation of AF_ALG and Linux 7.3 to further restrict this interface for letting user-space programs interact directly with the Linux kernel crypto API, Fedora 45 is looking to follow and help support this transition… ⌘ Read more
The original Darkest Dungeon is set for a new DLC over 10 years after release
Not many developers will go back to their classics, but Red Hook Studios are giving the original Darkest Dungeon a brand new DLC soon.
Read the full article on [GamingOnLinux](https://www.gamingonlinux.com/2026/07/the-original-darkest-dungeon-is-set-for-a-new-dlc-over-10-years-after … ⌘ Read more
@prologic@twtxt.net Sorry I haven’t seen your question before! and to answer your question, no, it wasn’t hard at all. it’s a simple go build …etc. as instructed + scp twtd to remote + made a systemd service for it to (re)start automatically under a dedicated twtd user for lols. + poked at the Caddyfile to reverse-proxy a couple of paths and called it a day.
Too much info?
@david@daiwei.me Go down to “Releases”, there’s a link to the CHANGES: https://movq.de/git/jenny/CHANGES.html
@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.)
Three New Ubuntu Snap Vulnerabilities Made Public - One Dates Back To Ubuntu 16.04 LTS
Canonical today disclosed three new Snap security vulnerabilities affecting snapd. Two are rated high impact vulnerabilities while the third is considered medium but covers all Ubuntu releases of the past decade going back to Ubuntu 16.04 LTS… ⌘ Read more
MXGP 26 revealed with a new gameplay trailer
A fresh start for the motorcycle racing series, MXGP 26 has been revealed and there’s a trailer to go along with it.
Read the full article on GamingOnLinux. ⌘ Read more
jenny stuff aside, I received zero bug reports or code contributions since leaving GitHub in 2018.
@prologic@twtxt.net Oh, yes, just for clarity: This wasn’t a “pro GitHub” argument. 😅 I won’t go back there (or to another “forge”).
I think we’re totally on the same page: Decentralized Git hosting is good, but we haven’t solved the “collaboration” part yet. Or rather: We have to modernize it. The tools are already there, but (many) people don’t want to use them and think they’re clunky.
I’m seeing some slowdowns in Vim lately. Must have something to do with syntax highlighting or indentation rules or something: When I hit Enter to go to the next line, it sometimes freezes for like 100 ms. It’s pretty annoying.
Doesn’t happen in Vim Classic, so I switched all my machines to that now.
Valve expect component prices to continue getting worse
If you were hoping prices anywhere to come down soon - Valve have some bad news for you, as it’s only going to continue getting worse.
Read the full article on GamingOnLinux. ⌘ Read more
I don’t get people strolling in nature with headphones on and constantly staring at their phones all the time. Why even go outside if you cover ears and eyes? Okay, you’re on the move and smell the country air, but still. Yesterday, one girl was wearing earphones and reading a real book while walking on a field path. Better than a phone, sure, but what the hell!?
@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!! 😆
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 🤣
@prologic@twtxt.net well, thank you my good friend! Now, lets go for blackjack and hookers! 😂
@david@daiwei.me Right now, tt’s theme is baked into the binary. I have to edit the ui/styles.go and recompile. Luckily, this almost takes no time. But my todo list already includes a bullet point to make this customizable via the configuration file. :-)
The first thing that came out of my mouth this morning was: “I don’t feel like I want to go to the beach. Sue me!”
Well, yes! It IS one of those days.
@movq@www.uninformativ.de I’m with @prologic@twtxt.net on this one… I spent nearly a decade as an “enterprise” Java developer (servlets and JSPs and Spring, oh my!) before I finally swore it off, and I’ve been Ora-clean ever since (8 years and counting).
I won’t go back.
Game on the go with the new Humble Handhelds Bundle
Want some more games for your Steam Deck, Legion Go or whatever other device you have? The newly launched Humble Handhelds Bundle might save the day.
Read the full article on GamingOnLinux. ⌘ Read more
You may have noticed I am not as active as I used to be here. Old @bender@twtxt.net isn’t going anywhere, though! But… I am Hyde, and my Jekyll resides at @david@daiwei.me. Jekyll is having his turn more often now, so if you follow my pure, unrestrained evil, you may as well follow my dark desires, hypocrite counterpart. 😈🤣
Follow @david@daiwei.me, or I will bend you!
Unread messages are yellow, while read messages are white in tt. Focusing them just alternates the fore- and background colors. With the old color scheme, I disliked that inline code and code blocks were basically just the opposite of normal text. Hence, unread code was white and read code yellow. I found this often confusing, especially with larger code blocks. Sure, there are the timestamp and author columns that still show the usual white (read) and yellow (unread) background for selected messages, but still.
This is how it was before with unread messages:

Before with read messages:

So, I just reworked the code styles. Not sure if I like that or if it is actually an improvement. Unread code is teal on gray when not in focus and becomes blue on orange when focused. I thought the dark gray code background on a black regular background is still nice and subtle. The same similarity in colors for focused messages meant to go with an orange code background on a yellow regular background. The teal was too light, so went with a blue foreground color:

When read and unfocused, the new color scheme calls for the same code style teal on dark gray. However, with white as the main background for selected messages, I went with a light gray code background and a blue code foreground. Again, the contrast with white and teal wasn’t good enough. Vice versa, blue on dark gray is also not all that readable:

It looks like a parrot. Let’s see if I begin to like it.
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 yes I wouldn’t go and change your feeds location the location a fourth time that’s for sure! 🤣
@david@daiwei.me Please write an issue for this 🙏 I don’t mind which way we go!
I also set this to local years ago:
$ go env | grep TELEM
GOTELEMETRY='local'
When this came out I was also outraged. But it doesn’t go anywhere, there are no network connections. It is effectively “off” like this.
@lyse@lyse.isobeef.org Yeah, okay, the default being local means it only stores this stuff offline. So they claim. I don’t trust this and I don’t want to go anywhere near it.
@movq@www.uninformativ.de Yes, this is absolutely a no-go!
A long time ago when the first telemetry shitstorm happened, I added export GOTELEMETRY=off in my ~/.zshrc. But it doesn’t seem to be picked up at all (I actually call this sabotage!):
$ go env GOTELEMETRY
local
$ go env -w GOTELEMETRY=off
go: GOTELEMETRY cannot be modified
$ go telemetry off
$ go env GOTELEMETRY
off
I don’t think I’m going to add edit and delete support in this app because I think it was a horrible mistake to add those features to a client 🤣
@movq@www.uninformativ.de please don’t waste your time to bugging this. I’ll figure out what’s going on with these new clients.🙏
Yeah, lol, fuck off. Tried to reproduce that hashing issue, thus playing around with Go a little bit. And what did I find?
$ tree ~/.config/go
/home/user/.config/go
└── telemetry
├── local
│ ├── asm@devel-devel-linux-amd64-2026-07-14.v1.count
│ ├── compile@devel-devel-linux-amd64-2026-07-14.v1.count
│ ├── go@devel-devel-linux-amd64-2026-07-14.v1.count
│ ├── link@devel-devel-linux-amd64-2026-07-14.v1.count
│ ├── upload.token
│ └── weekends
└── upload
4 directories, 6 files
It collects and uploads “telemetry” now.
No.
(Don’t tell me how I can turn that off. Not interested. This is a compiler and it wants to track me, without asking for consent. That’s a no-go.)
@david@collantes.us heads up 👋 that verification code never reached you — outbound email was broken on my end (my mail relay was rejecting twtxt.net senders 🤦♂️). Fixed + deployed now 🥳 give the hosted feed another go, it’ll land this time 🤞
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!
@kat@yarn.girlonthemoon.xyz omg i haven’t been here in FOREVER i’m sorry yarn friends!!! i’ve had a lot going on including being extremely depressed :(
@prologic@twtxt.net TBH, I was just going to try and reverse engineer it from the Go source files, but any other docs you can provide would be helpful, for sure! 🙏
+00:00 vs Z should be treated as equivalent UTC 🤦♂️ I'll take a look at the timestamp parsing in Yarnd 🧐
@prologic@twtxt.net For what it’s worth, the twt hash extension is specifically modeled after yarnd’s implementation with all the quirks coming from Go’s stdlib: https://twtxt.dev/exts/twt-hash.html#timestamp-format
“All timezones representing UTC must be formatted using the designated Zulu indicator Z rather than the numeric offsets +00:00 or -00:00. If the timestamp does not explicitly include any timezone information, it must be assumed to be in UTC.”
Go for it! 🙌
@david@daiwei.me good, let’s get this test going. This is simply a reply to iqqsqst5vokf (first twtxt).
There you go: https://movq.de/blog/postings/2026-07-10/0/POSTING-en.html
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! 😂
And I meant “its simplicity”. Autocorrect is going to get me in troubles one of these days. LOL.
And I bet your internets are going off soon. Post interesting, exotic pics!
What in the forkity fork is going on here! 😂
I slept for over 10 hours last night and today. Finally caught up for the many nights going to bed at 02:00, and waking up at 05:00.
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? 🎉
AOL’s Owner Bending Spoons Hits Wall Street with $1.7 billion IPO
“The owner of AOL and other tech businesses hit Wall Street with a $1.7 billion initial public offering Wednesday,” reports the Associated Press:
The company is getting $1 billion in proceeds, while the rest is going to shareholders. The stock surged 39.7% in its first day of trading under the symbol “BSP” on the Nasdaq, giving it a market value of $2 … ⌘ Read more
Okay I’m going to bed, g’night folks 👋
@movq@www.uninformativ.de It varies… We tend to prefer bowtie collars for all of our little boys, but they like to wrestle sometimes, and since they’re indoor-only, they can go for months without collars at all.