{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "nico://log",
  "home_page_url": "https://www.nico.com.ar",
  "feed_url": "https://www.nico.com.ar/notes/feed.json",
  "description": "Notas cortas en español sobre lo que estoy armando, arreglando y aprendiendo.",
  "items": [
    {
      "id": "https://www.nico.com.ar/notes/alpine-linux-pipeta/",
      "url": "https://www.nico.com.ar/notes/alpine-linux-pipeta/",
      "title": "Pipeta, Alpine y el encanto de volver a las bases",
      "content_html": "<p>Estos días me encontré con una situación bastante buena: tener una Raspberry Pi Zero 2 W prendida en Buenos Aires, corriendo Alpine Linux, mientras yo estoy lejos de casa y sin necesitar nada urgente de esa máquina. En otras palabras, el contexto ideal para empezar a probar cosas sin culpa.</p>\n<p>La máquina se llama <strong>Pipeta</strong> y el nombre le queda bien, porque la idea es usarla justamente como eso: un sandbox puro para experimentar, aprender y equivocarme sin convertir cada intento en un servicio, una obligación o una nueva pieza de infraestructura para mantener.</p>\n<figure class=\"note-photo\">\n  <img src=\"/assets/img/notes/pipeta-alpine-linux.webp\" alt=\"Pipeta, una Raspberry Pi Zero 2 W, corriendo Alpine Linux con una terminal abierta\" loading=\"lazy\" />\n  <figcaption>Pipeta en modo laboratorio: una terminal abierta y cero presión por hacer algo “importante”.</figcaption>\n</figure>\n\n<h3>La gracia de no hacer algo importante</h3>\n<p>Muchas veces uno aprende tecnología queriendo resolver algo grande demasiado rápido. Montar un servidor, exponer un subdominio, automatizar medio planeta o transformar un script en un sistema antes de tiempo. Esta vez quise hacer lo contrario.</p>\n<p>La consigna fue bastante simple: nada de producción, nada de disponibilidad y nada de dejar cosas corriendo porque sí. Solo cositas chicas, manuales, locales y lo suficientemente inofensivas como para poder jugar sin presión.</p>\n<h3>Las primeras pruebas</h3>\n<p>Empecé por dos scripts muy simples en Python. Uno para comparar el clima entre ciudades y otro para leer titulares desde feeds RSS. No eran herramientas especialmente sofisticadas, pero justamente ahí estuvo la gracia.</p>\n<p>Lo interesante fue entender mejor qué hace cada capa: Python como lenguaje, <code>requests</code> para traer datos, <code>feedparser</code> para leer RSS, una API para el clima y después un poco de lógica propia para ordenar todo y mostrarlo de una forma más legible. No había ninguna magia rara detrás, solo datos, reglas simples y algo de criterio para presentarlos.</p>\n<p>Dicho así parece bastante obvio, pero verlo funcionar en una terminal remota, en una maquinita tan chica, tuvo bastante encanto.</p>\n<h3>De script a programita</h3>\n<p>Después vino el siguiente paso, que fue juntar esas piezas en una especie de mini laboratorio interactivo. Así apareció <strong>Pipeta Lab</strong>, un script con menú en terminal que permite comparar ciudades, leer titulares y combinar ambas cosas en una vista simple tipo observatorio.</p>\n<p>Todo sigue siendo chico, manual y bastante liviano. Y eso es justamente lo que más me interesaba: no armar una app, ni un dashboard, ni una plataforma, sino un programita lo bastante vivo como para ayudarme a entender mejor cómo encajan las cosas.</p>\n<h3>Cuando apareció SQLite</h3>\n<p>El salto más interesante por ahora fue sumar <strong>SQLite</strong>. No por una necesidad urgente, sino porque me pareció una buena forma de tocar una base de datos sin meter demasiada complejidad.</p>\n<p>Hasta ese momento, los datos aparecían en pantalla y desaparecían ahí mismo. Con SQLite apareció algo distinto: persistencia. El programa ya no solo consultaba y mostraba, sino que además podía guardar una corrida y volver a leerla después. Ahí empezó a hacerse más clara una estructura que siempre está, aunque a veces uno no la vea tanto: entrada, procesamiento, persistencia y salida.</p>\n<p>Dicho de otra manera, el script dejó de ser solo una consulta en vivo y empezó a parecerse un poco más a un sistema, aunque siguiera siendo un experimento muy chico.</p>\n<h3>Lo que más me gustó</h3>\n<p>Creo que lo mejor de esta pequeña aventura no fue Alpine, ni Python, ni SQLite por separado. Lo mejor fue volver a algo bastante básico y bastante sano: aprender sin la presión de publicar, automatizar o convertir todo en “infraestructura” enseguida.</p>\n<p>Abrir una terminal, escribir algo, romper una indentación, pelearse con una API caprichosa, entender por qué una ciudad no aparece y guardar tres filas en una base de datos puede sonar mínimo, pero justamente en esa escala es donde se vuelve más fácil entender qué está pasando.</p>\n<h3>Lo que puede venir</h3>\n<p>Por ahora quiero mantener a Pipeta en ese lugar: sandbox puro, laboratorio y caja de pruebas. Capaz más adelante alguna de estas cositas migra a otra máquina o termina colgada en la web, pero prefiero que eso llegue después, si tiene sentido, y no como punto de partida.</p>\n<p>Está bueno recordar que no todo proyecto tiene que nacer como infraestructura. A veces alcanza con una idea mínima, una terminal y un rato libre para aprender un poco más.</p>",
      "summary": "Estos días me encontré con una situación bastante buena: tener una Raspberry Pi Zero 2 W prendida en Buenos Aires, corriendo Alpine Linux, mientras yo estoy lejos de casa y sin necesitar nada urgente de esa máquina. En otras palabras, el contexto ideal para empezar…",
      "date_published": "2026-04-05T00:00:00+00:00",
      "tags": [
        "alpine-linux",
        "raspberry-pi-zero-2w",
        "python",
        "sqlite",
        "rss",
        "weather",
        "argensonix-labs"
      ]
    },
    {
      "id": "https://www.nico.com.ar/notes/nico-run-training-interpreted/",
      "url": "https://www.nico.com.ar/notes/nico-run-training-interpreted/",
      "title": "nico://run: una herramienta para leer mis entrenamientos",
      "content_html": "<p>Después de <strong>Pacer</strong> apareció bastante rápido la siguiente necesidad. No solo quería pasarle mejores datos a ChatGPT, sino también tener un lugar mío para leer mejor lo que vengo haciendo. No estaba buscando una app de running, ni otro dashboard lleno de widgets, ni una copia casera de Strava. Lo que quería era algo más simple: poder ver la última sesión, entender cómo viene la semana, tener una idea de lo que sigue y leer todo eso con un poco más de claridad. Así nació <strong>nico://run</strong>.</p>\n<h3>Lo que faltaba</h3>\n<p>Pacer resolvió bastante bien la parte de preparar datos. Trae actividades desde Strava, las resume, arma un brief más limpio y me deja conversar mejor con ChatGPT. Pero faltaba una capa intermedia, porque una cosa es tener el dato y otra bastante distinta es verlo acomodado con criterio. Ahí fue donde empezó a tomar forma la idea de un portal personal de running: uno que no intentara registrar todo, sino ayudarme a interpretar un poco mejor lo importante.</p>\n<h3>Qué es nico://run</h3>\n<p><strong>nico://run</strong> es, básicamente, una capa de lectura arriba de Pacer. Se puede ver en <a href=\"https://run.nico.ar/\" target=\"_blank\" rel=\"noopener noreferrer\">run.nico.ar</a>, y lo que hace es tomar el snapshot que ya preparo del lado de Pacer para convertirlo en algo más legible: la última salida como bloque principal, el próximo entrenamiento como sugerencia breve, un resumen semanal y algunos links para seguir leyendo cosas interesantes de running y bienestar. La lógica, en el fondo, es bastante sencilla: <strong>Pacer prepara, nico://run ordena y ChatGPT interpreta</strong>. Cada pieza hace una cosa distinta, y eso por ahora viene funcionando mejor que intentar meter todo en un solo lugar.</p>\n<h3>Cómo corre</h3>\n<p>La idea sigue siendo mantenerlo liviano. Está armado como build estático, trabaja con datos locales y evita complejidad innecesaria. También está pensado para servir cómodo incluso en hardware chico, que es parte importante de la gracia del proyecto. Me interesa bastante esa idea de poder mostrar algo útil sin depender de una infraestructura exagerada para resolver un problema bastante simple.</p>\n<h3>Lo que ya cumple</h3>\n<p>Hoy <strong>nico://run</strong> ya me sirve para algo concreto. Me permite mirar la última sesión sin entrar a mil pantallas, ubicar rápido el contexto de la semana y tener una capa más amable entre el entrenamiento bruto y la decisión del día siguiente. No reemplaza a Garmin ni a Strava, y tampoco intenta hacerlo. Más bien se mete en ese hueco raro que queda después del reloj, pero antes del próximo entrenamiento.</p>\n<h3>Lo que podría venir</h3>\n<p>Todavía hay margen para seguir puliéndolo. Me gustaría mejorar el archivo histórico, darle más personalidad a algunas vistas, armar una capa más prolija para el calendario de carreras y encontrar mejores formas de conectar el plan base con lo que realmente termino haciendo. Pero lo importante ya está: <strong>nico://run dejó de ser una idea linda y empezó a convertirse en una herramienta propia.</strong></p>",
      "summary": "Después de Pacer apareció bastante rápido la siguiente necesidad. No solo quería pasarle mejores datos a ChatGPT, sino también tener un lugar mío para leer mejor lo que vengo haciendo. No estaba buscando una app de running, ni otro dashboard lleno de widgets, ni una…",
      "date_published": "2026-03-16T00:00:00+00:00",
      "tags": [
        "nico-run",
        "pacer",
        "running",
        "astro",
        "raspberry-pi",
        "argensonix-labs"
      ]
    },
    {
      "id": "https://www.nico.com.ar/notes/pacer-strava-brief-builder/",
      "url": "https://www.nico.com.ar/notes/pacer-strava-brief-builder/",
      "title": "Pacer: de las capturas eternas a un brief limpio para ChatGPT",
      "content_html": "<p>Hoy nació <strong>Pacer</strong>, una mini app pensada para algo bastante concreto: <strong>dejar de pasarle capturas de pantalla al ChatGPT y empezar a darle contexto útil</strong>.</p>\n<p>La idea salió de una necesidad muy simple. Cuando quiero revisar cómo vengo entrenando y decidir qué hacer al día siguiente, no necesito nueve screenshots, ni una novela explicando todo, ni depender de recordar de memoria qué hice hace tres días.</p>\n<p>Necesito esto:</p>\n<ul>\n<li>qué hice últimamente</li>\n<li>cuánto corrí</li>\n<li>si metí bici</li>\n<li>si hice fuerza</li>\n<li>cómo me siento hoy</li>\n</ul>\n<p>Y listo.</p>\n<h3>El problema de fondo</h3>\n<p>Durante bastante tiempo el flujo fue más artesanal que otra cosa.</p>\n<p>Mirar Garmin.<br />\nMirar Strava.<br />\nSacar capturas.<br />\nMandarlas.<br />\nExplicar sensaciones.<br />\nVolver a resumir a mano.</p>\n<p>Funcionaba, sí. Pero tenía demasiada fricción.</p>\n<p>Lo interesante fue que al intentar automatizarlo aparecieron varias verdades bastante rápido:</p>\n<ul>\n<li><strong>Strava</strong> sirve mucho mejor como fuente de datos que como web para scrapear</li>\n<li><strong>Garmin</strong> sigue siendo mejor como reloj y ecosistema de entrenamiento que como plataforma abierta para integrar cosas personales</li>\n<li><strong>Playwright</strong> está bueno, pero no tenía sentido hacerlo protagonista de algo que Strava ya resolvía mejor con API</li>\n</ul>\n<h3>Qué terminó siendo Pacer</h3>\n<p>Pacer quedó como una herramienta simple y bastante más sensata:</p>\n<ul>\n<li>trae mis últimas actividades desde <strong>Strava API</strong></li>\n<li>guarda todo en JSON</li>\n<li>levanta una mini web</li>\n<li>resume automáticamente la carga reciente</li>\n<li>me deja completar solo unos pocos campos manualmente</li>\n<li>genera un texto listo para copiar o descargar</li>\n</ul>\n<p>Ese texto después se lo paso a ChatGPT y el ida y vuelta queda mucho más limpio.</p>\n<h3>Qué muestra la app</h3>\n<p>Por ahora Pacer ya resume varias cosas útiles:</p>\n<ul>\n<li>última actividad</li>\n<li>último run</li>\n<li>último ride</li>\n<li>resumen de los últimos 7 días</li>\n<li>volumen de running</li>\n<li>volumen de bici</li>\n<li>sesiones de fuerza y workout</li>\n</ul>\n<p>Y además tiene un bloque manual bien corto para completar:</p>\n<ul>\n<li>sensación general</li>\n<li>piernas</li>\n<li>sueño</li>\n<li>nota extra</li>\n</ul>\n<p>Eso solo ya baja muchísimo la fricción.</p>\n<h3>Lo más importante</h3>\n<p>El punto no era hacer una app “fitness” más.</p>\n<p>El punto era armar <strong>un puente entre mis datos y una conversación útil</strong>, que el sistema me ayude a responder algo concreto:</p>\n<p><strong>qué conviene hacer mañana.</strong></p>\n<p>En ese sentido, Pacer ya cumple.</p>\n<h3>Lo que salió bien</h3>\n<p>Varias cosas terminaron acomodándose mejor de lo esperado:</p>\n<ul>\n<li>el fetch a Strava funciona</li>\n<li>el JSON quedó útil</li>\n<li>el copy to clipboard / download txt tienen mucho más sentido del que parecía</li>\n<li>ya no dependo de los screenshots</li>\n</ul>\n<h3>Próximo paso</h3>\n<p>Pulirlo sin volverlo complicado:</p>\n<ul>\n<li>brief más compacto</li>\n<li>persistencia local de los campos manuales</li>\n<li>flow de deploy más pulido</li>\n</ul>\n<p>Pero lo importante ya pasó.</p>\n<p><strong>Pacer dejó de ser una idea y empezó a servir.</strong></p>",
      "summary": "Hoy nació Pacer, una mini app pensada para algo bastante concreto: dejar de pasarle capturas de pantalla al ChatGPT y empezar a darle contexto útil. La idea salió de una necesidad muy simple. Cuando quiero revisar cómo vengo entrenando y decidir qué hacer al día…",
      "date_published": "2026-03-09T00:00:00+00:00",
      "tags": [
        "pacer",
        "strava",
        "running",
        "raspberry-pi",
        "nodejs",
        "automation",
        "argensonix-labs"
      ]
    },
    {
      "id": "https://www.nico.com.ar/notes/aura-production-deploy/",
      "url": "https://www.nico.com.ar/notes/aura-production-deploy/",
      "title": "Aura: una experiencia minimalista, inmersiva y atmosférica",
      "content_html": "<p>Hoy salió a producción <strong>Aura</strong>, el nuevo player standalone de Blur FM, disponible en <a href=\"https://play.blurfm.com/\" target=\"_blank\" rel=\"noopener noreferrer\">play.blurfm.com</a>.</p>\n<p>La idea es dejar de pensar el player como “una parte medio colgada de la web” y empezar a tratarlo como una <strong>experiencia propia</strong>, más cercana a una app musical que a una página tradicional.</p>\n<h3>Qué quedó armado</h3>\n<ul>\n<li>Proyecto nuevo y separado en su propio repo</li>\n<li>Base en <strong>Astro</strong></li>\n<li>Pensado como <strong>PWA instalable</strong></li>\n<li>Deploy automático con <strong>GitHub Actions</strong></li>\n</ul>\n<h3>Lo bueno de haberlo separado</h3>\n<p>El sitio principal de Blur FM sigue siendo la web “institucional”, por decirlo de alguna manera.<br />\nAura, en cambio, arranca como una experiencia enfocada 100% en escuchar.</p>\n<p>Eso me gusta porque ordena bastante el panorama:</p>\n<ul>\n<li><a href=\"https://www.blurfm.com/\" target=\"_blank\" rel=\"noopener noreferrer\">www.blurfm.com</a> como sitio</li>\n<li><a href=\"https://play.blurfm.com/\" target=\"_blank\" rel=\"noopener noreferrer\">play.blurfm.com</a> como player app</li>\n</ul>\n<p>Más adelante se podrá integrar algo más liviano en la web principal, pero arrancar separado me parece muchísimo más sano.</p>\n<h3>Qué tomó del proyecto viejo</h3>\n<p>Aura no salió de la nada. Toma referencias visuales del repo principal de Blur FM:</p>\n<ul>\n<li>Colores</li>\n<li>Logo</li>\n<li>Tipografía</li>\n<li>Look general</li>\n</ul>\n<p>Todo esto sin arrastrar la estructura anterior. Era importante no mezclar arquitecturas.</p>\n<h3>El deploy</h3>\n<p>La parte linda fue dejarlo con el mismo enfoque general que ya venía usando en Blur FM:</p>\n<ul>\n<li>Push a GitHub</li>\n<li>Build automático</li>\n<li>Deploy por <strong>SSH + rsync</strong></li>\n<li>Debian server configurado con Apache</li>\n</ul>\n<h3>MVP con mínimo esfuerzo</h3>\n<p>El proyecto nació en un mockup low fi hecho en Excalidraw y pasó rápidamente a una URL real. Se transformó bastante rápido en un producto.</p>\n<p>No está terminadísimo ni cerca, pero ya tiene lo más importante: base propia, identidad clara y deploy resuelto.</p>\n<h3>Próximo paso</h3>\n<p>Pulir el player con calma:</p>\n<ul>\n<li>Metadata real más robusta</li>\n<li>Fondo dinámico mejor resuelto</li>\n<li>Panel de recently played</li>\n<li>Ajustes finos para mobile y TV</li>\n</ul>\n<p>Pero lo más importante ya sucedió: <strong>Aura existe</strong>.</p>",
      "summary": "Hoy salió a producción Aura, el nuevo player standalone de Blur FM, disponible en play.blurfm.com. La idea es dejar de pensar el player como “una parte medio colgada de la web” y empezar a tratarlo como una experiencia propia, más cercana a una app musical…",
      "date_published": "2026-03-07T00:00:00+00:00",
      "tags": [
        "blurfm",
        "astro",
        "github-actions",
        "apache",
        "pwa",
        "radio",
        "automation"
      ]
    },
    {
      "id": "https://www.nico.com.ar/notes/locale-splitter/",
      "url": "https://www.nico.com.ar/notes/locale-splitter/",
      "title": "Splitter tool hosteada en Heroku en 30 min",
      "content_html": "<p>En dos iteraciones (media hora como mucho) armé <strong>locale-splitter</strong>: una mini herramienta web para recortar el TXT master de traducciones y bajarlo como <strong>ZIP</strong>, ya <strong>corriendo en Heroku</strong>.</p>\n<p>El TXT trae HTML concatenado y el splitter corta cuando encuentra separadores tipo: <code>|- (EN-PH) faq-contact-us</code>. Sin ese formato exacto, no hay corte ni renombre.</p>\n<h3>Qué hace el MVP</h3>\n<ul>\n<li>Subís un <code>.txt</code></li>\n<li>Detecta marcadores <code>|- (LOCALE) slug</code></li>\n<li>Corta el contenido entre marcadores (sin incluir la línea del marcador)</li>\n<li>Genera un ZIP con todos los HTML en una sola carpeta, con naming:</li>\n<li><code>(EN-US) faq-common-concerns.html</code></li>\n</ul>\n<h3>Lo loco</h3>\n<p>Codex no solo generó la app (Node/Express), también la empujó a GitHub y la publicó en Heroku. Se embaló creando un repo nuevo al principio aunque yo ya tenía uno definido, pero con un redeploy apuntando al repo correcto quedó listo.</p>\n<h3>Próximo paso</h3>\n<p>Sumar un <code>report.txt</code> en caso de que hubiera warnings detectados (por ejemplo marcadores sin contenido).</p>",
      "summary": "En dos iteraciones (media hora como mucho) armé locale splitter: una mini herramienta web para recortar el TXT master de traducciones y bajarlo como ZIP, ya corriendo en Heroku. El TXT trae HTML concatenado y el splitter corta cuando encuentra separadores tipo: | (EN PH)…",
      "date_published": "2026-03-04T00:00:00+00:00",
      "tags": [
        "ipsos",
        "tools",
        "i18n",
        "locales",
        "automation",
        "heroku"
      ]
    },
    {
      "id": "https://www.nico.com.ar/notes/fanout-blurfm/",
      "url": "https://www.nico.com.ar/notes/fanout-blurfm/",
      "title": "Fanout de Blur FM: origen en Argentina, relays en Europa (sin perder metadata)",
      "content_html": "<p>Con intención de optimizar el funcionamiento de Blur FM, la idea fue: <strong>cuatro calidades desde SAM</strong> (320, 128, 64 y 32 kbps), <strong>Icecast en Argentina como base</strong>, <strong>un relay en Europa</strong> para balancear la demanda, y <strong>Cloudflare</strong> para que las URLs públicas deriven al endpoint más conveniente (AR o EU).</p>\n<p>En la práctica esto termina siendo un <em>fanout</em>: el Icecast “madre” publica los streams, y uno (o más) Icecast en Europa <strong>se enganchan como relay</strong> y vuelven a servir esas mismas calidades localmente.</p>\n<h3>Qué problema resuelve</h3>\n<ul>\n<li><strong>Menos latencia</strong> para oyentes en Europa (arranca más rápido y se corta menos).</li>\n<li><strong>Más estabilidad</strong>: si el tráfico europeo cae al relay, el origen en Argentina respira.</li>\n<li><strong>Consistencia</strong>: el now playing sale de un solo lugar y se ve igual en ambos lados.</li>\n</ul>\n<h3>La parte mágica: el “RDS” del streaming</h3>\n<p>Lo mejor es que no solo viaja el audio: también viaja la <strong>metadata</strong> (título, artista, etc.).<br />\nEntonces el relay europeo termina mostrando el mismo “Now Playing” que el origen.</p>\n<p>Esto sirve porque:\n- El web player muestra el tema actual sin inventar nada.\n- Muchas apps leen esa info directo del stream.\n- Cloudflare puede redirigir al usuario al endpoint más conveniente (AR o EU).\n- Todo queda consistente y no hace falta mantener sistemas paralelos.</p>\n<h3>Resultado</h3>\n<p>Los streams se replican en Europa, se reparte la carga y la experiencia mejora, manteniendo todo consistente. Y encima quedan URLs públicas listas para crecer a futuro (routing más fino, stats separadas, lo que pinte) sin convertir la infra en un Frankenstein.</p>",
      "summary": "Con intención de optimizar el funcionamiento de Blur FM, la idea fue: cuatro calidades desde SAM (320, 128, 64 y 32 kbps), Icecast en Argentina como base, un relay en Europa para balancear la demanda, y Cloudflare para que las URLs públicas deriven al endpoint…",
      "date_published": "2026-02-28T00:00:00+00:00",
      "tags": [
        "blurfm",
        "icecast",
        "streaming",
        "infra"
      ]
    },
    {
      "id": "https://www.nico.com.ar/notes/bienvenidos-a-nico-log/",
      "url": "https://www.nico.com.ar/notes/bienvenidos-a-nico-log/",
      "title": "Bienvenidos a nico://log",
      "content_html": "<p>El sitio de <a href=\"https://www.slackware.com\" title=\"Sitio oficial de Slackware\" target=\"_blank\" rel=\"noopener noreferrer\">Slackware</a> es conocido en el mundo Linux por correr en un Pentium III, 600 MHz, con 512 megabytes de RAM.</p>\n<p>Después de unas cuantas iteraciones con GitHub Copilot y Codex, esta es la primera prueba para publicar una nota liviana.</p>",
      "summary": "El sitio de Slackware es conocido en el mundo Linux por correr en un Pentium III, 600 MHz, con 512 megabytes de RAM. Después de unas cuantas iteraciones con GitHub Copilot y Codex, esta es la primera prueba para publicar una nota liviana.",
      "date_published": "2026-02-26T23:36:00-03:00",
      "tags": [
        "infra",
        "low tech"
      ]
    }
  ]
}