@prologic@twtxt.net Potentially, depending on the features supported / hardware used.
Iāve long wished for an appliance (like a video game console) that hosts my essential services - email, shared files, social media, etc. - but which ājust runsā in a box behind the TV.
So what do you have in mind? š¤
@david@daiwei.me Do you mind re-testing too with the updates i just pushed out? š
@david@daiwei.me Also if you wouldnāt mind writing up an Issue for the image/upload problem too, that would be great š I still havenāt solved it properly, but Iāll try to do so today. Thereās also an issue uploading images via the yarnd API path from the Twtxt App too, which I can replicate with basically any photo from my iPhoneās Photo gallery hmm š¤
Bwahahaha, these security folks have a great sense of humor! :-D Got a phishing test e-mail disguised as an overdue anti-phishing training e-mail: 
We receive these test phishing e-mails every now and then at work. When you follow the links and log in at the fake login, you probably get assigned another (real) training.
When I got this e-mail, I immediately thought of such a test. Since I actually do have some stupid training deadlines coming up soon, I wasnāt 100% sure, but still doubted that this was one of them. To make the timing even better, in the team meeting last week, our bosses reminded us to complete outstanding trainings before the deadlines. Ideally well in advance. Notifications about deadlines coming closer are sometimes not only sent to the individuals but also to the bosses and their bosses. And then things can get out of hands when somebody doesnāt read the e-mails properly and mistakes them for deadline exceeded reports.
Anyway, the URL also looked kinda legit. It really doesnāt help a single bit that domain names change all the fucking time. So, still with the test program in mind, I thought, I just give it a quick shot out of curiosity. Since I just had logged in before, the empty SSO username field was totally obvious then. Looking at the e-mail headers confirmed that this was indeed one of securityās field checks. :-)
@david@daiwei.me Itās truly mind-boggling. All the hand full of episodes Iāve seen so far on this channel are amazing. Totally worth tuning in. I have to catch up a lot. :-)
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.
@david@daiwei.me Please write an issue for this š I donāt mind which way we go!
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!
@bender@twtxt.net I just couldnāt resist the temptation, now that my usal setup has started acting funny. But Iāll keep that in mind
@movq@www.uninformativ.de LOL. I canāt imagine a workplace using Matrix. It simply⦠boggles my mind.
@bender@twtxt.net thanks, iāll keep this in mind!
@balloonfu-sen@yarn.girlonthemoon.xyz Do you mind git pull && make build and updating your yarnd instance so itās in-line with the new Hash v2 spec š
Things my mind will always find hard to comprehend.
Apologies for the late #caturday post, but I figure itās more of a state of mind, like that time Shadow temporarily āborrowedā the dog bed (and discovered how comfy a blanket pile can be)ā¦

@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/
@lyse@lyse.isobeef.org show us, Lyse, to put our minds at ease! šš»
@prologic@twtxt.net (I hope Iām not too incoherent. I didnāt sleep very well recently and have a lot of unrelated stuff on my mind. š¤£)
@bender@twtxt.net So yeah, no, I do not have an inner monologue at all. Most of the time my inner mind is busy just replaying music or visuals (or at least it used to before I lost my sight, these days it just replays visuals and sounds), but there is never a time when I ātalk to myselfā, ever, I donāt ever think through something, a problem or an activity and have self-arguments. I just do.
@bender@twtxt.net Fine, Let me answer properly and concretely š
Would you want your children not to learn anything, because āthey have AIā?
No, children still need to learn. That will never change. What they learn however will over time.
Are you OK with your children using the AI for all of their homework?
Yes, frankly I am. Why? Because much of what we teach them in school is utterly pointless.
For example, learning to read Shakespear never taught me anything useful in my life. I regret much of my school years to be honest.
I leanred to read and write, sure. But I learned Math, Science, Computing and how things work on my own by being very curious.
What sense will it make?
That assumes I answered ānoā, which I did not. So it all makes perfect sense :D
What kind of future would that bring for them?
This assumes I said āYesā, which I did :D It will be an itneresting future thatās for sure. I donāt think we can just bury our heads in teh sand and pretend itās all going to go away, It will not. It will make things very interesting for sure, as weāre already starting to see whatās possible and whatās changeing. For example; ordinary people are using these LLM(s) to write their legal suit and defense in courts with varying levels of success.
Even if AI were to become omniscient, what will it be of the human race then?
Iām not convinced it ever will. In fact, I am not convinced we know how to create true intellience at all.
What would we do?
What would be so different from say an Alien invasion from far superious beings?
What would we do that? Band together and defend humanity?
Serve the AI? Maintain the AI?
That assumes that āAIā will become intelligent and omniscient, which I donāt believe it ever will.
Would we have found the true meaning of life then?
If the meaning of life is to create our own sub-species liken to ourselves, sure, maybe. But is that even a reality? not sure, I doubt it. We barely understand ourselves at the best of times, let alone how our minds works.
To care for AI, Is that it?
How would this be different to caring for a friend, a family member If we could ever truly reate an actual sentient being with real feelings and intelligenace, is there any reason to worry? Could we not be freinds and have mutual goals and form relationships?
@movq@www.uninformativ.de I really like your style of writing, btw. Itās much calmer and less aggressive then mine. :-) When I turned my bullet points into paragraphs, I got a bit mad in the process.
Sure, feel free to include anything you want. Regarding citing, this is where twtxt falls short in my opinion. Especially with feed rotation, classic links die quickly. Message hashes only help so much. Nobody outside the twtxt universe knows how to deal with them. So, not perfect for inclusion on a web page. Linking to a thread or message on some yarnd instance might be the more user-friendly option. But the disadvantage is that itās ājustā a mirror, not the primary or original source. In all reality, this could be considered splitting hairs, though.
I should have probably written a proper article. That would have given me time to review the result more carefully, too. ;-) Perhaps thatās something for the future. But honestly, Iām not sure if I really want to waste my time and energy on that subject. So many other fun or useless things come to mind right away that I could do instead. 8-)
So, yeah, do whatever feels best to you. I donāt mind being cited or linked, but I also donāt mind not to be cited or not to be linked to. :-D Not a helpful answer, I know. Sorry. ;-) But anyway, thanks for asking, mate! I do appreciate it.
To finish my thought, linking to my frontpage is probably also useless, since I deliberatly do not have a table of contents there. In fact, my entire frontpage is rather silly.
I should have changed the key binding from Print to Shift+Print a long time ago to launch import and upload the screenshot to my server. I was constantly hitting that stupid key on accident when I actually wanted to press [AltGr].
If I only could map a key binding to slap these damn ThinkPad T15 keyboard layout designers at Lenovo remotely in the face. Seriously, who in their right mind puts Print (in German Druck) between AltGr and Ctrl at the bottom row to begin with?! Exactly. Nobody. What a horrible location.

Ah, thereās even a term for it:
https://en.wikipedia.org/wiki/Generation_effect
The generation effect is a psychological phenomenon whereby information is better remembered if it is generated from oneās own mind rather than simply read.
hfgl with your coding agents
@prologic@twtxt.net nice! Looks like a great place to be. I wouldnāt mind, just about now! How is the camper behaving? Got all your money worth already? Based on your light participation around here I am tempted to say yes. :-D
@prologic@twtxt.net I am going to give it a more serious spin (meaning I am going to go read the help page). Iāve got to tell you though, most successful games do not need a help. But I am fully aware that there is a subset of gamers that would not mindāif not appreciateāa game with help, manual, and the likes.
@movq@www.uninformativ.de Yup, Iāve also seen the floating point conversion happening with (1 << 63) - 1 yesterday night. But instead of pausing to think about it for a second, somehow all I had in mind was āgive me a better representation, aināt gonna have time for this shitā, so I turned it to hex. Beyond my comprehension what I was thinking there. O_o Thatās embarrassing, unbelievable. Well, I blame late oāclock where my brain had already quit on me and went to bed.
Very interesting data point you raise there. The fun part didnāt cross my mind yet or at least I couldnāt pinpoint it. In hindsight itās totally obvious, though. Past experience also tells me the exact same. Dealing with a problem and researching something myself is a so much more better teacher. The longer I faced up with a topic, the higher the chance to really manifest in long- or at least mid-term memory. If I just get told something, the odds are that itās completely erased from memory in a matter of days if not hours.
@lyse@lyse.isobeef.org Thatās crazy! If you donāt mind me asking, what browser are you using when you see this?
@bender@twtxt.net Glad to hear it, Iāve neglected a Safari test thus far.
Thank you both for checking.
@falsifian@www.falsifian.org Thanks, Iāll keep this in mind in case Iām ever around your neighborhood. ;-)
@lyse@lyse.isobeef.org Thank you for the suggestions. I will probably do some of that when I have time. For the thumbnails, Iām also thinking about trying the loading=ālazyā img attribute. Top on my mind is actually understanding why the big images donāt load. Maybe my VPSās network connection is saturated, for example. Iāve never needed to worry about such things until now. Iām looking forward to spending some time on it.
@kiwu@twtxt.net I am trying to read our Information Security Office āmindā to grasp what they want. So far they seem to want to get logs from our BIG-IP F5 load balancers into Azure Sentinel, but the Telemetry Streaming plugin normally used for it is on maintenance mode, with deprecations happening on the F5 and Microsoft side soonish. So, yeah⦠āfunā. Oh, and they want it on production by tomorrow. LOLz!
The fact that Canada and US do basic mathematical operations algorithms upwards always boggles my mind.
@movq@www.uninformativ.de I also had to laugh. :-D And thatās what crossed my mind for a splitsecond, too. Two decades ago or so, that would have worked. But these days are long over. Wasnāt it even an INI file or something like that?
@movq@www.uninformativ.de Oh yeah, Iād take that, too. :-)
I donāt mind most sauna goers. It would be just nicer if there were fewer people or parallel Aufguss sessions, so that itās not overcrowded.
My mind needs serious detox.
@movq@www.uninformativ.de I donāt have any statistics, just observe what is around me, so itās very subjective. I know a bunch of kids with names Iāve never heard before. Sometimes, I first thought other kids were making fun of their friends by calling them by made-up nonsense. But no. Without question, I live under a rock. I just looked up some of them that came to mind immediately and they seem to be of Greek, Swedish and Latin origin, etc.
@eldersnake@we.loveprivacy.club haha! I read as Golang the first time too. It is just the way our minds work. :-P
@aelaraji@aelaraji.com Yes, exactly. It also blows my mind that with sooo much less budget and equipment, her videos are way superior to productions of big TV stations.
my MIND is a MACHINE that turns ILLEGIBLE CODE into ILLEGIBLE CODE

@prologic@twtxt.net my translator says conversations. An Jabber Droid app comes to mind.
@bender@twtxt.net Goes to show you just have a good nose for that. :^)
No doubt, I really do love them. Not only wonderful humans and like-minded, but also technically gifted. That made for a superb combination. I just hope the new team turns out to be equally great.
Bwahahahahaaahaaahaaahaaa, what a brilliant story! :ā-D Iāve been given at most ten weeks to return, letās see. ;-)
@prologic@twtxt.net Let me know if you still need an account for testing. My tin-can bandwidth is slow AF but usable if you donāt mind the speed.
@bender@twtxt.net All good. āļø Itās just that Iāve been through several iterations of this (on other platforms), AI output back and forth, pointing out whatās wrong, but in the end people were just trolling (not saying thatās what you had in mind), because apparently thatās āfunā.
@movq@www.uninformativ.de this I find more worrisome, and saw no mention of it on your text: Right-Wing Chatbots Turbocharge Americaās Political and Cultural Wars (gift article).
Enoch, one of the newer chatbots powered by artificial intelligence, promises āto āmind wipeā the pro-pharma biasā from its answers. Another, Arya, produces content based on instructions that tell it to be an āunapologetic right-wing nationalist Christian A.I. model.ā
@prologic@twtxt.net Nothing, yet. It was sent in written form. Thereās probably little point in fighting this, they have made up their minds already (and AI is being rolled up en masse in other departments), but on the other hand, there are ā truthfully ā very few areas where AI could actually be useful to me.
There are going to be many discussions about this ā¦
This is completely against the āspiritā of this company, btw. We used to say: āItās the goal that matters. Use whatever tools you think are appropriate.ā Thatās why Iām allowed to use Linux on my laptop. Maybe they will back down eventually when they realize that trying to push this on people is pointless. Maybe not.
donāt mind the glaring light mode i just think the pink looks pretty. this ādesktop modeā is just a bunch of css repurposing the sidebar into the taskbar, but the file manager and its supporting code is proving a very fun endeavour. my favorite part is u can just turn javascript off and it functions like a regular website with nothing suspicious about it at all
@movq@www.uninformativ.de Hahaha, now Iām curious what use case you have in mind. :-D
@prologic@twtxt.net Ouch, I donāt want to get hit by these projectiles! :-O Is that black tube on the bottom the remains of a chair leg?
I reckon one could collect these hail stones and put them in the drinks to work around the lost air conditioning. At least if one doesnāt mind icy drinks. (I canāt stand that, because I immediately get hickup when drinking something cold.)
Thanks, @alexonit@twtxt.alessandrocutolo.it! Yeah, this classic rivet is a good, yet laborous alternative. I donāt mind the work, I just donāt have any copper at hand. I might give this some more thought, though.
@alexonit@twtxt.alessandrocutolo.it Maybe I misunderstood, but you have to keep the timezone offsets in mind. Simple alphabetical sorting of the timestamp strings does not yield a truly chronological order. It might be close enough for you, though.
@prologic@twtxt.net I can see the issues mentioned, but I think some can be fixed.
The current hash relies on a
urlfield too, by specification, it will use the first# url = <URL>in the feedās metadata if present, that too can be different from the fetching source, if that field changes it would break the existing hashes too, a better solution would be to use a non-URL key like# feed_id = <UNIQUE_RANDOM_STRING>with theurlas fallback.We can prevent duplications if the reference uses that same url field too or the client ācollapseā any reference of all the urls defined in the metadata.
I agree that hashing based on content is good, but we still use the URL as part of the hashing, which is just a field in the feed, easily replicable by a bot, also noting that edits can also break the hash, for this issue an alternative solution (E.g. a private key not included in the feed) should be considered.
For offline reading the source would be downloaded already, the fetching of non followed feeds would fill the gap in the same way mentions does, maybe Iām missing some context on this one.
To prevent collisions there was a discussion on extending the hash (forgot if that was already fixed or not), but without a fallback that would break existing clients too, we should think of a parallel format that maintains current implementations unchanged, we are already backward compatible with the original that donāt use threads at all, a mention style format for that could be even more user-friendly for those clients.
We should also keep in mind that the current mention format is already location based (@<example https://example.com/twtxt.txt>) so Iām not that worried about threads working the same way.
Hope to see some other thought about this matter. š¤
@lyse@lyse.isobeef.org i dont mind if the hash is not backward compatible but im not sure if this is the right way to proceed because the added complexity dealing with two hash versions isnt justified
regular end users wont care to understand how twt hashes are formed, they just want to use twtxt! so i guess i could work in protecting users from themselves by disallowing post edits on old posts or posts with replies, but iām not fond of this either really. if they want to break a thread, they can just delete the post (though iāve noticed yarn handling post deletes dubiouslyā¦)
on activitypub i do genuinely find myself looking through several month or even year old posts sometimes and deciding to edit/reword them a little to be slightly less confusing, this should be trivial to handle on twtxt which is an infinitely simpler specification
