Proyecto del día
El IDE con IA local en el navegador. Un caso nuevo cada día, contando lo que se puede hacer con IA que vive dentro de tu navegador.
La 1.10 salía como más antigua que la 1.9, y el aviso de actualización se quedó callado
Lucía hizo un comparador de versiones de veinte líneas para el aviso de «hay una versión nueva» de una herramienta interna. Funcionó hasta que llegó la 1.10. Así lo arregló con la IA en el navegador, sin sacar de su máquina unas etiquetas de versión que todavía no eran públicas.
Leer el caso →Mi slugify convertía «Año nuevo en Málaga» en «ao-nuevo-en-mlaga»
Una utilidad de cinco líneas para generar URLs, un regex que se comía las letras con tilde y un modelo local que ayudó a arreglarlo sin que el código saliera del navegador.
Leer el caso →Mi regex de DNI daba por bueno 12345678A, y la letra correcta es la Z
Un validador de DNI y NIE de veinte líneas, hecho en el IDE del navegador con la IA en local. La regex comprobaba el formato, pero la letra de control no la comprobaba nadie.
Leer el caso →El 29 de diciembre caía en la semana 1 de 2026 y mi informe semanal lo partía en dos
Una utilidad de 15 líneas para numerar semanas, un lunes de diciembre que pertenece al año siguiente y un asistente local que ayudó a encontrar el fallo sin que el código saliera del navegador.
Leer el caso →La copia de las 2:30 iba a ejecutarse dos veces este domingo
Elena cambió el cron de la gestoría por una utilidad en JavaScript y la primera versión aguantaba bien hasta el cambio de hora. Con el asistente local encontró los dos agujeros de esa noche: una hora que se repite y otra que no existe.
Leer el caso →El alquiler era de 1.500 euros y mi app de gastos lo apuntó como 1,5
Lucía se hizo una utilidad para repartir los gastos del piso. Sumaba bien todo menos el importe más grande, y el arreglo evidente estropeaba los demás.
Leer el caso →Pulsé deshacer y la tarea volvió, pero sin sus etiquetas
Inés añadió Ctrl+Z a un tablero de soporte con una copia del estado de toda la vida. Funcionó en todas las pruebas hasta que una tarea marcada como «urgente» volvió del historial sin ninguna marca.
Leer el caso →Álvarez salía detrás de Zamora, y al arreglarlo Peña y Pena se volvieron la misma nadadora
Lucía solo quería sacar ordenada por apellido la lista de dorsales del club de natación. El primer arreglo ordenó bien la lista y, de paso, hizo desaparecer a una niña cuando se abría en un navegador en inglés.
Leer el caso →Recorté la vista previa a 80 caracteres y al emoji de la familia le faltaba la hija
Una función de diez líneas para truncar mensajes, tres arreglos que parecían definitivos y una lección sobre lo que JavaScript llama «carácter». Con mensajes reales de un club de montaña como banco de pruebas.
Leer el caso →El comando llevaba una tubería y la tabla de Markdown se partió justo ahí
Lucía montó en una tarde una vista previa para las tablas de sus runbooks. El primer arreglo dejaba la tabla bonita y equivocada: no se parecía a la que publicaba GitHub.
Leer el caso →El pomodoro marcaba 25 minutos y sonó a los 31
Marta se hizo un temporizador en una tarde. Mientras lo miraba iba perfecto; cuando se iba a otra pestaña a trabajar, empezaba a llegar tarde. El fallo no estaba en la cuenta, sino en lo que estaba contando.
Leer el caso →Punteros en C, en C++ y en C#: tres artículos y una sola URL
Marta escribió un generador de slugs en diez líneas. Funcionaba con tildes y eñes, hasta que tres títulos distintos acabaron en la misma dirección y el último se comió a los otros dos.
Leer el caso →Sumé un mes al 31 de enero y la renovación cayó el 3 de marzo
Una utilidad de fechas de veinte líneas para calcular renovaciones de cuotas. Funcionaba todos los días del año, menos los que acaban en 29, 30 y 31.
Leer el caso →La caché fallaba con las llamadas repetidas y acertaba con dos que no lo eran
Un memoize de nueve líneas con la clave hecha a base de JSON.stringify. Cero aciertos cuando tocaba acertar, y un acierto silencioso cuando tocaba fallar.
Leer el caso →El «copiar como cURL» contestaba 200 y se dejaba los apóstrofos por el camino
Un botón de dos líneas para pegar peticiones en la terminal. El comando se ejecutaba sin una queja, el servidor decía que todo bien y el nombre llegaba sin apóstrofo.
Leer el caso →La gráfica caía a cero todos los sábados y no había caído nada
Un componente de línea casero, treinta días de datos y un dientes de sierra perfecto que me creí dos días. El hueco del fin de semana se estaba dibujando como un cero.
Leer el caso →La contraseña llevaba una almohadilla y mi parser de .env la cortaba justo ahí
Un 401 en preproducción, un fichero de variables y una utilidad de diagnóstico que mentía. Lo curioso: el bug solo aparecía con el fichero real, el que no puedes pegar en ningún sitio.
Leer el caso →Después de formatear, la consulta seguía siendo válida y devolvía cero filas
Un formateador de SQL de una tarde, escrito en el IDE del navegador. El fallo no daba error: colaba un salto de línea dentro de un literal y cambiaba lo que la consulta buscaba.
Leer el caso →El CSV tenía 1.200 filas y mi parser contaba 1.237
Un export de clientes con direcciones y notas internas rompió el parser más simple del mundo: el que parte por saltos de línea. Lo arreglé en el IDE del navegador, sin que el fichero saliera del portátil.
Leer el caso →Grabé el atajo, el editor lo mostró bien y nunca volvió a disparar
Un grabador de atajos de teclado para una paleta de comandos: lo que aparecía en pantalla era exactamente lo que yo había pulsado, y aun así la combinación no volvía a funcionar nunca más.
Leer el caso →El tooltip se cerraba justo cuando ibas a pulsar el enlace de dentro
Un tooltip con un enlace dentro: aparecía al pasar el ratón, desaparecía en cuanto movías el ratón hacia él. Veinte líneas de componente y tres días de ideas malas.
Leer el caso →El «…» del paginador escondía una sola página: la 2
Un listado se quedó en cinco páginas y los puntos suspensivos se tragaron la 2. Arreglarlo fueron catorce prompts con la IA mirando el componente de verdad, sin que nada saliera del portátil.
Leer el caso →El 4 y el 4 hacían 8, y ese 8 volvía a fusionarse en la misma jugada
Un 2048 de una tarde en el IDE del navegador. Se movía, puntuaba y aun así la partida salía rarísima de fácil: el fallo cabía en una fila de cuatro números.
Leer el caso →Borrabas un cero en medio del importe y el cursor saltaba al final
Un campo que formatea los miles mientras escribes, para el panel de facturación de una asesoría. Escribiendo de izquierda a derecha iba perfecto. Corrigiendo, era inusable.
Leer el caso →La segunda L salía en amarillo, y en la palabra solo había una
Un clon del juego de las cinco letras montado en una mañana de sábado. La rejilla y el teclado fueron lo de menos: el bug estaba en cómo se pintan las letras repetidas.
Leer el caso →«Fuerte»: el medidor de contraseñas que premiaba lo más fácil de adivinar
Un formulario de alta marcaba como segura la contraseña más repetida de una fuga real, y la única forma de probarlo era con esa fuga delante, sin que saliera del portátil.
Leer el caso →La factura número 14 salió dos veces
Dos pestañas abiertas al mismo tiempo, un contador que no era atómico, y una ley que no admite duplicados: así se depuró con datos fiscales reales sin que salieran del portátil.
Leer el caso →Escribió «urgente» rápido y la pantalla le enseñó los resultados de «urg»
Dos peticiones de red competían por pintar la pantalla, y no ganaba la más nueva: ganaba la que respondía más tarde.
Leer el caso →«Máximo 10 MB» y rechazaba un archivo de 9,7 MB
La interfaz decía un número y el validador comparaba otro. Ninguno de los dos estaba mal: estaban divididos por cosas distintas.
Leer el caso →Los porcentajes sumaban 101 y ninguno estaba mal redondeado
Cinco categorías en la leyenda de una gráfica, cada porcentaje bien calculado, y un total imposible. El arreglo no era redondear mejor: era repartir.
Leer el caso →Diez llamadas por minuto, y el proveedor vio veinte en dos segundos
El contador nunca pasó de diez. El limitador estaba bien escrito. El problema era dónde empezaba el minuto.
Leer el caso →El desplegable ponía la 1.10.0 antes que la 1.9.0, y el orden estaba «bien»
Un panel interno de releases llevaba medio año ordenando mal sin que nadie lo notara. Arreglarlo del todo no fueron quince líneas: fue una tabla de casos hecha con los tags de verdad.
Leer el caso →El verde y el azul daban el mismo contraste, y uno no se leía
Once colores de una marca aún sin anunciar, cuarenta parejas que revisar y una fórmula que parecía razonable. Hasta que dos celdas de la tabla sacaron la misma nota.
Leer el caso →El diff decía catorce cambios y solo uno era de verdad
Comparar la configuración de staging con la de producción parecía cosa de cinco minutos. Lo difícil no fue recorrer el objeto: fue decidir qué cuenta como cambio.
Leer el caso →Parecía barajado: el mazo empezaba siempre por las mismas tarjetas
Un modo repaso hecho en una tarde. El azar era de mentira y no se veía a ojo: hizo falta contar cien mil barajados para que el sesgo apareciera en una tabla.
Leer el caso →El panel decía «una vez al mes» y el job iba cada lunes
Traducir una expresión de cron a una frase en español parecía cosa de una tarde. Los cinco campos, sí. La semántica, no.
Leer el caso →«Caduca el 1 de enero de 1970»: el decodificador de JWT de una tarde
Una utilidad de cuarenta líneas para leer tokens sin pegarlos en una web ajena. El split por puntos fue lo fácil; los acentos y el 1970, no.
Leer el caso →«¿Se puede deshacer?»: Ctrl+Z iba letra a letra, y al arreglarlo se tragó medio formulario
Un constructor de formularios interno, una petición que parecía de veinte minutos y una pila de deshacer que agrupaba por reloj cuando tenía que agrupar por intención.
Leer el caso →El formateador de JSON que redondeaba los IDs sin avisar
Pegabas la respuesta de la API, la veías bonita e indentada… y un pedido de 19 dígitos volvía con los últimos tres cambiados. Nada petaba.
Leer el caso →La previsualización cortaba a 140 caracteres y de la bandera quedó media letra
Truncar un comentario para una tarjeta parecía cosa de media hora. Luego llegaron los emojis, y el único banco de pruebas que servía eran comentarios reales de usuarios.
Leer el caso →El buscador del desplegable encontraba de todo menos lo que buscabas
Un filtro de catálogo que pasó de no encontrar nada a encontrarlo todo. El trabajo de verdad no fue buscar: fue ordenar, y para eso hacían falta las consultas reales de gente que no trabaja en mi empresa.
Leer el caso →La regex pasaba veinte ejemplos y colgaba la pestaña con el ventiuno
Sacar pares clave = valor de un fichero de configuración heredado. Diez líneas de JavaScript, una expresión regular… y un cuelgue que no daba error, solo silencio.
Leer el caso →El validador de IBAN daba por malas cuentas buenas (y el algoritmo estaba bien)
Veinticuatro caracteres, una división entre 97 y un número que JavaScript redondea por detrás. Una utilidad de treinta líneas que solo se arregla con los datos que no puedes enseñar a nadie.
Leer el caso →El bug no estaba en el arrastre: estaba en el índice
Una lista reordenable para el panel interno de un cliente. Arrastrar hacia arriba iba bien; hacia abajo, el elemento caía siempre una posición antes. La culpa era de tres líneas.
Leer el caso →El redactor de logs que solo podías escribir teniendo los logs delante
Un filtro de doscientas líneas para tapar datos personales antes de mandar una traza a soporte. Lo incómodo es que, para probarlo, hacía falta justo aquello que no puedes enseñarle a nadie.
Leer el caso →La ñ, el slug y cuatrocientas URLs que ya no podías tocar
Una función slugify de diez líneas para el CMS interno de una consultora. El bug estaba en la ñ; el trabajo de verdad estaba en todo lo que ya se había publicado.
Leer el caso →La gráfica no se rompía con datos raros: se rompía con datos planos
Un sparkline de cuarenta líneas, una serie sin ninguna venta y un SVG que desaparecía sin avisar. Lo que aportó la IA local no fue el componente: fue la lista de series que lo tumbaban.
Leer el caso →Vencimientos a 60 días: la utilidad de fechas que iba a costar diez minutos
Un módulo de facturación bajo NDA, tres cláusulas de pago y una función de sumar meses que mentía. El caso de hoy se escribió entero en el IDE del navegador, con el modelo corriendo en local.
Leer el caso →Un mini-lenguaje de reglas en una tarde: el parser fue lo fácil, la precedencia no
Escribir un evaluador de condiciones de descuento para un backoffice, con la IA al lado. El bug estaba en la tabla de precedencias, y el prompt llevaba dentro la estrategia de precios del trimestre.
Leer el caso →El parser de CSV que solo sale bien si le enseñas las filas de verdad
Una exportación de facturas del ERP de un cliente, cuatro mil líneas y todos los casos raros a la vez. La diferencia entre un parser de manual y uno que funciona está en pegar el fichero real — y ahí es donde normalmente te frenas.
Leer el caso →