<?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 hit Notion's paywall, so I built my own note app: BH Notes</title>
      <dc:creator>Bulus Hamnu</dc:creator>
      <pubDate>Mon, 12 Oct 2026 08:29:24 +0000</pubDate>
      <link>https://dev.to/bulus_hamnu/i-hit-notions-paywall-so-i-built-my-own-note-app-bh-notes-4m2j</link>
      <guid>https://dev.to/bulus_hamnu/i-hit-notions-paywall-so-i-built-my-own-note-app-bh-notes-4m2j</guid>
      <description>&lt;p&gt;Back in 2022, I started using Notion and loved it.&lt;/p&gt;

&lt;p&gt;I loved the flexibility of nesting pages inside other pages. It did not feel like opening an old school word document just to write down an idea. It felt like a clean personal space where I could organize my thoughts and projects.&lt;/p&gt;

&lt;p&gt;Then I hit the limits on the free plan.&lt;/p&gt;

&lt;p&gt;When the paywall came up asking for hundreds of dollars a year, I could not justify it. For a developer living in Nigeria, paying that much every single year just to take notes was simply too expensive.&lt;/p&gt;

&lt;p&gt;So I decided to build my own solution: BH Notes.&lt;/p&gt;

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

&lt;p&gt;I did not want a bloated clone with a thousand buttons nobody uses. I wanted the fast, clean parts of Notion that actually matter for daily thinking.&lt;/p&gt;

&lt;p&gt;Here is what is inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nested pages: Put pages inside other pages, as deep as you need.&lt;/li&gt;
&lt;li&gt;Block editor: Paragraphs, headings, code blocks, tables, to-do lists, and bullet points.&lt;/li&gt;
&lt;li&gt;Images and files: Drag and drop images and files straight into any note.&lt;/li&gt;
&lt;li&gt;Sharing and live collaboration: Invite someone by email to collaborate on a note, or publish a note to the web with a public link.&lt;/li&gt;
&lt;li&gt;Zero AI bloat: No unwanted AI popups or autocomplete distracting you while you type. Just your thoughts.&lt;/li&gt;
&lt;li&gt;Full data export: You can back up your whole workspace into a neat Markdown ZIP folder whenever you want. Your notes belong to you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The technical side
&lt;/h2&gt;

&lt;p&gt;Building a block-based editor from scratch taught me a lot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uncontrolled block editing: To keep typing snappy with zero input lag, text blocks stay uncontrolled in the DOM while dirty blocks autosave in the background with local drafts for offline safety.&lt;/li&gt;
&lt;li&gt;Structured data: Pages and blocks are stored separately so notes can be searched, backlinked, and organized without saving one massive HTML blob.&lt;/li&gt;
&lt;li&gt;Security and privacy: File attachments live in private storage with short lived signed links. Public pages are served through strict database security functions so private drafts stay completely protected.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  It is live today
&lt;/h2&gt;

&lt;p&gt;I just launched BH Notes, and you can try it for free:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://notebook.bulushamnu.com" rel="noopener noreferrer"&gt;BH Notes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sign up, create a few notes, drag some files in, and let me know how it feels.&lt;/p&gt;

&lt;p&gt;As developers, what is the one thing you look for most in a note taking tool: speed, organization, or privacy? Drop your thoughts in the comments below, I would love to hear your feedback!&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%2Fz53lmkp2r1i3p56sf65r.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%2Fz53lmkp2r1i3p56sf65r.png" alt="BH Notes Dashboard" width="799" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>react</category>
      <category>productivity</category>
    </item>
    <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>
