# 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 196263
# self = https://watcher.sour.is?offset=172756
# next = https://watcher.sour.is?offset=172856
# prev = https://watcher.sour.is?offset=172656
@doesnm No.

> iirc in twtxt v2 it starts prohibited

This is not true. There are no issues supporting fetching feeds via Gemini/Gopher. This is totally fine. What will likely happen is "recommendations" and "drawbacks of using Gemini/Gopher"
[47°09′52″S, 126°43′54″W] Dosimeter malfunction
I mean thread command but bash escapes quoted as command...
Ok, i know how to command working (not sure), but seems it only grab from cache. Maybe make fetch from twtxt.net if hash not found?
@prologic Regarding the new way of generating twt-hashes, to me it makes more sense to use tabs as separator instead of spaces, since the you can just copy/past a line directly from a twtxt-file that already go a tab between timestamp and message. But tabs might be hard to "type" when you are in a terminal, since it will activate autocomplete...🤔

Another thing, it seems that you sugget we only use the domain in the hash-creation and not the full path to the twtxt.txt

$ echo -e "https://example.com 2024-09-29T13:30:00Z Hello World!" | sha256sum - | awk '{ print $1 }' | base64 | head -c 12
@prologic Regarding the new way of generating twt-hashes, to me it makes more sense to use tabs as separator instead of spaces, since the you can just copy/past a line directly from a twtxt-file that already go a tab between timestamp and message. But tabs might be hard to "type" when you are in a terminal, since it will activate autocomplete...🤔

Another thing, it seems that you sugget we only use the domain in the hash-creation and not the full path to the twtxt.txt

$ echo -e "https://example.com 2024-09-29T13:30:00Z Hello World!" | sha256sum - | awk '{ print $1 }' | base64 | head -c 12
@prologic Regarding the new way of generating twt-hashes, to me it makes more sense to use tabs as separator instead of spaces, since the you can just copy/past a line directly from a twtxt-file that already go a tab between timestamp and message. But tabs might be hard to "type" when you are in a terminal, since it will activate autocomplete...🤔

Another thing, it seems that you sugget we only use the domain in the hash-creation and not the full path to the twtxt.txt

$ echo -e "https://example.com 2024-09-29T13:30:00Z Hello World!" | sha256sum - | awk '{ print $1 }' | base64 | head -c 12
@prologic Regarding the new way of generating twt-hashes, to me it makes more sense to use tabs as separator instead of spaces, since the you can just copy/past a line directly from a twtxt-file that already go a tab between timestamp and message. But tabs might be hard to "type" when you are in a terminal, since it will activate autocomplete...🤔

Another thing, it seems that you sugget we only use the domain in the hash-creation and not the full path to the twtxt.txt

$ echo -e "https://example.com 2024-09-29T13:30:00Z Hello World!" | sha256sum - | awk '{ print $1 }' | base64 | head -c 12
should i delete gemini support from twet? iirc in twtxt v2 it starts prohibited. And all of my fields are https
Really you stopped 22hrs ago? https://twtxt.net/twt/iaautmq
Really you stopped 22hrs ago? https://twtxt.net/twt/iaautmq
Hmm da fuq?! @tiktok ?
Hmm da fuq?! @tiktok ?
[47°09′42″S, 126°43′43″W] 4182 days without news from Herve
**** ⌘ Read more****
[47°09′24″S, 126°43′56″W] Saalmi, retransmit, please
@bender I see it here hmm 🤔 Dis you accidentally mute your own Twt?
@bender I see it here hmm 🤔 Dis you accidentally mute your own Twt?
ryudo v1.6, less is more | https://nilfm.cc/ryudo.html
🧮 USERS:1 FEEDS:2 TWTS:1108 ARCHIVED:79604 CACHE:2650 FOLLOWERS:17 FOLLOWING:14
A silly little toy for browsing 8 little fractal programs: https://merveilles.town/@akkartik/113223478101430311
A silly little toy for browsing 8 little fractal programs: https://merveilles.town/@akkartik/113223478101430311
+1 👆
+1 👆
+1 👆
@doesnm me too! 🤭 (kidding, kidding!)
@off_grid_living is it locked because of a DRM thing or something else?

Otherwise you can check if you already have the pdftotext command that comes with the poppler-utils package, try converting converting the pdf into a text file and copy to your heart's content. I have just tried it myself.

If you don't have it already here's what you can do on Ubuntu or any Debian based distribution of Linux:

- Update and upgrade your packages:
> sudo apt update && sudo apt upgrade
- Install the poppler-utils package
> sudo apt install poppler-utils
- Now you can convert your pdf to txt file with:
> pdftotxt -layout -enc UTF-8 name_of_source_file.pdf name_of_destination_file.txt

You can always do a pdftotxt --help to see the rest of possible options.
Hope this helps.
@off_grid_living is it locked because of a DRM thing or something else?

Otherwise you can check if you already have the pdftotext command that comes with the poppler-utils package, try converting converting the pdf into a text file and copy to your heart's content. I have just tried it myself.

If you don't have it already here's what you can do on Ubuntu or any Debian based distribution of Linux:

- Update and upgrade your packages:
> sudo apt update && sudo apt upgrade
- Install the poppler-utils package
> sudo apt install poppler-utils
- Now you can convert your pdf to txt file with:
> pdftotxt -layout -enc UTF-8 name_of_source_file.pdf name_of_destination_file.txt

You can always do a pdftotxt --help to see the rest of possible options.
Hope this helps.
@off_grid_living is it locked because of a DRM thing or something else?

Otherwise you can check if you already have the pdftotext command that comes with the poppler-utils package, try converting converting the pdf into a text file and copy to your heart's content. I have just tried it myself.

If you don't have it already here's what you can do on Ubuntu or any Debian based distribution of Linux:

- Update and upgrade your packages:
> sudo apt update && sudo apt upgrade
- Install the poppler-utils package
> sudo apt install poppler-utils
- Now you can convert your pdf to txt file with:
> pdftotxt -layout -enc UTF-8 name_of_source_file.pdf name_of_destination_file.txt

You can always do a pdftotxt --help to see the rest of possible options.
Hope this helps.
No, im just crazy (joke)
@off_grid_living mind sharing the PDF, to take a look? Some PDF containing text as images, which makes it more difficult to complete the task you want to perform.
[47°09′28″S, 126°43′12″W] Re-taking samples
@doesnm am I understanding correctly that you do not have a desktop/laptop computer, but a pocket Android based one?
@doesnm that was a quick and dirty thing I wanted to try 😄 but of course, you can point it wherever you believe it should.
@doesnm that was a quick and dirty thing I wanted to try 😄 but of course, you can point it wherever you believe it should.
@doesnm that was a quick and dirty thing I wanted to try 😄 but of course, you can point it wherever you believe it should.
Lol, good but why why not /data/data/com.termux/files/usr/tmp?
#catsoftwtxt
#catsoftwtxt
/https://baldo.cat/media/photos/IMG_2167.jpeg) #catsoftwtxt
[47°09′47″S, 126°43′15″W] Reading: 0.72 Sv
I believe I'd missed an f:


f
~/src/jenny $ git diff
diff --git a/jenny b/jenny
index ada8da2..8ae9a06 100755
--- a/jenny
+++ b/jenny
@@ -1194,7 +1194,7 @@ if __name__ == '__main__':
     if args.edit:
	edit_twt_file(app)
     elif args.fetch:
-        with DirectoryLock(f'/tmp/jenny-{getuser()}.run'):
+        with DirectoryLock(expanduser(f'~/tmp/jenny-{getuser()}.run')):
             retrieve_all(app)
     elif args.last_seen:
	 print('Feeds last seen at (times are local time), oldest first:')
I believe I'd missed an f:


f
~/src/jenny $ git diff
diff --git a/jenny b/jenny
index ada8da2..8ae9a06 100755
--- a/jenny
+++ b/jenny
@@ -1194,7 +1194,7 @@ if __name__ == '__main__':
     if args.edit:
	edit_twt_file(app)
     elif args.fetch:
-        with DirectoryLock(f'/tmp/jenny-{getuser()}.run'):
+        with DirectoryLock(expanduser(f'~/tmp/jenny-{getuser()}.run')):
             retrieve_all(app)
     elif args.last_seen:
	 print('Feeds last seen at (times are local time), oldest first:')
I believe I'd missed an f:


f
~/src/jenny $ git diff
diff --git a/jenny b/jenny
index ada8da2..8ae9a06 100755
--- a/jenny
+++ b/jenny
@@ -1194,7 +1194,7 @@ if __name__ == '__main__':
     if args.edit:
\tedit_twt_file(app)
     elif args.fetch:
-        with DirectoryLock(f'/tmp/jenny-{getuser()}.run'):
+        with DirectoryLock(expanduser(f'~/tmp/jenny-{getuser()}.run')):
             retrieve_all(app)
     elif args.last_seen:
\t print('Feeds last seen at (times are local time), oldest first:')
@doesnm I've just given it a try on android/termux and got it to work, I can't promise it won't break something else (because i definitely don't know what I'm doing) but here's what I broke 😅:

f
~/src/jenny $ git diff
diff --git a/jenny b/jenny
index ada8da2..8ae9a06 100755
--- a/jenny
+++ b/jenny
@@ -1194,7 +1194,7 @@ if __name__ == '__main__':
     if args.edit:
	edit_twt_file(app)
     elif args.fetch:
-        with DirectoryLock(f'/tmp/jenny-{getuser()}.run'):
+        with DirectoryLock(expanduser('~/tmp/jenny-{getuser()}.run')):
             retrieve_all(app)
     elif args.last_seen:
	 print('Feeds last seen at (times are local time), oldest first:')


and of course make sure you mkdir ~/tmp~
@doesnm I've just given it a try on android/termux and got it to work, I can't promise it won't break something else (because i definitely don't know what I'm doing) but here's what I broke 😅:

f
~/src/jenny $ git diff
diff --git a/jenny b/jenny
index ada8da2..8ae9a06 100755
--- a/jenny
+++ b/jenny
@@ -1194,7 +1194,7 @@ if __name__ == '__main__':
     if args.edit:
	edit_twt_file(app)
     elif args.fetch:
-        with DirectoryLock(f'/tmp/jenny-{getuser()}.run'):
+        with DirectoryLock(expanduser('~/tmp/jenny-{getuser()}.run')):
             retrieve_all(app)
     elif args.last_seen:
	 print('Feeds last seen at (times are local time), oldest first:')


and of course make sure you mkdir ~/tmp~
@doesnm I've just given it a try on android/termux and got it to work, I can't promise it won't break something else (because i definitely don't know what I'm doing) but here's what I broke 😅:

f
~/src/jenny $ git diff
diff --git a/jenny b/jenny
index ada8da2..8ae9a06 100755
--- a/jenny
+++ b/jenny
@@ -1194,7 +1194,7 @@ if __name__ == '__main__':
     if args.edit:
\tedit_twt_file(app)
     elif args.fetch:
-        with DirectoryLock(f'/tmp/jenny-{getuser()}.run'):
+        with DirectoryLock(expanduser('~/tmp/jenny-{getuser()}.run')):
             retrieve_all(app)
     elif args.last_seen:
\t print('Feeds last seen at (times are local time), oldest first:')


and of course make sure you mkdir ~/tmp~
Rightfully so, @xuu pod has it on cache: https://txt.sour.is/twt/v6eemvq. This pod (twtxt.net), knows nothing about it, so it seems.
Hamming's *The Art of Doing Science and Engineering* is definitely up on my reading list.
Blown away by the elegance of Hamming codes for error detection. Pure beauty. The folks at Bell Labs were such legends of their craft.
I don’t see it on the client (Yarn), but as you can see it is on the raw feed. 🧐
@prologic I wonder where did this one went to:


2024-09-29T12:08:15Z	(#7wdvhia) @<lyse https://lyse.isobeef.org/twtxt.txt> love 27! Is that your town as seeing from the mountain, or some other town? From 395 to 40 is quite some picking! I figure that’s the most difficult part, right?

Ah, 16°C… what dreams are made of! 😍
@prologic I wonder where did this one went to:


2024-09-29T12:08:15Z\t(#7wdvhia) @<lyse https://lyse.isobeef.org/twtxt.txt> love 27! Is that your town as seeing from the mountain, or some other town? From 395 to 40 is quite some picking! I figure that’s the most difficult part, right?

Ah, 16°C… what dreams are made of! 😍
@movq Hmmm 🤔 Intuitively I say "No they're not the same"; but let me sleep on it 🙏😴
@movq Hmmm 🤔 Intuitively I say "No they're not the same"; but let me sleep on it 🙏😴
@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?
@bender Just once I tell ya:

> Ah, 16°C… what dreams are made of! 😍

I'd like it to be a nice cool 16°C here 🤣
@bender Just once I tell ya:

> Ah, 16°C… what dreams are made of! 😍

I'd like it to be a nice cool 16°C here 🤣
@lyse love 27! Is that your town as seeing from the mountain, or some other town? From 395 to 40 is quite some picking! I figure that’s the most difficult part, right?

Ah, 16°C… what dreams are made of! 😍
@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. 😊
Personally I don't see it as a problem. I didn't even really see edits as a problem either tbh, but this is just an incremental improvement I think.
Personally I don't see it as a problem. I didn't even really see edits as a problem either tbh, but this is just an incremental improvement I think.
It's no worse than what we have now, it's better. But yes caveats still apply.
It's no worse than what we have now, it's better. But yes caveats still apply.
@movq Yup.
@movq Yup.
@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?
@slashdot No 😅
@slashdot No 😅
@doesnm I think it's a good idea to fork twet and continue to improve it. It's an "okay" Twtxt cli client, but it needs a bit more work 👌
@doesnm I think it's a good idea to fork twet and continue to improve it. It's an "okay" Twtxt cli client, but it needs a bit more work 👌
@doesnm Sorry I meant twet 🤦‍♂️
@doesnm Sorry I meant twet 🤦‍♂️
@lyse See @movq 's undersanding. Now this had some edge cases that we agreed probably aren't worth solving for.
@lyse See @movq 's undersanding. Now this had some edge cases that we agreed probably aren't worth solving for.
@movq Yes 👍
@movq Yes 👍
What a sunny Sunday. I'm going to harvest the apples from the garden.
What a sunny Sunday. I'm going to
[47°09′10″S, 126°43′38″W] Transfer aborted
@prologic I'm afraid, I don't understand how the edit detection works so that it does not break threads. All I see is that some hash in a subject is missing.
It has twts cache which used if timeline is set to jew. Maybe i.should fork twet to make wishes like newlines (i see two squares), showing conversations, showing twts if not found in cache and parsing medata to configure url, nick and followers (currenly it duplicated in config and twtxt file)
@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? 🤔
@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? 🤔
@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? 🤔
@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? 🤔
Thank you very much, @prologic! <3 When leaving the unpleasant towns, one can really enjoy the stunning landscape here. Very refreshing.

Yep, these are some sick mushrooms. No idea what they are, though. Not sure if they're edible more than once or not, but I have a feeling that one should refrain from trying. The ones I photographed here were in a nature reserve. They were a bit bigger than the others we came across on meadows. Still impressive sizes nevertheless.
@lyse Pretty nice views 👌 I enjoyed reading this. It was though I were there in the morning walking with you guys up to the summit man those mushrooms really are quite some aren't they? 🙃
@lyse Pretty nice views 👌 I enjoyed reading this. It was though I were there in the morning walking with you guys up to the summit man those mushrooms really are quite some aren't they? 🙃