
I'm about to tell the dev story of this website, but... Starting is the hardest part of anything I write. So let's rip off the Band-Aid and get straight to the point, shall we?
1. I don't need a CMS
My goal was to build a website where I could migrate all my existing content and conveniently create new pieces. My previous website ran on Jekyll, and so did the docs site at my previous job. I had also played with Astro and MkDocs, so static site generators (SSGs) were familiar territory.
For this project, I started with Astro, and very soon I hated it. It wasn't the engineering that made me sick; it was how the whole setup made writing feel. I realized something I hadn't considered before: as comfortable as I am writing in source formats (.md(x), .asciidoc, etc.) for work, I hate that approach when I'm writing something personal. I can't and don't want to figure out exactly why; it just kills any motivation, flow, zest for writing!
I guess I just didn't want my personal writing to feel like another documentation repository.
I used WordPress 10+ years ago, but I didn't want to use a DB this time. If only there were a way to combine my beloved SSGs with some sort of visual wrapper—a CMS, if you like.
2. What if SSGs had UI wrappers?
For my website, I wanted to:
- keep the static-site approach I liked;
- keep content portable;
- avoid the WordPress (or any other database-powered) experience;
- support MIXED BILINGUAL content;
- have a humane visual writing editor in front of it.
That was how I discovered the concept of a headless CMS, and it was a revelation! It seemed like exactly what I needed.
So I started examining existing headless CMSs, starting with free, open-source options.
3. The FOSS rabbit hole
Keystatic, Sveltia, Decap, Static CMS, plus many forgotten candidates.
Every candidate would fail me as if I was too finicky (I guess I am, tbh).
Self-hosting? Too much operational overhead for the starting point. Hard pass.
Git-based and easy to deploy? Sounds great, but often felt like forms around Markdown, rather than an editor where I'd actually want to write a story.
Good enough on both counts? Then mixed bilingual publishing wasn't there.
Here we go. The requirement to support MIXED BILINGUAL content was the hardest to satisfy. Maybe my requirements simply exceeded what free software could give me? If the FOSS options wouldn't do, maybe paid headless CMSs would?
4. Fine. I'll pay
The headless CMS niche had evolved to the point where paid solutions appeared. One might find the idea of paying for a headless CMS ridiculous, but I wasn't there for open-source purism or anything. I just wanted to get on with my writing, dammit! If that meant throwing some money at the problem, I'd gladly do it.
So I looked at TinaCMS, Directus, Payload and, again, some others I can't remember now. Alas, my willingness to pay didn't solve the conundrum. The outcome was always the same: no fit.
However, at some point I was almost there.
5. Ghost: finally, almost everything
I got my hands on Ghost, which seemed like the best option:
- great, versatile UI/UX;
- my content would live on their servers, but it wasn't locked there, so I could migrate it down the road if I chose to change the CMS;
- the pricing was OK.
BUT. Mixed bilingual content, remember?
Ghost supported setting a publication locale, fine. But that locale mainly controlled the language of the reader-facing interface. That's not what I needed. The admin panel and site interface was meant to be in English, while the content itself was always supposed to be a mix of English and Russian.
Some articles/posts/stories would have versions in both locales, but that was never a requirement for every piece. I saw each piece as existing in one language by default, so the CMS must NOT require it to exist in other languages. But if I ever needed to create a version in another language, I'd better have that option without dirty hacks and, again, without messing with the source file.
6. Ghost: nope
Ghost couldn't do that, unfortunately. I was so sold on Ghost's other features that I tried to fight for it! Formally, yes, nobody could stop me from publishing posts in whatever languages I wanted, but neither the CMS nor the resulting website would have an easy way to identify those languages and link translations. That would defeat the point: a corpus of mixed-language content would become a mess, and I didn't want that at all.
Desperate, I asked on the Ghost forum whether mixed content was possible. The community confirmed that I could do it, but Ghost wasn't designed for that use case; the recommended approach was to run a separate Ghost instance for each language, which, again, was far from what I needed. I thought about a workaround with collections and locale metadata; another participant mentioned complications with language-specific search.
What am I to do?
It all took me roughly two months, after which it was clear: the headless CMS I wanted didn't exist. But build one myself? That sounded like even more overhead.
Read next: what makes a tech writer who has just failed to find a proper CMS decide that building one himself is sensible?