Added
- Notifiche Web Push per browser desktop e mobile, attivabili per ogni
dispositivo da Impostazioni account. Una coppia VAPID per istanza e le
subscription cifrate alimentano un'outbox dedicata; il poller la sopprime
quando l'utente e' attivo, altrimenti openbook:cron consegna dopo 75
secondi con testo localizzato e icona dell'istanza. Consegna best effort
senza retry, pulizia automatica degli endpoint scaduti e click sulla
notifica verso /notifiche tramite service worker.
- Menu condividi del post: voce Condividi a utente
(GET /posts/{post}/condividi-a-utente). Apre i messaggi privati con il
post gia' citato: scegli il destinatario e invia (commento opzionale).
La citazione riusa posts.quoted_post_id come le quote pubbliche, senza
incrementare il contatore di condivisione ne' notificare l'autore originale.
- Condividi a utente anche sui profili (icona accanto al messaggio
privato): GET /@{user}/condividi-a-utente e
GET /attori/{actor}/condividi-a-utente. Il messaggio cita il profilo
(posts.quoted_actor_id) con link alla pagina Openbook locale
(/@username o /attori/{id}), non all'URI ActivityPub originale, cosi'
il destinatario puo' seguire da questa istanza.
- Pannello di controllo, impostazioni istanza: upload della favicon
del sito. Da un'unica immagine (consigliato quadrato 512×512) vengono
generate la favicon 32×32, l'Apple Touch Icon 180×180 (iOS) e le icone
Android 192/512 (anche maskable) per «Aggiungi alla schermata Home»,
piu' un web app manifest in GET /manifest.webmanifest.
- Profili remoti (
GET /attori/{actor}): follower e seguiti usano i
conteggi totalItems delle collection ActivityPub del server di origine,
con cache di 24 ore (OPENBOOK_COLLECTIONS_CACHE_TTL_HOURS). La data di
iscrizione arriva dal campo published del documento Person (o equivalenti
JSON-LD / createdAt). Visitando il profilo si rilegge l'Actor se la data
non e' ancora in cache. Si conserva anche un campione della prima pagina
della lista (non l'intero grafo, e non nel grafo locale follows).
- Pannello di controllo, sezione Aspetto (
GET /admin/aspetto): CSS
personalizzato che sovrascrive il template sul sito pubblico (non sul
pannello). Anteprima live in iframe su una pagina di esempio
(GET /admin/aspetto/anteprima); il sito reale cambia solo al salvataggio.
- Impostazioni istanza: finestra in giorni per gli hashtag in tendenza
(sidebar e GET /tendenze, default 7). I conteggi oltre 999 si mostrano
in forma compatta (19,6k in italiano, 19.6k in inglese).
- Cliccando il numero di Mi piace o Condivisioni di un post si apre
un dropdown con chi ha reagito (GET /posts/{post}/piace-a e
GET /posts/{post}/condiviso-da). L'icona continua a mettere mi piace o
ad aprire il menu condividi. Senza JavaScript le stesse URL mostrano una
pagina con l'elenco. Massimo 40 nomi, poi "e altri N". La visibilita'
e' la stessa del post.
- Post remoti: i contatori Mi piace e Condivisioni sulle card
usano i totalItems delle collection likes/shares del server di
origine (stesso GET della Note usato per i commenti, TTL
OPENBOOK_REPLIES_CACHE_TTL_HOURS). Se il totale non e' inline, al
massimo un GET in piu' per collection, senza scaricare l'elenco
completo. Il conteggio locale resta un pavimento. I totali arrivano
anche dall'outbox quando si importa il post.
- Tab Attività sui profili Person (
GET /@{username}/attivitae
GET /attori/{actor}/attivita): stream cronologico di **commenti
(risposte) e condivisioni visibili a questa istanza, solo per
utenti autenticati**. I visitatori anonimi non vedono il tab e
/attivita reindirizza al login. I mi piace, i post propri e i follow
non compaiono: i post restano nel tab dedicato. Scorrimento infinito
(OPENBOOK_ACTIVITY_PER_PAGE, default 20). Sui profili remoti la
cronologia e' solo cio' che l'istanza gia' conosce (non l'outbox
completo). Community e feed RSS non hanno il tab.
- Menu del post: voce Modifica per i propri post locali pubblicati
(non i messaggi privati). Apre lo stesso composer della pubblicazione,
in un dialog se JavaScript e' disponibile (GET /posts/{post}/modifica
come fallback senza JS). Il salvataggio (PUT /posts/{post}) aggiorna
testo, titolo, avviso e visibilita', consente di aggiungere allegati,
e ritrasmette un'attivita' ActivityPub Update alla stessa audience.
Changed
- Box «In tendenza» della sidebar: il titolo include la finestra in
giorni impostata dall'istanza, es. In tendenza (7d).
- Tab Foto del profilo (
GET /@{username}/fotoe
GET /attori/{actor}/foto): scorrimento infinito come gli altri feed,
al posto della paginazione a numeri di pagina. Senza JavaScript resta
un link "Foto successive".
- Titoli dei post (campo titolo,
.ob-post__title): stessa dimensione del
testo del corpo, solo in grassetto. Prima ereditavano l'h2 del browser
e risultavano sproporzionati.
- Thread dei commenti sotto al post: un solo livello di indentazione.
Le risposte piu' profonde restano visibili nello stesso elenco, con il
collegamento "in risposta a" verso il padre. Cliccando l'orario si apre
la pagina del commento (GET /comments/{comment}): il post e i padri
sopra, i figli sotto. I client ActivityPub continuano a ricevere la Note.
- Reply in uscita: il composer e la UI locale restano senza
@automatico
(reply e citazione restano distinte, una sola notifica in-app). La Note
federata antepone pero' la menzione dell'autore a cui si risponde
(tag Mention, HTML, audience to/cc), cosi' Mastodon e gli altri
client remoti inviano la notifica che si aspettano.
Fixed
- Reply in arrivo (locali o remote) che menzionano anche l'autore del
post/commento padre: una sola notifica in-app. Commento/risposta e
menzione condividono l'id del commento (notifiable); se il thread e'
gia' stato notificato, la menzione non viene creata. Una menzione a
un'altra persona nello stesso commento continua ad arrivare.
- Ottimizzazione feed personale e suggerimenti: riduce il costo delle query usate dal feed personale e dalla pagina Mondo, evitando liste di UUID materializzate in PHP e subquery correlate ripetute.
- Profili remoti: la data di iscrizione non restava vuota sugli Actor gia'
in cache. Visitando il profilo si rilegge il documento Person e si
accettano anche published in JSON-LD e createdAt.
- Bio nel documento Actor ActivityPub (
summary): gli a-capo non vengono
piu' appiattiti in un unico paragrafo. Si usa lo stesso HTML dei post
(<br> per i singoli a-capo, <p> distinti per i paragrafi), cosi'
Mastodon e gli altri client remoti mostrano la formattazione.
- Iscrizione a una community locale: la notifica al proprietario non dice
piu' che l'utente «ha iniziato a seguirti». Distingue iscrizione
(:name si e' iscritto a :community) e richiesta su community privata.
- HTML federato dei post (e della bio): i link agli hashtag hanno
rel="tag" e class="mention hashtag", come Mastodon. Senza, Mastodon
trattava il primo hashtag come URL normale e mostrava la preview della
pagina tag di questa istanza (/tag/…).
- Titolo dei post federati: la Note include
name(oltre al fallback
<p><b>…</b></p> nel content per Mastodon). Un'altra istanza Openbook
che apre il profilo remoto mostra il titolo come titolo, senza
duplicarlo nel corpo. Le Note vecchie, con solo il <b> iniziale,
vengono riconosciute allo stesso modo.
- Query «In tendenza» su MySQL/MariaDB: su
post_hashtagsil campione
delle statistiche InnoDB passa da 20 a 100 pagine
(STATS_SAMPLE_PAGES). Con il default l'optimizer a volte partiva da
un full scan di hashtags invece che dai post recenti. SQLite non e'
toccato.
- Post in una community locale (e verso un Group remoto): l'HTML federato
aggiunge in coda una menzione visibile in @community@dominio (stesso
href del tag Mention, class="u-url mention"). Mastodon mostra cosi'
l'appartenenza nel testo; audience e tag da soli non bastano. In locale
il corpo del post resta pulito: la community resta il badge della card.