[{"data":1,"prerenderedAt":181},["ShallowReactive",2],{"post-pt-br-rebuilding-my-portfolio-after-a-year":3,"i-simple-icons:github":159,"i-lucide:arrow-up-right":163,"i-lucide:loader":165,"translations-blog-pt-br-rebuilding-my-portfolio-after-a-year":167,"i-material-symbols:arrow-back":175,"i-lucide:languages":177,"i-lucide:hash":179},{"id":4,"title":5,"body":6,"date":148,"description":149,"draft":150,"extension":151,"machineTranslated":152,"meta":153,"navigation":152,"path":154,"seo":155,"stem":156,"translationKey":157,"__hash__":158},"blog\u002Fpt-br\u002Fblog\u002Frebuilding-my-portfolio-after-a-year.md","Reconstruindo meu portfólio depois de um ano de abandono",{"type":7,"value":8,"toc":139},"minimark",[9,13,25,28,33,48,51,54,58,61,68,82,85,89,92,99,102,105,109,120,123,127,130,133,136],[10,11,12],"p",{},"Estou com este repositório aberto agora mesmo, e o último commit antes do trabalho deste ano é de maio de 2025. A mensagem é \"ClientOnly behaving weirdly with icons\". Foi o fim de uma maratona de um dia em que migrei o site para Nuxt, esbarrei num bug de ícones, fiz o commit e depois não abri o repositório de novo por onze meses.",[10,14,15,16,20,21,24],{},"Este não é um post sobre produtividade. Não vou contar sobre o meu sistema para manter projetos pessoais vivos. Eu não tenho um. O que eu tenho é um portfólio que continuou dizendo \"Atualmente na Kognity\" meses depois de eu ter saído de lá, um ",[17,18,19],"code",{},"console.log(\"app.vue:\", colorMode)"," indo para produção e uma cor de destaque principal que era literalmente ",[17,22,23],{},"#ff0000",".",[10,26,27],{},"Não era uma escolha de design. Vermelho puro, parado na configuração do app, sem nada em volta que sugerisse que um dia eu pretendia voltar ali. Imagino que o eu do passado achou que eu ia lembrar. Não lembrei.",[29,30,32],"h2",{"id":31},"como-estava-quando-voltei","Como estava quando voltei",[10,34,35,36,39,40,43,44,47],{},"A primeira coisa que notei quando finalmente sentei com isso em abril: uma base de código que estava majoritariamente bem, mas cheia de pequenos constrangimentos. O vermelho. O ",[17,37,38],{},"console.log",". Um ",[17,41,42],{},"README2.md"," (conteúdo: a documentação boilerplate do Nuxt, copiada do template inicial e aparentemente nunca mais aberta). Um arquivo ",[17,45,46],{},"deploy.bat"," num Mac que faz deploy para Linux. Um componente de rodapé importado em lugar nenhum, sem fazer nada. Dez PRs do Dependabot abertos que eu tinha marcado como aprovados e nunca mergeei.",[10,49,50],{},"O instinto quando você vê esse tipo de coisa no seu próprio código é se sentir mal. Eu aprendi, na maior parte do tempo, a tratar isso como evidência sedimentada de prioridades passadas. O código funcionava o suficiente para manter o site no ar; consertá-lo nunca foi urgente o bastante para acontecer de fato.",[10,52,53],{},"O que eu senti de verdade: se este fosse o repositório de outra pessoa e eu estivesse fazendo code review, teria muitos comentários.",[29,55,57],{"id":56},"o-trabalho-prático","O trabalho prático",[10,59,60],{},"Migrei do Yarn 1 para o pnpm (o Yarn 1 não é mantido há anos; eu já queria fazer isso nos projetos pessoais), resolvi todos os PRs do Dependabot de uma vez e apaguei os arquivos mortos. Adicionei ESLint e Prettier, já que, de alguma forma, não havia linter nenhum. Nada empolgante. Necessário.",[10,62,63,64,67],{},"A parte mais interessante: tirar conteúdo hardcoded de dentro dos componentes Vue. Meu histórico profissional estava num arquivo ",[17,65,66],{},".vue",". Adicionar um novo emprego significava editar a marcação de um componente. Atualizar aquilo parecia mais atrito do que valia a pena, que é exatamente o motivo de ainda dizer Kognity quando voltei.",[10,69,70,71,74,75,74,78,81],{},"Movi tudo para arquivos de dados tipados: ",[17,72,73],{},"work-experiences.ts",", ",[17,76,77],{},"skills.ts",[17,79,80],{},"projects.ts",". Os componentes agora são só apresentação. Atualizar o conteúdo é só atualizar um array; não há motivo para mexer num componente.",[10,83,84],{},"Também matei as barras de porcentagem de habilidades. \"TypeScript: 90%\". Eu odeio aquilo. Os números são inventados e convidam a dois tipos de falha: ou você subestima e parece estar se protegendo, ou superestima e convida alguém a te sabatinar exatamente no limite que você alegou. Troquei por chips categóricos: Linguagens, Front-end, Back-end etc. Mais honesto, menos manipulável.",[29,86,88],{"id":87},"a-i18n-que-eu-subestimei","A i18n que eu subestimei",[10,90,91],{},"O site agora está em inglês, português e sueco. Moro na Suécia, cresci no Brasil, trabalho em inglês. Fazia sentido cobrir os três.",[10,93,94,95,98],{},"Configurar o ",[17,96,97],{},"@nuxtjs\u002Fi18n"," não foi a parte difícil. A parte difícil foi escrever as traduções de verdade. Especificamente, escrever minha experiência profissional em sueco de um jeito que não soe obviamente como se tivesse passado por um tradutor.",[10,100,101],{},"Meu sueco é funcional: consigo ter a maioria das conversas, inclusive conversas de trabalho quando surgem. Mas o registro formal é diferente do registro de conversa. Gastei mais tempo na bio profissional em sueco do que em todo o resto junto. Ainda não está perfeita.",[10,103,104],{},"O português foi mais fácil (obviamente), mas teve seus próprios casos de borda. \"Tech Lead\" no software brasileiro costuma ser só \"Tech Lead\" mesmo, como empréstimo, mas \"Senior Front-End Engineer\" vira \"Engenheiro Front-End Sênior\" e há opiniões de verdade na comunidade sobre se esse decalque está correto. Eu tenho opiniões. Fiz escolhas. Algum desenvolvedor brasileiro vai ler isso e ter uma opinião.",[29,106,108],{"id":107},"o-que-ficou-de-fora","O que ficou de fora",[10,110,111,112,119],{},"Considerei uma seção de projetos que puxasse automaticamente a atividade do GitHub. Decidi que não: dados puxados automaticamente são preguiça e as listas resultantes são ruído. A página de projetos agora tem um conjunto curado: o ",[113,114,118],"a",{"href":115,"rel":116},"https:\u002F\u002Fgithub.com\u002Farthurvasconcelos\u002Foverseer",[117],"nofollow","Overseer",", a CLI em Go que uso todo dia para as partes chatas do meu fluxo de trabalho (briefings matinais, notas de standup, identidades git, status de repositórios), seus SDKs em Python e TypeScript, a biblioteca sqlalchemy-seedling que construí para um fluxo de seeding que eu repetia entre projetos, e uma seção de legado para as duas bibliotecas de componentes Vue que publiquei em 2018 e que ainda têm alguns usuários.",[10,121,122],{},"Também considerei um redesign visual mais significativo. Deixei praticamente como estava. O fundo em gradiente escuro funciona bem. Nem tudo precisa ser repensado.",[29,124,126],{"id":125},"por-que-estou-escrevendo-isso","Por que estou escrevendo isso",[10,128,129],{},"Eu quero um blog. Não um blog de tutoriais, há tutoriais melhores do que os que eu escreveria para quase qualquer assunto. Mais como isto: relatos específicos sobre o que estou construindo de fato, o que deu errado, quais decisões eu revisitaria.",[10,131,132],{},"A reconstrução do site foi o ponto de partida natural. É meta de um jeito com o qual consigo conviver, porque também é genuinamente o que venho trabalhando, e escrever as decisões me obriga a ter opiniões sobre elas em vez de só fazer as coisas.",[10,134,135],{},"Mais posts vêm por aí. Tenho anotações sobre a construção do Overseer, algumas ideias sobre os padrões de TypeScript que uso na Platform24 e que diferem do que vejo na maioria das bases de código Vue e React, e provavelmente algumas coisas sobre Estocolmo que não têm nada a ver com código.",[10,137,138],{},"O blog está no ar. É um lugar bom o suficiente para começar.",{"title":140,"searchDepth":141,"depth":141,"links":142},"",2,[143,144,145,146,147],{"id":31,"depth":141,"text":32},{"id":56,"depth":141,"text":57},{"id":87,"depth":141,"text":88},{"id":107,"depth":141,"text":108},{"id":125,"depth":141,"text":126},"2026-05-01","A história específica e um pouco constrangedora do que acontece quando você deixa passar um ano entre commits no seu próprio portfólio.",false,"md",true,{},"\u002Fpt-br\u002Fblog\u002Frebuilding-my-portfolio-after-a-year",{"title":5,"description":149},"pt-br\u002Fblog\u002Frebuilding-my-portfolio-after-a-year","rebuilding-my-portfolio-after-a-year","VoUk_PXqh9ftvNfja2KXwzAyCWBtQwgUQ37jCKA7ujk",{"left":160,"top":160,"width":161,"height":161,"rotate":160,"vFlip":150,"hFlip":150,"body":162},0,24,"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"left":160,"top":160,"width":161,"height":161,"rotate":160,"vFlip":150,"hFlip":150,"body":164},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 7h10v10M7 17L17 7\"\u002F>",{"left":160,"top":160,"width":161,"height":161,"rotate":160,"vFlip":150,"hFlip":150,"body":166},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 2v4m4.2 1.8l2.9-2.9M18 12h4m-5.8 4.2l2.9 2.9M12 18v4m-7.1-2.9l2.9-2.9M2 12h4M4.9 4.9l2.9 2.9\"\u002F>",[168,172],{"path":169,"name":170,"to":171},"\u002Fen-gb\u002Fblog\u002Frebuilding-my-portfolio-after-a-year","English","\u002Fblog\u002Frebuilding-my-portfolio-after-a-year",{"path":173,"name":174,"to":173},"\u002Fsv\u002Fblog\u002Frebuilding-my-portfolio-after-a-year","Svenska",{"left":160,"top":160,"width":161,"height":161,"rotate":160,"vFlip":150,"hFlip":150,"body":176},"\u003Cpath fill=\"currentColor\" d=\"m7.825 13l5.6 5.6L12 20l-8-8l8-8l1.425 1.4l-5.6 5.6H20v2z\"\u002F>",{"left":160,"top":160,"width":161,"height":161,"rotate":160,"vFlip":150,"hFlip":150,"body":178},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m5 8l6 6m-7 0l6-6l2-3M2 5h12M7 2h1m14 20l-5-10l-5 10m2-4h6\"\u002F>",{"left":160,"top":160,"width":161,"height":161,"rotate":160,"vFlip":150,"hFlip":150,"body":180},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 9h16M4 15h16M10 3L8 21m8-18l-2 18\"\u002F>",1792626870792]