I didn't want to use private Tinybird and send my audience's data to Tinybird. So I wrote a self-hosted drop-in.
I self-host Ghost for a while, and the analytics thing in v6 always annoyed me. Either the dashboard is empty, or you point it at Tinybird's cloud workspace and every pageview your readers generate goes somewhere you don't control. I didn't want the broken panel, but I also didn't want to surrender the data. So I started digging into whether Ghost could talk to something local without noticing. It turned out Ghost uses a pretty fixed protocol: a tracker POSTs page hits, the admin dashboard reads JSON pipes, and Ghost signs JWTs with a shared secret. I rewrote the other side of that conversation. GhostBird is a single Go binary + SQLite. It receives the same hits, answers the same pipes, and validates the same JWTs. You change two URLs in config.production.json and the analytics tab you already have keeps working, fed by a process on your own server. Not a new dashboard with different charts — just the missing piece so Ghost's native analytics works at home. AGPL-3.0, no telemetry, no paid tier. v0.5.0 is out: Code: github.com/gnacho/ghostbird Landing with screenshots: ghostbird.cloudless.club Sharing in case someone else is in the same boat and would rather not give up a bit of digital sovereignty. preview.redd.it/pyajfitlmxjh1.png