尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
PWA de gamificação do Move Santana (ministério de jovens da Igreja Verbo da Vida Santana). O jovem tem um pet virtual estilo Tamagotchi/pixel art que cresce por XP, ganho fazendo check-in via QR Code em cultos e eventos. Status: MVP completo (Fase 8/8) — projeto, arquitetura, banco de dados, autenticação, pet/XP/evolução, check-in por QR Code, painel administrativo, inventário/conquistas, compartilhamento e PWA (ícones, offline, telas de erro estilizadas) já funcionando de ponta a ponta. Ver .claude/plans e seção "Roadmap" abaixo para o histórico de fases.檢視完整 README ↗
Faça check-in. Ganhe XP. Evolua. 🚀
PWA de gamificação para ministérios de jovens — nasceu no Move Santana (Igreja Verbo da Vida Santana) e hoje atende várias igrejas isoladas na mesma instalação. O jovem tem um pet virtual estilo Tamagotchi/pixel art que cresce por XP, ganho fazendo check-in via QR Code em cultos e eventos.
Status: MVP completo (Fase 8/8) — projeto, arquitetura, banco de dados, autenticação, pet/XP/evolução, check-in por QR Code, painel administrativo, inventário/conquistas, compartilhamento e PWA (ícones, offline, telas de erro estilizadas) já funcionando de ponta a ponta. Ver
.claude/planse seção "Roadmap" abaixo para o histórico de fases.
qrcode) e leitura (qr-scanner)npm install
cp .env.example .env
Edite .env se necessário (veja "Variáveis de ambiente" abaixo). Um AUTH_SECRET aleatório já é sugerido no .env gerado localmente — gere o seu com:
npx auth secret
# ou
openssl rand -base64 32
Suba o Postgres local via Docker Compose:
npm run db:up # docker compose up -d db
Rode as migrations e o seed inicial:
npx prisma migrate dev
npx prisma db seed
Para inspecionar o banco visualmente:
npm run prisma:studio
Para derrubar o banco local:
npm run db:down
| Variável | Descrição |
|---|---|
DATABASE_URL | Connection string pooled do Postgres (Docker local por padrão; na Vercel com Prisma Postgres é injetada automaticamente pela integração) |
DIRECT_URL | Connection string direta, usada pelo Prisma CLI para migrations/introspection (localmente pode ser igual a DATABASE_URL; na Vercel com Prisma Postgres também é injetada automaticamente) |
AUTH_SECRET | Segredo usado pelo Auth.js para assinar sessões/JWT |
NEXTAUTH_URL | URL base da aplicação (usada pelo Auth.js) |
NEXT_PUBLIC_APP_URL | URL pública usada para montar os links de check-in dos QR Codes (/checkin/[token]) |
SUPER_ADMIN_EMAIL / SUPER_ADMIN_PASSWORD | Opcionais. Usadas só pelo seed e pelo prisma/create-super-admin.ts para criar o super-admin — não precisam estar na Vercel (o deploy não roda o seed) |
NEXT_PUBLIC_VAPID_PUBLIC_KEY | Chave pública VAPID para Web Push Notifications no PWA |
VAPID_PRIVATE_KEY | Chave privada VAPID para envio de notificações pelo servidor |
VAPID_SUBJECT | E-mail de contato / subject para o protocolo VAPID (ex.: mailto:[email protected]) |
npm run dev
Acesse http://localhost:3000. Verifique a conexão com o banco em http://localhost:3000/api/health — deve retornar {"status":"ok","db":true}.
npm run build
npm run start
O prisma/seed.ts cria:
id: church-move-santana, slug move-santana)[email protected] / movepet123 — troque em produção)SUPER_ADMIN_EMAIL e SUPER_ADMIN_PASSWORD estiverem definidos/checkin/<token>) — os tokens são impressos no console ao rodar npx prisma db seedCada igreja é um tenant isolado (model Church): usuários, eventos, convites e check-ins pertencem a uma igreja, e o admin de uma igreja não enxerga nada das outras. Espécies de pet, itens, conquistas e regras do jogo (ConfigEntry) são globais, compartilhados por todas.
Role): USER (jogador), ADMIN (admin da sua igreja, inclusive com o painel de debug na home) e SUPER_ADMIN (administra a plataforma; não pertence a nenhuma igreja e não tem pet)./invite/[token]) — o usuário entra na igreja dona do convite. O e-mail é único global: uma conta pertence a uma igreja só.churchId; buscas por id em fluxos de admin usam { id, churchId }. QR Code ou código curto de outra igreja responde como "evento não encontrado"./admin/users o admin da igreja promove/rebaixa usuários da própria igreja. Ninguém altera o próprio papel e a igreja nunca fica sem pelo menos um admin ativo.src/server/auth/context.ts (getCurrentUser, requireMember, requireChurchAdmin, requireSuperAdmin) — papel, igreja e status ativo podem mudar depois do login e valem na hora, sem relogar. O src/proxy.ts só verifica se há sessão; nunca redirecione por role no proxy (o role do JWT pode estar desatualizado e gerar loop de redirect com os layouts)./platform)Acesso separado, com login próprio em /platform/login, restrito a SUPER_ADMIN:
Sem rodar o seed completo (útil em produção, onde o seed criaria eventos de exemplo):
SUPER_ADMIN_EMAIL="[email protected]" SUPER_ADMIN_PASSWORD="senha-forte" npx tsx prisma/create-super-admin.ts
Para produção, carregue antes as variáveis de DATABASE_URL/DIRECT_URL de produção no shell (ex.: set -a && . ./.env.production.local && set +a). Rodar de novo com o mesmo e-mail só troca a senha. O script recusa converter uma conta de jogador/admin já existente — use um e-mail que ainda não tenha conta.
No painel /admin (login com um admin da igreja, ex. [email protected]; o evento é criado na igreja dele): /admin/events/new → preencher nome, descrição, data, horário de início/término e XP → salvar → você é redirecionado direto para /admin/events/[id]/qrcode, com o QR Code pronto para imprimir ou baixar (PNG), apontando para NEXT_PUBLIC_APP_URL/checkin/<qrCodeToken>.
Em /admin/events também dá pra editar, ativar/desativar (recomendado ao encerrar um evento) e excluir — exclusão é bloqueada se o evento já tiver check-ins registrados (desative-o nesse caso).
Fuso horário: data/horário do evento são interpretados no fuso horário do servidor (sem offset explícito). Em produção na Vercel (padrão UTC), configure a variável de ambiente
TZ=America/Sao_Paulopara os horários digitados no admin corresponderem ao horário de Brasília na validação do check-in.
Ver .claude/skills/architecture/SKILL.md para as convenções de camadas (UI → server actions → services → repositories → Prisma) e os demais skills em .claude/skills/ para UI/UX mobile, pixel art, gamificação, QR/check-in, banco de dados, PWA e testes.
/login, /register, sessão JWT, proteção de rotas via src/proxy.ts, gate de role para /admin)XPService, PetEvolutionService, ConfigService; pet criado automaticamente no cadastro)/checkin/[token], CheckInService.performCheckIn transacional — valida evento ativo/janela de horário, idempotência via constraint única, aplica XP/streak/energia/felicidade e recalcula evolução)/admin — dashboard com métricas, CRUD de eventos com geração de QR Code/impressão/download, ativar/desativar, exclusão protegida contra eventos com check-ins, listagem de usuários com nível/XP/check-ins)InventoryService, AchievementService — item especial do evento, desbloqueio automático por nível/quantidade de check-ins, avaliação de conquistas, tudo disparado dentro da mesma transação do check-in; /inventory e /achievements com dados reais, equipar/desequipar itens por slot)html-to-image, na tela de resultado do check-in — evolução/conquista/item têm prioridade sobre o check-in simples; usa a Web Share API nativa quando disponível — ótimo pra Instagram/WhatsApp — com fallback de download da imagem)/~offline, páginas 404/erro estilizadas, trustHost corrigido para funcionar em produção fora da Vercel, robots.txt bloqueando indexação — app privado — e ajustes de contraste; auditado com Lighthouse: Accessibility 100, Best Practices 100)churchId, migration add_churches movendo os dados existentes para a Move Santana, promoção de admins por igreja e painel de super-admin em /platform)PushSubscription, disparo automático filtrado por igreja na criação de eventos e toggle de ativação no perfil do usuário)DevotionalJourney, DevotionalDay, DevotionalCheckIn, calendário coletivo, ganho diário de XP e felicidade do pet, trava de dias futuros, leitura retroativa sem XP, anotações pessoais privadas e desbloqueio de cenário exclusivo para o pet)shortCode em Event, CheckInModal) — um usuário gera um código de troca temporário, o outro escaneia ou digita, e o servidor casa os dois e executa a troca dentro de uma transação (prisma.$transaction), igual ao CheckInService.performCheckIn. Não requer WebRTC/P2P nem API nativa nenhuma, funciona igual em iPhone e Android dentro do PWA.DATABASE_URL (pooled) e DIRECT_URL (direta) automaticamente nas env vars do projeto — não precisa configurar essas duas manualmente.AUTH_SECRET (gere um novo, não reuse o do .env local), NEXTAUTH_URL, NEXT_PUBLIC_APP_URL (a URL final do deploy) e TZ=America/Sao_Paulo (ver nota sobre fuso horário acima).vercel CLI ou integração com o repositório Git — o script vercel-build do package.json já roda prisma migrate deploy automaticamente antes do build, então a Vercel detecta e usa esse script sozinha (convenção própria dela, não precisa configurar nada no painel). Novas migrations criadas depois são aplicadas automaticamente a cada deploy.DATABASE_URL=... DIRECT_URL=... npx prisma db seed (localmente, apontando pras env vars de produção) — troque a senha do admin padrão ([email protected] / movepet123) logo em seguida, direto no banco.prisma/create-super-admin.ts (ver "Criando o super-admin") e cadastre as demais igrejas pelo painel /platform.