La semana del scraper terco, la newsletter que se publica sola y un funeral para Langfuse
Sofi aprende a no creerse los mensajes de Classroom, Ganga24 estrena buscador, wishlist y newsletter en Brevo, y SixSeven monta su propia tubería de newsletter automatizada con Beehiiv. De paso, enterramos Langfuse sin ceremonia.
Hay semanas en las que se cierran muchas cajas a la vez y este ha sido el caso. Tres scrapers más educados, un buscador nuevo, una newsletter que se publica sola y el adiós definitivo a un stack que llevaba meses encendido sin que nadie lo mirara. Cero épica, mucho fontanero.
Sofi: el scraper que dejó de mentir
Sofi (el asistente que vigila Google Classroom para que un padre no tenga que abrir Classroom nunca más) llevaba semanas con un problema sutil pero molesto: duplicaba mensajes. Aparecía la misma tarea dos veces, el recordatorio se disparaba dos veces, y la cosa empezaba a oler a producto de juguete. El motivo era poco glamuroso: el google_message_id que usábamos como clave única no era estable entre ejecuciones, así que el deduplicador pensaba que cada scrape era contenido nuevo.
La FEAT-022 se llevó por delante esa historia en cinco olas. Wave 1 fijó un hash estable e invalidó la caché vieja. Wave 2 enseñó al scraper a hacer scroll del Stream hasta que la página se queda quieta, en vez de leer solo lo que cabía en la primera pantalla. Wave 3 metió alertas al admin con throttle (porque si algo falla a las 7:00, no necesito 40 emails idénticos a las 7:01) y una verificación post-login para detectar cuándo Google decide que hoy no toca dejarnos entrar. Wave 4 arregló el parsing real de fechas y resolvió el caso de los cursos paralelos de Mateo, que rompía la lógica de un crío con dos asignaturas con el mismo nombre. Wave 5 cerró con un script de migración idempotente para realinear las claves antiguas sin perder histórico, más tests offline para el hash y la migración. Detalle técnico que da gusto: el hash ahora se calcula con el mismo algoritmo en scraper, capa de persistencia y migración, y el test ofuscado lo demuestra; antes vivían tres versiones casi-iguales y por ahí entraba la divergencia.
De paso, dos hotfixes que merecen mención propia. Uno desactivó la creación automática de eventos en el calendario familiar de casa, que se había vuelto un poco hiperactivo creando recordatorios duplicados de cosas que ya estaban (perdón, Sara). Y otro reencauzó la descarga de adjuntos por HTTP a sofi-api en vez del lío anterior, que dejaba archivos huérfanos.
Además, SPEC-008 añadió eventos de timeline a Observio y métricas Prometheus, así que ahora cuando algo va raro en Sofi se ve dónde, no se intuye. Y de regalo, unificamos el naming SPEC-NNN → FEAT-NNN en todo el repo, porque tener dos convenciones a la vez es de las cosas que parecen inocuas hasta que te cuestan media hora explicando a un colaborador qué es qué.
Ganga24: buscador, wishlist y newsletter con preferencias
Ganga24 (el bot de Telegram que caza ofertas reales en Amazon) tuvo una semana de producto, no de fontanería. Tres FEATs cerradas:
- FEAT-023: migración de la newsletter de Resend a Brevo. Resend estaba bien, pero los límites de la cuenta gratuita estaban a punto de empezar a doler. Brevo da más margen, y de paso es donde ya viven los contactos de Ganga24, así que menos cuentas que mantener.
- FEAT-024: comando
/alerta, un Keepa conversacional dentro de Telegram. Le dices a Ganga24 "avísame si la Switch baja de 250€" y se acuerda. Suena obvio cuando lo cuentas; es lo que la gente lleva pidiendo desde el día uno. - FEAT-026: comando
/buscarcon filtros de calidad. No es buscar en Amazon (eso ya existe), es buscar dentro de las ofertas que Ganga24 considera buenas, que es muy distinto. Filtra ruido por ti. - FEAT-029: tracking UTM end-to-end, Worker + Telegram. Ahora sabemos qué fuente trae usuarios que de verdad usan los comandos, no solo los que entran y se van.
- FEAT-033: preferencias personalizadas para la newsletter. Cada suscriptor elige categorías, en vez de recibir el mismo digest masivo.
Cinco features de producto en una semana en un proyecto secundario es bastante, y honestamente solo es posible porque las specs se escriben antes y el agente que implementa no tiene que improvisar arquitectura a medianoche.
SixSeven: la newsletter que se publica sola
Esto es meta. La newsletter que estás (quizá) leyendo ahora pasó de "la escribo a mano el viernes" a publicación automática semanal en Beehiiv via GitHub Action y cron en el servidor. La primera versión usó la API de Beehiiv directamente, pero a mitad de semana descubrimos que el endpoint de publicar Posts requiere plan Enterprise — que no tenemos —, así que pivotamos a validate-only por API y publicación real vía Playwright automatizando el navegador. Después añadimos un publisher con Stagehand en paralelo para comparar fiabilidad de los dos. Sí, automatizar un navegador para publicar lo que la API podría hacer es feo. Pero pagar Enterprise para mandar una newsletter semanal es más feo.
De paso, una pasada de redacción para tachar detalles de infra y seguridad que se habían colado en entradas pasadas del journal. Nadie quiere descubrir que un journal público lleva tres meses contando dónde vive cada servicio.
Chordna y el funeral discreto
Chordna (enciclopedia musical con IA) recibió dos cosas pequeñas pero útiles: un fix para validar identidad antes de devolver una entrada cacheada (estaba sirviendo respuestas correctas pero atribuidas al artista equivocado en un caso borde, que es peor que devolver error), y una subida del cron cron-analyze-claude a 50 entradas por noche con un pool de seed de 180, porque el ritmo anterior dejaba el catálogo cojeando.
Y el funeral: Langfuse fuera. Lo apagamos en mayo, pero esta semana cerramos los dos sitios donde aún quedaba: el wrapper no-op en Sofi y la spec pendiente en Hezu. La excusa para tenerlo era "si algún día hay quejas reales de calidad LLM". No las hubo. Y la verdad es que cinco contenedores corriendo por si acaso es deuda.
Semana de menos brillo y más cierre. A veces es lo que toca.