// Desenvolvimento · Sistema web
lanecodes.dev — Portfólio 2.0
Meu portfólio full-stack: site bilíngue, API própria e painel administrativo.
Portfólio pessoal que desenhei e desenvolvi do zero: um site em Next.js cheio de animações interativas, uma API em NestJS com PostgreSQL e um painel em Vue 3 para editar todo o conteúdo, em português e inglês, sem tocar no código.

- cliente:
- 'Projeto pessoal',
- categoria:
- 'Sistema web',
- papel:
- 'Design, desenvolvimento full-stack, animações, infraestrutura e deploy.',
- ano:
- '2026',
- stack:
- Vue.js 3QuasarReactNext.jsTypeScriptCSS3GSAPScrollTriggerNode.jsNestJSPostgreSQLPrismaFigmaViteGitDockerAPIs RESTAutenticação JWTOpenAPI
O desafio
Criar um portfólio que fosse, ele mesmo, a prova do que eu sei fazer. Não bastava listar projetos: o site precisava mostrar design autoral, animações que contam uma história e uma arquitetura de produto real, com back-end, banco de dados e painel administrativo.
Ao mesmo tempo, tudo tinha que ser rápido, acessível, fácil de manter e legível para recrutadores do Brasil e do exterior.
A solução
- Três aplicações separadas: site público em Next.js 15 + React 19, API em NestJS 11 + Prisma + PostgreSQL e painel em Vue 3 + Quasar.
- Contrato único: schemas Zod na API geram o OpenAPI, e os dois front-ends geram seus tipos TypeScript a partir dele.
- Conteúdo 100% editável pelo painel: perfil, projetos, serviços, processo, stack, trajetória, palestras, certificados e blog.
- Site estático com atualização sob demanda: páginas geradas no build e regeneradas por revalidação por tags sempre que algo muda no painel.
- Bilíngue (PT/EN) com rotas
/en, dicionários tipados e conteúdo traduzido vindo da API. - Animações autorais com GSAP, ScrollTrigger e Lenis, cada uma com versão sem movimento.
- Currículo em PDF gerado no servidor em português e inglês, sempre com os dados atuais.
Resultados
Um portfólio no ar em lanecodes.dev que funciona como produto completo: design próprio, animações com propósito, conteúdo editável em dois idiomas, deploy automático a cada push e uma base técnica que mostra, na prática, como eu penso front-end, back-end e experiência.
Arquitetura
O sistema é dividido em três repositórios que se comunicam por uma API REST documentada.
- Site (Next.js 15, App Router, React 19): páginas geradas estaticamente (SSG/ISR), cache de 1 hora e revalidação imediata por tags (
home,projects,project:<slug>,posts) quando o painel salva algo. - API (NestJS 11): módulos por domínio, validação com Zod, autenticação com JWT (access token de 15 minutos) e refresh token em cookie
httpOnlycom rotação, senha com Argon2, limite de requisições e documentação Swagger. - Banco (PostgreSQL + Prisma 6): 20 tabelas, migrations versionadas e uma coluna
translationsem JSON para os textos em inglês. - Painel (Vue 3 + Quasar + Pinia): cadastros com reordenação, editor rico com Tiptap para o blog, upload de imagens e campos em inglês lado a lado com o português.
- Imagens convertidas para WebP com Sharp e armazenadas no Cloudflare R2.
- Formulário de contato com e-mail estilizado via Resend e opção de envio direto pelo WhatsApp.
Animações e interações
Cada seção da home tem uma animação pensada para a história que ela conta. As cenas ligadas ao scroll usam GSAP + ScrollTrigger, as entradas e loops usam CSS (@keyframes e animation-timeline: view()) e a rolagem suave é feita com Lenis.
- Preloader em terminal: digita
initializing lanecodes.dev, executa 5 etapas com spinner e ✓, barra de progresso,build successfulewelcome to my world_; uma cortina preta e vermelha revela o hero. Roda uma vez por sessão e pode ser pulado com um clique ou qualquer tecla. - Hero: linhas do título sobem em sequência, cursor piscando, globo girando e seta de scroll; tudo fica pausado enquanto o preloader roda.
- Sobre: layout editorial de revista, com manchete, capitular, colunas, retrato em duotone e um leque de certificados.
- Manifesto: seção fixa em que linhas vermelhas sobem e os textos são "escritos à mão" com máscara e traço SVG, sincronizados ao scroll (
pin). - O que eu faço: cards com cantoneiras que entram conforme aparecem na tela, só com CSS (
animation-timeline: view()). - Processo: fluxograma em serpentina; um conector vermelho em SVG é desenhado pelo scroll (
scrub) e acende cada etapa, com a decisão "Aprovado?" e os laços tracejados "ajustes" e "novo ciclo" em movimento. - 100% responsivo: uma timeline com
pinescrubdá zoom para dentro do monitor, transforma o layout de desktop em celular, recua revelando o aparelho e termina com a bateria em 1% descarregando e a tela apagando. - Projetos: no desktop, uma IDE com explorer de pastas, abas e terminal; no celular, um carrossel com
scroll-snape cards em estilo de arquivo de código. - Stack: palavras gigantes deslizando ao fundo, cards entrando em sequência e um trilho tracejado animado ligando padrões e integrações.
- Trajetória: seção fixa em que o scroll percorre a linha do tempo e preenche a barra vermelha. Ao lado, um crachá com física: cordão elástico simulado com XPBD em canvas, balanço leve quando parado, e o visitante pode puxar, soltar e virar o crachá (frente e verso com QR code).
- Agenda e blog: palestras como ingressos, faixas "entrada liberada" correndo ao fundo e o último post como pôster.
- Fireframe: a equação Fire + Frame entra pelos lados, a chama tremula e os cards se afastam no hover.
- Pontes vermelhas: cada emenda entre seções escuras tem uma elipse em gradiente cortada ao meio, metade em cada seção, formando um brilho contínuo pela página.
- Desligar animações: um botão no header e outro no preloader gravam a preferência, e um script no
<head>aplicahtml[data-motion='reduced']antes da primeira pintura. O site também respeitaprefers-reduced-motion.
Performance e acessibilidade
- Só `transform` e `opacity` nas animações, para rodar na GPU sem recalcular layout.
- GSAP centralizado:
ScrollTrigger.config({ ignoreMobileResize: true })evita recálculos quando a barra do navegador do celular aparece, e as seções fixas guardam o progresso ao redimensionar, sem "pular" de posição. - Cada cena criada em `gsap.context()` / `gsap.matchMedia()` e desfeita na desmontagem do componente.
- Imagens em WebP e AVIF com
next/imagee fontes servidas pelo próprio site. - Movimento opcional em todo o site: cada animação tem uma versão parada.
- SEO bilíngue:
canonical,hreflang(pt-BR, en, x-default), sitemap com as duas versões e Open Graph por página. - Testado em 390, 768 e 1440 px, com layouts próprios para celular onde a experiência de desktop não faria sentido.
Infraestrutura e deploy
- Vercel: site e painel, com deploy automático a cada push na
main. - Render: API NestJS com migrations aplicadas antes de cada deploy (
prisma migrate deploy) e health check. - Neon: PostgreSQL gerenciado.
- Cloudflare: domínio
lanecodes.dev, DNS e imagens no R2, servidas emmedia.lanecodes.dev. - Resend: envio dos e-mails do formulário de contato.
- GitHub Actions: formatação, checagem de tipos e build a cada push.
- Currículo em PDF gerado sob demanda com
@react-pdf/renderer, com fontes e foto embutidas para funcionar no ambiente serverless.