express-twtkpr: an ExpressJS library that enables hosting (and directly posting to) a twtxt.txt file. It works great (otherwise you wouldn't be able to read this), but it's still in alpha and lacks documentation, examples, tests, installation flexibility, or polish, so please use it at your own risk. Enjoy! https://www.npmjs.com/package/express-twtkpr
@bender@twtxt.net Thanks for the tip-off, fixed!
I hope to have some time this weekend to tease apart my current setup and build a couple of example sites with it (while also writing some docs along the way). But given the rate I’ve been going, it’ll probably be another month. 😢
@iolfree@tilde.club The motto every reckless person has internalized.
@iolfree@tilde.club Will do. 🫡
@itsericwoodward@itsericwoodward.com your site link on your profile is broken. It goes to https://www.itsericcwoodward.com/, but it should be https://itsericwoodward.com/ (works).
express-twtkpr: an ExpressJS library that enables hosting (and directly posting to) a twtxt.txt file. It works great (otherwise you wouldn't be able to read this), but it's still in alpha and lacks documentation, examples, tests, installation flexibility, or polish, so please use it at your own risk. Enjoy! https://www.npmjs.com/package/express-twtkpr
@itsericwoodward@itsericwoodward.com hey, link to repository on https://www.npmjs.com/package/express-twtkpr is broken. It points to https://git.itsericwoodward.com/eric/express-twtkp. Looking forward to see more documentation!
@kiwu@twtxt.net That’s not bad 👌
yey! I remembered how to prune my Jenny/Neomutt Twtxt feed! (I only keep 6 months worth of Twts) Now, I need to figure out how to set up a macro for that.
express-twtkpr: an ExpressJS library that enables hosting (and directly posting to) a twtxt.txt file. It works great (otherwise you wouldn't be able to read this), but it's still in alpha and lacks documentation, examples, tests, installation flexibility, or polish, so please use it at your own risk. Enjoy! https://www.npmjs.com/package/express-twtkpr
@itsericwoodward@itsericwoodward.com Nice one 👌
I’m happy to report that, earlier today, I published an early version of express-twtkpr: an ExpressJS library that enables hosting (and directly posting to) a twtxt.txt file. It works great (otherwise you wouldn’t be able to read this), but it’s still in alpha and lacks documentation, examples, tests, installation flexibility, or polish, so please use it at your own risk. Enjoy! https://www.npmjs.com/package/express-twtkpr
@movq@www.uninformativ.de Sure, I quit on my own!
@lyse@lyse.isobeef.org A-ha! That means you haven’t spent enough time with these tools! Go on, try it! (If you don’t, we’ll fire you.) I’m sure you’ll like it!

@movq@www.uninformativ.de Schlimmer geht immer.
@movq@www.uninformativ.de No idea why this didn’t occur to me. But you’re absolutely right.
@lyse@lyse.isobeef.org I bet that their AI agent handles that as well, so … 🤷♀️
@rrraksamam@twtxt.net is that what Kendall is asking? 😂
@movq@www.uninformativ.de I would have done the same. ;-) My only hope with an abuse report is that the hoster would give this fuckwit a proper dressing-down.
@rrraksamam@twtxt.net They won’t.
@lyse@lyse.isobeef.org That would have been the noble thing to do. It’s more work for me, though. I blocked that idiot and moved on with my life. 🫤
@movq@www.uninformativ.de For sure. Time for an absue report.
@lyse@lyse.isobeef.org Thanks! 🙌
@prologic@twtxt.net Welcome back to your main home! :-)
@rdlmda@rdlmda.me In case you’re into terminal clients, you might like tt. We finally managed to abolished our GitLab instance, so I would need to make the code available to the public differently.
@rdlmda@rdlmda.me Oh boy, what a story! The infrastructure is indeed in need of overhaul. I’m glad you were so lucky in these circumstances.
(Btw. you posted the same message twice with just five seconds apart. I’m replying to the later one. Not sure if this is a client bug (like attempting to edit) or just operator error. ;-))
@rdlmda@rdlmda.me I am reasonably happy with jenny. If I find time for a twtxt project, I would like to make a web page that works as follows: you point it to your own twtxt feed (as a URL parameter), and then it shows you all the feeds referenced by your “# follow =” lines. So, if I put this up, anyone could use it to view their own feed, with no login required. (Probably a difficult project. For example, I’d want to make sure the backend couldn’t be tricked into helping ddos a web server by trying to fetch lots of “feeds” from it. Anyway, I have too many other projects.)
@thecanine@twtxt.net Hahaha, nice! :-D
To whoever is operating this “xt” client, there might be a misconfiguration. My feed is often, but not always, pulled twice within a few seconds:
2026-03-14T15:31:02+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
2026-03-14T15:31:31+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
2026-03-14T15:41:19+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
2026-03-14T15:41:31+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
2026-03-14T15:51:04+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
2026-03-14T16:01:25+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
2026-03-14T16:01:27+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
2026-03-14T16:11:51+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
2026-03-14T16:11:54+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
2026-03-14T16:21:53+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
2026-03-14T16:32:19+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
2026-03-14T16:32:22+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
2026-03-14T16:52:28+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
2026-03-14T16:52:31+01:00 "GET /twtxt.txt HTTP/1.1" 304 "xt/0.0.1"
Maybe this is caused by a development and a production setup, no idea. Since this client is sending the If-Modified-Since or If-None-Match request header, I’m good with that, though. Looking forward to discover a new feed hopefully soon. :-)
@lyse@lyse.isobeef.org sounds like a plan, it’d be the second biggest version, in Australia.

Number one is on the rplace.live map canvas, where the previous one is in America and the one from today here - no reason other than the fact those countries had a good empty spot, to put them in, at the time I drew them.
@thecanine@twtxt.net Haha, I just realized you could stick that on the side of @prologic@twtxt.net’s caravan to accompany these large pixels there. Secret mission in Down Under. :-D
@prologic@twtxt.net Oh yeah, this looks like a nice spot with these gums in the background. :-)
Our first test over night trip 🤞
Back to the regular scheduled dogpostin and back to something very low resolution.

Also new stuff on my website, won’t list it all here, you’ll just have to check.
@falsifian@www.falsifian.org Correct, the two smaller versions are loading perfectly fine. The hickup is only for the originals. But in all reality, the middle ones are sufficient for me personally. Please don’t get me wrong, at least for the people photos, the subjects are large enough. The Japanese landscapes, however, would definitely benefit from a bit more detail. ;-)
I just tried it once more, and now, the tree with the sign (/photo/5Zy4pqVIt0oP/IMG_20251106_035048_448.jpg) fully loaded very quickly. Same with the Japanese dish (/photo/tJbmg8oleYbh/IMG_20251030_091719_086.jpg) and shopping center (/photo/qXG5ucIjpPju/IMG_20251029_045002_778.jpg). But the previous and next ones all ran into the same problems again. When I’m very lucky, I eventually get the upper half. Typically not even that much, a third, a fifth, or even less.
Waiting a bit before making an attempt, the wooden walkway through the forest or park (/photo/ojQpDLfBoGN4/IMG_20251023_043829_011.jpg) eventually also made it. But unlike the other successful attempts, it took a long time.
The more photos you add, the more beneficial it might be to separate the index into several different albums. I didn’t measure it, but it felt like 10 to 20 seconds for all the thumbnails to load. That traffic adds up.
Another idea would be to strip the EXIF data from the thumbnails and reducing quality to 90% or even 80%. Using the famous tree with the sign, I cannot tell the difference between the original thumbnail and the 80% quality one. I’m sure it depends on the subject. Here are the numbers:
$ convert -strip IMG_20251106_035048_448_size_400.jpg stripped.jpg
$ convert -quality 90 IMG_20251106_035048_448_size_400.jpg 90.jpg
$ convert -quality 80 IMG_20251106_035048_448_size_400.jpg 80.jpg
$ convert -strip -quality 90 IMG_20251106_035048_448_size_400.jpg 90-stripped.jpg
$ convert -strip -quality 80 IMG_20251106_035048_448_size_400.jpg 80-stripped.jpg
$ ls -lh *jpg | awk '{print $5 " " $9}'
46K 80.jpg
45K 80-stripped.jpg
64K 90.jpg
63K 90-stripped.jpg
132K IMG_20251106_035048_448_size_400.jpg
127K stripped.jpg
$ ls -l *jpg | awk '{print $5 " " $9}'
46160 80.jpg
45064 80-stripped.jpg
65012 90.jpg
63916 90-stripped.jpg
135070 IMG_20251106_035048_448_size_400.jpg
129647 stripped.jpg
@rdlmda@rdlmda.me Holy fuck, you were really lucky! This could have gone really bad. You noticed it because of the blackout?
@lyse@lyse.isobeef.org Thanks for letting me know. HTML checkers seem happy now. I’m not sure what to do about the images not loading. The photos have three sizes (thumbnail, photo page, and original if you click the img tag on the photo page); can you at least see the smaller two sizes? Maybe I will do some experimental fetches and/or start measuring things on my web server.
@movq@www.uninformativ.de @lyse@lyse.isobeef.org It’s not that bad. She let me sleep three times last night alone!
@lyse@lyse.isobeef.org still not as bad as the time a fire started in the breaker panel for my building and I had to personally put it out myself with a fire extinguisher.
@rdlmda@rdlmda.me @prologic@twtxt.net The web is fucked. :-(
@rdlmda@rdlmda.me What a truly wonderful description. ;‘-D But sorry to hear that. Luckily, no issues over here. It’s extremely rare that this happens. Last time (around five years ago or so) they were cutting down trees in the forest and threw a tree in the overhead power line (which had been converted to underground last year). Power had to be killed in order for the fire brigade to actually extinguish the fire.
@bender@twtxt.net H-Blockx covered it, the original was by Snap! https://en.wikipedia.org/wiki/The_Power_(Snap!_song) But it’s actually not my type of music at all. The high pitch refrain “I’ve got the power” is iconic and has somehow burned itself into my brain. Must have been a short circuit.
@rdlmda@rdlmda.me Yeah the “web” is pretty broken™ right? 😅
@lyse@lyse.isobeef.org 😂 Pretty cool remix(?)!
My twtxt instance is under a de-facto attack. Or, at this point, I can’t even differentiate an attack from the other in the constant barrage or malicious requests.
There were so many bots hammering it, in only 3 days, they consumed the ironically significant amount of 666 MB — I kid you not! In the last 24 hours, there were 59,673 hits on this endpoint alone.
I had to put my twtxt web interface behind a password-protected BasicAuth directive. As I’m the only one using it, it’s fine.
Bots, scrappers and Large Laggy Manglers are poisoning the open web.
@quark@ferengi.one Ignored. ✅
@rdlmda@rdlmda.me @bender@twtxt.net Eventually: “I’VE GOT THE POWER!” https://www.youtube.com/watch?v=rOScKjXH-HE
@lyse@lyse.isobeef.org Yes 🙌
@movq@www.uninformativ.de This is how my SSH proxy setup works.
@lyse@lyse.isobeef.org Hm, I’m not sure I would want to do that:
ForwardAgent
...
Agent forwarding should be enabled with caution. Users
with the ability to bypass file permissions on the remote
host (for the agent's Unix-domain socket) can access the
local agent through the forwarded connection. An attacker
cannot obtain key material from the agent, however they
can perform operations on the keys that enable them to au‐
thenticate using the identities loaded into the agent.
@kiwu@twtxt.net after you upload, make sure the audio file looks like this:

And it will work.
Testing…