Something happened with the frame rate of terminal emulators lately. It looks like there’s a trend to run at a high framerate now? I’m not sure exactly. This can be seen in VTE-based terminals like my xiate or XTerm on Wayland. foot and st, on the other hand, are fine.
My shell prompt and cursor look like this:
$ █
When I keep Enter pressed, I expect to see several lines like so:
$
$
$
$
$
$
$ █
With the affected terminal emulators, the lines actually show up in the following sequence. First, we have the original line:
$ █
Pressing Enter yields this as the next frame:
$
█
And then eventually this:
$
$ █
In other words, you can see the cursor jumping around very quickly, all the time.
Another example: Vim actually shows which key you just pressed in the bottom right corner. Keeping j
pressed to scroll through a file means I get to see a j
flashing rapidly now.
(I have no idea yet, why exactly XTerm in X11 is fine but flickering in Wayland.)
@prologic@twtxt.net @bender@twtxt.net That’s what I thought as well, sounds way too expensive to me. But I have no idea what the prices are over here. Probably also astronomical. Campers sit around most of the time, one really would need to use them a lot to justify spending so much money on them.
But yeah, each to their own (expensive) hobbies. :-) I, for example, burn my money on tools that I don’t really™ need. :-P
@prologic@twtxt.net Yeah, this really could use a proper definition or a “manifest”. 😅 Many of these ideas are not very wide spread. And I haven’t come across similar projects in all these years.
Let’s take the farbfeld image format as an example again. I think this captures the “spirit” quite well, because this isn’t even about code.
This is the entire farbfeld spec:
farbfeld is a lossless image format which is easy to parse, pipe and compress. It has the following format:
╔════════╤═════════════════════════════════════════════════════════╗
║ Bytes │ Description ║
╠════════╪═════════════════════════════════════════════════════════╣
║ 8 │ "farbfeld" magic value ║
╟────────┼─────────────────────────────────────────────────────────╢
║ 4 │ 32-Bit BE unsigned integer (width) ║
╟────────┼─────────────────────────────────────────────────────────╢
║ 4 │ 32-Bit BE unsigned integer (height) ║
╟────────┼─────────────────────────────────────────────────────────╢
║ [2222] │ 4x16-Bit BE unsigned integers [RGBA] / pixel, row-major ║
╚════════╧═════════════════════════════════════════════════════════╝
The RGB-data should be sRGB for best interoperability and not alpha-premultiplied.
(Now, I don’t know if your screen reader can work with this. Let me know if it doesn’t.)
I think these are some of the properties worth mentioning:
- The spec is extremely short. You can read this in under a minute and fully understand it. That alone is gold.
- There are no “knobs”: It’s just a single version, it’s not like there’s also an 8-bit color depth version and one for 16-bit and one for extra large images and one that supports layers and so on. This makes it much easier to implement a fully compliant program.
- Despite being so simple, it’s useful. I’ve used it in various programs, like my window manager, my status bars, some toy programs like “tuxeyes” (an Xeyes variant), or Advent of Code.
- The format does not include compression because it doesn’t need to. Just use something like bzip2 to get file sizes similar to PNG.
- It doesn’t cover every use case under the sun, but it does cover the most important ones (imho). They have discussed using something other than RGBA and decided it’s not worth the trouble.
- They refrained from adding extra baggage like metadata. It would have needlessly complicated things.
@movq@www.uninformativ.de Yeah that’s why I’m striking this conversation with you 😅 Not only do I respect your opinion quite highly 🤣 But like you say (and I’ve read their philipshpy) it can be a bit “elitism” for sure. I’m genuinely interested in what we think of as software that “doesn’t suck”. Tb be honest I haven’t really put thought to paper myself, but I reckon if I did, I’d have some opinions/ideas…
In all fairness, GOG says that Forsaken is only supported on Ubuntu 16.04 – not current Arch Linux. If you ask me, this just goes to show that Linux is not a good platform for proprietary binary software.
Is it free software, do you have the source code? Then you’re good to go, things can be patched/updated (that can still be a lot of work). But proprietary binary blobs? Very bad idea.
I was wondering: What the heck is the light on my boot!? Turns out between sock and shoe tongue was a firefly, unbelievable! ;-D I’ve no idea how that happened. After untying, it took me five attempts to finally get it off. How crazy!
Watching several hundred glowworms tonight did not get boring. It’s just so damn cool. :-)
@movq@www.uninformativ.de I also don’t think that I’m a particularly good speaker. :-) The workshop model is a good idea, I like that.
Yeah, it’s really good fun. I can highly recommend it. This is also a good way to train (new) developers to think like attackers, how to break in, destroy something or raise awareness of some classes of bugs. Then you can avoid them next time. It’s surprising to me what vulnerabilities come up during this event every time. So, absolutely worth it, win, win.
Okay, here’s a thing I like about Rust: Returning things as Option
and error handling. (Or the more complex Result
, but it’s easier to explain with Option
.)
fn mydiv(num: f64, denom: f64) -> Option<f64> {
// (Let’s ignore precision issues for a second.)
if denom == 0.0 {
return None;
} else {
return Some(num / denom);
}
}
fn main() {
// Explicit, verbose version:
let num: f64 = 123.0;
let denom: f64 = 456.0;
let wrapped_res = mydiv(num, denom);
if wrapped_res.is_some() {
println!("Unwrapped result: {}", wrapped_res.unwrap());
}
// Shorter version using "if let":
if let Some(res) = mydiv(123.0, 456.0) {
println!("Here’s a result: {}", res);
}
if let Some(res) = mydiv(123.0, 0.0) {
println!("Huh, we divided by zero? This never happens. {}", res);
}
}
You can’t divide by zero, so the function returns an “error” in that case. (Option
isn’t really used for errors, IIUC, but the basic idea is the same for Result
.)
Option
is an enum. It can have the value Some
or None
. In the case of Some
, you can attach additional data to the enum. In this case, we are attaching a floating point value.
The caller then has to decide: Is the value None
or Some
? Did the function succeed or not? If it is Some
, the caller can do .unwrap()
on this enum to get the inner value (the floating point value). If you do .unwrap()
on a None
value, the program will panic and die.
The if let
version using destructuring is much shorter and, once you got used to it, actually quite nice.
Now the trick is that you must somehow handle these two cases. You must either call something like .unwrap()
or do destructuring or something, otherwise you can’t access the attached value at all. As I understand it, it is impossible to just completely ignore error cases. And the compiler enforces it.
(In case of Result
, the compiler would warn you if you ignore the return value entirely. So something like doing write()
and then ignoring the return value would be caught as well.)
@kat@yarn.girlonthemoon.xyz I might give it a shot. 😃
Skimming through the manual: I had no idea that keeping the “up” cursor pressed actually slows you down at some point. 🤦
pledge()
and unveil()
syscalls:
@movq@www.uninformativ.de I like this idea 👌 Very neat!
@prologic@twtxt.net will do. No worries, not a show stopper. I will suggest that the muted numbered list not be sorted, but latest muted first. That way we have a better idea. Maybe adding timestamps to those too? Just a thought.
@movq@www.uninformativ.de you have no idea what a soul sucking, heartbreaking SOB 2025 turned out to be. I wish you the best of luck with whatever annoyances life might have thrown your way. Power to you, my friend.
@movq@www.uninformativ.de I’ve absolutely no idea how they’re poured in. I bet it must be some automatic thing. At least I cannot imagine that any sane person would ever add such junk to a list.
i saw folks in #lowendtalk are discussing about which password managers are worth using?. should have summary people’s opinion and my own into a blog post, had this idea for a while, the purpose is to tell my people how to be more secure & easier in life.
@sorenpeter@darch.dk Also not very readable. Quite cryptic really 😅 I have no idea how this works 🤦♂️
My vision with this newsletter is to have a slower medium for communicating about my art as well as ideas and projects I’m working on regarding how we can use digital technology to our own benefits instead of being exploited by big tech.
Twtxt not sloe enough for you? 🤣
@kat@yarn.girlonthemoon.xyz Ta! The dead end wasn’t all that bad in my opinion. Personally, I really do like dirt paths and exploring. It was all dried up, so no muddy mess we had to walk through. More like climbing over thick branches that have been worked into the ground by harvesters or forwarders in the muddy winter. Rough terrain. My mate, on the other hand – whose idea it was to check out the real summit in the first place ;-) — wasn’t all that pleased about the detour. Oh well. :-D
To follow up what I said minutes ago, they don’t even want you to think of the initial idea, they want you to be a mindless organism, the AI algorithm analyses and tells what you should make, down to the script, so that you get the highest number of people possible to click it and see some AI generated advertisement, blended seemly into what’s no lonher even your work.
https://arstechnica.com/gadgets/2025/05/netflix-will-show-generative-ai-ads-midway-through-streams-in-2026/
https://youtu.be/dGA6sVaGveU
sooo many ideas for my site now that it’s SSG powered, not enough energy….. i wanna make little content collections but no energy T__T also i only half know what content i wanna put in them lol!
@kat@yarn.girlonthemoon.xyz come on! Stop giving me ideas when I’m bored, specially when there’s a sewing machine in a room next to mine xD
Thanks to @kat@yarn.girlonthemoon.xyz and her shelf I finally spent several hours in the woodshop. I wanted to build two drawers for the workbench and thought that I will complete this project in no time. I’ve been so wrong again. ;-)
I didn’t draw any plans, just measured a few times and then went to cutting a bunch of particle board leftovers at the table saw. I routed rebates on the sides, fronts and backs to lap the boxes and sink in the bottom. It turned out that having no plans was a stupid idea. I cut exactly on the lines as I calculated and measured, however, the math in my head fell apart when it eventually met reality. The bottoms are too short, so I gotta glue on some strips. Also, with the longer fronts, the sides won’t work either, I have to fix them as well. :-D
Finally, the lid of my cyclone bucket broke when the negative pressure got too large. Oh well. It was just an old wood glue bucket, I’ve got another empty one, so I can use that lid but strengthen it first with some plywood. Something for future Lyse to deal with.
All in all, it was still good fun. Wood (haha) do it again, but at least with some sketches on paper. ;-)
@kat@yarn.girlonthemoon.xyz Any idea why?
@bender@twtxt.net I think this would be a good idea as @movq@www.uninformativ.de and @andros@twtxt.andros.dev have done ✅ I may even join the experiments if I have any spare time to hack a custom yrand
branch and run it up on say something like a yarnexp.mills.io
or something 🤔
@sorenpeter@darch.dk Yes, there are interesting things that can be incorporated to see how they work.
The issue of allowing the use of Z for UTC is interesting. I think I should add a brief explanation.
The url issue is for a debate :D . Maybe an issue could be opened. My opinion is that it is necessary to leave it as it is right now because otherwise the thread system, or replies, may have problems (404s). It’s all a matter of discussion.
I like your idea of contact. I will add it.
Thanks to you for your feedback!!!
@kat@yarn.girlonthemoon.xyz Off-topic areas are always a good idea. :-) Web forums often had those. And web forums are actually what I had in mind, @bender@twtxt.net. 😅 (While I do have a certain nostalgia for it now, Usenet has always been a bit weird to me. Can’t really explain why.)
So, the “AI” bots have reached my website. Looks like they’re just slowly crawling everything at the moment – no DDoS-like attack yet. I wonder if that has something to do with my website being 100% static HTML. There are no GET parameters they can tweak and, at the end of the day, there’s not that much data on my server anyway … And maybe they have no idea what stagit is, so it doesn’t trigger “standard behavior”, like “this is a Gitea instance, let’s crawl this like crazy!”?
@lyse@lyse.isobeef.org Kind of, but on the other hand: This twt right here refers to 3rvya6q
and your feed, but your feed certainly does not include that particular twt (it comes from my feed).
But my proposal probably isn’t very helpful, either. We have this flat conversation model, so … this twt right here, what should it refer to? Your twt? My root twt? I don’t know.
@prologic@twtxt.net Don’t include this just yet. I need to think about this some more (or drop the idea).
If we must stick to hashes for threading, can we maybe make it mandatory to always include a reference to the original twt URL when writing replies?
Instead of
(<a href="https://yarn.girlonthemoon.xyz/search?q=%23123467">#123467</a>) hello foo bar
you would have
(<a href="https://yarn.girlonthemoon.xyz/search?q=%23123467">#123467</a> http://foo.com/tw.txt) hello foo bar
or maybe even:
(<a href="https://yarn.girlonthemoon.xyz/search?q=%23123467">#123467</a> 2025-04-30T12:30:31Z http://foo.com/tw.txt) hello foo bar
This would greatly help in reconstructing broken threads, since hashes are obviously unfortunately one-way tickets. The URL/timestamp would not be used for threading, just for discovery of feeds that you don’t already follow.
I don’t insist on including the timestamp, but having some idea which feed we’re talking about would help a lot.
7
to 12
and use the first 12
characters of the base32 encoded blake2b hash. This will solve two problems, the fact that all hashes today either end in q
or a
(oops) 😅 And increasing the Twt Hash size will ensure that we never run into the chance of collision for ions to come. Chances of a 50% collision with 64 bits / 12 characters is roughly ~12.44B Twts. That ought to be enough! -- I also propose that we modify all our clients and make this change from the 1st July 2025, which will be Yarn.social's 5th birthday and 5 years since I started this whole project and endeavour! 😱 #Twtxt #Update
July 1st. 63 days from now to implement a backward-incompatible change, apparently not open to other ideas like replacing blake with SHA, or discussing implementation challenges for other languages and platforms.
Finally just closing #18, #19 and #20 without starting a proper discussion and ignoring a ‘micro consensus’ feels… not right.
I don’t know what to think rather than letting it rest (May will be busy here) and focus on other stuff in the future.
@movq@www.uninformativ.de Agreed, finding the right motivation can be tricky. You sometimes have to torture yourself in order to later then realize, yeah, that was actually totally worth it. It’s often hard.
I think if you find a project or goal in general that these kids want to achieve, that is the best and maybe only choice with a good chance of positive outcome. I don’t know, like building a price scraper, a weather station or whatever. Yeah, these are already too advanced if they never programmed, but you get the idea. If they have something they want to build for themselves for their private life, that can be a great motivator I’ve experienced. Or you could assign ‘em the task to build their own twtxt client if they don’t have any own suitable ideas. :-)
Showing them that you do a lot of your daily work in the shell can maybe also help to get them interested in text-based boring stuff. Or at least break the ice. Lead by example. The more I think about it, the more I believe this to be very important. That’s how I still learn and improve from my favorite workmate today in general. Which I’m very thankful of.
We’re all old farts. When we started, there weren’t a lot of options. But today? I’d be completely overwhelmed, I think.
Hence, I’d recommend to start programming with a console program. As for the language, not sure. But Python is probably a good choice
That’s what I usually do (when we have young people at work who never really programmed before), but it doesn’t really “hit” them. They’ve seen so much, crazy graphics, web pages, it’s all fancy. Just some text output is utterly boring these days. ☹️ And that’s my problem: I have no idea how I could possibly spark some interest in things like pointers or something “low-level” like that. And I truly believe that you need to understand things like pointers in order to program, in general.
@movq@www.uninformativ.de I started with Delphi in school, the book (that we never ever used even once and I also never looked at) taught Pascal. The UI part felt easy at first but prevented me from understanding fundamental stuff like procedures or functions or even begin
and end
blocks for if
s or loops. For example I always thought that I needed to have a button somewhere, even if hidden. That gave me a handler procedure where I could put code and somehow call it. Two or three years later, a new mate from the parallel class finally told me that this wasn’t necessary and how to do thing better.
You know all too well that back in the day there was not a whole lot of information out there. And the bits that did exist were well hidden. At least from me. Eventually discovering planet-quellcodes.de (I don’t remember if that was the original forum or if that got split off from some other board) via my best schoolmate was like finding the Amber Room. Yeah, reading the ITG book would have been a very good idea for sure. :-)
In hindsight, a console program without the UI overhead might have been better. At least for the very start. Much less things to worry about or get lost.
Hence, I’d recommend to start programming with a console program. As for the language, not sure. But Python is probably a good choice, it doesn’t require a lot of surrounding boilerplate like, say Java or Go. It also does exceptionally well in the principle of least surprise.
I have a great idea for fixing the US economy. Get rid of all the nuclear weapons 🤣
@quark@ferengi.one I do have an idea for syncing this 🤞
These ideas are dr the two books:
- Drift into Failure: From Hunting Broken Components to Understanding Complex Systems by Sidney Dekker (2011)
- Engineering a Safer World by Nancy Leveson (2011)
The former I haven’t read. The later I haven’t finished reading 😅
And the idea of asynchronous evolutions comes from system accidents where control failures emerge when system structure, constraints, and evolution are poorly managed.
The idea of drift into failure is small normal adaptations erode safety over time without people noticing.
@prologic@twtxt.net I don’t understand the diagram, nor have any idea of what’s about. 👌🏻
Oddly, in defense of Google keeping Chrome
As much as I’m a fan of breaking up Google, I’m not entirely sure carving Chrome out of Google without a further plan for what happens to the browser is a great idea. I mean, Google is bad, but but things could be so, so much worse. OpenAI would be interested in buying Google’s Chrome if antitrust enforcers are successful in forcing the Alphabet unit to sell the popular web browser as part of a bid to restore competition in search, an OpenAI execu … ⌘ Read more
trying to not feel stressed today, so I digitally colored a smol frog that says fuck terfs! >m< i have no idea if I did that right bc it’s my first time using yarn to post an image so rip to me if I messed that up :’D
@andros@twtxt.andros.dev Haha 🤣 We’ve explored this idea in the past and we decided that it’s actually a good idea to have an “append-only” feed for various reasons. We’ve also explored the idea of using Range
requests, but opted instead to just archive/rotate our feeds periodically 😅 There really isn’t much point in having a feed in reverse chronological order, except (maybe?) so a human read view the new twts at the top of the file?! 🤣
dm-only.txt
feeds. 😂
After reading you, @eapl.me@eapl.me, I’ll tell you my point of view.
In my opinion, a feed does not have to be equivalent to a timeline. A timeline is a representation of the feed adapted to a user. You may not be interested in seeing other people’s threads or DMs. But perhaps they are interested in seeing mentions or DMs directed at them. It is important not to fall into the trap. With that clarification…
I insist, this is my point of view, it is not an absolute truth: I don’t think extensions should be respectful of customers who are no longer maintained.
We cannot have a system that is simple, backwards compatible and extensible all at the same time. We have to give up some of the 3 points. I would not like to give up simplicity because it will then make it harder to maintain the customers who do stay. Therefore, I think it is better to give up backwards compatibility and play with new formulas in the extensions. I don’t think it’s a good idea to make a hash keep so much load: a hashtag, a thread and also a DM.
💡 I had this crazy idea (or is it?) last night while thinking about Twtxt and Yarn.social 😅 There are two things I think that could be really useful additions to the yarnd
UI/UX experience (for those that use it) and as “client” features (not spec changes). The two ideas are quite simple:
- Voting – a way to cast, collect a vote on a decision, topic or opinion.
- RSVP – a way to “rsvp” to a virtual (pr physical) event.
Both would use “plain text” on top of the way we already use Twtxt today and clients would render an appropriate UI/UX.
@bender@twtxt.net I noticed that although the Discover view (and your own Timeline) is much improved with a MaxAgeDays
configuration at the pod level, that now some profiles are rather empty. This is only because well, they’re a bit “inactive” so to speak 🗣️ Not sure what to do about this at the moment… Open to ideas? 💡
@prologic@twtxt.net Since you have to check and double check everything it spits out (without providing sources), I don’t find any of this helpful. It’s like someone’s in the room with you and that person is saying random stuff that might or might not be correct. At best, it might spark some new idea in your head and then you follow that idea the traditional way.
Information published on the internet (or anywhere, for that matter) was never guaranteed to be correct. But at least you had a “frame of reference”: “Ah, I read this information about Linux on a blog that usually posts about Windows, so this one single Linux post might not necessarily be correct.” That is completely lost with LLMs. It’s literally all mushed together. 🤷
@kat@yarn.girlonthemoon.xyz I skimmed through the gamja docs and they say you need an “IRC WebSocket server” – no idea what that is. Does gamja not speak IRC directly but essentially “IRC over HTTP”? Curious. 🤔
How to think in the age of #AI : https://www.newstatesman.com/ideas/2025/04/how-to-think-in-the-age-of-ai
so i had the idea of adding a page to my otherwise single page girl on the moon personal site that featured my more notable projects, but it’s been hours and i CAN’T THINK OF ANYTHING TO ADD THAT I HAVEN’T ALREADY MENTIONED. i just host other people’s stuff!!!