Molde arquitetural completo para apps novos que precisam de login, pagamento, push, landing page, web app e APK Android a partir do mesmo codigo-fonte (Next.js + Tauri v2), deploy via Docker/Coolify e build/publicacao de APK via GitHub Actions. Extraido por engenharia reversa de 3 apps reais em producao do autor (gastos-app, memrapp, VisaLab) para que todo app novo nasca na mesma estrutura testada, sem reinventar auth dual, build estatico Tauri, multi-pagamento (Stripe + Google Play IAP + Pix) ou push multi-canal a cada projeto. Trigger em: "novo app", "app do zero", "greenfield mobile", "Next.js + Tauri", "APK do zero", "arquitetura de referencia", "auth dual web e app", "gerar APK a partir do Next.js", "template de SaaS", "monetizar app mobile", "Google Play IAP", "assinatura Stripe e Play Store", "mesma estrutura dos outros apps", "boilerplate de app", "starter kit mobile+web".
68
86%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Skill de arquitetura de referência. Não resolve um domínio de negócio — resolve a espinha dorsal técnica que todo app novo do autor precisa (auth dual, pagamento dual, push dual, build Tauri, Docker, CI/CD) para que um app novo comece na estrutura já validada em produção, em vez de reinventar essas decisões a cada projeto.
Esta skill segue GLOBAL.md, policies/execution.md, policies/handoffs.md,
policies/quality-gates.md, policies/token-efficiency.md, policies/stack-flexibility.md,
policies/tool-safety.md e policies/evals.md.
Para exemplos de código completos e comparação linha a linha entre as variantes dos 3 apps de
origem, consultar docs/skill-guides/app-reference-architecture.md apenas quando necessário —
este SKILL.md cobre o suficiente para decisões e setup inicial.
Complementa e não substitui 03-backend-api, 15-mobile-tauri, 07-deploy-docker e
25-ai-integration-architect — esta skill decide a ARQUITETURA GERAL (quais peças existem, como
se encaixam); as skills de domínio implementam cada peça em profundidade.
output: 'export')03-backend-api + 04-frontend-integration bastam02-ui-ux-design,
13-marketing-copy, 14-seo-specialist03-backend-api direto, esta skill é para a decisão de arquitetura geral, não a
implementação linha a linha de cada endpointapi/, actions/, lib/)next.config.ts + next.config.tauri.mjs,
scripts/build-tauri.js, .env.example comentado, Dockerfile + Dockerfile.android,
workflow .github/workflows/android-release.ymlAntes de decidir qualquer peça isolada, classificar o app numa das 3 famílias (ver
docs/skill-guides/app-reference-architecture.md seção "Resumo — pontos de partida" para o
detalhe de cada uma):
Se o usuário não souber, perguntar: "o app processa algo pesado por usuário (IA de imagem/vídeo, arquivo grande) ou é majoritariamente CRUD/dashboard?" — essa resposta sozinha decide worker e créditos, os dois itens de maior custo de implementação.
Decidir entre JWT custom (secret compartilhado com NextAuth) ou Supabase Auth com resolução em
cascata (Bearer token → cookie). Ver seção "1. Auth" em
docs/skill-guides/app-reference-architecture.md para o código de referência de cada variante,
CORS allowlist obrigatória para origens Tauri, e o middleware bypass seguro.
Regra não-negociável, independente da variante: uma única função central de auth chamada por toda rota de API protegida — nunca duplicar a checagem de sessão rota a rota.
Esta é a peça mais técnica e mais fácil de fazer errado. O padrão é sempre: script que faz
backup/swap de config e env, "apaga" temporariamente (renomeia, nunca deleta) tudo que não
sobrevive a output: 'export' (API routes, Server Actions, layouts com getServerSession()),
builda, e restaura tudo no finally — nunca manter dois códigos-fonte permanentemente
divergentes. Ver seção "2. Build Tauri" no guia detalhado para o script de referência completo.
Verificar SEMPRE, ao planejar uma feature nova: se ela usa Server Action, existe (ou vai existir) uma rota de API irmã que o stub client-side do build Tauri pode chamar? Decidir isso no design da feature, não depois que o build Tauri já quebrou.
Checkpoint: rodar o build Tauri de verdade (não só o build Next.js normal) antes de considerar a feature pronta — o script de swap pode ter deixado algo não-restaurado no finally de uma execução anterior interrompida. Se o build falhar, checar primeiro se o finally rodou na última execução (arquivos ainda renomeados) antes de investigar a feature nova.
Google Play Billing não é opcional se o app vende assinatura/conteúdo dentro de um APK publicado
na Play Store — é exigência de política da plataforma. Modelo de dados sempre unificado: uma
única tabela Subscription com campo platform/status cobrindo active/trialing/
grace_period/canceled/past_due/account_hold — nunca uma tabela por provider, nunca um
campo booleano solto isPremium. RTDN do Google Play é push-only sem garantia — sempre com cron
de reconciliação diário. Ver seção "3. Pagamentos" no guia para schema completo, webhook
idempotente, e quando vale sistema de créditos em vez de assinatura pura.
Web Push (VAPID) para PWA/browser, FCM (Firebase Admin SDK, credencial JSON base64 numa env var) para Android via Tauri. Função central que envia pros dois canais em paralelo, filtra por segmento, limpa tokens inválidos automaticamente. ntfy self-hosted como terceiro canal é avançado/opcional — só adicionar se o produto precisa de atualização em tempo real com o app em foreground. Ver seção "4. Push" no guia.
Dockerfile multi-stage (deps/builder/runner) pro web, Dockerfile.android separado (Ubuntu +
Node + Java 17 + Rust + Android SDK/NDK) pro build do APK — sempre dentro de container, nunca
build local em produção. GitHub Actions dispara por tag, publica via
r0adkll/upload-google-play@v1. Deploy web via Coolify observando o Git, sem workflow de deploy
customizado. Ver seção "5. Docker/CI-CD" no guia para os Dockerfiles e workflow completos.
Depois de decidida cada peça, produzir um resumo curto (não um documento longo) com: variante
escolhida por peça + 1 linha de justificativa, e entregar para 03-backend-api/
04-frontend-integration/07-deploy-docker implementarem. Esta skill não escreve a
implementação completa do zero — decide a arquitetura e aponta pros exemplos de referência.
| Peça | Opção A | Opção B | Default recomendado |
|---|---|---|---|
| Auth | JWT custom (secret compartilhado c/ NextAuth) | Supabase Auth (cascata Bearer→cookie) | A, salvo se já usa Supabase |
| ORM | Prisma | pg puro + migrations SQL | Prisma |
| Estrutura | Single Next.js app | Monorepo pnpm workspaces | Single-app, migrar só sob dor real |
| Pagamento | Stripe + Google Play IAP | + Pix (Abacate Pay/Mercado Pago) | A é o mínimo obrigatório; Pix só se público BR |
| Push | Web Push + FCM | + ntfy self-hosted (tri-canal) | A, tri-canal só se precisar tempo real |
| Cobrança | Assinatura pura (free/premium) | Sistema de créditos (ledger) | A, créditos só se custo variável por uso for alto |
| Processamento | Síncrono (rota de API normal) | Worker separado (BullMQ + Redis) | A, worker só se operação não cabe em request/response |
Detalhe completo de cada trade-off em docs/skill-guides/app-reference-architecture.md, seção
"Guia de Decisão".
Gera drift entre rotas (uma esquece de checar o Bearer, outra esquece o cookie). Sempre uma
função central (getAuthUserId/getAuthenticatedUser) chamada por toda rota protegida.
Se o script de build estático deleta arquivos (API routes, layouts) em vez de renomear pra
.bak, uma interrupção no meio do build (Ctrl+C, crash) deixa o código-fonte real quebrado
permanentemente. Sempre rename + restore no finally, nunca delete.
isPremium: boolean fica dessincronizado do status real da assinatura assim que existe
grace_period/trialing/account_hold. Sempre uma função central que resolve o plano a partir
do status + datas, lida toda vez, nunca um campo mutado em paralelo.
Todo webhook (Stripe, RTDN do Google Play) pode falhar silenciosamente em entregar um evento. Todo sistema de pagamento precisa de um cron de reconciliação que confere o estado real via API do provider e corrige divergência — sem isso, "paguei mas continuo free" é bug de produção inevitável, não hipotético.
Quando um layout/página tem uma versão real (com getServerSession()) e uma versão stub (usada
só durante o build Tauri), mudar a lógica de uma sem atualizar a outra é bug garantido e
silencioso — só aparece testando o APK. Deixar comentário cruzado nos dois arquivos apontando um
pro outro.
Essas três peças são a maior fonte de complexidade evitável. Só adicionar sob sinal concreto (ver tabela de decisão) — "pode ser que precise no futuro" não é sinal concreto.
.env.example comentado variável por variável desde o commit inicialadversarial-dev ou composição ad-hoc quando o
usuário pede um app do zero com o pacote completo (login+pagamento+push+APK)useTauriSafeSession), interceptor de
fetch, componentes de UI que respeitam isTauri()01-po-feature-spec definir features específicas de domínio, essa
skill já deveria ter decidido a espinha dorsal técnica18-repo-auditor — se o app já existe e a dúvida é "como esse repo já estruturou
isso", use o Repo Auditor primeiro para mapear o estado real antes de aplicar esta skill15-mobile-tauri (Tauri v2, build nativo) mas foca na
integração completa com auth/pagamento/push — a 15 é mais genérica (qualquer app Tauri, mesmo
sem esse pacote de monetização)10-documenter gerar o ADR correspondente se a decisão for não-óbvia
(ex: por que Supabase em vez de JWT custom neste app específico)felvieira/claude-skills-fv
90329e3
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.