Files
tatuchat/README.md
Welton Moura 680669df00
Some checks failed
Main Deploy Workflow / deploy_web (push) Has been cancelled
Main Deploy Workflow / deploy_playstore_internal (push) Has been cancelled
Close stale issues and PRs / stale (push) Has been cancelled
new readme
2026-09-27 17:48:57 -03:00

12 KiB
Raw Permalink Blame History

TatuChat

TatuChat

Cliente de mensagens instantâneas open source, sem fins lucrativos e multiplataforma, construído sobre o protocolo Matrix com Flutter. TatuChat é um fork do acclaimed FluffyChat, com foco em privacidade, simplicidade e código aberto.

🌐 Site, downloads e novidades: https://tatuchat.weltonmoura.com.br/home/

⚠️ Status do projeto: alfa. O aplicativo está em desenvolvimento ativo e ainda pode apresentar erros, perder dados ou mudar de comportamento entre versões. Use com cuidado e reporte problemas para ajudar a tornar o TatuChat mais estável.

O que é o TatuChat

Um mensageiro federado e descentralizado: nenhuma empresa no meio, nenhum servidor único. Você escolhe o homeserver que quiser (ou usa um dos recomendados), conversa com quem está em outros servidores e continua sendo dono dos seus dados. Tudo com criptografia ponta a ponta (Olm/Megolm via Vodozemac em WebAssembly).

  • 🔐 Criptografia ponta a ponta, com verificação por emoji e cross-signing
  • 💾 Backup de conversas criptografado
  • 📩 Texto, imagens, áudio, vídeo, arquivos, stickers, emotes e localização
  • 🤙 Videochamadas pelo Matrix RTC (LiveKit)
  • 🎙️ Mensagens de voz
  • 🔔 Notificações push, com ou sem Google (UnifiedPush / ntfy)
  • 🌌 Espaços para navegar hierarquias inteiras de salas
  • 🎨 Design Material You, com cores dinâmicas do Android

🚀 Inovações do TatuChat

O TatuChat reescreveu a forma de navegar e de consumir conteúdo dentro do Matrix. As seções abaixo descrevem os módulos desenvolvidos sobre o FluffyChat.

Abas e barra lateral

O app não usa mais a navigation rail do FluffyChat. A navegação principal virou uma barra lateral (desktop e tablet) com as entradas Criar grupo, Definir status, Convidar contato, Arquivo, Apps e Configurações, além do seletor de contas.

A tela inicial foi dividida em quatro abas, com barra superior em telas largas e barra inferior em telas compactas:

Aba O que mostra
Conversas Apenas conversas normais
Canais Apenas canais
Espaços Os espaços em que você entrou, como tela inicial
Murais Apenas murais

Canais e murais não aparecem na lista de conversas, e vice-versa: cada tipo tem sua própria aba, com busca própria — e os murais mostram ainda o número de inscritos de cada um.

📣 Canais

Um canal é uma sala pública de distribuição, no estilo de um feed, não de um chat. O tipo é gravado no estado compartilhado da sala (tatuchat.room_type = "canal"), com uma tag pessoal (tatuchat_canal) para identificação local.

A sala usa a página de chat normal, mas em modo feed:

  • 🗞️ Publicações viram cartões de largura total, em vez de balões
  • ✍️ O nome do autor aparece sempre, inclusive nas suas próprias publicações, para que o feed nunca pareça anônimo
  • ⬅️ Tudo alinhado à esquerda, com balões totalmente arredondados
  • 🖼️ Imagens ocupam a largura total, mantendo a proporção original
  • 🔐 Somente administradores publicam no nível principal; dentro das threads, qualquer participante comenta
  • 💬 Cada publicação abre uma thread de comentários, com reações, respostas, edição, exclusão e denúncia

🖼️ Murais

Um mural é uma página dedicada — não uma variante da timeline. O tipo é gravado em tatuchat.room_type = "mural" (tag pessoal tatuchat_mural), e abrir o mural nunca mostra a lista de mensagens: mostra um grid visual.

  • 🟦 Grade responsiva de 3 colunas alimentada apenas por imagens, vídeos e stickers
  • 🎨 Cabeçalho com capa, avatar, nome, descrição, autor e número de inscritos
  • 👆 Toque simples abre o visualizador do post, com painel de comentários e campo de resposta
  • 🤏 Toque longo abre a imagem em tela cheia, com pinch-to-zoom e deslize entre as mídias do mural
  • 💬 Comentários são threads Matrix reais, com árvore aninhada, reações, resposta, exclusão do próprio comentário e denúncia
  • 🧹 A timeline carrega em blocos conforme você desce, para não travar em murais grandes

🌌 Espaços

Matrix costuma tratar espaços como um recurso de segunda classe. No TatuChat eles viraram uma tela inicial completa:

  • 🧭 A aba Espaços é a porta de entrada: explorer a hierarquia inteira de uma conta sem sair do app
  • 🔎 Busca e filtro dentro do espaço, com capa do espaço e destaque da sala ativa
  • ➕ Ingresso rápido em salas filhas públicas, direto da hierarquia
  • 🛠️ Edição das salas filhas a partir do próprio explorador
  • ↔️ A sala ativa é carregada na coluna lateral e preservada entre navegações

🧩 Mini Apps

O TatuChat é extensível pela comunidade: qualquer pessoa pode escrever um mini app e instalá-lo no próprio app, sem loja, sem build e sem publishing.

Um mini app é um único arquivo .html, executado em um web view isolado:

  • 📥 Instalação por arquivo ou por URL
  • 🔐 Cada app tem seu próprio armazenamento chave-valor, persistido no account data do Matrix (ou seja, o app sincroniza entre os seus dispositivos)
  • 🎨 A ponte expõe a paleta e o brilho do tema atual, para o app acompanhar o Material You
  • 👤 A ponte expõe o perfil do usuário (id, nome, avatar e homeserver)
  • 📦 Dois mini apps já vêm embutidos: tasks (lista de tarefas) e accountdata (editor de account data)

As ações disponíveis na ponte são:

Ação O que faz
io.tatuchat.storage.load Lê o armazenamento do app
io.tatuchat.storage.save Sobrescreve o armazenamento do app
io.tatuchat.identity.get Perfil do usuário + avatar como data URI
io.tatuchat.theme.get Paleta e brilho do tema em hex CSS
io.tatuchat.accountdata.list Lista todas as chaves de account data
io.tatuchat.accountdata.get Lê uma chave de account data
io.tatuchat.accountdata.set Escreve uma chave de account data

📖 Documentação completa: docs/miniapps.md — manifesto em <meta>, protocolo da ponte, exemplo de HTML e limitações.

🔐 Segurança — leia antes de instalar apps de terceiros. As ações de accountdata.* não são restritas por app: um mini app pode ler e escrever qualquer chave de account data da conta, incluindo as chaves de outros mini apps. Não existe modelo de permissões nem pedido de consentimento. Instale apenas apps cujo código você auditou. O app não expõe salas, mensagens, arquivos nem envio de mensagens pela ponte.

Outros detalhes

  • 🎨 Identidade visual própria: cor primária esmeralda #00D084, paleta de sementes customizada, ícone, splash e ícone de notificação próprios
  • ⏱️ Status personalizado aparece na hora: a atualização de status é aplicada no cache local imediatamente, sem esperar o sync do homeserver
  • 🖼️ Papel de parede e tema sincronizados: via account data da conta Matrix, o tema segue entre dispositivos; há também a opção de suavizar a cor primária
  • 🔗 Deep links próprios (im.tatuchat://chat/) e convites com client=im.tatuchat

📲 Instalação

Downloads para Android, iOS, Linux, Windows, macOS e Web (PWA), além de notas de versão:

⚙️ Configuração e MDM

O TatuChat aceita configuração gerenciada em Android e iOS (via MDM) e por um arquivo config.json na versão web.

  • Android: as restrições declaradas ficam em android/app/src/main/res/xml/app_restrictions.xml, com as chaves defaultHomeserver, presetHomeserver e welcomeText. O restante das chaves é lido de ManagedConfigurations.
  • Web: sirva um config.json no mesmo caminho do app. O exemplo completo está em config.sample.json.

⚠️ Passe somente os valores que você realmente precisa alterar. Todas as chaves são opcionais; por exemplo, para trocar o homeserver padrão, altere apenas defaultHomeserver.

🛠️ Como compilar

  1. Para compilar o TatuChat você precisa do Flutter (3.47.3, Dart >=3.11.1 <4.0.0); para a versão web, também do Rust, usado para compilar o Vodozemac.

  2. Clone o repositório:

    git clone https://gitea.weltonmoura.com.br/welton/tatuchat.git
    cd tatuchat
    
  3. Escolha a plataforma alvo abaixo e habilite o suporte a ela.

  4. Opcionalmente, habilite o Google Firebase Cloud Messaging:

    ./scripts/add-firebase-messaging.sh
    
  5. Debug com flutter run.

Android

flutter build apk --release
# ou, por arquitetura (APKs bem menores):
flutter build apk --release --split-per-abi

Para assinar, preencha android/key.properties (já ignorado pelo Git) com storeFile, keyAlias, storePassword e keyPassword; o script prepare-android-release.sh faz isso a partir do segredo $FDROID_KEY em CI.

iOS / iPadOS

  • Um Mac com Xcode instalado, configurado para o app signing gerenciado pelo Xcode
  • Se quiser instalar automaticamente nos dispositivos conectados, tenha o Apple Configurator com as ferramentas de automação (cfgutil) habilitadas
  • Defina algumas variáveis de ambiente:
    • FLUFFYCHAT_NEW_TEAM: o time de Apple Developer que deve emitir os certificados
    • FLUFFYCHAT_NEW_GROUP: o grupo onde os App IDs vivem (ex.: com.example.tatuchat)
    • FLUFFYCHAT_INSTALL_IPA: defina como 1 para fazer o deploy do IPA nos dispositivos conectados após o build
  • Execute ./scripts/build-ios.sh

Web

./scripts/prepare-web.sh        # compila o Vodozemac para WebAssembly
flutter build web --release

Desktop (Linux, Windows, macOS)

Habilite o suporte a desktop do Flutter: https://flutter.dev/desktop

Dependências no Linux:

sudo apt install libjsoncpp1 libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.0-dev lld
flutter build linux --release
flutter build windows --release
flutter build macos --release

🧪 Testes de integração

Os testes completos precisam de Docker (Synapse) rodando localmente. Antes de cada execução:

./scripts/prepare_integration_test.sh
flutter test integration_test/mobile_test.dart

📜 Licença

TatuChat é software livre, licença AGPL-3.0-or-later. Ele é derivado do FluffyChat, também AGPL-3.0-or-later, Copyright de Christian Kußowski e colaboradores. O arquivo LICENSES/ traz as licenças de todas as dependências (REUSE).

🙏 Agradecimentos

  • Fabiyamada é designer gráfico e criou o logo e o banner do TatuChat. Muito obrigado pelos belos designs.
  • A todos os tradutores e testadores! Com a ajuda de vocês o TatuChat já está disponível em mais de 12 idiomas.
  • À Matrix Foundation, por manter e licenciar (Apache 2.0) as traduções de emoji usadas na verificação por emoji.
  • A MTRNord, Sorunome e Advocatux.
  • Ao FluffyChat e a toda a comunidade Matrix — o TatuChat existe graças a esse trabalho.