[{"data":1,"prerenderedAt":1489},["ShallowReactive",2],{"lastUpdated":3,"blog-pt-list":4,"blog-en-list":1488},"2025-05-26",[5,359,545,853,1204,1278,1376],{"id":6,"title":7,"body":8,"category":344,"date":345,"description":346,"extension":347,"featured":348,"meta":349,"navigation":348,"path":350,"seo":351,"stem":352,"tags":353,"__hash__":358},"blog/blog/my-bullet-journal.md","My Bullet Journal: De Cadernos Físicos ao meu Próprio App",{"type":9,"value":10,"toc":332},"minimark",[11,16,21,32,40,44,60,72,77,105,108,149,183,186,191,194,197,200,204,210,224,233,239,255,259,270,280,287,290,296,307,319,329],[12,13,15],"h1",{"id":14},"my-bullet-journal-organização-e-produtividade-com-um-toque-pessoal","My Bullet Journal: Organização e Produtividade com um Toque Pessoal",[17,18,20],"h2",{"id":19},"introdução","Introdução",[22,23,24,25],"p",{},"Uma introdução bem feita é essencial para engajar o leitor, mas vou ser sincero: ainda estou aprimorando essa habilidade. 😅\n",[26,27,28],"small",{},[29,30,31],"i",{},"brinks - eu não gosto de encheção de linguiça",[22,33,34,35,39],{},"Portanto, vamos direto ao ponto: se você já sabe o que é um Bullet Journal, pule direto para a ",[36,37,38],"strong",{},"O \"Meu Método\" de Bullet Journal",".",[17,41,43],{"id":42},"o-que-é-um-bullet-journal","O que é um Bullet Journal?",[22,45,46,47,54,55,59],{},"O Bullet Journal é um sistema de organização pessoal criado pelo designer ",[48,49,53],"a",{"href":50,"rel":51},"https://bulletjournal.com/pages/rydercarroll?srsltid=AfmBOooExbpDfg5uTPXKTmKXL-zdRhqlt3shWao5VZ2ZQHLUU9tFOJTx",[52],"nofollow","Ryder Carroll",". Ele combina, de forma brilhante (🚨",[56,57,58],"del",{},"OPINIÃO!","), elementos de um diário, planner tradicional e lista de tarefas.",[22,61,62,63,66,67,71],{},"A maior vantagem do método é ter sido projetado para ser ",[36,64,65],{},"100% flexível e adaptável"," às necessidades de quem o utiliza. Em vez de se forçar a caber nas caixas de um planner pronto, você cria o sistema que funciona para o seu cérebro. O método utiliza símbolos específicos para categorizar tarefas, eventos e notas, facilitando a visualização rápida e o acompanhamento das atividades diárias (o famoso ",[68,69,70],"em",{},"Rapid Logging",").",[73,74,76],"h3",{"id":75},"por-que-o-bullet-journal-funciona","Por que o Bullet Journal Funciona?",[78,79,80,87,93,99],"ul",{},[81,82,83,86],"li",{},[36,84,85],{},"Flexibilidade Total:"," O método é altamente personalizável. Você só cria o que realmente vai usar.",[81,88,89,92],{},[36,90,91],{},"Centralização:"," Mantém todas as suas tarefas, eventos e pensamentos em um único lugar, eliminando o caos de post-its e cadernos espalhados.",[81,94,95,98],{},[36,96,97],{},"Expressão Criativa:"," Permite que você expresse sua criatividade por meio de layouts personalizados, desenhos e trackers visuais.",[81,100,101,104],{},[36,102,103],{},"Mindfulness Intencional:"," O simples ato de escrever à mão (e revisar as tarefas) ajuda a aumentar a consciência sobre onde você gasta seu tempo, promovendo foco e presença.",[17,106,38],{"id":107},"o-meu-método-de-bullet-journal",[109,110,118,119,118,133],"div",{"className":111},[112,113,114,115,116,117],"flex","flex-col","md:flex-row","items-center","gap-6","mb-8","\n    ",[120,121],"img",{"src":122,"alt":123,"className":124},"/blog/my-bullet-journal/rules.jpeg","Regras do meu Bullet Journal",[125,126,127,128,129,130,131,132],"w-40","h-40","md:w-48","md:h-48","object-cover","object-center","rounded-xl","shrink-0",[109,134,137,138,141],{"className":135},[136],"flex-1","A ideia era adaptar o método tradicional do Bullet Journal para um formato que se encaixe melhor na minha rotina e preferências. Eu criei até regras que eu achava interessante para mim",[139,140],"br",{},[26,142,143,144,148],{},"Dica:* A melhor parte do Bullet Journal é que não existem regras fixas globais, mas é essencial criar as ",[145,146,147],"b",{},"suas"," regras e segui-las com consistência.",[78,150,151,161,171,177],{},[81,152,153,156,157,160],{},[36,154,155],{},"Cíclos de 15 Dias:"," Em vez do planejamento mensal tradicional, estabeleça uma divisão em períodos de 15 dias (quase como uma ",[68,158,159],{},"sprint"," de desenvolvimento).",[81,162,163,166,167,170],{},[36,164,165],{},"Métricas e Dashboards:"," Em cada período, crie gráficos e ",[68,168,169],{},"trackers"," personalizados para visualizar seu progresso de forma intuitiva e acompanhar seus objetivos, como a boa velha tentativa de ir à academia. 💪",[81,172,173,176],{},[36,174,175],{},"Revisão Diária:"," Não inicie o dia sem revisar o que foi planejado e o que foi realizado no dia anterior. Essa prática ajuda a manter o foco e a disciplina, além de promover uma reflexão constante sobre prioridades e hábitos.",[81,178,179,182],{},[36,180,181],{},"Todo list básico:"," Aqui, apesar de básico tinha regras específicas, como: riscar tarefas concluídas, migrar tarefas não concluídas para o próximo período e evitar a tentação de criar listas intermináveis de tarefas que nunca são concluídas.",[22,184,185],{},"Abaixo, compartilho algumas fotos do meu \"Bullet Journal\" físico na época em que eu fazia tudo no papel. Perceba que tem páginas completas e outras incompletas:",[187,188],"slide-show",{":slides":189,":timer":190},"[{\"url\":\"/blog/my-bullet-journal/init001.jpeg\"},{\"url\":\"/blog/my-bullet-journal/ini002.jpeg\"},{\"url\":\"/blog/my-bullet-journal/init003.jpeg\"},{\"url\":\"/blog/my-bullet-journal/init04.jpeg\"},{\"url\":\"/blog/my-bullet-journal/full001.jpeg\"},{\"url\":\"/blog/my-bullet-journal/full002.jpeg\"},{\"url\":\"/blog/my-bullet-journal/full003.jpeg\"},{\"url\":\"/blog/my-bullet-journal/full200.jpeg\"},{\"url\":\"/blog/my-bullet-journal/full300.jpeg\"},{\"url\":\"/blog/my-bullet-journal/happy new year.jpeg\"},{\"url\":\"/blog/my-bullet-journal/stopped.jpeg\"}]","10",[22,192,193],{},"Após escrever as regras, percebi uma coisa: estou criando um sistema \"iqual\" ao sistema que eu já uso no trabalho/dia a dia? 😂",[22,195,196],{},"Sprints, scrum e etc? Bem, parece que sim, parece que não. 🤔",[22,198,199],{},"No fim das contas, o método é uma adaptação do Bullet Journal, mas com uma pegada mais \"ágil\" e orientada a resultados. Ele me ajuda a manter o foco e a disciplina, mas também tinha um lado criativo que me motivava a continuar usando.",[17,201,203],{"id":202},"o-problema-spoiler-que-preguiça","O Problema: Spoiler... Que Preguiça!",[22,205,206,207,39],{},"Tudo parecia perfeito, certo? Lindo, organizado, gratificante. Mas havia um grande problema: ",[36,208,209],{},"manutenção",[78,211,212,218],{},[81,213,214,217],{},[36,215,216],{},"A Fricção do Setup:"," O tempo de configuração era altíssimo. Criar layouts personalizados, desenhar tabelas, alinhar tudo com a régua...Isso mesmo régua, canetinhas coloridas e tudo isso é demorado. Quando você tem uma agenda de trabalho intensa, gastar horas desenhando o planner da semana seguinte se torna insustentável.",[81,219,220,223],{},[36,221,222],{},"A Queda da Consistência:"," Por causa dessa fricção, eu começava os períodos com entusiasmo, mas abandonava o acompanhamento após algumas semanas pela simples falta de tempo de \"desenhar o sistema\".",[225,226,227],"blockquote",{},[22,228,229,232],{},[36,230,231],{},"A Realidade:"," Eu gostava muito do trabalho manual, mas a \"obrigação\" de redesenhar métricas a cada 15 dias acabou me desestimulando. O sentimento de dever cumprido ao ver o tracker preenchido não compensava mais a preguiça colossal de prepará-lo.",[22,234,235,236],{},"Isso me levou à inevitável reflexão de engenheiro de software: ",[36,237,238],{},"\"Por que não automatizar a parte chata e ficar só com a parte útil?\"",[22,240,241],{},[26,242,243,246,247,250,251,254],{},[29,244,245],{},"\"Ah, mas você podia ter comprado um planner pronto ou baixado um app qualquer (Todo list) da vida\"."," Sim, poderia. Mas eu queria a ",[36,248,249],{},"minha"," metodologia, com as ",[36,252,253],{},"minhas"," regras, sem me adaptar ao fluxo de terceiros.",[17,256,258],{"id":257},"a-solução-my-journal-app","A Solução: My Journal APP",[22,260,261,262,269],{},"Foi dessa dor e dessa preguiça que nasceu o ",[36,263,264],{},[48,265,268],{"href":266,"rel":267},"https://journal.rdpedrosa.dev/",[52],"My Journal","!",[22,271,272,273,276,277,39],{},"Trata-se de uma aplicação web inteira criada por mim, ainda em desenvolvimento ",[68,274,275],{},"(18/03/2026)",", com o único propósito de organizar minha vida pessoal e profissional de forma eficiente, sem o atrito do papel, ",[68,278,279],{},"de ter que montar a estrutura da semana toda vez",[22,281,282,283,286],{},"Ele é ",[36,284,285],{},"100% inspirado"," no método que eu utilizava no caderno. Ele força as mesmas regras (como a visualização e controle de hábitos) mas em um formato digital. Toda aquela parte de desenhar tabelas, calcular gráficos e preparar a próxima semana foi automatizada. Eu só abro, logo o que preciso e fecho.",[22,288,289],{},"O sistema está rodando no ar, hospedado diretamente no meu cluster, é um WPA, ou seja roda como um aplicativo web progressivo direto no PC, usa indexDB logo a base de dados é local.",[22,291,292,293],{},"A melhor parte? Eu decidi abrir o acesso. ",[36,294,295],{},"É gratuito e você pode usar se quiser:",[22,297,298,299,302,303],{},"👉 ",[36,300,301],{},"Acesse aqui:"," ",[48,304,306],{"href":266,"rel":305},[52],"journal.rdpedrosa.dev",[22,308,309,310,315,316],{},"E para não deixar ninguém perdido, também escrevi um ",[48,311,314],{"href":312,"rel":313},"https://journal.rdpedrosa.dev/journal-guide",[52],"Guia de Utilização"," explicando a lógica do sistema e como eu penso a rotina lá dentro. Fiquem à vontade para explorar e, claro, me enviar feedbacks ou sugestões. ",[68,317,318],{},"pode vir, mas vem com calma ok? ❤️",[22,320,321,322,325,326,328],{},"Lembrem-se: é um software \"opinativo\", feito originalmente para resolver o ",[68,323,324],{},"meu"," problema e seguir a ",[68,327,249],{}," cabeça. Pode ser que não se adapte perfeitamente à sua vida... ou pode ser exatamente a ferramenta que você estava procurando. Quem sabe, né?",[187,330],{":slides":331,":timer":190},"[{\"url\":\"/blog/my-bullet-journal/my-journal-new.png\"},{\"url\":\"/blog/my-bullet-journal/daily-review.png\"}]",{"title":333,"searchDepth":334,"depth":334,"links":335},"",2,[336,337,341,342,343],{"id":19,"depth":334,"text":20},{"id":42,"depth":334,"text":43,"children":338},[339],{"id":75,"depth":340,"text":76},3,{"id":107,"depth":334,"text":38},{"id":202,"depth":334,"text":203},{"id":257,"depth":334,"text":258},"Productivity","2026-03-18","Descubra como adaptei o método do Bullet Journal para organizar minha rotina e por que decidi transformar essa experiência em um aplicativo web gratuito.","md",true,{},"/blog/my-bullet-journal",{"title":7,"description":346},"blog/my-bullet-journal",[354,355,356,357],"Produtividade","Bullet Journal","Engenharia de Software","App","YrwGy1M_WCaAhBn5x855Ni5aVyfhQFyQvz-0apfRjBw",{"id":360,"title":361,"body":362,"category":533,"date":534,"description":535,"extension":347,"featured":348,"meta":536,"navigation":348,"path":537,"seo":538,"stem":539,"tags":540,"__hash__":544},"blog/blog/volta-a-universidade-engenharia-ia.md","De Volta à Universidade: Engenharia de IA Aplicada",{"type":9,"value":363,"toc":529},[364,367,374,409,413,416,426,429,437,441,444,507,519,526],[22,365,366],{},"Para vocês, pode ser novidade; para mim, já faz mais de um mês. Será que estou atrasado em contar?",[22,368,369,370,373],{},"A grande notícia é: ",[36,371,372],{},"Voltei à universidade!"," 🎓",[109,375,118,380,397],{"className":376},[112,113,377,378,379,116,117],"lg:flex-row","items-start","md:items-center",[120,381],{"src":382,"alt":383,"className":384},"/embaixador-pos-ia.png","Rafa Pedrosa - Embaixador Pós-Graduação IA Aplicada UNIPDS",[385,386,387,388,389,390,391,131,392,393,394,395,396],"w-full","max-w-sm","mx-auto","md:max-w-xs","md:float-right","md:ml-8","mb-6","shadow-lg","dark:shadow-none","border","border-gray-100","dark:border-gray-800",[398,399,400,401],"span",{},"\nHá mais de um ano, venho me questionando profundamente sobre minha carreira: Como elevar meu patamar como profissional? Qual é a melhor forma de apresentar minhas capacidades e maturidade técnica para o mercado? \n",[22,402,403,404,408],{},"Como mencionei em ",[48,405,407],{"href":406},"https://www.linkedin.com/feed/update/urn:li:activity:7432901732835377152/?originTrackingId=88KEM0WNmyxrrKzHPl8XNg%3D%3D","neste post",", utilizar mais as redes como o LinkedIn para mostrar projetos e a rotina do dia a dia é o caminho ideal para mostrar o \"quem eu sou\". Mas e o lado técnico? Como validar e aprofundar a base construída ao longo dos anos?\n",[17,410,412],{"id":411},"o-novo-desafio-pós-graduação","O Novo Desafio: Pós-graduação",[22,414,415],{},"Decidi buscar uma nova formação acadêmica para consolidar meus mais de 13 anos de experiência na área de tecnologia.",[22,417,418,419,422,423,39],{},"Atualmente, estou cursando a pós-graduação em ",[36,420,421],{},"Engenharia de IA Aplicada"," pela UNIPDS. Estou me dedicando ao máximo, não apenas pelo título, mas com o objetivo genuíno de contribuir com uma comunidade que vai muito além de um simples curso ",[68,424,425],{},"lato sensu",[22,427,428],{},"Durante o próximo ano, meu foco total será desenvolver habilidades práticas e aprofundadas em Inteligência Artificial. E o mais legal de tudo isso: estou participando ativamente como \"Embaixador\", apoiando outros alunos, tirando dúvidas e facilitando a rica troca de conhecimento entre nós.",[225,430,431],{},[22,432,433,436],{},[36,434,435],{},"💡 Insight:"," A decisão de voltar a estudar formalmente não substitui a experiência prática, mas fornece um alicerce sólido e estruturado para dominar tecnologias complexas como a Inteligência Artificial.",[17,438,440],{"id":439},"título-acadêmico-ou-cursos-online","Título Acadêmico ou Cursos Online?",[22,442,443],{},"Essa é uma daquelas perguntas que sempre geram polêmica. O que vale mais: um título acadêmico formal ou cinco certificados de cursos online rápidos?",[445,446,447,464],"table",{},[448,449,450],"thead",{},[451,452,453,458,461],"tr",{},[454,455,457],"th",{"align":456},"left","Critério",[454,459,460],{"align":456},"Título Acadêmico (Pós-graduação)",[454,462,463],{"align":456},"Cursos Online Curtos",[465,466,467,481,494],"tbody",{},[451,468,469,475,478],{},[470,471,472],"td",{"align":456},[36,473,474],{},"Profundidade",[470,476,477],{"align":456},"Imersão estruturada, teórica e prática aprofundada",[470,479,480],{"align":456},"Foco direto em habilidades rápidas e ferramentas específicas",[451,482,483,488,491],{},[470,484,485],{"align":456},[36,486,487],{},"Networking",[470,489,490],{"align":456},"Forte (interação contínua com professores, comunidade e embaixadores)",[470,492,493],{"align":456},"Geralmente limitado ou assíncrono",[451,495,496,501,504],{},[470,497,498],{"align":456},[36,499,500],{},"Validação",[470,502,503],{"align":456},"Reconhecimento formal e chancelado por instituições",[470,505,506],{"align":456},"Validação rápida, ideal para acompanhar tendências de curto prazo",[225,508,509],{},[22,510,511,514,515,518],{},[36,512,513],{},"⚠️ Reflexão:"," Na minha visão, ",[36,516,517],{},"ambos são válidos e essenciais",". No entanto, para aqueles que acreditam que na computação não é mais necessário se atualizar através da universidade, ou que diplomas não contam história... fica o questionamento: será mesmo verdade?",[22,520,521,522,525],{},"Quais são as suas referências técnicas hoje? Elas focam apenas em cursos rápidos ou possuem também um forte embasamento formal? Acredito que a combinação de ambos, o famoso ",[68,523,524],{},"Lifelong Learning",", seja o verdadeiro diferencial para carreiras duradouras.",[22,527,528],{},"Reflita 🤔",{"title":333,"searchDepth":334,"depth":334,"links":530},[531,532],{"id":411,"depth":334,"text":412},{"id":439,"depth":334,"text":440},"IA","2026-03-11","Por que decidi voltar à universidade após 13 anos de experiência na área de tecnologia para estudar Engenharia de Inteligência Artificial.",{},"/blog/volta-a-universidade-engenharia-ia",{"title":361,"description":535},"blog/volta-a-universidade-engenharia-ia",[541,542,543,524],"AI","Carreira","Machine Learning","rFnxF6tvp6pYmBQFctrgkOYMNXvsJALjUSnKRSkwLsI",{"id":546,"title":547,"body":548,"category":839,"date":840,"description":841,"extension":347,"featured":348,"meta":842,"navigation":348,"path":844,"seo":845,"stem":846,"tags":847,"__hash__":852},"blog/blog/nuxt4-alicerce.md","Welcome to my first blog post! And my site is finally live!",{"type":9,"value":549,"toc":831},[550,554,557,564,568,575,581,584,588,598,610,618,622,625,658,753,757,764,767,792,800,804,811,824,827],[12,551,553],{"id":552},"construindo-meu-portfólio-com-nuxt-4-e-nuxt-content","Construindo meu Portfólio com Nuxt 4 e Nuxt Content",[22,555,556],{},"Fazia muito tempo que eu não tinha um site pessoal. Se a memória não me falha, a última vez foi há anos — talvez hospedado no saudoso GitHub Pages? Era algo bem simples, servia apenas para exibir meu currículo e nada mais.",[22,558,559,560,563],{},"Recentemente, me peguei pensando: ",[68,561,562],{},"\"Por que não fazer um novo? Mas, dessa vez, algo sério?\""," Decidi voltar a estudar (fazer uma pós graduação), ganhar mais espaço no mercado, me atualizar e, claro, me expor mais ao mundo. O primeiro passo óbvio era ter um espaço meu na internet.",[17,565,567],{"id":566},"o-desafio-simplicidade-vs-funcionalidade","O Desafio: Simplicidade vs. Funcionalidade",[22,569,570,571,574],{},"A premissa era clara: o site precisava ser ",[36,572,573],{},"simples de manter",", mas eu queria que ele funcionasse como um CMS (Content Management System).",[22,576,577,578,39],{},"Fazer um do zero, construindo banco de dados, API e painel administrativo? Claro! IA na veia! Mas, cinco minutos depois, a realidade bateu: ",[68,579,580],{},"\"Espera... que trabalheira. Tem que ser simples!\"",[22,582,583],{},"A alternativa clássica seria o WordPress. Porém, eu queria usar o ecossistema e as tecnologias com as quais já trabalho no meu dia a dia como Software Engineer. Comecei então a debater com ferramentas de Inteligência Artificial (mais específicamente o Gemini) para explorar ideias de arquitetura, mas nenhuma sugestão brilhava aos olhos. Eu queria uma página inicial estilo CV vivo, um espaço para portfólio e um \"Techbrain/Blog\".",[17,585,587],{"id":586},"a-descoberta-do-nuxt-content","A Descoberta do Nuxt Content",[22,589,590,591,594,595],{},"Até que me lembrei vagamente de uma extensão ou biblioteca do ",[36,592,593],{},"Nuxt"," que havia visto no passado. Perguntei novamente para a IA sobre isso e a resposta foi imediata: ",[36,596,597],{},"Nuxt Content!",[22,599,600,601,604,605,609],{},"Entrei na documentação e vi que a ferramenta fazia ",[36,602,603],{},"exatamente"," o que eu queria: transformava arquivos Markdown (",[606,607,608],"code",{},".md",") e Frontmatter YAML em HTML altamente otimizado. Era o casamento perfeito entre a experiência de desenvolvedor (DX) que eu buscava e a simplicidade de publicação que eu precisava.",[225,611,612],{},[22,613,614,617],{},[36,615,616],{},"💡 O Pulo do Gato:"," Com o Nuxt Content v3, o site se comporta como um CMS estático completo. Zero banco de dados, zero dor de cabeça. O conteúdo é processado no tempo de build (SSG), garantindo performance nota 100 no Lighthouse.",[73,619,621],{"id":620},"o-stack-técnico-que-escolhi","O Stack Técnico que Escolhi",[22,623,624],{},"Para dar vida a essa ideia, o alicerce foi construído com as melhores ferramentas do ecossistema Vue:",[78,626,627,637,646,652],{},[81,628,629,632,633,636],{},[36,630,631],{},"Nuxt 4:"," Aproveitando a nova estrutura de pastas (",[606,634,635],{},"app/",") que separa logicamente o código da aplicação das configurações.",[81,638,639,642,643,645],{},[36,640,641],{},"Nuxt Content v3:"," O motor que lê os arquivos ",[606,644,608],{}," e os entrega tipados (Type Safety total) para os componentes Vue.",[81,647,648,651],{},[36,649,650],{},"Tailwind CSS + Typography Plugin:"," Para garantir que o HTML gerado pelo Markdown ficasse bonito, responsivo e adaptado ao Dark Mode sem esforço manual.",[81,653,654,657],{},[36,655,656],{},"Shiki:"," Syntax highlighting de alta qualidade para os blocos de código.",[659,660,664],"pre",{"className":661,"code":662,"language":663,"meta":333,"style":333},"language-typescript shiki shiki-themes github-light github-dark","// Exemplo de como o código fica bonito no post!\nconst techStack: string[] = ['Nuxt 4', 'Nuxt Content', 'Tailwind', 'Shiki'];\nconst isHappy = techStack.every(tech => tech.isAwesome);\n","typescript",[606,665,666,674,723],{"__ignoreMap":333},[398,667,670],{"class":668,"line":669},"line",1,[398,671,673],{"class":672},"sJ8bj","// Exemplo de como o código fica bonito no post!\n",[398,675,676,680,684,687,690,694,697,700,704,707,710,712,715,717,720],{"class":668,"line":334},[398,677,679],{"class":678},"szBVR","const",[398,681,683],{"class":682},"sj4cs"," techStack",[398,685,686],{"class":678},":",[398,688,689],{"class":682}," string",[398,691,693],{"class":692},"sVt8B","[] ",[398,695,696],{"class":678},"=",[398,698,699],{"class":692}," [",[398,701,703],{"class":702},"sZZnC","'Nuxt 4'",[398,705,706],{"class":692},", ",[398,708,709],{"class":702},"'Nuxt Content'",[398,711,706],{"class":692},[398,713,714],{"class":702},"'Tailwind'",[398,716,706],{"class":692},[398,718,719],{"class":702},"'Shiki'",[398,721,722],{"class":692},"];\n",[398,724,725,727,730,733,736,740,743,747,750],{"class":668,"line":340},[398,726,679],{"class":678},[398,728,729],{"class":682}," isHappy",[398,731,732],{"class":678}," =",[398,734,735],{"class":692}," techStack.",[398,737,739],{"class":738},"sScJk","every",[398,741,742],{"class":692},"(",[398,744,746],{"class":745},"s4XuR","tech",[398,748,749],{"class":678}," =>",[398,751,752],{"class":692}," tech.isAwesome);\n",[17,754,756],{"id":755},"sobre-o-desenvolvimento","Sobre o Desenvolvimento",[22,758,759,760,763],{},"A parte mais interessante dessa jornada é que ela não foi tão longa no sentido de escrever código complexo ou integrar APIs obscuras. O verdadeiro desafio foi ",[36,761,762],{},"organizar as informações",", pensar na estrutura dos dados (quais campos o Frontmatter do Markdown precisava ter) e desenhar a Arquitetura de Informação do site.",[22,765,766],{},"Hoje, meu fluxo de trabalho para publicar um novo artigo ou projeto é simplesmente maravilhoso:",[768,769,770,776,779,789],"ol",{},[81,771,772,773,775],{},"Copio e colo um template ",[606,774,608],{}," que deixei pronto.",[81,777,778],{},"Escrevo o conteúdo como se fosse um texto comum no meu editor favorito.",[81,780,781,782,785,786,39],{},"Dou um ",[606,783,784],{},"git commit"," e ",[606,787,788],{},"git push",[81,790,791],{},"O CI/CD do meu Home Lab local intercepta o push e faz o build/deploy automático.",[225,793,794],{},[22,795,796,799],{},[36,797,798],{},"⚠️ Alerta de Spoiler:"," A configuração desse meu Home Lab com GitLab CI e Node é uma história longa e que, com certeza, vai render um post dedicado no futuro!",[17,801,803],{"id":802},"conclusão","Conclusão",[22,805,806,807,810],{},"Estou extremamente satisfeito com o resultado. Construí exatamente o que eu queria, usando as ferramentas que eu adoro, e o processo de manutenção agora é fluido e indolor. Este portfólio não é apenas um site; é um ",[68,808,809],{},"living lab"," onde posso testar e mostrar um pouco de mim e do meu trabalho.",[22,812,813,814,819,820,71],{},"Espero que tenha gostado do site e da fluidez da navegação! Me dê um feedback depois. Entre em contato pelo ",[48,815,818],{"href":816,"rel":817},"https://www.linkedin.com/in/rafadpedrosa",[52],"LinkedIn"," ou me mande um email (",[48,821,823],{"href":822},"mailto:rafadpedrosa@gmail.com","rafadpedrosa@gmail.com",[22,825,826],{},"Um abraço!",[828,829,830],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":333,"searchDepth":334,"depth":334,"links":832},[833,834,837,838],{"id":566,"depth":334,"text":567},{"id":586,"depth":334,"text":587,"children":835},[836],{"id":620,"depth":340,"text":621},{"id":755,"depth":334,"text":756},{"id":802,"depth":334,"text":803},"Web Development","2026-02-25","Criando meu site \"CMS\" usando Markdown, Nuxt 4 e Tailwind CSS.",{"isOnReview":843},false,"/blog/nuxt4-alicerce",{"title":547,"description":841},"blog/nuxt4-alicerce",[593,848,849,850,851],"Vue","Frontend","Static site","CMS","7wlOgv06z28U6diu-YH2gZA_WnK_qlIzfqNKbAfxxsU",{"id":854,"title":855,"body":856,"category":1191,"date":1192,"description":1193,"extension":347,"featured":348,"meta":1194,"navigation":348,"path":1195,"seo":1196,"stem":1197,"tags":1198,"__hash__":1203},"blog/blog/assinaturas-clicksign-fastify-nuxt.md","Arquitetura de Assinaturas Digitais: Integrando Clicksign, Fastify e Nuxt",{"type":9,"value":857,"toc":1184},[858,862,865,872,876,879,896,900,968,972,975,1158,1162,1170,1178,1181],[12,859,861],{"id":860},"this-is-a-test","this is a test",[12,863,855],{"id":864},"arquitetura-de-assinaturas-digitais-integrando-clicksign-fastify-e-nuxt",[22,866,867,868,871],{},"No projeto ",[36,869,870],{},"Reserva Tamandaré",", o maior desafio técnico foi garantir a segurança e a integridade do fluxo de assinaturas de contratos de compra e venda.",[17,873,875],{"id":874},"o-desafio","O Desafio",[22,877,878],{},"Precisávamos de um fluxo assíncrono onde:",[768,880,881,884,890,893],{},[81,882,883],{},"O contrato é gerado no backend.",[81,885,886,887,39],{},"Enviado para a API da ",[36,888,889],{},"Clicksign",[81,891,892],{},"Notificado via Webhook quando assinado.",[81,894,895],{},"Refletido instantaneamente no dashboard Nuxt do cliente.",[17,897,899],{"id":898},"diagrama-lógico-da-solução","Diagrama Lógico da Solução",[445,901,902,915],{},[448,903,904],{},[451,905,906,909,912],{},[454,907,908],{"align":456},"Etapa",[454,910,911],{"align":456},"Componente",[454,913,914],{"align":456},"Ação",[465,916,917,930,943,955],{},[451,918,919,924,927],{},[470,920,921],{"align":456},[36,922,923],{},"Trigger",[470,925,926],{"align":456},"Nuxt 3 (Client)",[470,928,929],{"align":456},"Usuário confirma dados do contrato.",[451,931,932,937,940],{},[470,933,934],{"align":456},[36,935,936],{},"Processo",[470,938,939],{"align":456},"Fastify (API)",[470,941,942],{"align":456},"Gera PDF e chama a Clicksign.",[451,944,945,949,952],{},[470,946,947],{"align":456},[36,948,914],{},[470,950,951],{"align":456},"Clicksign (External)",[470,953,954],{"align":456},"Envia e-mail e gerencia assinaturas.",[451,956,957,962,965],{},[470,958,959],{"align":456},[36,960,961],{},"Feedback",[470,963,964],{"align":456},"Webhook (Node.js)",[470,966,967],{"align":456},"Recebe evento e atualiza o PostgreSQL.",[17,969,971],{"id":970},"implementação-técnica-trecho-de-código","Implementação Técnica (Trecho de Código)",[22,973,974],{},"Abaixo, um exemplo simplificado de como gerenciamos o webhook da Clicksign no Fastify:",[659,976,978],{"className":661,"code":977,"language":663,"meta":333,"style":333},"// Webhook Handler\nfastify.post('/webhooks/clicksign', async (request, reply) => {\n  const { event, document } = request.body;\n\n  if (event.name === 'sign') {\n    // Atualiza status no banco de dados\n    await db.contracts.update({\n      where: { externalId: document.key },\n      data: { status: 'SIGNED' }\n    });\n    \n    return reply.code(200).send();\n  }\n});\n",[606,979,980,985,1023,1047,1053,1071,1077,1092,1098,1110,1116,1122,1146,1152],{"__ignoreMap":333},[398,981,982],{"class":668,"line":669},[398,983,984],{"class":672},"// Webhook Handler\n",[398,986,987,990,993,995,998,1000,1003,1006,1009,1011,1014,1017,1020],{"class":668,"line":334},[398,988,989],{"class":692},"fastify.",[398,991,992],{"class":738},"post",[398,994,742],{"class":692},[398,996,997],{"class":702},"'/webhooks/clicksign'",[398,999,706],{"class":692},[398,1001,1002],{"class":678},"async",[398,1004,1005],{"class":692}," (",[398,1007,1008],{"class":745},"request",[398,1010,706],{"class":692},[398,1012,1013],{"class":745},"reply",[398,1015,1016],{"class":692},") ",[398,1018,1019],{"class":678},"=>",[398,1021,1022],{"class":692}," {\n",[398,1024,1025,1028,1031,1034,1036,1039,1042,1044],{"class":668,"line":340},[398,1026,1027],{"class":678},"  const",[398,1029,1030],{"class":692}," { ",[398,1032,1033],{"class":682},"event",[398,1035,706],{"class":692},[398,1037,1038],{"class":682},"document",[398,1040,1041],{"class":692}," } ",[398,1043,696],{"class":678},[398,1045,1046],{"class":692}," request.body;\n",[398,1048,1050],{"class":668,"line":1049},4,[398,1051,1052],{"emptyLinePlaceholder":348},"\n",[398,1054,1056,1059,1062,1065,1068],{"class":668,"line":1055},5,[398,1057,1058],{"class":678},"  if",[398,1060,1061],{"class":692}," (event.name ",[398,1063,1064],{"class":678},"===",[398,1066,1067],{"class":702}," 'sign'",[398,1069,1070],{"class":692},") {\n",[398,1072,1074],{"class":668,"line":1073},6,[398,1075,1076],{"class":672},"    // Atualiza status no banco de dados\n",[398,1078,1080,1083,1086,1089],{"class":668,"line":1079},7,[398,1081,1082],{"class":678},"    await",[398,1084,1085],{"class":692}," db.contracts.",[398,1087,1088],{"class":738},"update",[398,1090,1091],{"class":692},"({\n",[398,1093,1095],{"class":668,"line":1094},8,[398,1096,1097],{"class":692},"      where: { externalId: document.key },\n",[398,1099,1101,1104,1107],{"class":668,"line":1100},9,[398,1102,1103],{"class":692},"      data: { status: ",[398,1105,1106],{"class":702},"'SIGNED'",[398,1108,1109],{"class":692}," }\n",[398,1111,1113],{"class":668,"line":1112},10,[398,1114,1115],{"class":692},"    });\n",[398,1117,1119],{"class":668,"line":1118},11,[398,1120,1121],{"class":692},"    \n",[398,1123,1125,1128,1131,1133,1135,1138,1140,1143],{"class":668,"line":1124},12,[398,1126,1127],{"class":678},"    return",[398,1129,1130],{"class":692}," reply.",[398,1132,606],{"class":738},[398,1134,742],{"class":692},[398,1136,1137],{"class":682},"200",[398,1139,71],{"class":692},[398,1141,1142],{"class":738},"send",[398,1144,1145],{"class":692},"();\n",[398,1147,1149],{"class":668,"line":1148},13,[398,1150,1151],{"class":692},"  }\n",[398,1153,1155],{"class":668,"line":1154},14,[398,1156,1157],{"class":692},"});\n",[73,1159,1161],{"id":1160},"callouts-e-boas-práticas","Callouts e Boas Práticas",[225,1163,1164],{},[22,1165,1166,1169],{},[36,1167,1168],{},"Aviso:"," Sempre valide a assinatura (HMAC) dos webhooks recebidos para evitar ataques de injeção de dados.",[225,1171,1172],{},[22,1173,1174,1177],{},[36,1175,1176],{},"Dica:"," Utilize Redis para gerenciar o estado temporário dos documentos durante o fluxo de upload para garantir rapidez na UI.",[22,1179,1180],{},"Essa arquitetura permitiu uma redução de 40% no tempo de fechamento de contratos, provando que a integração eficiente de APIs é um diferencial de negócio.",[828,1182,1183],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":333,"searchDepth":334,"depth":334,"links":1185},[1186,1187,1188],{"id":874,"depth":334,"text":875},{"id":898,"depth":334,"text":899},{"id":970,"depth":334,"text":971,"children":1189},[1190],{"id":1160,"depth":340,"text":1161},"Architecture","2026-02-21","Um mergulho técnico na implementação do fluxo de assinaturas digitais do Loteamento Reserva Tamandaré.",{"isOnReview":348},"/blog/assinaturas-clicksign-fastify-nuxt",{"title":855,"description":1193},"blog/assinaturas-clicksign-fastify-nuxt",[1199,1200,1201,1202],"API","Integration","Node.js","Security","YQWLhfTSUwxul-VOZ4xaQi7k8gylo8WFqpIx9YWvdGU",{"id":1205,"title":1206,"body":1207,"category":1268,"date":1192,"description":1269,"extension":347,"featured":843,"meta":1270,"navigation":348,"path":1271,"seo":1272,"stem":1273,"tags":1274,"__hash__":1277},"blog/blog/rog-z13-workstation.md","Setup de Performance: ASUS ROG Z13 Flow como Workstation",{"type":9,"value":1208,"toc":1262},[1209,1211,1214,1221,1225,1228,1232,1252,1256,1259],[12,1210,861],{"id":860},[12,1212,1206],{"id":1213},"setup-de-performance-asus-rog-z13-flow-como-workstation",[22,1215,1216,1217,1220],{},"Para um Software Engineer focado em performance, o hardware é a extensão direta do cérebro. Minha escolha pelo ",[36,1218,1219],{},"ASUS ROG Z13 Flow"," reflete a busca por versatilidade e potência bruta.",[17,1222,1224],{"id":1223},"por-que-um-tablet-gamer","Por que um Tablet Gamer?",[22,1226,1227],{},"O Z13 Flow é, essencialmente, um \"Surface Pro com esteroides\". Com um processador Intel Core i9 e uma GPU dedicada, ele lida com builds pesados de Nuxt e múltiplos containers Docker sem suar.",[73,1229,1231],{"id":1230},"pontos-de-destaque","Pontos de Destaque:",[768,1233,1234,1240,1246],{},[81,1235,1236,1239],{},[36,1237,1238],{},"Portabilidade:"," Desenvolver de qualquer lugar sem sacrificar poder de processamento.",[81,1241,1242,1245],{},[36,1243,1244],{},"Resfriamento Líquido (Vapor Chamber):"," Crucial para manter o clock alto durante sessões intensas de codificação.",[81,1247,1248,1251],{},[36,1249,1250],{},"Ecrã de Alta Fidelidade:"," Essencial para refinamentos de UI com Tailwind CSS.",[17,1253,1255],{"id":1254},"o-fluxo-de-trabalho","O Fluxo de Trabalho",[22,1257,1258],{},"Utilizo o Z13 conectado a um setup de monitor ultrawide, onde ele atua como o cérebro central. A transição de \"mobile development\" para \"desktop workstation\" é instantânea, permitindo manter o fluxo criativo ininterrupto.",[22,1260,1261],{},"Este hardware é o parceiro ideal para explorar tecnologias como IA Generativa localmente e gerenciar arquiteturas complexas.",{"title":333,"searchDepth":334,"depth":334,"links":1263},[1264,1267],{"id":1223,"depth":334,"text":1224,"children":1265},[1266],{"id":1230,"depth":340,"text":1231},{"id":1254,"depth":334,"text":1255},"Hardware","Como transformei um tablet gamer em uma estação de trabalho de alto desempenho para desenvolvimento de software.",{"isOnReview":348},"/blog/rog-z13-workstation",{"title":1206,"description":1269},"blog/rog-z13-workstation",[344,1275,1268,1276],"Workstation","ROG Z13","4mF1EmF-PU-tWoNTMaqVgaJ3QioBNtuA-iesNn9wECY",{"id":1279,"title":1280,"body":1281,"category":1365,"date":1366,"description":1367,"extension":347,"featured":843,"meta":1368,"navigation":348,"path":1369,"seo":1370,"stem":1371,"tags":1372,"__hash__":1375},"blog/blog/otimizando-performance-nuxt.md","Otimizando Performance no Nuxt 3",{"type":9,"value":1282,"toc":1362},[1283,1285,1288,1291,1295,1314,1359],[12,1284,861],{"id":860},[12,1286,1280],{"id":1287},"otimizando-performance-no-nuxt-3",[22,1289,1290],{},"Alcançar performance máxima não é apenas sobre velocidade, é sobre experiência do usuário.",[17,1292,1294],{"id":1293},"dicas-rápidas","Dicas rápidas:",[768,1296,1297,1304,1307],{},[81,1298,1299,1300,1303],{},"Use ",[606,1301,1302],{},"NuxtImg"," para imagens.",[81,1305,1306],{},"Minimize o uso de bibliotecas externas pesadas.",[81,1308,1309,1310,1313],{},"Aproveite o ",[606,1311,1312],{},"Route Rules"," para cache SWR.",[659,1315,1317],{"className":661,"code":1316,"language":663,"meta":333,"style":333},"export default defineNuxtConfig({\n  routeRules: {\n    '/blog/**': { swr: 3600 }\n  }\n})\n",[606,1318,1319,1332,1337,1350,1354],{"__ignoreMap":333},[398,1320,1321,1324,1327,1330],{"class":668,"line":669},[398,1322,1323],{"class":678},"export",[398,1325,1326],{"class":678}," default",[398,1328,1329],{"class":738}," defineNuxtConfig",[398,1331,1091],{"class":692},[398,1333,1334],{"class":668,"line":334},[398,1335,1336],{"class":692},"  routeRules: {\n",[398,1338,1339,1342,1345,1348],{"class":668,"line":340},[398,1340,1341],{"class":702},"    '/blog/**'",[398,1343,1344],{"class":692},": { swr: ",[398,1346,1347],{"class":682},"3600",[398,1349,1109],{"class":692},[398,1351,1352],{"class":668,"line":1049},[398,1353,1151],{"class":692},[398,1355,1356],{"class":668,"line":1055},[398,1357,1358],{"class":692},"})\n",[828,1360,1361],{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":333,"searchDepth":334,"depth":334,"links":1363},[1364],{"id":1293,"depth":334,"text":1294},"Performance","2025-02-21","Como alcançar o score 100 no Lighthouse utilizando as melhores práticas do ecossistema Nuxt.",{"isOnReview":348},"/blog/otimizando-performance-nuxt",{"title":1280,"description":1367},"blog/otimizando-performance-nuxt",[593,1373,1374],"Web Performance","Lighthouse","F1E5nY5I6RypFgLGHtTXNOYfBgpmBA1yzHAsEpkpaKg",{"id":1377,"title":1378,"body":1379,"category":1201,"date":1478,"description":1479,"extension":347,"featured":843,"meta":1480,"navigation":348,"path":1481,"seo":1482,"stem":1483,"tags":1484,"__hash__":1487},"blog/blog/fastify-node-backend.md","Fastify: O futuro do Node.js backend",{"type":9,"value":1380,"toc":1475},[1381,1383,1386,1389,1393,1472],[12,1382,861],{"id":860},[12,1384,1378],{"id":1385},"fastify-o-futuro-do-nodejs-backend",[22,1387,1388],{},"O Fastify é um framework focado em baixo overhead e arquitetura baseada em plugins.",[17,1390,1392],{"id":1391},"exemplo-de-servidor","Exemplo de servidor:",[659,1394,1398],{"className":1395,"code":1396,"language":1397,"meta":333,"style":333},"language-javascript shiki shiki-themes github-light github-dark","const fastify = require('fastify')({ logger: true })\n\nfastify.get('/', async (request, reply) => {\n  return { hello: 'world' }\n})\n\nconst start = async () => {\n  try {\n    await fastify.listen({ port: 3000 })\n  } catch (err) {\n    fastify.log.error(err)\n    process.exit(1)\n  }\n}\nstart()\n","javascript",[606,1399,1400,1405,1409,1414,1419,1423,1427,1432,1437,1442,1447,1452,1457,1461,1466],{"__ignoreMap":333},[398,1401,1402],{"class":668,"line":669},[398,1403,1404],{},"const fastify = require('fastify')({ logger: true })\n",[398,1406,1407],{"class":668,"line":334},[398,1408,1052],{"emptyLinePlaceholder":348},[398,1410,1411],{"class":668,"line":340},[398,1412,1413],{},"fastify.get('/', async (request, reply) => {\n",[398,1415,1416],{"class":668,"line":1049},[398,1417,1418],{},"  return { hello: 'world' }\n",[398,1420,1421],{"class":668,"line":1055},[398,1422,1358],{},[398,1424,1425],{"class":668,"line":1073},[398,1426,1052],{"emptyLinePlaceholder":348},[398,1428,1429],{"class":668,"line":1079},[398,1430,1431],{},"const start = async () => {\n",[398,1433,1434],{"class":668,"line":1094},[398,1435,1436],{},"  try {\n",[398,1438,1439],{"class":668,"line":1100},[398,1440,1441],{},"    await fastify.listen({ port: 3000 })\n",[398,1443,1444],{"class":668,"line":1112},[398,1445,1446],{},"  } catch (err) {\n",[398,1448,1449],{"class":668,"line":1118},[398,1450,1451],{},"    fastify.log.error(err)\n",[398,1453,1454],{"class":668,"line":1124},[398,1455,1456],{},"    process.exit(1)\n",[398,1458,1459],{"class":668,"line":1148},[398,1460,1151],{},[398,1462,1463],{"class":668,"line":1154},[398,1464,1465],{},"}\n",[398,1467,1469],{"class":668,"line":1468},15,[398,1470,1471],{},"start()\n",[828,1473,1474],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":333,"searchDepth":334,"depth":334,"links":1476},[1477],{"id":1391,"depth":334,"text":1392},"2025-02-20","Por que o Fastify se tornou minha escolha padrão para APIs de alta performance.",{"isOnReview":348},"/blog/fastify-node-backend",{"title":1378,"description":1479},"blog/fastify-node-backend",[1485,1486,1365],"Fastify","Backend","ikyoi7_KrlLFwdNygX9ITRkgwiUUFZd8Mnw7q3vPFro",[],1779800308470]