implementazione webmentions self-hosted
Origine
Ho scoperto le Webmention leggendo la specifica IndieWeb.
Nessun API key. Nessun OAuth. Nessun account su piattaforme terze. Solo due URL:
- Source: chi mi ha linkato
- Target: la mia pagina
Il server source invia una richiesta POST al mio endpoint /webmention.
Il mio server verifica che il link esista davvero.
Se esiste, salvo la menzione.
Se non esiste, la scarto.
Tutto qui.
Niente intermediari. Niente algoritmi. Niente platform lock-in.
Il nesso
Perché il Monolito archivia questo? Perché le Webmention sono sovranità pura.
Quando qualcuno linka un mio articolo su un altro sito IndieWeb, io lo so. Non perché Facebook me lo dice. Non perché Twitter mi notifica. Ma perché il protocollo stesso me lo consegna.
È il web decentralizzato che funziona come dovrebbe:
- Tu pubblichi sul tuo dominio.
- Io pubblico sul mio dominio.
- Se tu mi linki, io lo so.
- Nessuno di noi dipende da una piattaforma centrale.
La sfida
La sfida tecnica è stata implementare il server su OpenBSD.
Non esiste un plugin “installa e dimenticati”. Ho dovuto:
- Configurare relayd per forwardare
/webmentiona Node.js (porta 3000) - Scrivere lo script Node che verifica i link
- Salvare le menzioni in un JSON locale
- Esporre un’API
/api/mentionsper leggerle - Mostrare le menzioni nel frontend Astro
La sfida psicologica è stata accettare che non tutte le menzioni arrivano.
Se un sito non supporta Webmention, non lo so. Se qualcuno mi linka su Medium o LinkedIn, non ricevo nulla.
Ma è un limite che accetto volentieri. Preferisco 10 menzioni su siti sovrani che 1000 like su piattaforme che mi possiedono.
Pace Mentale
Ora che ho scritto questo, ho chiarito il valore delle Webmention:
- Sono notifiche dirette, senza intermediari.
- Sono verificate, non spoofabili.
- Sono sotto il mio controllo (il mio server, il mio database).
- Sono interoperabili (chiunque può implementarle).
La Pace Mentale viene dal sapere che ogni menzione che ricevo è un atto di rispetto. Qualcuno ha dedicato tempo a linkarmi sul proprio dominio, non a cliccare “condividi” su un pulsante di una piattaforma.
Il Monolito non è un’isola. È un nodo nella rete.
Nota tecnica:
- Endpoint: POST /webmention (source + target)
- Verifica: GET source → cerca target nel contenuto
- Storage: /var/www/webmention/data/mentions.json
- API: GET /api/mentions?target=URL
- Frontend: componente Astro Webmentions.astro (client-side fetch)
- Cache: 5 minuti in localStorage per performance
- Zero dipendenze: tutto self-hosted su OpenBSD