12 KiB
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) eaccountdata(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 comclient=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 chavesdefaultHomeserver,presetHomeserverewelcomeText. O restante das chaves é lido deManagedConfigurations. - Web: sirva um
config.jsonno mesmo caminho do app. O exemplo completo está emconfig.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
-
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. -
Clone o repositório:
git clone https://gitea.weltonmoura.com.br/welton/tatuchat.git cd tatuchat -
Escolha a plataforma alvo abaixo e habilite o suporte a ela.
-
Opcionalmente, habilite o Google Firebase Cloud Messaging:
./scripts/add-firebase-messaging.sh -
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 certificadosFLUFFYCHAT_NEW_GROUP: o grupo onde os App IDs vivem (ex.:com.example.tatuchat)FLUFFYCHAT_INSTALL_IPA: defina como1para 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).
🔗 Links
- 🌐 Site do TatuChat
- 💻 Código-fonte
- 🐞 Issues e bugs
- 🧩 Documentação dos Mini Apps
- 🌍 [Weblate] Traduza o TatuChat
- 🦊 Código do FluffyChat, o projeto original
- 📄 Política de privacidade · Segurança · Contribuindo · Changelog
🙏 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.
