# 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 15156
# self = https://watcher.sour.is?uri=https://www.uninformativ.de/twtxt.txt&offset=12875
# next = https://watcher.sour.is?uri=https://www.uninformativ.de/twtxt.txt&offset=12975
# prev = https://watcher.sour.is?uri=https://www.uninformativ.de/twtxt.txt&offset=12775
@anth (I’m also a bit confused by the UTF-8 topic. I thought that the original twtxt spec has *always* mandated UTF-8 for the content. Why’s that an issue now? 😅 Granted, my client also got this wrong in the past, but it has been fixed ~3 years ago.)~
@anth (I’m also a bit confused by the UTF-8 topic. I thought that the original twtxt spec has *always* mandated UTF-8 for the content. Why’s that an issue now? 😅 Granted, my client also got this wrong in the past, but it has been fixed ~3 years ago.)~
@lyse That looks like lovely weather. We had nothing but rain. 🥴
@lyse That looks like lovely weather. We had nothing but rain. 🥴
@lyse That looks like lovely weather. We had nothing but rain. 🥴
@lyse That looks like lovely weather. We had nothing but rain. 🥴
@bender So you stayed? Fingers crossed 🤞😵
@bender So you stayed? Fingers crossed 🤞😵
@bender So you stayed? Fingers crossed 🤞😵
@bender So you stayed? Fingers crossed 🤞😵
@lyse lol indeed 😆
@lyse lol indeed 😆
@lyse lol indeed 😆
@lyse lol indeed 😆
I hope you guys in the US get safely through the *next* storm. 😳
I hope you guys in the US get safely through the *next* storm. 😳
I hope you guys in the US get safely through the *next* storm. 😳
I hope you guys in the US get safely through the *next* storm. 😳
That is a fun little rabbit hole: https://rodarmor.com/blog/whence-newline/
That is a fun little rabbit hole: https://rodarmor.com/blog/whence-newline/
That is a fun little rabbit hole: https://rodarmor.com/blog/whence-newline/
That is a fun little rabbit hole: https://rodarmor.com/blog/whence-newline/
Going through some old CDs.

[Jam & Spoon - Angel (DJ Misjah Remix)](https://www.youtube.com/watch?v=CWYF5lZ1nAM)

I’ve always liked this track, but ~30 years ago I didn’t have good headphones. Now I do and only now do I realize how “dense” the atmosphere of this track is. 😳 Guess my speakers back then simply didn’t render most of the bass … 🤦~
Going through some old CDs.

[Jam & Spoon - Angel (DJ Misjah Remix)](https://www.youtube.com/watch?v=CWYF5lZ1nAM)

I’ve always liked this track, but ~30 years ago I didn’t have good headphones. Now I do and only now do I realize how “dense” the atmosphere of this track is. 😳 Guess my speakers back then simply didn’t render most of the bass … 🤦~
Going through some old CDs.

[Jam & Spoon - Angel (DJ Misjah Remix)](https://www.youtube.com/watch?v=CWYF5lZ1nAM)

I’ve always liked this track, but ~30 years ago I didn’t have good headphones. Now I do and only now do I realize how “dense” the atmosphere of this track is. 😳 Guess my speakers back then simply didn’t render most of the bass … 🤦~
Going through some old CDs.

[Jam & Spoon - Angel (DJ Misjah Remix)](https://www.youtube.com/watch?v=CWYF5lZ1nAM)

I’ve always liked this track, but ~30 years ago I didn’t have good headphones. Now I do and only now do I realize how “dense” the atmosphere of this track is. 😳 Guess my speakers back then simply didn’t render most of the bass … 🤦~
@lyse Did someone call perror() after something that does not change errno? 🥴
@lyse Did someone call perror() after something that does not change errno? 🥴
@lyse Did someone call perror() after something that does not change errno? 🥴
@lyse Did someone call perror() after something that does not change errno? 🥴
@3r1c I think I’m gonna like that blog. 😅 https://unixdigest.com/articles/is-the-madness-ever-going-to-end.html
@3r1c I think I’m gonna like that blog. 😅 https://unixdigest.com/articles/is-the-madness-ever-going-to-end.html
@3r1c I think I’m gonna like that blog. 😅 https://unixdigest.com/articles/is-the-madness-ever-going-to-end.html
@3r1c I think I’m gonna like that blog. 😅 https://unixdigest.com/articles/is-the-madness-ever-going-to-end.html
What’s going on with the timestamps on HackerNews articles? 🤔 A lot of them are off: https://movq.de/v/1341904fa5/s.png
What’s going on with the timestamps on HackerNews articles? 🤔 A lot of them are off: https://movq.de/v/1341904fa5/s.png
What’s going on with the timestamps on HackerNews articles? 🤔 A lot of them are off: https://movq.de/v/1341904fa5/s.png
What’s going on with the timestamps on HackerNews articles? 🤔 A lot of them are off: https://movq.de/v/1341904fa5/s.png
@bender As for stability, yes. As for “easy to understand”: Probably depends on how well you hide things like lists or hash maps behind library functions. 🥴
@bender As for stability, yes. As for “easy to understand”: Probably depends on how well you hide things like lists or hash maps behind library functions. 🥴
@bender As for stability, yes. As for “easy to understand”: Probably depends on how well you hide things like lists or hash maps behind library functions. 🥴
@bender As for stability, yes. As for “easy to understand”: Probably depends on how well you hide things like lists or hash maps behind library functions. 🥴
@xuu Yes, of course. This has been blown out of proportion anyway. All I originally wanted to say is that the b2sum program isn’t very widely available.

It would help to know how many different clients there actually are. I suspect that number is very close to 3.
@xuu Yes, of course. This has been blown out of proportion anyway. All I originally wanted to say is that the b2sum program isn’t very widely available.

It would help to know how many different clients there actually are. I suspect that number is very close to 3.
@xuu Yes, of course. This has been blown out of proportion anyway. All I originally wanted to say is that the b2sum program isn’t very widely available.

It would help to know how many different clients there actually are. I suspect that number is very close to 3.
@xuu Yes, of course. This has been blown out of proportion anyway. All I originally wanted to say is that the b2sum program isn’t very widely available.

It would help to know how many different clients there actually are. I suspect that number is very close to 3.
@quark This message of yours was another reason for writing 2hex and 2bin. It made me realize my existing hex2bin script was buggy. So now I have that portable version in C which runs pretty much everywhere: https://movq.de/v/31843f7317/s.png 🥳
@quark This message of yours was another reason for writing 2hex and 2bin. It made me realize my existing hex2bin script was buggy. So now I have that portable version in C which runs pretty much everywhere: https://movq.de/v/31843f7317/s.png 🥳
@quark This message of yours was another reason for writing 2hex and 2bin. It made me realize my existing hex2bin script was buggy. So now I have that portable version in C which runs pretty much everywhere: https://movq.de/v/31843f7317/s.png 🥳
@quark This message of yours was another reason for writing 2hex and 2bin. It made me realize my existing hex2bin script was buggy. So now I have that portable version in C which runs pretty much everywhere: https://movq.de/v/31843f7317/s.png 🥳
@bender Yup, that’s where my web search ended up as well. 🥴
@bender Yup, that’s where my web search ended up as well. 🥴
@bender Yup, that’s where my web search ended up as well. 🥴
@bender Yup, that’s where my web search ended up as well. 🥴
@cuaxolotl Ah, I see. Thanks for the explanation. 👌
@cuaxolotl Ah, I see. Thanks for the explanation. 👌
@cuaxolotl Ah, I see. Thanks for the explanation. 👌
@cuaxolotl Ah, I see. Thanks for the explanation. 👌
@cuaxolotl What’s “the gemini tx model”? 🤔
@cuaxolotl What’s “the gemini tx model”? 🤔
@cuaxolotl What’s “the gemini tx model”? 🤔
@cuaxolotl What’s “the gemini tx model”? 🤔
There’s a lot more activity in Geminispace than I realized: gemini://warmedal.se/~antenna/
There’s a lot more activity in Geminispace than I realized: gemini://warmedal.se/~antenna/
There’s a lot more activity in Geminispace than I realized: gemini://warmedal.se/~antenna/
There’s a lot more activity in Geminispace than I realized: gemini://warmedal.se/~antenna/
@xuu @prologic You clearly have very different goals for twtxt and view it from a very different perspective. I don’t have the mental energy for these discussions. I’m gonna take a break.
@xuu @prologic You clearly have very different goals for twtxt and view it from a very different perspective. I don’t have the mental energy for these discussions. I’m gonna take a break.
@xuu @prologic You clearly have very different goals for twtxt and view it from a very different perspective. I don’t have the mental energy for these discussions. I’m gonna take a break.
@xuu @prologic You clearly have very different goals for twtxt and view it from a very different perspective. I don’t have the mental energy for these discussions. I’m gonna take a break.
@bender The example @prologic posted is missing the base32 dance and the length should be 256 instead of 32. This thing prints the correct hash:

printf '%s\\n%s\\n%s' 'https://example.com/twtxt.txt' '2020-12-09T15:38:42Z' 'The twt hash now uses the RFC 3339 timestamp format.' | b2sum -l 256 | awk '{ print $1 }' | xxd -r -p | base32 | sed -E 's/=//g; s/.*(.{7})$/\\1/' | tr '[A-Z]' '[a-z]'

(xxd is part of Vim.)
@bender The example @prologic posted is missing the base32 dance and the length should be 256 instead of 32. This thing prints the correct hash:

printf '%s\n%s\n%s' 'https://example.com/twtxt.txt' '2020-12-09T15:38:42Z' 'The twt hash now uses the RFC 3339 timestamp format.' | b2sum -l 256 | awk '{ print $1 }' | xxd -r -p | base32 | sed -E 's/=//g; s/.*(.{7})$/\1/' | tr '[A-Z]' '[a-z]'

(xxd is part of Vim.)
@bender The example @prologic posted is missing the base32 dance and the length should be 256 instead of 32. This thing prints the correct hash:

printf '%s\n%s\n%s' 'https://example.com/twtxt.txt' '2020-12-09T15:38:42Z' 'The twt hash now uses the RFC 3339 timestamp format.' | b2sum -l 256 | awk '{ print $1 }' | xxd -r -p | base32 | sed -E 's/=//g; s/.*(.{7})$/\1/' | tr '[A-Z]' '[a-z]'

(xxd is part of Vim.)
@bender The example @prologic posted is missing the base32 dance and the length should be 256 instead of 32. This thing prints the correct hash:

printf '%s\n%s\n%s' 'https://example.com/twtxt.txt' '2020-12-09T15:38:42Z' 'The twt hash now uses the RFC 3339 timestamp format.' | b2sum -l 256 | awk '{ print $1 }' | xxd -r -p | base32 | sed -E 's/=//g; s/.*(.{7})$/\1/' | tr '[A-Z]' '[a-z]'

(xxd is part of Vim.)
@bender The example @prologic posted is missing the base32 dance and the length should be 256 instead of 32. This thing prints the correct hash:

printf '%s\\n%s\\n%s' 'https://example.com/twtxt.txt' '2020-12-09T15:38:42Z' 'The twt hash now uses the RFC 3339 timestamp format.' | b2sum -l 256 | awk '{ print $1 }' | xxd -r -p | base32 | sed -E 's/=//g; s/.*(.{7})$/\\1/' | tr '\n' '\n'

(xxd is part of Vim.)
@prologic I’m sure you can *somehow* install *something* that calculates blake2b on OpenBSD. But it’s not part of the base system as a standalone CLI tool, there only appear to be Perl modules for it. The other SHA tools do exist.
@prologic I’m sure you can *somehow* install *something* that calculates blake2b on OpenBSD. But it’s not part of the base system as a standalone CLI tool, there only appear to be Perl modules for it. The other SHA tools do exist.
@prologic I’m sure you can *somehow* install *something* that calculates blake2b on OpenBSD. But it’s not part of the base system as a standalone CLI tool, there only appear to be Perl modules for it. The other SHA tools do exist.
@prologic I’m sure you can *somehow* install *something* that calculates blake2b on OpenBSD. But it’s not part of the base system as a standalone CLI tool, there only appear to be Perl modules for it. The other SHA tools do exist.
@prologic I was about to post the same a few days ago, but b2sum is a GNU thing and not available on OpenBSD, for example.
@prologic I was about to post the same a few days ago, but b2sum is a GNU thing and not available on OpenBSD, for example.
@prologic I was about to post the same a few days ago, but b2sum is a GNU thing and not available on OpenBSD, for example.
@prologic I was about to post the same a few days ago, but b2sum is a GNU thing and not available on OpenBSD, for example.
@prologic I wanted to wait for things to settle down. It’s still unclear to me in which direction we’re going – and if that new/different stuff is even possible to implement in jenny. That said, I’ve been really busy with private stuff these last few days, I’ve lost track of most of what you’re discussing. 🥴
@prologic I wanted to wait for things to settle down. It’s still unclear to me in which direction we’re going – and if that new/different stuff is even possible to implement in jenny. That said, I’ve been really busy with private stuff these last few days, I’ve lost track of most of what you’re discussing. 🥴
@prologic I wanted to wait for things to settle down. It’s still unclear to me in which direction we’re going – and if that new/different stuff is even possible to implement in jenny. That said, I’ve been really busy with private stuff these last few days, I’ve lost track of most of what you’re discussing. 🥴
@prologic I wanted to wait for things to settle down. It’s still unclear to me in which direction we’re going – and if that new/different stuff is even possible to implement in jenny. That said, I’ve been really busy with private stuff these last few days, I’ve lost track of most of what you’re discussing. 🥴
@prologic If I understand correctly, then this means that twt hashes no longer uniquely refer to one specific twt. When someone talks about #1234567, it could refer to the original or some edit of it. It is up to clients to find out what this hash could mean (by keeping a historical database of all feed versions, basically).

Isn’t this *essentially* the same as only including url and timestamp in the hash?
@prologic If I understand correctly, then this means that twt hashes no longer uniquely refer to one specific twt. When someone talks about #1234567, it could refer to the original or some edit of it. It is up to clients to find out what this hash could mean (by keeping a historical database of all feed versions, basically).

Isn’t this *essentially* the same as only including url and timestamp in the hash?
@prologic If I understand correctly, then this means that twt hashes no longer uniquely refer to one specific twt. When someone talks about #1234567, it could refer to the original or some edit of it. It is up to clients to find out what this hash could mean (by keeping a historical database of all feed versions, basically).

Isn’t this *essentially* the same as only including url and timestamp in the hash?
@prologic If I understand correctly, then this means that twt hashes no longer uniquely refer to one specific twt. When someone talks about #1234567, it could refer to the original or some edit of it. It is up to clients to find out what this hash could mean (by keeping a historical database of all feed versions, basically).

Isn’t this *essentially* the same as only including url and timestamp in the hash?
@lyse The view from the top of the “mountains” never gets old. 😊
@lyse The view from the top of the “mountains” never gets old. 😊
@lyse The view from the top of the “mountains” never gets old. 😊
@lyse The view from the top of the “mountains” never gets old. 😊
@prologic So this hinges on clients keeping a history of the twt hashes. Clients that clean their cache or simply start following a feed later on have no way of reconstructing older twt hash versions and thus no way of reconstructing existing threads. Right?
@prologic So this hinges on clients keeping a history of the twt hashes. Clients that clean their cache or simply start following a feed later on have no way of reconstructing older twt hash versions and thus no way of reconstructing existing threads. Right?
@prologic So this hinges on clients keeping a history of the twt hashes. Clients that clean their cache or simply start following a feed later on have no way of reconstructing older twt hash versions and thus no way of reconstructing existing threads. Right?
@prologic So this hinges on clients keeping a history of the twt hashes. Clients that clean their cache or simply start following a feed later on have no way of reconstructing older twt hash versions and thus no way of reconstructing existing threads. Right?
@prologic Okay. So it goes like this:

My client fetches a feed. It builds a map/hashmap/dictionary of all twts: Timestamps map to twt hashes. It then stores/shows the twts. It also stores the hashmap.

On the next fetch operation, the client re-processes all twts in the feed. It must now compare each timestamp to the previously built hashmap: Aha, timestamp T has now a twt hash of B instead of A, so this is an edited twt.

Did I understand that correctly so far? 🤔