@david@daiwei.me Go down to āReleasesā, thereās a link to the CHANGES: https://movq.de/git/jenny/CHANGES.html
@david@daiwei.me Is this better? š¤ Pretty hard to keep this concise but also not miss anything. š¤ https://movq.de/git/jenny/
Hmm ā¦
My project pages have this āDownloadsā section and I offer tarballs for each release:
https://movq.de/git/jenny/#downloads
I added this many years ago because an OpenBSD dev asked for it (but the project in question didnāt end up in their ports after all).
What are your thoughts on this? Is it necessary to offer tarballs?
I noticed that some distributions have already moved away from using tarballs and instead always clone from Git. š¤
jenny stuff aside, I received zero bug reports or code contributions since leaving GitHub in 2018.
@movq@www.uninformativ.de So I see it slightly differently⦠Over the years I have recieved great contributions from the likes of yourself and @lyse@lyse.isobeef.org and the many forms of @bender@twtxt.net and his friends š Hell even others along the way that have come and gone. Likewise I also think you have recieved many contributions to Jenny over the yeras in much the same way, perhaps not in patches, but user reports, feedback, etc.
So I think what Iām saying here is this⦠Ever since leaving Github (like you), I find that my desire to continue to build up the community weāve built here and to contribute to grow and cultivate it is important to me. My desire to thwart and eliminate useless traffic like bots and ai even strongers.
I want to find a good balance.
@prologic@twtxt.net Hmmm, I have no idea how to solve that problem. š
Some jenny stuff aside, I received zero bug reports or code contributions since leaving GitHub in 2018.
I thought I had made that super easy, because you can just send me an email ā no sign-up process, nothing. But thatās way too old-school, people donāt know how to use git format-patch (let alone git send-email) and they also donāt understand that they can just send me a link to their forked Git repo (which can be hosted anywhere). Git is super flexible and powerful, but those features are hardly ever used.
Maybe people even need some kind ārewardā, or āfameā. Like those āachievementsā that you can unlock on GitHub. (Something to put in their CV ⦠?)
@prologic@twtxt.net No. After the cutoff-date, hashes are expected to be v2. End of story.
(In jenny, a twt can only ever have one thing that can be used for threading.)
@prologic@twtxt.net @bender@twtxt.net is it normal that twtxtappās <tab> (white space) between the timestamps and posts look a bit shorter than the ones from jenny? just noticed that and thought maybe itās someting youād want to know.
The Rectangle highlights the whitespaces from Jenny and the Ellipse is over the ones from twtxtapp.
This is how it shows in jenny:

I donāt know why, but either Jennyās behaving different after the last update, or I Fucked up something and I have no Idea how to fix it.
Symptoms:
- I donāt have copies of my New Posts in my Maildir after posting them (as in I donāt see them in neomuttās inbox).
- Nor fetch or fetch context (if they get replied to) seem to fech them auto-magically.
- I had to do a full whipe (~/Maildir/twtxt and ~/.cache/jenny) in order to get them fetched back.
šØ jenny was broken due to the switch to v2 hash tags.
I pushed a hotfix to main, but this needs a few more test cases. Iāll do that tomorrow.
@tftp@tilde.town mentioning in here requires he whole shebang. With jenny, if using vim, there is a key combination:
Nick name completions: Allows you to use ^X ^U to turn verbatim nick names into full twtxt mentions. For example, typing ācathā and then pressing ^X ^U will turn ācathā into a full mention, like ā@ā. (This function will read the contents of your ā~/.config/jenny/followā file.)
@movq@www.uninformativ.de woot! š„³
git pull
warning: redirecting to https://movq.de/git/jenny.git/
Fetching objects: 38, done.
From https://uninformativ.de/git/jenny
ac51ce5..f44424c main -> origin/main
* [new tag] v26.03 -> v26.03
Updating ac51ce5..f44424c
Fast-forward
CHANGES | 4 ++++
LICENSE | 2 +-
README | 10 +++++-----
3 files changed, 10 insertions(+), 6 deletions(-)
@movq@www.uninformativ.de cd ~/jenny && watch -n 25 git pull. :-D
@prologic@twtxt.net @lyse@lyse.isobeef.org Yay! Time for a new jenny release, then. š
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.
@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.)
Testing jenny. You should probably ignore this, and the next twtxt.
@bender@twtxt.net Oops, missed this. I havenāt done any client work since my brief experiment modifying jenny a while back.
@bender@twtxt.net Sweet! So glad that Twtxt still lives, and that everyoneās been keeping busy. My main computer is broken, Itāll take me some time to setup jenny on the R-pi and try to catch-up.
Have a blessed week-end everyone!
Spent basically the entire day (except for the mandatory walk) fighting with Pythonās type hints. But, the result is that my widget toolkit now passes mypy --strict.
I really, really donāt want to write larger pieces of software without static typing anymore. With dynamic typing, you must test every code path in your program to catch even the most basic errors. pylint helps a bit (doesnāt need type hints), but thatās really not enough.
Also, somewhere along the way, I picked up a very bad (Python) programming style. (Actually, I know exactly where I picked that up, but I donāt want to point the finger now.) This style makes heavy use of dicts and tuples instead of proper classes. That works for small scripts, but it very quickly turns into an absolute mess once the program grows. Prime example: jenny. š©
I have a love-hate relationship with Pythonās type hints, because they are meaningless at runtime, so they can be utterly misleading. Iām beginning to like them as an additional safety-net, though.
(But really, if correctness is the goal, you either need to invest a ton of time to get 100% test coverage ā or donāt use Python.)
@bender@twtxt.net it works fine under jenny. Maybe it is a bug on Yarn?
How Long Does It Take to Fix Linux Kernel Bugs?
An anonymous reader shared this report from Itās FOSS:
Jenny Guanni Qu, a researcher at [VC fund] Pebblebed, analyzed 125,183 bugs from 20 years of Linux kernel development history (on Git). The findings show that the average bug takes 2.1 years to find. [Though the median is 0.7 years, with the average possibly skewed by āoutliersā discovered after years of hiding.] The longes ⦠ā Read more
Alleged manslaughter victim told classmate she was ātreated like a slaveā, court hears
A girl who was allegedly criminally neglected at the hands of her mother before she died told a friend she was ātreated like a slaveā and was āscared to go back homeā, a court has heard. ā Read more
Neighbour of manslaughter-accused mother heard āloud screamingā, court hears
A former neighbour of a mother standing trial accused of criminally neglecting her daughter tried to report concerns to an abuse line, but her call went unanswered, a court has heard. ā Read more
@lyse@lyse.isobeef.org Damn. That was stupid of me. I should have posted examples using 2026-03-01 as cutoff date. š
In my actual test suite, everything uses 2027-01-01 and then I have this, hoping that thatās good enough. š„“
def test_rollover():
d = jenny.HASHV2_CUTOFF_DATE
assert len(jenny.make_twt_hash(URL, d - timedelta(days=7), TEXT)) == 7
assert len(jenny.make_twt_hash(URL, d - timedelta(seconds=3), TEXT)) == 7
assert len(jenny.make_twt_hash(URL, d - timedelta(seconds=2), TEXT)) == 7
assert len(jenny.make_twt_hash(URL, d - timedelta(seconds=1), TEXT)) == 7
assert len(jenny.make_twt_hash(URL, d, TEXT)) == 12
assert len(jenny.make_twt_hash(URL, d + timedelta(seconds=1), TEXT)) == 12
assert len(jenny.make_twt_hash(URL, d + timedelta(seconds=2), TEXT)) == 12
assert len(jenny.make_twt_hash(URL, d + timedelta(seconds=3), TEXT)) == 12
assert len(jenny.make_twt_hash(URL, d + timedelta(days=7), TEXT)) == 12
(In other words, I donāt care as long as itās before 2027-01-01. šš )
Hmmm, looks like my twt hash algorithm implementation calculates incorrect values. Might be the tilde in the URL that throws something off. :-? At least yarnd and jenny agree on a different hash.
@aelaraji@aelaraji.com yeah, it looks tedious because it is. LOL. I can twt no matter where I am because a) with Yarn is as easy as opening a web browser, and b) with jenny is as easy at SSHing to my VPS. But, the keyword is fun. Thatās what matters!
@movq@www.uninformativ.de streamlining jenny.vim?
index adc0db9..cb54abc 100644
--- a/vim/ftdetect/jenny.vim
+++ b/vim/ftdetect/jenny.vim
@@ -1 +1,2 @@
au BufNewFile,BufRead jenny-posting.eml setl completefunc=jenny#CompleteMentions fo-=t wrap
+au BufRead,BufNewFile jenny-posting.eml normal $
@dce@hashnix.club Ah, oh, well then. š„“
My client supports that, if you set multiple url = fields in your feedās metadata (the top-most one must be the āmainā URL, that one is used for hashing).
But yeah, multi-protocol feeds can be problematic and some have considered it a mistake to support them. š¤
@kingdomcome@yarn.girlonthemoon.xyz I REPLIED TO THIS AND NOW ITāS NOT SHOWING WTFFFF anyway what i said was that i have some fun stuff in the daily note template already like ASCII weather forecast from wttr AND a jenny holzer quote from fortune!!! i should add more fun stuff!!!
setpriv on Linux supports Landlock.
@prologic@twtxt.net Yeah, itās not a strong sandbox in jennyās case, it could still read my SSH private key (in case of an exploit of some sort). But I still like it.
I think my main takeaway is this: Knowing that technologies like Landlock/pledge/unveil exist and knowing that they are very easy to use, will probably nudge me into writing software differently in the future.
jenny was never meant to be sandboxed, so it canāt make great use of it. Future software might be different.
(And this is finally a strong argument for static linking.)
PSA: setpriv on Linux supports Landlock.
If this twt goes through, then restricting the filesystem so that jenny can only write to ~/Mail/twt, ~/www/twtxt.txt, ~/.jenny-cache, and /tmp works.
I have zero mental energy for programming at the moment. š«¤
Iāll try to implement the new hashing stuff in jenny before the ādeadlineā. But I donāt think youāll see any texudus development from me in the near future. ā¹ļø
@andros@twtxt.andros.dev You know, Iād really love to see how/if location-based addressing works in practice. I might fork jenny to judy and run both things in parallel for a while ⦠š¤
tt2 from @lyse and Twtxtory from @javivf?
@prologic@twtxt.net I have:
- jenny
- buckketās original (patched, or not)
- tt/tt2
- Timeline
- Twtxtory
- Yarnd
@prologic@twtxt.net well, this fork will work. I an fork this one with jenny, not so with Yarnd.
Interesting factoid⦠By inspecting my āfollowersā list every now and again, I can tell who uses a client like jenny, tt or any other client where fetches are driven by user interactions of invoking the app. What do we call this type of client? Hmmm š¤ Then I can tell who uses yarnd because they are āseenā more frequently š¤£
@bender@twtxt.net It isnāt @aelaraji@aelaraji.comās fault at all here š I think the only way I can improve this somewhat is by introducing a similar convergence that I believe @movq@www.uninformativ.de built for Jenny which would fetch the mentioned feed temporarily to see if it contains the subject being replied to (in case itās not in the cache).
Iāll think about doing this too, but I have to do it carefully so as not to cost too much in terms of resources or performanceā¦
@bender@twtxt.net You said:
as long as those working on clients can reach an agreement on how to move forward. That has proven, though, to be a pickle in the past.
I think this is because we probably need to start thinking about three different aspects to the ecosystem and document them out:
- Specifications (as they are now)
- Server recommendations (e.g: Timeline, yarnd, etc)
- Client recommendations (e.g: jenny, tt, tt2, twet, etc)
@movq@www.uninformativ.de json and database put together sounds terrifying. i must try jenny
jenny really isnāt well equipped to handle edits of my own twts.
For example, in 2021, this change got introduced:
https://www.uninformativ.de/git/jenny/commit/6b5b25a542c2dd46c002ec5a422137275febc5a1.html
This means that jenny will always ignore my own edits unless I also manually edit its internal ājson databaseā. Annoying.
That change was requested by a user who had the habit of deleting twts or moving them to another mailbox or something. I think that person is long gone and I might revert that change. š¤
si4er3q. See https://twtxt.dev/exts/twt-hash.html, a timezone offset of +00:00 or -00:00 must be replaced by Z.
Scratch that, no bug in jenny. Thereās actually a test case for this. Python normalizes -00:00 to +00:00, so the negative case never happens.
@david@collantes.us @andros@twtxt.andros.dev The correct hash would be si4er3q. See https://twtxt.dev/exts/twt-hash.html, a timezone offset of +00:00 or -00:00 must be replaced by Z.
(That said, thereās a bug in jenny as well. It only replaces +00:00, not -00:00. š¤”)
i have got to try the jenny yarn client it looks so fun and old schoolā¦ā¦..
@andros@twtxt.andros.dev jenny can and, IIRC, Yarn also supports it. š¤
I think @movq@www.uninformativ.de removed support for it in jenny. š«
@andros@twtxt.andros.dev I believe you have just reproduced the bug⦠it looks like youāve replayed to a twt but the hash is wrong. I can see the hash here from Jenny, but it doesnāt look like it corresponds to any{twt,thing}. if you check it out on any yarn instance it wonāt look like a replay.
@andros@twtxt.andros.dev hmmm⦠pretty strange, isnāt it? replaying to threads worked perfectly, Iāve only had that problem trying to replay to a twt that was part of a thread.
As an example, this one is a Fork-Replay from Jenny. My next twt will be a replay to this exact twt but from twtxt-el as a test.
Then Iāwill file an issue if it doesnāt behave the way itās supposed to. Cheers!
Yes, error on my side. All of the sudden jenny refused to show me my own posts. Had to recreate mailbox (got rid of cache too) to make it work.