Open Ghost Admin

RetroFun.PL has moved to Ghost!

RetroFun.PL has moved to Ghost!

I'm alive! And RetroFun.PL has finally left WordPress.

If you've been reading this blog (both of you — hi!), you might have noticed it went quiet for a while. That's because I've been stuck in migration purgatory for what felt like years. I'd start moving to Ghost, get 70% done, hit a wall, second-guess everything, and quietly abandon the attempt. Rinse, repeat. At least four times.

This time I actually finished. Let me tell you what happened.

Moving on

WordPress served me well for years, and I genuinely appreciate what it became — especially the block editor, which got really good in recent versions. But the ecosystem around it was increasingly exhausting. Every plugin felt like a worst-of-PHP hack held together with duct tape and a premium upsell modal. Half of them were constantly nagging me for money. The other half hadn't been updated since the Obama administration.

The final push came from the WordPress vs. WP Engine drama — watching Matt Mullenweg block WP Engine users out of the WordPress.org plugin repository out of personal spite was... not inspiring. It made the whole ecosystem feel fragile and personality-driven in a way that didn't sit well with me.

So, Ghost. It looked good. The editor is excellent. It feels lightweight — Node.js instead of PHP, a single binary instead of a sprawling plugin jungle. It has built-in email newsletters and membership/supporter tiers, and I'd love to build a small community around this blog someday. The overall philosophy of "just a publishing platform, done well" resonated with me.

The data migration itself was actually the easy part — even with bilingual content (every post exists in Polish and English, linked together). Ghost's import format is straightforward, and the official WordPress-to-Ghost migrator did most of the heavy lifting. I wrote an enrichment script on top of it to preserve the translation pairs and clean up Polylang metadata.

What kept killing each attempt was everything else. The bilingual routing — Ghost doesn't natively support multilingual content, so getting Polish posts under /pl/ and English under / with working translation links required custom routes, metadata injection, and client-side JavaScript. The theme — I'd build something, look at it, and it just felt wrong. Bad spacing. Bad readability. The fonts didn't work together. The retro aesthetic felt forced. I'd spend hours tweaking CSS, lose confidence, and walk away. And of course the classic self-doubt spiral: is this even worth the effort? Maybe I should just stay on WordPress. Maybe nobody reads this anyway. Maybe I should rewrite it in Hugo. Or Astro. Or hand-coded HTML. Or...

What finally broke the cycle was that AI tooling evolved enough to help me push through the tedious parts. I used Claude Code to help with the migration scripts, the CSS debugging (3000+ lines of theme CSS with six colour variants is... a lot), database manipulation, and the general "I know what I want but can't be bothered to type 200 lines of boilerplate" tasks. The design decisions, the font choices, the editorial direction, the content — that's all me. But having a tireless assistant to handle the mechanical parts meant I could focus on the creative ones without losing momentum.

Six themes, one blog

The most visible change is the look. You can switch between six visual themes using the selector in the top navigation. Each one has a reason for existing.

Synthwave (default)

Built around the aesthetics of the computers this blog is about — but seen through the lens of how we remember them rather than how they actually looked. Deep indigo backgrounds, CRT scanline overlays, neon glow on text, a subtle screen flicker. The title uses the actual Amstrad CPC pixel font (the international version, with Polish diacritics). Body text is JetBrains Mono — a modern monospace that's comfortable for long reads, unlike actual 8-bit fonts which would be murder on the eyes for 2000 words.

The colour palette — cyan, magenta, green — is the classic RGB phosphor trio. If you've ever looked at a CRT monitor through a magnifying glass, you've seen these three subpixels. The synthwave aesthetic takes those raw hardware colours and turns them into a visual language: cyan for links, green for titles, magenta for dates.

Matrix

Monochrome green-on-black, like a VT100 terminal or a green phosphor monitor. Three shades of green create the visual hierarchy. This is what computing looked like before colour monitors became affordable.

Amber

The amber phosphor variant. Before green monitors, and alongside them, there were amber ones — warm, golden, supposedly easier on the eyes for long sessions. Hercules graphics cards drove many of these. If you've ever used a Hercules-equipped PC/XT with an amber monitor, this will feel like home.

BSOD

Blue Screen of Reading. White-on-blue, reminiscent of the Windows crash screen but also of Norton Commander, Turbo Pascal's IDE, and the BIOS setup screen. The blue is the actual BSOD shade (#0000A4).

Classic Light — the Amstrad CPC6128 User Manual

This one is personal. The CPC6128 User Manual was — and still is — one of the best-written technical manuals I've ever read. It taught a generation of kids how to program, not by dumbing things down, but by being genuinely well-typeset, carefully paced, and beautifully laid out.

Classic Light recreates its typography as faithfully as possible on the web:

  • Headings in Rockwell N90 — a narrowed version of the slab serif used in the original manual
  • Body text in Century Schoolbook (Bitstream) — the warm, readable serif from the manual
  • Code listings in Anka/Coder Condensed
  • Accent colour: Amstrad red (#C41230) for rules and borders
  • Links in Amstrad blue (#1B3A5C) from the manual's cover
  • Background: a near-white with just a whisper of warmth (#FFFAF8), like paper that's been kept well

No CRT effects, no animations, no glow. Just clean typography on quiet paper. This is the theme for actually reading.

Classic Dark

Same Rockwell + Century Schoolbook typography, inverted onto a cool dark background. The manual, read under a desk lamp at night.

What's under the hood

For the technically curious:

  • Ghost 5 on Docker, SQLite for dev, MySQL for production
  • Bilingual routing via Ghost's routes.yaml — Polish posts tagged with an internal #pl tag, routed to /pl/{slug}/. Translation links stored as JSON in each post's code injection header, read by client-side JS
  • Self-hosted fonts — Amstrad CPC pixel fonts, Rockwell N90, Century Schoolbook BT, Anka/Coder Condensed, Geometric Slabserif 712. No Google Fonts dependency for the classic themes
  • Syntax highlighting via Prism.js with theme-adaptive colours (neon for retro, Amstrad red/blue for classic)
  • Authentic 88x31 sidebar buttons linking to real sites — konCePCja, Winamp, Firefox, and IE via the Wayback Machine
  • A 90s-style hit counter — a tiny Go microservice that counts every page view (like the old days!) but filters out bots. Persists to a file, logs daily stats, tracks unique visitors privately
  • 25 WordPress comments migrated as native Ghost comments, with proper threading where the originals were replies
  • Production deployment ready: Ghost + MySQL + Nginx + counter service, all in one docker-compose.prod.yml

What's next

More posts, obviously. The migration ate months of writing time. But now that the infrastructure is solid and I'm not fighting WordPress, there's nothing stopping me.

The backlog is long. I've got about 27 hobby projects going — half of them retro computing (CPC, C64, demoscene, hardware restoration), the other half living somewhere in 2040 (LLM tooling, home automation, weird experiments). This blog covers the retro half, but sometimes the two worlds collide in interesting ways. Like, say, using an AI assistant to help build a retro-themed blog about 8-bit computers. The irony is not lost on me.

If you spot anything broken — a missing image, a dead translation link, a theme that looks wrong on your device — please let me know in the comments below. This is a fresh migration and there are certainly rough edges I haven't caught yet.

Thanks for reading, and welcome to the new RetroFun.PL. It only took me four attempts.