Em um mundo cada vez mais digital, criar um portfólio web não deveria exigir conhecimento de HTML. Essa foi a ideia central que impulsionou a criação de um ambicioso projeto.
O objetivo era desenvolver um aplicativo de produção utilizando exclusivamente os serviços da Cloudflare, como D1, R2, Queues, Durable Objects e Workers, sem depender de ferramentas externas como Supabase ou Postgres. O resultado é o clickfolio.me, uma plataforma onde você carrega um PDF do seu currículo e a Inteligência Artificial o analisa para gerar um portfólio web personalizável com uma URL pública.
Apesar da proposta simples, a arquitetura por trás dessa solução é bastante complexa e inovadora.
A Pilha Tecnológica
Antes de mergulharmos nos detalhes mais interessantes, vamos conhecer os pilares tecnológicos que sustentam o aplicativo:
- Next.js 16 (App Router) via OpenNext em Cloudflare Workers.
- D1 (Cloudflare's SQLite) com Drizzle ORM.
- R2 para armazenamento de PDFs (com bindings diretos, sem S3 SDK).
- Cloudflare Queues para análise assíncrona de IA (incluindo uma fila de mensagens mortas).
- Durable Objects com WebSocket Hibernation para atualizações de status em tempo real.
- Better Auth para autenticação via Google OAuth e e-mail/senha.
- Gemini 2.5 Flash Lite para análise de currículos, através de workers de serviço dedicados.
- Resend para envio de e-mails de redefinição de senha.
Quem acompanha o Brasil Vibe Coding pode ter visto a discussão sobre as limitações e possibilidades dos Cloudflare Workers. Este projeto enfrentou muitos dos desafios anteriores e incorporou novas funcionalidades, como autenticação, uploads de arquivos, processamento de IA e atualizações em tempo real, além de sete modelos de currículo diferentes.
O Padrão de Reivindicação: Upload Antes da Autenticação
Um dos dilemas da experiência do usuário é: como permitir que o usuário experimente a funcionalidade principal antes de se registrar? A maioria dos aplicativos exige login, o que pode desmotivar o usuário.
A solução adotada aqui, chamada de Padrão de Reivindicação (Claim Check Pattern), funciona como um guarda-volumes. Você entrega algo, recebe um bilhete e pode reivindicá-lo depois.
Passo 1: Upload Anônimo
Não é preciso ter uma conta. O usuário envia o PDF para POST /api/upload. O worker valida o arquivo (tipo de conteúdo, máximo de 5MB, verifica a assinatura PDF com %PDF- nos primeiros bytes).
Em seguida, armazena o arquivo no R2 com uma chave temporária (temp/{uuid}/{filename}) e retorna essa chave. O sistema aplica limite de requisições por IP: 10 por hora, 50 por dia, com IPs anonimizados (SHA-256) para proteger a privacidade.
Passo 2: Autenticação
O processo de autenticação é feito via Google OAuth ou e-mail/senha, utilizando o Better Auth. A chave de upload temporária é mantida em um cookie HTTP-only durante todo esse processo.
Passo 3: Reivindicação
O endpoint POST /api/resume/claim conecta o upload anônimo ao usuário autenticado. É aqui que a magia acontece.
// Fluxo de reivindicação simplificado — o código real lida com muitos mais casos de borda
const fileBytes = await R2.getAsUint8Array(</span>env.R2_BUCKET</span>,</span> tempKey);</span>
const fileHash = await computeSHA256(</span>fileBytes);</span>
// Verifica se este PDF exato já foi analisado para este usuário
const cached = await db.query(</span>...Este sistema não só melhora a experiência do usuário, permitindo testar a funcionalidade antes do compromisso de login, mas também otimiza o uso dos recursos, evitando reprocessar o mesmo arquivo.
Conclusão
A construção do clickfolio.me demonstra a capacidade dos serviços da Cloudflare em criar aplicações full-stack robustas e inovadoras, com forte uso de Inteligência Artificial. A abordagem de usar a IA para analisar currículos e o Padrão de Reivindicação para o fluxo de autenticação são exemplos claros de como a tecnologia pode simplificar processos complexos.
Continue acompanhando o Brasil Vibe Coding para mais novidades sobre IA, desenvolvimento e soluções de ponta!