Sistema de telemedicina offline-first para regiões remotas da Amazônia.
O Tecendo Saúde é uma Single Page Application (SPA) projetada para conectar pacientes e profissionais de saúde em localidades com conectividade intermitente. O sistema prioriza o funcionamento offline, sincronizando automaticamente quando há rede disponível.
Objetivos:
- Permitir atendimentos e registro de dados de saúde em áreas remotas.
- Garantir que pacientes possam acessar conteúdos educativos e seus registros mesmo sem internet.
- Sincronizar dados de forma segura e eficiente quando houver conectividade.
- Login simplificado por CPF (validação local e remota).
- Cadastro e envio de queixas com suporte a:
- Texto
- Fotos
- Vídeos (até 1 min)
- Áudios (gravação via MediaRecorder)
- Biblioteca "Saiba Mais" com áudios e textos pré-carregados que funcionam offline.
- Histórico de atendimentos com visualização de respostas de profissionais.
- Indicador de status de sincronização (offline / sincronizando / sincronizado).
- Dashboard com atendimentos pendentes e cadastros incompletos.
- Gestão de medicamentos (tipo, dosagem, horários, vigência).
- Prontuário completo:
- Dados demográficos
- Comorbidades
- Metas de saúde (PA mínimo/máximo, glicemia, peso)
- Histórico de uso/vícios
- Chat de atendimento (limitado a 5 interações por caso).
- Busca de pacientes por CPF ou nome.
- Sincronização bidirecional com Supabase (Postgres + Storage).
- Loop
syncManager()executando periodicamente (5–15s) para enviar/receber atualizações. - Armazenamento local de mídias (áudios, fotos, vídeos) e envio diferido quando online.
- Frontend: React 18 (via Babel Standalone para evitar passos de build complexos).
- Estilização: TailwindCSS (via CDN).
- Persistência local: Dexie.js (IndexedDB).
- Tabelas:
perfil— dados do paciente/profissionalregistros— atendimentos e mensagensmidias— blobs de fotos/vídeos/áudiosmedicamentos— prescrições e horários
- Tabelas:
- Backend / Sync: Supabase (Postgres + Storage)
- Aplicativo Android: Wrapper (Cordova ou Capacitor) que serve o
index.htmllocalmente no APK.
index.html— aplicação inteira (HTML, CSS, JS) num único arquivo.app-tecendo.apk— APK Android que carregaindex.htmllocalmente (via Cordova/Capacitor).audios/— pasta opcional com conteúdos de áudio pré-carregados.
Opção 1 — Web (rápido, sem build):
- Coloque
index.html(eaudios/se houver) numa pasta. - Execute um servidor estático simples (ex.: Python):
python -m http.server 8000
- Abra no navegador:
http://localhost:8000/index.html
Requisitos do navegador:
- Suporte a IndexedDB e MediaRecorder API (Chrome, Firefox, Edge, Safari atualizados).
Opção 2 — Produção (hospedagem estática):
- Faça upload de
index.htmle da pastaaudios/para qualquer serviço de hosting estático (GitHub Pages, Netlify, Vercel, S3 + CloudFront, Apache/Nginx).
Opção 3 — Android (APK):
- O APK (
app-tecendo.apk) já carrega oindex.htmllocalmente. Para criar um novo APK a partir do código:- Usando Capacitor:
- npm install @capacitor/core @capacitor/cli
- npx cap init
- npx cap add android
- Copie
index.htmle assets paraandroid/app/src/main/assets/ - npx cap open android (build no Android Studio)
- Ou usando Cordova:
- cordova create tecendo
- cordova platform add android
- Substitua
www/index.htmlpelo seuindex.html - cordova build android
- Usando Capacitor:
Permissões necessárias no Android:
- CAMERA
- RECORD_AUDIO (microfone)
- READ/WRITE_EXTERNAL_STORAGE (se usar armazenamento externo)
- INTERNET (para sincronização)
- Crie um arquivo
env.js(não versionado) com o conteúdo:window.__ENV = { SUPABASE_URL: 'https://<sua-instancia>.supabase.co', SUPABASE_KEY: 'sb_publishable_...' };
- Garanta que o arquivo está na mesma pasta do
index.htmlquando rodar localmente.
- Adicione no painel do Netlify as variáveis
SUPABASE_URLeSUPABASE_KEY. - Defina o comando de build como
node build-env.js(ou adicione à pipeline existente). - Mantenha o diretório de publicação como
.(raiz do repositório). - Durante o build, o script
build-env.jsgera automaticamente umenv.jscontendowindow.__ENV = { SUPABASE_URL, SUPABASE_KEY }, garantindo que o arquivo esteja presente no deploy sem precisar versionar segredos.
Observações:
- Use a Public (anon) key apenas para operações seguras e públicas. Para operações sensíveis, implemente regras no Supabase (políticas RLS) e endpoints server-side.
- Monitore o uso de Storage (plano gratuito tem limite ~1GB).
Modelos de tabelas (exemplo resumido):
- profiles (id, cpf, nome, tipo:[paciente|profissional], metadata...)
- records (id, profile_id, tipo, texto, timestamp, sync_status)
- medias (id, record_id, filename, mime, size, local_blob_ref, uploaded_url)
- medications (id, profile_id, nome, dosagem, horarios, ativo, prescritor_id)
- Transmissão via HTTPS.
- Dados locais ficam no IndexedDB do dispositivo; orientações para proteção física do dispositivo são recomendadas.
- Em produção, é recomendado:
- Autenticação reforçada (SMS/OTP ou integração com identidade oficial).
- Políticas RLS no Supabase.
- Criptografia a nível de campo para dados sensíveis se requerido.
- Backups regulares do banco (Supabase exportações).
- Nunca versionar chaves: use
.env/variáveis do deploy para gerarenv.js(já ignorado no git) comwindow.__ENV = { SUPABASE_URL, SUPABASE_KEY }. Gere nova chave se alguma foi exposta.
- Vídeos hospedados externamente (ej. YouTube) requerem conexão ativa.
- O plano gratuito do Supabase tem limitações de storage; controlar uploads de vídeo é importante.
- Navegadores antigos ou dispositivos muito antigos podem não suportar MediaRecorder ou IndexedDB de forma estável.
- Testar cenários de sincronização com filas de conflitos e retries é essencial.
- Vídeos hospedados externamente (ej. YouTube) requerem conexão ativa.
- O plano gratuito do Supabase tem limitações de storage; controlar uploads de vídeo é importante.
- Navegadores antigos ou dispositivos muito antigos podem não suportar MediaRecorder ou IndexedDB de forma estável.
- Testar cenários de sincronização com filas de conflitos e retries é essencial.
Regiões (municípios) incluídas no projeto:
- Santarém, Belterra, Mojuí dos Campos, Alenquer, Curuá, Óbidos, Oriximiná, Terra Santa, Faro, Juruti, Monte Alegre, Almeirim, Prainha
Unidades Básicas de Saúde (exemplos):
- UBS Antônio Evangelista
- UBS Boa Esperança
- UBS Divinópolis
- UBS Márcio Marinho
- UBS Haroldo Martins
- UBS Maria Bibiana da Silva
- UBS Nadime Miranda
- UBS Neli Loeblein
- UBS Vicente Alves da Silva
- Notificações push para avisar pacientes sobre novas respostas.
- Geração de PDF do prontuário para impressão nas UBS.
- Gráficos de evolução das metas (glicemia / pressão / peso).
- Integração com sistemas de saúde governamentais (e-SUS) via API.
- Camada de verificação adicional no login (OTP/SMS).
- Mecanismos avançados de resolução de conflitos na sincronização.
Contribuições são bem-vindas:
- Fork no repositório.
- Crie uma branch feature/bugfix.
- Abra um Pull Request descrevendo a mudança.
Por favor, abra issues para bugs/funcionalidades antes de grandes mudanças de arquitetura.
Escolha uma licença adequada para o projeto (ex.: MIT, AGPL, GPL). Recomenda-se adicionar um arquivo LICENSE na raiz do repositório.
Desenvolvido para o projeto "Tecendo Linhas do Cuidado Integral à Saúde na Amazônia".
Se precisar, entre em contato com os mantenedores do projeto para informações adicionais ou acesso ao backend Supabase.