# 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 60515
# self = https://watcher.sour.is?uri=https://twtxt.net/user/prologic/twtxt.txt&offset=56691
# next = https://watcher.sour.is?uri=https://twtxt.net/user/prologic/twtxt.txt&offset=56791
# prev = https://watcher.sour.is?uri=https://twtxt.net/user/prologic/twtxt.txt&offset=56591
@off_grid_living Aww thanks! πŸ€—
There are certainly improvements that can be made to this tool.🀞
There are certainly improvements that can be made to this tool.🀞
Many thanks!
Many thanks!
@aelaraji Have you considered https://git.mills.io/yarnsocial/twtxt2html
@aelaraji Have you considered https://git.mills.io/yarnsocial/twtxt2html
@bender Thanks! πŸ€— -- I know it will 🀣
@bender Thanks! πŸ€— -- I know it will 🀣
Out camping with the family this weekend for my birthday πŸ₯³
Out camping with the family this weekend for my birthday πŸ₯³
I think so πŸ˜… Thanks$!πŸ™‡β€β™‚οΈ
I think so πŸ˜… Thanks$!πŸ™‡β€β™‚οΈ
@aelaraji Hah interesting πŸ€”
@aelaraji Hah interesting πŸ€”
@xuu What's the keyoxide thingy you wrote/built? πŸ€” What's your URI/profile? πŸ€”
@xuu What's the keyoxide thingy you wrote/built? πŸ€” What's your URI/profile? πŸ€”
@aelaraji Sounds like it would work πŸ‘Œ Though I've not tried or invested anytime into proofs and claims type things so far πŸ€”
@aelaraji Sounds like it would work πŸ‘Œ Though I've not tried or invested anytime into proofs and claims type things so far πŸ€”
@aelaraji Nice write up!
@aelaraji Nice write up!
@aelaraji how would that work exactly? Does that mean then that every user is required to have a cox side profile? Who maintains cox site? Is it centralized or decentralized can be relied upon?
@aelaraji how would that work exactly? Does that mean then that every user is required to have a cox side profile? Who maintains cox site? Is it centralized or decentralized can be relied upon?
Ford, the company can honestly go fuck themselves! No one ever asked or even thought to themselves:

> Gee I wish my car would listen to my in-car conversations and serve me ads.

πŸ€¬πŸ€¦β€β™‚οΈ #Ford #Ads
Ford, the company can honestly go fuck themselves! No one ever asked or even thought to themselves:

> Gee I wish my car would listen to my in-car conversations and serve me ads.

πŸ€¬πŸ€¦β€β™‚οΈ #Ford #Ads
@slashdot i'll get fucked! The US patent office should ban this immediately.
@slashdot i'll get fucked! The US patent office should ban this immediately.
@xuu True πŸ˜… I guess it comes down to our risk appetite and the attack vectors we're trying to solve for πŸ€”
@xuu True πŸ˜… I guess it comes down to our risk appetite and the attack vectors we're trying to solve for πŸ€”
@bender yes I agree.
@bender yes I agree.
@bender there is a certain simplicity to that. πŸ˜…
@bender there is a certain simplicity to that. πŸ˜…
@xuu it's not really strictly required if we're just talking about identity though right? If we're talking about encryption then yes I agree rotate and keys becomes very important if you want to have attributes like perfect forward secrecy.
@xuu it's not really strictly required if we're just talking about identity though right? If we're talking about encryption then yes I agree rotate and keys becomes very important if you want to have attributes like perfect forward secrecy.
@xuu that could work too, but that requires a random value, a set of keys and signature verification of the value, which I don't really have a problem with.
@xuu that could work too, but that requires a random value, a set of keys and signature verification of the value, which I don't really have a problem with.
@xuu yes I'm less concerned about solving the integrity part of the problem of whether we can trust that the content of a feed is actually written by certain author, however, that's not to say that we shouldn't think about also leveraging keys to be able to do that maybe it's an optional feature?
@xuu yes I'm less concerned about solving the integrity part of the problem of whether we can trust that the content of a feed is actually written by certain author, however, that's not to say that we shouldn't think about also leveraging keys to be able to do that maybe it's an optional feature?
What were the recommended mitigations?
What were the recommended mitigations?
IMO we just have to fix the identity problem and figure out how to detect or support edits.
IMO we just have to fix the identity problem and figure out how to detect or support edits.
@sorenpeter No, this is what I want to avoid. For many reasons I stated before, content addressing or hashing is far better here for threading in a decentralized way.
@sorenpeter No, this is what I want to avoid. For many reasons I stated before, content addressing or hashing is far better here for threading in a decentralized way.
@lyse I personally think that we just go with a magic timestamp approach. It's simpler and easier to implement across the major clients that are still actively developed.

The question is how much time do we give ourselves as we're all a bit time poor and I can't imagine we would do this quickly.
@lyse I personally think that we just go with a magic timestamp approach. It's simpler and easier to implement across the major clients that are still actively developed.

The question is how much time do we give ourselves as we're all a bit time poor and I can't imagine we would do this quickly.
@movq if you do win the lottery, don't forget to include us so we can all join in and share the things that we like to tinker with instead of this whole rat race. 🀣
@movq if you do win the lottery, don't forget to include us so we can all join in and share the things that we like to tinker with instead of this whole rat race. 🀣
@bender Big photo capability upgrade?
@bender Big photo capability upgrade?
@aelaraji Nice hack! πŸ‘Œ
@aelaraji Nice hack! πŸ‘Œ
@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 πŸ˜…
@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
@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 πŸ˜…
@movq That bad eh? πŸ˜…
@movq That bad eh? πŸ˜…
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 😒
@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.
@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? 🀣
@movq True πŸ‘Œ
@movq True πŸ‘Œ
@movq Tbey all hate me for stomping on their precious dear twtxt 🀣
@movq Tbey all hate me for stomping on their precious dear twtxt 🀣
@lyse Hmmm interesting idea πŸ€”
@lyse Hmmm interesting idea πŸ€”
On the Subject of Feed Identities; I propose the following:

1. Generate a Private/Public ED25519 key pair
2. Use this key pair to sign your Twtxt feed
3. Use it as your feed's identity in place of # url = as # key = ...

For example:

e
$ ssh-keygen -f prologic@twtxt.net
$ ssh-keygen -Y sign -n prologic@twtxt.net -f prologic@twtxt.net twtxt.txt


And your feed would looke like:


# nick        = prologic
# key         = SHA256:23OiSfuPC4zT0lVh1Y+XKh+KjP59brhZfxFHIYZkbZs
# sig         = twtxt.txt.sig
# prev        = j6bmlgq twtxt.txt/1
# avatar      = https://twtxt.net/user/prologic/avatar#gdoicerjkh3nynyxnxawwwkearr4qllkoevtwb3req4hojx5z43q
# description = "Problems are Solved by Method" πŸ‡¦πŸ‡ΊπŸ‘¨β€πŸ’»πŸ‘¨β€πŸ¦―πŸΉβ™” πŸ“βš― πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘§πŸ›₯ -- James Mills (operator of twtxt.net / creator of Yarn.social 🧢)

2024-06-14T18:22:17Z	(#nef6byq) @<bender https://twtxt.net/user/bender/twtxt.txt>  Hehe thanks! πŸ˜… Still gotta sort out some other bugs, but that's tomorrows job 🀞
...


Twt Hash extension would change of course to use a feed's ED25519 public key fingerprint.
On the Subject of Feed Identities; I propose the following:

1. Generate a Private/Public ED25519 key pair
2. Use this key pair to sign your Twtxt feed
3. Use it as your feed's identity in place of # url = as # key = ...

For example:

e
$ ssh-keygen -f prologic@twtxt.net
$ ssh-keygen -Y sign -n prologic@twtxt.net -f prologic@twtxt.net twtxt.txt


And your feed would looke like:


# nick        = prologic
# key         = SHA256:23OiSfuPC4zT0lVh1Y+XKh+KjP59brhZfxFHIYZkbZs
# sig         = twtxt.txt.sig
# prev        = j6bmlgq twtxt.txt/1
# avatar      = https://twtxt.net/user/prologic/avatar#gdoicerjkh3nynyxnxawwwkearr4qllkoevtwb3req4hojx5z43q
# description = "Problems are Solved by Method" πŸ‡¦πŸ‡ΊπŸ‘¨β€πŸ’»πŸ‘¨β€πŸ¦―πŸΉβ™” πŸ“βš― πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘§πŸ›₯ -- James Mills (operator of twtxt.net / creator of Yarn.social 🧢)

2024-06-14T18:22:17Z\t(#nef6byq) @<bender https://twtxt.net/user/bender/twtxt.txt>  Hehe thanks! πŸ˜… Still gotta sort out some other bugs, but that's tomorrows job 🀞
...


Twt Hash extension would change of course to use a feed's ED25519 public key fingerprint.
On the Subject of Feed Identities; I propose the following:

1. Generate a Private/Public ED25519 key pair
2. Use this key pair to sign your Twtxt feed
3. Use it as your feed's identity in place of # url = as # key = ...

For example:

e
$ ssh-keygen -f prologic@twtxt.net
$ ssh-keygen -Y sign -n prologic@twtxt.net -f prologic@twtxt.net twtxt.txt


And your feed would looke like:


# nick        = prologic
# key         = SHA256:23OiSfuPC4zT0lVh1Y+XKh+KjP59brhZfxFHIYZkbZs
# sig         = twtxt.txt.sig
# prev        = j6bmlgq twtxt.txt/1
# avatar      = https://twtxt.net/user/prologic/avatar#gdoicerjkh3nynyxnxawwwkearr4qllkoevtwb3req4hojx5z43q
# description = "Problems are Solved by Method" πŸ‡¦πŸ‡ΊπŸ‘¨β€πŸ’»πŸ‘¨β€πŸ¦―πŸΉβ™” πŸ“βš― πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘§πŸ›₯ -- James Mills (operator of twtxt.net / creator of Yarn.social 🧢)

2024-06-14T18:22:17Z	(#nef6byq) @<bender https://twtxt.net/user/bender/twtxt.txt>  Hehe thanks! πŸ˜… Still gotta sort out some other bugs, but that's tomorrows job 🀞
...


Twt Hash extension would change of course to use a feed's ED25519 public key fingerprint.
@aelaraji My work has this thing called "compressed work", where you can buy extra time off (_as much as 4 additional weeks_) per year. It comes out of your pay though, so it's not exactly a 4-day work week but it could be useful, just haven't tired it yet as I'm not entirely sure how it'll affect my net pay
@aelaraji My work has this thing called "compressed work", where you can buy extra time off (_as much as 4 additional weeks_) per year. It comes out of your pay though, so it's not exactly a 4-day work week but it could be useful, just haven't tired it yet as I'm not entirely sure how it'll affect my net pay
@bender Yes, they do 🀣 Implicitly, or threading would never work at all πŸ˜… Nor lookups 🀣 They are used as keys. Think of them like a primary key in a database or index. I totally get where you're coming from, but there are trade-offs with using Message/Thread Ids as opposed to Content Addressing (_like we do_) and I believe we would just encounter other problems by doing so.

My money is on extending the Twt Subject extension to support more (_optional_) advanced "subjects"; i.e: indicating you edited a Twt you already published in your feed as @falsifian indicated πŸ‘Œ

Then we have a secondary (_bure much rarer_) problem of the "identity" of a feed in the first place. Using the URL you fetch the feed from as @lyse 's client tt seems to do or using the # url = metadata field as every other client does (_according to the spec_) is problematic when you decide to change where you host your feed. In fact the spec says:

> Users are advised to not change the first one of their urls. If they move their feed to a new URL, they should add this new URL as a new url field.

See Choosing the Feed URL -- This is one of our longest debates and challenges, and I _think_ (_I suspect along with @xuu _) that the right way to solve this is to use public/private key(s) where you _actually_ have a public key fingerprint as your feed's unique identity that never changes.
@bender Yes, they do 🀣 Implicitly, or threading would never work at all πŸ˜… Nor lookups 🀣 They are used as keys. Think of them like a primary key in a database or index. I totally get where you're coming from, but there are trade-offs with using Message/Thread Ids as opposed to Content Addressing (_like we do_) and I believe we would just encounter other problems by doing so.

My money is on extending the Twt Subject extension to support more (_optional_) advanced "subjects"; i.e: indicating you edited a Twt you already published in your feed as @falsifian indicated πŸ‘Œ

Then we have a secondary (_bure much rarer_) problem of the "identity" of a feed in the first place. Using the URL you fetch the feed from as @lyse 's client tt seems to do or using the # url = metadata field as every other client does (_according to the spec_) is problematic when you decide to change where you host your feed. In fact the spec says:

> Users are advised to not change the first one of their urls. If they move their feed to a new URL, they should add this new URL as a new url field.

See Choosing the Feed URL -- This is one of our longest debates and challenges, and I _think_ (_I suspect along with @xuu _) that the right way to solve this is to use public/private key(s) where you _actually_ have a public key fingerprint as your feed's unique identity that never changes.
@aelaraji Join the club! 🀣 How about more days in a weekend?! 😱 Bringon #FourDayWorkWeek !!! 🀣
@aelaraji Join the club! 🀣 How about more days in a weekend?! 😱 Bringon #FourDayWorkWeek !!! 🀣
@bender Haha, easy to demonstrate. I'll start an email thread with myself, then you see if you can join in 🀣
@bender Haha, easy to demonstrate. I'll start an email thread with myself, then you see if you can join in 🀣
We _can_ also make use of comments in the feed to build support for detecting/declaring Twts(s) were edited in a feed that are ignored by clients that don't understand the comments. By design clients ignore comments anyway, but the parser we build for yarnd (_which I'd love to turn into a C library that others can just import_) can do some interesting things here. @xuu can probably talk more on this...
We _can_ also make use of comments in the feed to build support for detecting/declaring Twts(s) were edited in a feed that are ignored by clients that don't understand the comments. By design clients ignore comments anyway, but the parser we build for yarnd (_which I'd love to turn into a C library that others can just import_) can do some interesting things here. @xuu can probably talk more on this...