· Vinay Y J · Self hosting · 4 min read
How I Self-Hosted Ghost and Built a Fast Blog with Astro
My personal blog is powered by Astro and Ghost, deployed via Cloudflare, and built entirely by someone new to web development. Here's the full journey

I’ve spent most of my time writing C code, working close to the metal—hardware-level programming, tight loops, and the kind of software where performance matters more than polish. Web development? That was always something I kept at arm’s length. HTML, JavaScript, CSS frameworks, APIs—it all felt like a chaotic universe I wasn’t sure I wanted to enter.
But that changed when I got curious. I wanted a space of my own online—a simple blog where I could share what I’m learning, whether that’s dabbling in new tools, reviewing tech, or writing about places I travel to. So, I set out to build vinayreddy.in, my personal site.
And here’s the story of how I, a C developer with barely any web experience, ended up building a fast, modern blog using Astro, a self-hosted Ghost CMS, and Cloudflare Pages—all without using a traditional backend
Getting Started: Web Development from Ground Zero
When I started researching how to build a modern blog, I was overwhelmed by the number of choices. React, Next.js, Svelte, Hugo, Eleventy… it was a forest of frameworks.
But I kept coming across one name that stood out: Astro. It promised zero JavaScript by default, ultra-fast static sites, and a content-first approach—exactly what I was looking for. I didn’t want a bloated web app; I just wanted to write and publish.
Then I stumbled on AstroWind, a starter template that came pre-wired with Tailwind CSS, dark mode, a clean layout, and even some basic blog structure. I cloned it, ran it locally, and was blown away by how polished everything felt. For the first time, the web didn’t seem so far away.
The CMS Dilemma: Choosing Ghost
At first, I thought about using Markdown files or Keystatic CMS for managing content. But I quickly realized I wanted something more intuitive—a proper writing interface with tags, scheduling, and maybe even a dashboard.
That’s when I revisited Ghost CMS.
I remembered how clean and focused Ghost’s editor was. No clutter, no extra features I didn’t need. And most importantly, it could be used headlessly—just the content API, no frontend rendering. That fit perfectly with my Astro setup.
Installing Ghost with Coolify
Now came the tricky part: hosting Ghost myself.
I didn’t want to pay for a hosted plan or manage all the moving parts manually. So I turned to a tool called Coolify—a self-hosted platform that makes it super easy to deploy apps like Ghost, databases, or even full stacks.
I set up a free oracle cloud VPS, installed Coolify, and with just a few steps, I had Ghost running with HTTPS, a custom domain, and a neat dashboard to manage it all. No command-line gymnastics, no Ghost CLI—just point, click, and configure.
When I opened the Ghost admin panel for the first time on my domain, it felt like magic. This wasn’t just a static HTML page anymore—I had a real CMS running in the background.
Wiring It All Together: Ghost + Astro
To connect Ghost to Astro, I used a package called astro-ghostcms-loader
. This loader fetches all your posts from Ghost’s Content API at build time and makes them available in Astro’s routing system.
I configured it with my Ghost URL and API key, and just like that—I could query blog posts from my CMS directly into my static site. I created a blog page, then added a dynamic route using [slug].astro
to generate individual post pages.
When I saw my first post from Ghost render perfectly inside the Astro template, I felt a weird sense of pride—like two worlds I never thought would meet had just clicked.
Deployment: Hello, Cloudflare Pages
With everything working locally, it was time to go live.
I chose Cloudflare Pages because it’s fast, free, and designed for JAMstack sites like this one. There was only one hiccup: I had initially set up my Astro project using pnpm
, but Cloudflare expects npm
. So I reinstalled my dependencies and made sure the package.json
was clean.
Once I pushed my repo to GitHub and connected it to Cloudflare, everything just worked. The build passed, the site deployed, and within minutes, vinayreddy.in was live.
It wasn’t just a blog—it was a full stack I had stitched together, piece by piece.
What I Learned Along the Way
Looking back, this project taught me a lot—mostly that the web isn’t as scary as I thought. Yes, I had to learn some new things: how dynamic routing in Astro works, how to deal with API keys securely, how to serve content through an API.
But I also realized how powerful modern tools have become. Astro’s simplicity, Ghost’s writing experience, and Cloudflare’s global CDN make it possible for someone like me—without frontend experience—to build something polished and performant.
What’s Next for vinayreddy.in
This is just the beginning. Now that the foundation is solid, I’m planning to:
- Add a search feature for finding posts more easily.
- Launch a dedicated travel section, filtered by Ghost tags.
- Improve SEO with Open Graph images and structured data.
- Write a follow-up guide on how I hosted Ghost on a free VPS using Coolify.
There’s so much more I want to build, and this site is my playground for all those experiments.
Final Thoughts
I didn’t set out to become a web developer—I just wanted a space to write. But in the process of building that space, I’ve picked up tools and techniques I never thought I’d use.
So if you’re like me—more comfortable writing C than CSS—but you’re curious about the web, I hope this story shows that it’s totally possible to build something real, meaningful, and entirely yours.
You can check out my blog at vinayreddy.in and follow along as I keep learning, experimenting, and sharing what I discover.