Engineering
Building In Public
January 1, 2026

The Stack Behind Joyful

Koh-Bong Choi

Most startups build for speed. We built Joyful for soul.
Behind every delightful tap and seamless flow in Joyful lies a deeply intentional stack—not just a technical foundation, but a product philosophy. In this post, I’ll walk through the choices we made, the tools we love, and why building with care beats chasing trends.

Databases

We chose Postgres as our primary database. Most CRMs and SEPs are inherently relational, and Postgres gives us the best of both worlds: the structure and power of SQL, and the flexibility of a document model via jsonb fields. It’s a battle-tested, elegant solution that should be the default for most early-stage startups.

For caching and background jobs, we rely on Redis Cloud. It’s blazing fast, stable, and—importantly—boring in the best way. We don’t need to think about it. It just works.

Down the road, we plan to layer in Elasticsearch to distribute reads and power more complex search, but for now we’re caching into jsonb to reduce joins and keep query performance sharp.

Frontend

We built our client-side applications in Vue 3, using Vue Router and Pinia for state management.

Yes, React has the larger ecosystem—but Vue has always had my heart. It's intuitive, elegant, and genuinely a joy to work with. Pinia, in particular, feels like the state management system I wish I had in every framework: minimal boilerplate, predictable behavior, and just enough structure to scale well.

Backend

Our backend runs on Node with Fastify, forming our primary private API layer.

We chose Fastify for its speed and extensibility, and Node for its massive ecosystem and familiarity. Together, they let us move quickly without compromising flexibility. The developer experience is clean, and the performance has been everything we hoped for.

Workers

Our background workers run on Node using BullMQ. It’s a lightweight, reliable job queue built on top of Redis. We use it for everything from outbound email to sync tasks—anything that benefits from being decoupled from our main request cycle.