# I am the Watcher. I am your guide through this vast new twtiverse.
# 
# Usage:
#     https://watcher.sour.is/api/plain/users              View list of users and latest twt date.
#     https://watcher.sour.is/api/plain/twt                View all twts.
#     https://watcher.sour.is/api/plain/mentions?uri=:uri  View all mentions for uri.
#     https://watcher.sour.is/api/plain/conv/:hash         View all twts for a conversation subject.
# 
# Options:
#     uri     Filter to show a specific users twts.
#     offset  Start index for quey.
#     limit   Count of items to return (going back in time).
# 
# twt range = 1 196269
# self = https://watcher.sour.is?offset=170156
# next = https://watcher.sour.is?offset=170256
# prev = https://watcher.sour.is?offset=170056
I went straight to bed after posting this and slept for 3 hours. 😩 Can’t I just win the lottery and be done with this whole “money” thing? 🤪

@lyse Oof, well, good luck. Those multi-day meetings are usually really exhausting (and mostly pointless) in our company, hopefully it’s different at yours. ✌️
I went straight to bed after posting this and slept for 3 hours. 😩 Can’t I just win the lottery and be done with this whole “money” thing? 🤪

@lyse Oof, well, good luck. Those multi-day meetings are usually really exhausting (and mostly pointless) in our company, hopefully it’s different at yours. ✌️
I went straight to bed after posting this and slept for 3 hours. 😩 Can’t I just win the lottery and be done with this whole “money” thing? 🤪

@lyse Oof, well, good luck. Those multi-day meetings are usually really exhausting (and mostly pointless) in our company, hopefully it’s different at yours. ✌️
@lyse Indeed, great news! If you need testers at some point, let me know. 😅
@lyse Indeed, great news! If you need testers at some point, let me know. 😅
@lyse Indeed, great news! If you need testers at some point, let me know. 😅
@lyse Indeed, great news! If you need testers at some point, let me know. 😅
Lest we forget … https://www.youtube.com/watch?v=mp5gksq_OEI … !
Lest we forget … https://www.youtube.com/watch?v=mp5gksq_OEI … !
Lest we forget … https://www.youtube.com/watch?v=mp5gksq_OEI … !
Lest we forget … https://www.youtube.com/watch?v=mp5gksq_OEI … !
@falsifian Regarding your last paragraph: Back in December 2020, we already once changed the hashing. I think that was my first contribution, breaking everything by switching to RFC 3339 for the timestamp format. ;-) I'm computing two hashes in my client, the old and current one. And then I just select whatever matching parent exists to build the thread tree.

I could do that again in my client, but you're right, it's a different story for jenny. If I'm not mistaken, In-Reply-To could contain several hashes, but the Message-ID header is the issue.

By increasing the hash length for a potential future change, clients could tell, which algorithm to use.

Maybe we could define a magic timestamp in the future that marks the cutoff point. Use the current implementation for messages authored before that magic date or the new algorithm for all messages after that.

But eventually, all clients have to be updated. There's no way around that, I believe. Simplicity is key and my magic time already adds complexity. :-/
@movq @aelaraji @bender Why not have both Jupiter and Venus together? https://www.youtube.com/watch?v=oXyCORLeLd0 I don't understand anything either, but it just sounds great to my ears.

> if not I am editing and breaking replies!

Bwahahahaaa! :'-D
@bender I doubt I'll be able to watch it live 🤣 But by all means, please Yarns all the goodies 😅
@bender I doubt I'll be able to watch it live 🤣 But by all means, please Yarns all the goodies 😅
Nice, thanks for the offer, @bender! You have to be a bit patient, though, it'll take a while until there is something to actually worth messing with. :-)
Getting ready for the Apple Event. Are you watching it live, @prologic, or afterwards? :-P
@movq @prologic :-D

It's like that for months. :-( And tomorrow I even gotta go into the office for some two day meeting, but I only attend a single day. On the positive side, I'm gonna see some workmates that I haven't ever met in the real world or for a very long time.
@bender Kind of mirrored the ssh and ssh-keygen utilities. No reason really.
@bender Kind of mirrored the ssh and ssh-keygen utilities. No reason really.
@bender


$ echo 'hello world' | ./salty -i ./test_ed25519 --ssh-key --sign
@bender


$ echo 'hello world' | ./salty -i ./test_ed25519 --ssh-key --sign
@prologic any reason why there is salty, and salty-keygen? Why not both into one?
@prologic hey, what's the one liner to sign using an SSH key with salty?
@bender Ahh yeah sorry about that 🤣 You were getting confused between salty.im and salty. The later of which salty.im _actually_ uses and formed the basis of everything else. It's a simple robust library and command-line tools with good test coverage. The lowest building block 😅
@bender Ahh yeah sorry about that 🤣 You were getting confused between salty.im and salty. The later of which salty.im _actually_ uses and formed the basis of everything else. It's a simple robust library and command-line tools with good test coverage. The lowest building block 😅
I think I know what I did wrong. LOL. I used the wrong repository. Going for go install go.mills.io/salty/cmd/salty@latest instead. Duh!
@prologic So, I did go install go.salty.im/saltyim/cmd/salty-chat@latest, moved salty-chat to my bin as salty, and that one liner isn't working. What am I doing wrong?
[47°09′53″S, 126°43′56″W] Automatic systems disengaged due to thunderstorm
@prologic excellent, thanks!
@prologic excellent, thanks!
Pinellas County - Cool down: 0.83 miles, 00:09:44 average pace, 00:08:06 duration

#running
Pinellas County - Cool down: 0.83 miles, 00:09:44 average pace, 00:08:06 duration

#running
Pinellas County - Cool down: 0.83 miles, 00:09:44 average pace, 00:08:06 duration

#running
@movq That bad eh? 😅
@movq That bad eh? 😅
It’s one of those days.

It’s one of those days.

It’s one of those days.

It’s one of those days.

Pinellas County - Base: 4.15 miles, 00:08:59 average pace, 00:37:18 duration
Good workout keeping it aerobic for the most part.
#running
Pinellas County - Base: 4.15 miles, 00:08:59 average pace, 00:37:18 duration
Good workout keeping it aerobic for the most part.
#running
Pinellas County - Base: 4.15 miles, 00:08:59 average pace, 00:37:18 duration
Good workout keeping it aerobic for the most part.
#running
For example:


$ echo 'hello world' | ./salty -i ./test.key -s | ./salty -i ./test.key -v
# signed by: kex1yfzzthmsdlqhgwzafy9zpjze6a0asxf6y552dp4yhvq66a4jje0qxqapvd
hello world
For example:


$ echo 'hello world' | ./salty -i ./test.key -s | ./salty -i ./test.key -v
# signed by: kex1yfzzthmsdlqhgwzafy9zpjze6a0asxf6y552dp4yhvq66a4jje0qxqapvd
hello world
@bender Yes of course it can 😅 Sorry I missed your question on IRC 😢
@bender Yes of course it can 😅 Sorry I missed your question on IRC 😢
@prologic can salty verify ed25519 signed messages? I asked on IRC, but never got a reply (or I missed it).
@jmjl howdy! Sorry for mistaken you with https://blog.nfld.uk/ (jlj), but glad to connect. Cheers!
@jmjl howdy! Sorry for mistaken you with https://blog.nfld.uk/ (jlj), but glad to connect. Cheers!
@mckinley To answer some of your questions:

> Are SSH signatures standardized and are there robust software libraries that can handle them? We’ll need a library in at least Python and Go to provide verified feed support with the currently used clients.

We already have this. Ed25519 libraries exist for all major languages. Aside from using ssh-keygen -Y sign and ssh-keygen -Y verify, you can also use the salty CLI itself (https://git.mills.io/prologic/salty), and I'm sure there are other command-line tools that _could_ be used too.

> If we all implemented this, every twt hash would suddenly change and every conversation thread we’ve ever had would at least lose its opening post.

Yes. This would happen, so we'd have to make a decision around this, either a) a cut-off point or b) some way to progressively transition.
@mckinley To answer some of your questions:

> Are SSH signatures standardized and are there robust software libraries that can handle them? We’ll need a library in at least Python and Go to provide verified feed support with the currently used clients.

We already have this. Ed25519 libraries exist for all major languages. Aside from using ssh-keygen -Y sign and ssh-keygen -Y verify, you can also use the salty CLI itself (https://git.mills.io/prologic/salty), and I'm sure there are other command-line tools that _could_ be used too.

> If we all implemented this, every twt hash would suddenly change and every conversation thread we’ve ever had would at least lose its opening post.

Yes. This would happen, so we'd have to make a decision around this, either a) a cut-off point or b) some way to progressively transition.
@bender Holy shit that pod is still alive?! 🤔
@bender Holy shit that pod is still alive?! 🤔
@sorenpeter WebFinger requires additional setup that whilsts helps to solve the "identity" problem in an "abstract" way, that extra infra that needs to be setup a) isn't trivial and b) hard to support on "shared hosting".

Sharing hosting is also the reason why you can't just use part of a URL really.
@sorenpeter WebFinger requires additional setup that whilsts helps to solve the "identity" problem in an "abstract" way, that extra infra that needs to be setup a) isn't trivial and b) hard to support on "shared hosting".

Sharing hosting is also the reason why you can't just use part of a URL really.
On my blog: Developer Diary, Chrysanthemum Day https://john.colagioia.net/blog/2024/09/09/chrysanthemum.html #programming #project #devjournal
how little data is needed for generating the hashes? Instead of the full URL, can we makedo with just the domain (example.net) so we avoid the conflicts with gemini://, https:// and only http:// (like in my own twtxt.txt) or construct something like like a webfinger id nick@domain (also used by mastodon etc.) from the domain and nick if there, else use domain as nick as well
how little data is needed for generating the hashes? Instead of the full URL, can we makedo with just the domain (example.net) so we avoid the conflicts with gemini://, https:// and only http:// (like in my own twtxt.txt) or construct something like like a webfinger id nick@domain (also used by mastodon etc.) from the domain and nick if there, else use domain as nick as well
how little data is needed for generating the hashes? Instead of the full URL, can we makedo with just the domain (example.net) so we avoid the conflicts with gemini://, https:// and only http:// (like in my own twtxt.txt) or construct something like like a webfinger id nick@domain (also used by mastodon etc.) from the domain and nick if there, else use domain as nick as well
how little data is needed for generating the hashes? Instead of the full URL, can we makedo with just the domain (example.net) so we avoid the conflicts with gemini://, https:// and only http:// (like in my own twtxt.txt) or construct something like like a webfinger id nick@domain (also used by mastodon etc.) from the domain and nick if there, else use domain as nick as well
Wow, a blast from the past. Look at that Yarn version!
[47°09′08″S, 126°43′14″W] Weather forecast alert -- storm from SE
Where all folks?!
@lyse this one is hilarious 🤣
@lyse this one is hilarious 🤣
@lyse this one is hilarious 🤣
@movq @lyse @bender You Are AWESOME!! Got my playlist for the week!! 🤘😂
@movq @lyse @bender You Are AWESOME!! Got my playlist for the week!! 🤘😂
@movq @lyse @bender You Are AWESOME!! Got my playlist for the week!! 🤘😂
**** ⌘ Read more****
[47°09′58″S, 126°43′15″W] Reading: 0.66000 PPM
Parannoul - Beautiful World.m4a
[47°09′27″S, 126°43′47″W] Reading: 0.31000 PPM
@movq Peobably not and I wouldn't expect them to either 😅
@movq Peobably not and I wouldn't expect them to either 😅
But in all seriousness I've only ever wanted to improve Twtxt without sacrificing its simplicity too much.
But in all seriousness I've only ever wanted to improve Twtxt without sacrificing its simplicity too much.
@movq Sorry haha I didn't mean for it to sound like that 🤣
@movq Sorry haha I didn't mean for it to sound like that 🤣
@mckinley Hmmm? Care to elaborate? 🤣
@mckinley Hmmm? Care to elaborate? 🤣
mfw it says someone updated 1 days ago 👹
🧮 USERS:1 FEEDS:2 TWTS:1087 ARCHIVED:78676 CACHE:2491 FOLLOWERS:17 FOLLOWING:14
@lyse let’s do Drops of Jupiter too! (hopefully my markdown foo works, if not I am editing and breaking replies! 😅)

Video
@lyse let’s do Drops of Jupiter too! (hopefully my markdown foo works, if not I am editing and breaking replies! 😅)

https://youtu.be/7Xf-Lesrkuc
@lyse let’s do Drops of Jupiter too! (hopefully my markdown foo works, if not I am editing and breaking replies! 😅)

@lyse let’s do Drops of Jupiter too! (hopefully my markdown foo works, if not I am editing and breaking replies! 😅)

@lyse oooooh! That one looks lovely too! Let me know when there is something to alpha/beta test. I am volunteering! 😊
@movq Yep, that's very nice music. :-)

Can't help myself, but I have to include the Uranus song now. :-D https://www.youtube.com/watch?v=OSWszdSHkyE#t=7
@lyse This looks like a nice way to do it.

Another thought: if clients can't agree on the url (for example, if we switch to this new way, but some old clients still do it the old way), that could be mitigated by computing many hashes for each twt: one for every url in the feed. So, if a feed has three URLs, every twt is associated with three hashes when it comes time to put threads together.

A client stills need to choose one url to use for the hash when composing a reply, but this might add some breathing room if there's a period when clients are doing different things.

(From what I understand of jenny, this would be difficult to implement there since each pseudo-email can only have one msgid to match to the in-reply-to headers. I don't know about other clients.)
Thank you, @bender! No, the rendering is based on https://github.com/rivo/tview.
@lyse I just wanted to state that this is excellent news! Are you going to use some BubbleTea? 🙈
It’s been a little over 14 years since Isis broke up and I have yet to find a band as good as them. Not a single song that disappoints (at least since the Oceanic album). Glad I could see them live a couple of times. // Isis - Grey Divide // https://www.youtube.com/watch?v=eI2-8I3j4Vg #NowPlaying
It’s been a little over 14 years since Isis broke up and I have yet to find a band as good as them. Not a single song that disappoints (at least since the Oceanic album). Glad I could see them live a couple of times. // Isis - Grey Divide // https://www.youtube.com/watch?v=eI2-8I3j4Vg #NowPlaying
It’s been a little over 14 years since Isis broke up and I have yet to find a band as good as them. Not a single song that disappoints (at least since the Oceanic album). Glad I could see them live a couple of times. // Isis - Grey Divide // https://www.youtube.com/watch?v=eI2-8I3j4Vg #NowPlaying
It’s been a little over 14 years since Isis broke up and I have yet to find a band as good as them. Not a single song that disappoints (at least since the Oceanic album). Glad I could see them live a couple of times. // Isis - Grey Divide // https://www.youtube.com/watch?v=eI2-8I3j4Vg #NowPlaying
https://github.com/spf13/afero looks better, but has a gazillion dependencies. So that's out.
I'm finally continuing with my tt rewrite in Go. So, I thought I use the shiny io/fs.FS. That's supposed to be a super cool new file system API. It allowed me to write tests more elegantly. I don't have to place actual test files on disk, but can keep everything nicely in RAM with testing/fstest.MapFS. That actually worked out great, I do like that.

However, os.DirFS("/") for production code is just a terrible solution. I noted that OS paths and io/fs.FS paths are fundamentally different. This new API does not allow leading slashes in the passed paths. This results in an error. So, I have to cut the leading slash off myself.

Also, the whole thing is totally useless on Windows, because of the drives. Simply does not work at all. Well, honestly, I don't care the slightest bit about that operating system, but it would be nice if this concept were cross-platform.

I haven't tested it, but I'm pretty sure relative paths or ~ do also not work. I have to first build absolute paths myself. Unfortunately, there is no builtin helper to translate an OS path into a io/fs.FS path.

Of course, others noted these shortcomings and surprising results, too: https://github.com/golang/go/issues/44279 There is no OSFileSystem implementation that would simply allow the easy transition from all the classical os.* functionality to io/fs.FS. And they also do not wanna add something like that either. Sigh.

I'm really wondering what they were thinking when introducing this. :-?

Even though, it's very silly, I'm gonna keep using it. At least for now. Tests have been written. I'm not keen on rewriting them. Sigh.
[47°09′42″S, 126°43′00″W] Saalmi, retransmit, please