implementacion webmentions self hosted
Origen
Descubrí Webmention leyendo la especificación IndieWeb.
Sin API key. Sin OAuth. Sin cuentas en plataformas de terceros. Solo dos URLs:
- Source: quién me enlazó
- Target: mi página
El servidor source envía una petición POST a mi endpoint /webmention.
Mi servidor verifica que el enlace exista realmente.
Si existe, guardo la mención.
Si no existe, la descarto.
Eso es todo.
Sin intermediarios. Sin algoritmos. Sin platform lock-in.
El Nexo
¿Por qué el Monolito archiva esto? Porque Webmention es soberanía pura.
Cuando alguien enlaza mi artículo en otro sitio IndieWeb, lo sé. No porque Facebook me lo diga. No porque Twitter me notifique. Sino porque el protocolo mismo me lo entrega.
Es la web descentralizada funcionando como debería:
- Tú publicas en tu dominio.
- Yo publico en mi dominio.
- Si tú me enlazas, yo lo sé.
- Ninguno de los dos depende de una plataforma central.
El Desafío
El desafío técnico fue implementar el servidor en OpenBSD.
No existe un plugin “instala y olvídate”. Tuve que:
- Configurar relayd para forwardear
/webmentiona Node.js (puerto 3000) - Escribir el script Node que verifica los enlaces
- Guardar las menciones en un JSON local
- Exponer una API
/api/mentionspara leerlas - Mostrar las menciones en el frontend Astro
El desafío psicológico fue aceptar que no todas las menciones llegan.
Si un sitio no soporta Webmention, no lo sé. Si alguien me enlaza en Medium o LinkedIn, no recibo nada.
Pero es un límite que acepto voluntariamente. Prefiero 10 menciones en sitios soberanos que 1000 likes en plataformas que me poseen.
Paz Mental
Ahora que he escrito esto, he aclarado el valor de Webmention:
- Son notificaciones directas, sin intermediarios.
- Son verificadas, no spoofeables.
- Están bajo mi control (mi servidor, mi base de datos).
- Son interoperables (cualquiera puede implementarlas).
La Paz Mental viene de saber que cada mención que recibo es un acto de respeto. Alguien dedicó tiempo a enlazarme en su propio dominio, no a hacer clic en “compartir” en un botón de una plataforma.
El Monolito no es una isla. Es un nodo en la red.
Nota técnica:
- Endpoint: POST /webmention (source + target)
- Verificación: GET source → buscar target en el contenido
- Almacenamiento: /var/www/webmention/data/mentions.json
- API: GET /api/mentions?target=URL
- Frontend: componente Astro Webmentions.astro (client-side fetch)
- Caché: 5 minutos en localStorage para rendimiento
- Cero dependencias: todo self-hosted en OpenBSD