Complemento de ActivityPub

Ah, ¡qué bueno oír eso! Sí, supongo que tienes razón sobre seguir a alguien que publica en un foro, pero podría existir la función de publicar en el fediverso y no en un foro. NodeBB, por ejemplo, pone todo el contenido del fediverso fuera de las comunidades en una categoría de “Sin categorizar”, por lo que si publicas allí es más o menos como publicar en Mastodon. Mbin también hace algo similar, comenzaron como un agregador de enlaces y añadieron una pestaña de “Microblogging”. Entiendo que está fuera del alcance de Discourse por el momento, ¡gracias por aclararlo!

2 Me gusta

Hay gente loca (como yo) que quiere usar Discourse como su hogar principal en el Fediverso. Quiero publicar en el Fediverso solo a través de Discourse.

¿No deberíamos apoyar a las personas para que utilicen Discourse como su solución de “trabajo abierto” o “algo mejor que un blog”?

Dado que implementar los deseos de los usuarios no genera ingresos, ¿han considerado votar por características mediante dinero como una opción?

4 Me gusta

Puedes encontrar el desarrollo después de asegurarte de que las nuevas características son pr-welcome

1 me gusta

POR OTRO LADO, eso es exactamente lo que hace Facebook con los grupos y contactos y una de las razones por las que es tan pegadizo allí. Porque vas a conectar con tus contactos de todos modos, y esto “trae” las publicaciones del grupo/comunidad a ese espacio.

Podría imaginarme muy bien algo así como algo súper valioso para mi comunidad. Las comunidades reúnen a las personas y querrán mantener esa conexión “fuera” de la comunidad. Si la herramienta comunitaria les permite llevar esta conexión adicional al mismo espacio/aplicación, esto evita un éxodo a otros espacios sociales de personas que han forjado relaciones sólidas dentro de la comunidad.

Sé que no estamos tratando de “replicar Facebook” aquí, pero vale la pena reflexionar sobre por qué funciona tan bien para ciertas cosas.

Me encantaría poder decirles a los miembros que emigran de Facebook: “mira, puedes crear una cuenta de fediverso y conectarte con personas que te gustan fuera de tema”.
Quizás debería pensarse como una forma de proporcionar a los miembros de la comunidad un espacio fuera de tema que sea más “abierto”.

Desde mi punto de vista tendría mucho sentido. La falta de integración entre “lo social” (cuentas de fediverso), blogs (pero la conexión de estos con el fediverso está en marcha) y comunidades es lo que impide que herramientas abiertas como mastodon o discourse o Wordpress sean una alternativa efectiva a Facebook.

1 me gusta

Bueno, Mastodon y WordPress ya hacen todo eso. Discourse solo parcialmente y la dirección es mayormente saliente, pero no es una plataforma de redes sociales.

1 me gusta

Al intentar seguir a @announcements@meta.discourse.org recibimos el siguiente mensaje de error:

Los registros tienen dos advertencias:

No se pudo procesar https://meta.discourse.org/ap/actor/68efb2d756abf76171ed302b7ffd3c58: No se pudo resolver el actor

La solicitud GET a https://meta.discourse.org/ap/actor/68efb2d756abf76171ed302b7ffd3c58 falló:

Sin embargo, podemos seguir a actores en Mastodon.

¿Me estoy perdiendo algo o cómo puedo investigar más a fondo?

Confirmo el comportamiento idéntico; aquí están los registros:

Started POST "/webfinger/handle/validate" for 172.17.0.1 at 2026-03-15 16:10:39 +0000
Processing by DiscourseActivityPub::Webfinger::HandleController#validate as JSON
  Parameters: {"handle"=>"@announcements@meta.discourse.org"}
Completed 200 OK in 36ms (Views: 0.2ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 11.8ms)
Started GET "/ap/local/actor/57934/find-by-handle?handle=%40announcements%40meta.discourse.org" for 172.17.0.1 at 2026-03-15 16:10:40 +0000
Processing by DiscourseActivityPub::ActorController#find_by_handle as JSON
  Parameters: {"handle"=>"@announcements@meta.discourse.org", "actor_id"=>"57934"}
Started POST "/webfinger/handle/validate" for 172.17.0.1 at 2026-03-15 16:10:43 +0000
Processing by DiscourseActivityPub::Webfinger::HandleController#validate as JSON
  Parameters: {"handle"=>"@announcements@meta.discourse.org"}
Completed 200 OK in 32ms (Views: 0.2ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.8ms)
Started GET "/ap/local/actor/57934/find-by-handle?handle=%40announcements%40meta.discourse.org" for 172.17.0.1 at 2026-03-15 16:10:43 +0000
Processing by DiscourseActivityPub::ActorController#find_by_handle as JSON
  Parameters: {"handle"=>"@announcements@meta.discourse.org", "actor_id"=>"57934"}
Started POST "/webfinger/handle/validate" for 172.17.0.1 at 2026-03-15 16:10:43 +0000
Processing by DiscourseActivityPub::Webfinger::HandleController#validate as JSON
  Parameters: {"handle"=>"@announcements@meta.discourse.org"}
Completed 200 OK in 30ms (Views: 0.2ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)
Started GET "/ap/local/actor/57934/find-by-handle?handle=%40announcements%40meta.discourse.org" for 172.17.0.1 at 2026-03-15 16:10:43 +0000
Processing by DiscourseActivityPub::ActorController#find_by_handle as JSON
  Parameters: {"handle"=>"@announcements@meta.discourse.org", "actor_id"=>"57934"}
Started POST "/webfinger/handle/validate" for 172.17.0.1 at 2026-03-15 16:10:44 +0000
Processing by DiscourseActivityPub::Webfinger::HandleController#validate as JSON
  Parameters: {"handle"=>"@announcements@meta.discourse.org"}
Completed 200 OK in 26ms (Views: 0.2ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.3ms)
Started GET "/ap/local/actor/57934/find-by-handle?handle=%40announcements%40meta.discourse.org" for 172.17.0.1 at 2026-03-15 16:10:44 +0000
Processing by DiscourseActivityPub::ActorController#find_by_handle as JSON
  Parameters: {"handle"=>"@announcements@meta.discourse.org", "actor_id"=>"57934"}
Started POST "/webfinger/handle/validate" for 172.17.0.1 at 2026-03-15 16:10:44 +0000
Processing by DiscourseActivityPub::Webfinger::HandleController#validate as JSON
  Parameters: {"handle"=>"@announcements@meta.discourse.org"}
Completed 200 OK in 24ms (Views: 0.2ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.3ms)
Started GET "/ap/local/actor/57934/find-by-handle?handle=%40announcements%40meta.discourse.org" for 172.17.0.1 at 2026-03-15 16:10:44 +0000
Processing by DiscourseActivityPub::ActorController#find_by_handle as JSON
  Parameters: {"handle"=>"@announcements@meta.discourse.org", "actor_id"=>"57934"}
2 Me gusta

¿Qué versión de Discourse estás utilizando? Puedo encontrar ese actor en otra instancia de Discourse:

1 me gusta

Estamos en la última versión 2026.3.0-latest

Estamos en 2026.1.2(808b2ac23d) con la versión del complemento (d99071e0)

Solo añadiendo aquí. En 2026.5.0-latest, con un Actor de Categoría que funciona correctamente, experimento lo mismo. Puedo seguir a actores de Mastodon, pero no a los de Discourse.

3 Me gusta

Gracias por el informe, lo revisaremos en breve.

3 Me gusta

Una breve nota para informarles que hemos desactivado el plugin ActivityPub aquí en meta. El plugin estaba en mantenimiento, pero seguiremos brindándole soporte mediante actualizaciones de seguridad, rendimiento y corrección de errores. En ese sentido, hoy hemos fusionado varias correcciones de seguridad en el repositorio del plugin; recomendamos a los usuarios que actualicen a la última versión.

En meta, por desgracia, las categorías con ActivityPub habilitado solo eran utilizadas por unos pocos usuarios y recibimos comentarios de quienes no usaban ActivityPub, quienes se mostraban confundidos por la terminología. Por ello, hemos decidido simplificar las cosas y descontinuar la integración de ActivityPub en meta.

4 Me gusta

Una de las razones por las que hay tan pocos seguidores es que un usuario de Discourse debe saber a quién seguir. El sistema no está diseñado para un tipo de seguimiento fácil como el de las redes sociales, sino para compartir contenido desde un foro hacia el Fediverso y esperar que alguien allí lo comparta (e incluso así, un usuario de Mastodon o cualquier otro no puede seguir a ningún actor de Discourse).

Sabes la cantidad de seguidores, pero no tienes idea de cuántas personas están viendo las publicaciones allí. Pero claro, Meta es un caso bastante excepcional, porque probablemente los administradores estén aquí y los usuarios comunes no estén interesados en los aspectos técnicos de Discourse. Desde ese punto de vista, entiendo esa decisión.

2 Me gusta

Hola, estoy intentando reportar un problema con el plugin AP relacionado con la fecha y hora published (publicado) que es incorrecta en las publicaciones que se “publican” manualmente mediante el botón “Publicar todas las publicaciones”.

Ejemplo

https://browser.pub/https://socialhub.activitypub.rocks/ap/object/a8d6c23e6c428313efb9bf20efeb020c

Comportamiento esperado

published indica la fecha y hora en que la publicación se publicó originalmente, es decir, la fecha y hora visible localmente en Discourse (2018).

Comportamiento actual

published indica la fecha en que se creó el recurso AP, es decir, la fecha y hora en que se hizo clic en el botón “Publicar” localmente en Discourse (2026).

1 me gusta

Últimamente, las imágenes de mis publicaciones federadas que provienen de mi sitio de Discourse aparecen varias veces en Mastodon. ¿Es esto algo propio de ActivityPub o de Mastodon? ¿O es una mala configuración en mi extremo? No estoy seguro de cómo abordarlo. Aquí hay dos ejemplos. Mastodon parece estar intentando crear una vista en cuadrícula cuando la original no tenía una vista en cuadrícula.

1 me gusta

bug-report creado en exchange con ask.discourse.com ( bfa925d )

La compilación falla durante ./launcher rebuild con NameError: uninitialized constant PrettyText::PrecompiledBundle cuando discourse-activity-pub está habilitado

Entorno

  • Discourse autoalojado, instalación Docker a través del launcher discourse_docker, configuración de múltiples contenedores (Web + Sidekiq)
  • Ruby 3.4.0, Rails 8.0.5.1
  • Rama: latest (también se reprodujo la causa raíz en el código actual)

Error
Durante el arranque, en el paso rake db:migrate:

rake aborted!
NameError: uninitialized constant PrettyText::PrecompiledBundle (NameError)

    PrecompiledBundle.new(
    ^^^^^^^^^^^^^^^^^
/var/www/discourse/lib/pretty_text.rb:56:in '<module:PrettyText>'

Causa raíz (análisis de agentes)
En lib/pretty_text.rb:56, dentro de module PrettyText, la constante PrecompiledBundle se referencia sin el alcance de nivel superior ::. Ruby, por lo tanto, la resuelve como PrettyText::PrecompiledBundle (archivo lib/pretty_text/precompiled_bundle.rb), que no existe. La clase real se encuentra en /var/www/discourse/lib/precompiled_bundle.rb (nivel superior). Sin un plugin, el orden de carga termina definiéndola a tiempo; con discourse-activity-pub habilitado, el orden de carga cambia y la constante no está disponible cuando se carga pretty_text.rb.

Prueba

  • La compilación pasa sin errores con todos los plugins desactivados.
  • Búsqueda binaria a través de la lista de plugins: la compilación falla con discourse-activity-pub habilitado y pasa con él eliminado/desactivado.
  • Ningún otro plugin lo provoca.

Comportamiento esperado
Compilación limpia independientemente de qué plugins estén habilitados, o al menos una constante/requerimiento definido en lib/pretty_text.rb (p. ej., ::PrecompiledBundle o un require explícito).

Pregunta
¿Es esta una interacción conocida? ¿Hay algún plan para corregir el orden de carga, o existe alguna fijación/solución alternativa recomendada mientras tanto?

1 me gusta

No creo que esto tenga nada que ver con el plugin de Activity Pub…

¿Puedes ampliar la información sobre el error reportado aquí? ¿Las migraciones se inician y luego se encuentran con este problema, o hay una migración específica que falla?

Creo que esta parte interfiere con el orden de carga porque está fuera de after_initialize

2 Me gusta

Oh, gracias por la corrección. Esto podría ser la solución: FIX: Do not modify global plugin loading behaviour - Pull Request #338 - discourse/discourse-activity-pub - GitHub por favor, pruébalo @thoka y dime qué tal va.

1 me gusta