# 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=60391
# next = https://watcher.sour.is?uri=https://twtxt.net/user/prologic/twtxt.txt&offset=60491
# prev = https://watcher.sour.is?uri=https://twtxt.net/user/prologic/twtxt.txt&offset=60291
@quark I know! I saw three Hacker News posts on it in a row 🀣
@andros Haha 🀣 We've explored this idea in the past and we decided that it's _actually_ a good idea to have an "append-only" feed for various reasons. We've also explored the idea of using Range requests, but opted instead to just archive/rotate our feeds periodically πŸ˜… There really isn't much point in having a feed in reverse chronological order, except (_maybe?_) so a human read view the new twts at the top of the file?! 🀣_
@bender This is just a website that cycles through random Youtube channels? πŸ€”
I guess mentions with .(s) / dot(s) like @eapl.me are valid? πŸ€” Or nicks even? πŸ€”
Fark Youtube is so utterly boring πŸ₯±
@bender Ahh yes you caught me 🀣
@bender Not copy/paste 🀣 Hand on heart! ❀️ However it was a pretty nice article πŸ˜…
Getting Forked by Microsoft β€’ Philip Laine πŸ‘ˆ Yet another pretty sad story of a megacorp (_Microsoft_) being total assholes 😒
Regex Isn't Hard - Tim Kellogg πŸ‘ˆ this is a pretty good conscience article on regexes, and I agree, regex isn't that hardβ„’ -- However I _think_ I can make the TL;DR even shorter πŸ˜…

----

Regex core subset (portable across languages):

Character sets
β€’ a matches β€œa”
β€’ [a-z] any lowercase
β€’ [a-zA-Z0-9] alphanumeric
β€’ [^ab] any char but a or b

Repetition (applies to the preceding atom)
β€’ ? zero or one
β€’ * zero or more
β€’ + one or more

Groups
β€’ (ab)+ matches β€œab”, β€œabab”, …
β€’ Capture for extract/substitute via $1 or \1

Operators
β€’ foo|bar = foo or bar
β€’ ^ start anchor
β€’ $ end anchor

Ignore non‑portable shortcuts: \w, ., {n}, *?, lookarounds.

#regex101=
@bender No worries πŸ˜‰
There we go. Restored all the old settings πŸ‘Œ
@bender Lemme look at the old backup...
@bender

> I am up to increase the length of a twtxt, though.

Recall what we had this set to for this pod? 🧐
@bender Really? Wow! πŸ˜‚
@bender Hah 🀣
Just had a freak storm β›ˆοΈ with lots of horizontal rain β˜”οΈ that took out and tripped our internal RCD (_again_) 😱 Took out our Fibre too (_servers were fine, good 'ol UPS_). Need to get a UPS for the Fibre box πŸ“¦ Haha 🀣
@movq So cool! 😎 Where's the time lapse video you used to have of this tree? 🌳 Hmm 🧐
@movq Yeah I know 🀣 I found another bug in lextwt πŸ€¦β€β™‚οΈ This whole DM / bang-mention thingy has thrown a spanner in the works πŸ”§ -- Even if I wanted to implement it, I'm not even ready to try at the moment 😒
@kate (_as I was trying to say..._), Glad you think soπŸ‘Œ My goal with Yarn.social has always been to provide the best (_best that I can anyway_) truly decentralised (_slow_) social experience that uses the Twtxt format under the hood πŸ˜…
@xuu As I also mentioend on IRC I _think_ this is a. bug?
Holy hell?! When I post this:


@<kate https://yarn.girlonthemoon.xyz/user/kat/twtxt.txt> Glad you think so! πŸ‘Œ My goal with Yarn.social has always been to provide the best (_best that I can anyway!_) truly decentralised (_slow_) social experience that uses the Twtxt format under the hood πŸ˜…


Something is swallowing it.
@kate Glad you think so! πŸ‘Œ My goal with Yarn.social has always been to provide the best (_best that I can anyway!_) truly decentralised (_slow_) social experience that uses the Twtxt format under the hood πŸ˜…
What if I do this...
Nope hmmm
What about here?
Okay they're not here...
Why are my replies getting swallowed?! πŸ€”
Glad you think so! πŸ‘Œ My goal with Yarn.social has always been to provide the best (_best that I can anyway!_) truly decentralised (_slow_) social experience that uses the Twtxt format under the hood πŸ˜…
@kate Glad you think so! πŸ‘Œ My goal with Yarn.social has always been to provide the best (_best that I can anyway!_) truly decentralised (_slow_) social experience that uses the Twtxt format under the hood πŸ˜…
Hmmm?
Hmmm?
@kate Glad you think so! πŸ‘Œ My goal with Yarn.social has always been to provide the best (_best that I can anyway!_) truly decentralised (_slow_) social experience that uses the Twtxt format under the hood πŸ˜…
This expands the usefulness of Twtxt / Yarn.social to:

- Sharing small posts
- Sharing links
- Sharing media
- Having long conversations
- Voting on topics, opinions or decisions
- RSVPing to virtual or physical events
The nice thing here is that any Ui/UX rendering for a "good user experience" is similar to what yarnd does for Youtube/Spotify/whatever embedding. Plus anyone can participate, even if they don't really have a client that understand it, it's just text with some "syntax" afterall.
#event:abc123 RSVP: yes +1
#event:abc123 Go Meetup – Sat Apr 27, 3pm @ Darling Harbour
#poll:xyz123 Vote: None
#poll:xyz123 Favorite Go framework?
- Gin
- Echo
- Chi
I'd have to write i up in full, but essentially looks a bit like this (_contribived examples follow_)...
πŸ’‘ I had this crazy idea (_or is it?_) last night while thinking about Twtxt and Yarn.social πŸ˜… There are two things I _think_ that _could_ be really useful additions to the yarnd UI/UX experience (_for those that use it_) and as "client" features (_not spec changes_). The two ideas are quite simple:

- Voting -- a way to cast, collect a vote on a decision, topic or opinion.
- RSVP -- a way to "rsvp" to a virtual (_pr physical_) event.

Both would use "plain text" on top of the way we already use Twtxt today and clients would render an appropriate UI/UX._
@bender I _think_ I could, but I haven't bothered to do so yet... I'll try that out later...
@kate You're welcome πŸ˜‡
@bender Hehe, thanks for fixing this (_was_) broken thread 🧡 Haha 🀣
@sorenpeter I really think you should fix the # url in your feed to be https:// πŸ˜…
@bender Sure! πŸ‘


{
    ...
   # Layer 4 Reverse Proxy
   layer4 {
      # Gopher
      0.0.0.0:70 {
         route {
            proxy <internal_ip>:70
         }
      }

      # IRC (TLS)
      0.0.0.0:6697 {
         route {
            proxy <internal_ip>:6697
         }
      }
   }
}
Am I the only one that's confused by the discussions, and then the voting we had on the whole threading model? πŸ€” I'm not even sure what I voted for, but I know it wasn't the one that won haha 🀣 (_which I'm still very much against for based on an intuition, experience and lots of code writing lately_).
@xuu Good point! 🀣
OH nevermind. Ignore me. I _think_ @sorenpeter's feed is a bit weird. Because his url is http:// but he actually hosts a https:// feed with redirects. so things get a bit weird 😒
e.g: @sorenpeter
@bender I noticed that although the Discover view (_and your own Timeline_) is much improved with a MaxAgeDays configuration at the pod level, that now _some_ profiles are rather empty. This is only because well, they're a bit "inactive" so to speak πŸ—£οΈ Not sure what to do about this at the moment... Open to ideas? πŸ’‘
@bender According to his @buckket Github profile, I _belive_ so.
There are other tasks LLM(s) are _far_ better suited for, which are also its downsides, and gawd so expensive and unrealistic to run yourself πŸ€¦β€β™‚οΈ Do you know what one of these NVIDIA H100's cost? πŸ’² That's right! 🀣 > $50k USD 😱 And many of the models out there require 8 of these suckers 🀣 Each one consumes around ~400W of power each (_not including the machine that houses them!_)~
@movq Yeah I couldn't agree more. The utility of using it in any way to form "truths" or to do anything that require a high degree of "accuracy" is utterly pointless.
@lyse Very nice! 😊 You must love those yellow dandelions? πŸ€”
But it is still a giant inefficient use of resources and energy 🀣
AI isn’t a shortcut for thinking. In her guide for skeptics, Hilary Gridley reframes AI as a collaboratorβ€”not a replacement. Use it like spellcheck for your thoughts. Don’t fear itβ€”iterate with it. Insight improves, speed follows. Full post: https://hils.substack.com/p/the-ai-skeptics-guide-to-ai-collaboration
@movq Haha 🀣 Figures πŸ€¦β€β™‚οΈ Also no need to be concerned with that here, I've personally blocked the ASN(s) of Microsoft, OpenAI, Claude and Google πŸ˜‚
@movq Yeah πŸ‘ Haha 🀣 Does your own cache go back this far? πŸ€”
Ahh so I was _partially_ right 🀣
@movq Apparently that is @buckket's name? πŸ€”
Hmmm there's a bug somewhere in the way I'm ingesting archived feeds πŸ€”


sqlite> select * from twts where content like 'The web is such garbage these days%';
      hash = 37sjhla
  feed_url = https://twtxt.net/user/prologic/twtxt.txt/1
   content = The web is such garbage these days πŸ˜” Or is it the garbage search engines? πŸ€”
   created = 2024-11-14T01:53:46Z
created_dt = 2024-11-14 01:53:46
   subject = #37sjhla
  mentions = []
      tags = []
     links = []
sqlite>
@movq It's nice to see shit like this still works 🀣 Even years later πŸ˜‚
@bender Yup πŸ‘
I do want to improve the feeds.twtxt.net service one day (_soonβ„’_) with features like this. But first I'll have to prevent spammers from abusing it by introducing IndieAuth as an authentication layer._
Btw @andros ; The automated feed you put together for Hacker News... Does it at any point rewrite parts of the feed as it goes along? πŸ€” I've had to unfollow it because I've found in practise it makes a twt, then seems to modify that same twt (_observed by content manually_) at least twice. This ends up becoming effectively an "Edit" and essentially duplicate (_looking_) posts 😒
@bender Shall we remove this primary/secondary color sttting? 🧐
@bender Btw, do we want to nuke this compact feature? 🧐
@bender How do you mean? 🧐 Caddy doesn't do L4 by default.
@kate I _think_ it's totally fine. I mean self-hosting costs money too. Power, Hardware, Time/effort, etc.
@bender I recommend this also πŸ‘Œ My eris was based off of a much much older version of ergo.
@kate I already have my IRC server irc.mills.io running behind Caddy Layer 4. However I don't terminate TLS at the edge in this case.
it is infininately simpler to run/operate 🀣
@kate @movq You could also have a play with eris which I use to power my little tiny server (_that almost no-one uses 🀣_)_
@bender Ahh okay, I must have misread the website πŸ€”
Seem like it's a server-client thingy? πŸ€” I much prefer tools in this case and defer the responsibility of storage to something else. I really like restic for that reason and the fact that it's pretty rock solid. I have zero complaints πŸ˜…
@bender Hahahahaha 🀣🀣🀣
Timeline of Evolution of Twtxt/Yarn.social**:

- 2016 – Twtxt created by John Downey: plain text + HTTP = minimalist microblogging
- 2017–2019 – Community builds CLI tools, but adoption remains niche
- 2020 – Yarn.social launched by @prologic with federation, threading, UI
- 2021–2023 – Pods sync, user mentions, blocking, search, and media support added
- 2024+ – Yarn.social becomes the reference Twtxt platform, with active federated pods
=
I asked ChatGPT what it knows about Twtxt πŸ˜‚ And surprisingly it's rather accurate:

> Twtxt is a minimalist, decentralized microblogging format introduced by John Downey in 2016. It uses plain text files served over HTTPβ€”no accounts, databases, or APIs.
In 2020, James Mills (@prologic) launched Yarn.social, an extended, federated implementation with user discovery, threads, mentions, and a full web UI.
Both share the same .twtxt.txt format but differ in complexity and social features.
@bender LOL 🀣
Oh hey @rrraksamam πŸ‘‹ Welcome back! πŸ™Œ Sorry about the data loss 🀯
@movq From what I can tell, they use strict semantic versioning and backwards compatibility. There are two versions of the storage, v1 and v2, but it doesn't look like v2 is enabled yet.
@movq LOL πŸ˜‚
B
A
@aelaraji Haha 🀣 I'd say it's just yet-another-bad-bot πŸ€– I've blocked a lot of such bots and often their entire networks (ASN) πŸ€¦β€β™‚οΈ
I use restic and Backblaze B2 for offline backup storage at a cost of $6/TB/month. I don't backup my entire ~20TB NAS and its datasets however, so I'm only paying about ~$2/month right now. I only backup the most important things I cannot afford to lose or annot re-created.
Yes
@javivf merged in to the repo of specs:
@kate I'll cut a release soonβ„’, but still a few more things to iron out 🀣 One of the new challenges is figuring out what to do with the "Discover" view now that is has an unconfined limit, on my pod (_at least_) it's now basically just "noise" πŸ€¦β€β™‚οΈ
@kate Been missing your jovial posts too and your friends 🀣
@quark No editing old Twts that are the root of a thread with replies in the ecosystem. Just results in a fork. Unless the client has an implementation that does not store Twts keyed by Hash.
@movq Oh dear πŸ˜‚
@kate The re-fetch should work just fine 🀞
@david Thanks I'll fix.
@bender Sure πŸ‘»πŸ‘»πŸ‘»
@bender That's what I'm trying to figure out πŸ€”
@andros Curious where this root twt is?! 🀣 Apparently my pod doesn't have it and I can't find it anywhere. It's suppose to be #l4doaxa
@andros For what purpose? πŸ€”
@xuu Yeah @-mentioning someone you don't have a local alias for is broken somehow :( I haven't looked into it yet...
@xuu Seems to be fine here?


$ bat https://twtxt.net/twt/yfv5kfq | jq '.text'
"!<dm-echo https://dm-echo.andros.dev/twtxt.txt> U2FsdGVkX1+QmwBNmk9Yu9jvazVRFPS2TGJRGle/BDDzFult6zCtxNhJrV0g+sx0EIKbjL2a9QpCT5C0Z2qWvw=="