Instalação
# Drop-in do Supabase (recomendado pra migrar)
npm install @superdb/client
# Cliente nativo (mais recursos BR)
npm install @superdb/auth-js
@superdb/client
Drop-in do @supabase/supabase-js. Os módulos .auth, .from() e .storage funcionam — o Accept-Profile do projeto é setado automaticamente. Apenas .channel() (Realtime) ainda é stub; veja a seção Realtime abaixo.
.from() funciona. Com o SDK, o Accept-Profile do projeto vai sozinho — não precisa mandar header manual. Se quiser bater no REST cru (sem SDK), o host é https://api.superdb.com.br/<tabela> (sem /rest/v1/), com Accept-Profile: proj_<slug>.
createClient
import { createClient } from '@superdb/client'
const db = createClient(
process.env.NEXT_PUBLIC_SUPERDB_URL!, // https://auth.superdb.com.br
process.env.NEXT_PUBLIC_SUPERDB_ANON_KEY!,
{ project: 'meu-projeto' } // obrigatório — vira o Accept-Profile
)
Auth (funciona)
// Signup
await db.auth.signUp({ email, password })
// Login email/senha
await db.auth.signInWithPassword({ email, password })
// OAuth
await db.auth.signInWithOAuth({ provider: 'google' })
// Logout
await db.auth.signOut()
// Usuário atual
const { data: { user } } = await db.auth.getUser()
// Escutar mudanças de auth
db.auth.onAuthStateChange((event, session) => {
console.log(event, session)
})
Database (PostgREST)
Com o SDK, use db.from() exatamente como no supabase-js — o Accept-Profile do projeto vai sozinho:
const { data } = await db.from('tasks').select('*').eq('done', false)
await db.from('tasks').insert({ title: 'Comprar pão' })
await db.from('tasks').update({ done: true }).eq('id', taskId)
await db.from('tasks').delete().eq('id', taskId)
Sem o SDK, bata no REST cru. O host é https://api.superdb.com.br/<tabela> (path raiz, sem /rest/v1/); o tenant vai por header — Accept-Profile na leitura, Content-Profile na escrita:
const ANON_KEY = process.env.NEXT_PUBLIC_SUPERDB_ANON_KEY!
const DATA_URL = 'https://api.superdb.com.br'
// Select (leitura → Accept-Profile)
const res = await fetch(`${DATA_URL}/tasks?done=eq.false`, {
headers: { 'Authorization': `Bearer ${ANON_KEY}`, 'apikey': ANON_KEY,
'Accept-Profile': 'proj_meuapp' }
})
const data = await res.json()
// Insert (escrita → Content-Profile)
await fetch(`${DATA_URL}/tasks`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${ANON_KEY}`, 'apikey': ANON_KEY,
'Content-Type': 'application/json', 'Content-Profile': 'proj_meuapp',
'Prefer': 'return=minimal' },
body: JSON.stringify({ title: 'Comprar pão' })
})
Storage
Com o SDK, use db.storage.from('bucket') — o token de storage é mintado automaticamente:
// Upload
await db.storage.from('avatares').upload('user1.png', file)
// Download
const { data } = await db.storage.from('avatares').download('user1.png')
// URL assinada (bucket privado)
const { data: signed } = await db.storage
.from('avatares').createSignedUrl('user1.png', 3600)
Não aponte @supabase/storage-js com a anon key direto no storage.superdb.com.br — o storage-api valida HS256 e a anon key é ES256 (retorna 401). Fluxo cru: POST https://auth.superdb.com.br/st/v1/token (Bearer anon) devolve { token, url }; use esse token no storage-api.
Realtime
db.channel() ainda é stub. Para Realtime, minte um token em POST https://auth.superdb.com.br/rt/v1/token (Bearer anon) e conecte o @supabase/realtime-js com ele:
import { RealtimeClient } from '@supabase/realtime-js'
// 1) Minta o token de realtime
const res = await fetch('https://auth.superdb.com.br/rt/v1/token', {
method: 'POST',
headers: { 'Authorization': `Bearer ${ANON_KEY}`, 'apikey': ANON_KEY }
})
const { token, url } = await res.json() // url = wss://realtime.superdb.com.br/socket
// 2) Conecta com o token mintado
const rt = new RealtimeClient(url, { params: { apikey: token } })
const channel = rt.channel('tasks-changes')
.on('postgres_changes',
{ event: 'INSERT', schema: 'proj_meuapp', table: 'tasks' },
(payload) => console.log(payload.new)
)
.subscribe()
@superdb/auth-js
Cliente Auth nativo com features brasileiras: CPF, WhatsApp OTP, MFA TOTP, audit hash chain.
import { SuperDBAuth } from '@superdb/auth-js'
const auth = new SuperDBAuth({
url: process.env.SUPERDB_AUTH_URL!,
anonKey: process.env.SUPERDB_ANON_KEY!,
project: 'meu-projeto'
})
// Signup com CPF
await auth.signUp({
email: 'user@exemplo.com.br',
password: 'senha-segura',
data: { cpf: '123.456.789-09' }
})
// WhatsApp OTP
await auth.sendOTP({ phone: '+5511999998888', channel: 'whatsapp' })
// Verificar OTP
await auth.verifyOTP({ phone: '+5511999998888', token: '123456' })
// Enroll MFA TOTP
const { qrCode, secret } = await auth.mfa.enroll({ type: 'totp' })
Preview no Studio
Tudo que você faz pelo SDK aparece em tempo real no Studio. Veja seus dados, queries e logs em superdb.com.br/dash/<projeto>:
TypeScript
Ambos os SDKs são totalmente tipados:
import type { User, Session } from '@superdb/client'
import type { SuperDBUser, MFAFactor } from '@superdb/auth-js'
Dica: Use @superdb/client se você já tem código Supabase. Use @superdb/auth-js se quer aproveitar features 100% BR (CPF, WhatsApp, audit).