GörenLabs
Back to journal

Journal note

EngineeringToolsProcess

The Stack I Build With

A look at the tools and technologies behind every GörenLabs project. Why I chose them and how they work together.

The stack I build with

People ask me what technologies I use. The honest answer is that the stack matters less than the reasoning behind it. But the tools still shape the work, so here is what I reach for and why.

Nuxt and Vue

Every project starts with Nuxt. It gives me server-side rendering, file-based routing, and a component model that scales from a landing page to a full application. Vue underneath is clean and predictable. I never fight the framework.

Nuxt also handles the parts that used to require separate tooling: SEO meta, image optimization, content management, internationalization. The module ecosystem is strong enough that I rarely need to build infrastructure from scratch.

TypeScript

Everything is typed. Not because I enjoy configuration, but because TypeScript catches the mistakes I would otherwise find at three in the morning. It also makes code self-documenting. When I revisit a project months later, the types tell me what the original intent was.

Tailwind CSS

I use Tailwind for styling. It keeps the design system visible in the markup and eliminates the drift between design intent and implementation. When every spacing value, color, and font size lives in a shared configuration, consistency becomes automatic instead of aspirational.

Custom CSS still appears when I need precise animation control or complex layout behavior. But the foundation is always Tailwind.

GSAP

For motion, GSAP is the standard. ScrollTrigger handles scroll-based reveals. The timeline API gives me frame-level control over sequenced animations. Performance stays solid even with dozens of animated elements on screen.

I use motion to clarify structure, not to decorate. A well-timed entrance tells the user where to look. A smooth transition protects spatial orientation. Animation without purpose is just distraction.

Convex

When a project needs a backend, I reach for Convex. It gives me a reactive database, server functions, auth, and file storage in one platform. The data model is TypeScript-native, so the types flow from the database all the way to the component without any translation layer.

What makes Convex different is real-time by default. Queries automatically update when the underlying data changes. That removes an entire category of state management problems and keeps the client simple.

Bun

Bun replaced Node for me. Faster installs, faster scripts, faster dev server starts. The difference is noticeable on every project, every day. It runs the same JavaScript and TypeScript without requiring changes to the codebase.

Deployment

For projects I run myself, I deploy through Coolify on my own infrastructure. It gives me Docker-based deployments with a clean interface, automatic SSL, and full control over the environment. Push to main, Coolify builds and deploys. No vendor lock-in, no surprise bills.

For client projects, the deployment target depends on their needs. But the principle stays the same: simple pipelines, no manual steps, no deployment anxiety.

Why this combination

These tools share a common quality: they stay out of the way. Each one solves a specific problem well and does not create new problems in the process. That is the only criterion that matters when choosing a stack.

The result is a workflow where I spend my time on the product, not on tooling. When a client sees the final result, they should feel the craft in the experience, not the complexity behind it.

© 2026 GörenLabsKennemerplein 6, 2011 MJ Haarlem