ghost-blog
Self-hosted Ghost 5 blog at blog.cativo.dev with a custom terminal-themed Handlebars theme.
- ▸Custom Handlebars theme: Tokyo Night Storm, hybrid hero feed, sidebar TOC, reading progress
- ▸Blog series support via Ghost internal tags with collapsible series index per post
- ▸Self-hosted: Ghost 5 + MySQL 8 + Docker Compose, fronted by Traefik v3.6 with SSL
- ▸Python migration toolkit using Ghost's Admin API — bulk tagging, theme upload, profiles
Self-hosted Ghost blog with a custom terminal-themed Handlebars theme
The blog at blog.cativo.dev runs on Ghost 5 behind Traefik, with a custom theme called cativo-terminal — Tokyo Night Storm palette, terminal aesthetic (window chrome, prompts, monospace), hybrid hero feed, sidebar TOC, reading progress, Giscus comments, and grep-style search.
Why I built it
I wanted full control over the look of my blog without giving up Ghost's writing experience. Off-the-shelf Ghost themes either looked generic or didn't support the patterns I wanted (blog series, sidebar TOC, reading progress). Building a custom theme also gave me a place to apply the same Tokyo Night terminal aesthetic I use in my portfolio and dotfiles — one visual language across everything I publish.
What it does
- Custom Handlebars theme with Tokyo Night Storm palette, dark and light modes.
- Hybrid homepage — large hero featured post + terminal-style chronological feed.
- Sidebar TOC with active-section highlighting and smooth scroll.
- Reading progress bar at the top of each post.
- Blog series — group posts via internal Ghost tags (
#series: Series Name) and the theme renders a series badge above the title plus a collapsible series index at the bottom. - Giscus comments integrated via GitHub Discussions.
- Terminal grep-style search UI.
- Self-hosted stack — Ghost 5 + MySQL 8 + Docker Compose, with Traefik v3.6 routing
blog.cativo.devin production. - Migration scripts in Python — bulk tag assignment, series creation, theme upload, profile-image management — all via Ghost's Admin API with JWT.
Stack
Ghost 5 (Alpine), MySQL 8, Handlebars + custom CSS, Docker Compose, Traefik v3.6, Python (PyJWT + Requests) for migration utilities.
Status
Live at blog.cativo.dev.