Standing Up My Blog: Eleventy, Netlify, and 10 Years of Procrastination

A decade-long to-do item finally gets executed. Not a 'Hello World'—this is a reflection on procrastination, tools, AI, and finally hitting publish.

“The Answer to the Great Question… Of Life, the Universe and Everything… Is… Forty-two.”
— Douglas Adams

For me, the Great Question wasn’t why we exist — it was why, after 10 years of promising myself, have I still not started this damn blog?

The truth is a bit like the fan-discovered nine times six equals forty-two (in base-13) joke from Hitchhiker’s Guide. Douglas Adams swore he never planned it that way — but that’s the point: sometimes the answer was there all along, hidden until you change your frame of reference.

For me, the answer wasn’t elusive; it was just waiting for me to shift perspective, drop perfectionism, and finally hit “publish.”

It sat on my to-do list like a digital zombie: migrating from app to app, from Notepad → Todoist → Notion → Obsidian → plain text, haunting me through pandemics, job changes, and domain name purchases. (I bought this domain three years ago and still… nothing.)

The truth? I was stuck in the nerd’s paradox: obsessing over the “perfect stack” before writing a single word. Django or Flask? Hugo, Jekyll, or Eleventy? AWS EC2 or Netlify? AI or no AI? By the time I finished debating, I could’ve written ten posts.

Spoiler: there’s no perfect stack. There’s only shipping or not shipping.

So here we are. This post isn’t a Hello World. It’s a mix of:

  • confession (why it took me a decade),
  • a semi-technical walkthrough (Eleventy + Netlify),
  • a rant about perfectionism,
  • and a few practical takeaways if you’re finally starting your own blog.

If you’ve ever procrastinated on a side project, this is for you.

So pour some coffee, adjust your ergonomic chair, and let’s go.


Part I: Ten Years of “I’ll Start Tomorrow”

For a decade, my to-do list carried the same immortal line:

It survived productivity app migrations, pandemics, new jobs, and at least three different personal domain purchases.

Why didn’t I just do it? Because nerds are cursed by choice.

  • What stack should I use? Django vs Flask, Hugo vs Jekyll, Bootstrap vs Tailwind?
  • Where to host? AWS EC2, Lightsail, Docker, DigitalOcean, Netlify, Vercel?
  • What should I write about? AI, insurance, philosophy, my dog?
  • Who would even read it?

Every time, I’d rabbit-hole into debates instead of shipping.

Spoiler: there is no perfect platform. Only shipping or not shipping.


Part II: Why Eleventy Won the Stack Wars

Eventually, I chose Eleventy (11ty). Minimal, hackable, Markdown-first. It doesn’t force React or a CMS, and it stays out of my way.

Key Eleventy advantages:

  • File-based routing → drop a .md file in posts/, it just works.
  • Layouts systemnjk, Liquid, or plain HTML.
  • Data cascade → flexible frontmatter inheritance.
  • Zero-client JS by default → faster pages.

If Hugo is the Swiss Army knife and Gatsby is a chainsaw with a React sticker, Eleventy is a scalpel: precise, flexible, and unlikely to amputate your leg.

My folder structure looks like this:

.
├── .eleventy.js        # Eleventy config
├── package.json        
├── src                 
│   ├── _data           # Global data
│   ├── _includes       # Layouts & partials
│   ├── posts           # Markdown posts
│   ├── styles          # CSS
│   ├── javascript      # JS assets
│   └── index.md        
└── .gitignore

Starter config (.eleventy.js):

module.exports = function(eleventyConfig) {
  eleventyConfig.addPassthroughCopy("src/styles");
  eleventyConfig.addPassthroughCopy("src/javascript");

  eleventyConfig.addCollection("posts", function(collectionApi) {
    return collectionApi.getFilteredByGlob("src/posts/*.md").reverse();
  });

  return {
    dir: {
      input: "src",
      includes: "_includes",
      data: "_data",
      output: "_site"
    },
    templateFormats: ["md", "njk", "html"],
    markdownTemplateEngine: "njk",
    htmlTemplateEngine: "njk",
    dataTemplateEngine: "njk"
  };
};

Want to try it yourself? Download the Eleventy starter kit from my GitHub: eleventy-starter-demo

Quick Tip: Start boring. One layout, one post. Fancy plugins can wait.


Part III: Netlify — The Lazy Win

I could’ve Dockerized everything, run a Kubernetes cluster, set up Traefik and hand-rolled SSL. But why?

Netlify gave me:

  • Git push → deploy CI/CD
  • Free SSL certs
  • Global CDN
  • Dead-simple subdomain setup

netlify.toml:

[build]
  command = "npx @11ty/eleventy"
  publish = "_site"

[build.environment]
  NODE_VERSION = "20"

Done. No EC2 provisioning. No “works on my machine.” Lazy is good. Lazy means more time writing.


Part IV: AI as a Blogging Copilot

The elephant (or large language model) in the room: AI.

Without it, I’d probably still be tweaking .eleventy.js files and obsessing over CSS margins. Instead, AI became my blogging copilot — part productivity hack, part coding safety net. Shipping in a weekend.

Where AI Helped

  • Content scaffolding → rough outlines that I rewrote in my own voice
  • Syntax reminders → quick Liquid/Nunjucks filter lookups
  • Text grunt work → meta descriptions, alt text, boilerplate copy

AI doesn’t replace my writing — it’s autocomplete on steroids. The voice, ideas, and cosmic rants are still mine. But the productivity boost? Easily 10×. What used to take four hours of fiddling now takes 30 minutes.

My LLM Experiment

As part of building this blog, I wanted to see which AI could generate the cleanest “working blog out of the box.” I tested:

  • Claude Opus 4.1Winner for first impressions. It gave me working code with CSS that looked great, but ignored the Eleventy framework. A follow-up prompt produced scaffolding, but only as one massive text dump (I had to split it into files manually). Claude also hit context limits quickly.
  • ChatGPT 5Best for usability. It generated a full ZIP with all files, including Eleventy scaffolding. Some pieces threw errors, but debugging was smoother. I ended up relying on ChatGPT once Claude’s outputs hit walls.
  • Gemini 2.5 ProMost frustrating. Its designs were decent, but exports often failed, and many “created files” never existed. Compiler errors were frequent.

Special Mention

Codex inside VS Code deserves credit: spectacular at fixing bugs on the fly and cleaning up CSS while I focused on content.

Verdict: Claude wins for working code and design quality, ChatGPT wins for day-to-day usability. Gemini… not so much.


Part V: The Philosophy of Shipping

This isn’t about SEO, personal branding, or monetisation. It’s about building a digital garden: AI experiments, sustainability hacks, DIY projects, and nerdy rants.

The regret: ten years of lost potential posts.
The liberation: the second I hit publish, the regret vanished.

The blank page wasn’t an enemy anymore — it became possibility.


Part VI: Practical Tips for Beginners

Okay, enough cosmic rambling. Here are some real, actionable tips if you’re starting a blog:

Bookmarkable Cheatsheet
  • Don’t Over-Engineer — Markdown + deploy is enough.
  • Automate Early — CI/CD from day one.
  • Keep Authoring Simple — VS Code + .md + push.
  • AI is your friend.

Part VII: What’s Next

Coming soon:

  • Johannesburg air pollution and winter smog
  • My DIY home air monitor project
  • Rethinking Takealot’s packaging chain
  • AI vs human coding experiments

This is the start of a geeky digital garden.


Closing: The 42 Lesson

Ten years of procrastination meant ten years of lost posts. That’s the regret.

But the moment I shipped, regret gave way to momentum.

So here’s my closing thought: the answer doesn’t change — but your perspective can.

Whatever your “42” is — a project, an idea, a blog you’ve been sitting on — stop waiting for perfect conditions. Change your base, hit publish, and ship.

Because the answer to “Why wait?” is probably still 42.

(And yes, 9 × 6 = 42 — if you’re counting in base-13.)


Join the Conversation

What’s your own “42” — What project or idea have you been putting off? Drop me a note — I’d love to hear your story.”

👉 Share your thoughts with me on LinkedIn or X (Twitter)