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
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 ā¢.
@lyse@lyse.isobeef.org Wow. Straight to the wallpaper collection, these go. š
@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.
@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! š
@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.
@david@daiwei.me There ya go! :-)
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.
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/
@zyak@twtxt.z85b.xyz I am going to fork it from my client now.
@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. š„²
You know that Iām āPrinzessin Müllabfuhrā, but the English translation isnāt that great.
So, Iām going by āPrincess Dumpsterfireā now.
(Iām forced to use this shit at work.)
Hahaha, @david@daiwei.me! Why did the duck go to jail?
echo Zm9yIHNlbGxpbmcgcXVhY2sK | base64 -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. š¦
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.
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/
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 š¤·āāļø š¤£
By industry i assume you both mean IT?
Whatās going on in your neck of the woods (planet) š§
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. š„“
And since social media is always only full of good results, hereās something āshittyā:
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. š
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.
@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!
- https://wawuwo.de/old/wawuwo2006_woche2/montag/00020.html
- https://wawuwo.de/old/wawuwo2006_woche2/dienstag/00011.html
- https://wawuwo.de/old/wawuwo2006_woche2/dienstag/00018.html
- https://wawuwo.de/old/wawuwo2006_woche2/dienstag/00024.html
- https://wawuwo.de/old/wawuwo2006_woche2/freitag/00003.html
- https://wawuwo.de/old/wawuwo2007_woche2/09.08.2007-donnerstag/00001.html
- https://wawuwo.de/old/wawuwo2007_woche2/09.08.2007-donnerstag/00004.html
- https://wawuwo.de/old/wawuwo2007_woche2/09.08.2007-donnerstag/00021.html
- https://wawuwo.de/old/wawuwo2007_woche2/10.08.2007-freitag/00005.html
- https://wawuwo.de/old/wawuwo2007_woche2/10.08.2007-freitag/00009.html
- https://wawuwo.de/old/wawuwo2007_woche2/10.08.2007-freitag/00010.html
- https://wawuwo.de/old/wawuwo2007_woche2/10.08.2007-freitag/00011.html
- https://wawuwo.de/old/wawuwo2007_woche2/10.08.2007-freitag/00013.html
- https://wawuwo.de/old/wawuwo2007_woche2/11.08.2007-samstag/00001.html
- https://wawuwo.de/2009/woche2/freitag/043.html#image
- https://wawuwo.de/2010/woche2/abbau/016.html#image
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.
@lyse@lyse.isobeef.org Oh yeah, going full Prinzessin Müllabfuhr! š„³ šø
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.
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).
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
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.
@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ā
Blurry as fuck, but there ya go: https://lyse.isobeef.org/abendhimmel-2026-08-04/
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.
@david@daiwei.me Go ahead and grab something, mate!
@GabesArcade@gabesarcade.com So we going with an Import/Export feature? Or would you also like optionally to write # follow = into the feed too? š¤ Can do either/or or both.
@movq@www.uninformativ.de A mate showed me a graph reaching 40°C⦠:-O Itās going to be hell on earth.
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.
@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.)
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.
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.
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 :(
+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? š
Okay Iām going to bed, gānight folks š
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.
@bender@twtxt.net There already is one haha 𤣠I already wrote ed and vi in Go š¤£
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.
Weāre at 39.5 °C now. Are we going to hit 40?
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.
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 š
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.
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.
@movq@www.uninformativ.de Here you go 𤣠https://git.mills.io/prologic/gonix/src/branch/main/cmd/imgview/main.go
@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 š¤£
@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! āŗļø
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.
@prologic@twtxt.net 100%. I am never going back to anything else but. Static sites would last much longer than any other too, for sure.
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ā.
@movq@www.uninformativ.de Weāre already at 29°C now. Five more to go. Itās terrible!
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. ;-)
@movq@www.uninformativ.de ahem that dreaded time has come! In the US they are due on 15 April, and wife, the tax doer, waits until the last day to complete them. āIf we are going to pay, we may as well delayā, thatās her motto. š
@movq@www.uninformativ.de Gotta make the economy go āaroundā and keep public services in play š Good luck! š¤
SpaceXās $3 trillion debut expected to kick off wave of AI mega IPOs
The spectacular debut of SpaceX paves the way for an unprecedented series of floats this year as AI giants like Anthropic and OpenAI plan to go public. ā Read more
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.
Irankunda sets Aussie crowd alight with electric goal
Australian fans go wild as Nestory Irankunda smashes the ball into the back of the net to score against Turkiye. ā Read more
Irankunda sets Aussie crowd alight with electric goal
Australian fans go wild as Nestory Irankunda smashes the ball into the back of the net to score against Turkiye. ā 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
AI Coding at Home Without Going Broke
Article URL: https://stephen.bochinski.dev/blog/2026/06/13/ai-coding-at-home-without-going-broke/
Comments URL: https://news.ycombinator.com/item?id=48518969
Points: 3
# Comments: 0 ā Read more
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. ;-)
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:
- Recall the
sqlitebrowser ~/.local/share/twtxt/tt2.sqlitefrom my shell history.
- Switch to the āBrowse dataā tab.
- Go to the
messagestable and wait a second or two until itās loaded.
- Sort by the
created_atcolumn twice, so that I get descending order.
- Select the first message, which is typically the one in question.
- Find the āRemove currently selected rowā button in the tool bar.
- Commit the changes.
- 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!
Next up is the search, I think.
Belhod! I present Swag ā Build offline-first web apps in pure Go and HTML.
@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.