<?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>DEV Community: Bulus Hamnu</title>
    <description>The latest articles on DEV Community by Bulus Hamnu (@bulus_hamnu).</description>
    <link>https://dev.to/bulus_hamnu</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2840547%2F0222b8f1-9290-4daf-893b-42ff417090d6.jpg</url>
      <title>DEV Community: Bulus Hamnu</title>
      <link>https://dev.to/bulus_hamnu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bulus_hamnu"/>
    <language>en</language>
    <item>
      <title>I thought I was just improving my portfolio.</title>
      <dc:creator>Bulus Hamnu</dc:creator>
      <pubDate>Fri, 07 Aug 2026 21:08:47 +0000</pubDate>
      <link>https://dev.to/bulus_hamnu/i-thought-i-was-just-improving-my-portfolio-4hc3</link>
      <guid>https://dev.to/bulus_hamnu/i-thought-i-was-just-improving-my-portfolio-4hc3</guid>
      <description>&lt;p&gt;Sometimes the best learning happens when you're trying to solve a completely different problem.&lt;/p&gt;

&lt;p&gt;A few weeks ago, I decided to redesign my portfolio. At first, it seemed like a simple project. I wanted to improve the design, add a Services section, and make it better represent the kind of software engineer I'm becoming.&lt;/p&gt;

&lt;p&gt;Then I thought, "Why not improve the SEO while I'm here?" I expected to spend an hour adding a few meta tags. Instead, I ended up learning much more than I expected.&lt;/p&gt;

&lt;p&gt;It started with the basics&lt;/p&gt;

&lt;p&gt;I began reading about how search engines understand websites and quickly came across concepts like Meta tags, Open Graph, Twitter Cards, Structured Data (JSON-LD), Canonical URLs, robots.txt, and sitemap.xml. None of these were things I had learned while learning React.&lt;/p&gt;

&lt;p&gt;As I added them one by one, I felt like my portfolio was finally becoming something that search engines and social media platforms could understand, not just browsers.&lt;/p&gt;

&lt;p&gt;Then I noticed another problem. Social previews weren't working&lt;/p&gt;

&lt;p&gt;When I shared my portfolio link on social media, the preview wasn't what I expected. Sometimes it didn't update. Sometimes the image didn't appear. Sometimes the title was wrong. That sent me down another rabbit hole.&lt;/p&gt;

&lt;p&gt;React Helmet&lt;/p&gt;

&lt;p&gt;While trying to fix the problem, I discovered React Helmet. It allows React applications to update the contents of the document , making it possible to set page titles and meta tags dynamically.&lt;/p&gt;

&lt;p&gt;At first, I thought this solved everything. Then I learned it wasn't that simple.&lt;/p&gt;

&lt;p&gt;The problem wasn't React Helmet itself. The problem was that my portfolio is a Single Page Application (SPA).&lt;/p&gt;

&lt;p&gt;Like most React applications, the browser first loads a single HTML file, then JavaScript builds the rest of the page. Browsers have no problem with this, but I discovered that not every crawler behaves like a browser.&lt;/p&gt;

&lt;p&gt;Some search engines and social media platforms don't execute JavaScript the same way, or don't wait for it to finish before reading the page. That means they might never see the meta tags generated by React Helmet, even though everything looked perfectly fine in my browser.&lt;/p&gt;

&lt;p&gt;That was probably the biggest thing I learned during this whole process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking for solutions
&lt;/h2&gt;

&lt;p&gt;After realizing the problem wasn't React Helmet, I started looking into different ways people solve this. That's when I came across Pre-rendering, Static Site Generation (SSG), and Server-Side Rendering (SSR).&lt;/p&gt;

&lt;p&gt;I even tried finding a pre-rendering solution that would work with my Vite project, but I quickly realized it wasn't as straightforward as I expected. Some solutions were no longer actively maintained, while others just weren't the right fit for my project.&lt;/p&gt;

&lt;p&gt;While reading more about these approaches, I finally understood why frameworks like Next.js exist.&lt;/p&gt;

&lt;p&gt;Before this, I honestly thought Next.js was just React with extra features. Now I understand that one of its biggest advantages is generating HTML before it reaches the browser, making SEO and social media previews much more reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;I didn't set out to learn about SEO. I just wanted a better portfolio.&lt;/p&gt;

&lt;p&gt;Instead, I ended up learning how search engines discover websites, how social media platforms generate previews, why Single Page Applications have SEO limitations, and why technologies like SSR and SSG exist.&lt;/p&gt;

&lt;p&gt;That's one of the things I enjoy most about software engineering. You start solving one problem, and before you know it, you've learned five other things you weren't even looking for.&lt;/p&gt;

&lt;p&gt;Looking back, improving my portfolio taught me far more than just SEO. It completely changed the way I think about how modern web applications work behind the scenes, and that's a lesson I'll carry into every project I build from now on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmyh8dusglu74mknyep77.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmyh8dusglu74mknyep77.png" alt="Screenshot of my redesigned portfolio homepage with the updated hero section and navigation." width="799" height="382"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftvljawzdzk16836w0l4b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftvljawzdzk16836w0l4b.png" alt="Chrome DevTools showing the HTML &lt;head&gt; of my portfolio with SEO metadata such as Open Graph, Twitter Cards, and meta tags." width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>portfolio</category>
      <category>react</category>
    </item>
  </channel>
</rss>
