Merging Middleman and Jekyll into Bridgetown—With a Little Help from AI Background

Merging Middleman and Jekyll into Bridgetown—With a Little Help from AI

Published on April 11, 2025

From Fractured to Unified

For a while now, my personal site and blog lived separate lives—one built with Middleman, the other on Jekyll. Both served me well for years, but over time they became maintenance projects I didn’t want. Two toolchains. Two ecosystems. Two sets of templates and helpers. I wanted less overhead, more fun.

So I decided to bring them together under one roof using Bridgetown. It’s a modern static site generator with the soul of Ruby and the flexibility of Tailwind, Vite, and ERB. It felt like the right evolution.

But what really changed the game was using AI tools—specifically Roo in Cursor, powered by Gemini—to make the whole thing smoother, faster, and honestly, a lot more enjoyable.


Why Bridgetown?

Bridgetown is everything I love about Ruby, repackaged with today’s frontend in mind. It’s fast, clean, and actively maintained. More than that, it feels intuitive.

I wanted to rebuild my site in a way that felt forward-looking without ditching the language and tools I already love. Bridgetown gave me that.


Bringing in AI as a Copilot

This wasn’t just a coding project—it was an experiment in how AI could make technical work more human. A bit of a foray into “Vibe Coding” for me. But I wasn’t just asking Roo to spit out code snippets. I was collaborating with it. Sharing context, swapping ideas, reviewing errors, debugging together.

Roo felt like the kind of developer friend who always has time, doesn’t mind your questions, and somehow always knows the answer to your obscure error message. A fantastic pair programmer.

Want to see exactly how I planned this migration? View the detailed migration plan that Roo’s architect persona created for me after I explained what I wanted to accomplish. This plan guided the entire project.


Phase 1: Middleman Migration

Getting Started

Like most good ideas, it started with a little chaos. The bridgetown command didn’t work at first. There were gem version mismatches. PostCSS issues. Tailwind errors. But with a few nudges from Roo—”try installing that globally,” “run gem update --system, “check the bundler version”—things started clicking.

We got the project scaffolded and slowly, piece by piece, I began to migrate the old Middleman site.

Layouts, Partials, and Components

Middleman’s partials became Bridgetown components. Roo helped refactor the logic, pull helpers into Ruby classes, and wire everything up with render calls.

The complex, sometimes messy ERB templates from my old site transformed into organized, maintainable components like Shared::Header and Shared::Footer. The clarity and structure made development genuinely fun.

One moment I remember: staring at a blank screen because vite_stylesheet_tag was silently failing. Roo stepped in, walked me through troubleshooting, and we found the culprit buried in a forgotten config file. The fix was quick, but I probably would’ve spent an hour alone on that in the past.

CSS, JS, and Assets

Tailwind was already part of my Middleman setup (part of a previous weekend of AI assisted “Vibe Coding” to update the legacy site from Bootstrap to Tailwind), so we reused and cleaned up the config. We also migrated JS files, ditched CDNs in favor of Yarn installs, and moved Alpine.js initialization into the Vite pipeline.


Phase 2: Jekyll Blog Migration

This was the trickier part.

Markdown Conversion

Jekyll posts lived as HTML, so I used reverse_markdown and a custom Ruby script to convert everything. Roo helped me catch a YAML front matter bug that broke half the build. A tiny formatting mistake—but one that would’ve been hard to spot without another pair of (AI) eyes.

Blog Templates and Layouts

We rewrote layouts using Tailwind’s prose classes. Created index pages, archives, and even a new layout for my “Curated News” section. Pagination worked out of the box, which felt like magic after Jekyll and Middleman.

Troubleshooting: Excerpts and Rendering

One afternoon I was stuck. Excerpts weren’t rendering right. No matter what method I used—post.summary, post.output, even post.content.truncate—something always felt off. Either the formatting was weird, or the excerpt included raw front matter.

Roo and I poked at it for a while. Eventually, I just decided to skip excerpts altogether. Sometimes the best fix is to stop over-engineering and go with what works.


The Taxonomy Tangle

Bridgetown has built-in support for tags and categories… and yet, I still found myself chasing down 404s, broken routes, and missing pages.

Eventually I gave up on built-in taxonomies and just rolled my own. Roo helped me build custom hashes by iterating over posts and grouping them by tag or category. No plugin. No magic. Just clean, understandable Ruby.

We linked to anchors on a single /categories or /tags page, bypassing the need to generate dozens of individual pages. It worked. It was fast. It was done.


The Moments I Didn’t Expect

There were little joys throughout:

  • Watching the dark mode toggle finally work after much fiddling with Alpine.js.
  • Seeing a Tailwind layout render exactly how I’d imagined it.
  • Watching Bridgetown rebuild cleanly after I finally solved an asset path bug I’d been chasing for an hour.

But the biggest surprise was how AI made the process feel less lonely. More creative. More collaborative. More fun.

It felt like someone had your back. And that “someone” just happened to be an LLM.


What I Took Away

  1. Modernize, even if it’s painful at first. Long-term maintainability is worth the short-term migration slog.
  2. AI isn’t just a shortcut. It’s a legit partner—especially when you’re working solo.
  3. Code should be fun. And if it’s not, maybe try changing your tools (or your mindset).
  4. Sometimes the best feature is the one you don’t build. Simplicity wins more than we admit.

Final Thoughts

I set out to unify two dusty old websites. I ended up building something faster, cleaner, easier to manage—and more personal. And I did it with the help of AI tools that turned a potentially frustrating project into a genuinely fun one.

If you’re on the edge of a similar project, wondering if it’s worth it: it is. And if you’re curious whether AI can actually help? It can. Not just with code, but with the experience itself.

The tools are better. The workflows are more joyful. And sometimes, all it takes is a new setup—and a smart copilot—to remind you why you loved this work in the first place.