blog · git · desktop · images · music · contact & privacy · gopher


jenny + mutt: Einstieg in twtxt

2021-09-19

Vorheriger Blogpost zu diesem Thema.

../../../../desktop/2021-09-19--katriawm-twtxt.png

— Update 2021-09-22: Im Release v21.09 gab es ein paar Erweiterungen bezüglich der Privatsphäre. Diese Anleitung wurde entsprechend aktualisiert. —

twtxt ist ein einfaches Format für einen „Microblog“. So ein bisschen wie Twitter oder RSS/Atom-Feeds, aber auf das absolute Minimum reduziert. Seit es in 2016 das Licht der Welt erblickte, hat es sich ein bisschen verändert – hauptsächlich durch Threading, das 2020 von Yarn.social (früher twtxt.net) eingeführt wurde. Es gab in 2016 und den Folgejahren schon so einige twtxt-Clients, aber nach meinem Kenntnisstand wurde keiner von denen dann angepasst, um diese Erweiterung zu unterstützen. Was macht man heutzutage also, wenn man eine hübsche Konsolenexperience mit twtxt haben will?

Eine Möglichkeit ist jenny, was ich selbst auch benutze.

In jennys README sind Einrichtungsanweisungen enthalten, aber ich mache jetzt trotzdem mal ein Walkthrough mit Screenshots dafür.

Den Code besorgen

jenny soll eigentlich auf dem lokalen Rechner laufen und nicht auf deinem Server im Internet, also machst du lokal das hier:

$ git clone https://uninformativ.de/git/jenny.git
$ cd jenny
$ git checkout v21.09

Damit bist du auf der Version, die zum Zeitpunkt des Schreibens dieses Blogposts aktuell war. In der Zwischenzeit kann es natürlich Änderungen gegeben haben. Wenn du möchtest, kannst du selbstverständlich auch neuere Releases oder den aktuellen main-Stand benutzen, aber dann lies bitte in CHANGES nach, was sich seitdem getan hat. Dieser Blogpost wird nicht an neuere Releases angepasst werden.

Dann die Abhängigkeiten über die Distribution installieren:

# pacman -Syu python-dateutil python-requests

Das sollte jetzt funktionieren:

$ ./jenny --help

Oder man macht irgendwas Verschnörkeltes mit virtualenv oder so.

Den eigenen twtxt-Feed einrichten

Man fange mit einer leeren Textdatei auf dem lokalen Rechner an. Nagut, ganz leer ist sie nicht, sondern sie muss mindestens zwei Zeilen an Metadaten enthalten:

# nick = cathy
# url  = https://my.server.com/twtxt.txt

Unter der Annahme, dass lokal auf dem Rechner in ~/web/my.server.com die gesamte eigene Webseite liegt, speichere man den Feed also unter ~/web/my.server.com/twtxt.txt ab.

jenny wird neue twts dort anhängen. Danach führt es einen Befehl aus, um die Datei tatsächlich im Internet zu veröffentlichen. Beides muss in der obligatorischen Config-Datei ~/.config/jenny/conf.json eingestellt werden:

{
    "maildir_target": "~/Mail/twt",
    "local_twtxt_file": "~/web/my.server.com/twtxt.txt",
    "publish_command": "some-rsync-script"
}

publish_command ist ein Skript, das du notwendigerweise selbst schreiben musst, weil es ganz und gar von deinem Setup abhängt. Du kannst hier einfach scp benutzen, um die Datei auf deinen Server zu kopieren, und fertig. Oder du machst git commit und git push irgendwo hin. Oder du setzt es eben doch auf /bin/true, weil du dich entschieden hast, das hier eben doch alles auf deinem öffentlichen Server auszuführen. Hängt alles von dir ab.

Sobald das alles erledigt ist, führe man testweise jenny aus: Es sollte dich in deinen $VISUAL-Editor werfen, in dem du einen neuen twt verfassen kannst. Für den Moment schreibst du einfach hello world rein und beendest den Editor. Danach prüfst du in ~/web/my.server.com/twtxt.txt, ob der neue Eintrag angekommen ist. Ebenso in https://my.server.com/twtxt.txt nachschauen, ob er erfolgreich im Internet gelandet ist.

Die mutt-Integration

An diesem Punkt angekommen, kann man nun twts schreiben und veröffentlichen. Aber wahrscheinlich will man auch die Posts anderer Leute lesen. Hier kommt dann mutt ins Spiel.

mutt ist eigentlich ein Mail-Client und hat gar nichts mit twtxt zu tun. Das Ding ist aber, dass mutt sehr gut darin ist, Gesprächsverläufe in Threads anzuzeigen und handzuhaben. Außerdem ist es wunderbar anpassbar. Daher schreibt jenny die daten in ein maildir und mutt arbeitet dann darauf. Normalerweise startet man daher nicht jenny direkt sondern mutt – und das ruft dann jenny auf.

Hier ist eine komplette Konfiguration für mutt mit integrierter jenny (welches nun im $PATH enthalten sein muss):

# Strictly necessary or highly recommended.
set mbox_type = Maildir
set sort = threads
set sort_aux = date-sent
set strict_threads = yes

# Optional styling.
color index yellow default ~P
set index_format = "%Z│%-15.15F│%3M│%s %* │%[%Y-%m-%d %H:%M]"

# To highlight messages sent by you.
alternates cathy

# Key binds for jenny: Alt+T to write a new twt, Alt+R to reply to
# thread, Alt+F to reply in a forked thread.
macro index,pager <esc>T "<shell-escape> jenny<Enter>" "Write new twt"
macro index,pager <esc>R "\
<enter-command> set my_pipe_decode=\$pipe_decode nopipe_decode<Enter>\
<pipe-message> jenny<Enter>\
<enter-command> set pipe_decode=\$my_pipe_decode; unset my_pipe_decode<Enter>" \
"Reply to current twt"
macro index,pager <esc>F "\
<enter-command> set my_pipe_decode=\$pipe_decode nopipe_decode<Enter>\
<pipe-message> jenny -t<Enter>\
<enter-command> set pipe_decode=\$my_pipe_decode; unset my_pipe_decode<Enter>" \
"Reply to current twt (fork conversation)"

Und dann kann man mutt aufrufen (hierfür wird man natürlich irgendeinen Shortcut einrichten wollen):

$ mutt -F ~/.muttrc-jenny -f ~/Mail/twt

An Leute, die schon mutt benutzen: Dieses ganze Setup kann unabhängig und parallel zum existierenden mutt-Setup benutzt werden.

Auf twts antworten

Nach dem Start von mutt sieht man irgendwie sowas:

mutt1.png

Diese twts hat jenny erstellt, während ich während der Setup-Schritte herumgespielt habe.

Wählen wir mal den letzten Eintrag aus und drücken Alt+Shift+R, um zu antworten. mutt startet jetzt jenny, was einen wiederum in den Editor wirft:

mutt2.png

Die letzte Zeile zitiert den twt, auf den wir antworten. Alles darüber wird dein neuer twt werden. Die ersten beiden Zeilen (@<cathy... und (#<5jg...) werden von jenny vorausgefüllt. Es ist üblich, in Antworten eine @-Mention des ursprünglichen Autors (hier @cathy) zu setzen. Den Subject-Hash #<5jgfnxq>, den jenny selbst berechnet, muss man zwingend benutzen, damit es ein Thread wird. Speichern, beenden, dann sieht man soetwas:

mutt3.png

Man beachte, wie mutt hier auch hübsch einen Thread darstellt.

Neue twts zu schreiben, geht dann ganz ähnlich. Man muss nur den anderen Hotkey in mutt drücken.

Anderen Leuten folgen

Um jemand anderem zu folgen, erstelle man die Datei ~/.config/jenny/follow. Das Format ist:

$name $url $optionale_flags

Beispielsweise:

sandra https://www.uninformativ.de/twtxt-blog-example.txt

Ja, leider muss der Name des anderen Users in der eigenen Config auftauchen. Das twtxt-Protokoll sieht nicht zwingend vor, dass alle Leute eine nick-Zeile in ihrem Feed haben (aber wenn sie existiert, wertet jenny sie auch aus).

Die optionalen Flags ignorieren wir jetzt einmal, mehr dazu in der README.

Damit diese Feeds auch tatsächlich abgerufen werden, braucht es noch einen Cronjob, einen systemd-Timer oder irgendetwas anderes, das regelmäßig das hier ausführt:

$ jenny -f

Für dieses Beispiel führen wir jetzt mal jenny -f manuell aus. Dann wieder mutt starten und es sollte so aussehen:

mutt4.png

Jetzt ergeben auch die Farben Sinn. Gelb sind die eigenen twts. Das „📣“ ist ein Zeichen dafür, dass man selbst hier erwähnt wurde.

Und das war’s dann auch schon. Glückwunsch und Willkommen im Twtiverse!

„Och nö, das ist mir zu kompliziert“

Wenn du bei twtxt mitmachen willst, ohne selbst großartig etwas zu tun (kein Self-Hosting, keine hübschen nerdigen Terminal-Spielzeuge), dann kannst du einfach einem der existierenden Yarn.social-Pods beitreten, zum Beispiel https://twtxt.net/. Account erstellen, fertig. Dafür gibt es dann sogar eine App für Android oder iOS, nennt sich Goryon.

Aber der Punkt von twtxt ist eigentlich, dass man es selbst hosten kann. Deswegen ist das aus technischer Sicht so einfach. Wenn du also technisch dazu in der Lage bist, solltest du Self-Hosting wählen.

Und wenn du trotzdem keine Lust auf so ein „uraltes“ Konsolenprogramm hast, dann kannst du auch deinen eigenen Yarn.social-Pod für eine Rundumsorgloswebanwendung aufsetzen.

Comments?