Alright, I saw enough broken threads lately to be motivated enough to extend the --fetch-context thingy: It can now ask Yarn pods for twt hashes.
https://www.uninformativ.de/git/jenny/commit/eefd3fa09083e2206ed0d71887d2ef2884684a71.html
This is only done as a last resort if there’s no other way to find the missing twt. Like, when there’s a twt that begins with just a hash and no user mention, there’s no way for jenny to know on which feed that twt can be found, so it’ll ask some Yarn pod in that case.
@prologic@twtxt.net 🤯 HOLLY! … I’m definitely adding this to my Jenny’s publish_command script!! THANK YOU! Now my website has TWO pages instead of just a boring one 😂
# follow_notify = gemini://foo/bar to your feed’s metadata, so that clients who follow you can ping that URL every now and then? How would you even notice that, do you regularly read your gemini logs? 🤔
@prologic@twtxt.net Unfortunately it only work if I pull the feed in debug mode jenny -D otherwise, it misses things up if I add that snippet of text to links in my .config/jenny/follow file 😅 Anyway, it was a nice try.
# follow_notify = gemini://foo/bar to your feed’s metadata, so that clients who follow you can ping that URL every now and then? How would you even notice that, do you regularly read your gemini logs? 🤔
@movq@www.uninformativ.de @prologic@twtxt.net Hey! I may have found a silly trick to announce my following to people hosting their feeds on the Gemini space using the requested URI itself instead of relaying on the USER Agent 😂. I’ve copied my current feed over to my (to be) Gemlog for testing. And if I do a jenny -D "gemini://gem.aelaraji.com/twtxt.txt?follower=aelaraji@https://aelaraji.com/twtxt.txt" and this happens:
A) As a follower, I get the feed as usual.
B) As the feed owner, I get this in logs:
hostname:1965 - “gemini://gem.aelaraji.com/twtxt.txt?follower=aelaraji@https://aelaraji.com/twtxt.txt” 20 “text/plain;lang=en-US”
You could do the same for Gopher feeds but only if you want to announce yourself by throwing in an error in their logs, then you’ll need a second request to fetch the feed. jenny -D "gopher://gopher.aelaraji.com/twtxt.txt&follower=aelaraji@https:/aelaraji.com/twtxt.txt" gave me this :
gopher.aelaraji.com:70 - [09/Sep/2024:22:08:54 +0000] “GET 0/twtxt.txt&follower=aelaraji@https:/aelaraji.com/twtxt.txt HTTP/1.0” 404 0 “” “Unknown gopher client”
NB: the follower=... string won’t appear in gopher logs after a ? but if I replace it with a + or a & and it works. There will be a missing / after the https:. Probably a client thing.
@lyse@lyse.isobeef.org This looks like a nice way to do it.
Another thought: if clients can’t agree on the url (for example, if we switch to this new way, but some old clients still do it the old way), that could be mitigated by computing many hashes for each twt: one for every url in the feed. So, if a feed has three URLs, every twt is associated with three hashes when it comes time to put threads together.
A client stills need to choose one url to use for the hash when composing a reply, but this might add some breathing room if there’s a period when clients are doing different things.
(From what I understand of jenny, this would be difficult to implement there since each pseudo-email can only have one msgid to match to the in-reply-to headers. I don’t know about other clients.)
The actual end-user problem is that I can’t see the thread properly when using neomutt+jenny.
@prologic@twtxt.net One of your twts begins with (#st3wsda): https://twtxt.net/twt/bot5z4q
Based on the twtxt.net web UI, it seems to be in reply to a twt by @cuaxolotl@sunshinegardens.org which begins “I’ve been sketching out…”.
But jenny thinks the hash of that twt is 6mdqxrq. At least, there’s a very twt in their feed with that hash that has the same text as appears on yarn.social (except with ‘ instead of ’).
Based on this, it appears jenny and yarnd disagree about the hash of the twt, or perhaps the twt was edited (though I can’t see any difference, assuming ’ vs ’ is just a rendering choice).
@movq@www.uninformativ.de Thanks, it works!
But when I tried it out on a twt from @prologic@twtxt.net, I discovered jenny and yarn.social seem to disagree about the hash of this twt: https://twtxt.net/twt/st3wsda . jenny assigned it a hash of 6mdqxrq but the URL and prologic’s reply suggest yarn.social thinks the hash is st3wsda. (And as a result, jenny –fetch-context didn’t work on prologic’s twt.)
I’m SO enjoying the new jenny --fetch-context 😁
@falsifian@www.falsifian.org have you tried jenny’s fetch-context branch? It works great!
vim cursor at the end of the first line on replies, and forks. I have tried adding to this to jenny's configuration:
@movq@www.uninformativ.de hmm, I am already using au BufNewFile,BufRead jenny-posting.eml setl completefunc=jenny#CompleteMentions fo-=t wrap, from jenny. How would I go to incorporate that there?
@movq@www.uninformativ.de, maybe you can help me with this. I want to place the vim cursor at the end of the first line on replies, and forks. I have tried adding to this to jenny’s configuration:
"editor": "vim \"+normal $\"",
But that doesn’t work. How would you go about it?
Because I saw the nick on movq (@prologic@twtxt.net, can’t mention anyone outside this pod, by the way), I looked the user up: https://tilde.pt/~marado/twtxt.txt. I wonder if the “hashes” they are using will work out of the box with jenny.
Talking about jenny, going to play with the latest now. Tata! :-)
@falsifian@www.falsifian.org @bender@twtxt.net I pushed an alternative implementation to the fetch-context branch. This integrates the whole thing into mutt/jenny.
You will want to configure a new mutt hotkey, similar to the “reply” hotkey:
macro index,pager <esc>C "\
<enter-command> set my_pipe_decode=\$pipe_decode nopipe_decode<Enter>\
<pipe-message> jenny -c<Enter>\
<enter-command> set pipe_decode=\$my_pipe_decode; unset my_pipe_decode<Enter>" \
"Try to fetch context of current twt, like a missing root twt"
This pipes the mail to jenny -c. jenny will try to find the thread hash and the URL and then fetch it. (If there’s no URL or if the specific twt cannot be found in that particular feed, it could query a Yarn pod. That is not yet implemented, though.)
The whole thing looks like this:
https://movq.de/v/0d0e76a180/jenny.mp4
In other words, when there’s a missing root twt, you press a hotkey to fetch it, done.
I think I like this version better. 🤔
(This needs a lot of testing. 😆)
you’ll probably get an Error 1011 🤦 … just copy and paste the link in a new tab if you can Screenshot of neomutt running Jenny
@bender@twtxt.net My index formatting is intact, probably because I still haven’t figured out how to set up my terminal to show RTL text correctly! 😅 but hey, that won’t be a problem anymore, I don’t feel like twting in Arabic. Sorry for the inconvenience.

@movq@www.uninformativ.de I don’t know if I’d want to discard the twts. I think what I’m looking for is a command “jenny -g https://host.org/twtxt.txt” to fetch just that one feed, even if it’s not in my follow list. I could wrap that in a shell script so that when I see a twt in reply to a feed I don’t follow, I can just tap a key and the feed will get added to my maildir. I guess the script would look for a mention at the start of a selected twt and call jenny -g on the feed.
@movq@www.uninformativ.de Is there a good way to get jenny to do a one-off fetch of a feed, for when you want to fill in missing parts of a thread? I just added @slashdot@feeds.twtxt.net to my private follow file just because @prologic@twtxt.net keeps responding to the feed :-P and I want to know what he’s commenting on even though I don’t want to see every new slashdot twt.
@grumpy@grumpygordie.great-site.net Umm… If you haven’t already, you can give this Jenny + Mutt setup a try, you’ll probably (I mean definitely) love it. Nice to meet you by the way! 🫡
I’m still alive ! Here’s a quick, brainless recap dump before I switch back to the other side:
- Been daily driving FreeBSD on the o(ther)ld machine for the last couple of days.
- Read through the handbook, played around with jails, pulled on my hair because of network issues (I think I might have maybe fixed that) … etc.
- Still procrastinating over migrating my Jenny/Mutt setup out there. until then, I’ll be getting my Twtxt fix reading through conversations over on the twtxt.net ✌
- Gave a couple of Nostr based platforms a try, it was … not for me to say the least.
- Started learning Emacs (I know, I’m in trouble LOL) and might even start twtin’ from there instead.
:set formatoptions-=t in vim would stop the annoying line breaking I've been having in my twts... And I guess, that's it! Things are looking OK on my end.
@aelaraji@aelaraji.com That’s the trick, yep. 👍 I have something like this in my .vimrc:
au BufRead,BufNewFile jenny-posting.eml setl fo-=t wrap
@bender@twtxt.net Yeah I’ve been having this problem for quite sometime now. It boils down to Vi/Vim/NeoVim inserting those line breaks automatically when editing an .eml file (if I can remember the file extension correctly) … I think Jenny makes use of those. I had to delete them manually until I was told that the problem was fixed after I added the charset utf-8; to my nginx config file. I’ll try and fix this next…
@dbucklin@www.davebucklin.com apparently Txtnish isn’t maintained anymore. if interested you could give Jenny a try.
I’ve never had to look back once I’ve had it set up with mutt following @movq@www.uninformativ.de ’s guide
36/2 = 18 at 25 Twts per page, that's about ~72% of the search/view real estate you're taking up! wow 🤩 -- I'd be very interested to hear what ideas you have to improve this? Those search filters were created so you could sift through either your own Timeline or the Discover view easily.
@prologic@twtxt.net It was one of (if not THE) first feed(s) I got to follow after discovering Twtxt and setting up my own.
It was quite nice for the first couple of hours, I’ve even got to explore a couple of @dfaria.eu@dfaria.eu’s articles.
Theeeeen… Things started to feel a bit overwhelming I had to “Clean Things Up!”.
Flushed my whole Jenny/Mutt cached twtxt feed and re-synced everything all over again.
But hey,
Good evening! 🎧🎵Guns N’ Roses - Live and let die.
If you’re using jenny on Python 3.12, it will spit out a deprecation warning regarding datetime.utcnow(). This will be fixed in the next release.
I might have found the actual source of my problem.
Jenny uses an .eml file when composing a twt …
and vim kinda auto formats it and inserts in those line breaks every ~70 character.
Then, I stumbled upon this link where Where someone reports that saving a .eml into a .txt might… corrupt the data?
@bender@twtxt.net I’m using both machines in English.
Checked my locale and it spits out:
LANG=en_US.UTF-8
LC_CTYPE=“en_US.UTF-8”
LC_NUMERIC=“en_US.UTF-8”
LC_TIME=“en_US.UTF-8”
LC_COLLATE=“en_US.UTF-8”
LC_MONETARY=“en_US.UTF-8”
LC_MESSAGES=“en_US.UTF-8”
LC_PAPER=“en_US.UTF-8”
LC_NAME=“en_US.UTF-8”
LC_ADDRESS=“en_US.UTF-8”
LC_TELEPHONE=“en_US.UTF-8”
LC_MEASUREMENT=“en_US.UTF-8”
LC_IDENTIFICATION=“en_US.UTF-8”
LC_ALL=
🤷🏽 … and that only happens when vi, vim or nvim are launched by Jenny to compose a twt.
@prologic@twtxt.net it actually does!
But I broke something trying to get rid of the random characters showing on my twts as mentioned here #k7tcqwq.
I taught it was as easy as swapping the ‘\u2028’ in jenny’s new_twt_from_file function but there’s a reason I’m not a developer (yet) 😅
It kinda got rid of them in a way but broke the new lines in the process. So I put things back the way the were till I figure out something else.
OK time to put this to the test, I ended up setting my $VISUAL env
{-here-} variable, so that jenny can launch neovim instead of plain old vi like
{-here-} it is instructed in the code. But as you can see, I still get these
{-here-} wired new lines every ~70th character (marked them with {-here-})
Thanks again @movq@www.uninformativ.de !! I have figured things out and set up Jenny and Vim completion following your blog post! Cheers!
Hello Jenny!
I am back on twtxt for now. I am using twtwt client. Don’t think that it does replies so I should try jenny with mutt again.
❤️ 🎶: SOLO by JENNIE
👋 Q: How do we feel about forking the Twtxt spec into what we love and use today in Yarn.social in yarnd, tt, jenny, twtr and other clients? 🤔 Thinking about (and talking with @xuu@txt.sour.is on IRC) about the possibility of rewriting a completely new spec (no extensions). Proposed name yarn.txt or “Yarn”. Compatibility would remain with Twtxt in the sense that we wouldn’t break anything per se, but we’d divorce ourselves from Twtxt and be free to improve based on the needs of the community and not the ideals of those that don’t use, contribute in the first place or fixate on nostalgia (which doesn’t really help anyone).
@movq@www.uninformativ.de, well, yes, that has always been the case. Not just on jenny, but on Yarn. I can’t follow everything, and everyone. To see whether is a reply, a simple h on mutt shows the headers, and there you have it. That is not too convoluted, is it? I mean, if you really want to know–but why?–it is a simple key press. If I don’t see a context on something as obvious as the example you used, it is simply a reply to someone I don’t follow, and pretty much ignore. End of story. 😂
Right now I have to setup jenny for my timeline. Just added myself to the Registry so that part is done.
@benk@kwiecien.us I am using jenny (we chatted a bit on IRC earlier today). I have been using it for over five months now, I think. It is truly a joy to use, specially because you can use the power of Mutt/NeoMutt to read your twts.
I think something has caused my feed to be in a bad state and is now unpardable😥
I can read this on jenny, but the twt isn’t making it to my own pod. Something has gone really wrong, me thinks.
@fastidious@arrakis.netbros.com
I hit RETURN after the subject, and nick […]
I shows fine on jenny. Let’s see how Yarn renders mine above.
Not to boast, but jenny has never failed me 😂. It is so neat, powerful, and streamlined, not even funny! Thank you very much, @movq@www.uninformativ.de for it! 💛
@prologic@twtxt.net
Awesome! Hope he will reply as fast as he did with me. And yes about the noise and length. Not an issue on jenny, or my own pod (I have it set to 2048, I think), but yes, ephemeral is right.
@movq@www.uninformativ.de How is deletion supposed to work? In mutt I deleted by D~d>1m and then fetched by !jenny -f. This brings back all deleted twts. Isn’t lastmods used to skip older twts?
@fastidious@arrakis.netbros.com
The signs show fine on jenny. So, it is a display thing. Probably related to Markdown.
@prologic@twtxt.net
Jenny populates Mutt’s subject with the entire twt. That makes for very, very long subject lines.
@movq@www.uninformativ.de
Fair enough, I will modify my cron job to match. When I come across edited twts, I just delete both knowing jenny will fetch the right one next iteration. I like keeping things tidy. 😊
@movq@www.uninformativ.de what is your cron job repeat time for jenny? Currently I have mine to every minute, and while it allows me to participate fairly quick on conversations it has some drawbacks: it captures every single edited twt, so I end up with seemingly the same twt, but not quite—as it has minor edits, etc. So, “repeats”. Perhaps setting cron to check every 5 minutes or so is best?
@lyse@lyse.isobeef.org Unless you are stripping stuff on your twts, there is no much to implement. Things will be bold , italics , underlined , and so on, on a client that can render them. Since jenny uses Mutt, I can use my own regex in it to color them as I like. That’s pretty much it.
