<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Samuel Caetite</title>
    <description>The latest articles on Forem by Samuel Caetite (@osamucadev).</description>
    <link>https://forem.com/osamucadev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3753910%2F73bca2b3-a93c-4371-a5d1-5c424479e53d.jpeg</url>
      <title>Forem: Samuel Caetite</title>
      <link>https://forem.com/osamucadev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/osamucadev"/>
    <language>en</language>
    <item>
      <title>Falso Retorno, ou: Quando desligamos as ranqueadas</title>
      <dc:creator>Samuel Caetite</dc:creator>
      <pubDate>Sat, 14 Feb 2026 10:48:43 +0000</pubDate>
      <link>https://forem.com/osamucadev/falso-retorno-ou-quando-desligamos-as-ranqueadas-44d0</link>
      <guid>https://forem.com/osamucadev/falso-retorno-ou-quando-desligamos-as-ranqueadas-44d0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Nota importante&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Este &lt;strong&gt;não é um texto de minha autoria&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Este artigo foi originalmente publicado no antigo site brasileiro do &lt;strong&gt;League of Legends&lt;/strong&gt;, escrito por &lt;strong&gt;Rumtumtummers&lt;/strong&gt;, e está disponível publicamente via Wayback Machine.  &lt;/p&gt;

&lt;p&gt;Estou republicando este conteúdo no &lt;strong&gt;dev.to&lt;/strong&gt; exclusivamente como &lt;strong&gt;referência pessoal e profissional&lt;/strong&gt;, para manter salvo um exemplo real de como equipes técnicas lidam com incidentes críticos, tomada de decisão sob pressão e responsabilidade com usuários.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://samuelcaetite.dev/falso-retorno" rel="noopener noreferrer"&gt;https://samuelcaetite.dev/falso-retorno&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Autor original:&lt;/strong&gt; Rumtumtummers&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Fonte original:&lt;/strong&gt; League of Legends Brasil&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Todos os horários em:&lt;/strong&gt; PDT&lt;/p&gt;




&lt;p&gt;Ah, a pré-temporada… época de ficar ansioso sobre as novidades em League, mas também de refletir sobre as coisas que aconteceram neste ano. Jogadores ranqueados, por exemplo, devem se lembrar do bug da Riven que apareceu em julho e causou o desligamento de todas as filas ranqueadas.&lt;/p&gt;

&lt;p&gt;A seguir temos a história desse bug e das equipes da Riot que trabalharam intensamente para encontrar uma solução.&lt;/p&gt;




&lt;h2&gt;
  
  
  Manhã – 15 de julho de 2015
&lt;/h2&gt;

&lt;p&gt;Um vídeo sobe rapidamente para a página inicial do subreddit de League of Legends. Nele, um jogador mostrava um bug com a Riven: a sequência “certa” de apertos de botão fazia com que ela voltasse instantaneamente para a base, ignorando o tempo de conjuração da habilidade de retorno. À medida que as equipes na Riot começam a trabalhar, relatórios sobre bugs e seu impacto em potencial vão surgindo.&lt;/p&gt;




&lt;p&gt;🧭 &lt;strong&gt;Donna Mason&lt;/strong&gt;, Release Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Recebemos emails, memorando e pessoas o tempo todo.&lt;br&gt;&lt;br&gt;
“Meu Deus, você viu isso no Reddit?”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🎛️ &lt;strong&gt;Scott Hansen&lt;/strong&gt;, Live Producer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tinha algo no Reddit em que alguém publicou um vídeo de&lt;br&gt;&lt;br&gt;
“Ei, aconteceu esse negócio bizarro quando eu estava jogando de Riven”.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🎛️ &lt;strong&gt;Tim Isenman&lt;/strong&gt;, Live Producer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A primeira coisa que vimos foi a publicação no Reddit e foi a partir dali que começamos a investigar. Tínhamos algumas pessoas no time de Campeões investigando o problema também.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧩 &lt;strong&gt;Kacee Granke&lt;/strong&gt;, Product Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O problema com a Riven levantou alertas de emergência imediatamente.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧠 &lt;strong&gt;Mark Sassenrath&lt;/strong&gt;, Associate Game Designer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Alguém vem e diz&lt;br&gt;&lt;br&gt;
“Ei, temos um bug na Riven que precisa ser arrumado. Podemos arrumar esse bug da Riven!”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧭 &lt;strong&gt;Donna Mason&lt;/strong&gt;, Release Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Então fomos investigar e começamos a tentar reproduzi-lo. Nosso objetivo quando esse tipo de coisa chega é sempre descobrir se é aleatório ou se era algo que as pessoas podiam explorar para vantagem própria.  &lt;/p&gt;

&lt;p&gt;Se há um bug no jogo, isso não é bom. Caso um bug dê uma vantagem que não seja natural a alguém, isso é muito, muito ruim.  &lt;/p&gt;

&lt;p&gt;E uma parte importante é: “Consigo fazer também?”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧩 &lt;strong&gt;Kacee Granke&lt;/strong&gt;, Product Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Começamos a tentar reproduzi-lo nós mesmos. Por sorte, o vídeo deixou tudo muito claro.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🎛️ &lt;strong&gt;Scott Hansen&lt;/strong&gt;, Live Producer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O controle de qualidade de Release conseguiu efetuar a reprodução facilmente. Nós, da Live Production, não. Não somos tão bons no jogo. Sou prata.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧪 &lt;strong&gt;Matthew Wittrock&lt;/strong&gt;, Release QA&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Estou mexendo e finalmente&lt;br&gt;&lt;br&gt;
“Ah, consegui”.&lt;br&gt;&lt;br&gt;
Depois&lt;br&gt;&lt;br&gt;
“Agora consigo fazer direto. Agora é fácil. Isso não é bom”.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🎛️ &lt;strong&gt;Tim Isenman&lt;/strong&gt;, Live Producer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Perguntei&lt;br&gt;&lt;br&gt;
“Com essas informações, vamos desabilitar Riven?”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧭 &lt;strong&gt;Donna Mason&lt;/strong&gt;, Release Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Então olhamos as informações e vimos o quão rapidamente a publicação estava ficando popular e visível e tomamos a decisão de desabilitar Riven.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  14:50 – 15 de julho
&lt;/h3&gt;

&lt;p&gt;Riven é desabilitada globalmente. Enquanto os times trabalham na solução, novos relatórios aparecem interna e externamente indicando que o bug pode ser aplicado em mais Campeões.&lt;/p&gt;




&lt;p&gt;🎛️ &lt;strong&gt;Tim Isenman&lt;/strong&gt;, Live Producer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Depois de desabilitar a Riven, vários Rioters vieram me falar sobre mais vídeos de pessoas reproduzindo o bug em outros Campeões. Era no Yasuo, depois no Graves, depois mais e mais.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧠 &lt;strong&gt;Mark Sassenrath&lt;/strong&gt;, Associate Game Designer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pessoas continuaram relatando&lt;br&gt;&lt;br&gt;
“Isso também acontece no Shen. E em X, Y e Z”.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧩 &lt;strong&gt;Kacee Granke&lt;/strong&gt;, Product Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quase imediatamente depois disso, começamos a receber relatórios do nosso controle de qualidade informando que eles conseguiam reproduzir o bug com outros Campeões.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧠 &lt;strong&gt;Mark Sassenrath&lt;/strong&gt;, Associate Game Designer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No decorrer do dia, começamos a perceber que esse não era um bug da Riven. Era um bug geral.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🎛️ &lt;strong&gt;Tim Isenman&lt;/strong&gt;, Live Producer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quando olhamos as informações, percebemos que o problema poderia ser explorado em quase um quarto dos Campeões. Quase entramos em choque.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧪 &lt;strong&gt;Matthew Wittrock&lt;/strong&gt;, Release QA&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mesmo então, ainda estávamos subestimando o escopo do problema.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🎛️ &lt;strong&gt;Tim Isenman&lt;/strong&gt;, Live Producer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Concluímos que qualquer Campeão usando Tiamat ou Hidra poderia causar o mesmo efeito.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧠 &lt;strong&gt;Mark Sassenrath&lt;/strong&gt;, Associate Game Designer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pensei&lt;br&gt;&lt;br&gt;
“Qualquer Campeão pode fazer isso. Precisamos impedir que se espalhe”.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧭 &lt;strong&gt;Donna Mason&lt;/strong&gt;, Release Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fica um sentimento de desespero quando você percebe que é com todos os Campeões.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧪 &lt;strong&gt;Matthew Wittrock&lt;/strong&gt;, Release QA&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Estava claro que não existia lado ruim no abuso desse bug.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Tarde – 15 de julho de 2015
&lt;/h2&gt;

&lt;p&gt;O bug cresce rapidamente. Times começam a discutir como mitigar o dano potencial.&lt;/p&gt;




&lt;p&gt;🎛️ &lt;strong&gt;Scott Hansen&lt;/strong&gt;, Live Producer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Precisamos considerar desabilitar as ranqueadas.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🎛️ &lt;strong&gt;Tim Isenman&lt;/strong&gt;, Live Producer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Desabilitar um quarto do jogo seria pior do que desligar as ranqueadas.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧪 &lt;strong&gt;Matthew Wittrock&lt;/strong&gt;, Release QA&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Não adiantava só desligar um Campeão ou item.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧩 &lt;strong&gt;Kacee Granke&lt;/strong&gt;, Product Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A pergunta era&lt;br&gt;&lt;br&gt;
“O que podemos fazer?”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧭 &lt;strong&gt;Donna Mason&lt;/strong&gt;, Release Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Era uma espada de dois gumes. Informação boa, visibilidade ruim.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧩 &lt;strong&gt;Kacee Granke&lt;/strong&gt;, Product Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Precisávamos desligar as ranqueadas agora.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  17:30 – 15 de julho
&lt;/h3&gt;

&lt;p&gt;As filas ranqueadas são oficialmente desabilitadas. O trabalho de correção começa em ritmo máximo.&lt;/p&gt;




&lt;p&gt;🎛️ &lt;strong&gt;Scott Hansen&lt;/strong&gt;, Live Producer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Estamos informando jogadores em mais de 20 idiomas e tentando resolver o problema.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧩 &lt;strong&gt;Kacee Granke&lt;/strong&gt;, Product Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Levou horas até passar pelo primeiro teste.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧠 &lt;strong&gt;Mark Sassenrath&lt;/strong&gt;, Associate Game Designer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O escopo ficava cada vez maior.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧭 &lt;strong&gt;Donna Mason&lt;/strong&gt;, Release Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sabíamos que estávamos com problemas após várias iterações falharem.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2:00 – 16 de julho de 2015
&lt;/h2&gt;

&lt;p&gt;A solução falha nos testes destrutivos. Todos são chamados de volta.&lt;/p&gt;




&lt;p&gt;🧭 &lt;strong&gt;Donna Mason&lt;/strong&gt;, Release Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Acordamos engenheiros, designers, todo mundo.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧠 &lt;strong&gt;Mark Sassenrath&lt;/strong&gt;, Associate Game Designer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Você sabe que algo deu errado quando o telefone toca de madrugada.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Tarde – 16 de julho de 2015
&lt;/h2&gt;

&lt;p&gt;As ranqueadas seguem desligadas há quase 24 horas.&lt;/p&gt;




&lt;p&gt;🎛️ &lt;strong&gt;Tim Isenman&lt;/strong&gt;, Live Producer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Era difícil comunicar progresso sem saber o prazo.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  17:00 – 16 de julho
&lt;/h3&gt;

&lt;p&gt;A solução é validada para todos os Campeões.&lt;/p&gt;




&lt;p&gt;🎛️ &lt;strong&gt;Tim Isenman&lt;/strong&gt;, Live Producer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Recebemos a confirmação de que funcionava 100%.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧭 &lt;strong&gt;Donna Mason&lt;/strong&gt;, Release Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O trem de lançamento estava pronto.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧪 &lt;strong&gt;Matthew Wittrock&lt;/strong&gt;, Release QA&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Todos estavam prontos.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  20:00 – 16 de julho
&lt;/h3&gt;

&lt;p&gt;As ranqueadas são reativadas após &lt;strong&gt;28 horas&lt;/strong&gt; desligadas.&lt;/p&gt;




&lt;p&gt;🎛️ &lt;strong&gt;Tim Isenman&lt;/strong&gt;, Live Producer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O demônio foi derrotado.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧪 &lt;strong&gt;Matthew Wittrock&lt;/strong&gt;, Release QA&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O trem continua seu curso.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧭 &lt;strong&gt;Donna Mason&lt;/strong&gt;, Release Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pensei&lt;br&gt;&lt;br&gt;
“Vou jogar uma ranqueadinha”.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧩 &lt;strong&gt;Kacee Granke&lt;/strong&gt;, Product Manager&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;E voltamos ao trabalho.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;🧠 &lt;strong&gt;Mark Sassenrath&lt;/strong&gt;, Associate Game Designer&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ainda há muito trabalho a fazer.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Ninguém gosta de bugs em jogos complexos, mas quando eles surgem, equipes inteiras trabalham juntas para preservar a integridade da experiência. No caso do grande bug de volta à base de 2015, várias pessoas contribuíram incansavelmente para devolver as ranqueadas aos jogadores.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fonte original e snapshot
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;URL original:&lt;/strong&gt; &lt;a href="https://br.leagueoflegends.com/pt/news/riot-games/editorial/falso-retorno-ou-quando-desligamos-ranqueadas" rel="noopener noreferrer"&gt;https://br.leagueoflegends.com/pt/news/riot-games/editorial/falso-retorno-ou-quando-desligamos-ranqueadas&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Snapshot (Wayback Machine):&lt;/strong&gt; &lt;a href="https://web.archive.org/web/20160225005605/http://br.leagueoflegends.com/pt/news/riot-games/editorial/falso-retorno-ou-quando-desligamos-ranqueadas" rel="noopener noreferrer"&gt;https://web.archive.org/web/20160225005605/http://br.leagueoflegends.com/pt/news/riot-games/editorial/falso-retorno-ou-quando-desligamos-ranqueadas&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Data e hora do snapshot:&lt;/strong&gt; 25 de fevereiro de 2016, 00:56:05 (UTC)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I spent 3 months building a static website and it says more about me than any stack</title>
      <dc:creator>Samuel Caetite</dc:creator>
      <pubDate>Thu, 05 Feb 2026 00:28:09 +0000</pubDate>
      <link>https://forem.com/osamucadev/i-spent-3-months-building-a-static-website-and-it-says-more-about-me-than-any-stack-366i</link>
      <guid>https://forem.com/osamucadev/i-spent-3-months-building-a-static-website-and-it-says-more-about-me-than-any-stack-366i</guid>
      <description>&lt;p&gt;For a long time, I was a web developer without a personal website.&lt;/p&gt;

&lt;p&gt;Not because I never built one. I had several. Some were decent, some were quick experiments, some died with expired domains. Back in 2019 I even made a simple one just to land my first internship. It worked.&lt;/p&gt;

&lt;p&gt;What I did not have was a site that actually represented who &lt;strong&gt;I am now&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that felt weird.&lt;/p&gt;

&lt;p&gt;If you build software for a living but you have no space that reflects your own criteria, it is like being a chef who lives on delivery. Functional, sure. But something does not add up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first versions were pretty and empty
&lt;/h2&gt;

&lt;p&gt;My first attempts were purely aesthetic.&lt;/p&gt;

&lt;p&gt;I tried glassmorphism. It looked modern and polished. I shipped it fast, with help from AI, and for a brief moment it felt done.&lt;/p&gt;

&lt;p&gt;Then the discomfort kicked in.&lt;/p&gt;

&lt;p&gt;It was a résumé wearing a costume. Same content as the PDF, just with blur and shine. Good looking, low truth.&lt;/p&gt;

&lt;p&gt;Then I tried neumorphism. Even prettier. I let AI drive most of it. It nailed the vibe. Still, after a while I realized I liked the style more than the message.&lt;/p&gt;

&lt;p&gt;I was optimizing surface, not meaning.&lt;/p&gt;

&lt;h2&gt;
  
  
  A side project quietly changed everything
&lt;/h2&gt;

&lt;p&gt;While I was stuck with the portfolio, I started a personal project called &lt;strong&gt;TrueStreak&lt;/strong&gt;. The idea was simple: track gym consistency and make habits visible.&lt;/p&gt;

&lt;p&gt;But it became a lab.&lt;/p&gt;

&lt;p&gt;I dove into performance, accessibility, analytics, SEO, domain modeling, cloud, serverless. Not as theory. As decisions that had to hold up in a real product.&lt;/p&gt;

&lt;p&gt;That is when I made a choice that looked odd from the outside.&lt;/p&gt;

&lt;p&gt;I built it with HTML, SCSS, and vanilla JavaScript.&lt;/p&gt;

&lt;p&gt;No framework. No TypeScript.&lt;/p&gt;

&lt;p&gt;Not out of nostalgia. Out of fit.&lt;/p&gt;

&lt;p&gt;A static product with simple flows does not need a cruise ship. It needs clarity, speed, and tolerance for iteration.&lt;/p&gt;

&lt;p&gt;The stack served the problem. Not the other way around.&lt;/p&gt;

&lt;h2&gt;
  
  
  The site stopped being a site and became a tool
&lt;/h2&gt;

&lt;p&gt;As the project grew, the usual friction showed up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;compiling SCSS
&lt;/li&gt;
&lt;li&gt;reusing shared structure across pages
&lt;/li&gt;
&lt;li&gt;cache busting assets
&lt;/li&gt;
&lt;li&gt;optimizing images
&lt;/li&gt;
&lt;li&gt;generating metadata and structured data
&lt;/li&gt;
&lt;li&gt;avoiding regressions and broken builds
&lt;/li&gt;
&lt;li&gt;making deploy predictable
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I started solving one pain at a time.&lt;/p&gt;

&lt;p&gt;Scripts became a pipeline. The pipeline became a builder. The builder became a small system.&lt;/p&gt;

&lt;p&gt;I eventually packaged the idea into my own static generator: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SiteForge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is not a “framework replacement”. It is a way to eliminate unnecessary complexity while keeping full control over what gets shipped.&lt;/p&gt;

&lt;p&gt;If you are curious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Portfolio: &lt;a href="https://samuelcaetite.dev" rel="noopener noreferrer"&gt;https://samuelcaetite.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SiteForge demo page: &lt;a href="https://samuelcaetite.dev/site-forge" rel="noopener noreferrer"&gt;https://samuelcaetite.dev/site-forge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;SiteForge repo: &lt;a href="https://github.com/osamucadev/site-forge" rel="noopener noreferrer"&gt;https://github.com/osamucadev/site-forge&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The real problem was narrative, not design
&lt;/h2&gt;

&lt;p&gt;When I finished TrueStreak and looked at it running, something clicked.&lt;/p&gt;

&lt;p&gt;I had a real product. Something I use. Something that does not depend on context or hype.&lt;/p&gt;

&lt;p&gt;Then I revisited my portfolio and noticed a mismatch.&lt;/p&gt;

&lt;p&gt;My LinkedIn told the story of someone who has dealt with critical systems, production pressure, real responsibility, and the boring parts that keep products alive.&lt;/p&gt;

&lt;p&gt;My website looked like a nice template.&lt;/p&gt;

&lt;p&gt;Two different people.&lt;/p&gt;

&lt;p&gt;At that moment it became obvious: the problem was not visual. It was narrative.&lt;/p&gt;

&lt;p&gt;I did not need another place listing technologies and job titles. I needed a space that shows how I think, how I decide, and what I refuse to compromise.&lt;/p&gt;

&lt;h2&gt;
  
  
  I changed how I used AI
&lt;/h2&gt;

&lt;p&gt;I stopped asking AI for solutions.&lt;/p&gt;

&lt;p&gt;I started asking it for questions.&lt;/p&gt;

&lt;p&gt;I shared the HTML and CSS. I explained the discomfort. I asked for critiques, alternatives, and tradeoffs. I used AI as an assistant that accelerates iteration, not as an author that replaces judgment.&lt;/p&gt;

&lt;p&gt;That is the key difference.&lt;/p&gt;

&lt;p&gt;AI can speed up execution. It cannot replace criteria.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the current portfolio actually demonstrates
&lt;/h2&gt;

&lt;p&gt;Yes, it is a static website. But it is not a static decision.&lt;/p&gt;

&lt;p&gt;This repo exists to demonstrate engineering habits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;full control over generated HTML, CSS, and JS
&lt;/li&gt;
&lt;li&gt;a custom build pipeline focused on real performance metrics
&lt;/li&gt;
&lt;li&gt;SEO that is not just “meta tags”, but structure and intent
&lt;/li&gt;
&lt;li&gt;cache busting and predictable deploy
&lt;/li&gt;
&lt;li&gt;security headers and basic hardening
&lt;/li&gt;
&lt;li&gt;separation between source and production output
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal was not to impress with complexity.&lt;/p&gt;

&lt;p&gt;The goal was to ship something fast, quiet, readable, and durable.&lt;/p&gt;

&lt;p&gt;In other words, the exact way I like to build software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it took 3 months
&lt;/h2&gt;

&lt;p&gt;Because the hard part was not typing code.&lt;/p&gt;

&lt;p&gt;The hard part was deciding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what should exist
&lt;/li&gt;
&lt;li&gt;what should not exist
&lt;/li&gt;
&lt;li&gt;what is noise
&lt;/li&gt;
&lt;li&gt;what actually communicates value
&lt;/li&gt;
&lt;li&gt;what stays stable as the site evolves
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A strong portfolio is not a list. It is a narrative system.&lt;/p&gt;

&lt;p&gt;Each section has its own intention. Some need tension. Some need calm. Some need structure. Some need humanity.&lt;/p&gt;

&lt;p&gt;The site does not try to prove seniority. &lt;strong&gt;It lets you feel it&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;I spent 3 months building a static website.&lt;/p&gt;

&lt;p&gt;And I would do it again the same way.&lt;/p&gt;

&lt;p&gt;Not because it is “hard” or “impressive”, but because it forced me to be honest about what I value:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clarity over noise
&lt;/li&gt;
&lt;li&gt;responsibility over aesthetics
&lt;/li&gt;
&lt;li&gt;fit over trend
&lt;/li&gt;
&lt;li&gt;maintainability over cleverness
&lt;/li&gt;
&lt;li&gt;narrative over buzzwords
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are building your own portfolio, here is my suggestion:&lt;/p&gt;

&lt;p&gt;Do not start with visuals.&lt;/p&gt;

&lt;p&gt;Start with what you want to be true about you when someone closes the tab.&lt;/p&gt;

&lt;p&gt;Everything else is implementation.&lt;/p&gt;

&lt;p&gt;If you want to see the code and the build approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/osamucadev/frontsamuelcaetite" rel="noopener noreferrer"&gt;https://github.com/osamucadev/frontsamuelcaetite&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Site: &lt;a href="https://samuelcaetite.dev" rel="noopener noreferrer"&gt;https://samuelcaetite.dev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>frontend</category>
      <category>career</category>
      <category>performance</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
