Suporte a ActivityPub: RFC da Fase 1

Continuando de Federation support for Discourse - #21 by rishabh, Tools to "aggregate" many Discourse forums? - #27 by Falco e ActivityPub Implementation for Discourse

Por quê?

Um problema comum enfrentado por muitos usuários do Discourse é a incapacidade de mostrar uma agregação de todos os grupos de interesse aos quais estão inscritos. Não há uma maneira fácil de consumir conteúdo de várias instâncias do Discourse na forma de um feed de usuário central e social. Plataformas centralizadas como o Reddit contornam isso ao ter um único login para todas as comunidades e um feed agregado de todas as comunidades exibido em um único fluxo na página inicial do reddit.com. É essa última funcionalidade que gostaríamos de replicar no Discourse por meio do protocolo ActivityPub.

Por exemplo, a Pessoa A frequenta várias instâncias do Discourse: uma para política, duas para hobbies, uma para o fórum do seu bairro, mas não tem como consumir todo o conteúdo relevante em um único feed. Em comparação, se você se juntou a vários grupos do Facebook ou subs do Reddit, as postagens mais relevantes já aparecem no seu feed.

Especificação (v1)

Podemos prototipar um MVP ativando as seguintes funcionalidades por meio de um plugin do Discourse:

  1. Gerar um feed ActivityPub sob demanda (para cada página que já tenha um feed RSS)

    • Semelhante a adicionar .rss à URL, isso permitirá a busca de conteúdo usando o protocolo AP ao solicitar o endpoint correto.

    • Podemos até mesmo habilitar isso para conteúdo privado, anexando chaves de API do usuário à URL.

  1. Permitir que administradores de fórum ativem o ActivityPub (saindo) por categoria ou mantê-lo ativado por padrão?
    (Acredito que @Falco tenha algumas ideias sobre isso)

  2. Encontrar uma maneira de consumir esse conteúdo em um fórum do Discourse / feed do Mastodon (entrando)

Próximos Passos

Definitivamente precisamos começar pequeno, então, inicialmente, precisamos decidir sobre um conjunto pequeno e viável de funcionalidades que farão parte da primeira iteração. Tenho estudado o protocolo ActivityPub, mas ainda não estou muito familiarizado com seu funcionamento interno. Portanto, estou convidando outras pessoas que demonstraram muito interesse nisso para participar da discussão (@Falco, @hellekin, @merefield) para nos ajudar a construir uma especificação viável para a primeira iteração e recomendar alterações na especificação acima.

Recursos

39 curtidas

Aqui estão alguns destaques dos tópicos mais antigos :arrow_down:

Concordo, acho que é exatamente assim que @Falco propôs que a v1 poderia funcionar.

6 curtidas

Excelente iniciativa, obrigado.

Gostaria de começar dizendo: não deveríamos focar no o quê e não no como, inicialmente? A arquitetura técnica vem depois? O motivo pelo qual digo isso é que escolher isso muito cedo pode limitar a funcionalidade.

Adoraria ver, na Versão 1, listas de “Descoberta de Descoberta”, começando com:

  • Lista “Mais Recentes”, que mostraria uma prévia de cada tópico recente das fontes incluídas (união simples dos Mais Recentes de todas as fontes)
  • Lista “Acompanhados”, que mostraria uma prévia de cada Tópico com atividade para a qual você selecionou receber notificações. (isso tem como precedente o aplicativo móvel existente — expandindo as notificações de nova atividade em Tópicos acompanhados para as próprias prévisões dos Tópicos subjacentes).
9 curtidas

Obrigado por iniciar isso!

Devo dizer que a proposta original envolvendo a analogia com o Facebook escapou ao meu entendimento: não faço ideia do que o Facebook faz e não compreendo como isso se relaciona com o Discourse de qualquer forma.

Minha compreensão sobre o suporte ao ActivityPub no Discourse é que ele pode ajudar a federar tópicos ou até mesmo compartilhar uma categoria entre instâncias do Discourse. Por exemplo, um tópico de anúncio em discourse.joinmastodon.org poderia ser federado para socialhub.activitypub.rocks na categoria relacionada #software:mastodon: lá, usuários locais poderiam curtir, responder, citar etc., como se fosse um tópico local, exceto pelo fato de que o tópico original viveria na instância do joinmastodon.

Outro aspecto disso é que, se alguém tiver uma conta em ambas as instâncias, deveria haver uma maneira de vincular essas contas, ou seja, usar uma instância específica do Discourse como provedor de identidade principal. Entendo que isso não é o foco de uma primeira iteração, mas é bom ter em mente, pois podemos acabar tendo “entrar com [insira aqui sua implementação favorita do ActivityPub]”.

O que entendi das propostas acima é uma replicação do aplicativo do Discourse no Android, onde você tem uma lista de instâncias e recebe notificações de todas elas. Parece um pouco perigoso intercalar respostas não relacionadas de muitas fontes, especialmente quando elas perdem o contexto.

Entendi corretamente e minha compreensão faria um bom segundo passo para sua visão de integrar o ActivityPub com o Discourse?

5 curtidas

Todas as implementações atuais do ActivityPub esperam que as postagens sejam publicadas por Atores estáveis, então você pode precisar de uma das seguintes opções:

  • Uma conta de sistema que publica todas as postagens
  • Uma conta por feed que pode ser seguido
  • Uma conta por feed que pode ser seguido, que faz Announces de postagens que são supostamente autoria de uma conta por usuário do Discourse

A primeira opção provavelmente é a mais fácil de implementar; a terceira faz o melhor trabalho ao integrar os modelos de dados.

Também há a escolha de se queremos publicar o conteúdo completo do tópico, apenas as primeiras postagens dos tópicos, ou algo como os feeds do Twitter do StackExchange, onde postagens distintas promovem postagens da página /top. Ou isso poderia ser apenas como o feed de “melhores postagens” funciona, e os outros feeds publicam tudo…

Em termos técnicos, a URL não precisaria mudar: todos os servidores enviarão Accept: application/activity+json ou suas alternativas.


Um aplicativo leitor que mistura feeds de diferentes fontes em momentos diferentes no ActivityPub — recriando a “linha do tempo algorítmica” como uma opção — é algo que tenho desejado há algum tempo e que parece não existir hoje.


@hellekin: Acredito que a autoria entre domínios tem uma alta probabilidade de contornar fatalmente muitas das proteções anti-spam que o Discourse possui. A leitura é mais importante de implementar: afinal, A Leitura é Fundamental!

11 curtidas

Eu não acho que sim: usuários remotos ainda podem ser escalonados, a menos que vinculem sua conta remota a uma local, caso em que o antispam se aplicaria a essa conta.

Confesso que dei apenas uma olhada rápida nos comentários. Minha sugestão é que cada categoria seja um ator próprio (com o tipo “Group”). Assim, pessoas de fora podem simplesmente se inscrever em categorias específicas. As postagens nessas categorias podem ser realizadas fazendo com que a conta “Group” anuncie as postagens dos usuários. Dessa forma, teríamos tanto a categoria quanto o autor. É assim que fazemos com nosso próprio software. Ao usar assinaturas JSON-LD, isso seria seguro mesmo para categorias não públicas.

A questão é o que fazer com comentários de fora. Sugiro que as contas de grupo sejam definidas como “aprovação manual”. Assim, poderíamos adicionar um processo de validação para evitar spam aleatório. Essas contas validadas poderiam então comentar nessas postagens.

Isso permitiria instantaneamente que pessoas de (quase) todo o fediverso se conectassem e interagissem com sistemas Discourse.

7 curtidas

Concordo com a sugestão de @heluecht.

Além disso, acho que seria ótimo que:

  1. Cada grupo de categoria pudesse ter um proprietário com poder para gerenciar a categoria: controlar permissões de postagem, banir ou remover usuários, definir visibilidade (pública ou privada)…
  2. Usuários locais pudessem criar categorias em sua instância, desde que a equipe da instância aprovasse a criação dessas categorias.
  3. Se um proprietário de categoria não estiver adequado ao cargo, a equipe do site poderá alterá-lo.

É assim que muitos fóruns e comunidades centralizados funcionam. O que precisamos melhorar é tornar isso federado.

No entanto, ainda existem problemas:

  1. Os ids dos atores devem ser mutáveis? Os nomes de usuário do Discourse podem ser configurados como modificáveis nas configurações do site. No entanto, duvido que outros softwares AP consigam lidar com isso. Is Object's `id` immutable? - ActivityPub - SocialHub
    (Mais a ser mencionado)
5 curtidas

Alguém da equipe do Discourse estará no SocialHub na OFFDEM na próxima semana? Seria um ótimo momento para se encontrar e trocar experiências com outros implementadores do AP.

7 curtidas

Não que eu saiba, mas obrigado por perguntar!

5 curtidas

Alguns pontos de referência rápidos:

Friendica e Hubzilla podem converter feeds RSS em contas federadas compatíveis com ActivityPub/Diaspora*/OStatus.

Além disso, veja este plugin do Wordpress que converte publicações em publicações ActivityPub.

10 curtidas

Alguns pontos de referência adicionais..

5 curtidas

Parabéns pelo financiamento da UE!

Existe um roteiro?

Alguém da equipe do Discourse vai participar da ActivityPub Conf?
Seria um ótimo momento para se encontrar e fazer contatos com outros implementadores do AP.
https://conf.activitypub.rocks

5 curtidas

Acho que isso não avançou de verdade por vários motivos — aquilo era apenas a proposta do RFC.

1 curtida

Esperamos discutir a implementação do ActivityPub no Discourse durante o Birds of a Feather no próximo domingo, na APConf2020. Veja o tópico dedicado no SocialHub:

@rishabh, seria ótimo ter você por perto, pelo menos no tópico, caso não possa comparecer no domingo. Ainda não sabemos o horário exato, mas será na manhã de domingo. Atualizarei este post quando souber.

7 curtidas

Ei @hellekin,

Desculpe não ter conseguido participar. Gostaria de informar que não nos inscrevemos para o financiamento NGI0 e, no momento, ninguém está trabalhando nisso. Também não sou a pessoa mais indicada para conduzir isso, pois não estou familiarizado com o protocolo, mas vou chamar o @Falco aqui apenas para ver se ele tem alguma opinião ou interesse em levar isso adiante.

4 curtidas

Bem, na época, um dos membros da sua equipe solicitou — mesmo que ele não faça mais parte da equipe — e vocês foram selecionados. Então, alguém teve que aprovar, então não sei a qual “nós” você está se referindo. :slight_smile: De qualquer forma, estou ansioso para discutir com @Falco. Um certo suporte ao AP seria realmente útil para a comunidade ActivityPub, especialmente porque facilitaria o trabalho entre instâncias do Discourse e melhoraria a integração com o Fediverse.

Estou ciente do problema de spam, mas acho que pode ser atenuado com usuários do Fediverse em estágio, como usuários de e-mail não registrados, até que eles realmente registrem uma conta local.

5 curtidas

Claro, seria muito bom ver isso.

Sim, nós realmente solicitamos o financiamento no passado, mas conversamos com a equipe da NLnet no início deste ano para encerrar o projeto e liberar o financiamento que havia sido reservado para nós. Mesmo tendo sido selecionados na época, a colaboração com o NGI0 foi cancelada por enquanto. Claro, temos liberdade para fazer propostas no futuro.

Acabei de lembrar que @riking também pode estar interessado :slight_smile:

1 curtida

Interessante.

Este projeto foi financiado através do NGI0 Discovery Fund, um fundo estabelecido pela NLnet com apoio financeiro do programa Próxima Geração da Internet da Comissão Europeia, sob a égide da DG Redes de Comunicação, Conteúdo e Tecnologia, no âmbito do acordo de subvenção n.º 825322.

Então: estão falando de outro “Discourse”?
Estou apenas perguntando por causa do “Site oficial do projeto: https://discourse.org” …

1 curtida

Ah, eu não sabia que essa página existia. Vou enviar um e-mail para nosso contato na NLnet, lembrá-los caso tenham esquecido de removê-la e publicar uma atualização aqui.

EDIT: as alterações já estão no ar em NLnet; Discourse ActivityPub

1 curtida