Cool! 😎 So I can now block ASN(s) 🤣 (And I bet no-one noticed anything)
@gretahayes@yarn.girlonthemoon.xyz 👋 Welcome to Yarn.social 🙌
How in da fuq do you actually make these fucking useless AI bots go way?
proxy-1:~# jq '. | select(.request.remote_ip=="4.227.36.76")' /var/log/caddy/access/mills.io.log | jq -s '. | last' | caddy-log-formatter -
4.227.36.76 - [2025-01-05 04:05:43.971 +0000] "GET /external?aff-QNAXWV=&f=mediaonly&f=noreplies&nick=g1n&uri=https%3A%2F%2Fmy-hero-ultra-impact-codes.linegames.org HTTP/2.0" 0 0
proxy-1:~# date
Sun Jan 5 04:05:49 UTC 2025
😱
I just banned 41 bad user agents from accessing any of my services. 😱
yarnd (which powers Yarn.social pods like twtxt.net) does have an API, however that API is designed for clients to interact with the pod and the user's account and feed. e.g: there is a command-line client called yarnc and I used to maintain a mobile native app (using Flutter).
@doesnm@doesnm.p.psf.lt It is the same API that yarnc the command-line client uses.
Having a lot of fun with Coraza today. A Web Application Firewall library written in Go that also happens to have a Caddy module.
@eapl.me@eapl.me And here I always lived by:
Problems are solved by method.
– Dr. Don Abel.
@andros@twtxt.andros.dev What do you mean by API? yarnd (which powers Yarn.social pods like twtxt.net) does have an API, however that API is designed for clients to interact with the pod and the user’s account and feed. e.g: there is a command-line client called yarnc and I used to maintain a mobile native app (using Flutter).
What use-case did you have in mind?
I am now proud to say, that as of this moment, I am off of Clownflare 🤣 Still using Cloudflare for DNS, but no longer proxying through their services or terminating TLS at their edge. Instead, all my sites and services now terminate TLS on my own edge proxy running Caddy+Wireguard (so all ingress is actually egress 🤣) 🥳 #Clownflare #Cloudflare
@kat@yarn.girlonthemoon.xyzHello 👋 Welcome!
The PoC I have stood up is costing my a $6/month VM in Vultr sitting in front of my infra over a (outbound) Wireguard tunnel.
Fuck me OpenAI sucks ass. ChatGPT has to be the most stupidest fucking thing ever invented. It is so bad it’s not even funny.
Success! 🥳 https://prologic.dev/ is now off (temporarily for now) Clownflare! 🤣
Happy New Year y’all ! 🥳 Hello #2025 👋
@emmanuel@wald.ovh Btw I already figured out why accessing your web server is slow:
$ host wald.ovh
wald.ovh has address 86.243.228.45
wald.ovh has address 90.19.202.229
wald.ovh has 2 IPv4 addresses, one of which is dead and doesn’t respond.. That’s why accessing your website is so slow as depending on client and browser behaviors one of two things may happen 1) a random IP is chosen and ½ the time the wrong one is picked or 2) both are tried in some random order and ½ the time its slow because the broken one is picked.
If you don’t know what 86.243.228.45 is, or it’s a dead backup server or something, I’d suggest you remove this from the domain record.
@emmanuel@wald.ovh oh! Nice! You’ve now got a nice avatar 👌
Anyone interested in our monthly online meetup tomorrow? 🤔
@bender@twtxt.net Bahahaha in hindsight I got rid of that 🤣 Just silly nonsense, just one of those things when you create an account on yet-another silly centralized platform(s) and go “fuck” someone’s already taken the username I want 😅
What do we think? ==> https://prologic.dev/
Merry 2024 Christmas 🎅 y’all 🥳 #Xmas24
@xuu@txt.sour.is is there anything stopping in clients from supporting this as an optional feature?
Anyone started seeing this from Slashdot? 🤔

What’s the most common feature set on these tilde gists? 🤔
@eapl.me@eapl.me@eapl.me@eapl.me Done! 👌
da fuq?! Haven’t seen this kind of shit™ on IRC since the good ‘ol days of AustNet (now dead right?) when IRC was way more popular than it is today 🤣
#IRC #Porn
@aelaraji@aelaraji.com Can you walk me through your testing process here and share example links etc? 🙏
@doesnm@doesnm.p.psf.lt Hah! 🤣
Forcing social media to open their algorithms: hostile to corporations
Forcing young people to not use social media: hostile to young people, helps prevent them from organizing
You think they did this for the benefit of the young people?
Also this ☝️
Yeah we really gotta do something about this. You should not be putting a @ in your adverised nick in your feed. This is not supported 🤣
@bender@twtxt.net Ollama currently. It’s been rock solid.
Regarding the blog post itself, there’s nothing of any substance here except an acknowledgment of open network(s) being a good thing.
@xuu@txt.sour.is Why don’t or can’t we support that capability?
Starting the call: https://meet.mills.io/call/Yarn.social
Come join us!
👋 Reminder folks of the upcoming Yarn.social monthly online meetup:
- Event: Yarn.social Online Meetup
- When: 23rd November 2024 at 12:00PM UTC (midday)
- Where: Mills Meet : Yarn.social
Anyone thinking of trying our (or already are) the ATprotocok / BlueSky? 🤔
The web is such garbage these days 😔 Or is it the garbage search engines? 🤔
So let’s recap… We’ve got Putin waging war against Ukraine. Netanyahu waging war against Palestine. Iran getting involved. Kim Jong Un helping Russia and sending soldiers as resources for Putin’s war. And now Trump has won a 2nd term in the US where we’ll see him scrap EU sanctions and fines against US companies violating EU laws and what else? 🤔
What dafuq is wrong with this world?! 🌍
@doesnm@doesnm.p.psf.lt You probably don’t know this, but it is also self-signed. I also don’t give two shit™ about its validity or expiry 🤣
@doesnm@doesnm.p.psf.lt What Hallway link?
@cuaxolotl@sunshinegardens.org This is largely by accident and not on purpose:
Lately I’ve been browsing twtxt.net since they aggregate most of the known network
👋 PR to propose Feed Format Extension – Request for comment 🙏
301 Moved Permanently redirect(s) for https://dev.twtxt.net/ and all relevant pages to the new domain https://twtxt.dev 👌
@bender@twtxt.net True, I’m just not sure we can have it both way? 🤔 I can turn smartypants off, but I do seem to recall you wanted it on 🤣
👋 FYI: I’ve put in place 301 Moved Permanently redirect(s) for https://dev.twtxt.net/ and all relevant pages to the new domain https://twtxt.dev 👌
After the behaviour of a clearly very angry feed author over the past few days, I’m very tempted to give up on Twtxt and allow it to go back to being dead. What really is the point of building and supporting a way to exchange little pieces of text with one another in a completely decentralized way, if you’re just going to keep bumping up against such hostility? I don’t know why I do this anymore.
Who’s coming to the online meetup today? 🤔
Ya know; Rather than being an asshole and getting all angry, just be reasonable and reach out to the community or folks fetching (or trying) your feed.
Most clients respect caching if your feed is transported I’ve HTTP.
Otherwise you can add the # refresh hint to clients on your feed.
No need to be an obnoxious ass and flood your own feed. That will just get you permanarely unfollowed and ignored.
@aelaraji@aelaraji.com Of course! 🤣 @xuu@txt.sour.is and I run saltyd 😅
@sorenpeter@darch.dk curious why you at mentioned a timestamp? 🤔
@doesnm@doesnm.p.psf.lt What do you think of when you say “decentralized”?
@doesnm@doesnm.p.psf.lt salty.im needs a lot more work 🤞it is however designed to be 1000% decentralized 👌
If we stuck with Blake2b for Twt Hash(es); what do we think we need to reasonably go to in bit length/size?
=> https://gist.mills.io/prologic/194993e7db04498fa0e8d00a528f7be6
e.g: (turns out @xuu@txt.sour.is is right about Blak2b being easy/simple too!):
$ printf "%s\t%s\t%s" "https://example.com/twtxt.txt" "2024-09-29T13:30:00Z" "Hello World!" | b2sum -l 32 -t | awk '{ print $1 }'
7b8b79dd
I am told through various sources that Iran decided last night to attack Israel with over 200 missile strikes in response to Israel attacking Lebanon. 🤔
@movq@www.uninformativ.de I’d love it if you write up a page for jenny 🙏 at https://twtxt.dev 🤞
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”
twt probably isn't the best client I'm afraid. It doesn't really cache twts by their key (hash) to display threads properly. Jenny however does 👌
@doesnm@doesnm.p.psf.lt Sorry I meant twet 🤦♂️
@doesnm@doesnm.p.psf.lt twt probably isn’t the best client I’m afraid. It doesn’t really cache twts by their key (hash) to display threads properly. Jenny however does 👌
@doesnm@doesnm.p.psf.lt Thanks! I’ve almost come up with my own theme already 🤣 I actually don’t really want to use Hugo at all, I find it too complicated. But it is pretty popular so I thought maybe I’d rip-off a nice theme… Hmmm 🧐
Anyway, What I really normally use for a lot of my static sites is zs
I’m looking to develop a static site for twtxt.dev – A domain I own and have wanted to use for developer and specification docs for Twtxt.
Can anyone recommend a few Hugo themes you like?
All of the dev.twtxt.net content would move over as well.
👋 Thanks for joining us on our Sept monthly Yarn.social meetup today y’all 🙇♂️ We had @david@collantes.us @sorenpeter@darch.dk @doesnm@doesnm.p.psf.lt @falsifian@www.falsifian.org and @xuu@txt.sour.is 💪 Nice turn out! (not all at once of course, as we normally run this over 4 hours as we span many time zones!)
Things we talked about:
- Decentralised vs. Distributed
- Use of SHA256 for Twt Hash(es)
- We solved Edits! 🥳
- UUID(s) probably won’t work! (susceptible to sppofing)
- Helped @sorenpeter@darch.dk write some PHP to process/parse
User-Agentand service his feed via a custom PHP script 😅
- @falsifian@www.falsifian.org introduced himself 👌
- Talked about Merkle Trees 🌳
Did I miss anything? 🤔
@lyse@lyse.isobeef.org It’s from 12pm to 4pm UTC so if you can make it at all, that’d be great 👍
james instead 🤣
@doesnm@doesnm.p.psf.lt Are you sure? Not seen the mail yet…
@doesnm@doesnm.p.psf.lt Ooops you might want to re-send that to james instead 🤣
@doesnm@doesnm.p.psf.lt My Salty public key is:
kex1fhxntuc0av7q48hlfj970ve297dzzghn82wp5cahr9r92y8rlrqqtwp983
@doesnm@doesnm.p.psf.lt Do you have a sample Caddy log file you can supply? I’ll see if we can improve the tool 👌
@doesnm@doesnm.p.psf.lt Fot a sample access log? Which tool are you using?
@doesnm@doesnm.p.psf.lt I couldn’t find any references to this anywhere either.
@doesnm@doesnm.p.psf.lt Like now?
We:
- Drop
# url=from the spec.
- We don’t adopt
# uuid =– Something @anth@a.9srv.net also mentioned (see below)
We instead use the @nick@domain to identify your feed in the first place and use that as the identify when calculating Twt hashes <id> + <timestamp> + <content>. Now in an ideal world I also agree, use WebFinger for this and expect that for the most part you’ll be doing a WebFinger lookup of @user@domain to fetch someone’s feed in the first place.
The only problem with WebFinger is should this be mandated or a recommendation?
Something @anth@a.9srv.net said on ITC
17:42 I should also note in there that it doesn’t address the two things i really want it to: mandate utf-8 (which should be easy to fit in) and something for better @ mentions.
I actually agree with in both counts and it got me thinking…
you’ve ruined twtxt
Not sure what to say here. 🤔
Sharing the comments of the poll (anonymous so I have no idea whom the comments are from):
your poll should include questions about markdown. personally i think inline bits like style, links, images are yes. block quotes, code blocks, bullet lists are mid. but tables and footnotes are no.
Yes sorry about this, I wasn’t able to change much after publishing the poll 😅
@bender@twtxt.net Re that broken thread (#bqor23a). Its the same one. My pod doesn’t have the Root Twt: https://twtxt.net/twt/bqor23a => 404 Not Found.
How in the hell did you even reply to this in the first place?
@david@collantes.us SQLite
“For every complex problem, there is a solution that is clear, simple, and wrong.”
– H.L. Mencken
“Everything should be made as simple as possible, but not simpler.”
– Albert EinsteinThe beauty of simplicity lies in not losing the essence.
Starting a couple of new projects (geez where do I find the time?!):
HomeTunnel:
HomeTunnel is a self-hosted solution that combines secure tunneling, proxying, and automation to create your own private cloud. Utilizing Wireguard for VPN, Caddy for reverse proxying, and Traefik for service routing, HomeTunnel allows you to securely expose your home network services (such as Gitea, Poste.io, etc.) to the Internet. With seamless automation and on-demand TLS, HomeTunnel gives you the power to manage your own cloud-like environment with the control and privacy of self-hosting.
CraneOps:
craneops is an open-source operator framework, written in Go, that allows self-hosters to automate the deployment and management of infrastructure and applications. Inspired by Kubernetes operators, CraneOps uses declarative YAML Custom Resource Definitions (CRDs) to manage Docker Swarm deployments on Proxmox VE clusters.

And finally the legibility of feeds when viewing them in their raw form are worsened as you go from a Twt Subject of (#abcdefg12345) to something like (https://twtxt.net/user/prologic/twtxt.txt 2024-09-22T07:51:16Z).
There is also a ~5x increase cost in memory utilization for any implementations or implementors that use or wish to use in-memory storage (yarnd does for example) and equally a 5x increase in on-disk storage as well. This is based on the Twt Hash going from a 13 bytes (content-addressing) to 63 bytes (on average for location-based addressing). There is roughly a ~20-150% increase in the size of individual feeds as well that needs to be taken into consideration (on the average case).
So really your argument is just that switching to a location-based addressing “just makes sense”. Why? Without concrete pros/cons of each approach this isn’t really a strong argument I’m afraid. In fact I probably need to just sit down and detail the properties of both approaches and the pros/cons of both.
I also don’t really buy the argument of simplicity either personally, because I don’t technically see it much more difficult to take a echo -e "<url>\t<timestamp>\t<content>" | sha256sum | base64 as the Twt Subject or concatenating the <url> <timestamp> – The “effort” is the same. If we’re going to argue that SHA256 or cryptographic hashes are “too complicated” then I’m not really sure how to support that argument.
@sorenpeter@darch.dk Points 2 & 3 aren’t really applicable here in the discussion of the threading model really I’m afraid. WebMentions is completely orthogonal to the discussion. Further, no-one that uses Twtxt really uses WebMentions, whilst yarnd supports the use of WebMentions, it’s very rarely used in practise (if ever) – In fact I should just drop the feature entirely.
The use of WebSub OTOH is far more useful and is used by every single yarnd pod everywhere (no that there’s that many around these days) to subscribe to feed updates in ~near real-time without having the poll constantly.
Can someone make the edit?
So I whipped up a quick shell script to demonstrate what I mean by the increase in feed size on average as well as the expected increase in storage and retrieval requirements.
$ ./compare.sh
Original file size: 28145 bytes
Modified file size: 70672 bytes
Percentage increase in file size: 151.10%
...

So I’m a location based system, how exactly do I reply to one of these two Twts from @Yarns@search.twtxt.net ? 🤔
2024-09-07T12:55:56Z 🥳 NEW FEED: @<twtxt http://edsu.github.io/twtxt/twtxt.txt>
2024-09-07T12:55:56Z 🥳 NEW FEED: @<kdy https://twtxt.kdy.ch/twtxt.txt>
Okay folks, I’ve spent all day on this today, and I think its in “good enough”™ shape to share:
Twtxt v2:
- Specification: https://docs.mills.io/uJXuisaYTRWYDrl8A2jADg?both
- implementation: https://gist.mills.io/prologic/afdec15443da4d7aa898f383f171ec1b

LOl 😂 Not only have a tried to write up a full Twtxt v2 specification, I’ve also written a Bash shell script that implements the new spec 😅
👋 Reminder folks of the upcoming Yarn.social monthly online meetup:
I hope to see @david@collantes.us @movq@www.uninformativ.de @lyse@lyse.isobeef.org @xuu@txt.sour.is @sorenpeter@darch.dk and hopefully others too @aelaraji@aelaraji.com @falsifian@www.falsifian.org and anyone else that sees this! 🙏 We’re hopefully going to primarily discuss the future of Twtxt and the last few weeks of discussions 🤣
- Event: Yarn.social Online Meetup
- When: 28th September 2024 at 12:00pm UTC (midday)
- Where: Mills Meet : Yarn.social
- Cadence: 4th Saturday of every Month
Agenda:
- Let’s talk about the upcoming changes to the Twtxt spec(s)
- See #xgghhnq
- See #xgghhnq
@aelaraji@aelaraji.com This is one of the reasons why yarnd has a couple of settings with some sensible/sane defaults:
I could already imagine a couple of extreme cases where, somewhere, in this peaceful world one’s exercise of freedom of speech could get them in Real trouble (if not danger) if found out, it wouldn’t necessarily have to involve something to do with Law or legal authorities. So, If someone asks, and maybe fearing fearing for… let’s just say ‘Their well being’, would it heart if a pod just purged their content if it’s serving it publicly (maybe relay the info to other pods) and call it a day? It doesn’t have to be about some law/convention somewhere … 🤷 I know! Too extreme, but I’ve seen news of people who’d gone to jail or got their lives ruined for as little as a silly joke. And it doesn’t even have to be about any of this.
There are two settings:
$ ./yarnd --help 2>&1 | grep max-cache
--max-cache-fetchers int set maximum numnber of fetchers to use for feed cache updates (default 10)
-I, --max-cache-items int maximum cache items (per feed source) of cached twts in memory (default 150)
-C, --max-cache-ttl duration maximum cache ttl (time-to-live) of cached twts in memory (default 336h0m0s)
So yarnd pods by default are designed to only keep Twts around publicly visible on either the anonymous Frontpage or Discover View or your Timeline or the feed’s Timeline for up to 2 weeks with a maximum of 150 items, whichever get exceeded first. Any Twts over this are considered “old” and drop off the active cache.
It’s a feature that my old man @off_grid_living@twtxt.net was very strongly in support of, as was I back in the day of yarnd’s design (nothing particularly to do with Twtxt per se) that I’ve to this day stuck by – Even though there are some 😉 that have different views on this 🤣
Yeah I’m curious to find out too beyond just “here say”. But regardless of whether we should or shouldn’t care about this or should or shouldn’t comply. We should IMO. I’d have to build something that horrendously violates someone’s rights in another country.
@falsifian@www.falsifian.org Do you have specifics about the GRPD law about this?
Would the GDPR would apply to a one-person client like jenny? I seriously hope not. If someone asks me to delete an email they sent me, I don’t think I have to honour that request, no matter how European they are.
I’m not sure myself now. So let’s find out whether parts of the GDPR actually apply to a truly decentralised system? 🤔
👋 Reminder that next Saturday 28th September will be out monthly online meetup! Hope to see some/all of you there 👌
@lyse@lyse.isobeef.org I don’t think this is true.
Can I get someone like maybe @xuu@txt.sour.is or @abucci@anthony.buc.ci or even @eldersnake@we.loveprivacy.club – If you have some spare time – to test this yarnd PR that upgrades the Bitcask dependency for its internal database to v2? 🙏
VERY IMPORTANT If you do; Please Please Please backup your yarn.db database first! 😅 Heaven knows I don’t want to be responsible for fucking up a production database here or there 🤣
Location Addressing is fine in smaller or single systems. But when you’re talking about large decentralised systems with no single point of control (kind of the point) things like independable variable integrity become quite important.
Speaking of AI tech (sorry!); Just came across this really cool tool built by some engineers at Google™ (currently completely free to use without any signup) called NotebookLM 👌 Looks really good for summarizing and talking to document 📃
An alternate idea for supporting (properly) Twt Edits is to denoate as such and extend the meaning of a Twt Subject (which would need to be called something better?); For example, let’s say I produced the following Twt:
2024-09-18T23:08:00+10:00 Hllo World
And my feed’s URI is https://example.com/twtxt.txt. The hash for this Twt is therefore 229d24612a2:
$ echo -n "https://example.com/twtxt.txt\n2024-09-18T23:08:00+10:00\nHllo World" | sha1sum | head -c 11
229d24612a2
You wish to correct your mistake, so you make an amendment to that Twt like so:
2024-09-18T23:10:43+10:00 (edit:#229d24612a2) Hello World
Which would then have a new Twt hash value of 026d77e03fa:
$ echo -n "https://example.com/twtxt.txt\n2024-09-18T23:10:43+10:00\nHello World" | sha1sum | head -c 11
026d77e03fa
Clients would then take this edit:#229d24612a2 to mean, this Twt is an edit of 229d24612a2 and should be replaced in the client’s cache, or indicated as such to the user that this is the intended content.
@quark@ferengi.one My money is on a SHA1SUM hash encoding to keep things much simpler:
$ echo -n "https://twtxt.net/user/prologic/twtxt.txt\n2020-07-18T12:39:52Z\nHello World! 😊" | sha1sum | head -c 11
87fd9b0ae4e