尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗PWA mobile-first de conteúdo, hábitos, treino, nutrição e gastronomia com seis heróis reais (Neymar, Gabriel Medina, João Fonseca, Anitta, Ronaldinho Gaúcho e Érick Jacquin; uso de nome e imagem sob contrato informado pelo responsável), programas, evolução, assinaturas simuladas e comércio demonstrativo. Nenhum pagamento ou entrega real.
Stack aprovada: Next.js 15 + TypeScript · Supabase (Postgres/RLS/Auth/Storage) · Vercel. Idiomas: pt-BR (padrão), en, es.
docs/architecture.mddocs/decisions/ (vídeo, IA, módulo de receitas, prateleiras de programas, Hoje com relógio)docs/privacy-and-retention.mddocs/launch-checklist.mdA mesma web vai para a App Store e o Google Play numa casca Expo em mobile/: no app, comércio, planos e textos de demonstração não aparecem, o login usa Google pelo navegador do sistema e Sign in with Apple, e há push para posts de heróis favoritos, conquistas, programas concluídos e lembrete de sequência (docs/decisions/push-notifications.md). Decisão: docs/decisions/app-nas-lojas.md. Roteiro de publicação: docs/lojas.md.
cp .env.example .env.local # preencha NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY (e opcionais)
npm install
npm run dev # http://localhost:3000
| Comando | O que faz |
|---|---|
npm run dev / build / start | Next.js |
npm run typecheck · npm run lint | TypeScript estrito · ESLint |
npm run messages:check | Garante árvores de tradução e placeholders idênticos (pt-BR/en/es): 25 namespaces, 5.798 chaves por idioma |
npm run test | Vitest: 1.836 aprovados + 1 pulado em 86 arquivos (85 aprovados + 1 pulado; 30/10/2026) |
npm run test:rls | 1.523 asserções de RLS/regras de negócio (S0–S67; 30/10/2026, migrações até a 0057) num Postgres local isolado (LOCAL_DB_NAME escolhe o banco) |
npm run test:e2e (use PLAYWRIGHT_CHROMIUM_PATH para reutilizar um Chromium já instalado e E2E_BASE_URL para um servidor já ativo) | Playwright (Pixel 7 + Desktop Chrome) + axe, com as contas demo: 522 testes em 44 specs (30/10/2026); detalhes em docs/testing.md |
npm run db:local:reset | Sobe Postgres 16 local com shim Supabase + todas as migrations + seed |
npm run db:types | Regenera src/lib/supabase/database.types.ts a partir do banco local |
npm run eval:recommendations | Compara motores de recomendação (determinístico vs provedores com chave) |
npm run icons | Regenera ícones PWA (PNG) a partir da marca |
npm run check | typecheck + lint + mensagens + testes |
Na interface, o papel creator (quem assina conteúdos e programas) aparece como herói em pt-BR, en e es, conforme o DMR 1.0. É um termo de papel, sem flexão de gênero. Código, tabelas (creator_profiles) e rotas (/personalities, /creator) mantêm os nomes originais; a documentação técnica ainda usa "personalidade" para esses identificadores.
Migrations versionadas em supabase/migrations/0001…0057*.sql (57 arquivos: não há 0034 e existe a 0044b; aplicar em ordem). Da 0040 em diante: 0040_list_items_products_programs, 0041_favorites_products_programs, 0042_hero_cover_photos, 0043_post_photos, 0044_real_heroes + 0044b_profile_avatars_real_heroes, 0045_admin_hero_publishing, 0046_quick_signup, 0047_shop_filters, 0048_program_concept, 0049_hero_categories, 0050_hero_library_tabs, 0051_alimentacao, 0052_hero_scoped_showcase, 0053_admin_seller_ops, 0054_push_notifications, 0055_fix_counters_embed, 0056_hero_follows_compare e 0057_collectibles_auctions. Situação registrada em 23/10/2026 (até a 0039): todas aplicadas em produção, 39 registros em supabase_migrations.schema_migrations (o remoto sempre teve 1 registro a mais que os arquivos); confira as posteriores com remote-apply.mjs --dry. Mais antigas, em destaque: 0036_recipe_delete_archived.sql (o herói exclui de vez a receita que ele arquivou; docs/decisions/recipes-module.md, seção "Fase 6"), 0037_streak_contents_only.sql (a sequência conta só conteúdos concluídos e entradas em programas; Lembretes não contam) e 0038_health_foundation.sql + 0039_health_ingest.sql (schema health do relógio real, fora da API, aplicadas vazias; ver WEARABLES_REAL_ENABLED abaixo). Seed determinístico e reexecutável em 0008_seed.sql (8 personalidades fictícias, 40 conteúdos, 8 programas, 24 produtos, 4 operações, destinos fictícios, planos/módulos, conquistas, interesses). A 0035_program_shelves_seed.sql acrescenta 16 programas de demonstração (24 no total, 3 por herói; ver docs/decisions/program-shelves.md). A 0044_real_heroes.sql troca os personagens pelas seis pessoas reais (mesmas linhas, slugs novos) e tira do app, de forma reversível, os dois personagens restantes (perfil suspenso, conteúdo arquivado ou passado ao dono do programa que o usava; auditoria hero.removed): no fim ficam 6 heróis, 38 conteúdos no ar e 18 programas publicados. Fotos e licenças em docs/photo-credits.md. A 0054_push_notifications.sql cria herói favorito, tokens de push, a fila de envio e os gatilhos dos avisos (docs/decisions/push-notifications.md); aplicar depois do merge.
Aplicar no projeto Supabase remoto:
# via Management API (recomendado): token em https://supabase.com/dashboard/account/tokens
SUPABASE_ACCESS_TOKEN=... node scripts/db/remote-apply.mjs # aplica o que falta
SUPABASE_ACCESS_TOKEN=... node scripts/db/remote-apply.mjs --dry # só lista
Ou cole cada arquivo no SQL Editor do Supabase, na ordem. O admin inicial é definido por app_settings.bootstrap_admin_emails (seed) e aplicado no primeiro login.
Veja .env.example. Resumo:
| Variável | Obrigatória | Onde |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | sim | Supabase → Project Settings → API |
SUPABASE_SERVICE_ROLE_KEY | para recomendações persistidas, cron, contas demo | servidor apenas (Vercel) |
CRON_SECRET | para /api/cron/* | Vercel |
NEXT_PUBLIC_SITE_URL | recomendada | URL pública |
OPENAI_API_KEY / GEMINI_API_KEY | opcional | sem elas: fallback determinístico, identificado |
CLOUDFLARE_*, VIDEO_PROVIDER (Cloudflare Stream) | para o herói enviar vídeo (posts e receitas) | servidor; ligadas na Vercel (produção). Sem elas, o novo post mostra "Vídeo ainda não configurado". Mux só como interface |
EXPO_ACCESS_TOKEN | não: só com a "segurança reforçada" do push ligada no projeto Expo | servidor (Vercel). O push do app das lojas (docs/decisions/push-notifications.md) sai pelo cron /api/cron/push (22:00 UTC) e logo depois de publicar um post ou concluir um conteúdo |
WEARABLES_REAL_ENABLED (e as variáveis das marcas no .env.example) | não: relógio real (Garmin, Oura, WHOOP, Polar) pronto e oculto | desligada na Vercel; no banco, trava connect_open = 'false' em health.config. Para ligar: docs/decisions/hoje-relogio.md, seção "Roteiro de ligar" |
Google OAuth: configurar em Supabase → Authentication → Providers → Google (callback https://<ref>.supabase.co/auth/v1/callback).
| Papel | Como obtém | O que pode |
|---|---|---|
| Visitante | — | explorar catálogo, programas e perfis públicos |
| Consumidor | cadastro público (nível gratuito) | consumir conteúdo liberado, listas, progresso, assinatura simulada, pedidos de teste |
| Personalidade | convite + ativação pelo admin | rascunhos, submissão para revisão, sugestão de vínculo com produto |
| Fornecedor | convite + ativação pelo admin | desligado por enquanto (0053): o portal /seller não abre e a conta demo do fornecedor saiu do painel; produtos, remessas e perfil das organizações são operados pelo admin em /admin/sellers/[id] (abas Visão geral, Produtos, Remessas, Organização) e /admin/shipments. Contas e dados mantidos; religar = SELLER_PORTAL_ENABLED em src/lib/seller-ops/portal.ts |
| Admin | bootstrap/concessão auditada | tudo, com confirmação e trilha de auditoria (inclui a operação dos fornecedores: escritas em produtos e transições de remessa vão para admin_audit, 0053) |
Autorização é aplicada em PostgreSQL (RLS + funções security definer); a interface só reflete.
/shop/compras: pedidos de teste e "Lances e arremates"; /orders leva para lá)./seller está desligado; produtos, remessas e organização dos fornecedores são operados pelo admin em /admin/sellers/[id] e /admin/shipments, com auditoria./profile/today/[categoria]; "Continue seus programas" depois da Evolução; Evolução com streak (só conteúdos concluídos e entradas em programas; Lembretes não contam, 0037) e conquistas em /profile/evolution; Lembretes em Perfil › Lembretes, fora do Hoje; para o herói, o topo do Perfil segue o Instagram (foto, nome, headline e bio públicos, Portal do herói logo abaixo, botões "Editar perfil" e "Ver página pública"); "Editar perfil" abre na mesma tela o editor recolhível (avatar, headline, bio, capa, redes, especialidades e credenciais de chef, nota de direitos), e o herói ativo tem um avatar só (foto ou ilustração, igual no app e na página pública); planos simulados, interesses, conta/exclusão). A barra inferior tem 4 abas: Início, Explorar, Heróis e Perfil, Loja/carrinho/checkout/pedidos de teste.docs/decisions/recipes-module.md)./creator; o perfil público saiu do portal e mora no Perfil, /creator/profile redireciona para /profile#perfil-publico, que abre o editor), Fornecedor (/seller, desligado por enquanto: a operação mora em /admin/sellers e /admin/shipments), Administração (/admin).| Sintoma | Causa provável | Ação |
|---|---|---|
| "temporariamente indisponível" num conteúdo publicado | sem access_level | admin define regra de acesso |
| Conteúdo premium visível mas bloqueado | sem módulo ativo | esperado; /profile/plan |
protected_column: x | coluna só para admin/sistema | usar a RPC correspondente |
cart_changed: [...] no checkout | preço/disponibilidade mudou | UI pede confirmação |
| Recomendações marcadas como fallback | sem chave ou kill switch | /admin/settings |
npm run test:rls falha em citext | search_path local | o script já define public, extensions |
Cadastro recusado ("Database error saving new user" / experiment_closed) | experiment.open desligado e e-mail sem convite pendente | criar convite para o e-mail ou religar em /admin/settings |
| Usuário não consegue entrar após suspensão | conta suspensa (ban no Auth) | /admin/users/<id> → Reativar conta |
Os heróis são as seis pessoas reais citadas acima (fotos de licença livre, créditos em docs/photo-credits.md). Fornecedores de exemplo e destinos são fictícios e identificados como tal.