Getting Up and Running Again
After a brief hiatus, we’re back, motivated, and ready to make things happen. Personal challenges have kept me strapped for time and resources, but as they say, life finds a way. Now, with some of my biggest hurdles behind me, I can finally dedicate time to refining my coding practices and giving them a platform to shine — and that’s exactly what this blog is for.
My previous blog (RIP) was hosted on an AWS Lightsail instance running WordPress, with a Next.js frontend hosted on Vercel. Both platforms served me well, but I wanted to shake things up while minimizing costs. That led me to Hetzner, where I secured a VPS with twice the CPUs and eight times the RAM of my Lightsail instance — all for the same price. Despite some initial issues with SSH keys not making it to the server during setup, I resolved them via the cloud console and got SSH access configured correctly.
Once I had SSH access, I installed Coolify. And let me say, Coolify is aptly named — it’s genuinely cool. If you’re familiar with Docker and want a self-hosted experience comparable to Vercel or Heroku, Coolify is a game changer. Now, I can deploy containerized applications to my server effortlessly. Quick production deployments are essential to me. The longer a project remains confined to local development, the more likely I am to hit severe deployment issues later. The cost savings of moving away from AWS Lightsail to a VPS also mean I can afford to maintain a live production environment throughout development.
Coolify offers one-click deployments for databases and many popular apps, including WordPress, Strapi, and a new favorite — Ghost. I’m particularly excited for the future potential of Coolify, such as adding multiple servers, experimenting with Docker Swarm, and potentially leveraging Kubernetes once that integration is out of beta.
Since my primary objective was to get my blog running, I started by deploying Ghost and setting up my domain. That’s when I hit my first significant roadblock: Ghost doesn’t use modern frontend frameworks. Instead, it relies on Gulp, Express, and Handlebars.
For those entrenched in frontend development, this might sound like a step backward. Modern frameworks like React, Next.js, and Vue dominate the space, and I’ve spent years working in the React ecosystem. But here’s the thing — I’m not interested in building another headless CMS integration. My last blog used a headless WordPress setup with basic SEO enhancements, but that approach just isn’t motivating enough for a personal blog where the content, not the framework, should be the focus. Plus, Ghost already comes packed with SEO features, email integration, and more, so rebuilding all of that from scratch would be a waste of time and effort.
That decision led to a broader realization: React is for client-side apps. Sure, you can use it server-side with Next.js, but for a static blog with minimal interactivity, it’s overkill. Ghost provides robust, built-in templates with solid SEO optimization and useful integrations. Why rebuild that just to use a preferred framework? Especially when tools like Tailwind, DaisyUI, and GSAP are all accessible within plain HTML, CSS, and JavaScript.
Now, that wasn’t always the case. Until Tailwind 4.0, integrating Tailwind into a project required a build step with PostCSS and multiple @tailwind directives (@tailwind base
, @tailwind components
, @tailwind utilities
). Tailwind 4.0, however, introduced a single @import
statement: @import "tailwindcss";
. This update eliminates the build step and significantly simplifies integration. With DaisyUI 5.0 similarly aligned with Tailwind 4.0, getting both up and running in my Ghost theme was straightforward — just a few tweaks to the Gulp file and some quick package installations, and I was off to the races.
For years, I’ve relied on Tailwind, Framer Motion, and various component libraries like Bootstrap and Material UI. I love how these tools streamline the development process, allowing me to write CSS inline with templating logic and keep styling co-located with structure. But since Ghost doesn’t use React, Framer Motion is out — and that’s okay because (drumroll, please) GreenSock (GSAP) is now open source. With GSAP, Daisy, and Tailwind, I can now use my preferred UI tools without being locked into a modern JavaScript framework.
That’s where I’m at today. Over the next few days, I’ll continue updating my theme, deploying it to the site, and setting up essential features like email. Stay tuned for more posts as I refine my theme and explore what’s possible with Tailwind, DaisyUI, and GSAP within a non-framework setup. Thanks for reading, and happy coding!