# 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.

{% steps %}
{% step title="Crie o seu projeto Supabase (BYOS)" %}
No [dashboard do Supabase](https://supabase.com/dashboard), 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.
{% /step %}

{% step title="Preencha o .env.local" %}
O scaffold traz um `.env.example`. Copie para `.env.local` (que já está no `.gitignore`) e preencha:

```bash
cp .env.example .env.local
```

```bash
# 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
```
{% /step %}

{% step title="Planeje a migração (dry-run)" %}
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:

```bash
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.
{% /step %}

{% step title="Aplique de verdade" %}
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:

```bash
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.
{% /step %}

{% step title="Vire a chave para o Supabase" %}
Com o esquema no lugar, troque o backend no `app.manifest.json` de `mock` para `supabase` e informe o ref:

```json
{
  "backend": {
    "provider": "supabase",
    "projectRef": "seu-project-ref"
  }
}
```

E valide tudo com o doctor:

```bash
npx @fayz-ai/cli doctor
```
{% /step %}
{% /steps %}

{% callout type="tip" %}
✓ 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`.
{% /callout %}

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](/pt-BR/docs/dados/modelo) e [RLS e multi-tenant](/pt-BR/docs/dados/rls).

---

[← Anterior: 04 · Adicionar um plugin](/pt-BR/docs/tutorial/04-adicionar-um-plugin) · [Próximo: 06 · Seu próprio plugin →](/pt-BR/docs/tutorial/06-seu-proprio-plugin)
