§1O problema
Eu queria saber se dava para construir sozinho um mensageiro de verdade (conversas, grupos, mídia, tempo real) com identidade visual própria, sem depender de um serviço pronto de backend.
§2O que eu construí
- Servidor próprioAPI HTTP + WebSocket, banco SQLite, mídia em disco.
- App únicoExpo / React Native (iOS, Android e web), com as telas do protótipo de design.
- MensagensConversas em tempo real, recibos de mensagem, envio e recebimento de fotos, vídeos e arquivos (até 2 GB no PWA do iPhone).
- Extras da webArrastar e soltar (e colar) arquivos na conversa.
- ConvitesPor link/QR para achar contatos (sem login por telefone na v1).
- Texto longoDivisão automática (limite de 65.536 caracteres por mensagem).
- IdentidadePor aparelho, com token guardado só como hash no servidor; modo de conta única para o beta.
- TestesAutomatizados no servidor (API e WebSocket, com banco temporário) e na lógica do app.
§3As partes difíceis
5 itens- 01
Sincronização em tempo real com envio offline
Fila de saída (outbox), recibos e cache local que o app abre antes de validar a sessão.
- 02
Mídia grande
Envio em partes, em stream (corpo bruto, sem multipart), com links assinados (HMAC) para <img>/<video> funcionarem sem cabeçalho de autenticação.
- 03
Identidade desenhada para evoluir
“Quem é o usuário” separado de “como ele provou”, para acrescentar o login por telefone depois sem migrar dados.
- 04
Mesmo código em três plataformas
Incluindo diferenças reais: vidro com desfoque no iOS e web, versão simplificada no Android; cache em localStorage na web e SQLite no celular.
- 05
Peculiaridades do PWA no iPhone
Duração correta de vídeo e seletor de fotos.
§4Resultado
- testes do servidor (API e WebSocket)
- 25
- de envio máximo no PWA do iPhone
- 2 GB
O servidor e o app web estão no ar na minha rede privada desde outubro de 2026, para um beta fechado. Servidor com 25 testes de API/WebSocket. Falta o build instalável no celular (depende de conta Expo e, no iOS, de conta de desenvolvedor Apple) e o login por telefone.
§5Stack
- Expo / React Native (expo-router)
- TypeScript
- Node 24
- Hono
- WebSocket
- SQLite (better-sqlite3, modo WAL)
- Zod
- Zustand
- sharp
- pm2
- Tailscale