Skip to main content

Blog

Sobre desarrollo web, rendimiento, herramientas — y de vez en cuando algo más grande.

iOSSafariWebKitLexicalcontenteditableDebugging

Cuatro bugs mataban la selección de texto en iOS — y cada uno escondía al siguiente

Un editor Lexical dentro de un drawer de vaul funcionaba en todas partes menos en un iPhone real: los tiradores de selección no se arrastraban, el scroll se bloqueaba en los bordes, la barra de herramientas se hundía bajo el teclado. Adivinar no arreglaba nada, porque no había un único culpable — eran cuatro independientes, y cada uno enmascaraba al siguiente. Lo que funcionó fue un banco de bisección: el mismo esqueleto con un interruptor por sospechoso, probado en un dispositivo físico. Esta es la cacería completa — el href que envenena la selección, los drag handlers de vaul, nuestro propio tap-focus, un contenedor que se mueve bajo el dedo — más la autopsia del bloqueo de scroll y las tres escrituras únicas de scrollTop que hicieron que el rubber-band se sintiera nativo, incluida la captura de un swipe en plena rebote.

5 de septiembre de 202615 min de lectura
Leer artículo
Claude CodeAICLIBashAutomationResilience

Una cascada de agentes: la terminal elige el que está vivo

Cuando Claude falló en parte y algunos modelos dejaron de responder, intenté pasarme a Gemini — y descubrí que mi respaldo llevaba meses roto. Así se construye uno que de verdad aguante.

29 de agosto de 20269 min de lectura
Leer artículo
Claude CodeAIAutomationMonitoringlaunchdResilience

system-droid: un guardián que revisa y repara mis sistemas por sí solo

Mis servicios locales morían en silencio: el informe matinal no llegaba, los tokens caducaban, la copia de seguridad se congelaba. Así que construí un droide sobre launchd que lo revisa todo cada dos horas, repara con un agente Claude lo que es seguro y me escribe solo cuando de verdad hace falta un humano.

17 de agosto de 202610 min de lectura
Leer artículo
Next.jsA/B TestingProxyPerformanceSSG

Una página estática que en secreto es un test A/B

Un test A/B suele montarse de forma que la página se cae del CDN a un render por petición. No tiene por qué. Mantén cada variante totalmente estática y deja que un proxy (el middleware renombrado de Next.js) resuelva la asignación con una plataforma de experimentos, según un device id estable — y reescribe solo cuando el visitante no está en el control. La URL nunca cambia, el CDN sigue cacheando y el camino habitual no cuesta nada.

14 de agosto de 20268 min de lectura
Leer artículo
VercelGitHub ActionsCI/CDDeploymentMonorepo

Desplegar en Vercel desde CI cuando quien commitea no es del equipo

Mueve un repo a una organización de GitHub y Vercel empieza a bloquear tus despliegues en silencio: el commit «no se pudo asociar a un miembro del equipo». Así despliego desde GitHub Actions con la CLI de Vercel: mis commits siguen contando en mi propio gráfico de GitHub, el panel sigue mostrando quién hizo push, y no pago un asiento por cada colaborador.

10 de agosto de 20268 min de lectura
Leer artículo
Next.jsMemory LeakDockerAWS LambdaNode.js

Next.js Memory Leak: Fetch + Modo Standalone — 2 años sin solución

Next.js parchea el fetch global y añade una capa de caché que pierde memoria en cada petición. En Docker/K8s esto causa crashes OOM cada pocas horas. El bug existe desde Next.js 14 y sigue sin resolverse en 16.2.x.

Actualizado 10 de agosto de 202610 min de lectura
Leer artículo
claude-codeproductivityclidevtools

Múltiples cuentas de Claude Code en un dispositivo

Cómo usar dos (o más) cuentas de Claude Code en paralelo — personal y corporativa — con aislamiento total usando una sola variable de entorno.

Actualizado 9 de agosto de 20264 min de lectura
Leer artículo
SolidJSSolidStartPerformanceSSGCode Splitting

Carga diferida del contenido del blog en SolidStart sin perder el SSG

Tu blog probablemente entrega el cuerpo de cada artículo en un único bundle — el mío había crecido hasta 2,88 MB, y se descargaba incluso en la página de índice, donde solo necesitas los títulos. Así dividí la prosa de cada artículo en un chunk diferido que carga bajo demanda, manteniendo cada página renderizada por completo en el servidor para el SEO.

5 de agosto de 20268 min de lectura
Leer artículo
ailearningcareermethodology

CRAFT: un método para usar AI sin perder tu ventaja profesional

Nombrar un problema sin ofrecer una solución solo siembra ansiedad. Tras el artículo sobre la descualificación por AI, aquí está la prescripción: CRAFT — cinco principios (Challenge First, Review Adversarially, Ask Why Not What, Friction on Purpose, Test Your Understanding) bajo un solo axioma: AI hace lo que ya dominas; tú haces lo que todavía estás aprendiendo. Un método práctico y fácil de recordar para usar AI cada día sin perder habilidades sin darte cuenta.

Actualizado 5 de agosto de 20266 min de lectura
Leer artículo
JavaScriptAnalyticsEvent DelegationServer ComponentsPerformance

Un listener en lugar de un componente cliente por botón

En cuanto añades analítica de clics a un componente, este se convierte en un componente cliente que envía JavaScript. Haz eso a lo largo de todo un sitio y solo el tracking infla tu bundle. Aquí está la alternativa que ha estado en la plataforma desde siempre: un único listener delegado, atributos de datos declarativos y componentes que siguen siendo HTML puro renderizado en el servidor.

28 de julio de 202610 min de lectura
Leer artículo
CSSHTMLAccordionFrontendPerformance

Un acordeón fluido con cero JavaScript

Todo el mundo recurre al estado de React y a un hook que mide la altura para construir un acordeón. El navegador incluye uno nativo desde hace años — y desde 2024 anima la apertura y el cierre con CSS puro. Aquí tienes la técnica completa: details[name], ::details-content, interpolate-size y la única propiedad que también anima el cierre.

28 de julio de 20269 min de lectura
Leer artículo
JavaScriptWebThird-Party ScriptsFrontendPatterns

Captura un valor de terceros en el instante en que llega a window

Un script que no controlas escribe su resultado en un global de window en un momento que no puedes predecir. La mayoría del código compite contra él con un timeout o desperdicia el main thread haciendo polling. Aquí está el truco de accessor property que convierte la escritura en un evento — además del getter que no debes olvidar, y cómo sustituir el valor por completo.

27 de julio de 20269 min de lectura
Leer artículo
CSSContainer QueriesTypographyFrontendPerformance

Ajusta el texto a su contenedor con CSS puro — sin JavaScript

Todo el mundo escribe un hook de JavaScript para reducir el font-size hasta que el texto quepa en un contenedor. Aquí tienes una alternativa totalmente funcional y sin JS usando unidades de container query, clamp() y separación silábica según el idioma — incluida la trampa de la cascada que hace que la gente se rinda.

24 de julio de 202611 min de lectura
Leer artículo
Next.jsPerformanceCode SplittingTurbopackReact Server Components

next/dynamic no te salvará: por qué las páginas de Next.js gestionadas por CMS envían todos los chunks

Nuestras páginas de Next.js gestionadas por CMS enviaban los ~100 componentes de sección en cada ruta, pese a un uso de next/dynamic de manual. Agotamos todos los arreglos a nivel de bundler (import() directo, división de archivos, configuración de Turbopack, splitChunks de webpack) antes de encontrar la causa real: la alcanzabilidad, no el chunking. La generación de código en tiempo de build más rewrites recortó el JS de primera carga en un 53%.

18 de julio de 202614 min de lectura
Leer artículo
obsidianmiroautomationtoolsopen-source

Saco mis tableros de Miro y los llevo a Obsidian

El botón Export de Miro te da un PNG o un PDF — una foto de los datos, no los datos. Si tus tableros son load-bearing maps of thinking acumulados durante años, su sitio es Obsidian: editables, searchable, en un vault local. Cómo saqué los boards de Miro vía REST API y los convertí a Excalidraw / Obsidian Canvas — conservando posiciones, colores, fuentes, curved connectors, mindmap nodes — y la lección va más allá de Miro: a todo SaaS hay que mirarlo con un exit plan ANTES del primer uso.

30 de junio de 20266 min de lectura
Leer artículo
claude-codeproductivityclidevtools

Claude Code Multi-Profile, v2: una arquitectura XDG limpia

Después de un mes con el enfoque viejo basado en alias, rehíce mi setup multi-profile de Claude Code a una estructura compatible con XDG bajo ~/.config/claude-profiles/. La razón real no fue el orden — fue descubrir que ~/.claude.json es un archivo separado en el home root donde vivían silenciosamente los servidores MCP añadidos con --scope user.

Actualizado 23 de junio de 20269 min de lectura
Leer artículo
ailearningcareerengineering

El silencio que apagó la AI

¿Vale la pena seguir aprendiendo a programar si existe la AI? La respuesta ruidosa es errónea por ambos lados. Con la base de evidencia de 2025–2026 (Nature, Anthropic, AI & Society) la pregunta no es "AI o no", sino qué habilidades cederle a la AI y cuáles guardar para ti — y hay una cosa que sí cambió: antes la realidad te obligaba a aprender por fricción, la AI apagó ese empujón en silencio.

22 de junio de 20268 min de lectura
Leer artículo
claude-codeagentsaiprompt-engineeringautomation

Cómo escribir agentes de Claude Code que no te mientan

Dos reglas para construir pipelines de agentes de Claude Code fiables: un agente por especialización, y comandos de shell en lugar de prompts en todo lo que requiera respuestas cuantitativas.

29 de mayo de 20266 min de lectura
Leer artículo
ObsidianClaudeMCPAutomationAI

Cómo conectar Claude Desktop a Obsidian — Un viaje a través de 4 servidores MCP

Una historia real sobre la búsqueda de una forma estable de automatizar el refactoring del vault de Obsidian vía Claude. Qué se rompió, qué funcionó, y por qué VaultForge resultó ser la única opción funcional.

3 de mayo de 20269 min de lectura
Leer artículo
physicsphilosophyconsciousnessblack-holescosmology

Agujeros negros como universos recursivos: de la física al propósito de la existencia

¿Y si cada agujero negro es un Big Bang de un nuevo universo? Una exploración de la cosmología recursiva y el cierre cognitivo.

17 de abril de 202610 min de lectura
Leer artículo
aicmsweb-developmentopinionworkflow

La IA mató al CMS — al menos para sitios simples

Por qué los sistemas de gestión de contenido tradicionales se están volviendo innecesarios para portfolios, blogs y landing pages.

17 de abril de 20268 min de lectura
Leer artículo
ObsidianPerplexityMCPAIProductivity

Cómo conectar Perplexity AI a Obsidian vía MCP — Notas directas desde el chat

Configura Perplexity Desktop para leer y escribir tu Obsidian vault usando el servidor MCP filesystem. Investiga en la web y guarda en tus notas en una conversación.

12 de abril de 20265 min de lectura
Leer artículo
Claude CodeAIObsidianAutomationProductivity

Digest Diario de Noticias AI con Claude Code CLI y Obsidian — Cero Dependencias

Cómo construí un agente diario de investigación de noticias con un script bash de 6 líneas, modo headless de Claude Code y macOS launchd.

12 de abril de 20267 min de lectura
Leer artículo
next.jsreact-19dark-modezustandperformance

Next.js Dark Mode sin parpadeo ni advertencias de React 19

Cómo reemplazar next-themes con Zustand + useServerInsertedHTML para modo oscuro sin parpadeo en Next.js 15+.

11 de abril de 20268 min de lectura
Leer artículo
Next.jsCSSPerformanceTurbopackSCSS

Cómo eliminé 94 archivos CSS que bloquean el renderizado en Next.js 16 con una característica poco documentada de Turbopack

Después de días probando cada enfoque — desde experimental.inlineCss hasta hacks con MutationObserver — descubrí Turbopack Import Attributes que resuelven el problema de CSS que bloquea el renderizado en Next.js App Router.

8 de abril de 202612 min de lectura
Leer artículo