• v1.12.1 75faf54661

    v1.12.1
    All checks were successful
    Auto Release on version bump / release (push) Successful in 8s
    Stable

    Ghost released this 2026-09-20 01:42:36 +02:00 | 37 commits to main since this release

    Changed

    • La barra compatta sta su una riga sola: "Filtra:" affiancato alle icone invece che sopra, senza la linea di separazione che serviva quando stavano su due righe. Le icone vanno a capo da sole se lo schermo non basta.

    Fixed

    • Il tooltip mostrava il nome senza il conteggio. Il title del chip c'era, ma ogni icona porta un proprio <title> (il nome della piattaforma, parte delle icone Simple Icons) e il browser mostra quello dell'elemento sotto il puntatore: siccome l'icona occupa quasi tutto il quadrato, vinceva sempre lei. Le icone dei filtri sono ora inerti al puntatore (pointer-events: none), così compare il title del chip con nome e numero; il clic resta al label e continua a selezionare il filtro.
    • Le icone sono marcate decorative (aria-hidden="true" focusable="false", aggiunti dopo la sanitizzazione kses): il nome della piattaforma è già scritto accanto o nascosto alla sola vista, quindi il <title> interno faceva leggere due volte la stessa parola agli screen reader.
    Downloads
  • v1.12.0 60ccd04608

    v1.12.0
    All checks were successful
    Auto Release on version bump / release (push) Successful in 7s
    Stable

    Ghost released this 2026-09-20 01:33:28 +02:00 | 38 commits to main since this release

    Added

    • Barra dei filtri compatta, scelta dalla nuova impostazione Stile della barra filtri (Aspetto): resta "Filtra:" seguito dalle sole icone, ciascuna in un quadrato da 36px con cornice leggera — 36px perché sotto quella misura il bersaglio diventa difficile da centrare da telefono, mentre l'icona resta a 22px. Piattaforma inclusa a colori, esclusa in grigio.
    • Nome e conteggio, che nella barra compatta sparirebbero, finiscono nel title del chip e restano nel markup nascosti solo alla vista (clip-path), quindi continuano a essere letti dagli screen reader e trovati dalla ricerca nel testo della pagina.
    • Il title con nome e conteggio viene aggiunto in entrambi gli stili: nella barra completa è un'informazione in più a costo zero.

    Changed

    • Una piattaforma esclusa ha ora l'icona in grayscale e non soltanto più pallida, in entrambi gli stili: lo stato acceso/spento si legge senza doverlo dedurre dall'opacità. Regola per slug, come tutto il resto dei filtri.

    Note

    • La scelta di non prevedere un'opzione per nascondere del tutto la barra è deliberata (richiesta dell'utente): i filtri sono CSS-only e partono da display:none su tutti i post, quindi rimuovere i checkbox senza una regola dedicata lascerebbe la timeline vuota.
    Downloads
  • v1.11.1 62dc279807

    v1.11.1
    All checks were successful
    Auto Release on version bump / release (push) Successful in 9s
    Stable

    Ghost released this 2026-09-20 00:22:31 +02:00 | 39 commits to main since this release

    Changed

    • Il link di un ascolto porta alla pagina del brano su ListenBrainz (/track/{mbid}) invece che alla registrazione su MusicBrainz: si resta sulla fonte configurata. Senza identificatore si va al profilo, come prima. Nota: ListenBrainz è una single-page app e risponde 200 a qualunque indirizzo, quindi la rotta va provata nel browser, non con una richiesta HTTP.
    • "Svuota cache adesso" ricostruisce subito la cache e dice quanti contenuti ha recuperato, invece di lasciare il lavoro alla prima visita della timeline. La tabella delle impostazioni si popola appena lo premi.

    Fixed

    • La colonna "ultimo recupero" diceva "nessun recupero" dopo ogni aggiornamento. maybe_upgrade() cancellava l'opzione di stato a ogni cambio di versione: un dato che porta la propria data e che serve proprio quando si controlla se l'aggiornamento è andato bene. Ora viene conservato e si rigenera solo la cache dei post, che con gli slug nuovi va comunque rifatta.
    • Un feed malformato non riempie più il log del sito: i tre parser XML (Lemmy, Pixelfed, RSS/Atom) tengono gli errori di libxml internamente (libxml_use_internal_errors) invece di lasciar stampare una decina di warning per ogni tentativo. Emerso dai test, dove un feed volutamente rotto ha prodotto dieci righe di warning.
    Downloads
  • v1.11.0 0640e384b8

    v1.11.0
    All checks were successful
    Auto Release on version bump / release (push) Successful in 8s
    Stable

    Ghost released this 2026-09-19 23:59:40 +02:00 | 40 commits to main since this release

    Added

    • Fonte RSS/Atom esterna: l'indirizzo di un feed qualsiasi — un blog, una newsletter, un podcast — con un'etichetta facoltativa. Un solo parser legge entrambi i formati (channel/item dell'RSS 2.0 e feed/entry dell'Atom), con immagine presa da enclosure, media:content o dal primo <img> del testo. Il nome mostrato viene dall'etichetta, altrimenti dal titolo del feed, altrimenti dal dominio. Slug rss, icona rss.svg (Simple Icons, CC0).
    • ListenBrainz: gli ascolti recenti via API pubblica GET /1/user/{utente}/listens, senza token (a differenza di Last.fm, che richiede una chiave). Ogni scheda mostra "Artista — Brano" con l'album quando c'è, e punta alla registrazione su MusicBrainz se l'mbid è disponibile (mbid_mapping.recording_mbid, con ripiego su additional_info.recording_mbid), altrimenti al profilo. Nessuna statistica: un ascolto non ne ha. L'URL dell'API è configurabile per chi ospita una propria istanza.
    • Icona a nota musicale disegnata per il plugin: Simple Icons non ha ListenBrainz, e usare il logo di MusicBrainz significherebbe marchiare i contenuti di un progetto con il simbolo di un altro della stessa famiglia.

    Changed

    • Rimosso lo slug blog, residuo mai prodotto da nessun fetcher e con un file icona (blog.svg) che non esisteva: al suo posto c'è la fonte RSS.
    • social-icons/ICONS-LICENSE.md aggiornato con le due icone nuove.

    Fixed

    • Il fetcher del feed usciva in silenzio quando l'indirizzo non era utilizzabile (non HTTPS, host privato o non risolvibile): unico campo della fonte, e nessun messaggio. Ora il motivo finisce nella tabella delle impostazioni. Trovato dai test prima del rilascio.
    Downloads
  • v1.10.1 8a37e41c6b

    v1.10.1
    All checks were successful
    Auto Release on version bump / release (push) Successful in 10s
    Stable

    Ghost released this 2026-09-19 23:51:17 +02:00 | 41 commits to main since this release

    Fixed

    • Un profilo compilato a metà veniva scartato in silenzio. Con il solo nome utente e senza URL dell'istanza (o viceversa) la piattaforma non compariva né in timeline né nella tabella delle impostazioni, perché l'elenco mostrava solo i profili completi: esattamente il silenzio che la tabella doveva eliminare. Ora quel profilo ha la sua riga, con scritto cosa manca. L'istanza predefinita di Forgejo (https://gitea.com) non conta da sola come configurazione.
    • Packaging. La riga *.md export-ignore in .gitattributes escludeva tutti i markdown dall'archivio di release, quindi nel plugin installato mancavano LICENSE.md e README.md — la GPL chiede che il programma sia accompagnato dal testo della licenza. Ora l'elenco è esplicito: fuori restano solo CHANGELOG.md, README.it-IT.md, LICENSE.IT.md e i file di sviluppo.

    Added

    • social-icons/ICONS-LICENSE.md: da dove vengono le icone (Simple Icons, CC0-1.0), la nota che i marchi restano dei rispettivi progetti e sono usati solo per identificare le piattaforme, i link alle linee guida di ciascun marchio (trademark Mastodon, branding Bluesky, logo license exemption Forgejo, CC BY-SA 4.0 per i loghi ufficiali Lemmy e PeerTube) e le regole per sostituire un'icona con la propria. Il file sta dentro social-icons/ e non nella root, dove Plugin Check segnalerebbe un markdown inatteso.
    Downloads
  • v1.10.0 1453f8ffdb

    v1.10.0
    All checks were successful
    Auto Release on version bump / release (push) Successful in 9s
    Stable

    Ghost released this 2026-09-17 23:43:10 +02:00 | 42 commits to main since this release

    Added

    • Pixelfed, tramite il feed Atom pubblico del profilo (/users/{nome}.atom): foto, didascalie, date e link. Nessuna statistica, perché il feed non la porta. L'API Mastodon non è utilizzabile: risponde al lookup dell'account ma reindirizza l'endpoint degli stati alla pagina di login. Il parser è dedicato (feed/entry con namespace media:), diverso dal parser RSS 2.0 di Lemmy. Nuovo slug con tutti i punti per-slug: filtro CSS, token icona chiaro/scuro, $icons, icona pixelfed.svg (Simple Icons, CC0).
    • L'indirizzo completo del profilo è accettato in ogni campo e viene spezzato in istanza + nome: https://lemmy.ml/u/nome, https://mastodon.uno/@nome, /users/nome, nome@istanza, https://peertube.tv/c/nome@host/videos, https://pixelfed.uno/nome, https://bsky.app/profile/handle. Un URL di sola istanza (https://lemmy.ml) non viene interpretato come profilo.
    • Quando il nome porta con sé la propria origine (un canale PeerTube remoto visto da un'altra istanza) il plugin interroga quella istanza invece di chi la federa: il risultato non dipende dallo stato della federazione.
    • Tabella "Profili configurati" nelle impostazioni: per ogni piattaforma mostra cosa vede il plugin (istanza, software, account o canale, numero di contenuti) e l'esito dell'ultimo recupero. Le verifiche girano al salvataggio e si possono ripetere col pulsante Verifica profili; la pagina non interroga nulla mentre si carica, altrimenti aprirla costerebbe cinque o sei richieste HTTP e sarebbe ostaggio dei timeout.

    Fixed

    • Canali PeerTube. Su PeerTube i video stanno quasi sempre in un canale, non nell'account, e i due usano endpoint diversi (/api/v1/video-channels/ e /api/v1/accounts/): il plugin conosceva solo il secondo, quindi un canale non restituiva nulla. Misurato sul caso reale: tube.tchncs.de/api/v1/accounts/s3nnet/videos → 404, tube.tchncs.de/api/v1/video-channels/s3nnet/videos → 200 con 147 video. Ora il tipo si ricava dall'indirizzo quando lo incolli, altrimenti si scopre una volta e resta in cache.
    • Messaggi di errore specifici al posto dell'invito generico a ricontrollare: "su %s non esiste né un account né un canale di nome %s", "il feed utente di Lemmy esiste solo dove l'account è registrato", "l'istanza richiede autenticazione".
    Downloads
  • v1.9.1 bc326c79f0

    v1.9.1
    All checks were successful
    Auto Release on version bump / release (push) Successful in 8s
    Stable

    Ghost released this 2026-09-17 22:52:41 +02:00 | 43 commits to main since this release

    Fixed

    • Lo shortcode [eg_social_timeline] non era più registrato: nella 1.9.0 la riga add_shortcode('eg_social_timeline', 'eg_social_timeline_shortcode') stava tra fetch_all_feeds() e la funzione dello shortcode, ed è stata rimossa insieme al blocco riscritto. Senza registrazione WordPress non riconosce il tag e lo stampa come testo nella pagina. Lezione: un controllo automatico aveva segnalato eg_social_timeline_shortcode come "definita e mai richiamata" e la segnalazione era corretta.
    Downloads
  • v1.9.0 e88122df71

    v1.9.0
    All checks were successful
    Auto Release on version bump / release (push) Successful in 8s
    Stable

    Ghost released this 2026-09-17 22:16:17 +02:00 | 44 commits to main since this release

    Changed

    • Tutte le piattaforme si configurano allo stesso modo: URL dell'istanza + nome utente. Mastodon chiedeva l'URL completo del profilo mentre Forgejo e PeerTube chiedevano due campi separati, senza alcuna ragione tecnica: il codice spezzava quell'URL nelle stesse due informazioni due righe dopo (preg_match in get_mastodon_account_id).
    • Diggita diventa supporto Lemmy generico. Il fetcher parlava già Lemmy — /feeds/u/{username}.xml è il formato dei feed utente Lemmy, e il feed stesso si presenta come "diggita lemmy social" — ma con il dominio inchiodato nel codice. Ora l'istanza è un'impostazione e funziona qualsiasi istanza Lemmy. Il nome sulle schede viene dal dominio: diggita.com resta "Diggita", lemmy.ml è "Lemmy", sh.itjust.works è "Itjust" (un sottodominio corto viene saltato).
    • Le impostazioni delle versioni precedenti vengono convertite alla lettura: l'URL Mastodon viene spezzato, Diggita diventa un'istanza Lemmy, i limiti per piattaforma sono riportati. L'opzione non viene riscritta: il database si allinea al primo salvataggio.
    • Il vero logo Lemmy sostituisce un segnaposto disegnato a mano, e si aggiunge l'icona Pleroma (entrambe da Simple Icons, CC0).

    Added

    • Rilevamento del software di un'istanza del fediverso via /.well-known/nodeinfo (in cache 7 giorni): Pleroma e Akkoma ottengono nome e icona propri invece di quelli di Mastodon, che sarebbe come marchiare Forgejo col logo di GitHub. L'href del documento nodeinfo viene accettato solo se punta allo stesso host dell'istanza, altrimenti sarebbe un SSRF servito su richiesta.
    • Salvando un'istanza che non espone l'API pubblica arriva una spiegazione invece del silenzio. Misurato sul campo: Mastodon e Pleroma/Akkoma rispondono al lookup senza autenticazione; GoToSocial e Friendica rispondono 401; Misskey e Sharkey usano un'API propria; Pixelfed risponde al lookup ma reindirizza gli stati al login.
    • Esito per piattaforma nelle impostazioni: dopo ogni aggiornamento della cache il plugin registra quanti contenuti ha portato ciascuna piattaforma configurata e mostra un avviso per quelle vuote, con il motivo quando lo conosce (istanza che richiede autenticazione, account non trovato, feed Lemmy chiesto all'istanza sbagliata).

    Fixed

    • Il parser del profilo accettava solo la forma /@utente: un indirizzo legittimo come /users/utente non corrispondeva, fetch_mastodon() restituiva un array vuoto e Mastodon spariva dalla timeline senza un avviso, perché il log stava dietro EG_SOCIAL_TIMELINE_DEBUG che è false nei pacchetti. Ora riconosce anche /users/utente e @utente@istanza.
    • Nel parser il delimitatore della regex era # e la classe conteneva [^/?#]: il carattere chiudeva l'espressione in anticipo (Unknown modifier ']') e ogni URL veniva rifiutato. Trovato dai test prima del rilascio.
    • Gli URL delle istanze vengono normalizzati e validati in un solo punto (normalize_instance()): solo HTTPS, host privati e riservati rifiutati.
    Downloads
  • v1.8.1 19b56ecca8

    v1.8.1
    All checks were successful
    Auto Release on version bump / release (push) Successful in 8s
    Stable

    Ghost released this 2026-09-17 21:16:56 +02:00 | 45 commits to main since this release

    Fixed

    • Il contrasto si calcola dal colore, non si deduce dallo schema. Nella 1.8.0 testo, bordi, badge, link e icone seguivano lo schema colori globale: una scheda nera con schema "sempre chiaro" restava con testo e icone scuri sul nero. Ora il plugin misura il rapporto di contrasto WCAG del colore scelto per la superficie e sposta il primo piano sulla palette che contrasta di più (nessuna soglia arbitraria: si confrontano i due contrasti e vince il maggiore).
    • Le icone sui chip dei filtri leggono token propri (--egst-chip-icon-*) invece di seguire la scheda: con una scheda scura si schiarivano pur stando su chip chiari.

    Added

    • Sfondo delle schede Trasparente: la timeline diventa una lista senza superfici, con il solo bordo a delimitare i post (l'ombra viene rimossa, su una superficie trasparente sarebbe un artefatto).
    • Avviso nel pannello quando il colore personalizzato non raggiunge il minimo WCAG AA (4.5:1) con nessuna delle due palette di testo, con il rapporto misurato: un viola o un grigio medio non permettono testo leggibile e tacerlo non aiuterebbe.

    Changed

    • Sezione Aspetto semplificata: via l'impostazione Schema colori e le coppie di colori chiaro/scuro. Ogni superficie ha un solo menu (trasparente · preset neutro · segue il browser del visitatore · colore personalizzato) e un solo colore.
    • Etichette dello stile icone riscritte in "Colori delle piattaforme" e "Un solo colore (quello del testo)": le icone SVG sono sagome monocromatiche senza colore proprio, è il foglio di stile a dipingerle. Se un file SVG porta i propri fill, quelli vincono e l'impostazione non ha effetto su quella piattaforma.
    • Il foglio di stile non contiene più nessuna @media (prefers-color-scheme: dark): i colori sono organizzati in due palette sorgente (--egst-light-*, --egst-dark-*) e in token attivi che le leggono. La media query viene emessa nel CSS inline solo se una superficie segue il browser, oppure se entrambe sono trasparenti e non c'è alcun colore da misurare.
    • Le impostazioni salvate con la 1.8.0 vengono convertite alla lettura (color_scheme + coppie di colori → una scelta e un colore per superficie), senza riscrivere l'opzione: il database si allinea al primo salvataggio dal pannello.
    Downloads
  • v1.8.0 ad158b86f7

    v1.8.0
    All checks were successful
    Auto Release on version bump / release (push) Successful in 9s
    Stable

    Ghost released this 2026-09-17 19:59:59 +02:00 | 46 commits to main since this release

    Added

    • Nuova sezione Aspetto nelle impostazioni: schema colori (sempre chiaro / sempre scuro / segue il browser del visitatore), sfondo della timeline, sfondo delle schede e stile delle icone di piattaforma.
    • Lo sfondo del contenitore della timeline si imposta in modo indipendente da quello delle schede, con una coppia di colori distinti per schema chiaro e scuro (preset trasparente/neutro oppure colori personalizzati).
    • Stile icone selezionabile: colori brand oppure monocromatico (le icone monocromatiche seguono il colore del testo, quindi diventano bianche sulle schede scure).

    Fixed

    • Le icone delle piattaforme erano sempre nere: i file SVG Simple Icons non hanno l'attributo fill, quindi le regole color: del foglio di stile restavano inerti e sulle schede scure le icone diventavano invisibili. Aggiunto fill: currentColor, colore per piattaforma anche sui chip dei filtri e varianti brand schiarite sullo schema scuro.

    Changed

    • ⚠️ Il tema scuro non è più imposto dal browser. Il default è ora "sempre chiaro": la @media (prefers-color-scheme: dark) si applica solo scegliendo "segue il browser del visitatore". Per riavere il comportamento della 1.7.2 impostare Schema colori = "Segue il browser del visitatore".
    • Tutti i colori del CSS passano da custom properties (--egst-*) dichiarate sul contenitore .eg-social-timeline: un CSS personalizzato può ridefinire il tema in un punto solo invece di inseguire ogni singola regola. I due blocchi di token scuri (classe e media query) sono volutamente duplicati: in CSS puro una @media non si può raggruppare con un selettore di classe.
    • Il messaggio "nessun post disponibile" è racchiuso nel contenitore della timeline, così eredita i colori scelti.
    • readme.txt: Tested up to allineato a WordPress 7.1.

    Accessibility

    • L'elemento <title> delle icone SVG non viene più rimosso dalla sanitizzazione kses, così ogni icona conserva il proprio nome accessibile.
    Downloads