# 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:** > ⚠️ **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](https://github.com/matrix-org/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`](docs/miniapps.md) — manifesto em ``, 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`](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](https://flutter.dev) (3.47.3, Dart `>=3.11.1 <4.0.0`); para a versão web, também do [Rust](https://www.rust-lang.org/tools/install), usado para compilar o Vodozemac. 2. Clone o repositório: ```bash 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: ```bash ./scripts/add-firebase-messaging.sh ``` 5. Debug com `flutter run`. ### Android ```bash 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 ```bash ./scripts/prepare-web.sh # compila o Vodozemac para WebAssembly flutter build web --release ``` ### Desktop (Linux, Windows, macOS) Habilite o suporte a desktop do Flutter: Dependências no Linux: ```bash sudo apt install libjsoncpp1 libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.0-dev lld ``` ```bash 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: ```bash ./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](https://tatuchat.weltonmoura.com.br/home/) - 💻 [Código-fonte](https://gitea.weltonmoura.com.br/welton/tatuchat) - 🐞 [Issues e bugs](https://gitea.weltonmoura.com.br/welton/tatuchat/issues) - 🧩 [Documentação dos Mini Apps](docs/miniapps.md) - 🌍 [[Weblate] Traduza o TatuChat](https://hosted.weblate.org/projects/fluffychat/) - 🦊 [Código do FluffyChat, o projeto original](https://github.com/krille-chan/fluffy-chat) - 📄 [Política de privacidade](PRIVACY.md) · [Segurança](SECURITY.md) · [Contribuindo](CONTRIBUTING.md) · [Changelog](CHANGELOG.md) ## 🙏 Agradecimentos * **[Fabiyamada](https://github.com/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](https://github.com/matrix-org/matrix-spec/blob/main/data-definitions/sas-emoji.json) 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.