← Volver al blog

Bienvenido al blog

Por qué he añadido un blog al portfolio y qué tipo de contenido encontrarás aquí: reflexiones sobre frontend, Vue, rendimiento y el trabajo del día a día.

Bienvenido al blog

Durante años he tenido el portfolio como una tarjeta de presentación estática: proyectos, experiencia, contacto. Útil, pero incompleto. Hay mucho que no cabe en una lista de tecnologías o en la descripción de un proyecto.

Este blog es el espacio para lo demás.


Qué encontrarás aquí

El contenido girará principalmente en torno a frontend y el trabajo real de construir interfaces:

  • Técnicas de animación con Motion y GSAP
  • Patrones en Vue 3 y Nuxt que uso en producción
  • Rendimiento web: qué medir, qué optimizar y cuándo no obsesionarse
  • TypeScript aplicado a problemas concretos
  • Reflexiones sobre arquitectura frontend y decisiones de diseño

No busco escribir tutoriales de "hola mundo". Me interesan las decisiones no obvias, los trade-offs reales y las cosas que aprendo resolviendo problemas en proyectos concretos.


El stack del blog

El blog está construido con Nuxt Content v3, que almacena los artículos en Markdown y los sirve desde una base de datos SQLite embebida vía WebAssembly. El resaltado de código lo hace Shiki, y los componentes personalizados son componentes Vue normales dentro del contenido MDC.

El código que corre en producción para obtener los artículos — incluyendo el filtro por idioma y la clave reactiva para que el listado se refresque al cambiar de ES a EN — es este:

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())

La decisión de usar Nuxt Content sobre un CMS externo fue deliberada: los artículos viven en el mismo repositorio que el código, con control de versiones completo y sin dependencias externas en runtime.

Lo que no cuenta la documentación: Nuxt Content v3 usa SQLite sobre WebAssembly en el cliente, lo que requiere abrir la Content Security Policy para permitir 'wasm-unsafe-eval' en script-src. No es obvio hasta que la navegación client-side falla en silencio en producción. Es el tipo de fricción que convierte un "lo monto en un día" en un par de horas de debugging — y exactamente el tipo de contenido que quiero escribir aquí.


Frecuencia

No me voy a comprometer a publicar cada semana. Prefiero publicar cuando tengo algo que vale la pena escribir que forzar contenido para mantener una cadencia arbitraria.

Si quieres estar al tanto, la forma más directa es escribirme a hola@miguel-jimenez.dev.