Este portfólio
O site que você está vendo. Construí uma base em que cada projeto e cada case é um arquivo MDX validado por schema: o card, a página, a ficha técnica e o índice saem do arquivo, sem mexer em código.
- Papel
- Design e desenvolvimento
- Contexto
- Projeto pessoal
- Stack
- Next.js 16, React 19, TypeScript, Tailwind CSS 4, MDX, Zod, next-intl
- Time
- Solo
- Período
- 2026

01. Objetivo
Um portfólio que cresce sem mexer em código
Eu queria mostrar projetos e casos reais de trabalho com profundidade: o problema, a investigação, as decisões e o resultado. Um portfólio assim só se mantém vivo se publicar algo novo for uma tarefa de escrita, não de programação.
Por isso desenhei o site em torno do conteúdo. Cada projeto e cada case é um arquivo .mdx. Criou o arquivo, a página existe: card na listagem e na Home, ficha técnica, índice "Nesta página" e link para o próximo.
- Arquivo .mdx
- Frontmatter validado
- Página gerada no build
- Card, ficha e índice automáticos
- campo obrigatório faltando: o build falha e diz qual arquivo e qual campo
02. Conteúdo
O schema decide o que cada página pode ter
Defini os metadados com Zod, usando uniões discriminadas: o valor de um campo decide quais outros são obrigatórios. Um projeto feito para alguém exige o cliente e a stack. Um case anonimizado exige um contexto genérico e proíbe o nome da empresa: se alguém colocar, o build falha antes de o texto ir para o ar.
export const caseSchema = z.discriminatedUnion("anonimizado", [
base.extend({ anonimizado: z.literal(true), contexto: texto }).strict(),
base.extend({ anonimizado: z.literal(false), empresa: texto }).strict(),
]);
A ficha técnica mostra só os campos que existem em cada arquivo, e as categorias viram os filtros da listagem. Para destacar tecnologias no card sem poluir os filtros, criei um campo separado de etiquetas.
03. Componentes
Blocos próprios para contar um problema técnico
Texto corrido não basta para explicar uma investigação. Criei componentes que podem ser usados direto no MDX: métricas, fluxos com caminho de falha, janelas de código com abas, abas de hipóteses, cards de decisão e notas de destaque. Todos os desta página são eles.
Cada título de capítulo segue o formato "Rótulo | Título": o rótulo vai para o índice lateral e para a numeração, e o título vira uma frase que já diz a conclusão. Por segurança, o MDX aceita só atributos de texto, sem expressões JavaScript.
04. Identidade
Um visual que fala de investigação
Em vez de foto e frase de efeito, o topo da Home conta uma investigação em formato de log, linha a linha, e a seção "Quem sou eu" responde como uma API, com uma requisição e um JSON. É a forma mais direta que encontrei de mostrar como eu trabalho.
Cor
Uma cor para cada tipo de conteúdo
Âmbar sobre azul escuro na identidade e nos projetos, verde azulado nos cases. Quem navega sabe onde está sem ler o título.
Tema
Claro e escuro desde o início
Todas as cores são tokens, definidos uma vez para cada tema.
Tipografia
Manrope e IBM Plex Mono
Uma fonte para leitura e uma monoespaçada para tudo que é código, log ou dado técnico.
Cases
Relatos de trabalho sem capa
Um case é uma situação real, não um produto. Os cards mostram as tecnologias envolvidas no lugar de uma imagem.
05. Decisões
Simples de manter, pronto para crescer
Desempenho
Páginas estáticas
Todas as páginas são geradas no build. Um endereço que não corresponde a um arquivo responde 404, sem consulta nenhuma.
Idioma
Pronto para o inglês
Nenhum texto fica fixo nos componentes: a interface lê de um arquivo de mensagens e o conteúdo de uma pasta por idioma. O inglês entra como uma pasta e um arquivo novos.
Contato
Um schema para o cliente e o servidor
O formulário valida no navegador e de novo numa Server Action, com o mesmo schema. Um campo escondido barra robôs sem captcha, e o envio sai pelo Resend.
Imagens
A versão certa para cada lugar
A mesma capa aparece no card e no topo da página com larguras diferentes. Cada lugar informa a sua largura, e o navegador baixa só a resolução necessária.
06. Resultado
Publicar um projeto é escrever um arquivo
- linhas de código para publicar um projeto ou case
- 0
- componentes próprios para os capítulos
- 6
- temas, claro e escuro
- 2
Os cases deste site foram publicados assim: rascunho, revisão e um arquivo novo na pasta. O mesmo vale para este projeto.