Written Whisper intră în Fediverse

De ceva timp mă gândeam să adaug suport ActivityPub la Written Whisper și azi am terminat treaba. Practic am transformat jurnalul dintr-o platformă obișnuită într-un nod federat - ceea ce înseamnă că acum vorbește același protocol pe care îl folosesc Mastodon, Pixelfed, Lemmy, Loops și zecile de alte platforme care formează Fediverse-ul.

Ce înseamnă asta concret? Dacă cineva de pe Mastodon vrea să urmărească ce scriu, îi e de ajuns să caute @thinkroot@thinkroot.xyz - nu trebuie să-și creeze cont pe nicio altă platformă, postările apar direct în feed-ul lui ca de la orice alt utilizator Mastodon.

Mecanismul din spate e simplu de înțeles: când public un articol, o notă sau o fotografie, platforma trimite automat o activitate Create tuturor celor care mă urmăresc din Fediverse. Dacă editez, trimite Update. Dacă șterg, trimite Delete. Totul se întâmplă în fundal, fără să fac nimic suplimentar. Tipurile de conținut se mapează natural - notele apar ca postări text obișnuite în Mastodon, fotografiile vin cu imaginea atașată exact ca o postare cu imagine, iar articolele apar cu titlul bold urmat de conținut complet, mai lungi decât o postare obișnuită, dar Mastodon le afișează corect.

Pentru ca un server să poată fi găsit în Fediverse, trebuie să implementezi câteva standarde de descoperire. Am implementat WebFinger la /.well-known/webfinger - acesta e mecanismul prin care Mastodon găsește un cont după handle. Când cineva caută @thinkroot@thinkroot.xyz, serverul lor face o cerere la această adresă și primește informațiile despre actor. Am adăugat și NodeInfo la /.well-known/nodeinfo și /nodeinfo/2.0, care descrie serverul: ce program rulează, ce protocoale sunt folosite, câte postări are. NodeInfo e necesar pentru a fi indexat în directoare ca fediversesearch.com și e verificat obligatoriu de Pixelfed și Lemmy înainte de a accepta un server ca nod federat. Am implementat și host-meta la /.well-known/host-meta pentru compatibilitate cu platforme mai vechi precum Diaspora și Friendica, care folosesc un protocol de descoperire anterior WebFinger.

Pe partea de securitate, federarea nu înseamnă că oricine poate trimite orice în inbox-ul jurnalului. Toate cererile outgoing sunt semnate cu o cheie RSA de 2048 de biți, iar Follow-urile primite sunt verificate criptografic prin HTTP Signatures - standardul folosit de Mastodon pentru autentificarea serverelor.

Un lucru care mă bucură e că și comentariile din Fediverse funcționează. Când cineva de pe Mastodon răspunde la o postare de-a mea, reply-ul ajunge automat în panoul de admin, în secțiunea de comentarii Fediverse, cu avatarul și numele actorului și cu un badge care îl distinge de comentariile locale. Pot să-l aprob sau să-l șterg exact ca orice alt comentariu, iar dacă răspund din admin, răspunsul e livrat automat în inbox-ul celui care a comentat, care primește o notificare în Mastodon ca la orice reply obișnuit.

Dincolo de Fediverse, am rezolvat azi și câteva probleme mai vechi. Panoul de admin are acum o structură mai clară - setările sunt împărțite în trei pagini separate (Platformă, Fediverse și Credențiale), iar comentariile sunt și ele organizate în trei secțiuni distincte cu URL propriu, astfel că butonul Back din navigator funcționează corect și linkurile sunt direct accesibile. Publicarea draft-urilor folosea data de salvare în loc de data publicării, deci acum, când un draft e publicat, data de creare se actualizează la momentul publicării. Programarea articolelor nu funcționa din cauza unui format incompatibil între input-ul HTML (2026-05-16T15:00) și comparația din SQLite (2026-05-16 15:00:00) - litera T ffăcea ca orice dată programată să pară că nu a venit încă, iar soluția a fost normalizarea formatului la salvare. Am adăugat și un redirect 301 care asigură că orice hostname alternativ e redirecționat spre thinkroot.xyz, pentru că Fediverse funcționează corect doar dacă toate URL-urile actorului și endpoint-urile ActivityPub provin de pe un singur domeniu.

Dacă ai cont pe Mastodon sau altă platformă Fediverse și vrei să urmărești ce mai scriu, caută @thinkroot@thinkroot.xyz sau poți urmări ce public și pe contul personal.