Project Details

Blog Platform Migration for CharlieHR

CharlieHR needed to move their blog off Ghost and into Webflow without losing content, breaking links, or damaging the search traffic the blog had built up. Nearly 500 posts, several thousand asset URLs, and a live audience throughout. Scoped, delivered, and handed over in six weeks.

CharlieHR needed to move their blog off Ghost and into Webflow without losing content, breaking links, or damaging the search traffic the blog had built up. Nearly 500 posts, several thousand asset URLs, and a live audience throughout. Scoped, delivered, and handed over in six weeks.

The problem

Blog migrations look like content moves and turn out to be link-integrity
problems. CharlieHR had years of posts on Ghost with their own URL structure,
images served from a Ghost-specific static host, and inbound search traffic
pointing at every one of those addresses. Moving to Webflow meant the content
had to arrive intact, every old link had to keep working, and the blog had to
serve from the main domain rather than a detached subdomain.

What I built

A Ghost-to-Webflow conversion pipeline. Ghost's JSON export is a
relational dump: posts, users, tags, and the join tables between them.
Webflow's CMS wants flat CSVs per collection. I wrote a Ruby converter that
rebuilds those relationships and emits import-ready files for authors, posts,
topics, and post-to-tag mappings. It had a test suite, because a migration you
cannot re-run safely is a migration you only get one attempt at.

Asset and URL rewriting. 4,159 asset references pointed at the old Ghost
static host. A second script rewrote them across the exported content so
nothing 404'd after cutover, with its own tests.

A Cloudflare Worker reverse proxy. So the Webflow blog serves under the
main CharlieHR domain rather than a separate subdomain, which keeps the
accumulated search authority where it belongs.

How it was handed over

Every script shipped with a handover document: what it does, what it expects,
how to run it, how to run its tests. The proxy repo documents the deployment
process, the DNS setup, and how to add a new site later.

That mattered more than the code. This was a fixed piece of work with a clear
end, and the measure of it is whether CharlieHR's team could operate and
extend it once I left. They could.

Why it matters for your project

Not every engagement is a platform build. Some are a well-defined problem with
a hard edge: move this, without breaking that, by then. Those are the easiest
projects to scope precisely and price fixed, and the ones where a clean
handover is the whole deliverable.

Stack: Ruby, Cloudflare Workers, Webflow CMS, Ghost, DNS.

Testimonials

“Wagner handled our blog migration end to end including migrating all content, URLs and redirects for SEO, and a custom Cloudflare Worker. All documented and deployed with zero drama.”

Alex Balhatchet , CTO, CharlieHR

Need a senior engineer on your side?

Fixed-scope builds, contract engagements, or ongoing support — I take on a limited number of clients.