Blog
Vue 3 forms with Zod: one schema, client and server
How to validate forms in Vue 3 and Nuxt with a single Zod schema shared between browser and API — no form library, and no duplicated rules that quietly drift apart.
Testing Vue 3 components: what deserves a test and what does not
How to test Vue 3 components with Vitest without ending up with a brittle suite: what to cover, what to ignore, and why composables belong in their own tests.
Web Performance in Nuxt 3: where the wins actually are
Rendering strategies in Nuxt 3 (SSR, SSG, ISR) and how to attack LCP, CLS and INP with routeRules, self-hosted fonts and images. Based on the real decisions behind this portfolio.
Advanced TypeScript in Vue 3: types that actually help
How to get real value from TypeScript in Vue 3: typed props with interfaces, generic composables, utility types in practice, and MaybeRefOrGetter. No `any`, no unnecessary casting.
API Data Access in Vue 3: From Chaos to Hexagonal Architecture
How to structure API data access in Vue 3 and Nuxt 3 using hexagonal architecture (ports & adapters): layer separation, server-free testing and code that survives backend changes.
Microfrontends: when they make sense and when they don't
An honest analysis of microfrontend architecture: integration patterns, real costs, and the criteria I use to decide whether to adopt them on a project.
Smooth Animations in Vue 3 with Motion
How to implement high-performance animations in Vue 3 using Motion: from simple fade-ins to complex gestures and scroll-based animations.
Welcome to the blog
Why I added a blog to the portfolio and what kind of content you will find here: thoughts on frontend, Vue, performance, and day-to-day engineering work.