24 de agosto de 2026
Como construí este site
Este site — o mesmo que você está lendo agora — nasceu como um exercício: dava pra construir um portfólio completo, com painel administrativo e banco de dados de verdade, sem gastar nada? A resposta foi sim, com uma ressalva interessante no meio do caminho.
A stack
Next.js (App Router) porque é o framework de primeira classe da Vercel — SSR, Server Actions e rotas de API funcionam direto no plano Hobby, sem configuração extra. Tailwind CSS pros estilos. Supabase pro banco: Postgres com Row Level Security, autenticação por magic link e storage de arquivos, tudo no plano gratuito.
A área de Aplicações que você vê no menu é o motivo de o Supabase existir aqui: os projetos ficam numa tabela projects, lidos direto pela página — cadastrar um projeto novo não exige um deploy novo, só uma linha a mais no banco.
O problema que eu não esperava
O plano gratuito do Supabase pausa um projeto depois de 7 dias sem requisições. Faz sentido do ponto de vista deles — é um jeito de reciclar recursos compartilhados que ninguém está usando de verdade. Mas para um site pessoal com tráfego baixo, isso significa que o banco podia simplesmente dormir.
A solução acabou sendo simples: um Vercel Cron Job chama uma rota protegida uma vez por dia, que grava um registro de "heartbeat" no banco. É tráfego real — uma escrita de verdade — não uma simulação para enganar o limite.
export async function GET(request: Request) {
const auth = request.headers.get('authorization')
if (auth !== `Bearer ${process.env.CRON_SECRET}`) {
return new NextResponse('Unauthorized', { status: 401 })
}
const supabase = createAdminClient()
await supabase.from('heartbeat').upsert({ id: 1, pinged_at: new Date().toISOString() })
return NextResponse.json({ ok: true })
}
O plano Hobby da Vercel só permite cron jobs com cadência mínima de uma vez por dia — o que, coincidentemente, é exatamente o suficiente para nunca deixar passar os 7 dias.
O que mais está aqui embaixo
RLS restringe quem escreve em cada tabela: qualquer pessoa lê os projetos publicados, só o e-mail cadastrado como admin consegue criar, editar ou apagar. O formulário de contato grava direto numa tabela messages, sem intermediário. E agora, testes automatizados (Vitest para lógica, Playwright para os fluxos ponta a ponta) garantem que uma mudança futura não quebra o que já funciona.
Nada aqui custa um centavo por mês — o objetivo, desde o início, era menos sobre o produto final e mais sobre aprender construindo algo real.