EG Social Timeline plugin WordPress: una timeline unificata per Mastodon, Bluesky, Forgejo e Diggita

Da tempo sentivo il bisogno di riportare su WordPress qualcosa che oggi sembra quasi rivoluzionario: una pagina hub attività per permettere ad amici, lettori e curiosi di capire cosa faccio online senza inseguire link su piattaforme diverse.

EG Social Timeline importa feed social senza JavaScript, senza tracking, senza consegnare dati a terzi. Solo PHP, HTML e CSS, senza dipendere da API proprietarie, senza widget invasivi, senza mezzo framework per visualizzare righe di testo. La cache usa l’infrastruttura nativa di WordPress, senza tabelle aggiuntive, senza complicazioni.

Cos’è EG Social Timeline

EG Social Timeline è un plugin WordPress che raccoglie l’attività pubblica da Mastodon, Bluesky, Forgejo e Diggita, la ordina cronologicamente e la mostra in una pagina tramite shortcode.

È software libero, licenza GPL-2.0-or-later, e il codice sorgente è pubblico sul mio Forgejo self-hosted.

È ancora in sviluppo attivo ma lo uso ogni giorno e lo miglioro man mano. Non è ancora sul repository ufficiale di WordPress.

Una nota sugli aggiornamenti

Poiché EG Social Timeline non è ospitato su Plugin di WordPress, non si aggiorna automaticamente come i plugin ufficiali: WordPress non sa della sua esistenza e non controlla i nuovi rilasci.

Per tenerlo aggiornato hai due strade. La prima è manuale: controllare periodicamente il repository per vedere se è uscita una nuova versione, scaricare lo zip e installarlo da Plugin > Aggiungi nuovo > Carica plugin.

La seconda è usare EG Forgejo Updater, un altro plugin che aggiunge il supporto agli aggiornamenti automatici per i plugin ospitati su Forgejo. Con Forgejo Updater installato, EG Social Timeline si aggiorna esattamente come un plugin di WP.

Le piattaforme supportate e come vengono interrogate

Ogni piattaforma usa un meccanismo diverso per esporre i dati pubblici, e il plugin li gestisce in modo appropriato per ciascuna.

Mastodon

Il plugin usa le API pubbliche di Mastodon v1 — nessuna chiave, nessun token. Basta l’URL del profilo (es. https://mastodon.uno/@emanuelegori). Il plugin estrae l’istanza e il nome utente dall’URL, risolve l’ID account tramite l’endpoint /api/v1/accounts/lookup, poi recupera gli stati.

Puoi scegliere se includere i boost o mostrare solo i post originali. L’API supporta i parametri exclude_replies e exclude_reblogs, quindi il filtraggio avviene lato server, non lato client.

Bluesky

Bluesky espone un’API ATP pubblica (public.api.bsky.app) che non richiede autenticazione. Basta l’handle (es. emanuele.bsky.social). Il plugin usa l’endpoint app.bsky.feed.getAuthorFeed con il filtro posts_no_replies, solo i post originali, nessuna risposta nel feed.

L’URL del singolo post viene ricostruito a partire dall’URI at:// contenuta nella risposta: si estrae la rkey e si compone l’URL bsky.app/profile/{handle}/post/{rkey}. Funziona in modo affidabile anche senza autenticazione.

Forgejo e Gitea

Il plugin interroga l’API pubblica di Forgejo per ottenere l’elenco dei repository pubblici dell’utente, poi recupera i commit più recenti da ciascuno. Il limite totale configurato viene distribuito equamente tra tutti i repo: se hai 5 repository pubblici e imposti un massimo di 10 commit, il plugin ne prende 2 per repo. Lo scopo è evitare che un progetto su cui stai lavorando intensamente monopolizzi tutta la timeline a scapito degli altri.

I commit dei repository privati non vengono mai inclusi. Funziona con qualsiasi istanza Forgejo o Gitea.

Diggita

Diggita espone un feed RSS pubblico per utente. Il plugin lo analizza con simplexml_load_string e fa un parsing aggiuntivo della descrizione per estrarre i punti e i commenti — informazioni che nel feed Diggita sono incorporate nel campo description come testo HTML, non come metadati separati.

Filtri per piattaforma senza JavaScript

Una delle scelte tecniche di cui sono più soddisfatto: i filtri per piattaforma non aggiungono nessun JavaScript alla pagina.

Il trucco è il classico pattern checkbox + label + sibling selector in CSS puro. I checkbox vengono generati prima del contenitore della timeline, così cliccando sull’etichetta di una piattaforma la si nasconde dalla timeline.

Cache e prestazioni

Ogni caricamento della timeline farebbe potenzialmente quattro richieste HTTP esterne. Per evitarlo, il plugin usa i WP Transients — il sistema di cache integrato in WordPress — con una durata configurabile da 30 minuti a 24 ore.

Quando salvi le impostazioni, la cache viene invalidata automaticamente. C’è anche un pulsante per svuotarla manualmente dalla pagina di configurazione, utile quando hai appena pubblicato qualcosa e vuoi che appaia subito.

Sicurezza: protezione anti-SSRF

Il plugin accetta URL configurati dall’amministratore (istanza Forgejo, profilo Mastodon). C’è un rischio concreto di SSRF (Server-Side Request Forgery) se quegli URL puntassero a risorse interne del server.

Per questo ho implementato una funzione di validazione eg_social_timeline_is_public_url che rifiuta indirizzi IP privati, localhost, e qualsiasi hostname che si risolva in un IP della rete privata o riservata. Il controllo avviene tramite gethostbyname e FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE. Non è un controllo banale, ed è applicato a tutti gli URL esterni prima di fare qualsiasi richiesta HTTP.

Come si usa

L’installazione è quella standard di qualsiasi plugin WordPress. Una volta attivato, vai su Impostazioni > EG Social Timeline, configura i tuoi profili, e inserisci lo shortcode [ eg_social_timeline] (senza spazio) nella pagina o nell’articolo dove vuoi mostrare la timeline.

Dalle impostazioni puoi definire un limite per ciascuna piattaforma: per Mastodon e Bluesky il limite viene passato direttamente all’API, che restituisce solo il numero richiesto; per Diggita e Forgejo il plugin scarica i dati disponibili e poi taglia al limite impostato. In entrambi i casi il risultato è lo stesso: nessuna piattaforma può monopolizzare la timeline a scapito delle altre.

Il parametro limit è opzionale: [ eg_social_timeline limit="20"] (senza spazio) sovrascrive il limite configurato nelle impostazioni.

Cosa manca ancora EG Social Timeline – Release v1.2.0

Essere onesti sullo stato di sviluppo è più utile di qualsiasi marketing. Queste sono le funzionalità che ho in mente o che mancano:

  • Paginazione o “carica altri”: per ora la timeline mostra un numero fisso di post
  • Supporto per altre piattaforme del Fediverso: il plugin funziona con qualsiasi istanza Mastodon-compatibile, ma non ha ancora supporto esplicito per Pixelfed, Peertube o simili
  • Block editor Gutenberg: per ora esiste solo lo shortcode, nessun blocco dedicato
  • Immagini e media: i post con allegati mostrano solo il testo
  • Traduzioni complete: l’italiano e l’inglese sono parzialmente supportati, ma i file .po non sono completi

⭐ Hai domande sul plugin, vuoi segnalare un problema o semplicemente raccontarmi come lo stai usando? Lascia un commento qui sotto.

Fonti e Riferimenti

OWASP: Server-Side Request Forgery (SSRF) — riferimento per la protezione implementata

Repository EG Social Timeline — codice sorgente, changelog, istruzioni

EG Forgejo Updater — plugin per aggiornamenti automatici da Forgejo

Documentazione API Mastodon v1 — endpoint pubblici utilizzati dal plugin

AT Protocol (Bluesky) — Public API — endpoint getAuthorFeed

Forgejo API documentation — endpoint repos e commits

emanuelegori
emanuelegori

Emanuele Gori scrive di software libero, privacy digitale e self-hosting.
Homelab Notes nasce dalla convinzione che la tecnologia debba servire chi la usa, non chi la vende. Qui trovi guide pratiche e analisi per riprendere il controllo della tua vita digitale, un servizio alla volta.
Sul Fediverso come nella vita: senza algoritmi di mezzo.
Quando non scrive, è online nel Fediverso con spirito indipendente e tanta voglia di condividere conoscenza.

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Leave the field below empty!