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.
Deleted some old no longer used pixelart from my galley and added this as an alternative version, of the sprite one.

@movq@www.uninformativ.de Oh, thatās actually quite a bit. I didnāt expect that. You definitely have useful things. :-)
Exactly, I now also send links to my fork. :-D
jenny stuff aside, I received zero bug reports or code contributions since leaving GitHub in 2018.
How many tickets and merge requests did you get before moving to your own server?
Hm, these were probably some of the more active projects:
- https://github.com/vain/lariza/issues?q=is%3Aissue%20state%3Aclosed
- https://github.com/vain/pdfPres/issues?q=is%3Aissue%20state%3Aclosed
- https://github.com/vain/xiate/issues?q=is%3Aissue%20state%3Aclosed
So itās not a ton of stuff and there are many āissuesā I opened myself, but itās certainly more than these days.
Havenāt used
git send-emaileven once. I definitely have to look into that soon. Wanted to do that for several years. I typically upload the patch to my server and send a link via IRC.
git send-email is good for sending patches to a mailing list (because then the individual patches can be discussed easily), but since those are dying out as well, it loses its appeal. If you want to send patches to a single person, just sending the link to your repo is far easier. š¤
jenny stuff aside, I received zero bug reports or code contributions since leaving GitHub in 2018.
@movq@www.uninformativ.de Finally, your software is just perfect and finished by now, no need to report non-existing bugs or send in code changes. :-) How many tickets and merge requests did you get before moving to your own server?
I have to admit that I use git format-patch so rarely, I always have to pull it up from my shell history. Havenāt used git send-email even once. I definitely have to look into that soon. Wanted to do that for several years. I typically upload the patch to my server and send a link via IRC.
Maybe I was just very unlucky, but my experience is that you can perfectly ignore people and their work who only do it for the āfameā. Itās almost always been from inferior quality to say the least.
@movq@www.uninformativ.de If only somebody had warned us! Luckily, no TV in this household. :-)
@prologic@twtxt.net 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.
I thought I had made that super easy, because you can just send me an email ā no sign-up process, nothing. But thatās way too old-school, people donāt know how to use git format-patch (let alone git send-email) and they also donāt understand that they can just send me a link to their forked Git repo (which can be hosted anywhere). Git is super flexible and powerful, but those features are hardly ever used.
Maybe people even need some kind ārewardā, or āfameā. Like those āachievementsā that you can unlock on GitHub. (Something to put in their CV ⦠?)
Are you aware of the Residential Proxy pest?
https://spur.us/blog/smart-tv-apps-residential-proxy-sdks
This explains the access patterns that I see in my logs.
Itās funny, because I used to warn years ago that this might happen, and then I lost track of this topic. Now here we are and itās a real issue. š¤¦āāļø
@lyse@lyse.isobeef.org A small portion of people might do the headphone thing because of autism or sensory issues, to isolate them from annoying noises. I used to do that myself. š¤
(1) Why The Oceanās Top Predator Refuses to Hunt Us - YouTube ā The first half of this documentary is amazing! š® ā The remaining half however is sad and depressing, making me never want to visit another zoo again š¢
Hurray! Finally, the thunderstorm is right over us. The last days we always got skipped. The rain smells so great. :-)
We strolled up our backyard mountain. Visibility wasnāt the best, despite the rain we got yesterday. Oh well, scenery was really beautiful, though.
I found it super funny that we almost overtook a jogger before she turned off to another path right in front of us (yeah, weāve got a smart pace, but this girl was slow as a snail).
š£ ACTION REQUIRED: Hey folks š For those of you whom are using the Twtxt App either via the Hosted option or on your own twtd instnace or via Github/Gitea or any other publishing backend (doesnāt amtter). Please read.
Please open the app and you should be prompted to save your recovery code for your device. This basically is all of your settings, follows, etc in the app itself. This is synced to the Origin everytime you make a change, and also stored on-device. This is what makes it possible to sync your setting across services, move to another device, etc.
Please save a copy of the recovery code somewhere. This is only your only way to recover your settings.
Thank you š
@balloon-fu-sen@tw.fus.f5.si Huh? š§ This hasnāt changed. What has is the default proxy used depending on your publishing backend.
there us a recovery path
@david@daiwei.me Ha, I just noticed that I changed Newsboatās defaults. Right from the factory, new items are just bold, while read ones arenāt. No different colors, white on black. Focused items are bold yellow on blue. No matter the read status. I think thatās why I started to play with the config to differentiate them. Itās been so long ago that I didnāt know anymore I even messed with that.
And yes, youāre right, the red on black is borderline readable. Also, my white on green focus is rather silly. But Iām sooo used to it, I donāt realize how bad the contrast is. To be fair, I donāt spend a lot of time in the lists. Aha, there are new articles, Enter to hit the artice view, read it, press n to immediately jump to the next unread article, rince and repeat, finally Iām back in the article list view.
Default theme, read focused:
Default theme, unread focused:
Lyseās schlimmbesserung, read focused:
Lyseās schlimmbesserung, unread focused:
@GabesArcade@gabesarcade.com I may be blocking that provider due to abuse from bots using VPN(s) ā What was your last IP?
@david@daiwei.me I had to look these up, horror isnāt my genre at all. :-D No idea what the cool kids use today, but I still have zsh as my interactive shell. For shell scripts, though, I try to stick to POSIX and only resort to bash if really needed or it would be too cumbersome.
@david@daiwei.me Not sure if you only mean the code segments or in general. In theory, a general darker text color for read messages would probably work. The thing is that regular white on black is quite standard. In Newsboat, new articles are red (I opted for yellow here) and read ones white. I found that useful and kinda copied it for tt.
@prologic@twtxt.net @movq@www.uninformativ.de Same with tt, hash v2 has to be used right from the epoch onward. (And now replying to a message with a timestamp before the epoch still results in a v1 hash.)
@prologic@twtxt.net No. After the cutoff-date, hashes are expected to be v2. End of story.
(In jenny, a twt can only ever have one thing that can be used for threading.)
@dce@hashnix.club So let me get this straight⦠You want to store your feed on a Codeberg repo right? But you want to clone that repo down somewhere else to serve it on a different location. Right? And youād like to use the Twtxt App (https://twtxt.app) to front all of this? Right?
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!
@david@daiwei.me Yes, but then I have to create and maintain an account Iāll never use š¤£
@dce@hashnix.club which version of Twet are you using? I might see if I can get it updated for you.
@movq@www.uninformativ.de The nice thing about properties is that you can compute and cache things on the fly at first attempt and also ensure validation for writing. But like you said, since itās not obvious that reading or writing might do some more things, itās strongly advised to avoid doing expensive stuff disguised as properties.
I reckon the vast majority of property use cases is to provide read-only access. At least that was my impression when I was doing a lot more in Python.
Personally, I think that this just reads a lot nicer:
oink.my_property
oink.my_property = 42
Than:
oink.get_my_property()
oink.set_my_property(42)
Btw, any field access is implemented using method calls. I might be wrong, but I believe thereās always __getattr__ and __setattr__ involved. 8-)
I trip over this in our code at work all the time.
Python has this concept of āpropertiesā:
class Oink:
def __init__(self):
self._foo = 3
@property
def my_property(self):
return self._foo
a = Oink()
print(a.my_property)
my_property() is a method but it can be used as if it were a field.
This can also be used to define a setter:
class Oink:
def __init__(self):
self._foo = 3
@property
def my_property(self):
return self._foo
@my_property.setter
def my_property(self, value):
self._foo = 123 * value
Because, for some reason, Python people donāt like getters and setters. Instead, they hide it behind a property.
The result is, when you read this:
a.my_property = 5
print(a.my_property)
You have no idea that this actually calls a method.
@movq@www.uninformativ.de My grief with Java is that itās sooo verbose. Sure, all the enterprise garbage makes it a hell lot more terrible, but even regular Java feels always so lengthy. And back in the days when I was using it daily, I missed so many convenient things in the stdlib after having experienced Pythonās ābatteries includedā. Not sure if or how recent Java versions caught up.
tt has a "draft" mode right? You didn't publish, then edit over and over did you? š
@prologic@twtxt.net Not sure if this really counts as a draft mode or this is what you had in mind. I just was in the editor for ages and didnāt close it. tt provides an integrated preview for the rendered message in there. It automatically updates every second.
Hereās a screenshot of the compose view with the conversation context on the top to which to reply to, the editor in the middle and the almost-live preview at the bottom, I hope itās big enough:
But itās not like I hit the āAdd messageā button in the compose view (the one currently selected on the screenshot), see the message in the conversation tree and then come back into the compose view to continue editing. Thereās no edit functionality in tt. Once the message is appended to my twtxt.txt file on disk, all I can do is edit it with vim. The U+2028 line breaks are really annoying to deal with (Iām sure I could do something about that if I spent the time), so I try to avoid that at all costs.
Once new messages have been added to my local file, I then manually upload the file to my server in a separate terminal. Thereās no upload command integrated into tt. Right from my very first message in the beginning, Iāve always done it exactly like that. Iām used to this and it really doesnāt bother me. But I can see that others might not be fans of that at all. I might add an upload mechanism to tt at some point in the future.
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.
@david@daiwei.me Thatās a good thing. I still use it heavily, but I also realize that it is addictive. This whole idea of getting likes and boosts is horrible. Seeing ānumber goes upā is inherently addictive design, if you ask me. This should never have been added to a Free Platform like Mastodon, and Iām glad that twtxt doesnāt have anything like it.
also, just to clarify, we built the hosted Service as the last lowest rung ladder for non-technical people. I fully expect most technical people will spin up their own publishing backend or use Github or similar so that long-term the ecosystem still remains very much decentralized.
@david@daiwei.me You mean, you mean⦠like mowing down a whole rain forest in a thunderstormās brutal heat? :-?
Show us todayās rain. :-)
@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 š¤
@prologic@twtxt.net You also have to tell us the username!
Hurray, I can now press gg instead of g to go to the top in tt. Much better! :-) Other multi-key combinations are also easily possible now.
I should probably write a real article about this at some point, but here we go. The only downside with my new key binding system is that it breaks tviewās established pattern. Youāve got an InputHandler(), that is implemented using WrapInputHandler(ā¦). It typically then directly implements the switching logic depending on the key press. Something like this:
func (w *Widget) InputHandler() func(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
// WrapInputHandler allows for intercepting key events with SetInputCapture(ā¦)
// from the outside for customization. This handles the default key bindings.
return t.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
switch event.Key() {
case tcell.KeyRune:
if event.Modifiers() == tcell.ModNone {
switch event.Rune() {
case 'k':
w.scrollUp()
return // we already handled the event, stop processing
case 'j':
w.scrollDown()
return
}
}
}
// We didn't handle the key event. Maybe the parent
// widget knows what to do with it.
if handler := w.parent.InputHandler(); handler != nil {
handler(event, setFocus)
}
})
}
From the outside, you can intercept and either stop or continue the widgetās original key handling with a potentially rewritten key event using SetInputCapture(ā¦):
w := NewWidget()
// customized or additional key bindings
w.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
switch event.Key() {
case tcell.KeyUp:
// Rewrite the event, so the "cursor up" key is an alias
// for the vim key binding "k", that is handled by the
// wrapped input handler above. (I know, I know, this is a
// completely unrealistic example, why would anyone use
// cursor keys when there are vim key bindings available?!)
return tcell.NewEventKey(tcell.KeyRune, 'k', tcell.ModNone)
case tcell.KeyRune:
if event.Modifiers() == tcell.ModNone {
switch event.Rune() {
case 'q':
app.Stop()
// we already handled the event, do not pass it
// to the wrapped input handler above
return nil
case 'r':
toggleMessageReadStatus()
return nil
}
}
}
// we didn't handle the event, pass it to the wrapped
// input handler above
return event
}
Since they all expect a single key, Iāve noticed that using multiple dedicated KeyBindings of mine on these different levels kinda breaks multi-key handling with common prefixes. The outer-most KeyBinding captures the prefix, but it canāt transfer it to the inner one if not handled by the outer one. At least not without some more (potentially ugly) changes. So, I now have to work with just a single KeyBindings object for the entire widget chain (if it consists of multiple other widgets or the regular input handler and input capture are in the game). The outside needs to register all its key bind customizations or extensions at the same level that the original widget handles its default ones. Doable by exposing the widgetās KeyBindings instance, but not pretty. You always have to keep this in mind.
With the KeyBindings, it will look like that:
type Widget struct {
parent tview.Primitive
// make it available to children or the outside either by
// direct field access or by providing a getter method
KeyBindings *bind.KeyBindings
}
func NewWidget() *Widget {
w := &Widget{KeyBindings: &bind.KeyBindings{}}
w.KeyBindings. // default key bindings
Bind0(bind.KeySequence('k', w.scrollUp).
Bind0(bind.KeySequence('j', w.scrollDown)
return w
}
func (w *Widget) InputHandler() InputHandler() func(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
return t.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
// also note the missing support for focus transfer at the moment
event = w.KeyBindings.Capture(event)
if event == nil {
return
}
if handler := w.parent.InputHandler(); handler != nil {
handler(event, setFocus)
}
}
}
And then from the outside, or in a child widget:
w := NewWidget()
w.KeyBindings. // additional or customized key bindings
Bind1(bind.KeySequence(tcell.KeyUp), func(*tcell.EventKey) *tcell.EventKey {
return tcell.NewEventKey(tcell.KeyRune, 'k', tcell.ModNone)
}).
Bind0(bind.KeySequence('q'), app.Stop).
Bind0(bind.KeySequence('r'), toggleMessageReadStatus)
When directly working with tview primitives that are not part of custom widget implementations, the following works well so far:
textView := tview.NewTextView().
SetWordWrap(true).
SetText("ā¦")
SetScrollable(true)
textView.SetInputCapture((&bind.KeyBindings{}).
Bind0(bind.KeySequence('q'), app.Stop).
Bind1(bind.KeySequence('g', 'g'), func(*tcell.EventKey) *tcell.EventKey {
return tcell.NewEventKey(tcell.KeyHome, 0, tcell.ModNone)
}).
Capture)
I need to sleep on this some more.
Also, writing very long messages like this one is really not all that fun in ttās editor. I should absolutely provide a way to shell out to vim.
(Took me about one and a half hours to compose, holy crap. But not only because of not using vim. Although, that might have saved me a quarter hour or so for sure. Proof-reading this message also uncovered quite a few bugs in my real documentation. So, thatās a big win!) Good night!
@david@daiwei.me The one with www is correct: https://www.uninformativ.de/twtxt.txt is the canonical URL used in the url = metadata field. (For historical reasons, it also works without www and even with http.)
+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.ā
@balloonfu-sen@yarn.girlonthemoon.xyz I could in toehry publish a specification for what twtd implements, which forms the basis of the API between twtxt.app <-> twtd, if you wanted to write your own twtd / twtxt.app compatible publishing backend (assuming you didnāt want to use Github/Gitea, etc).
@balloonfu-sen@yarn.girlonthemoon.xyz Unfortunately I tried to support SFTP but ripped this out as Browsers (which the Swag framework uses under the hood as a framework to build PWA(s)) doesnāt support raw TCP connections. So FTP / SFTP is not possible without hacks like a proxy. Which I donāt really want to support. So only things that have some kind of HTTP API are possible viable publihsing backends right now. That is Github/Gitea, twtd, Yarn, etc.
š definitely using the Twtxt App as my daily-driver now for Twtxt/Yarn. Not using twtd however, as I just pair the app with my already existing yarnd powered profile on twtxt.net
So⦠Quick count. Hands up those who are using the Twtxt App? š¤ ā And whoās also pairing this with the twtd publishing backend?
Well, after all these tests, I canāt reproduce. I have used exclusively the desktop to conduct these tests.
@david@daiwei.me Ta, I continued my fun with studying the tcell and cbind code bases for key bindings. My plan is to eventually not only support custom key bindings in the tt configuration file, but also to enable multi-key sequences, such as gg to jump to the top of a list/tree. Or use other vim-like navigation movements like 7j or 25gg etc.
And it turns out there are only a hand full oft tcell/cbind version combinations that work together. Only if all stars align, thereās chance of success. I will probably end up pulling cbind in to simplify my life. There are situations where tcell.EventKeyās triple of key, modifiers and rune are not all that intuitive to me. Letās see.
@prologic@twtxt.net Well, 15 shows the site. On the left, I had a roll mat on a tarp. I borrowed some āNVA tarpsā from the scouts for this trip. The scouts got them from the National Peopleās Army, the German Democratic Republicās armed forces after Germany was reunited. Theyāre 1.75m x 1.75m in size and weigh 1.3kg, quite heavy, but super awesome. One tarp on the bottom, another one to cover up the clothes, shoes and sleeping bag in order to protect against the thaw. Finally, a mosquito net over all that, hung from a rope between two trees.
My mate just used a hammock with a mozzie net on the right hand side. The third tarp served as the luxurious bedside carpet. :-)
We sat on my second tarp to chill and enjoy the sunset and surroundings. It was nice to notice birds etc. die down. It took a really long time for the last light to fade away. Since we have a very high risk of forest fires, we of course couldnāt have a camp fire. But after all the exhaustion, I didnāt even miss it for one second.
Since we had dinner at home before leaving, all we brought were two lye rolls, two grain rolls, two brezels, some sausage and chocolate biscuits for breakfast. From the 2.5l of water, I ended up using 2l. Itās always good to have a little extra, despite the unnecessary weight. We had brekkie a few kilometers further on a bench in the shade. The first bench was already in direct sun.
Our camp site was maybe 30m to the side and a few meters down of a summit path hidden behind some trees and bushes. We were quite lucky, the other side of the hill got quite a bit of a breeze at night. We could hear the leaved treetops making much more noise behind us.
@movq@www.uninformativ.de Yes, these kind of dogs should really be strictly forbidden!
Itās not illegal if you own the forest or ask the owner. :-)
@david@daiwei.me Yeah, no clue. But my mate said the dog is disqualified from such adventures in the future. :-)
The temps were supposed to hit 14°C just before sunrise. Since we didnāt bring a thermometer, I canāt tell for sure. I was rather hot in my sleeping bag, so I had to pull out my arms every now and then. My mateās sleeping bag was a little lighter and, unfortunately, the zipper jammed up. Since it didnāt close all the way, it felt quite a bit cold I was told in the morning. When we got up at 6ish (we said, we donāt care about time at all), it was probably already 16°C if not more. I brought a jumper, but a t-shirt was already nice enough to wear. The jumper just served as my pillow. The mercury raised by the minute then.
Yeah, I circled the spot with a biro to keep an eye on it. Until now, thereās absolutely nothing to see. Looks like I got lucky.
(Guess I should have used my āfind contextā function. š¤Ŗ)
We slept in the forest. It was really great except of my mateās fucking terror dog who was barking and snarling the entire night to each and every sound. I had maybe half an hour of sleep in total. Despite that, it was pleasantly warm. Well, the night, that is. The heat was brutal during the days. Literally streams of sweat were running down on us on the way there in the evening and back in the morning.
Surprisingly, there werenāt any mozzies around at night, I would have lost all safe bets. On the way there, my mate convinced me to take a shortcut through the taller and taller growing grass. Itās been some time that somebody traveled on this track, so we had to search around a bit for the overgrown path where we could cross the mostly dried up creek. In the beginning I said that this will be a bad idea. Lo and behold, I discovered a tick on my inner upper leg the next morning. Luckily, I got it out with my tick hook on the first attempt.
Iām starting to use the twtxt.app as my daily driver now as opposed to yarnd and my pod twtxt.met š„³
Fixed the broken hashes in the Twtxt App (https://twtxt.app) š„³ It was hashing your twts with a client-side timestamp the server never used š¤¦āāļø Now it keeps the canonical created/hash the pod (or twtd) returns, and the GitHub/Gitea backends write a # url = preamble so every client hashes your feed the same way. Thanks @fastidious@tilde.town for the report š
@marcorocco@roccodrom.de thatās interesting. Not the act itself, nor that you did it for your wife (it is the least you could do, right?). I find it interesting because in the US you canāt find bicycles with inner tubes. The tyre is it, nothing else. Yep, just the tyre.
Heh, thatās a cute story: https://www.osnews.com/story/145459/you-paid-me-a-long-time-linux-user-to-use-windows-11-exclusively-for-a-month-heres-how-it-went/
@aelaraji@aelaraji.com do not use twtxt.app yet. It has issues that @prologic@twtxt.net will fix soon.
@movq@www.uninformativ.de LOL. I canāt imagine a workplace using Matrix. It simply⦠boggles my mind.
XMPP greatest peak was when Google Talk was around. Being able to chat with thousands, if not millions, of Google users at that time, using your own domain, and your own XMPP server was amazing. Then Google, in all its wisdom, and as it does very often, decided to kill it.
I might be on the minority, but can care less about video calls. Heck, even calls! Text is King. š¤Ŗ
@movq@www.uninformativ.de I donāt. but i do use IRC so hmmm š§
@aelaraji@aelaraji.com At work we used to have XMPP/Jabber Chat-Clients but now they are obsolete, due to the introduction of Matrix.
@lyse@lyse.isobeef.org How many people are still using XMPP? š¤ Iād expect the number to just as low as IRC users? š¤
@lyse@lyse.isobeef.org simplified it a little bit. Using only *bot* will bring collateral damage I want to avoid (there are, still some āgoodā bots):
@aibots {
header_regexp User-Agent (?i)(GPTBot|ChatGPT|OAI-Search|anthropic|Claude|Google-Extended|FacebookBot|CCBot|Perplexity|Applebot-Extended|cohere|Omgili|Bytespider)
}
abort @aibots
@anth@a.9srv.net that page is absolutely unreadable on mobile, very close to the same on desktop. Had to use Safariās reader mode to see it, and then⦠meh. Closed tab. š
@david@daiwei.me Some entries can be probably simplified with just *bot*. :-) (But I donāt use Caddy, so no idea about case (in)sensitivity.
That reminds me, I should do something similar with my Nginx.
@aelaraji@aelaraji.com I do use XMPP. But only the text chat part. ;-)
Anyone using XMPP? Iāve been hearing a lot about how it is the OG messaging protocol. That G00gle Talk used to use it as a back-end, that FB messanger and w_hatsapp use some modified version of it or something; And that setting up a server (or even using a public one) would be a better alternative to the aforementioned apps, so I did. Now the question is: āWhere the Fu__ are my video calls at!!? š¤£ā ⦠The protocol supports videoconferencing and Iām yet to find a decent Desktop/Mobile client that implements it. I wish I knew enough Code-Fu to contribute/help implement some, somewhere.
Windows NT 4 didnāt have a Device Manager. You know, this thing right here that got introduced with Windows 95:
And thatās super awkward in NT4.
You know what doesnāt have a Device Manager, either? Linux. Why? š¤ Isnāt this one of the most useful system tools? It gives you an overview of the devices in your system and tells you which driver is used for them. Linux could really use such a tool, I think? š¤
(There are programs like āhardinfoā and I remember ancient KDE providing such a tool, but theyāre all an afterthought. Hardly integrated into the overall system.)
@GabesArcade@gabesarcade.com The no-JS part is one thing, but you also have to disable the (nowadays common) forced-HTTP-to-HTTPS-redirect, because those old browsers canāt do modern crypto. And make sure that your webserver serves the correct page even if no Host header is sent by the client. And donāt even think about serving UTF-8 or even just putting utf-8 in the content type. š
And for the JPEG thumbnails I pass a special flag to ImageMagick so that IBM Web Explorer from OS/2 wonāt trip. 𤣠And always use link rel="stylesheet" for CSS, because some browsers render inlined CSS as literal text. And ⦠probably more that I forgot by now. š
@david@daiwei.me Not sure, actually. Letās see. Those are the ones where I still have the original disks (or have bought them on eBay again):
- SuSE Linux 6.4 (itās a massive 7 CD distro with a huge manual, best thing ever)
- OS/2 2.1
- OS/2 Warp 3 (red and blue spine because
$reasons)
- OS/2 Warp 4
- PC DOS 7
- MS-DOS 6.22
- Windows 3.1
- Windows for Workgroups 3.11
- Windows 95 C
- Windows 98
- Windows NT 4 Workstation (still in the mail, though š
)
- Windows 2000
- Windows XP Professional (last Windows I ever used on my private PCs)
(Plus a few āclassicā office products as can be seen here: https://movq.de/blog/postings/2024-05-23/0/POSTING-en.html )
Okay, wow. Windows NT 4 wasnāt part of my timeline back then, so this is the first time Iām seeing it in action. And this thing came with IE 2, which Iāve also never seen before. (Thatās interesting, because I remember using IE even on Win 3.x, but apparently that was already IE 3?)
It also makes me really happy to see my website work in these old browsers. Fullscreen images are ābrokenā because those are PNG or WebP, but the rest works just fine. š„³
Tell us moreā¦ šæš„¤š¤
Congratulations! I am using twtxt.app, and it rocks!
lleeypvkzbw2? That Twt was never ingested by twtxt.net (and likely the search engine) so umm hmmm threading breaks š¤£
Oh if weāre talking about the twtxt.app client, thatās a different story. I still consider that alpha/beta quality. Lemme look into that. It has itās own cache of course (using IndexDB) and itās entirely possible some behaviours are still not quite right yetā¦
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? š
Set/GetDisabled(ā¦) and PasteHandler(), tt starts up fine and seems to work without issues.
After updating to tview 0.42.0, I also sadly noticed, that the tview.Modal now clears the background and doesnāt simply draw over the already present widget. So, I decided to write my own Dialog widget. This endeavor lead me down the path to actually bring back a custom Button implementation, too. When the button is focused, it surrounds the button text with [ and ]. When not in focus, the brackets are removed. Much better than before (https://twtxt.net/conv/qx3vz4a):
I also use the same buttons in the compose view, too.
@GabesArcade@gabesarcade.comās Arcade@gabesarcade.com You will want to either build a client or use one of the ones listed here ā Either way you choose! š I just noticed as well in this Twt Iām replying to (threading is a thingā¢) that you @-mentioned@twtxt.net @bender@twtxt.net incorrectly š
@kiwu@twtxt.net jump on IRC and tell us! Server irc.mills.io, on 6697 (TLS), join #lobby, then private message (I am quark). :-P
My mate and I hiked up the backyard mountain. We got 25°C and quite some wind, so it was actually not too terrible. The wind could have blown harder or the temps a little lower, but oh well.
I saw the squirrelās bushy tail stick up on the forest floor in the sunlight and immediately thought of this cute little feller. Since it didnāt move at all, even when we came closer, I got irritated and reconsidered that it might actually be some kind of dried up farn. But then we also were able to see its body. Unfortunately, the squirrel ran up the tree too quickly, so all the shots are kinda crap.
At one flower spot, there were sooo many butterflies, wasps, flies, bugs and other insects. The botanic was completely crowded.
The workers were transferring logs from one log truck to the other in a parking lot. Iāve never seen this happening before. When we passed the same place on the way home, they had moved logs into a sea container. That was surprising. This semi wasnāt there on the way there. One log was probably too long and sticking out the container, so they probably had to wait for somebody to return with a chainsaw. Crazy that theyāre shipping logs from here probably overseas. Why else would they put them in a sea container?
After our first break, a blackbird was really posing for us with his worm in the dark shade.
Today was my first time I ever saw a hummingbird hawk-moth (TaubenschwƤnzchen) for real. My mate photographed them many, many times before, but I never came across one myself. So, that was really special.
The forest service installed an outdoor table with two benches next to the timber lion, that was cool to see. We sat down for a few minutes and enjoyed both the view into the Fils valley and ant on the tabletop, but the sun was beating down too heavily on us, so we had to move on.
All in all, it was a very nice few hours long hike. Enjoy! https://lyse.isobeef.org/waldspaziergang-2026-07-03/
@movq@www.uninformativ.de Yeah. The thunderstorm was supposed to hit us, sneak north and south around us, directly pay us a vistit again, miss us to the north, directly hit us, and now itās back to a northern diversion. The thunder heavily roars in the distance at the moment. Itās down to just 10 liters. A mate just got a wet laundry, though, and had to mob up a ā luckily ā just tiny flood.
As I type, the first drops begin to fall.
box (command-line container runtime). It works great š
@prologic@twtxt.net (I havenāt checked out CEF recently. Back then (over 10 years ago), just using a GTK widget was certainly much easier than CEF. š )
box (command-line container runtime). It works great š
@prologic@twtxt.net Ah, the joy of making your own browser ā welcome to the club. š (I chose WebKitGTK back then and that was not super compatible with websites ⦠CEF would have been better, but also harder to use.)
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 I see. I just use CDATA (and still have the XHTML trailing slash for <img ⦠/>). But of course, it also has its drawbacks: https://waspdev.com/articles/2026-05-11/avoid-using-cdata-in-rss I might just move away from it.
Everything is a web service these days. :-/
Okay, Iām using the āofficialā validator now:
https://github.com/w3c/feedvalidator
That repo is supposed to be a website/webservice, though. The feedvalidator directory contains the actual validator. Iām using this wrapper on top: https://movq.de/v/94b5b8978c/
@lyse@lyse.isobeef.org Putting HTML into the feed. It should be XHTML. 𤪠(I used <img ...> instead of <img .../>.)
@movq@www.uninformativ.de Yes, thatās what I was thinking, too. For a moment, I wanted to suggest to use <ol> instead of <ul> to fix that. However, thatās only gonna work for the first level, but subsections then miss their parent level.
And it turns out that I was wrong. At least sort of. There are some CSS tricks to fix it: https://stackoverflow.com/a/26243681 Of course, with text or retro browsers, this is not gonna fly.
I also came across this interesting article. I just skimmed it and itās about real tables of contents with page numbers, so not what you have in mind, but cool nevertheless: https://css-tricks.com/a-perfect-table-of-contents-with-html-css/
I complain about this a lot:
https://movq.de/v/e7cb49eefb/hiccupfx
But to be honest, my blog did the same thing ā to some degree.
This is fixed now. The trick is to add width and height to all <img> tags. That way, modern browsers know how much space to reserve for the image. Without this, they just reserve zero space, so when the image finally loads, you get jumpy layout.
This effect is even worse when you use <img loading="lazy"> ā which I can finally use, now that the jumpy layout has been fixed. š„³
@movq@www.uninformativ.de I reckon section numbers are not really needed for articles. But if you number them, the anchors should probably not contain the section number, just the title. Especially for articles that may receive updates.
Itās probably another story for specifications. Theyāre kinda fixed and thus I found it useful in the past to include the section numbers in the anchors, so they show up in URLs when linking to specific sections. W3C RFCs only include the numbering in the anchors. This makes URLs fairly short, but it would be also nice to directly see what kind of section that URL actually links to.
@movq@www.uninformativ.de using zstd first, and gzip after for everything is kind of standard these days, isnāt it? I use Caddy, and have encode zstd gzip on all sites.
Using gzip compression for the twtxt files now. I donāt expect any issues but let me know if something breaks. š„
(This feature is implemented in a pretty minimalistic way in OpenBSDās httpd ā¦)
@movq@www.uninformativ.de But foxes always run away and donāt attack. Theyāre afraid of us humans ā unless they have rabies.
Easy way to do digital detox: Use a Mastodon instance that someone else maintains. And when itās down, thereās nothing you can do but wait. š
@lyse@lyse.isobeef.org show us, Lyse, to put our minds at ease! šš»
@movq@www.uninformativ.de What kind of Unicode do you use? All the new emojis?
@prologic@twtxt.net I think I said this before: This looks like a really cool thing! I just wish I had a use case for it, then Iād be all over you. š But since I run so many servers of my own already ā¦
Whatās your motivation for running this, btw? š¤
I noticed that there are quite a few UI glitches in vim-classic ā and quickly found the cause: It comes with outdated Unicode tables.
I have to admit that I wasnāt aware that thereās a new Unicode release every year:
https://en.wikipedia.org/wiki/Unicode#Versions
Look at this huge number of changes. Every program has to keep track of that, often through libraries but sometimes not (like in Vimās case).
I use Unicode extensively, but this shit is extremely expensive ā¦
My TUI framework is having the same problem. At the moment, this is all offloaded to wcwidth, but if that library was to become unmaintained, Iād have to track Unicode myself.
Gah!
The DOS days were simpler. CP437, end of story. (Yes, I know thatās a lie.)
Oh come on! Why such a stupid anti-feature!?
WARNING: Your yt-dlp version (2026.03.17) is older than 90 days!
It is strongly recommended to always use the latest version. You cannot update when running from source code; Use git to pull the latest changes. To suppress this warning, add --no-update to your command/config.
@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 Let us know how it went. :-)
@movq@www.uninformativ.de Thatās right, way harder than centrally managed. They even didnāt reach concensus over the main folder: āAlle Programme, āAlle Programme (x86)ā, āAll Programsā, āAll Programmesā, etc. Anyway.
For class 11 (or maybe already in 10, I donāt remember exactly) we could choose either between traditional maths class with a graphical calculator or āMathe mit CASā. There were two teachers in my entire school who were able to teach the latter. It was also fairly new at the time I believe. Certainly unheard of for a āallgemeinbildendes Gymnasiumā, maybe the technical ones were already offering it for some time, not sure. It was clear to me that I would take the maths with CAS class.
Each kid had to buy their own Cassiopeia A-Something. I donāt know how much that thing was (definitely more expensive than a graphical calculator) and whether the school subsidized that in any form. But it was slow and underpowered as hell. We rarely used it in class nor for homework (most if not all had already a desktop at home). Typically, when we worked with the CAS, we sat down on the desktop computers. Our class took place in one of the two computer rooms. The desktops were placed on the three sides (left, right, back, facing the walls or windows) and the regular school desks were in the middle. Since there were more pupils than desktops, we always shared. Nowadays, we call it pair programming. ;-)
For the exams we had the āmandatory partā (Pflichtteil) without any tools. Once we finished that and handed the papers to our teacher, we were then allowed to boot up our Cassiopeias and work with them for the second part. Before the exam started, everyone had to show the teacher that they reset their small computer to factory settings. This second part was called āWahlteilā. But you had to do it in order to pass. So, I never understood the choice of this term. Maybe itās because the first part is the exact same for everyone (graphical calculator and CAS class), but the second part was definitely different for the two classes. Each suited to their tools.
After one or two exams, it became clear that the Cassiopeia was far from ideal. So, we took the second part at the desktop computers from then on. Our teacher unplugged the network cables himself to avoid cheating. Each computer had an āHDD Sheriffā running that reset the disk at startup. There was also an issue that the personal user accounts were affected by that. Sometimes all your data were lost. If you were lucky, they were still there. So, we saved our Maple project to local disk (if the computer didnāt crash in between, that was no problem) and at least eventually before leaving the classroom, we then also saved it on the server. For that, the teacher quickly plugged in the cable, we saved, and then the cable was unplugged again immediately. Oh, and everybody used their USB sticks, too.
All in all, this Cassiopeia A-* was quite a useless purchase. :-D Iām not sure if I still have it. At least I thought several times about giving it to the flea market. Donāt know if I did or not.
@movq@www.uninformativ.de Yes, this screenshot. However, not the Dutch but rather the German version, no wonder it looks so crazy!!1!11
Itās been a hot minute or two since I last used KDE, so I donāt remember exactly. I just vaguely recall that I found myself thinking multiple times that the KDE application categories were better matching or there were more or something like that. Most of my classmates were on Windows and had one giant long list of all sort of stuff in there. You even had to scroll in the menu. Sure, they installed all kind of garbage, which didnāt exactly help. Where in KDE, they were actually grouped by Office, Internet, Graphics, Multimedia, Games, etc. In Windows, applications usually hid themselves in a sub folder named after the software vendor. At least in the later (?) days.
I only used Win 95, 98 and XP at home. For maths class with computer algebra system (Maple), we had a Cassiopeia with Win CE: https://en.wikipedia.org/wiki/Casio_Cassiopeia At school, there was probably also Win 2000, but I donāt know anymore for sure.
Speaking of UIs, this is how Thunderbird looks now:
So we continue to let every program make up its own UI style (and then we complain that āthe Linux desktopā looks āmessyā and āinconsistentā). I guess this uses GTK, but it doesnāt look like any other GTK program. Buttons, tabs, drop-downs, whatever, itās all different. It even has its own subwindow system (i.e., popups that you canāt move).
I didnāt say this in the blog post, but Iām convinced that programmers these days absolutely positively hate everything that looks even remotely like Windows 95 or Motif ā with a passion. I see that in my coworkers as well, they really canāt stand it. Itās an emotional thing.
@lyse@lyse.isobeef.org In what way was KDE 3ās menu organized? KDE 1 is the only KDE version I ever used. š Weāre talking about this one, right?
Isnāt Notepad++ and Python cheating!? :-D
Well, Python was certainly already a thing back then, but Notepad++ is from 2003, right. I think I used https://www.wintotal.de/download/proton/ at the time? Maybe? I donāt know. š
The dairy farm has a new milk vending machine. The prices increased by 20%. One liter is now 1.20⬠instead of 1.00ā¬. But I donāt complain.
In a few meters of shrubs there were easily 50 butterflies. That was crazy, Iāve never seen this many in one spot. I should have taken a video.
The grain field in the beginning was looking so great. Crazy colorful and very yummy looking. I would have loved to take a bite. Or at least lie down right in the middle.
That was another great time in the outdoors. The 21°C were killing us, though. We were always glad when we reached a shady spot with a little breeze. Iām not gonna survive the 35°C later this week. :-(
Iran War Live Updates: U.S. and Iran Near Cease-Fire Agreement, Officials Say
Pakistanās prime minister, Shehbaz Sharif, a key mediator, said an agreement had been reached and that a signing ceremony was set for Friday. ā Read more