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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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%.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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+.
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.