Paul Welty, PhD AI, WORK, AND STAYING HUMAN

From 11ty to Hugo: simplifying my blog stack

Simplify your blogging experience by migrating from 11ty to Hugo. Discover the benefits of faster builds and reduced dependencies for your site.

After running this blog on various platforms since 2007—WordPress, Jekyll, 11ty—I’ve landed on Hugo. The migration wasn’t driven by dissatisfaction with 11ty, which served me well. It was driven by a growing unease with npm.

The npm problem

Every time I ran npm install, I watched dozens of packages download. Dependencies of dependencies of dependencies. Each one a potential supply-chain attack vector. The event-stream incident in 2018 wasn’t an anomaly—it was a preview of an ongoing vulnerability in how we build software.

For a personal blog, this felt absurd. I was pulling in hundreds of megabytes of node_modules to generate static HTML files. The attack surface was wildly disproportionate to the task.

Why Hugo?

Hugo is a single binary. No runtime dependencies. No package manager. You download it, and it works.

It’s also remarkably fast. My site has over 1,400 posts accumulated across nearly two decades of writing. Hugo builds the entire thing in under two seconds. 11ty was fast too, but Hugo’s Go-based architecture handles scale effortlessly.

The real draw, though, was Hugo Pipes. Modern Hugo (extended edition) includes Dart Sass compilation built-in. No PostCSS. No Tailwind build step. No npm. Just Sass files that Hugo processes natively during the build.

The migration path

The content migration was straightforward—both 11ty and Hugo use Markdown with YAML frontmatter. A few find-and-replace operations handled the differences:

  • permalink: became url:
  • Layout references changed format
  • Some shortcode syntax differed

The theme required more work. I’d been using Tailwind CSS, which depends on npm. I rebuilt the entire stylesheet in native Sass, reimplementing the utility classes I actually used. The result (I’m calling it “poly5”) is about 800 lines of Sass that compile to clean CSS via Hugo Pipes.

The base template now looks like this:

{{ $sass := resources.Get "sass/main.scss" }}
{{ $styles := $sass | toCSS | minify | fingerprint }}
<link rel="stylesheet" href="{{ $styles.RelPermalink }}">

That’s it. No build tooling. No npm scripts. Hugo handles everything.

Deployment

I’m hosting on Cloudflare Pages, which detects Hugo automatically. The build configuration is minimal:

Build command: hugo --gc --minify
Output directory: public
Environment: HUGO_VERSION = 0.152.2

No npm install step. Build times dropped significantly, and I no longer wonder what code is executing during my deployments.

What I gave up

Tailwind’s utility-first approach is genuinely productive for rapid prototyping. Writing equivalent Sass required more upfront thought about structure. But for a blog that changes design rarely, this tradeoff made sense.

I also lost 11ty’s JavaScript-based flexibility. Hugo’s templating is powerful but more constrained. For my use case—rendering Markdown to HTML with consistent layouts—this constraint hasn’t mattered.

The result

The blog looks identical to visitors. Under the hood, it’s dramatically simpler:

  • Zero npm dependencies (down from 67 packages)
  • Single binary toolchain (Hugo extended)
  • Native Sass compilation (no PostCSS/Tailwind)
  • Faster builds (~1.5 seconds for 1,400+ pages)
  • Smaller attack surface

Software has a tendency toward accidental complexity. Every dependency is a decision to trust someone else’s code—and everyone whose code they depend on. For a personal blog, I’ve decided that trust should be minimal.

Hugo with native Sass isn’t the right choice for every project. But for static content sites where simplicity and security matter more than ecosystem breadth, it’s been the right choice for me.


Featured writing

When your brilliant idea meets organizational reality: a survival guide

Transform your brilliant tech ideas into reality by navigating organizational challenges and overcoming hidden resistance with this essential survival guide.

Server-Side Dashboard Architecture: Why Moving Data Fetching Off the Browser Changes Everything

How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.

AI as Coach: Transforming Professional and Continuing Education

Transform professional and continuing education with AI-driven coaching, offering personalized support, accountability, and skill mastery at scale.

Books

The Work of Being (in progress)

A book on AI, judgment, and staying human at work.

The Practice of Work (in progress)

Practical essays on how work actually gets done.

Recent writing

Start, ship, close, sum up: rituals that make work resolve

Most knowledge work never finishes. It just stops. The start, ship, close, and sum-up methodology creates deliberate moments that turn continuous work into resolved units.

Notes and related thinking

Server-Side Dashboard Architecture: Why Moving Data Fetching Off the Browser Changes Everything

How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.

When your brilliant idea meets organizational reality: a survival guide

Transform your brilliant tech ideas into reality by navigating organizational challenges and overcoming hidden resistance with this essential survival guide.

The one-person company advantage: why coordination overhead is the new competitive liability

Unlock the power of one-person operations as they outpace traditional teams by leveraging AI, minimizing coordination costs, and enhancing decision speed.