{"id":1585,"date":"2025-12-17T09:42:27","date_gmt":"2025-12-17T08:42:27","guid":{"rendered":"https:\/\/germanmallo.com\/?p=1585"},"modified":"2026-10-05T08:15:37","modified_gmt":"2026-10-05T06:15:37","slug":"yellow-o-clock","status":"publish","type":"post","link":"https:\/\/germanmallo.com\/en\/yellow-o-clock\/","title":{"rendered":"From hand-highlighting to automation: How Yellow o&#039;clock was born"},"content":{"rendered":"<p>&nbsp;<\/p>\n<h3 id=\"el-ritual-anal-gico-en-un-deporte-de-cent-simas\">El ritual anal\u00f3gico en un deporte de cent\u00e9simas<\/h3>\n<p>La nataci\u00f3n es un deporte obsesionado con la precisi\u00f3n. Medimos el tiempo en cent\u00e9simas de segundo, utilizamos placas electr\u00f3nicas de \u00faltima generaci\u00f3n y analizamos la biomec\u00e1nica de la brazada con c\u00e1maras subacu\u00e1ticas. Sin embargo, en pleno siglo XXI, la gesti\u00f3n de los nadadores a pie de piscina segu\u00eda anclada en los a\u00f1os 90.<\/p>\n<p>Si has estado en una competici\u00f3n, conoces el escenario: calor, humedad, gritos, olor a cloro y, en medio del caos, una mesa llena de papeles. Son las <strong>listas de salida<\/strong> (las \u00abseries\u00bb).<\/p>\n<p>El ritual es sagrado: en cuanto se imprimen las listas, el delegado o un entrenador coge un subrayador fluorescente y empieza la caza. P\u00e1gina tras p\u00e1gina, busca los apellidos de los nadadores de su club para marcarlos. Es la \u00fanica forma de que, visualmente, se pueda identificar r\u00e1pido cu\u00e1ndo le toca tirarse al agua a cada uno.<\/p>\n<h3 id=\"el-detonante-20-minutos-de-frustraci-n\">El detonante: 20 minutos de frustraci\u00f3n<\/h3>\n<p>La idea de <a href=\"https:\/\/germanmallo.com\/en\/portfolio\/yellowoclock\/\"><strong>Yellow o&#8217;clock<\/strong><\/a> no naci\u00f3 en una sala de reuniones ni frente a un IDE de programaci\u00f3n. Naci\u00f3 en la grada de una piscina.<\/p>\n<p>Ese d\u00eda, la tarea recay\u00f3 sobre m\u00ed. <em>\u00abToma, subraya a los del equipo\u00bb<\/em>, me dijeron, entreg\u00e1ndome un taco de folios y un rotulador amarillo.<\/p>\n<p>Me sent\u00e9 y empec\u00e9 a buscar. <em>Garc\u00eda&#8230; no, este es de otro club. Mart\u00ednez&#8230; s\u00ed, este es nuestro.<\/em><br \/>\nPasaron 5 minutos.<br \/>\nPasaron 10.<br \/>\nA los <strong>20 minutos<\/strong>, segu\u00eda all\u00ed, con la vista cansada y los dedos manchados de tinta.<\/p>\n<p>En ese momento, mi cerebro de desarrollador hizo \u00abclick\u00bb. Sent\u00ed esa mezcla de frustraci\u00f3n y epifan\u00eda que todos los programadores conocemos. No ten\u00eda sentido que un ser humano estuviera haciendo una tarea de <em>b\u00fasqueda de patrones de texto<\/em> manualmente.<\/p>\n<blockquote><p><em>\u00abUn script podr\u00eda hacer esto en milisegundos. \u00bfPor qu\u00e9 lo estoy haciendo yo?\u00bb<\/em><\/p><\/blockquote>\n<p>Esa pregunta fue el comienzo de todo.<\/p>\n<h3 id=\"del-script-sucio-al-producto-real\">Del script \u00absucio\u00bb al producto real<\/h3>\n<p>Llegu\u00e9 a casa y abr\u00ed el ordenador. La primera versi\u00f3n no ten\u00eda interfaz bonita, ni web, ni nombre. Era simplemente un script en Python dise\u00f1ado para una tarea muy espec\u00edfica: <strong>ingesta de PDF, reconocimiento de cadenas de texto (OCR\/Text extraction) y superposici\u00f3n de capas de color.<\/strong><\/p>\n<p>Los PDFs son archivos complicados para manipular program\u00e1ticamente. A diferencia de un archivo de texto plano, un PDF es m\u00e1s un mapa visual que una estructura de datos ordenada. El reto t\u00e9cnico resid\u00eda en localizar las coordenadas exactas donde aparec\u00eda el nombre del club y \u00abpintar\u00bb encima sin romper el formato original del documento.<\/p>\n<p>Tras pelearme con varias librer\u00edas y coordenadas X\/Y, logr\u00e9 que funcionara. Le pas\u00e9 un PDF de 50 p\u00e1ginas y, en menos de un segundo, me devolvi\u00f3 el archivo con todos mis compa\u00f1eros resaltados.<\/p>\n<h3 id=\"beta-testers-de-lujo-el-cn-mediterr-neo-valencia\">Beta Testers de lujo: <a href=\"https:\/\/www.cnmediterraneo.com\/\">CN Mediterr\u00e1neo Valencia<\/a><\/h3>\n<p>Un software que solo usas t\u00fa es un script; un software que usan otros es un producto. Para dar ese salto, necesitaba <em>feedback<\/em> real.<\/p>\n<p>Tuve la inmensa suerte de contar con la colaboraci\u00f3n de la directiva del <strong>Club Nataci\u00f3n Mediterr\u00e1neo Valencia<\/strong>. Ellos se convirtieron en mis <em>beta testers<\/em>. Les entregu\u00e9 las primeras versiones del programa y observ\u00e9.<\/p>\n<p>Gracias a ellos aprend\u00ed lecciones que el c\u00f3digo no te ense\u00f1a:<\/p>\n<ul>\n<li><strong>La usabilidad es clave:<\/strong> Nadie quiere abrir una terminal de comandos en una piscina. Necesitaban un bot\u00f3n, un <em>drag &amp; drop<\/em>, algo intuitivo.<\/li>\n<li><strong>La privacidad importa:<\/strong> Los clubes manejan datos de menores. Subir las listas a una nube desconocida generaba desconfianza. Por eso decid\u00ed que Yellow o&#8217;clock fuera <strong>100% local y offline<\/strong>.<\/li>\n<li><strong>La robustez:<\/strong> Los formatos de las actas cambian ligeramente seg\u00fan la federaci\u00f3n. El algoritmo tuvo que volverse m\u00e1s flexible para no fallar si cambiaba la fuente o el espaciado.<\/li>\n<\/ul>\n<h3 id=\"yellow-o-clock-hoy-tecnolog-a-al-servicio-del-usuario\">Yellow o&#8217;clock hoy: Tecnolog\u00eda al servicio del usuario<\/h3>\n<p>El resultado de esas iteraciones es lo que hoy puedes ver en <a href=\"https:\/\/yellowoclock.germanmallo.com\/\">yellowoclock.germanmallo.com<\/a>.<\/p>\n<p>El proyecto se divide en dos grandes pilares tecnol\u00f3gicos que he querido mantener Open Source:<\/p>\n<ol>\n<li><strong>El Core (Python &amp; PDF Manipulation):<\/strong><br \/>\nEl motor de la aplicaci\u00f3n. Utiliza algoritmos de b\u00fasqueda eficientes para escanear documentos extensos en tiempo r\u00e9cord.<br \/>\n\ud83d\udcbb <em>Repo:<\/em> <a href=\"https:\/\/github.com\/Dreiko98\/pdf_remarker\">github.com\/Dreiko98\/pdf_remarker<\/a><\/li>\n<li><strong>La Plataforma (Next.js &amp; Tailwind):<\/strong><br \/>\nPara distribuir la herramienta, cre\u00e9 una landing page moderna, optimizada para SEO y accesible. Quer\u00eda que la experiencia de descarga fuera tan fluida como la app misma. Utilic\u00e9 <strong>Next.js 13<\/strong> con App Router para asegurar un rendimiento m\u00e1ximo.<br \/>\n\ud83c\udf10 <em>Repo:<\/em> <a href=\"https:\/\/github.com\/Dreiko98\/yellow-o-clock-landing-page\">github.com\/Dreiko98\/yellow-o-clock-landing-page<\/a><\/li>\n<\/ol>\n<h3 id=\"conclusi-n-resolver-problemas-reales\">Conclusi\u00f3n: Resolver problemas reales<\/h3>\n<p>A menudo, en el mundo del desarrollo, nos perdemos buscando la arquitectura perfecta o la tecnolog\u00eda de moda. Pero <strong>Yellow o&#8217;clock<\/strong> me record\u00f3 la esencia de nuestra profesi\u00f3n: <strong>crear herramientas para facilitar la vida a las personas.<\/strong><\/p>\n<p>Lo que empez\u00f3 como una forma de ahorrarme 20 minutos de aburrimiento, ahora ahorra horas acumuladas a delegados y entrenadores, permiti\u00e9ndoles centrarse en lo que realmente importa: sus nadadores.<\/p>\n<p>Si eres parte del mundo de la nataci\u00f3n, te invito a probarlo. Y si eres <a href=\"https:\/\/germanmallo.com\/en\/primer-trabajo-ia-dialapplet\/\">desarrollador<\/a>, te invito a mirar el c\u00f3digo, hacer un fork y mejorarlo.<\/p>","protected":false},"excerpt":{"rendered":"<p>&nbsp; El ritual anal\u00f3gico en un deporte de cent\u00e9simas La nataci\u00f3n es un deporte obsesionado con la precisi\u00f3n. Medimos el tiempo en cent\u00e9simas de segundo, utilizamos placas electr\u00f3nicas de \u00faltima generaci\u00f3n y analizamos la biomec\u00e1nica de la brazada con c\u00e1maras subacu\u00e1ticas. Sin embargo, en pleno siglo XXI, la gesti\u00f3n de los nadadores a pie de [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1587,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[79],"tags":[92,132,215,214],"class_list":["post-1585","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-automatizacion","tag-automatizacion","tag-desarrollo-web","tag-natacion","tag-proyectos-personales"],"acf":[],"_links":{"self":[{"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/posts\/1585","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/comments?post=1585"}],"version-history":[{"count":1,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/posts\/1585\/revisions"}],"predecessor-version":[{"id":4544,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/posts\/1585\/revisions\/4544"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/media\/1587"}],"wp:attachment":[{"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/media?parent=1585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/categories?post=1585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/tags?post=1585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}