Do prompt ao SaaSManual de implementação
Referências de vídeos · Construção com IA

Uma ideia.
Um manual.
Seu próximo SaaS.

Um passo a passo para criar um painel de referências de conteúdo: da primeira configuração à preparação para produção. Copie os prompts e avance uma etapa por vez.

12 prompts de desenvolvimentoPortuguês BrasilHTML independenteAtualizado em 07 out. 2026
01 / PREPARE

Crie suas contas

Serviços, credenciais e ambientes que você vai precisar.

Ver checklist ↗
02 / CONSTRUA

Trabalhe com a IA

Contrato do projeto e prompts organizados por etapa.

Abrir a trilha ↗
03 / CONFIGURE

Prepare os ambientes

Modelos completos para desenvolvimento e produção.

Acessar os .env ↗

Todo o conteúdo do manual está nesta página. Os modelos de ambiente não contêm credenciais.

Prepare o terreno

Contas que você deve ter

Conta ou acesso Finalidade O que criar ou obter
GitHub — https://github.com Código, histórico e integração com deploy Repositório privado; não salvar arquivos .env reais
Vercel — https://vercel.com Hospedagem Next.js Projeto conectado ao GitHub; configurar ambientes Development, Preview e Production
Supabase — https://supabase.com PostgreSQL, autenticação e arquivos Projetos separados dev/prod ou Supabase local para dev; URL, chave pública, chave privilegiada, referência do projeto e credenciais de provisionamento quando necessárias
Upstash — https://upstash.com Redis e QStash Banco Redis, URL/token REST; configuração QStash com token e chaves de assinatura atual/próxima; separar dev/prod
Resend — https://resend.com Confirmação de cadastro, recuperação de senha e e-mails Domínio verificado e API key usada como senha SMTP
ScrapeCreators — https://scrapecreators.com Coleta de referências Sua chave para testar como usuário; cada cliente cria sua própria conta e cadastra sua própria chave no SaaS
Provedor do domínio e DNS Endereço do SaaS e identidade de e-mail Acesso para configurar domínio/subdomínio na Vercel e registros solicitados pelo Resend
Ferramenta de desenvolvimento com IA Executar este manual e modificar arquivos Ambiente com edição do repositório, terminal, dependências e execução server-side; se a ferramenta apenas gerar front-end, será necessário exportar o código para um ambiente completo

shadcn/ui, Tailwind, PostgreSQL e bibliotecas do projeto não exigem uma conta própria. Supabase Storage faz parte do Supabase; Redis e QStash usam a conta Upstash, mas são recursos distintos. Um gateway de pagamento só será necessário quando houver cobrança automatizada de assinaturas.

Ordem para preparar as contas

  1. Escolha nome e domínio do produto. Pode usar um subdomínio de domínio que você já controla; não precisa comprar outro apenas para iniciar.
  2. Crie repositório privado no GitHub e conecte o projeto à Vercel.
  3. Prepare Supabase de desenvolvimento e de produção. Desenvolvimento também pode usar CLI local com Docker; não deixe testes escreverem na produção.
  4. Crie Redis e configure QStash, mantendo credenciais e callbacks separados por ambiente.
  5. No Resend, verifique o domínio com os registros DNS solicitados. Defina um remetente como acesso@seu-dominio.com. Crie credencial com escopo mínimo suficiente.
  6. Crie sua conta ScrapeCreators para os testes de integração e confira saldo/condições atuais. Essa chave entra no seu usuário de teste, não no ambiente global do SaaS.
  7. Preencha env localmente, aplique migrations e seed, configure Auth/SMTP e crie o admin por bootstrap.
  8. Cadastre as variáveis na Vercel por ambiente, publique e então confirme URL de produção, redirects e callbacks QStash. Configure recuperação periódica da outbox.
  9. Faça smoke test com usuários distintos e crédito limitado. Remova senha inicial e tokens de provisionamento do runtime.

Nenhuma dessas contas foi criada por este manual. Não há valores de preço ou quotas garantidos neste documento. Antes de ativar produção, verifique custos, limites e condições de uso dos planos, inclusive elegibilidade para uso comercial do plano de hospedagem. Free tiers podem servir ao desenvolvimento, mas não são garantia de operação gratuita em qualquer volume.

Credenciais que você precisa reunir

  • Supabase: URL pública do projeto, chave pública anon ou equivalente publishable adotada pelo SDK, chave privilegiada service_role ou equivalente secret no servidor e referência do projeto. Token de Management API somente para script de configuração; senha/URL PostgreSQL somente quando a ferramenta de migrations exigir.
  • Upstash Redis: URL REST e token REST do banco.
  • QStash: token, chave de assinatura atual e próxima, além da URL HTTPS de callback do seu próprio projeto.
  • Resend: API key como SMTP_PASSWORD, domínio verificado e remetente autorizado. Configuração SMTP consultada: host smtp.resend.com, usuário resend, porta 465 para TLS direto ou 587 para STARTTLS.
  • Administração: seu e-mail e uma senha inicial forte, usados uma única vez pelo script de criação.
  • Criptografia: chave aleatória própria do aplicativo, com 32 bytes em base64; guardar uma cópia segura para conseguir descriptografar dados depois de restauração.

Não cole segredos em mensagens para a IA. Forneça arquivos .env locais ignorados pelo Git ou use o gerenciador de secrets da plataforma. A IA deve conseguir implementar o projeto lendo os nomes das variáveis sem divulgar seus valores.

Manual de implementação

Prompt de execução do manual inteiro

Você pode anexar este arquivo à IA e enviar esta instrução:

Prompt pronto para copiar
Implemente o projeto descrito no manual anexado. Este documento é a especificação completa e obrigatória. Leia todas as seções antes de começar. Siga o contrato permanente e execute as etapas 1 a 11 em ordem, registrando progresso em arquivos para sobreviver a mudanças de sessão.

Antes de modificar, inspecione o repositório. Comece pela configuração dos ambientes, interfaces de serviços e migrations. Depois implemente autenticação, interface, integração ScrapeCreators, jobs, biblioteca, métricas, administração, SMTP e preparação de produção.

Não pare em um mockup. Todas as ações essenciais precisam funcionar com backend real. Não invente credenciais, dados, endpoints ou testes bem-sucedidos. Trabalhe autonomamente nas tarefas locais e reversíveis, valide a cada etapa e preserve o progresso. Quando precisar de configuração externa que eu ainda não forneci, conclua o código independente, indique a variável ou configuração necessária e diferencie o teste pendente de um bloqueio de implementação.

Não recrie do zero um projeto existente sem motivo. Não publique políticas com placeholders nem declare produção validada antes de testes reais. Ao terminar, apresente código, arquivos env de exemplo, migrations, scripts de provisionamento, documentação de deploy, evidências dos testes executados e pendências objetivas.
Manual de implementação

Como usar por etapas

Envie primeiro o Prompt 0 e depois execute um prompt por vez, na ordem. Mantenha os arquivos de especificação no repositório para preservar o contexto entre sessões. Não avance quando um requisito essencial da etapa falhar. Se já existir código, a IA deve inspecioná-lo, preservar funcionalidades corretas e implementar o que estiver faltando, sem reiniciar o projeto sem necessidade.

O escopo inicial é Instagram público. O link de Stella Soragi é apenas exemplo de entrada, não uma conta previamente conectada nem evidência de dados coletados. TikTok e YouTube ficam preparados por interfaces, sem telas que finjam integração. Não está incluída geração de roteiros por LLM nem publicação automática nas redes sociais.

Manual de implementação

Decisões que orientam todos os prompts

Área Escolha inicial Evolução futura
Aplicação Next.js com TypeScript e App Router na Vercel Manter código compatível com runtime Node e evitar dependências desnecessárias de hosting
Interface shadcn/ui, Tailwind, tema claro, escuro e sistema Tokens centralizados e componentes reutilizáveis
Banco PostgreSQL do Supabase, migrations SQL versionadas PostgreSQL externo com plano próprio para autenticação e políticas
Autenticação Supabase Auth Exige migração de identidades, sessões e referências a auth.users; não basta alterar DATABASE_URL
Arquivos Supabase Storage em buckets privados Adaptador S3, migração de objetos, URLs assinadas e políticas
Cache e limites Upstash Redis via REST Redis via protocolo nativo e adaptador próprio
Tarefas QStash com consumidores HTTP e estado durável no PostgreSQL BullMQ + Redis e worker persistente, normalmente fora da Vercel
E-mail SMTP configurável, inicialmente com Resend Outro servidor SMTP; DNS e autenticação do provedor também precisam ser configurados
Coleta ScrapeCreators com chave individual por usuário Adaptador com contrato independente do formato externo

Supabase já utiliza PostgreSQL. A intenção é reduzir acoplamento, não prometer migração completa por troca de variáveis. Redis sozinho não substitui o agendamento e a entrega de tarefas do QStash.

As variáveis de infraestrutura, marca e bootstrap vêm do ambiente. As chaves individuais de usuários são dados sensíveis de cada tenant e devem ficar criptografadas no banco, pois não podem ser adicionadas dinamicamente ao .env de uma aplicação compartilhada. Configurações pessoais, referências, anotações e atribuições de planos também ficam no banco.

Não haverá limite comercial de perfis por usuário no MVP. Haverá limites técnicos de concorrência, requisições e tamanho de lote para manter o serviço operante. Cada importação busca até 500 Reels disponíveis, sem limite de 500 registros históricos por perfil. Nunca prometer acesso a vídeos privados, apagados ou não retornados pela API.

00Leia primeiro

Contrato permanente do projeto

Prompt pronto para copiar
Atue como engenheiro responsável pelo desenvolvimento e preparação para produção de um SaaS de referências de conteúdos para criação de vídeos. Implemente código funcional; não entregue apenas um protótipo visual.

Leia o repositório e este documento antes de alterar arquivos. Se não houver projeto, crie Next.js + TypeScript + App Router. Use releases estáveis compatíveis, confira a documentação oficial e registre versões no lockfile. Use shadcn/ui e Tailwind, Supabase Auth/PostgreSQL/Storage, Upstash Redis, QStash, SMTP com Resend e hospedagem na Vercel. O idioma de toda experiência é Português Brasil.

O usuário cadastra sua chave da ScrapeCreators e perfis públicos de referência. O sistema coleta até 500 Reels disponíveis por importação, persiste os resultados, permite identificar vídeos com maior desempenho, favoritar, organizar coleções, filtrar e fazer anotações pessoais. Existem usuários e administrador. O usuário pode cadastrar quantos perfis quiser. As credenciais e todos os dados pessoais são isolados por usuário.

Regras permanentes:
1. Todas as configurações de infraestrutura e marca vêm de env, com esquema Zod, separação pública/privada e validação por capacidade. Nunca exponha secrets via NEXT_PUBLIC_, bundles, HTML, logs ou mensagens de erro.
2. Chaves pessoais da ScrapeCreators são cadastradas na aplicação e criptografadas no servidor. Não coloque chaves individuais no .env global. O cliente nunca lê o segredo armazenado; recebe apenas status e trecho mascarado.
3. PostgreSQL é a fonte de verdade. Cache não define permissões, planos, propriedade ou progresso durável. Todas as mutações verificam autenticação, titularidade, suspensão e autorização no servidor.
4. Use RLS e constraints para isolamento. Não use service role em operações normais do usuário. Operações privilegiadas ficam em módulos server-only e validam escopo explicitamente.
5. Nenhuma coleta longa fica em uma única função Vercel. Use tarefas por página, checkpoints, idempotência, outbox transacional e recuperação de interrupções.
6. Consulte https://docs.scrapecreators.com/llms.txt e páginas específicas. Não invente endpoints, parâmetros, campos, métricas ou preços. Campos indisponíveis são null, e a interface mostra “Não disponível”.
7. Use adapters para coleta, cache, storage, fila, e-mail e identidade. Não anuncie portabilidade como simples troca de env onde existem diferenças de protocolo ou modelo de segurança.
8. Não crie assinaturas ou pagamentos fictícios. Sem gateway definido, os planos funcionam por atribuição manual do administrador, claramente identificada. Não inclua geração de vídeos ou roteiros com LLM no MVP.
9. Não inclua dados demonstrativos em produção. Fixtures de teste são explícitas e isoladas.
10. Toda ação deve ter estados de carregamento, vazio, sucesso, erro, autorização negada e integração indisponível, quando aplicável. A acessibilidade e a experiência mobile fazem parte da entrega.

Crie docs/PRODUTO.md, docs/ARQUITETURA.md, docs/SEGURANCA.md e docs/PROGRESSO.md. Registre requisitos, escolhas, limitações e próximos passos. Trabalhe etapa por etapa. Ao encerrar cada etapa, apresente alterações, comandos realmente executados, resultados e pendências. Não declare teste, integração ou deploy bem-sucedido sem evidência. Se faltar credencial, conclua as partes independentes e descreva exatamente o teste real que ficou pendente.
01Etapa de implementação

Estrutura e configuração de ambientes

Prompt pronto para copiar
Implemente a base do projeto seguindo o contrato permanente. Nesta etapa priorize ambiente, arquitetura e execução local.

Crie estrutura por funcionalidades e serviços: src/app, src/components, src/features, src/server, src/server/adapters, src/lib/env, src/lib/validation, scripts, supabase/migrations, docs e tests. Mantenha autorização e regras de negócio fora dos componentes React. Marque módulos sensíveis com server-only.

Crie .env.example, .env.development.example e .env.production.example usando o catálogo deste pacote. Forneça instruções para gerar .env.development.local e .env.production.local sem versioná-los. Não use NODE_ENV=dev ou valores diferentes de development/production/test; use APP_ENV para distinguir desenvolvimento, preview e produção.

Crie esquema tipado de env, com validação de URL, e-mail, número, booleano explícito e hex de cor. Proíba chave de criptografia vazia/inválida em funcionalidades sensíveis e configuração localhost em produção. Valide grupos ativos: SMTP, QStash, Redis e storage. Um grupo não implementado ou inativo não deve tornar obrigatório um secret sem uso. Não faça chamadas externas nem exija bootstrap admin durante next build.

Não crie variáveis decorativas. Cada env deve ter consumidor ou estar documentada como reservada para adaptador futuro. As chaves S3, REDIS_URL e DATABASE_URL não são exigidas para adaptadores inativos. VERCEL_TOKEN é opcional para automação de deploy e nunca necessário no runtime.

Configurações públicas: nome, URL, suporte, cores e credenciais públicas do Supabase. Prefira carregar marca validada no servidor e repassar somente campos públicos. Se usar NEXT_PUBLIC_, explique que seu valor entra no build e exige novo deploy para mudar.

Implemente interfaces ContentProvider, CacheAdapter, StorageAdapter, JobQueue, Mailer e IdentityProvider; forneça adaptadores concretos na etapa pertinente. Não inclua uma implementação vazia que responda sucesso. QStash publica tarefas; o banco guarda seu estado. Redis pode fornecer cache e rate limit, sem guardar o único registro do trabalho.

Configure scripts dev, build, start, lint, typecheck, test, db:migrate, db:seed, admin:bootstrap, services:configure e env:check. Não deixe comandos inexistentes na documentação. Documente instalação, versões e arquitetura. Execute typecheck e build aplicáveis e registre o resultado real.
02Etapa de implementação

Banco de dados migrations RLS e seeds

Prompt pronto para copiar
Implemente migrations SQL ordenadas para Supabase, com schema, índices, constraints, RLS e grants. Migrations são a fonte do schema. Seeds populam planos/configurações iniciais de forma idempotente. Dados de exemplo só em ambiente de teste ou desenvolvimento com opção explícita.

Modelo mínimo:
- profiles: id da identidade, nome, avatar, fuso horário e preferências não sensíveis.
- user_roles: user_id e papel user/admin. Nenhum usuário edita seu próprio papel. account_status separado, controlado pelo administrador.
- api_credentials: user_id, provider, ciphertext, nonce, tag, key_version, máscara, status e last_validated_at. Uma credencial ativa da ScrapeCreators por usuário no MVP, usada por todos os seus perfis. Rotação substitui a ativa sem expor a antiga.
- reference_accounts: user_id, plataforma, external_id, handle normalizado, URL canônica, nome, bio quando disponível, avatar, seguidores atuais e datas de coleta.
- reference_account_snapshots: métricas do perfil com collected_at para histórico.
- videos: user_id, reference_account_id, plataforma, external_id como texto, shortcode, permalink, caption nullable, data de publicação nullable, duração nullable, thumbnail/source_url nullable, métricas atuais nullable, collected_at e versão do normalizador.
- video_metric_snapshots: observações com video_id, métricas nullable, collected_at e identificação da operação para deduplicação.
- notes, favorites, tags, video_tags, collections e collection_items: tudo pertence a um usuário; notes são privadas e não comentários publicados no Instagram.
- sync_jobs: user_id, profile_id, tipo, status, cursor, contadores, orçamento de requests, checkpoint, motivo final, cancelamento, lease e timestamps.
- sync_job_steps: página/etapa, geração, request ID e estado durável, impedindo repetição de transações.
- outbox_events: eventos internos escritos na mesma transação do checkpoint, tentativas e estado de publicação.
- provider_usage: user_id, job_id, endpoint, requests e créditos somente quando fornecidos; não guardar headers ou credenciais.
- plans, plan_entitlements e subscriptions: plano e atribuição manual com origem explícita, datas e estado.
- audit_logs e legal_acceptances: eventos mínimos e versão dos termos aceitos, sem secrets.

Use UUID internos, timestamptz em UTC, bigint para contagens e texto para IDs externos potencialmente maiores que o inteiro seguro do JavaScript. Não converta null em zero. Defina exclusões em cascata cuidadosamente, retenção e trilha de exclusão de objetos externos.

Crie unicidade por tenant e identidade canônica: perfis por user_id/plataforma/external_id, handles ativos normalizados com estratégia para renomeação, vídeos por user_id/plataforma/external_id, favoritas/associações por seus pares de IDs. Em vídeos colaborativos, preserve todas as associações de origem por tabela de vínculo caso um mesmo vídeo pertença a múltiplos perfis, sem sobrescrever silenciosamente a origem.

Use constraints compostas ou validações transacionais para impedir que um filho do usuário A aponte para perfil, vídeo, tag, coleção ou credencial do usuário B. Ter user_id em uma linha não basta. Não deixe o usuário alterar owner, role, status, plano ou campos internos de execução.

Ative RLS em todas as tabelas acessíveis pela API e teste SELECT/INSERT/UPDATE/DELETE de cada tipo. Segredos devem ficar em schema privado ou tabela sem grants para anon/authenticated; o acesso server-only usa contexto autorizado. Jobs internos, outbox e logs de infraestrutura têm acesso restrito. Evite views que contornem RLS e documente funções SECURITY DEFINER com search_path fixo, grants mínimos e validação de identidade.

Crie buckets privados para avatares e anexos de referência, com policies que verificam tenant no caminho. Valide extensão, MIME real, tamanho e URLs assinadas curtas. Não baixe automaticamente todos os vídeos.

Bootstrap admin usa a API de administração de identidade em script separado, com ADMIN_EMAIL/ADMIN_INITIAL_PASSWORD vindos de env. Nunca grave senha em SQL ou em seed; nunca promova por comparação de e-mail durante o login. Não sobrescreva a senha de admin existente; script deve ser idempotente e abortar conflitos ambíguos. Remova a senha de bootstrap do ambiente após provisionamento.

Entregue migrations, seed, documentação do modelo e teste de isolamento A/B, inclusive inserts com relações cruzadas, views, RPCs e storage. Demonstre aplicação em banco limpo e reexecução segura dos seeds. Migração remota só por comando de provisionamento, nunca automaticamente em requisição ou build.
03Etapa de implementação

Autenticação perfil e autorização

Prompt pronto para copiar
Implemente Supabase Auth com clientes server/browser separados e fluxo SSR conforme documentação atual. Verifique identidade no servidor usando mecanismo recomendado; não confie apenas em sessão ou JWT fornecido pelo navegador sem validação.

Telas: /entrar, /cadastrar, /esqueci-senha, /redefinir-senha, /confirmar-email e callback de autenticação. Logout é ação real que encerra a sessão e invalida UI/cache sensível, não precisa ser uma página vazia. Redirecionamentos aceitam somente destinos internos seguros. Proteja páginas, Server Actions e Route Handlers; esconder botões não autoriza ações.

Cadastro exige nome, e-mail, senha, confirmação e aceite da versão publicada dos termos. Confirmação de e-mail em produção. Evite enumeração de contas em login e recuperação. Aplique rate limit e mensagens pt-BR. Implemente estados de link inválido/expirado, sessão vencida, usuário suspenso e integração indisponível.

/app/perfil permite editar nome, avatar, fuso, tema, e-mail e senha por fluxos seguros de identidade. Alterações sensíveis e exclusão exigem reautenticação apropriada. A mudança de e-mail mantém verificações do provedor.

Papéis vêm de fonte controlada no servidor. Usuário não altera plano, suspensão ou papel por metadata. Administrador gerencia planos e usuários, mas não recebe leitura automática de chaves ou anotações privadas. Logs administrativos registram ação, autor e alvo sem segredos.

Implemente exportação dos próprios dados e solicitação/exclusão da conta com cancelamento dos jobs, revogação da chave, limpeza dos objetos e processo retomável. Documente retenção técnica e de backups sem prometer exclusão imediata em cópias de segurança.

Execute testes de autorização com A/B, sessão ausente, expirada e conta suspensa. Não invente contas reais de teste nem hardcode credenciais.
04Etapa de implementação

Interface completa em Português Brasil

Prompt pronto para copiar
Implemente identidade visual consistente usando shadcn/ui e Tailwind. Produto provisório Painel de Referências. Nome e cor principal vêm do ambiente. Layout responsivo com sidebar no desktop e navegação em drawer no mobile, cabeçalho com busca e menu do usuário, tema claro/escuro/sistema persistido e sem flash evitável.

Páginas públicas: landing page, planos, entrar, cadastrar, recuperação, termos de uso, política de privacidade e contato/suporte. Políticas são textos preliminares com dados reais do operador a preencher e revisão pendente; não invente CNPJ, endereço ou garantia jurídica. Não publique rotas com placeholders como políticas definitivas.

Área autenticada: Dashboard, Perfis de referência, Detalhe do perfil, Biblioteca de vídeos, Detalhe do vídeo, Coleções, Favoritos, Métricas, Sincronizações, Integrações, Meu plano, Perfil e Configurações. Admin: visão operacional, usuários, planos, atribuições e auditoria.

Modais/drawers: adicionar perfil, editar perfil interno, remover perfil, cadastrar/substituir chave, confirmar cancelamento da coleta, criar coleção, adicionar anotação, editar tags e confirmar exclusão. Não retornar a chave salva a um formulário.

Dashboard mostra perfis cadastrados, vídeos importados, favoritos, jobs em execução e top vídeos com filtros de período/perfil. Biblioteca oferece cards e tabela, paginação server-side, busca, filtros e ordenação. Card: capa, autor, data, visualizações/curtidas/comentários disponíveis, índice de destaque, favorito, origem e data da coleta. Detalhe: abrir original, preview quando disponível, métricas, histórico, notas, tags e coleções.

Mostre esqueletos, empty states orientando a primeira ação, falhas acionáveis e indisponibilidade. Sem métricas simuladas em produção. Não trate vídeos importados como vídeos criados ou contas de referência como contas Instagram conectadas via OAuth. Anotações são pessoais e não são enviadas à rede social.

Formate datas conforme fuso do usuário e números pt-BR. Use labels explícitos, foco visível, teclado, contraste, diálogo acessível, confirmação para ação destrutiva e leitores de tela. Trunque texto só com forma de acessar conteúdo completo. Verifique mobile e desktop em ambos os temas, especialmente overlays, tabelas e sidebar.
05Etapa de implementação

Credenciais e integração ScrapeCreators

Prompt pronto para copiar
Implemente integração real server-side com ScrapeCreators. Consulte novamente https://docs.scrapecreators.com/llms.txt e documentação específica antes de fixar contratos; registre endpoint, campos usados e data de consulta em docs/INTEGRACOES.md. Use https://api.scrapecreators.com como base validada e header x-api-key. Nunca faça chamada autenticada diretamente pelo navegador.

Rotas upstream iniciais documentadas: GET /v1/instagram/profile para resolver perfil público, GET /v1/instagram/user/reels para Reels paginados usando handle ou user_id, e max_id retornado em paging_info para continuação. GET /v1/instagram/post para detalhes/legenda quando solicitado. Confirme parâmetros exatos dessa última rota antes de implementar. Defina um formato normalizado próprio, independente de trim e do JSON original.

Na documentação consultada, Reels pode omitir legenda e vídeos fixados, e visualizações são do Instagram, podendo divergir do total combinado Instagram/Facebook. Registre essas limitações na UI. Não prometa a lista completa dos 500 vídeos mais recentes se a API não garantir cobertura e ordenação. Colete até 500 disponíveis e apresente em ordem de publicação quando a data existir, mantendo a indicação de incompletude. Não filtre por legenda inexistente como se tivesse pesquisado todos os vídeos.

Credenciais: POST para salvar/validar/substituir e DELETE para remover. Validação usa endpoint documentado de saldo ou outra operação mínima confirmada; informe se a validação consumir crédito. Persistência só após validação ou com status pendente explícito. Retorne status, máscara e datas; nunca plaintext.

Criptografe com AES-256-GCM no servidor, nonce novo por escrita, chave base64 de 32 bytes via API_CREDENTIALS_ENCRYPTION_KEY e versão via API_CREDENTIALS_KEY_VERSION. Associe user_id/provider como AAD; nunca reutilize nonce. Implemente política documentada de rotação e ferramenta de recriptografia com keyring temporário seguro. Não derivar chave de senha admin, token Supabase ou senha de usuário. Os testes devem verificar adulteração e isolamento entre tenants.

Valide URL de perfil Instagram, aceite handle e URL, remova querystring e normalize. Não busque URLs arbitrárias fornecidas pelo usuário. Construa URLs upstream a partir de base permitida; bloqueie host interno, protocolos alternativos e redirects perigosos. Para imagens externas use política restrita de host, tamanho e tipo; nunca permita proxy aberto.

Provider trata timeout, status HTTP, success=false, JSON inválido, saldo insuficiente, chave inválida, perfil privado/inexistente, 429 e erros transitórios. Mensagens pt-BR são úteis e não incluem segredo ou corpo bruto sensível. Use timeout com AbortController, retries limitados apenas para falhas transitórias e respeite Retry-After.

Null significa desconhecido. Preserve IDs externos como string. Guarde somente dados brutos necessários, com retenção explícita, nunca headers de autenticação. Legenda/transcrição são enriquecimento sob demanda com orçamento próprio, sem 500 chamadas extras automáticas. O MVP não precisa de transcrição.

Implemente teste de contrato com fixtures sanitizadas e integração real opcional com chave autorizada. Registre requests e créditos reportados pelo provedor, distinguindo estimativas, dados confirmados e consumo desconhecido.
06Etapa de implementação

Coleta paginada com QStash e retomada

Prompt pronto para copiar
Implemente importação assíncrona confiável na Vercel. POST autenticado de sincronização cria job e outbox em uma transação e responde 202 com job_id. Não bloqueie a página aguardando toda a coleta. Credencial usada sempre pertence ao dono do perfil e deve continuar ativa antes de cada chamada.

Cada tarefa processa uma página ou lote pequeno dentro do limite da função. Payload contém apenas identificadores opacos de job/step; não contém chave API, senha ou credencial descriptografada. O worker resolve tenant e perfil pelo banco e não confia em user_id externo. Revalide plano, suspensão, cancelamento e credencial.

Verifique Upstash-Signature com SDK oficial, chaves atual/próxima, corpo bruto e URL correta. Não permita endpoint de worker sem autenticação nem bypass de assinatura em produção. Proteja callbacks de falha e endpoints de manutenção separadamente. Sem assinatura válida, nenhuma alteração no banco nem chamada upstream.

Durabilidade: PostgreSQL guarda job, etapa, cursor, contagem, leases, tentativas e checkpoint. Claim/lease é atômico, com expiração e fencing/generation para impedir commit por worker antigo. Gravação dos vídeos, snapshots, checkpoint e evento da próxima etapa ocorre em transação. Unique keys deduplicam gravações e passos.

QStash entrega ao menos uma vez; não prometa exactly-once para chamadas externas. Uma queda após chamada upstream pode repetir consumo sem mecanismo de idempotência oferecido pelo provedor. Documente essa janela e reduza-a com checkpoints, requests rastreados e leases. Locks Redis são auxiliares, não a única defesa.

Publicação da outbox é repetível e reconciliada. Implemente dispatcher protegido e rotina de recuperação acionável por scheduler compatível com o plano escolhido. Documente provisionamento. Não dependa apenas de publicar a próxima mensagem antes de retornar, pois banco e QStash não têm transação distribuída.

Critérios de parada: até 500 vídeos únicos novos/importados conforme modo, fim documentado da paginação, orçamento máximo de páginas/requests, cursor repetido, cancelamento ou erro terminal. Lote vazio com indicação de continuação tem tentativas limitadas, não encerra automaticamente sem avaliar contrato. Não faça loop infinito nem repita todas as 500 entradas em cada refresh.

Estados: na fila, executando, concluído, parcial, falhou, cancelado; separar motivo e completude. Job que atinge 500 é coleta limitada, não catálogo completo. Se chegar ao fim com 130, mostre 130. Em erro depois de 200, preserve 200 e marque parcial. Grave dados página a página e mantenha contadores de recebidos, únicos, atualizados e descartados.

Atualização incremental busca conteúdos recentes, faz upsert e para segundo política explícita de sobreposição. Atualização de métricas de vídeos antigos é tarefa separada com seleção/budget; não prometa refrescar tudo apenas porque encontrou vídeos recentes já conhecidos. Preserve notas, favoritos e coleções em qualquer sync.

Limite concorrência global e por usuário, cooldown por perfil e retries com backoff. Pelo menos uma importação ativa por perfil, com índice único parcial ou regra transacional equivalente. Cache keys incluem tenant, credencial versionada e parâmetros. Revogar credencial cancela novos trabalhos e invalida cache pertinente.

UI usa polling com backoff para progresso, sem chave privilegiada no navegador. Cancelamento é cooperativo e impede novas páginas; não promete desfazer uma requisição já enviada. “Retomar” cria etapa segura a partir do último checkpoint.

Teste entrega duplicada, callbacks inválidos, crash nas janelas críticas, cursor repetido, perfil com menos de 500, saldo insuficiente, revogação da chave, cancelamento, timeout, suspensão e falha ao publicar a outbox. Documente desenvolvimento local: worker/dispatcher local restrito ou túnel HTTPS externo autorizado para callbacks QStash, com credenciais de desenvolvimento.
07Etapa de implementação

Biblioteca notas busca e coleções

Prompt pronto para copiar
Implemente operações reais da biblioteca com consulta e paginação no servidor. Evite carregar toda a biblioteca no navegador. Toda operação usa sessão e escopo do proprietário, validado no servidor e pelas políticas do banco.

Filtros: perfis, período de publicação, período de coleta, visualizações mínimas, curtidas, comentários, tags, favoritos, coleção, existência de nota e disponibilidade de legenda. Ordenar por mais recentes, visualizações, índice de destaque e engajamento. Trate datas desconhecidas explicitamente; filtros de publicação não podem inventar a data faltante.

Busca em handle, nome, legenda disponível, tags e notas próprias, com estratégia PostgreSQL documentada e índices adequados. Mostre cobertura da busca quando legendas não foram enriquecidas. Use paginação estável com desempate por ID e parâmetros validados. Proteja busca contra consultas caras com limites e debounce.

CRUD de notas em texto seguro, favoritos, tags, coleções e associações. Escape conteúdo e impeça XSS; não renderize HTML arbitrário da API ou das anotações. Uploads opcionais usam StorageAdapter, bucket privado e limites de MIME/tamanho. Não publique comentários na rede social.

Detalhe do vídeo abre link canônico original e permite preview quando mídia disponível. URLs da mídia podem expirar; apresente fallback e atualização sob demanda com orçamento. Não baixe mídia indiscriminadamente nem transforme o sistema em mirror de vídeos.

Exports CSV e JSON de dados próprios são paginados/limitados ou assíncronos se grandes. Escape CSV contra formula injection. URLs de download são assinadas e expiram; outro usuário não consegue acessá-las. Remoção de perfil confirma consequências e preserva ou apaga notas conforme política explícita apresentada ao usuário.

Valide persistência após reload, combinações de filtros, ordenação, CRUD e isolamento A/B. Evite N+1 e limite campos da resposta.
08Etapa de implementação

Métricas e identificação de destaque

Prompt pronto para copiar
Implemente painéis sobre os dados realmente coletados. Chame o resultado de índice de destaque na amostra, não previsão garantida de viralização. Toda métrica exibe data de coleta, quantidade de vídeos elegíveis, período, perfil e cobertura.

Indicadores separados:
1. Popularidade absoluta: views Instagram disponíveis.
2. Engajamento por views = (likes + comments) / views * 100, somente com todos os campos conhecidos e views > 0. Não inclua shares/saves inexistentes.
3. Desempenho relativo do perfil = views do vídeo / mediana das views dos vídeos elegíveis do mesmo perfil e janela de publicação. Sugestão inicial: 90 dias, mínimo 10 vídeos, configuráveis. Mediana zero ou amostra insuficiente produz “Dados insuficientes”. Inclua o vídeo na amostra de forma explícita e determinística; registre fórmula/versionamento.
4. Views por seguidores = views / seguidores observados * 100, somente denominador conhecido e > 0; indique data dos seguidores e que não são necessariamente os seguidores na publicação.
5. Crescimento observado = diferença entre snapshots sucessivos. Velocidade observada = diferença / horas entre coletas válidas; não confundir views/idade do vídeo com crescimento medido. Quedas podem ser correções do provedor, não transforme em zero silenciosamente.

Classificações sugestivas por razão: >=2x destaque, >=5x muito acima da mediana, >=10x excepcional na amostra. Limiares configuráveis; nunca trate como regra científica ou promessa de desempenho. Dados faltantes e amostras fracas não geram classificação positiva.

Evite comparar formatos/plataformas incompatíveis e misturar perfis sem normalização. Para ranking agregado, defina amostra por perfil e regras explícitas. Use ranking de views e ranking relativo em painéis distintos.

Gráficos: evolução das views observadas por vídeo, melhores vídeos do período, distribuição de desempenho por perfil e volume de referências importadas. Use datas de publicação para tendências editoriais e de coleta para progresso operacional, com labels distintos. Ausência de snapshots mostra “Ainda sem histórico”, nunca série fabricada.

Implemente queries indexadas, cache segregado e invalidação ao coletar novos dados. Testes de fórmula cobrem null, zero, poucos vídeos, mediana, outliers, fuso, snapshots repetidos e quedas.
09Etapa de implementação

Planos administrador e uso

Prompt pronto para copiar
Implemente planos como entidades reais no banco, com atribuição administrativa no MVP e checkout desativado até existir gateway escolhido. A interface informa quando a ativação é manual. Não invente preço definitivo, assinatura paga, cobrança recorrente, webhook ou botão que aparenta pagamento funcional.

Seeds usam catálogo configurável por PLAN_CATALOG_JSON, sem secrets, com códigos, nomes, descrição, preço exibido opcional e recursos. Um valor vazio de preço é “Consultar”, não gratuito. Seed idempotente não sobrescreve mudanças administrativas sem flag explícita. DEFAULT_PLAN_CODE precisa existir.

Todos os planos permitem número ilimitado de perfis, conforme requisito. Limites de coleta simultânea, cooldown, orçamento de requests por job e recursos são controles operacionais descritos claramente. A chave individual paga o consumo da ScrapeCreators; a assinatura do SaaS não implica créditos incluídos.

Página Meu plano mostra plano atribuído, recursos, forma de ativação e uso conhecido. Administrador cria/edita planos, atribui plano, define datas, suspende/reactiva usuário e consulta jobs/erros/uso operacional. Toda mutação administrativa verifica role no servidor, registra auditoria e valida campos.

Administradores não veem plaintext de chave nem conteúdo privado por padrão. Mantenha visualização operacional com dados mínimos. Suspensão bloqueia ações e interrompe continuidade dos jobs, inclusive quando service role for usada no worker.

Prepare interface BillingProvider para integração futura, sem implementação fictícia. Registre futuras exigências: webhook assinado, eventos idempotentes, conciliação, valores em centavos, cancelamento e atualização server-side. Não há gateway ou cobrança real nesta entrega.

Teste atribuição, expiração quando aplicável, plano ausente, suspensão, acesso admin por usuário comum e tentativa de alterar plano diretamente pela API.
10Etapa de implementação

SMTP provisionamento storage e portabilidade

Prompt pronto para copiar
Implemente Mailer via SMTP, com configuração por env; inicialmente use Resend como servidor SMTP. Confirme host, porta, credenciais e TLS na documentação atual do provedor. Não use porta 587 com secure=true indiscriminadamente; trate TLS direto e STARTTLS corretamente. Valide remetente, domínio e templates pt-BR.

Separe mensagens transacionais da aplicação dos e-mails de autenticação Supabase. Definir SMTP_HOST no .env da Vercel não altera automaticamente Supabase Auth hospedado. Implemente script services:configure que lê env e provisiona configuração Auth via Management API autorizada, ou gere instruções exatas para o painel se a automação não for possível. O token de Management API é exclusivo de provisionamento, não do runtime. Não imprimir secrets nem gravá-los em artefatos de saída.

Inclua configuração de Site URL, allowlist de redirects de dev/produção/preview e templates de confirmação/reset. Permita confirmação explícita do destino de provisionamento para evitar confusão entre projetos. Comando deve mostrar projeto e alterações não sensíveis. Documente DNS obrigatório no provedor de e-mail: o script da aplicação não cria registros DNS sem acesso específico.

StorageAdapter usa bucket privado, paths por tenant, upload limitado e URLs assinadas. Configure buckets e policies por migração/rotina versionada conforme ferramenta suportada. Integração S3 é futura: documente migração de bytes, mapeamento de paths, reemissão de URLs e substituição das policies. Não exija S3_ACCESS_KEY_ID no caminho ativo Supabase.

CacheAdapter Upstash REST é concreto. Redis nativo requer outro adaptador e conexão segura. QueueAdapter QStash é concreto. BullMQ exige worker persistente, retries/leases, scheduler e infraestrutura próprios; REDIS_URL não transforma automaticamente o QStash em BullMQ.

Para migração de Supabase, mantenha schema de domínio em SQL PostgreSQL e documente dependências específicas: auth.users, auth.uid(), PostgREST, funções, storage e identidade. Elabore checklist de migração que inclui credenciais, sessões, permissões, IDs e políticas. Não remova RLS para fingir portabilidade.

Teste envio SMTP com destinatário autorizado e integração de autenticação quando houver credenciais. Sem acesso, declare teste pendente. Evite envio automático em build ou seed. Crie scripts seguros para verificação das capacidades sem operações destrutivas.
11Etapa de implementação

Revisão testes e preparação para produção

Prompt pronto para copiar
Revise o código implementado como produto para produção. Corrija falhas encontradas antes de declarar pronto. Não execute deploy de código inseguro apenas para obter URL.

Segurança: isolamento por usuário em API/SQL/storage/cache/exports; secrets no bundle e git; service role isolada; CSRF/origin e validação de entradas nas mutações; XSS; SSRF; redirects; uploads; rotação da chave; logs redigidos; rate limit; autorização e suspensão em workers; policies e índices. Use security headers adequados e CSP compatível com recursos realmente usados, sem abrir domínios indiscriminadamente.

Confiabilidade: jobs duráveis, recuperação de outbox, idempotência, limites, falhas upstream, cleanup, migrations reproduzíveis, bootstrap idempotente, backup e restauração documentados. Defina métricas de fila, taxa de falha e jobs travados. Health endpoint público não vaza configuração; readiness e diagnósticos detalhados são protegidos.

Validação mínima: lint/typecheck/build; testes de fórmulas e contrato; integração de RLS/ownership; testes de fila e assinaturas; fluxo E2E cadastrar/confirmar/entrar/cadastrar chave/adicionar perfil/importar/filtrar/anotar/favoritar/sair; tentativa cruzada A/B; fluxo admin. E2E pode usar fixture isolada, mas não substitui smoke test real da integração. Testes não enviam e-mail para terceiros nem consomem créditos ilimitadamente.

Desempenho: paginação, ausência de N+1, índices, payloads mínimos, cache por tenant, limite de concorrência e funções Node curtas. Faça QA visual em celular/desktop, claro/escuro e teclado. Registre resultados realmente observados.

Entregue README e docs/DEPLOY.md com etapas em ordem: criar serviços separados para dev/prod; configurar env; aplicar migrations; seeds; provisionar Auth/SMTP/buckets; bootstrap admin; configurar Vercel Development/Preview/Production; publicar; configurar callback/scheduler; executar smoke test; remover senha admin/token de provisionamento do runtime; ativar observabilidade. Preview nunca aponta por padrão para banco, fila ou chave de criptografia de produção.

Variáveis em Vercel devem ser cadastradas nas configurações do projeto ou via CLI com escopo correto, não enviadas como .env secreto no repositório. Exponha publicamente apenas variáveis allowlisted. Redeploy depois de alterações em valores embutidos no build. Não configure migrations automaticamente no build.

Inclua plano de rollback com migrations compatíveis, recuperação de dados e limites conhecidos. Não diga que free tier suporta produção em qualquer escala: confira quotas atuais escolhidas e documente requisitos de upgrade sem inventar números.

Ao concluir, entregue tabela requisito/implementação/evidência/pendência. Diferencie: código preparado, validado localmente, validado com serviços reais e publicado. Liste configuração externa pendente de forma precisa. “Pronto para produção” só quando integrações essenciais, isolamento, callbacks, SMTP e deploy real forem verificados.
Configuração

Ambientes e variáveis

Os modelos completos estão no apêndice deste manual. A IA deve criar os arquivos correspondentes na raiz do projeto e você deve preencher os valores privadamente. Desenvolvimento: .env.development.local. Produção local: .env.production.local. Na Vercel, cadastre os mesmos valores no escopo apropriado. .env.example é catálogo geral; os modelos específicos explicitam APP_ENV e URL. Não versionar os arquivos reais.

Grupo Disponibilidade Observação
APP_NAME, APP_URL, BRAND_PRIMARY_COLOR, SUPPORT_EMAIL Públicos por projeção allowlisted Ler no servidor e passar apenas campos aprovados
NEXT_PUBLIC_SUPABASE_URL e NEXT_PUBLIC_SUPABASE_ANON_KEY Navegador e servidor Credenciais públicas; segurança depende de policies corretas
SUPABASE_SERVICE_ROLE_KEY Somente servidor privilegiado Não usar no cliente nem como cliente normal de usuário
SUPABASE_ACCESS_TOKEN, PROJECT_REF, DATABASE_URL Provisionamento quando necessário Não exigidos em runtime baseado no SDK Supabase
API_CREDENTIALS_ENCRYPTION_KEY Somente servidor 32 bytes aleatórios em base64; diferente por ambiente; manter backup seguro
ADMIN_EMAIL e ADMIN_INITIAL_PASSWORD Somente bootstrap Remover senha após criação; role vem do banco, não desta comparação de e-mail
UPSTASH_REDIS_REST_* Somente servidor Cache/rate limit; nunca fonte única de estado durável
QSTASH_* Somente servidor/provisionamento Tokens e assinatura atual/próxima; callback público HTTPS autenticado
SMTP_* e MAIL_FROM_* Servidor e configuração Auth Resend via SMTP não precisa também de RESEND_API_KEY
PLAN_CATALOG_JSON Seed ou sincronização administrativa explícita Config inicial; atribuições e alterações pessoais no banco
VERCEL_TOKEN e VERCEL_PROJECT_ID/ORG_ID Automação opcional Deploy pela interface ou Git não exige token no runtime
REDIS_URL e S3_* Reservados Exigir somente quando adaptadores correspondentes estiverem implementados/ativos

Não é possível controlar todo serviço externo apenas lendo .env na aplicação: Supabase Auth, DNS de e-mail, redirects, Vercel e schedulers exigem provisionamento. O objetivo é ter o .env como fonte de configuração e scripts/instruções que apliquem as partes externas.

Nenhuma chave real foi gerada neste pacote. A IA deve criar comando de geração de chave que escreva em arquivo privado e não publique valores no chat/log. O valor vazio do template deve provocar mensagem de configuração ausente quando necessário, nunca gerar uma chave efêmera que impossibilite descriptografar depois.

Antes de publicar

Critérios finais de aceite

  • Um novo usuário confirma e-mail, entra e vê apenas seus dados.
  • Sua chave é validada, criptografada e nunca retornada após cadastro.
  • Pode adicionar múltiplos perfis públicos sem limite comercial de quantidade.
  • Importação busca até 500 Reels disponíveis, mostra progresso, preserva parciais e retoma sem duplicar registros.
  • Ranking deixa claras amostra, fórmula, atualização e limitações dos dados.
  • Notas, favoritos, tags e coleções sobrevivem a reload e sincronização.
  • Usuário A não acessa dados, storage, jobs ou cache do B; admin não lê secrets por padrão.
  • SMTP Auth funciona com o domínio e redirects corretos.
  • Planos e atribuições administrativas funcionam sem aparentar cobrança inexistente.
  • Migrations/seed/bootstrap são reproduzíveis; preview é isolado de produção.
  • Build, testes essenciais, smoke test real e QA visual têm evidências; pendências estão identificadas.
Manual de implementação

Documentação oficial consultada

Consulte novamente antes de implementar, porque endpoints e plataformas podem mudar.

Os limites e custos da API precisam ser verificados no momento da implementação; 500 vídeos não equivalem a 500 requests. Paginação, detalhes e retries influenciam o consumo.

Configuração

Apêndice modelos completos de env

Os valores numéricos são pontos de partida operacionais, não limites oficiais dos provedores. A IA deve verificar se são compatíveis com o runtime, lease, orçamento e plano selecionados. URLs seu-dominio.com são placeholders obrigatórios de substituir. VERCEL_ENV/VERCEL_URL são fornecidas pela plataforma quando disponíveis; não contêm um domínio de produção garantido nem substituem APP_URL.

Os nomes anon/service_role permitem usar as chaves legadas compatíveis. Caso adote as novas chaves publishable/secret do Supabase, a IA deve atualizar conjuntamente os nomes, os clientes e a documentação; nunca trocar silenciosamente o tipo de chave.

.env.example

Modelo de ambiente
# Modelo sem segredos. Preencher privadamente antes de executar.
# NODE_ENV é definido pelo comando Next.js; APP_ENV distingue o ambiente.
APP_ENV=development
APP_NAME="Painel de Referências"
APP_URL=http://localhost:3000
APP_LOCALE=pt-BR
APP_TIMEZONE=America/Sao_Paulo
BRAND_PRIMARY_COLOR="#FF6B00"
SUPPORT_EMAIL=

# Identificação do operador para políticas; não publicar sem preencher/revisar.
LEGAL_OPERATOR_NAME=
LEGAL_OPERATOR_DOCUMENT=
LEGAL_CONTACT_EMAIL=
LEGAL_PRIVACY_POLICY_VERSION=2026-10-07
LEGAL_TERMS_VERSION=2026-10-07

# Autenticação e SDK Supabase. URL e anon são públicas, dependem de RLS.
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
AUTH_PROVIDER=supabase
AUTH_REDIRECT_ALLOWLIST_JSON='["http://localhost:3000/auth/callback","http://localhost:3000/redefinir-senha"]'

# Exclusivamente provisionamento/migrations, não exigidos no runtime.
SUPABASE_PROJECT_REF=
SUPABASE_ACCESS_TOKEN=
DATABASE_URL=

# Exclusivamente bootstrap. Remover senha após criação do administrador.
ADMIN_EMAIL=
ADMIN_INITIAL_PASSWORD=

# Chave AES-256: 32 bytes aleatórios em base64, diferente por ambiente.
API_CREDENTIALS_ENCRYPTION_KEY=
API_CREDENTIALS_KEY_VERSION=1
# JSON versão -> chave base64, somente durante rotação/recriptografia.
API_CREDENTIALS_PREVIOUS_KEYS_JSON='{}'

# ScrapeCreators: nenhuma chave global, chave pertence a cada usuário.
CONTENT_PROVIDER=scrapecreators
SCRAPECREATORS_BASE_URL=https://api.scrapecreators.com
SCRAPECREATORS_REQUEST_TIMEOUT_MS=20000
SCRAPECREATORS_MAX_RETRIES=2
SYNC_INITIAL_TARGET_VIDEOS=500
SYNC_MAX_PAGES_PER_JOB=100
SYNC_MAX_REQUESTS_PER_JOB=120
SYNC_CONCURRENCY_PER_USER=1
SYNC_CONCURRENCY_GLOBAL=5
SYNC_PROFILE_COOLDOWN_SECONDS=300
SYNC_JOB_LEASE_SECONDS=120

# Cache e rate limits via REST, server-only.
CACHE_PROVIDER=upstash
UPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=
CACHE_KEY_PREFIX=referencias:dev
CACHE_TTL_SECONDS=300
API_RATE_LIMIT_REQUESTS=60
API_RATE_LIMIT_WINDOW_SECONDS=60
AUTH_RATE_LIMIT_REQUESTS=10
AUTH_RATE_LIMIT_WINDOW_SECONDS=60

# QStash e consumidor HTTPS; confira URL/região no console do serviço.
QUEUE_PROVIDER=qstash
QSTASH_URL=https://qstash.upstash.io
QSTASH_TOKEN=
QSTASH_CURRENT_SIGNING_KEY=
QSTASH_NEXT_SIGNING_KEY=
# Callback externo HTTPS para dev via túnel autorizado; não é localhost.
QSTASH_WORKER_URL=
QSTASH_FAILURE_CALLBACK_URL=
QSTASH_MAX_RETRIES=3
# Segredo para scheduler/dispatcher protegido; não substitui assinatura QStash.
CRON_SECRET=

# Storage: os nomes devem coincidir com buckets/policies provisionados.
STORAGE_PROVIDER=supabase
STORAGE_AVATARS_BUCKET=avatars
STORAGE_ATTACHMENTS_BUCKET=reference-assets
STORAGE_EXPORTS_BUCKET=exports
STORAGE_SIGNED_URL_TTL_SECONDS=300
UPLOAD_MAX_BYTES=5242880
UPLOAD_ALLOWED_MIME_JSON='["image/jpeg","image/png","image/webp"]'

# SMTP Resend: API key é a senha SMTP. Não duplicar em RESEND_API_KEY.
MAIL_PROVIDER=smtp
SMTP_HOST=smtp.resend.com
SMTP_PORT=465
SMTP_SECURE=true
SMTP_REQUIRE_TLS=true
SMTP_USER=resend
SMTP_PASSWORD=
MAIL_FROM_NAME="Painel de Referências"
MAIL_FROM_EMAIL=
MAIL_REPLY_TO_EMAIL=

# Planos iniciais: preço não definido; atribuição manual e perfis sem limite.
BILLING_PROVIDER=manual
DEFAULT_PLAN_CODE=inicial
PLAN_CATALOG_JSON='[{"code":"inicial","name":"Inicial","display_price":null,"features":["Perfis de referência ilimitados","Biblioteca de vídeos","Anotações e favoritos"]}]'

# Métricas: parâmetros sugestivos de ranking na amostra.
METRICS_BASELINE_WINDOW_DAYS=90
METRICS_BASELINE_MIN_VIDEOS=10
METRICS_HIGHLIGHT_RATIO=2
METRICS_HIGH_RATIO=5
METRICS_EXCEPTIONAL_RATIO=10

# Observabilidade sem headers/segredos/payloads privados em logs.
LOG_LEVEL=info
PROVIDER_RAW_DATA_RETENTION_DAYS=7
PROVIDER_USAGE_RETENTION_DAYS=90
AUDIT_LOG_RETENTION_DAYS=180

# Opcionais para automação de deploy; manter fora do runtime se não usados.
VERCEL_ORG_ID=
VERCEL_PROJECT_ID=
VERCEL_TOKEN=

# RESERVADOS: só validar quando adaptadores futuros estiverem implementados.
REDIS_URL=
S3_ENDPOINT=
S3_REGION=
S3_ACCESS_KEY_ID=
S3_SECRET_ACCESS_KEY=
S3_BUCKET=
S3_FORCE_PATH_STYLE=false

.env.development.example

Modelo de ambiente
# Modelo sem segredos. Preencher privadamente antes de executar.
# NODE_ENV é definido pelo comando Next.js; APP_ENV distingue o ambiente.
APP_ENV=development
APP_NAME="Painel de Referências"
APP_URL=http://localhost:3000
APP_LOCALE=pt-BR
APP_TIMEZONE=America/Sao_Paulo
BRAND_PRIMARY_COLOR="#FF6B00"
SUPPORT_EMAIL=

# Identificação do operador para políticas; não publicar sem preencher/revisar.
LEGAL_OPERATOR_NAME=
LEGAL_OPERATOR_DOCUMENT=
LEGAL_CONTACT_EMAIL=
LEGAL_PRIVACY_POLICY_VERSION=2026-10-07
LEGAL_TERMS_VERSION=2026-10-07

# Autenticação e SDK Supabase. URL e anon são públicas, dependem de RLS.
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
AUTH_PROVIDER=supabase
AUTH_REDIRECT_ALLOWLIST_JSON='["http://localhost:3000/auth/callback","http://localhost:3000/redefinir-senha"]'

# Exclusivamente provisionamento/migrations, não exigidos no runtime.
SUPABASE_PROJECT_REF=
SUPABASE_ACCESS_TOKEN=
DATABASE_URL=

# Exclusivamente bootstrap. Remover senha após criação do administrador.
ADMIN_EMAIL=
ADMIN_INITIAL_PASSWORD=

# Chave AES-256: 32 bytes aleatórios em base64, diferente por ambiente.
API_CREDENTIALS_ENCRYPTION_KEY=
API_CREDENTIALS_KEY_VERSION=1
# JSON versão -> chave base64, somente durante rotação/recriptografia.
API_CREDENTIALS_PREVIOUS_KEYS_JSON='{}'

# ScrapeCreators: nenhuma chave global, chave pertence a cada usuário.
CONTENT_PROVIDER=scrapecreators
SCRAPECREATORS_BASE_URL=https://api.scrapecreators.com
SCRAPECREATORS_REQUEST_TIMEOUT_MS=20000
SCRAPECREATORS_MAX_RETRIES=2
SYNC_INITIAL_TARGET_VIDEOS=500
SYNC_MAX_PAGES_PER_JOB=100
SYNC_MAX_REQUESTS_PER_JOB=120
SYNC_CONCURRENCY_PER_USER=1
SYNC_CONCURRENCY_GLOBAL=5
SYNC_PROFILE_COOLDOWN_SECONDS=300
SYNC_JOB_LEASE_SECONDS=120

# Cache e rate limits via REST, server-only.
CACHE_PROVIDER=upstash
UPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=
CACHE_KEY_PREFIX=referencias:dev
CACHE_TTL_SECONDS=300
API_RATE_LIMIT_REQUESTS=60
API_RATE_LIMIT_WINDOW_SECONDS=60
AUTH_RATE_LIMIT_REQUESTS=10
AUTH_RATE_LIMIT_WINDOW_SECONDS=60

# QStash e consumidor HTTPS; confira URL/região no console do serviço.
QUEUE_PROVIDER=qstash
QSTASH_URL=https://qstash.upstash.io
QSTASH_TOKEN=
QSTASH_CURRENT_SIGNING_KEY=
QSTASH_NEXT_SIGNING_KEY=
# Callback externo HTTPS para dev via túnel autorizado; não é localhost.
QSTASH_WORKER_URL=
QSTASH_FAILURE_CALLBACK_URL=
QSTASH_MAX_RETRIES=3
# Segredo para scheduler/dispatcher protegido; não substitui assinatura QStash.
CRON_SECRET=

# Storage: os nomes devem coincidir com buckets/policies provisionados.
STORAGE_PROVIDER=supabase
STORAGE_AVATARS_BUCKET=avatars
STORAGE_ATTACHMENTS_BUCKET=reference-assets
STORAGE_EXPORTS_BUCKET=exports
STORAGE_SIGNED_URL_TTL_SECONDS=300
UPLOAD_MAX_BYTES=5242880
UPLOAD_ALLOWED_MIME_JSON='["image/jpeg","image/png","image/webp"]'

# SMTP Resend: API key é a senha SMTP. Não duplicar em RESEND_API_KEY.
MAIL_PROVIDER=smtp
SMTP_HOST=smtp.resend.com
SMTP_PORT=465
SMTP_SECURE=true
SMTP_REQUIRE_TLS=true
SMTP_USER=resend
SMTP_PASSWORD=
MAIL_FROM_NAME="Painel de Referências"
MAIL_FROM_EMAIL=
MAIL_REPLY_TO_EMAIL=

# Planos iniciais: preço não definido; atribuição manual e perfis sem limite.
BILLING_PROVIDER=manual
DEFAULT_PLAN_CODE=inicial
PLAN_CATALOG_JSON='[{"code":"inicial","name":"Inicial","display_price":null,"features":["Perfis de referência ilimitados","Biblioteca de vídeos","Anotações e favoritos"]}]'

# Métricas: parâmetros sugestivos de ranking na amostra.
METRICS_BASELINE_WINDOW_DAYS=90
METRICS_BASELINE_MIN_VIDEOS=10
METRICS_HIGHLIGHT_RATIO=2
METRICS_HIGH_RATIO=5
METRICS_EXCEPTIONAL_RATIO=10

# Observabilidade sem headers/segredos/payloads privados em logs.
LOG_LEVEL=info
PROVIDER_RAW_DATA_RETENTION_DAYS=7
PROVIDER_USAGE_RETENTION_DAYS=90
AUDIT_LOG_RETENTION_DAYS=180

# Opcionais para automação de deploy; manter fora do runtime se não usados.
VERCEL_ORG_ID=
VERCEL_PROJECT_ID=
VERCEL_TOKEN=

# RESERVADOS: só validar quando adaptadores futuros estiverem implementados.
REDIS_URL=
S3_ENDPOINT=
S3_REGION=
S3_ACCESS_KEY_ID=
S3_SECRET_ACCESS_KEY=
S3_BUCKET=
S3_FORCE_PATH_STYLE=false

.env.production.example

Modelo de ambiente
# Modelo sem segredos. Preencher privadamente antes de executar.
# NODE_ENV é definido pelo comando Next.js; APP_ENV distingue o ambiente.
APP_ENV=production
APP_NAME="Painel de Referências"
APP_URL=https://seu-dominio.com
APP_LOCALE=pt-BR
APP_TIMEZONE=America/Sao_Paulo
BRAND_PRIMARY_COLOR="#FF6B00"
SUPPORT_EMAIL=

# Identificação do operador para políticas; não publicar sem preencher/revisar.
LEGAL_OPERATOR_NAME=
LEGAL_OPERATOR_DOCUMENT=
LEGAL_CONTACT_EMAIL=
LEGAL_PRIVACY_POLICY_VERSION=2026-10-07
LEGAL_TERMS_VERSION=2026-10-07

# Autenticação e SDK Supabase. URL e anon são públicas, dependem de RLS.
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
AUTH_PROVIDER=supabase
AUTH_REDIRECT_ALLOWLIST_JSON='["https://seu-dominio.com/auth/callback","https://seu-dominio.com/redefinir-senha"]'

# Exclusivamente provisionamento/migrations, não exigidos no runtime.
SUPABASE_PROJECT_REF=
SUPABASE_ACCESS_TOKEN=
DATABASE_URL=

# Exclusivamente bootstrap. Remover senha após criação do administrador.
ADMIN_EMAIL=
ADMIN_INITIAL_PASSWORD=

# Chave AES-256: 32 bytes aleatórios em base64, diferente por ambiente.
API_CREDENTIALS_ENCRYPTION_KEY=
API_CREDENTIALS_KEY_VERSION=1
# JSON versão -> chave base64, somente durante rotação/recriptografia.
API_CREDENTIALS_PREVIOUS_KEYS_JSON='{}'

# ScrapeCreators: nenhuma chave global, chave pertence a cada usuário.
CONTENT_PROVIDER=scrapecreators
SCRAPECREATORS_BASE_URL=https://api.scrapecreators.com
SCRAPECREATORS_REQUEST_TIMEOUT_MS=20000
SCRAPECREATORS_MAX_RETRIES=2
SYNC_INITIAL_TARGET_VIDEOS=500
SYNC_MAX_PAGES_PER_JOB=100
SYNC_MAX_REQUESTS_PER_JOB=120
SYNC_CONCURRENCY_PER_USER=1
SYNC_CONCURRENCY_GLOBAL=5
SYNC_PROFILE_COOLDOWN_SECONDS=300
SYNC_JOB_LEASE_SECONDS=120

# Cache e rate limits via REST, server-only.
CACHE_PROVIDER=upstash
UPSTASH_REDIS_REST_URL=
UPSTASH_REDIS_REST_TOKEN=
CACHE_KEY_PREFIX=referencias:prod
CACHE_TTL_SECONDS=300
API_RATE_LIMIT_REQUESTS=60
API_RATE_LIMIT_WINDOW_SECONDS=60
AUTH_RATE_LIMIT_REQUESTS=10
AUTH_RATE_LIMIT_WINDOW_SECONDS=60

# QStash e consumidor HTTPS; confira URL/região no console do serviço.
QUEUE_PROVIDER=qstash
QSTASH_URL=https://qstash.upstash.io
QSTASH_TOKEN=
QSTASH_CURRENT_SIGNING_KEY=
QSTASH_NEXT_SIGNING_KEY=
# Definir callback HTTPS do domínio real de produção.
QSTASH_WORKER_URL=https://seu-dominio.com/api/internal/jobs/scrapecreators
QSTASH_FAILURE_CALLBACK_URL=https://seu-dominio.com/api/internal/jobs/failure
QSTASH_MAX_RETRIES=3
# Segredo para scheduler/dispatcher protegido; não substitui assinatura QStash.
CRON_SECRET=

# Storage: os nomes devem coincidir com buckets/policies provisionados.
STORAGE_PROVIDER=supabase
STORAGE_AVATARS_BUCKET=avatars
STORAGE_ATTACHMENTS_BUCKET=reference-assets
STORAGE_EXPORTS_BUCKET=exports
STORAGE_SIGNED_URL_TTL_SECONDS=300
UPLOAD_MAX_BYTES=5242880
UPLOAD_ALLOWED_MIME_JSON='["image/jpeg","image/png","image/webp"]'

# SMTP Resend: API key é a senha SMTP. Não duplicar em RESEND_API_KEY.
MAIL_PROVIDER=smtp
SMTP_HOST=smtp.resend.com
SMTP_PORT=465
SMTP_SECURE=true
SMTP_REQUIRE_TLS=true
SMTP_USER=resend
SMTP_PASSWORD=
MAIL_FROM_NAME="Painel de Referências"
MAIL_FROM_EMAIL=
MAIL_REPLY_TO_EMAIL=

# Planos iniciais: preço não definido; atribuição manual e perfis sem limite.
BILLING_PROVIDER=manual
DEFAULT_PLAN_CODE=inicial
PLAN_CATALOG_JSON='[{"code":"inicial","name":"Inicial","display_price":null,"features":["Perfis de referência ilimitados","Biblioteca de vídeos","Anotações e favoritos"]}]'

# Métricas: parâmetros sugestivos de ranking na amostra.
METRICS_BASELINE_WINDOW_DAYS=90
METRICS_BASELINE_MIN_VIDEOS=10
METRICS_HIGHLIGHT_RATIO=2
METRICS_HIGH_RATIO=5
METRICS_EXCEPTIONAL_RATIO=10

# Observabilidade sem headers/segredos/payloads privados em logs.
LOG_LEVEL=info
PROVIDER_RAW_DATA_RETENTION_DAYS=7
PROVIDER_USAGE_RETENTION_DAYS=90
AUDIT_LOG_RETENTION_DAYS=180

# Opcionais para automação de deploy; manter fora do runtime se não usados.
VERCEL_ORG_ID=
VERCEL_PROJECT_ID=
VERCEL_TOKEN=

# RESERVADOS: só validar quando adaptadores futuros estiverem implementados.
REDIS_URL=
S3_ENDPOINT=
S3_REGION=
S3_ACCESS_KEY_ID=
S3_SECRET_ACCESS_KEY=
S3_BUCKET=
S3_FORCE_PATH_STYLE=false

Regras de arquivos reais

Regras do Git
.env
.env.*
!.env.example
!.env.development.example
!.env.production.example
node_modules/
.next/
coverage/

Se o repositório tiver outros arquivos de template necessários, a IA deve ajustar as exceções explicitamente. Templates contêm apenas valores públicos ou vazios. Ignore também arquivos privados criados por ferramentas de provisionamento.

Dependências entre variáveis e implementação

A IA deve implementar consumidores efetivos para os controles ativos, inclusive rate limits, retenção, cancelamento, concorrência e validade de URLs assinadas. Retenção exige rotina de limpeza, e limites globais exigem coordenação compartilhada; uma constante declarada sem enforcement não satisfaz o requisito. Se algum controle ficar para depois, registrar como reservado e não apresentá-lo na interface como proteção funcionando.

A aplicação deve escolher o env correto antes de provisionar. O env de preview precisa de APP_ENV=preview, APP_URL do preview e credenciais de serviços de teste. Produção nunca recebe senha de admin no bundle, chave pessoal do usuário, token de provisionamento ou credenciais dev por fallback.

O que este manual entrega

Especificação e prompts completos, checklist de contas, modelos de ambiente e critérios de aceite. A IA de desenvolvimento deve produzir o código, migrations SQL, seeds, scripts, testes e deploy. Este manual não equivale à implementação executada, a uma conexão com suas contas ou a uma validação real de produção.