← Volver al blog

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.

Welcome to the blog

For years my portfolio was a static business card: projects, experience, contact. Useful, but incomplete. There's a lot that doesn't fit in a list of technologies or a project description.

This blog is the space for everything else.


What you'll find here

Content will revolve mainly around frontend and the real work of building interfaces:

  • Animation techniques with Motion and GSAP
  • Vue 3 and Nuxt patterns I use in production
  • Web performance: what to measure, what to optimise, and when to stop obsessing over it
  • TypeScript applied to concrete problems
  • Thoughts on frontend architecture and design decisions

I'm not here to write "hello world" tutorials. I'm interested in non-obvious decisions, real trade-offs, and things I learn while solving problems in actual projects.


The blog stack

The blog is built with Nuxt Content v3, which stores articles as Markdown and serves them from an embedded SQLite database via WebAssembly. Syntax highlighting is handled by Shiki, and custom components are regular Vue components inside MDC content.

The code actually running in production to fetch articles — including the language filter and reactive key so the list refreshes when switching between EN and ES — looks like this:

const { lang } = useI18n()

const { data: posts, refresh } = await useAsyncData(
  () => `blog-posts-${lang.value}`,
  () => queryCollection('blog')
    .where('lang', '=', lang.value)
    .order('date', 'DESC')
    .all()
)

watch(lang, () => refresh())

The decision to use Nuxt Content over an external CMS was deliberate: articles live in the same repository as the code, with full version control and no external runtime dependencies.

What the documentation doesn't mention: Nuxt Content v3 runs SQLite on WebAssembly client-side, which requires opening the Content Security Policy to allow 'wasm-unsafe-eval' in script-src. It's not obvious until client-side navigation silently breaks in production. The kind of friction that turns "I'll have this up in a day" into a few hours of debugging — and exactly the sort of thing I want to write about here.


Frequency

I'm not going to commit to publishing every week. I'd rather write when I have something worth saying than force content to maintain an arbitrary cadence.

If you want to stay in the loop, the most direct way is to reach out at hola@miguel-jimenez.dev.