Web app PWA offline-first para leitura de tarô com teleprompter privado e base para reconhecimento de cartas por câmera.
- URL principal:
https://taro-lemon.vercel.app
- Node.js 22+
- npm 10+
- Instale dependências:
npm install- Crie o arquivo de ambiente:
cp .env.example .env.local- Rode o app:
npm run devAbra no navegador em http://localhost:5173.
- Registrar Cartas: captura/importa fotos por carta e orientação (
vertical/horizontal) com guia de enquadramento. - Sincronização de Capturas: fila local em IndexedDB com retry automático para upload no Supabase.
- Contador por Carta: usa contagem remota em
taro_metadata(deduplicada porqueue_id) + pendências locais da fila. - Reconhecimento: tenta modelo TensorFlow.js; se modelo estiver ausente/bootstrap, entra fallback local.
- Leitura: teleprompter com recursos avançados (WPM, atalhos, voz, ajustes visuais e de performance).
Para evitar excesso de armazenamento no celular durante a coleta:
- Copie
.env.examplepara.env.local(ou.env). - Configure:
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEYVITE_SUPABASE_BUCKET(opcional, padrãotaro-captures)VITE_SUPABASE_FOLDER_PREFIX(opcional, padrãoraw-captures)VITE_SUPABASE_METADATA_TABLE(recomendado:taro_metadata)
- Inicie o app e use a tela Registrar Cartas.
Com Supabase configurado, o app:
- enfileira capturas localmente (retry automático),
- envia em background para o Storage,
- remove a amostra local após upload concluído (limpeza automática),
- mantém contador por carta/orientação usando a tabela remota + fila local pendente.
Antes de usar contagem remota, aplique a migration SQL:
supabase/migrations/20260217_taro_metadata.sql
Ela cria/ajusta a tabela esperada pelo app (queue_id, card_id, orientation, captured_at, byte_size, mime_type, storage_path, uploaded_at), adiciona índice único em queue_id (idempotência) e políticas RLS para insert/select/update.
Estado atual no repositório: modelo bootstrap (não final).
Para produção de reconhecimento por IA, substitua public/model/* pelos artefatos finais treinados.
npm run model:verifyCritérios validados:
placeholder=falseempublic/model/metadata.jsonlabels=156(78 cartas x 2 orientações)format="layers-model"eoutput classes=156empublic/model/model.json
- Copiar
model.json,metadata.jsone arquivos de peso parapublic/model/. - Rodar
npm run model:verify. - Rodar
npm run build. - Publicar (
git push+ deploy Vercel).
npm run buildnpm run lint
npm run test
npm run checknpm run dev: ambiente local.npm run build: build de produção.npm run preview: preview local do build.npm run check: typecheck + lint + testes unitários.npm run e2e: testes E2E (Playwright).npm run model:verify: valida prontidão do modelo final.npm run bootstrap:assets-model: gera assets/modelo bootstrap.npm run bootstrap:icons: gera ícones PWA.
- Workflow:
.github/workflows/ci.yml - Etapas:
npm ci,npm audit --omit=dev --audit-level=moderate,npm run check,npm run build,npm run e2e
npm run e2esrc/components: telas e componentes de UI.src/hooks: hooks de câmera e IndexedDB.src/services: serviços de dados e persistência.public/data: base inicial de cartas e tiragens.public/cards: imagens locais das cartas (o bootstrap atual usa SVG; você pode substituir por seu deck real).public/model: modelo para TensorFlow.js (model.json,metadata.json, pesos). O projeto inclui um modelo bootstrap neutro.supabase/migrations: SQL de schema e hardening do banco.roteiros/checklist_homologacao_ios.md: checklist de homologação no iPhone/Safari.
- Seleção de tiragens (inclui simples e avançadas).
- Teleprompter com câmera, troca de dispositivo, fullscreen e wake lock.
- Registro guiado de cartas (vertical e invertida), com contador 60/60 por carta (9.360 imagens no total) e exportação ZIP por carta.
- Registro guiado com fila de upload para Supabase e limpeza local automática pós-upload.
- Importação de fotos no registro de cartas: HEIF/HEIC/HEVC/PNG/JPEG (com conversão para JPEG no app).
- Reconhecimento com TensorFlow.js + votação de estabilidade.
- Fallback automático para reconhecimento local quando o modelo é bootstrap/ausente.
- Mapeamento automático dos labels do Teachable Machine para cartas reais do deck.
- Teleprompter avançado com:
- controle de rolagem em WPM (passo de 1)
- editor de script com anotações e destaques
- importação TXT/MD e exportação de script
- cronômetro (tempo decorrido + contagem regressiva)
- atalhos personalizáveis (compatível com pedal Bluetooth via teclas)
- comandos de voz (quando suportado pelo navegador)
- ajustes visuais (fonte, contraste, alinhamento, flip horizontal/vertical, linha ativa)
- ajustes de performance (resolução da câmera, intervalo e confiança de inferência)
- Fallback manual de seleção de carta.
- Histórico local em IndexedDB.
- PWA com Service Worker (cache de dados, imagens e assets).
- Substituir o modelo bootstrap pelo modelo MobileNetV3 final (156 classes).
- Rodar homologação final no iPhone/Safari com o checklist em
roteiros/checklist_homologacao_ios.md.