Rebuilding suddo.io — Goodbye Ghost, Hello Quarkus + Nuxt
Why the Rebuild
In the past month I went on a nightly sprint to reshape suddo.io. I started with a ready‑made UI to bootstrap fast, but it became clear that I needed full control over the stack, performance, and developer experience.
First, Leaving Ghost
Originally, suddo.io ran on Ghost CMS with Nginx in front. The first major decision was to move away from Ghost entirely—not just theming it. I needed tighter control over routing, rendering, API contracts, and deployment. That decision set the direction for everything that followed.
From Template to Custom
I initially tried the Pinx Vue.js Admin Template to get moving quickly. It helped with a few base components and some CSS. Then I rewrote almost everything: routes, server logic, data flows, and build setup. The result is a lean codebase that fits the product instead of the other way around.
State Management: Pinia Came Later
At first I avoided adding a state library to keep things simple. Only after migrating off Ghost and stabilizing the new app architecture did I adopt Pinia for shared state. This kept the early steps lightweight and let me introduce state patterns when the boundaries were clear.
What Powers suddo.io Now
Here’s the stack running today: - Backend: Quarkus — my favorite for fast startup, reactive options, and native‑friendly builds - Frontend: Vue 3 with Nuxt — file‑based routing, SSR/ISR flexibility, excellent DX - State: Pinia — added after the Ghost migration, once data flows were defined - Styling: Tailwind CSS — consistent design tokens and rapid iterations - Delivery: Single VPS — simple, controlled environment that I can tune end‑to‑end - Edge & Caching: Cloudflare — applied caching rules to take the load off the box and speed up global delivery
Why this combo?
- Ownership: No lock‑in to template internals. Every piece is transparent and changeable
- Performance: Quarkus + Nuxt SSR keeps TTFB low and rendering snappy
- Maintainability: Clear boundaries: API in Quarkus, UI in Nuxt, shared contracts where it matters
The Build & Deploy Flow
- Code in separate repos (backend/frontend) with shared API models
- Deploy to a single VPS with Nginx as a smart reverse proxy (HTTP/2, gzip/brotli)
- Edge tuned via Cloudflare: cache rules for static assets, stale‑while‑revalidate for HTML where safe
- Observability: basic logs/metrics, with room to expand
Challenges and Solutions
- Template Gravity: Prebuilt components were fast at first, but rigid later. Fix: replace incrementally, preserving only minimal CSS and a few primitives
- Caching Pitfalls: Getting HTML vs asset caching right is tricky. Fix: strict TTLs for HTML, long‑lived for assets with content hashes
- Resource Budget: A single VPS can be tight. Fix: aggressive asset optimization, SSR caching, and Cloudflare offload
What This Means for Readers
Faster page loads, a cleaner UI, and a platform that’s easier to extend with the content you asked for: reactions, comments, tutorials, tech news
What’s Next
- Content Velocity: more advanced topics (AI, DevOps, distributed systems)
- Scaling Path: containers and horizontal scale when traffic demands it
That’s the update. I thought a template would help me bootstrap—and it did—but the final product is a bespoke build. I first left Ghost, then brought in Pinia once the architecture settled. Now suddo.io runs on Quarkus + Nuxt + Tailwind on a single VPS, fronted by Cloudflare. Stay tuned.