[{"data":1,"prerenderedAt":181},["ShallowReactive",2],{"i-simple-icons:github":3,"i-lucide:arrow-up-right":8,"i-lucide:loader":10,"post-pt-br-rebuilding-my-portfolio-after-a-year":12,"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},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\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":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 7h10v10M7 17L17 7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\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>",{"id":13,"title":14,"body":15,"date":157,"description":158,"draft":6,"extension":159,"machineTranslated":160,"meta":161,"navigation":160,"path":162,"seo":163,"stem":164,"translationKey":165,"__hash__":166},"blog\u002Fpt-br\u002Fblog\u002Frebuilding-my-portfolio-after-a-year.md","Reconstruindo meu portfólio depois de um ano de abandono",{"type":16,"value":17,"toc":148},"minimark",[18,22,34,37,42,57,60,63,67,70,77,91,94,98,101,108,111,114,118,129,132,136,139,142,145],[19,20,21],"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.",[19,23,24,25,29,30,33],{},"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 ",[26,27,28],"code",{},"console.log(\"app.vue:\", colorMode)"," indo para produção e uma cor de destaque principal que era literalmente ",[26,31,32],{},"#ff0000",".",[19,35,36],{},"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.",[38,39,41],"h2",{"id":40},"como-estava-quando-voltei","Como estava quando voltei",[19,43,44,45,48,49,52,53,56],{},"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 ",[26,46,47],{},"console.log",". Um ",[26,50,51],{},"README2.md"," (conteúdo: a documentação boilerplate do Nuxt, copiada do template inicial e aparentemente nunca mais aberta). Um arquivo ",[26,54,55],{},"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.",[19,58,59],{},"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.",[19,61,62],{},"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.",[38,64,66],{"id":65},"o-trabalho-prático","O trabalho prático",[19,68,69],{},"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.",[19,71,72,73,76],{},"A parte mais interessante: tirar conteúdo hardcoded de dentro dos componentes Vue. Meu histórico profissional estava num arquivo ",[26,74,75],{},".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.",[19,78,79,80,83,84,83,87,90],{},"Movi tudo para arquivos de dados tipados: ",[26,81,82],{},"work-experiences.ts",", ",[26,85,86],{},"skills.ts",[26,88,89],{},"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.",[19,92,93],{},"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.",[38,95,97],{"id":96},"a-i18n-que-eu-subestimei","A i18n que eu subestimei",[19,99,100],{},"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.",[19,102,103,104,107],{},"Configurar o ",[26,105,106],{},"@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.",[19,109,110],{},"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.",[19,112,113],{},"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.",[38,115,117],{"id":116},"o-que-ficou-de-fora","O que ficou de fora",[19,119,120,121,128],{},"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 ",[122,123,127],"a",{"href":124,"rel":125},"https:\u002F\u002Fgithub.com\u002Farthurvasconcelos\u002Foverseer",[126],"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.",[19,130,131],{},"Também considerei um redesign visual mais significativo. Deixei praticamente como estava. O fundo em gradiente escuro funciona bem. Nem tudo precisa ser repensado.",[38,133,135],{"id":134},"por-que-estou-escrevendo-isso","Por que estou escrevendo isso",[19,137,138],{},"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.",[19,140,141],{},"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.",[19,143,144],{},"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.",[19,146,147],{},"O blog está no ar. É um lugar bom o suficiente para começar.",{"title":149,"searchDepth":150,"depth":150,"links":151},"",2,[152,153,154,155,156],{"id":40,"depth":150,"text":41},{"id":65,"depth":150,"text":66},{"id":96,"depth":150,"text":97},{"id":116,"depth":150,"text":117},{"id":134,"depth":150,"text":135},"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.","md",true,{},"\u002Fpt-br\u002Fblog\u002Frebuilding-my-portfolio-after-a-year",{"title":14,"description":158},"pt-br\u002Fblog\u002Frebuilding-my-portfolio-after-a-year","rebuilding-my-portfolio-after-a-year","VoUk_PXqh9ftvNfja2KXwzAyCWBtQwgUQ37jCKA7ujk",[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":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"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":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"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":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"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>",1792918925018]