<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://ombogojr.com/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ombogo Jr</title>
    <link>https://ombogojr.com/</link>
    <atom:link href="https://ombogojr.com/feed.xml" rel="self" type="application/rss+xml" />
    <description>Notes on building things.</description>
    <language>en</language>
    <item>
      <title>Building a Site on a Hand-Rolled Build</title>
      <link>https://ombogojr.com/blog/hello-mjs/</link>
      <description>&lt;p&gt;Before I settled on a generator, I built a version of this site with nothing but a single Node script. No framework, no plugins, just a file called &lt;code&gt;build.mjs&lt;/code&gt;. It was a good exercise, and it taught me exactly where the line is between freedom and homework.&lt;/p&gt;
&lt;h2&gt;One script, one page&lt;/h2&gt;
&lt;p&gt;The whole thing was refreshingly small. The script read some data, looped over it, stitched together a string of HTML, and wrote a single &lt;code&gt;index.html&lt;/code&gt; to disk. I could read the entire build in one sitting and hold it all in my head. When something rendered wrong, there was no magic layer to blame. There was just my code, and the bug was always mine.&lt;/p&gt;
&lt;h2&gt;Total control, no surprises&lt;/h2&gt;
&lt;p&gt;That is the real pull of hand-rolling it. Nothing happens that I did not write. No hidden conventions, no lifecycle I have to learn, no config file whose keys I half understand. If I wanted a page to behave a certain way, I wrote the lines that made it behave that way. For a small, opinionated site, that control feels great.&lt;/p&gt;
&lt;h2&gt;The parts you end up hand-rolling&lt;/h2&gt;
&lt;p&gt;The catch shows up the moment the site wants to grow. Routing is on me. If I want a second page, I write more file-writing code. A feed is on me too, which means learning the XML by hand and hoping I got the dates right. Sitemaps, pagination, tag pages: each one is another block of script I have to author and then maintain.&lt;/p&gt;
&lt;h2&gt;Content baked into arrays&lt;/h2&gt;
&lt;p&gt;The quiet problem is where the content lives. In a hand-rolled build, posts tend to end up as objects in a JavaScript array right inside the script. Writing a new post means editing code, escaping quotes, and being careful not to break the build with a stray character. The content and the machinery are tangled together, and that tangle gets heavier with every entry.&lt;/p&gt;
&lt;h2&gt;When the freedom is worth it&lt;/h2&gt;
&lt;p&gt;I would still reach for a &lt;code&gt;build.mjs&lt;/code&gt; for a landing page, a one-off experiment, or anything where the whole point is a handful of pages I control down to the byte. The freedom is real and the code is tiny. It is only when the page count starts climbing that the homework starts to outweigh the control.&lt;/p&gt;
</description>
      <pubDate>Sat, 20 Jun 2026 03:00:00 GMT</pubDate>
      <dc:creator>Ombogo Jr</dc:creator>
      <guid>https://ombogojr.com/blog/hello-mjs/</guid>
    </item>
    <item>
      <title>Building a Site on Eleventy</title>
      <link>https://ombogojr.com/blog/hello-eleventy/</link>
      <description>&lt;p&gt;I started this site the way I start most things: with a folder and a vague plan. This time the plan was to lean on Eleventy and let it do the boring parts, and I came away happy enough to write down why.&lt;/p&gt;
&lt;h2&gt;Markdown as the content model&lt;/h2&gt;
&lt;p&gt;The thing that sold me is that a post is just a file. I open an editor, type some markdown, add a little front matter at the top, and that is the whole content model. There is no database, no admin panel, no schema migration when I decide a post needs a subtitle. If I want to know what I have written, I list a directory. That plainness matters more than I expected. The content lives in text I can grep, diff, and back up like anything else.&lt;/p&gt;
&lt;h2&gt;Collections without ceremony&lt;/h2&gt;
&lt;p&gt;Because every post carries a tag, Eleventy hands me a collection for free. I ask for everything tagged &lt;code&gt;post&lt;/code&gt;, sort it newest first, and I have an index page. Adding a new entry is dropping a new file into the folder. I never touch a list of routes or register the page anywhere. The build finds it, sorts it in, and moves on.&lt;/p&gt;
&lt;h2&gt;RSS almost for free&lt;/h2&gt;
&lt;p&gt;A feed used to be a thing I put off forever. Here it was close to a checkbox. Point the feed plugin at the same collection, give it a title and a base URL, and out comes a valid &lt;code&gt;feed.xml&lt;/code&gt;. Readers who want to follow along get to, and I did not have to hand-write a single XML tag.&lt;/p&gt;
&lt;h2&gt;Zero client JavaScript by default&lt;/h2&gt;
&lt;p&gt;What I like most is what the site does not ship. By default there is no runtime, no hydration, no bundle to babysit. The pages are HTML and CSS. They load instantly and they will keep working long after any framework I might have picked has moved on to its next major version.&lt;/p&gt;
&lt;h2&gt;The feeling of a build that just emits HTML&lt;/h2&gt;
&lt;p&gt;At the end of it, I run one command and a folder of static files appears. That is the whole deploy story: upload the folder. There is something calming about a build whose only job is to turn my files into HTML and then get out of the way.&lt;/p&gt;
</description>
      <pubDate>Thu, 02 Jul 2026 03:00:00 GMT</pubDate>
      <dc:creator>Ombogo Jr</dc:creator>
      <guid>https://ombogojr.com/blog/hello-eleventy/</guid>
    </item>
    <item>
      <title>Eleventy vs a Hand-Rolled Build</title>
      <link>https://ombogojr.com/blog/how-they-compare/</link>
      <description>&lt;p&gt;Having built the same small site both ways, once on Eleventy and once on a single hand-rolled script, I want to lay the two side by side honestly. Neither is wrong. They just fail and shine at different sizes.&lt;/p&gt;
&lt;h2&gt;The content model&lt;/h2&gt;
&lt;p&gt;This is the first and biggest split. With Eleventy, a post is a markdown file in a folder. With a hand-rolled build, a post is usually an object in a JavaScript array baked into the script. Files win the moment you care about writing comfortably. You edit prose, not code, and you never break a build with a stray quote. Arrays win only while there are so few of them that it does not matter.&lt;/p&gt;
&lt;h2&gt;Scaling past a few pages&lt;/h2&gt;
&lt;p&gt;At two or three pages, the hand-rolled script is smaller and easier to follow. Push past a handful, and the lines invert. Every new page in the script is more routing code you write by hand. Every new page in Eleventy is a new file that the build simply discovers. One approach grows linearly with your effort. The other mostly grows on its own.&lt;/p&gt;
&lt;h2&gt;RSS and sitemaps&lt;/h2&gt;
&lt;p&gt;With the generator, a feed and a sitemap are a plugin and a few lines of config. Hand-rolled, they are yours to author and yours to keep correct. That is fine once. It is a slow tax every time the format has an edge case you did not know about.&lt;/p&gt;
&lt;h2&gt;The maintenance tax&lt;/h2&gt;
&lt;p&gt;This is the part that does not show up on day one. A hand-rolled build asks you to remember how it all fits together every time you return to it. A file-based generator externalizes those decisions into conventions you can look up. Six months later, adding a post to the generator is muscle memory. Adding one to the script means re-reading the script.&lt;/p&gt;
&lt;h2&gt;When each is the right call&lt;/h2&gt;
&lt;p&gt;If the site is a few pages you want total control over, hand-roll it and enjoy the simplicity. The moment you expect to keep writing, choose the file-based model.&lt;/p&gt;
&lt;h2&gt;The verdict&lt;/h2&gt;
&lt;p&gt;A file-based content model wins once you have more than a handful of posts. The freedom of a hand-rolled build is genuine, but it is freedom you pay for on every future edit. For anything meant to grow, let the files be the content and let the build get out of the way.&lt;/p&gt;
</description>
      <pubDate>Wed, 08 Jul 2026 03:00:00 GMT</pubDate>
      <dc:creator>Ombogo Jr</dc:creator>
      <guid>https://ombogojr.com/blog/how-they-compare/</guid>
    </item>
  </channel>
</rss>