Fresh off finally getting fifteen years of posts moved into Ghost, I figured picking a new theme would be the easy part. Nope. Same week, another small fight.

I tried installing "Solo," one of Ghost's official minimal themes, straight from the theme marketplace in the admin panel. Click install, watch the spinner spin. And spin. And keep spinning well past the point where it should've finished.

The browser said it failed. The server said it worked. Neither was lying.

The button just sat there stuck on "Installing…" forever, and the browser console was throwing a timeout error. Normal instinct: assume it crashed, try again, maybe restart something. But I checked the actual server logs first instead of guessing, and there it was — the install request had actually gone through and come back with a success response. It just took over two minutes to do it.

Here's the thing about running your own infrastructure behind Cloudflare: Cloudflare has its own patience limit for how long it'll wait for a response before it gives up and tells your browser "nope, timed out" — even if the server behind it is still quietly working and eventually succeeds. So my browser was told the install failed, while my actual server was told it succeeded. Two minutes is just outside that patience window.

Except it hadn't actually succeeded either

So naturally I went looking for where the theme landed, expecting to just need to refresh and activate it. It wasn't there. Not in the installed list, not on disk on the server. A success response, and nothing to show for it.

Turned out the real problem was one level deeper: my homelab could reach some parts of GitHub just fine, but the specific servers Ghost needed to actually download the theme file from were unreachable — not slow, just completely blocked somewhere along the route. So what actually happened was Ghost tried to fetch the theme, sat there failing to connect for the better part of two minutes, eventually gave up internally, and for whatever reason reported that as a success instead of an error. A quiet failure wearing a green checkmark.

The fix was simpler than the diagnosis

Once I knew the actual problem — my server couldn't reach that part of GitHub, but my own laptop could — the fix was straightforward: download the theme myself, repackage it the way Ghost expects (turns out a raw GitHub download has an extra folder layer Ghost doesn't want), and just upload the zip file directly through the admin panel instead of asking the server to fetch it from GitHub at all. Same result, different path there. Took about two minutes total once I understood what was actually broken.

That's the part of this work that never really goes away, whether it's a broadcast router, a finance app, or a blog theme: the fix is rarely hard once you know the real cause. Almost all the time goes into not trusting the first explanation and actually tracing where a "success" that clearly isn't one is coming from.

Site's running the new theme now. Onward.

When 'Success' Isn't: Chasing Down a Ghost Theme Install That Lied to Me

The browser said the theme install timed out. The server logs said it succeeded. Neither one was telling the whole story.