Ir al contenido
storagebits

Doce minutos entre la idea y la tele

Cuatro días, seis proyectos, 159 commits. El tiempo entre «me gustaría» y «funciona en el aparato» se ha vuelto ridículo. Lo que aún frena soy yo, mis cables y mis cuotas.

15 min de lectura#devlog#agents#android-tv#esp32

Jueves 8 de octubre, 20:34. Envío un prompt de misión a un agente. A las 20:46, la hora aparece en grande en mi tele, con una tipografía que eligió el agente.

Cuatro días después: seis proyectos, 159 commits, unos 240 mensajes míos, buena parte de menos de cinco palabras. «go T8». «vas-y présente la tranche 3» [venga, enséñame el tramo 3]. «c’est fait, reteste» [hecho, prueba otra vez].

El tiempo entre la intención y lo concreto se ha vuelto ridículo. Doce minutos para la aplicación Almanak. Dieciséis para Lukarne. El cuello de botella ahora soy yo: mi sueño, mis cables, mis cuotas.

Cuatro días de commits, proyecto por proyectoUna fila por proyecto, del jueves 8 de octubre a las 19 h al lunes 12 a las 19 h. Cada trazo es un commit. El círculo vacío marca el primer mensaje al agente; el lleno, por encima de la fila, el primer resultado concreto. Las noches están sombreadas.vie. 9sáb. 10dom. 11lun. 12jue. 8Almanakjue. 20:34 · prompt de misión20:46 · la hora aparece en la tele12 min11Homelabjue. 21:19 · «¡vamos!»22:00 · doble autenticación activa en la pasarela41 min63Lukarnevie. 17:58 · prompt de misión18:14 · primera webcam en directo a pantalla completa16 min27DropboksTVdom. 15:18 · «lee el prompt y adelante»16:02 · emparejamiento logrado en la tele44 min12shot2cartdom. 20:13 · «forget about previous session»23:01 · foto → lista → enlaces de tienda2 h 4813Kronograflun. 3:19 · «read it and get started»3:48 · primer flasheo verificado en el reloj29 min33primer mensaje al agenteprimer resultado concretoun commitnoche
Una fila por proyecto, del jueves a las 19 h al lunes a las 19 h. La cifra de la derecha cuenta los commits. Pasa el cursor por los círculos para ver las horas exactas.

Cada fila es un proyecto, cada trazo un commit. El círculo vacío es mi primer mensaje al agente. El lleno, por encima de la fila, es lo primero concreto: la app funcionando en la tele, el firmware en el reloj, la doble autenticación activa en la pasarela del homelab. Las bandas grises son las noches. Hay commits dentro. No siempre porque yo estuviera despierto.

# Jueves por la noche: tres agentes en 45 minutos

La noche del 8, en 45 minutos:

  • 20:34: sale la misión Almanak.
  • 20:36: retomo shot2cart, un proyecto empezado en septiembre con otra herramienta. «inspect project, it comes from an other AI conversation, inspect and we pursue».
  • 21:07: descargo desde claude.ai el CLAUDE.md de mi homelab, que estoy rediseñando con un LLM. Lo acababa de escribir con otra instancia mientras la primera construía Almanak.
  • 21:19: «je viens de créer CLAUDE.md pour toi, c’est parti !» [acabo de crear CLAUDE.md para ti, ¡vamos!]

Nadie espera a nadie. Mientras un agente compila, escribo la misión del siguiente con un tercero.

# Almanak, la chispa

El north star cabía en una frase:

Una pantalla que apetece dejar encendida. Cuando paso por delante de mi tele, sé en 2 segundos la hora, la fecha, el tiempo que hace y que va a hacer, y en cuántos minutos pasa mi próximo autobús. Es bonita como un objeto de diseño, no como un panel de administración.

Y una regla que mantuve en todos los proyectos siguientes: ningún tramo está terminado hasta que el agente lo ha visto funcionar en la Shield. Hace una captura por adb, la lee, la critica. Legibilidad a 3 m, overscan, desbordes. Y para cada tramo visual, dos variantes; nos quedamos con la mejor.

Almanak en la tele, tema oscuro: la hora en grande, la fecha, el día del año, los próximos autobuses y el tiempo a cinco días

Almanak, tema papel: la hora, el santo del día, los autobuses y la curva de temperatura de las próximas horas

Almanak en la Shield la primera noche: el tema oscuro a las 22:17, el tema papel a las 21:38.

Siete tramos entre las 20:46 y las 22:32. Para el reloj, el agente comparó una serif editorial con una sans-serif suiza y se quedó con Fraunces, porque a 3 m, Inter con grosor 200 «empieza a parecer un alambre». Tiene razón.

El mejor bug: la sincronización de horarios de autobús devolvía HTTP 441 en la Shield y funcionaba desde el Mac. El agente rebuscó en dumpsys connectivity y encontró la VPN que corre en la Shield: la web de la STM (la red de transporte de Montreal) rechaza las IP de salida de las VPN. Pasó a un espejo del mismo flujo, byte a byte, y documentó el split tunneling en el README. El prompt no decía nada de una VPN.

Para ser honesto: mi definición de «terminado» pedía 24 horas de salvapantallas sin fuga de memoria. La medida real cubre más o menos una hora. Terminado, pues. Entre comillas.

# Lukarne, mi favorito

Al día siguiente, 17:58, segunda misión. Una ventana al mundo: girar un globo con el mando, lanzarse sobre una región, ver un mosaico de webcams en directo, saltar de una cámara a otra. La frase que cuenta en el prompt:

Si una interacción no es fluida con el mando, ha fracasado, aunque sea técnicamente correcta.

Y otra, más discreta, que explica por qué todo fue tan rápido: «Ya desarrollé otra app de Google TV contigo en esta misma Shield. Antes de nada, busca en mi entorno […] cómo nos conectamos […]. Reutiliza lo que funciona.» Cada proyecto deja tras de sí una dirección adb, un script de despliegue, un formato de DECISIONS.md. El siguiente arranca desde ahí.

18:14: primer directo a pantalla completa en la tele, HLS y YouTube, izquierda/derecha para pasar de uno a otro. 16 minutos. A las 20:54, la V1 estaba lista: un globo día/noche en OpenGL a 60 imágenes por segundo (3 ms por imagen), 1640 cámaras en 34 regiones (19 más desde el lunes), un mosaico 3×3 cuya casilla seleccionada pasa a directo en dos segundos, y un botón «sorpréndeme» que te manda adonde es de día. Dos pruebas de resistencia de 22 minutos, cero cuelgues.

El globo de Lukarne centrado en Europa de noche, Venecia seleccionada, una webcam de la cuenca de San Marcos en una esquina

Lukarne: Europa de noche, Venecia seleccionada, 16 webcams en directo, la cuenca de San Marcos en la esquina.

Lo más fácil es verla funcionar:

78 segundos en la Shield, sin sonido: el globo hasta California, la zambullida en Pollock Pines, el mosaico de cámaras de autopista en directo, la pantalla completa, la cámara siguiente, la subida, y luego «surprise me».

Este vídeo lo grabó el agente, el lunes por la noche, para esta entrada. Manejaba la Shield con un mando virtual (adb shell input keyevent) y grababa la pantalla con screenrecord. La primera toma fue en francés, sobre Europa, donde era la 1 de la madrugada: todo estaba negro. Repitió la toma en inglés, sobre California, de día.

El mosaico de Pollock Pines: nueve cámaras de la autopista US 50 en directo, la casilla seleccionada recuadrada

Pantalla completa de una cámara de autopista en California, un coche rojo en el cruce, el nombre del lugar y la hora local abajo

El mosaico de un lugar y luego la pantalla completa. Izquierda/derecha salta a la cámara vecina sin volver al mosaico.

Una aurora boreal verde sobre Fairbanks, Alaska, con el nombre de la cámara y la hora local

«surprise me» cayó aquí, en pleno rodaje. La cámara de auroras de explore.org en Fairbanks, 15:09 hora local: seguramente una reposición de la noche entre dos planos en directo.

Luego la usé, y me quejé. Sábado, 23:20: «je suis assez surpris du peu de flux video , bcp d’images fixes qui apportent peu» [me sorprende lo poco que hay en vídeo, muchas imágenes fijas que aportan poco]. 23:34, commit: primero el directo, las imágenes fijas como opción. Catorce minutos.

En la noche del domingo al lunes, a las 00:08: «parfait , je vais dormir là» [perfecto, me voy a dormir]. Y dos peticiones: «les vignettes pixelisée : on peut trouver un moyen de charger ne serait ce qu 1 frame propre plutôt que la vignette degeueu ?» [las miniaturas pixeladas: ¿podemos cargar aunque sea 1 fotograma limpio en vez de esa miniatura asquerosa?], y para el último nivel de zoom, un «effet plongeant genre zoom google earth» [efecto de zambullida tipo zoom de Google Earth]. A las 00:26, las miniaturas son fotogramas reales capturados en el aparato durante la reproducción. A las 00:48, te lanzas sobre un lugar con un zoom ×30, se encienden las luces, y vuelves a subir. A las 00:59, prueba de resistencia de 10 minutos después de todo eso. Yo dormía.

El lunes por la tarde pedí un modo demo, para que la tele viaje sola. 41 minutos después:

El modo demo: cámaras al azar donde es de día, nunca dos veces la misma región, con un fundido a un cartel entre una y otra.

El panel de ajustes de Lukarne abierto sobre el globo: idioma, temperatura, imágenes fijas, reproductor en esquina, tiempo por cámara del modo demo, créditos de las fuentes

Los ajustes, a un botón del mando: idioma (inglés, francés, español), unidades, imágenes fijas o solo directo, reproductor en esquina, tiempo por cámara del modo demo y los créditos de cada fuente.

Lo que aún falta: la cobertura en directo fuera de Norteamérica es escasa. El primer día, el agente gastó toda la cuota de búsqueda de YouTube mientras dos bugs ocultaban los resultados. Ahora un repositorio público republica cada día el catálogo de directos, y la app lo descarga detrás de su logo. Y hay un bug que no siempre consigo reproducir: una webcam de YouTube que se queda congelada al encadenar dos. Lo señalé a las 15:46 y hubo un arreglo a las 16:31. Falta comprobarlo en la tele.

# DropboksTV, un domingo por la tarde

Un cliente de Dropbox para la tele, pensado para el sofá: fotos y vídeos primero, solo lectura, sin backend. Domingo, 15:18: «read prompt-dropbokstv-claude-code.md and go». 16:02: el emparejamiento por teléfono funciona en la tele. 18:28: octavo y último tramo, con búsqueda, modo sin conexión, salvapantallas y 128 textos traducidos por idioma.

Lo más retorcido es el emparejamiento. Conectarse a Dropbox desde una tele, sin teclado, debería ser un código que escribes en el teléfono. Solo que la API de Dropbox no ofrece ese flujo. El agente lo comprobó en el SDK y lo anotó en su registro de decisiones. Así que montó otra cosa:

  • la tele muestra un código QR que apunta a una página servida por la propia tele, en el wifi de casa;
  • el teléfono abre esa página, que lo manda a autorizar DropboksTV en Dropbox;
  • Dropbox muestra un código, lo pegas en el teléfono, y la tele lo cambia por un token (PKCE: el secreto nunca sale de la tele, sin backend);
  • la sesión caduca a los 10 minutos y la tele renueva el QR sola. Un error al teclear no quema la sesión. Y si el teléfono no ve la tele, un botón cambia al enlace directo de Dropbox.

El pequeño servidor HTTP de la tele (150 líneas) lo sacó de Almanak.

Pantalla de emparejamiento de DropboksTV: tres pasos numerados y un código QR, difuminado aquí

El emparejamiento

Y luego está el visor. En tres tramos, entre las 16:25 y las 18:07, el agente escribió un visor que abre prácticamente todo:

  • las fotos, con zoom ×2 y ×3 que se desplaza con las flechas, y un pase de diapositivas con fundido o Ken Burns;
  • los vídeos: H.264, HEVC hasta 4K, reanudación donde lo dejaste, subtítulos .srt;
  • los PDF, página a página, con zoom;
  • Word y PowerPoint, que Dropbox convierte a PDF, y las hojas de cálculo, escaladas al 170 % para leerlas desde el sofá;
  • el Markdown con formato, el código con números de línea y colores;
  • la música, MP3 y FLAC, con la portada;
  • y para todo lo demás, un código QR que manda el archivo al teléfono.

El reproductor de vídeo llevó 16 minutos. Los documentos, la música y el envío al teléfono, 27. Una locura.

Ocho pantallas de DropboksTV: una foto ampliada, un vídeo, un PDF, una hoja de cálculo, notas en Markdown, código Kotlin, una canción con su portada y la pantalla de envío al teléfono

En orden: foto ampliada, vídeo, PDF, hoja de cálculo, Markdown, código, música, envío al teléfono (QR difuminado). Los archivos de prueba los fabricó el propio agente y los dejó en una carpeta de Dropbox dedicada. Capturas tomadas durante el desarrollo, en francés.

# Kronograf, o la vuelta del hardware

Lunes, 3:19 de la madrugada, un reloj LilyGO T-Watch de 2020 conectado por USB, y una misión: una esfera de cronógrafo de aviación y unos visores de 7 segmentos «circuitos temporales». A las 3:48, primer flasheo verificado en el reloj, después de una copia completa del flash original. Era la regla n.º 2 del prompt: no se escribe nada en el reloj sin red de seguridad. El cable falló durante la primera copia, y el agente se negó a flashear hasta tener una completa.

El T-Watch 2020 real sobre la mesa: pantalla de diagnóstico de Kronograf, memoria, sensores detectados en verde, batería al 100 %

El reloj real, el lunes a las 18:11: la pantalla de diagnóstico, la primera que se flasheó. En verde, los chips detectados; en gris, lo que la V1 no tiene.

Esfera de cronógrafo de aviación: bisel graduado, tres subesferas de batería, minutos y pasos, segundero naranjaEsfera con visores de 7 segmentos: destino en rojo, presente en verde, última sincronización en naranja

A la izquierda, captura del reloj real por el puerto serie. A la derecha, la esfera «circuitos temporales» en el simulador, que compila exactamente la misma interfaz.

Aquí el tiempo vuelve a subir, y no es culpa del agente. Ya no es código contra un emulador, es un conector micro-USB cansado. Mis mensajes de esa mañana: «elle plante systematiquement au bout de quelque secondes» [se cuelga siempre a los pocos segundos], «va vite sinon elle plante» [date prisa o se cuelga], «j’espère qu’elle n’est pas brikée» [espero que no se haya quedado brickeado]. El problema venía del sueño ligero, con una tormenta de interrupciones al despertar con el botón. A las 11:17: «ce semble tres bien tenir maintenant» [ahora parece aguantar muy bien]. A las 11:18: «go pour la météo» [adelante con el tiempo]. A las 11:31, el reloj muestra el tiempo y el próximo autobús en tiempo real.

Esta noche tiene 33 commits, alarmas, cronómetro, podómetro, actualizaciones por wifi y las notificaciones del iPhone por Bluetooth, que todavía no enganchan bien. El doble toque es «un peu alétoire , comme le mouvement du poignet … mais ca passe» [algo aleatorio, como el gesto de muñeca… pero vale].

# El homelab, y la app shot2cart

La obra más larga no se ve. Sesenta commits y 276 mensajes para rehacer el servidor de casa: inventario, copias de seguridad con pruebas reales de restauración, acceso remoto con passkeys para la familia, alertas, una página de inicio con un esquema animado de la infraestructura y otro de la red local.

Mi mensaje favorito de toda la serie, la primera noche: «ignore cet audit ; je ne compte que sur toi maintenant» [olvida esa auditoría; ahora solo cuento contigo]. El más sincero, el domingo: «Nest dans Home Assistant c’est payant ??!!» [¿¿Nest en Home Assistant es de pago??!!]. Pues sí, 5 $, gracias Google.

shot2cart es el contraejemplo. La idea de la app: una foto de una lista de la compra, y el carrito se abre en la tienda en menos de 15 segundos, sin teclear nada. Primer intento en septiembre, con otra herramienta y un flujo basado en especificaciones: tres días, dos commits. El jueves por la noche lo retomé sobre esa base. Domingo, 20:13, lo archivé todo: «forget about previous session, I archived the previous project and to start a new one with better prompt». 23:01: foto, análisis con un modelo de visión, enlaces de tienda artículo por artículo. 00:04: «I’m going to sleep […] please go as far as you can in full autonomy». Por la mañana había detección en streaming, fichas de revisión y recorridos de prueba automatizados.

Misma idea, mismo desarrollador. La diferencia entre septiembre y este domingo es la calidad de los modelos, y en particular Opus 5.5. ¡¡¡Una bestia!!!

# El tiempo, medido

TipoLo que pedíTiempo hasta el commit
FEAT«ajoute la langue espagnole à l’application» [añade el español a la aplicación] (Lukarne)5 min
BUGLos vecinos a 2500 km: «je suis sur Londres mais la Patagonie est listée» [estoy en Londres pero sale la Patagonia]5 min
BUGEl logo que solo aparece medio segundo al arrancar2 min
FEATMás directo, menos imágenes fijas14 min
FEATEl zoom de zambullida «tipo Google Earth», pedido antes de irme a dormir40 min
FEATUn modo demo que encadena webcams al azar41 min
BUGEl vídeo reciente que siempre abre un vídeo de 2012 (DropboksTV)2 min
FEAT«go pour la météo» [adelante con el tiempo] en el reloj13 min

Lo que no va más rápido: un cable micro-USB que se suelta, una cuota de YouTube que se reinicia a las 3 de la madrugada, una clave de API que el portal del proveedor rechaza, mi suscripción. Domingo, 16:46: «il me reste que 10% pour notre session en cours» [solo me queda un 10 % para nuestra sesión actual]. Y mi sueño, que acabé metiendo en el plan: «je vais dormir la , avance au maximum de ton autonomie» [me voy a dormir, avanza todo lo que puedas por tu cuenta].

Lo que todavía no sé: cuántos de estos seis proyectos seguiré usando dentro de un mes. Ahora toca llegar hasta el final, publicar lo que se pueda publicar, alimentar a otros agentes.

Esta entrada se hizo igual. Un mensaje mío el lunes al final de la tarde, a lo bruto, con mis erratas: «génère moi un article complet […] mettre en avant le délai ridicule que c’est devenu entre l’intention et le concret» [escríbeme un artículo completo […] destaca lo ridículo que se ha vuelto el tiempo entre la intención y lo concreto]. Contarlo todo con transparencia y honestidad. El propio blog estaba en línea 45 minutos después de mi primer mensaje, el lunes a las 4 de la madrugada.

En fin, ¡buen fin de semana!