05 · Dados reais com Supabase
Até aqui o app rodou em modo mock, com dados de exemplo em memória. Agora você segue o modelo BYOS — traga o seu próprio Supabase: conecta um projeto Supabase seu, provisiona nele a mesma forma de schema que a plataforma usa (a biblioteca core + os módulos de plugin + os seus incubator) com fayz db apply, e vira a chave para dados reais e persistentes.
No dashboard do Supabase, crie um projeto novo (o plano gratuito basta). Ele é o seu banco — o fayz db apply só escreve a forma-alvo nele. Você vai precisar de quatro valores dele:
- Project URL e anon key — em Project Settings → API. Ficam no navegador (públicos).
- Project ref — em Project Settings → General. É o identificador do projeto.
- Personal access token (PAT) — em Account → Access Tokens. É um segredo de máquina; nunca vai para o navegador nem para o Git.
O scaffold traz um .env.example. Copie para .env.local (que já está no .gitignore) e preencha:
cp .env.example .env.local
# Runtime (vão para o navegador — só valores públicos) VITE_SUPABASE_URL=https://SEU-REF.supabase.co VITE_SUPABASE_ANON_KEY=sua-anon-key # Tooling (usados pelo `fayz db apply` — NÃO vão para o navegador) SUPABASE_PROJECT_REF=seu-project-ref SUPABASE_PAT=seu-personal-access-token
Antes de tocar no banco, veja o plano. O --dry-run não faz nenhuma chamada de rede e não lê o seu PAT — é seguro rodar sempre:
npx @fayz-ai/cli db apply --dry-run
Saída real em um app recém-criado:
▸ Migration plan for minha-loja
1. [spine ] @fayz-ai/db — no files
Notes:
⚠ installed @fayz-ai/db ships no migrations/ — the spine step is empty (upgrade to @fayz-ai/db >= 0.1.3 once published)
⚠ plugin 'dashboard': @fayz-ai/plugin-dashboard ships no src/migrations — skipped
Summary: 1 step(s), 0 sql file(s). (dry-run — nothing was applied)
A ordem do plano é sempre a mesma: o core primeiro, depois as migrations versionadas de cada plugin, e por fim os seus incubator. Na saída do CLI atual isso aparece com os rótulos spine → drizzle → seed → plugins → incubator (os três primeiros são o core — o rótulo migra para core na wave de industry pools). Cada passo só entra se o pacote correspondente trouxer arquivos SQL. Com as versões atuais dos pacotes o plano ainda é enxuto; conforme os plugins passam a trazer migrations, novos passos aparecem aqui.
Quando o plano estiver como você quer, aplique. Este é o comando que roda com as suas credenciais (o SUPABASE_PROJECT_REF e o SUPABASE_PAT do .env.local) e escreve no banco via Supabase Management API:
npx @fayz-ai/cli db apply
Ele pede confirmação antes de aplicar (use --yes para pular o prompt em CI). Sem as duas variáveis definidas, ele para com um erro claro — de propósito, para nunca aplicar contra o projeto errado.
Com o esquema no lugar, troque o backend no app.manifest.json de mock para supabase e informe o ref:
{
"backend": {
"provider": "supabase",
"projectRef": "seu-project-ref"
}
}
E valide tudo com o doctor:
npx @fayz-ai/cli doctor
✓ Você deve ver: no dry-run, a linha Summary: N step(s) ... (dry-run — nothing was applied). Depois do db apply real, a confirmação de que a migração foi aplicada. E o doctor com 0 error(s) após virar o provider para supabase.
O modelo de dados tem três camadas — a biblioteca core (as tabelas-base compartilhadas), as tabelas plg_ que cada plugin instala, e as tabelas do seu app — todas isoladas por tenant_id com RLS. Você não precisa dominar isso agora; o fayz db apply monta a ordem correta no seu próprio Supabase. Para o mapa completo, veja Modelo de dados e RLS e multi-tenant.
← Anterior: 04 · Adicionar um plugin · Próximo: 06 · Seu próprio plugin →