Searching txt.sour.is

Twts matching #go
Sort by: Newest, Oldest, Most Relevant

I thought modifying the Caps key was cool. Now I discovered Home Row mods and gave em’ a try … Dear goodness! There’s no going back from this xD

⤋ Read More
↳ In-reply-to » I was Today years old when I learned about the Compose Key 🫠 So, no more Ctrl+Shift+U's for or having to remember Unicode like a chimp

@aelaraji@aelaraji.com I love the Compose Key. 😃 Want that ā€œoā€ with the slash in it? Type Compose + o + / and there you go: Ćø. I use it all the time. Also for stuff like → arrows or ā„¢.

⤋ Read More

@movq@www.uninformativ.de Right now I am using my ai coded twtxt api to edit the twtxt.txt file directly with the api. As well as my ai coded twtxt desktop and mobile clients to go with it. Though the code at least for the desktop client is just a single python file. Plus I do know in the future it might be unmaintable.
I am not the type of person to be like ā€œwow do everything in ai this is so greatā€
The entire reason I tried ai coding a twtxt client was because in an irc channel someone was like ā€œtwtxt is so simple even ai can do itā€ and then I get a five year old (the ai) to do it and because its simple its actually done. I don’t excpect it to be the best ever compared to the human coded twtxt stuff but at least it gets me back on twtxt. I don’t like every other twtxt client that much.

⤋ Read More

@itsericwoodward@itsericwoodward.com

and/or the people in charge realize that ā€œenterprise-classā€ and ā€œvibe-codedā€ are mutually exclusive software concepts

I’m really uncertain about this, to be honest. Short-term, you can vibe-code a ton of stuff and get away with it. I think that quality/correctness only matters for a small fraction of software out there. But long-term? I guess that then depends on whether you’re able to still pay the AI bills. Maintenance/refactoring is going to be veeeeeeeeeeery expensive, and virtually no human will be able to do those tasks. Or, you know, just rip off your customers and don’t sell any long-lasting support contracts in the first place.

I dunno. šŸ¤·ā€ā™€ļø

I hope things get better for you, @movq@www.uninformativ.de (and for anyone else dealing with the same issues).

Thanks! šŸ™

⤋ Read More
↳ In-reply-to » AI usage at work has risen to absurd and moronic levels.

@movq@www.uninformativ.de People have not been fired over here. But I fully expect this to happen, too. Non-techies soldering together their own production shit is only consequent. I was actually wondering when this will happen. Product owners don’t need anyone else anymore, they can just be one-man shows. That’s what the AI bros jerk off to.

If certification won’t help us (heavily crumbling already from what I observe), it will go away completely and will be replaced with the Wild West. That’s my guess.

In case my employer makes it until then, I will have been gone in five years. At most. I should start looking for complete alternatives. The IT industry is absolutely poisoned and destroyed. I have no hopes left. We’re all fucked on so many levels.

⤋ Read More

Chilly 15°C in the shade with a slight breeze, but it was very nice in direct sun. I jumped outside after calling it quits. There were five herons on that meadow, super sweet. One even caught something fairly large when I returned, but it was already too dark, so my camera just cooked up a blurry pixel soup.

The country road is closed for construction. There’s now a one-way detour on the field road. For the opposite direction, you need to take a giant detour. It looks like they installed a temporary traffic light just for that one dairy farm, so that the farmer can also go in the opposite direction, just like before. Surprisingly to me, the traffic wasn’t too heavy on that field road. Of course, I really don’t wanna walk there anymore for the time being, but I expected a hell lot more.

As always, the sunset looked much cooler in person.

https://lyse.isobeef.org/2026-10-12-waldspaziergang/

⤋ Read More

My mate and I went on a hike on Saturday to Germany’s probably most famous tiniest hamlet. Well, not even hamlet, much smaller. It’s a farm (087) and a closed train station (088, 096-102). Okay, and four other houses. But that’s it. Durlesbach is known from the old folk song ā€žAuf de schwƤbsche Eisebahneā€œ, literally ā€œOn the Swabian Railwayā€. According to the German Wikipedia article the German Folk Song Archive counts about 100 variants on the lyrics with up to 27 verses. The song enumerates a few stations and the most common version is about a farmer who ties his goat to the back of a train in order to save the freight costs. Alternatively, he’s used to that from previous ox cart trips where the goat just follows along. Of course, the goat doesn’t make it and the angry farmer throws the disembodied goat head at the conductor.

The weather was perfect. Sunny and clouds alternating, lower twenty-something degrees Celcius. Very beautiful. We took the train to Aulendorf and started our hike.

The level railway crossing in 051-054 is always closed and only opened on demand. I didn’t even know that this kind existed. But it’s really quiet there. We pressed the lever to call the train dispatcher who then opened the barriers for us. A few seconds later we told him that we successfully reached the other side and he closed them again. We were confused at first because the sign said only for authorized personnel and we were just two random hikers. But we gave it a shot and the dispatcher was super nice, no worries at all.

The river is always the Schussen. 092-094 is the creek Durlesbach, entering the Schussen, though. The Durlesbach station is now privately owned, unfortunately. However, it’s nicely kept in shape and there’s a cool monument with a historic steam engine, two wagons and four bronze figures reenacting the scene where the farmer is about to tie his goat, being observed by his wife and the conductor.

You can get all sorts of drinks in exchange for a donation at the display. These proceeds are used for the upkeep. I had an ACE juice which was absolutely delicious. A few hundred meters after we continued, I thought that I really should have bought a second one. It was just too good.

In Mochenwagen, we took the train back to Aulendorf. The Mochenwangen replacement service (we luckily didn’t have to take it, in fact, no idea when it is really in place) is 800 meters away from the train station. That fucking nuts.

We then changed trains to Ulm, just because that one arrived two minutes after we reached Aulendorf. But we spontaneously exited early in Biberach because we had some time to kill for the actual train to Stuttgart. The train station underpass there has some really beautiful graffiti. Shortly after, my second camera battery was flattened, too.

Going home worked out amazingly. When I switched again in Geislingen, my connecting train was already waiting on the other platform. 15 seconds before scheduled departure, the doors closed. One second to departure, we took off. That’s very rare nowadays and it was kind of magical to witness this first hand looking at the station clock.

Sorry for the many photos. I was busy sifting through them and only kept about 20%. Still too many, I know. Enjoy, nevertheless: https://lyse.isobeef.org/2026-10-03-wanderung-von-aulendorf-ueber-durlesbach-nach-mochenwangen/

⤋ Read More
↳ In-reply-to » Did I post this here already?

@prologic@twtxt.net Right, sorry!

It’s a video filmed by a person standing on a beach. The hero of this little movie is a guy on a stand-up paddle board: He’s out on the ocean and tries to reach his air mattress, which is floating on the ocean next to him. But it’s a cloudy and windy day, and he can’t quite reach it. So he keeps paddling and paddling, until he almost got it. Then, another gust of wind – the mattress is gone again. But he doesn’t give up! He keeps paddling, almost reaches it – and another gust of wind. This keeps going for quite a while. Eventually, he is so close to his air mattress that he jumps off his board and tries to truly grab the mattress. And he aaaaaaalllllmooooooooost got it! But then, of course, another big gust of wind and the mattress gets pushed far, far away. Probably gone for good. 🄲

⤋ Read More

You know that I’m ā€œPrinzessin Müllabfuhrā€, but the English translation isn’t that great.

So, I’m going by ā€œPrincess Dumpsterfireā€ now.

Image

(I’m forced to use this shit at work.)

⤋ Read More
↳ In-reply-to » @lyse What is that crazy large Dino Chicken in 23.jpg? :D

@lyse@lyse.isobeef.org Ahh, ohh! Thanks! :D

Both of these scenarios is mindboggling – imagine such a world:

Gastornis species were very large birds that were traditionally thought to have been predators of various smaller mammals, such as ancient, diminutive equids. However, several lines of evidence, including the lack of hooked claws (in known Gastornis footprints), studies of their beak structure and isotopic signatures of their bones, have caused scientists to now consider that these birds were probably herbivorous, feeding on tough plant material and seeds.

If they ever invent a time machine, I wanna go back to the Dinos. šŸ¦•

⤋ Read More
↳ In-reply-to » I've been away with the scouts in our district summer camp. The nearly two weeks were absolutely amazing, mentally a great vacation. On the other hand, physically not so much. But I've still got Monday to recover from my holiday. :-)

When we arrived for the setup, the Düsseldorf youth group was dismantling their camp on the same spot that we had originally booked. But the camp site manager told us that we were the only group on the entire camp site, so we could select any spot, whatever we liked. That was really great, because originally we would have needed to transport all food 150-200 meters from the kitchen to our site. Hence, we just decided to set up in front of the kitchen. We still could just use the entire camp site for games, separate the heavy snorers from the rest, etc.

The only downside was that the sanitary facility was on the other end of the camp site. So, when taking a shower, going to the loo, washing the dishes, we had to always hike over the entire camp site. The kids and their leaders had to do their dishes themselves, this was a tent camp, not a hotel visit after all. Being a member of the kitchen team, we of course took advantage of the dishwashing machines, though. :-) In a traditional tent camp, the kitchen’s dishes are washed by the rotating dish/kitchen service. All children have to participate in that a few times.

On the second to last full day, some camp constructions were built. That spot was another ten minutes hike into the woods. Not sure why the that program wasn’t done right at the beginning but towards the end. That would have been a great playground throughout the camp.

Image

⤋ Read More
↳ In-reply-to » I've been away with the scouts in our district summer camp. The nearly two weeks were absolutely amazing, mentally a great vacation. On the other hand, physically not so much. But I've still got Monday to recover from my holiday. :-)

Something felt definitely wrong, I got up much earlier during the camp than when I have to work. Typically, I woke up beween 6 and 7 because I really had to go to the loo. There was almost always somebody already awake from the kitchen teammates or leaders. So, I always decided to not return to bed. When I was the very first one, I turned on the coffee machine and water kettle to the delight of the others and five minutes later, another person arrived at the kitchen. As a bonus, we sometimes got to enjoy the sunrises, like this one: https://lyse.isobeef.org/2026-09-07-morgensonne/

⤋ Read More
↳ In-reply-to » Does anyone have time this weekend to manually test and validate and prove out this spec I'm calling Gitxt? A Twtxt-inspired purely decentralised Git federation/forge? šŸ¤” Hit me up! You need only git, curl and a web server of some kind.

For the curious, this is fully documented with roleplay Alice/Bob. I was going to test this with @david@daiwei.me but we both got busy, but now I’m on holidays from work for a month so šŸ¤·ā€ā™‚ļø 🤣

⤋ Read More
↳ In-reply-to » Started doing ā€œFraktur Freitagā€ last week on Mastodon, and why not post it here as well. (ā€œBlackletter Fridayā€? Doesn’t work in English. 🤪)

@david@daiwei.me

I wish I knew

Just give it a go. This stuff is super cheap. All you need is a ā€œpenā€, some nibs, ink, and paper. Costs like 20-30 bucks and lasts for several years. The hardest part is finding good paper, really, because most paper these days isn’t made for ink anymore. 🄓

Image

Image

And since social media is always only full of good results, here’s something ā€œshittyā€:

Image

Image

These are my first experiments in 2016 – and that’s after having practiced with a graphics tablet on a PC for a couple of weeks. šŸ˜…

⤋ Read More

Awful 33°C today. But I had to move, no matter what. So, I went outside. At first, the sun was out a bit. It was brutal. Later it vanished behind the clouds. But the humidity was still through the roof.

I watched the corn harvest I came across. Dusty as hell, but it was great fun observe the machineries work.

Going up my backyard mountain, there weren’t many people around. I was pleasantly surprised. However, the smaller hill below was rather crowded. Many people with picnic mats, enjoying their dinner, painting A3 love letters, claiming all available benches, taking wedding photos, walking their dogs, etc.

The public barbecue site at the summit is still closed due to the ongoing fire hazard. I found it rather funny to see a fire extinguisher ready to go next to it. The bread and cake smell disclosed that the Mountain Baking Boys were active. The large oven right next to the BBQ was still going strong.

https://lyse.isobeef.org/waldspaziergang-2026-08-27/

⤋ Read More
↳ In-reply-to » @lyse Huh, didn’t expect that. :-D

@movq@www.uninformativ.de @itsericwoodward@itsericwoodward.com Hahaha, a festival, indeed! :-D There was also ā€œRaupenkriegā€ (caterpillar war): jumping against each other in sleeping bags. I reckon that counts as pogo or mosh pit.

And back in the days, we had wonderful deep mud all around us, too! In extreme years we even needed to leave the camp ground for a day and walk to a gym with all the kids. There was just too much rain and the creek dangerously high.

We once had an actual creek running through the dining tent before the kids arrived. Luckily, it didn’t originate from the official creek, but the water came down the hillside. Unimaginable today with all these droughts in summer. Many creeks around here are dried up for several weeks, if not months now.

There you go, enjoy my favorite selection of yummy chocolate on the ground!

It was a question of the mindset. Once we supervisors just made the best out of it and tried to had fun, the kids typically didn’t mind the mess either. Besides building huts, one of the most favorite things ever was actually ā€œMatschschƶpfenā€ (scooping mud). The kids scooped puddles into wheel barrows using giant soup ladles from the kitchen. ā€œSorry kids, time is up for today. Whoever sits in the closing circle first gets to go first tomorrow.ā€ Unfortunatly, I don’t find any photos from that.

⤋ Read More
↳ In-reply-to » It is such a nice feeling that Mu is such a capable little language šŸ˜… And I decided to write code code in Mu by hand 🤚 haha 🤣 and start solving Project Euler problems, like Problem 8 which works out to be a nice elegant solution in Mu:

And just like that Problem 10 is done and correct whoohoo 🄳 It was easy because in Problem 7 I’d already written an iterator to produce infinite primes. So the solution for finding the sum of primes under 2,000,000 is basically (shortened):

  primes := iter.take_while(iter.filter(prime_candidates(), is_prime), fn(p) { p < n })
  print(iter.sum(primes))

And of course the answer is: 142913828922 which took ~21.ss for the Go Vm to compuete.

⤋ Read More
↳ In-reply-to » It is such a nice feeling that Mu is such a capable little language šŸ˜… And I decided to write code code in Mu by hand 🤚 haha 🤣 and start solving Project Euler problems, like Problem 8 which works out to be a nice elegant solution in Mu:

What’s interesting here… Which is the interesting thing about Mu is the dual runtime. So the above solution for Euler Problem 9 finds the solution in ~429ms with the Go VM and ~327ms natively compiled to darwin/arm64. Not bad for a language I haven’t really done any optimization work on yet (correctness first obviously).

⤋ Read More

but yes, however you cannot currently add it or delete post via the app as I haven’t really built that feature at the moment you technically can do it, but you do run into some challenges with breaking threads if you’ve already published something and then go back and edit it so we generally advise not to do that too much if you can help it

⤋ Read More
↳ In-reply-to » The author of the Xfce Wayland compositor on LLMs:

Most of this insane power consumption happens during the models training, so the additional cost of prompting, is minimal. Facebook invented cool ways to exted the environmental damage far beyond the training stage, by dumping the dirty data center water into nearby water sources, but that’s more so a Facebook problem, than a fault of AI.

I would still never waste my own money, paying for any AI subscriptions that my employer doesn’t already pay for, no matter if we use them, or not.

I am also against aggressive scraping and taking everything as training data, disregarding the authors wishes and license. I allow it on my website, mostly as proof that no matter how much they scrape my stuff, the real me remains both a superior webdev and artist.

I am well aware this makes me come across really egotistical, especially after developers far better than me, embraced vibe coding, arguably way too much. To give an example, all attempts to get Microsoft Copilot, that’s embedded into SharePoint, to generate an extension/uBlock filter to make SharePoint revert to the old superior UI failed, but I was able to do that in three lines of code ( https://thecanine.smol.pub/ublock-filters ), in half an hour, despite me never seeing the code of that page before. After a few of these comparisons, it is increasingly hard to see most of these tools, as my replacement.

I am not even going to talk about the people trying to imitate my art style with AI, until they can show me a result where all the squares are the same size, in a grid and actually square.

⤋ Read More
↳ In-reply-to » I hate having my website offline, so I tried to bring it back in a honey-potted version: ā€œAIā€ agents get served article versions with inverted meaning, like ā€œdoā€ replaced with ā€œdon’tā€ and so on.

@itsericwoodward@itsericwoodward.com It only did that after I asked it what’s going on. Before that, it treated all my attempts as regular trustworthy (but silently ā€œcorrectedā€) sources. Only a completely garbled up page (all words put into random order) was recognized as garbage. Everything else was: ā€œHey, that’s a good source! Here’s a summary: $correct_summary_with_original_meaning_even_though_the_actual_page_said_otherwiseā€

⤋ Read More

https://youtu.be/Q9uefFYe6bM

I really am saddened by the current state of LG, as someone who used their phones and monitors for decades and still uses and albeit cautiously recommends their TVs, to those who can also go through the hours long process, to reconfigure them.

They really are the ultimate great hardware, burdened by adware and spyware filled anti-consumer firmware company.

⤋ Read More
↳ In-reply-to » Dunno if anyone will find this interesting... But some ~6 months or so ago I experimented briefly with creating a whole bootloader + kernel + userland -- Basically an entire OS in the Mu programming language (which as you know I also designed and created) -- 6 months later I've worked on it some more after spending the last week working on improvements to Mu itself, which is now able to compile itself with its own Mu implemented compiler and now have an os/arch backend called 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 šŸ˜…

⤋ Read More
↳ In-reply-to » Dunno if anyone will find this interesting... But some ~6 months or so ago I experimented briefly with creating a whole bootloader + kernel + userland -- Basically an entire OS in the Mu programming language (which as you know I also designed and created) -- 6 months later I've worked on it some more after spending the last week working on improvements to Mu itself, which is now able to compile itself with its own Mu implemented compiler and now have an os/arch backend called 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…

⤋ Read More
↳ In-reply-to » Tell me which one of those ā€œplusā€ icons on this screenshot you can click and which one is just decoration.

@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.

⤋ Read More
↳ In-reply-to » Hello Twtd!

@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?

⤋ Read More
↳ In-reply-to » 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.

@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.)

⤋ Read More
↳ In-reply-to » @prologic Hmmm, I have no idea how to solve that problem. šŸ˜… Some 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.

⤋ Read More

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.

⤋ 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!?

⤋ Read More

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 🤣

⤋ Read More

@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. :-)

⤋ 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!

⤋ Read More

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:

Image

Before with read messages:

Image

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:

Image

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:

Image

It looks like a parrot. Let’s see if I begin to like it.

⤋ 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.

⤋ Read More
↳ In-reply-to » Yeah, lol, fuck off. Tried to reproduce that hashing issue, thus playing around with Go a little bit. And what did I find?

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.

⤋ Read More
↳ In-reply-to » Yeah, lol, fuck off. Tried to reproduce that hashing issue, thus playing around with Go a little bit. And what did I find?

@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

⤋ Read More

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 🤣

⤋ Read More

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.)

⤋ Read More
↳ In-reply-to » New in the Twtxt App 🄳 a Hosted feed backend — claim a nick, one tap, no account, no server, nothing to run. Your feed lives at https://twtpub.com/u/yournick and you're posting from the app straight away šŸŽ‰

@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 šŸ¤ž

⤋ Read More

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!

⤋ Read More
↳ In-reply-to » +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.ā€

⤋ Read More

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! šŸ˜‚

⤋ Read More

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? šŸŽ‰

⤋ Read More
↳ In-reply-to » Fuck me! I tried to upgrade tview and the first thing I notice is a shitload of added dependency versions:

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.

⤋ Read More
↳ In-reply-to » I went to check on the fireflies this season. But I didn't see any. Instead lots of moths. At first, I thought it might have been still too light, but it was already dark enough for me to miss and destroy a snail shell. Bummer. Maybe it was too wet tonight. Although, it's probably just another or two weeks until my glowing friends will finally show up.

The firefly season is ending. I only saw 200 of them or so. There was one female directly on the forest road. If only I brought my camera and tripod, that would have worked out I reckon. I had my torch with me and this looked really cool.

Dusk took forever today. It was really long light out there. Full moon is tomorrow.

On the way back, there was suddenly a load clatter and crashing sound 100 meters away from me. I didn’t see anything, but a tree fell over in the forest out of the blue. Fuck me dead, that was scary as hell. Luckily, I was already on the main road, only meadows around me. It’s the second time I witnessed a tree accidentally coming down. The first one was during the most expensive hail storm in our area so far in 2011 behind me when setting up a summer camp. The weather changed in less than 15 minutes.

Maybe not such a good idea to go out so late alone. :-? Any rustling in the forest immediately reminded me of the boar the other day. Luckily, always false alarm. Still a bit terrified from that event.

⤋ Read More
↳ In-reply-to » So I decided to change tact a bit with GoNIX and instead of trying to build apure Go browser from scratch (which I kinda of half succeeded, in at least it was able to render most static ssr sites), I've instead decided to write a new browsered using the Chromium Embedded Framework, otherwise known as CEF. So now I have a fully working browser in GoNIX šŸŽ‰ -- However since my goal is to keep GoNIX pretty lcean and mostly written in Go, I delegated the cef part(s) to an OCI container image and run that with GoNIX's box (command-line container runtime). It works great šŸ‘

@movq@www.uninformativ.de CEF turns out to be pretty easy. I had to write a bit of C and Go to bridge, but once that got going I was able to write it into my pure Go go-wayland wlui library for final rendering. The delegating the entire CEF part was a good idea though because it keeps all the complexity in a container Image, leaving me with just the Go + C stubs/interface and SHM/IPC parts.

⤋ Read More

So I decided to change tact a bit with GoNIX and instead of trying to build apure Go browser from scratch (which I kinda of half succeeded, in at least it was able to render most static ssr sites), I’ve instead decided to write a new browsered using the Chromium Embedded Framework, otherwise known as CEF. So now I have a fully working browser in GoNIX šŸŽ‰ – However since my goal is to keep GoNIX pretty lcean and mostly written in Go, I delegated the cef part(s) to an OCI container image and run that with GoNIX’s box (command-line container runtime). It works great šŸ‘

⤋ Read More
↳ In-reply-to » @lyse 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.)

@movq@www.uninformativ.de Right. A Go programmer eventually knows that its nanoseconds precision. Keyword arguments like in Python are just sooo superior to unnamed positional arguments. I wish that Go had them, too.

⤋ Read More
↳ In-reply-to » I went to check on the fireflies this season. But I didn't see any. Instead lots of moths. At first, I thought it might have been still too light, but it was already dark enough for me to miss and destroy a snail shell. Bummer. Maybe it was too wet tonight. Although, it's probably just another or two weeks until my glowing friends will finally show up.

A deer, multiple frogs, several thousand fireflies and something else. It was already very dark when I was silently drifting along on a nice soft mossy path, enjoying the firefly show left and right and in front of me. I then heard some rustling about 30 meters in the distance in the shrubs. I thought that I must have scared up a deer. But it kept on rustling without any worries. And I closed in without seeing anything.

Only when I heard the quick oink from just 10 meters away, I froze. Shit, no deer, but a boar! Suddenly, I was the one who was scared. It probably hadn’t noticed me before. But did it notice me now? Was that grunt a warning or just completely unrelated? The rustling appeared to slowly come closer. What if there were also piglets around? I couldn’t figure out how many boars there were. Maybe just one, possibly more. A wild boar easily rips a hunting dog apart, so I didn’t want to take any chances and decided I will not wait for them to eventually pass me behind the brush in just a hand full of meters, so I can keep on going. While I was just turning around, I heard another oink and was frighened to death. I ran 20 meters, before calming down a little bit. I listened for half a second and nobody was following me. Phew. I then walked back the path.

What an adventure, I tell you. That was my second (or maybe third?) wild boar encounter in the woods ever. A hell lot more scary at night than during daylight when you can actually see something.

⤋ Read More
↳ In-reply-to » Hmmm are there really no decent Wayland (desktop) compatible image viewers that don't drag in Mesa and all it's hundreds of dependences or GCC and libgcc and it's multi-hour long build time or Rust? geez

@movq@www.uninformativ.de I looked into swagimg. That’s the thing, The latest version pulls in fark’n C++ (geez fuck) and luajit. Anything else I’ve round for Wayland depdns on Rust (wtf?!) – So I built my own in Pure Go. It’s wonderful, so simple, only ~170 lines of Go 🤣

⤋ Read More
↳ In-reply-to » It’s ten thousand million degree celsius outside and I have to go to a birthday party today because wElL iTs My BiRtHdAy ToDaY, I think I’m going to die, send help.

@movq@www.uninformativ.de It is horribly hot and humid here, and is not even 08:00. AC ran overnight for 3+ hours. It is going to be hellish, not going to lie.

Your birthday, or someone else’s? Either way, happy birthday! šŸ„³šŸŽ‚ May many more years come, with good health… and less heat! ā˜ŗļø

⤋ Read More

So I’ve been working on GoNIX the last few days… Which is derived from µLinux – At least it’s entire build process. GoNIX however has a 100% Go userland, including the init process, package and service management.

Now… As an experiment, because I was able to make much process on enhancing the build tools and package management, I decided to see if I could build a ā€œDesktopā€ Gui of sorts…

I still wanted it to be fairly minimal and lightweight. So I went with wayland (of course) and labwc and yambar. So far I’m liking the result šŸ‘Œ 42 packages in the wayland-desktop meta port. Not too bad. Not sure if I can slim that down anymore… But trying to avoid Mesa/GL as that drags in far too much ā€œcruftā€.

⤋ Read More
↳ In-reply-to » I went to check on the fireflies this season. But I didn't see any. Instead lots of moths. At first, I thought it might have been still too light, but it was already dark enough for me to miss and destroy a snail shell. Bummer. Maybe it was too wet tonight. Although, it's probably just another or two weeks until my glowing friends will finally show up.

I found my tripod and headed into the woods. There was a ton of glow. \o/ The fireflies were everywhere, super cool. It looked so amazing, especially with all the flying boys. There was one amazing spot in particular, I had 80-100 individuals in my view at once. Absolutely breathtaking. Unfortunately, the mozzies were also delighted about my visit.

I tried my best, but it’s impossible to capture anything on film with my equipment. The fireflies are just way too dim. In the end, I managed to get some very bright girls in the bush. That’s the best I could do, but still really bad. Sorry @bender@twtxt.net. :-(

https://lyse.isobeef.org/gluehwuermchen-2026-06-19/

And no idea what the heck is going on with the CSS there. Anyway. Garbage to trash, seems fitting. ;-)

⤋ Read More
↳ In-reply-to » Every now and then, I think that I have carefully proof-read my message enough times and hit the "Add message" button in tt. But then, in the message tree, I spot another missed typo. My process is then to go to my twtxt.txt and fix it by hand. However, I still have to clean up tt's cache. This is rather tidious:

Fuck me! I tried to upgrade tview and the first thing I notice is a shitload of added dependency versions:

go.mod | 18 ++++-----
go.sum | 97 ++++++++++++++++++++++++++++++++++++++-----------

My code does not compile anymore as the view.FormItem interface was extended. Get/SetDisabled(…) are quickly implemented, no worries.

But the tview.Primitive (what makes a widget) interface has now a bunch of PRIVATE methods. For focus handling. Would you believe that!? Thanks, I cannot satisfy this interface in my very custom widgets anymore. Okay then, I just embed *tview.Box. tt now successfully compiles, but does not react anymore on key presses and the message tree is not focused either.

I’m not in the mood to debug this shit. :-( Lunch time.

⤋ Read More

FIFA World Cup 2026 LIVE updates: Brazil and Morocco draw 1-1 in New Jersey, Australia’s Socceroos start campaign against Turkey
Brazil and Morocco go head-to-head before the Socceroos begin their World Cup campaign against group favourites Turkey. Follow all the action. ⌘ Read more

⤋ Read More
↳ In-reply-to » Every now and then, I think that I have carefully proof-read my message enough times and hit the "Add message" button in tt. But then, in the message tree, I spot another missed typo. My process is then to go to my twtxt.txt and fix it by hand. However, I still have to clean up tt's cache. This is rather tidious:

Getting the vim key bindings to work for focus switching in this modal dialog took me forever. Only cursors and (Shift+)Tab are supported out of the box. I absolutely understand that, it’s fine. I installed an input handler on the dialog, but the focus always stayed the same.

After two wasted hours, I was in despair to copy the tview.Modal into my own code base. Of course, I had to fix all the private tview field accesses first. But even installing the input handler directly on the buttons themselves did not work. Even though, the handler was definitely executed, the focus did not shift. Forcing redraws as a last resort also did not work.

Looking through all the messy chained input handling, I eventually stumbled across another place in the tview.Form, which is internally used by tview.Modal. This messed around with app focus receptions and input handlers. This gave me the idea to make the tview.Application refocus my modal dialog after I told the modal dialog which button to select. And would you look at that, this did the trick! I haven’t completely figured out what is going on exactly, but I could get rid of my Modal clone again.

I always go through hell with focus handling in tview. Each and every time. It just does not feel natural to me. Complete brainfuck to wrap my head around. The Urwid API felt sooo much more refined, it never was an issue. It just works. In fact, I cannot think of any other TUI library that has remotely the same pain level when it comes to focusing widgets as tview.

Now I’m curious how movwin deals with that. ;-)

⤋ Read More

Every now and then, I think that I have carefully proof-read my message enough times and hit the ā€œAdd messageā€ button in tt. But then, in the message tree, I spot another missed typo. My process is then to go to my twtxt.txt and fix it by hand. However, I still have to clean up tt’s cache. This is rather tidious:

  1. Recall the sqlitebrowser ~/.local/share/twtxt/tt2.sqlite from my shell history.
  2. Switch to the ā€œBrowse dataā€ tab.
  3. Go to the messages table and wait a second or two until it’s loaded.
  4. Sort by the created_at column twice, so that I get descending order.
  5. Select the first message, which is typically the one in question.
  6. Find the ā€œRemove currently selected rowā€ button in the tool bar.
  7. Commit the changes.
  8. Close sqlitebrowser.

So, I finally implemented the removal of messages from the cache in tt. I can now hit d and confirm the removal. Bam! Should have done that ages ago!

Image

Next up is the search, I think.

⤋ Read More
↳ In-reply-to » Oh boy, I absolutely hate this stupid trend of not writing changelogs anymore! Why the fuck would one seriously consider it to be a viable option to just let some shitty bot spew all merge requests on a goddamn GitHub release?! First of all, these merge request titles suck balls. The order of the changes in this "changelog" is completely random (well, probably merge time, which is as useless as the dick on the Pope). They are not grouped by anything at all. Additions, changes, removals, deprecations, etc. randomly mixed up in one giant list. And then "Add feature X", seventeen kilometers further down "Revert 'Add feature X'". Fuck you! Don't include this shit in the first place!

@lyse@lyse.isobeef.org Thanks!

On the AI changelog part, though, I’d rather recommend to just not have a changelog at all.

I’m afraid that ship has sailed. You can rest assured that someone who uses AI/LLMs for their code (which is almost everybody at this point) will most certainly also use it for changelogs.

I actually considered not mentioning AI output at all, because this just opens a huge can of worms … šŸ˜ž

While going through these terrible GitHub release pages, I also found these ā€œNew Project Contributorsā€ sections

Yeah, they play on a nerd’s pride.

Now, it’s just the same auto shitshow with MR titles in a rolling date-versioned release scheme. It’s just our team who has to deal with that, though. I think I’m the only one who is not a fan of it.

I’ve found that this whole situation is much worse at work than it is in the Free Software world. At work, it’s literally work and hardly anybody actually cares. We still don’t have all people convinced that writing good commit messages or using good branch names is worth the time. It’s … oh god, no, I’m going to stop here, this is bad for my mental health. šŸ˜…

Suffice it to say, all release notes at work are now AI-generated. Nobody gives a fuck.

⤋ Read More