<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Blog de Óscar de la Mata</title>
        <link>https://blog.omata.es</link>
        <description>Diseño, desarrollo y otras cosas.</description>
        <language>es</language>
        <atom:link href="https://blog.omata.es/rss.xml" rel="self" type="application/rss+xml" />
        <lastBuildDate>Sat, 30 May 2026 00:00:00 GMT</lastBuildDate>

    <item>
        <title>Lanzadera: deploys sin CI/CD desde Windows</title>
        <link>https://blog.omata.es/posts/lanzadera-deploys-sin-cicd-desde-windows</link>
        <guid isPermaLink="true">https://blog.omata.es/posts/lanzadera-deploys-sin-cicd-desde-windows</guid>
        <pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate>
        <description>Una herramienta PowerShell para desplegar proyectos web en GCP gestionando nginx, SSL y datos sin salir del terminal.</description>
        <content:encoded><![CDATA[<p>
  Últimamente estoy trabajando en algunos proyectos en paralelo, son pequeñas aplicaciones web, relativamente sencillas y pensadas para estar disponibles online.
</p>

<p>
  Por comodidad intento que tengan todas la estructura más similar posible, que usen todas las mismas tecnologías, que estén alojadas en el mismo sitio y que tengan un flujo de desarrollo lo más similar posible.
</p>

<blockquote>
  <p>
    Hacer esto te evita un montón de problemas, y agiliza tu desarrollo bastante.
  </p>
</blockquote>

<p>
  Todos estos proyectos están corriendo en instancias de Google Cloud Platform.<br />
  Son SPAs en Vue, proyectos Nuxt o custom JS.
</p>

<p>
  Todos tienen un nginx delante para gestionar las URLS, un certbot para el SSL. <em>(así por seguridad se pueden visitar las webs bajo https)</em>, algunas tienen sistema de login privado o tracking de visitas... Nada exótico.
</p>

<p>
  La mayoría incluso <strong>usa el mismo framework</strong> que he montado para construir la UI <a href="https://blog.omata.es/posts/una-herramienta-con-mis-mejores-intenciones" rel="nofollow">CSS Bedrock</a>\ o bloques más elaborados construidos a partir de <strong>Bedrock</strong> y que alojo en el proyecto que llamo <a href="https://github.com/Katamo/plantillas" rel="nofollow">Plantillas</a>
</p>

<blockquote>
  <p>
    Te animo a que le eches un vistazo a Bedrock y abraces las convenciones de tener una sola manera de hacer las cosas.
  </p>
</blockquote>

<p>
  Tener este flujo de desarrollo tan similar tiene innumerables ventajas, cierto que es que acotas tu margen de posibilidades al reducir tu stack de tecnología pero ganas muchísimo al mantener solo un tipo de código y un flujo de trabajo, depuras los errores más facilmente, sabes siempre qué esta pasando, puedes saltar de un proyecto a otro sin cambiar de mapa mental y sobre todo puedes automatizar algunas partes de la gestión del proyecto con un poco de cuidado.
</p>

<h2 id="la-dolorosa-vuelta-a-windows">
  La dolorosa vuelta a Windows.
</h2>

<p>
  Hace un año que volví a Windows por temas de presupuesto para mi trabajo del día a día, ahora que no trabajo profesionalmente en estos proyectos, la inversión en máquinas mac se me hacía un poco cuesta arriba y por cuestiones de ahorro y versatilidad me pasé a windows de nuevo.
</p>

<p>
  He desarrollado siempre mi trabajo en mac y linux y no voy a negar que la vuelta al entorno Windows ha sido un poco difícil, para mí acostumbrado a la maravilla de un terminal que funcionaba de verdad, volver a windows ha sido un camino lleno de altibajos.
</p>

<p>
  El problema por ejemplo de desplegar cualquier cosa desde Windows, aprender todos los comandos y la nueva sintaxis ha sido duro <em>(no me escondo...)</em>
</p>

<p>
  Incluso los proyectos pequeños necesitan de un montón de pasos: construir el proyecto, copiar los ficheros al servidor, recargar nginx, gestionar los certificados... en un primer momento todo de manera manual, luego usando scripts para agilizar que vas guardando entre proyectos y tienes que perder un rato editando cada vez que cambias de proyecto y al final acumulas un montón de scripts que no sabes luego ni donde los guardaste.
</p>

<h2 id="el-camino-de-los-golpes">
  El camino de los golpes.
</h2>

<p>
  La primera vez que montas un proyecto con subida al servidor, tardas una tarde.
</p>

<p>
  La segunda vez un poquito menos pero no recuerdas bien el orden de montaje y tropiezas, buscas y copias código del otro proyecto, falla y te desesperas.
</p>

<p>
  La tercera vez te escribes un script para evitar tropiezos y automatizas alguna parte del flujo del proyecto, sabes que esos scripts se van a perder en alguna carpeta.
</p>

<h2 id="here-we-go-again">
  Here we go, again.
</h2>

<p>
  Hasta que empiezas a entender que lo que necesitas es una herramienta que te ayude a gestionar todo esto.
</p>

<blockquote>
  <p>
    Si las cosas están en un solo lugar, solo se pueden romper una vez.
  </p>
</blockquote>

<p>
  Sueñas con que tenga un botón bien gordo que accione toda la magia y lo haga todo de una vez.
  Y te emocionas al pensar que vas a hacer con todo ese tiempo que has ganado... <em>(spoiler: hacer más herramientas y más proyectos).</em>
</p>

<p>
  Y así es más o menos como acabas montando algo como <a href="https://github.com/Katamo/lanzadera" rel="nofollow">Lanzadera</a>: un módulo PowerShell que convierte todos tus problemas a la hora de montar y desplegar un proyecto en dos o tres comandos reproducibles.
</p>

<hr />

<h2 id="aviso-para-caminantes">
  Aviso para caminantes.
</h2>

<p>
  En primer lugar tengo que advertir que es una herramienta hecha como un traje a medida para mi flujo de trabajo, he decidido ir con un stack de desarrollo, tener unas convenciones, usar un sistema operativo concreto y alojar los proyectos de manera similar en el mismo lugar.
</p>

<p>
  Esto hace que la solución esté muy pensada en lo que <strong>YO</strong> necesito así que probablemente no puedas usar <strong>Lanzadera</strong> para tu propio entorno pero sí espero que este proyecto te aporte ideas sobre como poner tus proyectos sobre raíles y hacer más sencillo todos esos flujos y tareas que hacen posible que un proyecto se pueda publicar y actualizar correctamente.
</p>

<h2 id="qué-es-lanzadera">
  ¿Qué es Lanzadera?.
</h2>

<p>
  Lanzadera es una herramienta de deploy para proyectos web en <strong>GCP</strong>. Gestiona la configuración de nginx, los certificados <strong>SSL</strong> con certbot, la autenticación <strong>PHP</strong>, un contador de visitas, la subida de archivos por <strong>SSH/SCP</strong>... todo desde <strong>Windows</strong> con <strong>PowerShell 5.1</strong>.
</p>

<p>
  No es un sistema de <strong>CI/CD</strong>. No tiene servidor, no tiene interfaz web, no requiere una cuenta en ningún servicio externo.
</p>

<p>
  Es un módulo PowerShell que se instala una vez en la máquina y luego está disponible en cualquier proyecto.
</p>

<p>
  El flujo completo para poner en marcha un proyecto nuevo es:
</p>

<pre language="text">
  install.ps1          → configura el proyecto (una vez)
  deploy.ps1 setup     → prepara el servidor (una vez por dominio)
  deploy.ps1 web       → sube el código (cada vez que quieras deployar)
</pre>

<p>
  <strong>Es decir</strong>: Inicializa un proyecto en local y configura todo, se conecta con el servidor y organiza todo en el servidor, luego te provee de comandos para que puedas ir haciendo releases, subiendo datos de la web o actualizaciones de código.
</p>

<hr />

<h2 id="cómo-funciona">
  ¿Cómo funciona?.
</h2>

<h3 id="la-config-de-máquina">
  La config de máquina.
</h3>

<p>
  Lanzadera separa la configuración en dos niveles. Por seguridad <em>(y para que no puedas subir datos comprometidos por error a un repo o en el despliegue)</em> La <strong>config de máquina</strong> vive fuera de todos los repositorios, en <code>~\.lanzadera\config.json</code>, y contiene las credenciales comunes a todos los proyectos: el usuario <strong>SSH</strong>, la ruta a la clave privada, el email para certbot, y la lista de instancias <strong>GCP</strong> a las que tienes acceso.
</p>

<p>
  <strong>Ejemplo del config</strong>
</p>

<pre language="json">
  {
    "user": "oscar",
    "key": "C:/Users/oscar/.ssh/google_compute_engine",
    "email": "tu@email.com",
    "targets": {
      "principal": {
        "instance": "nombre-instancia-gcp",
        "zone": "us-central1-a",
        "project": "id-proyecto-gcp",
        "path": "/var/www"
      }
    }
  }
</pre>

<blockquote>
  <p>
    Esto se configura una sola vez. A partir de ahí, cualquier proyecto que use ese target hereda automáticamente las credenciales.
  </p>
</blockquote>

<h3 id="la-config-del-proyecto">
  La config del proyecto.
</h3>

<p>
  La <strong>config del proyecto</strong> vive en <code>deploy.config.json</code> en la raíz de cada repo (en <code>.gitignore</code>, para que las rutas locales no se compartan). Define el dominio, la carpeta de build, si tiene auth, si tiene tracker de visitas...
</p>

<pre language="json">
  {
    "target": "principal",
    "domain": "miproyecto.omata.es",
    "buildCommand": "npm run build",
    "distPath": "dist",
    "auth": { "enabled": false },
    "tracker": { "enabled": false }
  }
</pre>

<blockquote>
  <p>
    Generarla a mano es innecesario porque <code>install.ps1</code> hace todo esto con un asistente interactivo.
  </p>
</blockquote>

<p>
  En el momento de la instalación inicial a través de un asistente por linea de comandos se te preguntarán las cosas más habituales para configurar correctamente el proyecto. <strong>Posteriormente siempre puedes editar este archivo si las necesidades de tu proyecto cambian</strong>.
</p>

<h3 id="el-setup-del-servidor">
  El setup del servidor.
</h3>

<p>
  El primer deploy de un dominio nuevo requiere configurar el servidor desde cero. <code>deploy.ps1 setup</code> hace eso en orden:
</p>

<ol>
  <li>
    Crea el webroot en el servidor
  </li>
  
  <li>
    Sube una config nginx HTTP-only y recarga nginx
  </li>
  
  <li>
    Ejecuta certbot para obtener el certificado SSL
  </li>
  
  <li>
    Sube la config nginx completa con HTTPS y recarga nginx
  </li>
  
  <li>
    Si el proyecto tiene auth, instala <code>php_mini_auth</code>
  </li>
  
  <li>
    Si el proyecto tiene tracker instala <code>migas</code>
  </li>
</ol>

<p>
  El orden importa: certbot necesita que nginx esté corriendo en HTTP para completar el challenge, así que no puedes saltarte los pasos intermedios. Lanzadera los gestiona en el orden correcto y no continúa si algo falla.
</p>

<p>
  Tras el setup, para deployar solo necesitas:
</p>

<pre language="powershell">
  .\scripts\deploy.ps1 web
</pre>

<blockquote>
  <p>
    Esto subirá todo tu proyecto al servidor recién configurado.
  </p>
</blockquote>

<hr />

<h2 id="la-separación-código-datos">
  La separación código / datos.
</h2>

<p>
  En varios de mis proyectos hay una carpeta <code>data/</code> dentro de <code>dist/</code> con cientos de archivos: JSON de contenido, imágenes, audio.
</p>

<p>
  Esos archivos no cambian con cada deploy de código y subirlos enteros cada vez es improductivo, lento y no tiene mucho sentido, así que para evitar eso:
</p>

<p>
  <strong>Lanzadera tiene dos modos de subida:</strong>
</p>

<ul>
  <li>
    <code>deploy.ps1 web</code> — sube todo <code>dist/</code> <strong>excepto</strong> la carpeta de datos
  </li>
  
  <li>
    <code>deploy.ps1 data</code> — sincroniza solo los archivos de datos que <strong>no existen</strong> en remoto
  </li>
</ul>

<p>
  La sincronización de datos compara los nombres de fichero antes de subir. Si un archivo ya está en el servidor, no se toca. Si es nuevo, se sube.
</p>

<blockquote>
  <p>
    Eso hace que añadir contenido a un proyecto sea rápido aunque el volumen acumulado sea grande.
  </p>
</blockquote>

<p>
  <strong>Para los casos en los que sí quieres forzar la subida completa:</strong>
</p>

<pre language="powershell">
  .\scripts\deploy.ps1 data -Force
</pre>

<blockquote>
  <p>
    Imagina que necesitas asegurarte de que reseteaste bien todo el contenido de datos.
  </p>
</blockquote>

<hr />

<h2 id="hooks">
  Hooks.
</h2>

<p>
  Algunos proyectos necesitan lógica personalizada al final de una fase. Para eso he creado los <strong>hooks</strong>: scripts PowerShell del proyecto que Lanzadera ejecuta cuando completa <code>setup</code> o <code>data</code>.
  Están inspirados en los hooks de un montón de tecnologías como por ejemplo git.
</p>

<p>
  La idea detrás de esto que puedas tener cierto control de personalización entre las fases de ejecución de Lanzadera, imagina que necesitas instalar algo solo para ese proyecto al final de la fase de setup.
</p>

<blockquote>
  <p>
    Entiende esto último como una personalización de ese proyecto y no algo que debería ir por sistema en todas las configs de un proyecto.
  </p>
</blockquote>

<p>
  Se declaran en <code>deploy.config.json</code>:
</p>

<pre language="json">
  {
    "postSetup": "scripts/post-setup.ps1",
    "postData": "scripts/sync-db.ps1"
  }
</pre>

<p>
  El script recibe un objeto <code>$ctx</code> con la IP del servidor, el usuario SSH, la clave y el webroot, y las funciones de Lanzadera (<code>Invoke-SSH</code>, <code>Invoke-SCP</code>...) están disponibles directamente. Esto hace que un hook sea solo la lógica específica del proyecto, sin tener que reimplementar la conexión SSH.
</p>

<p>
  Un ejemplo real: instalar PocketBase tras el setup.
</p>

<pre language="powershell">
  # scripts/post-setup.ps1
  param($ctx, $projectConfig)
  
  Invoke-SSH $ctx "mkdir -p /opt/pocketbase && wget -q -O /tmp/pb.zip https://..."
  Invoke-SSH $ctx "unzip -o /tmp/pb.zip -d /opt/pocketbase && chmod +x /opt/pocketbase/pocketbase"
  Invoke-SCPFile $ctx ".\config\pocketbase.service" "/tmp/pocketbase.service"
  Invoke-SSH $ctx "sudo mv /tmp/pocketbase.service /etc/systemd/system/ && sudo systemctl enable --now pocketbase"
</pre>

<p>
  Lo bueno de los hooks es que la lógica específica de cada proyecto queda documentada en el propio repo, versionada con git, y se ejecuta automáticamente sin que tengas que recordarla.
</p>

<hr />

<h2 id="releases-semánticas">
  Releases semánticas.
</h2>

<p>
  Para proyectos que usan versionado semántico, he creado el comando <code>release</code> hace todo el flujo de una vez:
</p>

<p>
  <strong>Ejemplo</strong>
</p>

<pre language="powershell">
  .\scripts\deploy.ps1 release          # patch: 1.0.0 → 1.0.1
  .\scripts\deploy.ps1 release minor    # minor: 1.0.1 → 1.1.0
  .\scripts\deploy.ps1 release major    # major: 1.1.0 → 2.0.0
</pre>

<p>
  Verifica que el working tree esté limpio, hace el build, deploya, crea un tag anotado y hace push a GitHub con los tags. Si el working tree tiene cambios sin commitear, se detiene antes de hacer nada <em>(No queremos subir nada que no esté en la rama buena)</em>
</p>

<hr />

<h2 id="equivalentes-npm">
  Equivalentes npm.
</h2>

<p>
  Si el proyecto tiene <code>package.json</code>, <code>install.ps1</code> añade los scripts de deploy automáticamente:
</p>

<pre language="json">
  {
    "scripts": {
      "deploy": "powershell -File scripts/deploy.ps1 web",
      "deploy:data": "powershell -File scripts/deploy.ps1 data",
      "deploy:release": "powershell -File scripts/deploy.ps1 release"
    }
  }
</pre>

<p>
  Esto último es por comodidad, cuanto menos tengas que pensar mejor, así puedes hacer <code>npm run deploy</code> sin recordar la sintaxis de PowerShell, a mí me resulta muy útil cuando cambio entre proyectos con frecuencia.
</p>

<hr />

<h2 id="por-qué-no-github-actions-otro-ci">
  Por qué no GitHub Actions / otro CI.
</h2>

<p>
  La respuesta corta es que no necesito un sistema tan complejo para proyectos personales.
</p>

<p>
  GitHub Actions requiere configurar secretos en el repositorio (la clave SSH, el proyecto GCP...), mantener un fichero <code>.yml</code> de workflow, y esperar a que el runner arranque cada vez que pusheas. Para un proyecto personal donde deploya una sola persona, desde una sola máquina, eso es más fricción que ayuda.
</p>

<p>
  Lanzadera corre en la máquina local, con las credenciales ya configuradas, y la retroalimentación es inmediata: ves el output en el terminal y sabes exactamente qué pasó. Si algo falla, puedes reintentarlo al momento.
</p>

<hr />

<h2 id="conclusiones">
  Conclusiones.
</h2>

<p>
  He creado una herramienta muy personalizada para poder montar, desplegar y actualizar proyectos sin fricción.
</p>

<p>
  Estoy metido en varios proyectos a la vez y hago subidas y actualizaciones frecuentes de los mismos, quito y pongo login, subo nuevos datos o releases.
</p>

<p>
  Unificar todos estos pasos en una herramienta ha supuesto una mejora enorme en mis tiempos de entrega, puedo estar saltando de un proyecto a otro haciendo cambios en proyectos que dependen unos de otros sin perder el tiempo.
</p>

<p>
  Es cierto que estoy muy atado ahora a un tipo de flujo pero al haber hecho esto modular siento que podría reescribir parte de la lógica modular del proyecto y adaptarme a hacer por ejemplo despliegues en Amazon o en otro hosting propio, volver a mac solo implicaría reescribir los scripts de deploy...
</p>

<blockquote>
  <p>
    En definitiva, estoy muy contento con el resultado.
  </p>
</blockquote>

<h2 id="roadmap">
  Roadmap.
</h2>

<p>
  Qué hacer a partir de ahora, todavía me queda trabajo por pulir, es posible que surjan nuevos addons como el que ya tiene de login o el de tracking de visitas, así que me gustaría trabajar en el sistema de plugins para que fuera un poco más modular y robusto.
</p>

<p>
  Por lo demás espero hacer pocas adaptaciones y centrarme en usarlo para sacarle partido con el resto del proyectos.
</p>

<blockquote>
  <p>
    En definitiva las mejores herramientas son aquellas que no necesitan mantenimiento y son casi invisibles. Funcionan y te olvidas de que existen.
  </p>
</blockquote>

<h2 id="dónde-encuentro-lanzadera">
  ¿Dónde encuentro Lanzadera?
</h2>

<p>
  El código está en <a href="https://github.com/Katamo/lanzadera" rel="nofollow">github.com/Katamo/lanzadera</a>. Los requisitos son <strong>Windows</strong> con <strong>PowerShell 5.1</strong>, <strong>gcloud CLI</strong> configurado, <strong>OpenSSH</strong> instalado y una <strong>clave SSH</strong> con acceso a las instancias <strong>GCP</strong>.
</p>

<p>
  Si te animas a usarla o te sirve de inspiración para hacer la tuya propia, me haría un poquito feliz saberlo.
</p>
]]></content:encoded>
        <category>Código</category>
        <category>Herramientas</category>
    </item>

    <item>
        <title>La carta de Kurt Vonnegut</title>
        <link>https://blog.omata.es/posts/la-carta-de-vonnegut</link>
        <guid isPermaLink="true">https://blog.omata.es/posts/la-carta-de-vonnegut</guid>
        <pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate>
        <description>En 2006, Kurt Vonnegut respondió con una motivadora carta a cinco estudiantes que le habían invitado a dar una charla. Fue el único autor de varios invitados en contestar.</description>
        <content:encoded><![CDATA[<p>
  No hay vez que no me encuentre con esta carta por internet que no me emocione al releerla. La he guardado mil veces, se la he enviado a amigos en múltiples ocasiones, incluso a veces la he buscado para releerla yo y calentarme un poquito el corazón con ella.
</p>

<blockquote>
  <p>
    Creo que expresa como pocas el sentimiento que me empuja a mantenerme activo y a disfrutar de las cosas que hago.
  </p>
</blockquote>

<p>
  Hoy ha sido la última vez que la he leído y ha sido para enviársela a mi hermano que acababa de terminar el libro <strong>Matadero 5, de Vonnegut</strong>.
</p>

<p>
  Mi hermano nunca ha sido de leer mucho, siempre ha tenido un montón de virtudes, pero la lectura no ha sido nunca una de ellas.
</p>

<p>
  Hace poco me sorprendió pidiéndome consejo para retomar el hábito de la lectura, quería que le fuera pasando libros de los que tenía yo en casa porque consideraba importante apartarse un rato de la pantalla, recuperar la capacidad de atención y por qué no, hacer de ejemplo para que mi sobrino tuviese un buen modelo sobre el que fijarse.
</p>

<p>
  Me pareció una idea muy buena y una oportunidad de empezar a compartir historias sobre lecturas que a mí me han hecho pensar mucho.
</p>

<blockquote>
  <p>
    Pocas cosas molan más en la vida que encontrar un compinche de lecturas para poder comentar los hallazgos en los libros que lees.
  </p>
</blockquote>

<p>
  La cosa estaba difícil porque además me pidió que fueran libros medianamente fáciles pero distintos y especiales.
</p>

<p>
  Sin ser yo un gran lector ni un lector voraz, sí que siempre he tenido la suerte de tener amigos con muy buen gusto para los libros de esos que siempre recomiendan la lectura justa para el momento vital en el que estás.
</p>

<p>
  Así que tenía un montón de listas con recomendaciones y libros excelentes <em>(al menos eso creo yo...)</em>; pero era todo un desafío encontrar libros que hablaran de temas distintos, que contaran las cosas de una manera especial y además no fueran librazos de los de desanimar. Encontrar un libro "beginner" pero que sembrara afición.
</p>

<blockquote>
  <p>
    ¿Vosotros qué libro habríais elegido?
  </p>
</blockquote>

<p>
  No podía por ejemplo recomendarle un Conde de Montecristo y cosas así, pese a ser ligero en el relato, trepidante y entretenidísimo, es un libro demasiado largo y puede volverse duro de acabar, tampoco podía irme a virguerías literarias, cosas muy densas, ni lugares demasiado comunes.
</p>

<p>
  Quería huir de best sellers y novelas de gran público, tampoco podía ser nada que tuviera un "sabor" demasiado "freak" o de nicho.
</p>

<p>
  El caso es que se me ocurrió empezar con <strong>Matadero 5 de Vonnegut</strong>, porque el autor es una de mis personas favoritas y casualmente además escribe grandes libros.
</p>

<p>
  La novela es sencilla, divertida y diferente, no es muy larga y deja poso. Sobre todo cuando conoces la intención real que movió al autor a escribir el libro.
</p>

<blockquote>
  <p>
    Vamos, es una novela que da para comentar, que es lo importante.
  </p>
</blockquote>

<p>
  El resultado es que le ha gustado muchísimo, y ya tiene preparados otros libros que le he prestado para leer; libros totalmente diferentes, <em>(ya me contará cuál de ellos escoge)</em>.
</p>

<p>
  Hemos hablado del argumento, de los personajes, de cómo la guerra es una mierda y no hay nada bonito que contar de ella, de cómo aparecen en otras novelas suyas los mismos personajes bajo otras apariencias y de cómo eso ayuda a cogerle cariño a los personajes y descubrir ese estilo literario propio que tiene.
</p>

<p>
  También hemos hablado sobre el escritor y de por qué pienso que es una gran persona.
</p>

<blockquote>
  <p>
    Me alegra mucho poder compartir con mi hermano una cosa como la lectura de un libro y todo lo que hay detrás y espero que sea el comienzo de una sana afición.
  </p>
</blockquote>

<p>
  Al final, y volviendo al tema que abría el post, le he pasado, para que la leyera, esta carta que escribió Vonnegut a unos estudiantes de colegio y que no puedo resistirme a compartir aquí de nuevo porque me identifico mucho con lo que dice; explica con sencillas palabras por qué sigo haciendo las cosas que me gustan y por qué deberíais seguir también haciéndolas todos vosotros.
</p>

<blockquote>
  <p>
    Sinceramente creo que es una enseñanza vital de las buenas, distinta a lo que solemos oír, bonita y optimista.
  </p>
</blockquote>

<hr />

<p>
  La carta dice así y todo según aparece la historia en múltiples sitios de internet que he consultado:
</p>

<div style="text-align: right">
  <p>
    <em>
      "En 2006, una profesora de inglés de Nueva York llamada Ms. Lockwood pidió a sus alumnos que escribieran a su autor favorito para convencerle de que visitara el colegio.<br />
      
      
      Cinco de ellos eligieron al novelista Kurt Vonnegut.<br />
      
      
      Aunque nunca llegó al Xavier High School, Vonnegut sí les respondió.<br />
      
      
      Fue el único autor en hacerlo."
    </em>
  </p>
</div>

<hr />

<p>
  5 de noviembre de 2006
</p>

<p>
  Queridos Xavier High School, Ms. Lockwood, y los señores Perin, McFeely, Batten, Maurer y Congiusta:
</p>

<p>
  Os agradezco vuestras amables cartas. Sabéis muy bien cómo alegrarle el día a un vejete de ochenta y cuatro años en el ocaso de su vida. Ya no hago apariciones públicas porque ahora mismo me parezco a una iguana más que a ninguna otra cosa.
</p>

<p>
  Lo que tenía que deciros, además, no llevaría mucho tiempo, a saber: practicad cualquier arte —música, canto, danza, interpretación, dibujo, pintura, escultura, poesía, ficción, ensayo, periodismo—, bien o mal, no para conseguir dinero y fama, sino para experimentar el devenir, para descubrir lo que lleváis dentro, para hacer crecer vuestra alma.
</p>

<p>
  Practicad cualquier arte, bien o mal, no para conseguir dinero y fama, sino para descubrir lo que lleváis dentro.
</p>

<p>
  ¡En serio! Me refiero a empezar ahora mismo, a hacer arte el resto de vuestras vidas. Dibujad un retrato gracioso o bonito de la señorita Lockwood y dádselo. Volved a casa bailando después del colegio, cantad en la ducha, y así sin parar. Haced una cara en el puré de patatas. Fingid que sois el Conde Drácula.
</p>

<p>
  Ahí va una tarea para esta noche, y espero que la señorita Lockwood os suspenda si no la hacéis: escribid un poema de seis versos sobre cualquier cosa, pero que rime. No vale jugar al tenis sin red. Hacedlo tan bien como podáis. Pero no le digáis a nadie lo que estáis haciendo. No lo mostréis ni lo recitéis a nadie, ni a vuestra novia, ni a vuestros padres, ni a la señorita Lockwood. ¿De acuerdo?
</p>

<p>
  Rompedlo en pedacitos minúsculos y tiradlos en papeleras bien separadas entre sí. Descubriréis que ya habéis sido gloriosamente recompensados por vuestro poema. Habéis experimentado el devenir, aprendido mucho más sobre lo que lleváis dentro, y habéis hecho crecer vuestra alma.
</p>

<p>
  ¡Dios os bendiga a todos!
</p>

<p>
  Kurt Vonnegut
</p>

<hr />

<p>
  <em>Carta original en inglés:</em>
</p>

<p>
  November 5, 2006
</p>

<p>
  Dear Xavier High School, and Ms. Lockwood, and Messrs. Perin, McFeely, Batten, Maurer, and Congiusta:
</p>

<p>
  I thank you for your friendly letters. You sure know how to cheer up a really old geezer (84) in his sunset years. I don't make public appearances anymore because I now resemble nothing so much as an iguana.
</p>

<p>
  What I had to say to you, moreover, would not take long, to wit: Practice any art—music, singing, dancing, acting, drawing, painting, sculpting, poetry, fiction, essays, reportage—no matter how well or badly, not to get money and fame, but to experience becoming, to find out what's inside you, to make your soul grow.
</p>

<p>
  Practice any art, however well or badly, not to get money and fame, but to find out what's inside you. Seriously! I mean starting right now, do art and do it for the rest of your lives. Draw a funny or nice picture of Ms. Lockwood and give it to her. Dance home after school, and sing in the shower, and on and on. Make a face in your mashed potatoes. Pretend you're Count Dracula.
</p>

<p>
  Here's an assignment for tonight, and I hope Ms. Lockwood will flunk you if you don't do it: Write a six-line poem about anything, but rhymed. No fair tennis without a net. Make it as good as you possibly can. But don't tell anybody what you're doing. Don't show it or recite it to anybody, not even your girlfriend or parents or whatever, or Ms. Lockwood. OK?
</p>

<p>
  Tear it up into teeny-weeny pieces and discard them into widely separated trash receptacles. You will find that you have already been gloriously rewarded for your poem. You have experienced becoming, learned a lot more about what's inside you, and you have made your soul grow.
</p>

<p>
  God bless you all!
</p>

<p>
  Kurt Vonnegut
</p>

<hr />

<p>
  Así fue.
</p>
]]></content:encoded>
        <category>Personal</category>
        <category>Lecturas</category>
    </item>

    <item>
        <title>Los deberes, gestiona bien tus tareas</title>
        <link>https://blog.omata.es/posts/los-deberes-gestiona-bien-tus-tareas</link>
        <guid isPermaLink="true">https://blog.omata.es/posts/los-deberes-gestiona-bien-tus-tareas</guid>
        <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
        <description>Un sistema de gestión de tareas transparente</description>
        <content:encoded><![CDATA[<p>
  No me gustan mucho los gestores de tareas, <em>(hablo de los centrados en desarrollo)</em> porque habitualmente añaden una capa más de trabajo a la ejecución de un proyecto, suelen acabar llenos de tareas sin completar y acaban siendo, <em>(al menos en mi caso)</em>, un cajón donde acabo metiendo un montón de problemas que debería haber solucionado en el proyecto o funcionalidades que debería haber desarrollado y no llegué a montar.
</p>

<p>
  Pero a veces, tengo que reconocer que, en proyectos largos, compartidos o en aquellos que dependen de acciones de otro, usar un gestor puede ser la diferencia entre sacar el proyecto bien y no sacarlo jamás.
</p>

<h2 id="los-deberes-son-aburridos">
  Los deberes son aburridos.
</h2>

<p>
  Aún así, gestionar tareas siempre me ha parecido un rollo.<br />
  En mi vida profesional he probado la mayoría de los sistemas de tareas con más o menos éxito, Desde una simple nota, a enviarme correos; changelogs y todolists, software y aplicaciones, Notion, Trello, Jira...<br />
  En todos llevar el tracking de las tareas es bastante aburrido y gestionarlas un doloroso trabajo en sí mismo.
</p>

<h2 id="el-problema-del-foco">
  El problema del foco.
</h2>

<p>
  Todas las aplicaciones o sistemas que he probado sufren en mayor o menor medida el mismo problema gordo cuando los usas para desarrollo y es lo que yo llamo: <strong>la fricción con el código</strong>.
</p>

<p>
  Lees una tarea, en un entorno y luego te tienes que ir a tu entorno otra vez a entender qué te está pidiendo, a veces cuenta cosas sobre un bloque de código y ese código viene sin formato.
  Tienes que ir a la aplicación, volver al código mirar, volver a la aplicación de tareas, explicar algo...
</p>

<p>
  Todo esto te desconcentra, tienes que estar con dos contextos a la vez y hace que inevitablemente pierdas tiempo y concentración, transportando ideas de una aplicación a otra.
</p>

<p>
  Es cierto que hay sistemas que producen menos fricción y están más integrados con tu zona de trabajo, tener a veces un sencillo archivo de texto sobre el que vas añadiendo y quitando cosas es bastante útil, no tienes que salir del area de concentración, tenerlo siempre disponible y si lo haces un poco profesional, puedes ir convirtiéndolo en un <strong>TODO-List/Changelog</strong> del proyecto directamente según resuelves o levantas tareas.
</p>

<p>
  Lamentablemente eso también tiene el problema de que es poco potente y no te permite enlazar tareas de distintos proyectos.
</p>

<h2 id="el-paraíso-del-procrastinador">
  El paraíso del procrastinador.
</h2>

<p>
  El otro gran problema que tienen los sistemas de gestión de tareas es que acaban siendo muy complejos y sirven para que ciertos perfiles de trabajo aprendan a vivir casi exclusivamente en esas aplicaciones de tareas, convirtiendo su labor en un ejercicio constante de levantar tareas y complejidad alrededor del trabajo pendiente.
</p>

<p>
  Así las aplicaciones de tareas se vuelven complejas, se llenan de etiquetas y convenciones, niveles de urgencia o importancia.
</p>

<p>
  Se crean tarjetas para todo y cada vez te consume más tiempo llevar el orden de lo que está pasando.
</p>

<p>
  Para un procrastinador avezado una aplicación de tareas así se convierte en el paraíso porque puede dedicarse todo el día a explicar qué tiene que hacer sin llegar realmente nunca a hacerlo.
</p>

<h2 id="hacer-la-cosa-de-la-procrastinación">
  Hacer la cosa de la procrastinación.
</h2>

<p>
  Yo, reconozco que tengo cierta tendencia a la procrastinación, me descubro a menudo merodeando alrededor de un problema sin llegar a pegarle un mordisco definitivo para resolverlo.<br />
  Pensando a veces que son demasiado bocado para atacarlo de una vez, creo tareas y defino y preparo un montón de cosas que deberían estar listas para poder hacer de ese problema un bocado asequible. En realidad, pura procrastinación.
</p>

<p>
  He aprendido con el tiempo a detectar cuando estoy siendo productivo y cuando estoy revoloteando alrededor de un problema sin atreverme a hincarle el diente.
</p>

<p>
  Darme cuenta de eso me hace algo más resistente a la pereza y la procrastinación pero no inmune.
</p>

<p>
  Así que cuando trabajo, busco procesos y herramientas que no me permitan detenerme mucho a contar los detalles, sobre todo ahora que ya no desarrollo en equipo, casi prefiero acometer una tarea que sé que tengo que realizar antes de pararme a documentarla y dejarla de hacer, perdiendo el tiempo en explicar cómo hacerla en lugar de hacerla.
</p>

<p>
  La contrapartida de esa manera de funcionar es que a veces paras tareas importantes para realizar otras y pierdes un poco el control sobre lo que estás desarrollando, corriendo el riesgo de no cerrar tampoco tareas importantes, por una indefinición clara de qué debería estar hecho.
</p>

<h2 id="buscando-el-santo-grial">
  Buscando el santo grial.
</h2>

<p>
  Analizando todas estas cosas, me he puesto a buscar durante unos días una solución que cubriese ciertos puntos para gestionar el tipo de proyectos que estoy ahora mismo desarrollando.
</p>

<p>
  Como trabajar en equipo ya no es un punto a tener en cuenta, la búsqueda de la aplicación se puede centrar en lo que me gusta a mí en concreto. Y a ello me he puesto.
</p>

<p>
  Primeramente, los puntos importantes que debía cumplir esta herramienta han sido:
</p>

<ul>
  <li>
    Que estuviera en mi entorno de desarrollo, es decir que viviera al mismo nivel que el código en el que estoy trabajando.
  </li>
  
  <li>
    Que fuera minimalista, con las mínimas funcionalidades, para no perder el tiempo añadiendo etiquetas.
  </li>
  
  <li>
    Que fuera muy extensible, si necesito una funcionalidad que no tenía, por ejemplo enlazar tareas de dos proyectos, tiene que ser fácil cambiarlo.
  </li>
  
  <li>
    Que permitiera enlazar proyectos y tareas que dependen de otras. Desarrollo varias cosas a la vez y unas dependen de otras, si necesitas una funcionalidad debes saber de qué depende, o conocer cuando una funcionalidad desbloquea cambios en otros proyectos.
  </li>
  
  <li>
    Que fuera muy rápida, y pueda acceder a las tareas pendientes sin perder mucho tiempo buscándolas.
  </li>
  
  <li>
    Que fuera muy sencilla de usar, sin menús sin niveles de profundidad.
  </li>
  
  <li>
    Y sobre todo, transparente que no tenga la sensación de estar usando una aplicación más sino que se convierte en parte de mi flujo de trabajo escribiendo en el mismo lugar en el que lo hago todo.
  </li>
</ul>

<h2 id="la-solución">
  La solución.
</h2>

<p>
  La respuesta y después de buscar soluciones y propuestas de otros desarrolladores, como todo buen programador ya debería haber anticipado, es: <strong>construir mi propia aplicación de tareas</strong> y eso es lo que he hecho aprovechando las dos cosas que tengo ahora siempre abiertas al trabajar: un editor de texto y Claude Code.
</p>

<hr />

<h2 id="ya-tiene-hasta-nombre">
  Ya tiene hasta nombre.
</h2>

<p>
  Se llama <strong>Los Deberes</strong> porque me sigue produciendo el mismo sentimiento llevarme los deberes del colegio a casa que resolver estas tareas de un proyecto.
</p>

<p>
  Dicho todo esto, paso a explicar por encima lo que he hecho y cómo funciona.
</p>

<p>
  <strong>Cómo funciona</strong>
</p>

<p>
  La idea es simple: <strong>cada tarea es una carpeta con un archivo Markdown dentro.</strong> Nada de bases de datos, nada de servicios externos.
  En esas carpetas guardo todo lo necesario para esa tarea, otros trozos de código, texto por elaborar, referencias...
</p>

<p>
  Todo vive en local, en mi disco, versionado con git y subida de vez en cuando a remoto para poder hacer backup por si rompo algo.
</p>

<p>
  Utilizo Claude <em>(aunque puedes montarlo con cualquier otra IA)</em> para interpretar y manejar todas esas tareas.
</p>

<p>
  <strong>Ejemplo</strong>
</p>

<pre language="text">
  datos/tareas/
  ├── bedrock/
  │   └── BDR-001-importacion-tipografias/
  │       └── tarea.md
  ├── mixes.0057/
  │   └── MIX-001-mejoras-ui-movil/
  │       └── tarea.md
  └── rutina/
      └── RUT-001-configurar-prettier/
          └── tarea.md
</pre>

<hr />

<p>
  <strong>Formato de la tarea</strong>
</p>

<p>
  Cada <code>tarea.md</code> tiene un frontmatter mínimo: id, título, proyecto, fecha, importancia y estado. El resto es texto libre.
</p>

<p>
  Este es un ejemplo real de una tarea que tenía abierta.
</p>

<pre language="text">
  ---
  id: MIX-003
  titulo: Sindicar el RSS
  proyecto: mixes.0057
  fecha: 2026-05-26
  importancia: media
  estado: pendiente
  ---
  
  ## Descripción
  
  Generar y publicar un feed RSS para el proyecto mixes.0057, de forma que los usuarios puedan suscribirse y recibir notificaciones cuando se publique un nuevo mix.
  
  ## Criterios / pasos
  
  - [ ] Decidir formato del feed (RSS 2.0 o Atom)
  - [ ] Definir los campos a incluir (título, fecha, descripción, portada, enlace al mix)
  - [ ] Generar el feed a partir del `index.json` existente (estático o con script de build)
  - [ ] Publicar el feed en una URL fija (ej. `/feed.xml` o `/rss.xml`)
  - [ ] Añadir `<link rel="alternate">` en el `<head>` del HTML para autodescubrimiento
  - [ ] Verificar el feed con un validador (W3C Feed Validator o similar)
</pre>

<p>
  Lo interesante aquí es que Claude Code lee esa estructura y la entiende. El proyecto incluye un <code>CLAUDE.md</code> con las convenciones del sistema, así que Claude sabe cómo crear tareas, calcular IDs, mover carpetas al completar, y listar pendientes por proyecto o importancia.
</p>

<p>
  Yo puedo también editar directamente cosas que ya no aplican o necesidades nuevas.
  La aplicación es tan sencilla que hacer un cambio en una tarea consiste simplemente editar un texto o pedírle a Claude que lo haga.
</p>

<hr />

<p>
  <strong>Los comandos</strong>
</p>

<p>
  Lo importante ocurre a través de dos slash commands que he instalado globalmente en Claude Code:
</p>

<h3 id="comando-deberes">
  Comando <em>/deberes</em>
</h3>

<p>
  <code>/deberes</code> gestiona la lista. Funciona desde cualquier proyecto, sin necesidad de abrir la carpeta de mi gestor de tareas.
</p>

<p>
  El modo de uso es sencillo, con lenguaje natural describes las cosas importantes de la tarea, ejemplo: <strong>
    añade <em>
      esto
    </em>
    
     a <em>
      éste
    </em>
    
     proyecto, es importante.
  </strong>
</p>

<pre language="text">
  /deberes añade una tarea a bedrock: revisar sistema de importación de tipografías, importancia alta
  /deberes lista las tareas pendientes
  /deberes tareas críticas
  /deberes marca como completada BDR-001
</pre>

<h3 id="comando-tarea">
  Comando <em>/tarea</em>
</h3>

<p>
  <code>/tarea</code> carga una tarea concreta y analiza cómo abordarla en el proyecto que tengas abierto en ese momento. Útil cuando sabes lo que tienes que hacer pero quieres que Claude te ayude a arrancar:
</p>

<p>
  Este comando sirve para arrancar con el desarrollo de una tarea o analizarla en detalle, Su uso es sencillo, después de listar, por ejemplo, los ids de varias tareas, usas ese Id para comenzar a trabajar en ella.
</p>

<pre language="text">
  /tarea MIX-001
</pre>

<p>
  Claude lee la descripción y los criterios, revisa el código del proyecto actual y te explica por dónde empezar, además es capaz de avisarte de las dependencias por si necesitas acabar antes con otra tarea.
</p>

<hr />

<p>
  <strong>Tareas de rutina</strong>
</p>

<p>
  Algunos cambios hay que aplicarlos en varios proyectos a la vez: actualizar una dependencia, añadir un archivo de configuración, aplicar un nuevo estándar de código. Para eso he extendido las funcionalidades añadiendo un tipo nuevo de tarea transversal, <strong>las tareas de rutina</strong>.
</p>

<p>
  Una rutina tiene una lista de proyectos donde debe aplicarse.<br />
  Cuando la completas en uno, lo eliminas de la lista.<br />
  Cuando la lista queda vacía, la tarea se archiva automáticamente.<br />
  Pueden ser tareas que tienen que ser completadas todos los días o que van a repetirse a lo largo de varios proyectos.
</p>

<blockquote>
  <p>
    Lo bueno es que todo esto lo detallas en lenguaje natural y si en algún momento descubres que una funcionalidad como esta no es útil la eliminas del flujo con un par de frases y ya tienes gestor más ajustado a tus necesidades.
  </p>
</blockquote>

<p>
  A mí me funciona trabajar con rutinas así:
</p>

<pre language="text">
  /deberes añade una rutina: configurar prettier en bedrock, mixes.0057 y plantillas
  /deberes he aplicado RUT-001 en bedrock
  → RUT-001 actualizada. Pendiente en: mixes.0057, plantillas.
</pre>

<hr />

<p>
  <strong>Tareas vinculadas</strong>
</p>

<p>
  A veces terminar una tarea en un proyecto abre trabajo en otro. Por ejemplo: implemento un componente en mi librería de UI y ese componente debería integrarse después en tres proyectos distintos.
</p>

<p>
  El campo <code>desbloquea</code> captura esa relación:
</p>

<pre language="markdown">
  ---
  id: PLT-003
  titulo: Componente tabla ordenable
  proyecto: plantillas
  desbloquea: MIG-007
  ---
</pre>

<p>
  Al completar PLT-003, Claude me avisará de que MIG-007 está lista para empezar y me pregunta si quiero arrancar con ella ahora.
</p>

<hr />

<p>
  <strong>Changelog automático</strong>
</p>

<p>
  Otro punto que puede beneficiarse de esta automatización es el changelog. El changelog es una cosa difícil de mantener que exige disciplina y cuyo beneficio solo puedes ver si eres persistente añadiendo tareas completadas, cosas qeu en los proyectos en solitario supone una carga de trabajo innecesario y que a menudo abandonas a la tercera release.
</p>

<p>
  En Los Deberes mantener el changelog te sale gratis porque se encarga automáticamente la aplicación de hacerlo por ti cuando se lo indicas, sin perder tiempo ni aplicar esfuerzo.
</p>

<p>
  Como en Los Deberes tengo las tareas completadas guardadas con fecha, título e importancia, es muy sencillo automatizar todo. El camino para hacerlo que encontré es añadir un tercer comando que convierte ese historial en una entrada de changelog.
</p>

<h3 id="comando-changelog">
  Comando <em>/changelog</em>
</h3>

<pre language="text">
  /changelog bedrock
</pre>

<p>
  El comando lee las tareas completadas del proyecto, detecta cuáles son nuevas desde la última entrada del <code>CHANGELOG.md</code>, sugiere una versión semver según la importancia más alta de las tareas <em>(crítica → major, alta → minor, media/baja → patch)</em> y te muestra un borrador para que lo apruebes o ajustes la versión antes de escribir nada.
</p>

<pre language="text">
  ## [0.2.0] - 2026-05-30
  
  ### Added
  - BDR-003 Sistema de tokens de color con soporte dark mode
  
  ### Fixed
  - BDR-001 Corregir sistema de importación de tipografías
</pre>

<p>
  El <code>CHANGELOG.md</code> vive en cada proyecto, no en el gestor. Es exactamente donde debe estar: versionado junto al código, accesible para cualquiera que clone el repo.
</p>

<hr />

<h2 id="el-flujo-real">
  El flujo real.
</h2>

<p>
  Cómo es trabajar con en un proyecto entonces con este gestor?
</p>

<p>
  Cuando quiero trabajar en un proyecto arranco Claude Code en ese directorio, al arrancar Claude ya tiene los comandos guardados y sabe qué hacer si le solicito algo a través de ellos.
</p>

<p>
  Puedo escribir en la linea de comandos: <code>/tarea BLG-001</code>. <br />
  Entonces un skill lee el archivo, me muestra el resumen y me pregunta por dónde quiero empezar.
</p>

<p>
  Cuando termino una tarea, la muevo a <code>datos/completadas/</code> y listo. Con Git guardo el historial de todo.
</p>

<p>
  Si quiero actualizar el changelog, con un comando está hecho.
</p>

<p>
  Lo que me resulta especialmente útil es que puedo añadir contexto a las tareas. Si hay una decisión que tomé, una referencia que encontré o una restricción que descubrí mientras trabajaba, la apunto directamente en el <code>tarea.md</code>. La próxima vez que retome esa tarea, Claude tiene todo el contexto sin que yo tenga que recordar nada.
</p>

<p>
  Es, básicamente, una memoria externa que vive junto al código.
</p>

<h2 id="por-qué-funciona-para-mí">
  Por qué funciona (para mí).
</h2>

<p>
  Para alguien que trabaja solo, en varios proyectos pequeños, con un asistente de IA siempre abierto en el terminal, tener las tareas en texto plano con git es lo más cómodo y transparente que he podido diseñar.
</p>

<p>
  Las tareas están versionadas. Puedo ver cuándo creé algo, cuándo lo modifiqué, cuándo lo completé. No dependo de que una plataforma cambie sus condiciones ni de que el servicio esté disponible. Y si en algún momento quiero cambiar algo del sistema, lo cambio yo directamente porque son solo archivos.
</p>

<p>
  El sistema tiene sus limitaciones, claro. No hay notificaciones, no hay fechas límite que me avisen, no hay integración con calendarios. Pero tampoco las necesito. Si algo es urgente, ya lo sé sin que me lo diga una app, y si necesito extenderla y tener más control puedo añadir nuevas reglas.
</p>

<p>
  La aplicación entonces es un repositorio de archivos de texto plano, se interactúa con ella a través de Claude en el propio IDE, y solicitando cosas en lenguaje natural, puedes ver las dependencias con otras tareas, abrir nuevas incidencias sobre otro proyecto directamente en el proyecto en el que estás trabajando y sin salir de la pantalla de trabajo, puedes guardar trozos de código o textos dentro de cada tarea, pues cada tarea reside en su propia carpeta, es prácticamente transparente y muy sencilla de usar.
</p>

<h2 id="y-eso-es-todo-amigos">
  Y eso es todo amigos.
</h2>

<p>
  En mi condiciones y para el tipo de proyectos que estoy montando ahora mismo, se ha convertido en el flujo de trabajo ideal, cero fricción y mínimo tiempo perdido en gestionar incidencias.
</p>

<p>
  No digo que sea para todo el mundo pero si crees que encaja con tu modo de trabajar, aquí te dejo el repositorio donde la he subido <a href="https://github.com/Katamo/losdeberes" rel="nofollow">github.com/Katamo/losdeberes</a>.
</p>

<p>
  Un detalle a tener en cuenta es que la herramienta es pública, las tareas son privadas(*). El repo que instalas no contiene ninguna tarea: la carpeta <code>datos/</code> está en el <code>.gitignore</code>. Puedes gestionarla como un repo git privado independiente, o simplemente dejarla en local.
</p>

<p>
  <strong>
    <em>
      (*) Suponiendo claro que todo lo que subes a claude es compartido para entrenar su modelo. Aunque nada te impide adaptar este proyecto para usarlo con un modelo local ya que no necesita ser muy potente.
    </em>
  </strong>
</p>

<p>
  En definitiva, Deberes es un sistema de trabajo más que un producto. No tiene interfaz, no tiene servidor, no tiene cuenta que crear y es totalmente personalizable.
</p>

<p>
  Funciona porque Claude Code ya sabe leer texto y seguir instrucciones y porque los archivos Markdown son lo suficientemente flexibles como para modelar casi cualquier flujo de trabajo, puedes modificarla a tu gusto simplemente añadiéndole o quitándole funcionalidades.
</p>

<p>
  No tengo planes de hacerle interfaz gráfica ni de complicarla, sencillez máxima e ir adaptando el flujo de trabajo según lo necesite, creo que he encontrado una gran solución para gestionar proyectos de desarrollo y la iré puliendo según avance en su uso.
</p>

<p>
  Cuando lleve un tiempo con ella espero escribir otro post sobre cómo ha ido.
</p>

<p>
  Si la pruebas cuéntame qué te parece y qué cambios le hiciste.
</p>
]]></content:encoded>
        <category>Código</category>
        <category>Herramientas</category>
    </item>

    <item>
        <title>Migas: tracker de analytics propio</title>
        <link>https://blog.omata.es/posts/migas-tracker-analytics-propio</link>
        <guid isPermaLink="true">https://blog.omata.es/posts/migas-tracker-analytics-propio</guid>
        <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
        <description>Un sistema de analytics minimalista, autoalojado y que respeta tus datos.</description>
        <content:encoded><![CDATA[<p>
  Hoy quiero contarte sobre <strong>Migas</strong>, otra de las herramientas que he desarrollado recientemente: un <em>tracker</em> de visitas muy sencillo.
</p>

<p>
  Ahora que tengo varios proyectos publicados me vendría bien saber de dónde vienen las visitas, qué visitan más y en qué cantidad lo hacen, así que he pensado en añadir un sistema de <em>tracking</em> a alguno de los proyectos que tengo ya online. Antes de ponerme a montar nada he estado analizando lo que necesitaba.
</p>

<p>
  Estos eran los requisitos de salida:
</p>

<ul>
  <li>
    Necesitaba una herramienta muy sencilla.
  </li>
  
  <li>
    Que fuera fácil de instalar en los distintos proyectos que tengo.
  </li>
  
  <li>
    No hacía falta que estuviera en ningún <em>hosting</em> podía residir perfectamente en local.
  </li>
  
  <li>
    Tenía que permitirme ver todas las visitas de todos los proyectos a la vez.
  </li>
  
  <li>
    Acoplarse bien en el <em>stack</em> de tecnologías que uso para los proyectos.
  </li>
  
  <li>
    Que los datos fuesen solo míos y saber qué datos realmente estoy recopilando para no ser intrusivo con el visitante.
  </li>
</ul>

<h2 id="por-qué-no-x">
  Por qué no X
</h2>

<p>
  Estuve mirando opciones ya existentes y fui descartándolas todas.
</p>

<p>
  <strong>¿Por qué no Google Analytics?</strong> Usar Google Analytics supone una opción sobredimensionada y además implica compartir mis datos con terceros. Con <strong>Migas</strong>, los datos los tengo solo yo.
</p>

<p>
  <strong>¿Por qué no Plausible / Fathom?</strong> Son buenas opciones pero tienen coste mensual. <strong>Migas</strong> es gratuito porque corre en infraestructura que ya tengo.
</p>

<p>
  <strong>¿Por qué no Matomo?</strong> Matomo es potente pero pesado para lo que necesito. Un servidor PHP y un fichero de texto son suficientes.
</p>

<p>
  <strong>¿Por qué JSONL y no una base de datos?</strong> Un fichero de <em>log</em> append-only no tiene dependencias, no requiere backups adicionales, y para el volumen de un proyecto personal es perfectamente manejable. Si algún día las visitas escalan, la migración a SQLite o similar es directa.
</p>

<p>
  Así que acabé tomando la decisión de montar <strong>Migas</strong>: un sistema de <em>analytics</em> minimalista, autoalojado, que cabe en tres ficheros PHP y un par de componentes Vue.
</p>

<h2 id="qué-es-migas">
  Qué es <strong>Migas</strong>
</h2>

<p>
  Voy a ponerme un poco técnico el resto de la entrada, que es un post para gafotas y amigos de las teclas pero creo que merece la pena contarlo. Espero que este tipo de contenidos os animen a montar vuestras propias herramientas.
</p>

<p>
  <strong>Migas</strong> tiene tres piezas independientes:
</p>

<h3 id="_1-el-tracker">
  1 El <em>tracker</em>
</h3>

<p>
  Es un módulo PHP portable que se copia en cualquier proyecto web. Expone varios <em>endpoints</em>:
</p>

<ul>
  <li>
    <code>POST /tracker/log.php</code> — recibe un evento de visita desde la SPA y lo guarda en un fichero de <em>log</em> JSONL.
  </li>
  
  <li>
    <code>GET /tracker/read.php</code> — devuelve el <em>log</em> completo, protegido con un <code>Bearer token</code>.
  </li>
  
  <li>
    <code>POST /tracker/flush.php</code> — descarga los datos a local y vacía el log.
  </li>
</ul>

<p>
  Este <em>tracker</em> no guarda IPs. No usa cookies. No instala nada en el navegador del visitante. El registro de cada visita tiene este aspecto:
</p>

<pre language="json">
  {
    "ts": "2026-05-28T18:32:01Z",
    "path": "/mix/01",
    "referrer": "",
    "screen": "1920x1080",
    "lang": "es",
    "ua": "Mozilla/5.0..."
  }
</pre>

<h3 id="_2-el-viewer">
  2 El <em>viewer</em>
</h3>

<p>
  Es una SPA en Vue 3 que actúa como panel de control central. Se conecta a los <em>trackers</em> de todos tus proyectos a través de un <em>proxy</em> PHP que mantiene los tokens fuera del <em>bundle</em> JavaScript. Desde ahí puedes ver las visitas de cada proyecto, filtrar por ruta o fecha, y paginar la tabla.
</p>

<h3 id="_3-la-app">
  3 La <em>app</em>
</h3>

<p>
  Es opcional y sirve para tener el <em>viewer</em> por comodidad en una <em>app</em> de escritorio; ejecutas un <code>.exe</code> y tienes la consola de visitas abierta.
</p>

<h2 id="cómo-funciona">
  Cómo funciona
</h2>

<p>
  El flujo completo es:
</p>

<pre language="text">
  SPA del proyecto  →  POST /tracker/log.php  →  visits.log
                                                      ↑ Bearer token
  viewer (local)   →  /api/fetch.php (proxy)  →  GET /tracker/read.php
</pre>

<p>
  La SPA llama a <code>log.php</code> en el mismo servidor donde está desplegada. <code>log.php</code> valida que el origen esté en la lista de dominios permitidos, añade el timestamp y el user agent, y hace un append al fichero de <em>log</em>.
</p>

<p>
  El <em>viewer</em> corre en local. Cuando seleccionas un proyecto, su <em>proxy</em> PHP llama a <code>read.php</code> con el token secreto y devuelve el JSONL. Los tokens nunca llegan al navegador.
</p>

<p>
  <strong>Por decirlo brevemente</strong>:
</p>

<ul>
  <li>
    Instalas en el servidor de tu proyecto el bloque del <em>tracker</em>.
  </li>
  
  <li>
    Añades en tu proyecto las llamadas al <em>tracker</em>.
  </li>
  
  <li>
    Configuras un JSON con los datos de tu proyecto a trackear en el viewer.
  </li>
  
  <li>
    Accedes a los resultados ejecutando el viewer en local en modo desarrollo u opcionalmente usando el <em>viewer</em> en formato app <code>.exe</code> de <strong>Electron</strong> que es más cómodo.
  </li>
</ul>

<blockquote>
  <p>
    📌 Tienes unas instrucciones completas de instalación en el <a href="https://github.com/Katamo/migas" rel="nofollow">README.md</a> del proyecto en GitHub.
  </p>
</blockquote>

<h2 id="llamar-al-tracker-desde-la-spa">
  Llamar al tracker desde la SPA
</h2>

<p>
  Lo más fácil para trackear visitas desde cualquier Vue SPA es usar un composable o una llamada directa al montar la app:
</p>

<pre language="js">
  // src/composables/use-tracker.js
  export function useTracker() {
    function track(path) {
      navigator.sendBeacon(
        "/tracker/log.php",
        JSON.stringify({
          path,
          referrer: document.referrer,
          screen: `${screen.width}x${screen.height}`,
          lang: navigator.language,
        }),
      );
    }
    return { track };
  }
</pre>

<p>
  <strong>Cada llamada del router envía al log el dato de navegación</strong>
</p>

<pre language="js">
  // En App.vue o router/index.js
  router.afterEach((to) => {
    navigator.sendBeacon(
      "/tracker/log.php",
      JSON.stringify({
        path: to.path,
        referrer: document.referrer,
        screen: `${screen.width}x${screen.height}`,
        lang: navigator.language,
      }),
    );
  });
</pre>

<p>
  <code>sendBeacon</code> es no bloqueante: el navegador envía la petición aunque el usuario esté navegando a otra página, sin añadir latencia a la experiencia.
</p>

<hr />

<h2 id="qué-se-ve-en-el-viewer">
  Qué se ve en el viewer
</h2>

<p>
  El <em>dashboard</em> es sencillo, tiene dos vistas, una con un resumen de todos los proyectos trackeados y una lista de las últimas visitas sin filtrar de todos los proyectos.
</p>

<p>
  <img alt="Dashboard de migas " src="/media/2026-05-29-migas/img-migas-001.png" />
</p>

<p>
  Pulsando en una de las <em>cards</em> de resumen de un proyecto, accedes a una vista en detalle con algunas estadísticas de páginas más visitadas y una tabla con los <em>logs</em> cargados.
</p>

<p>
  <img alt="Detalle de proyecto trackeado " src="/media/2026-05-29-migas/img-migas-002.png" />
</p>

<p>
  La tabla muestra: ruta, timestamp, referrer, resolución, idioma y user agent. Hay filtros por ruta y por rango de fechas, y paginación para logs con muchas entradas.
</p>

<h2 id="conclusión">
  Conclusión
</h2>

<p>
  Y eso es justo lo que quería: un <em>tracker</em> sencillo para ver qué páginas funcionan, detectar de dónde viene el tráfico, confirmar que los <em>deploys</em> llegan a los usuarios. Sin <em>dashboards</em> de cinco niveles y sin ceder datos a terceros.
</p>

<p>
  El código está en <a href="https://github.com/Katamo/migas" rel="nofollow">github.com/Katamo/migas</a> si te animas a usarlo o adaptarlo, adelante.
</p>
]]></content:encoded>
        <category>Código</category>
        <category>Herramientas</category>
    </item>

    <item>
        <title>Una Herramienta con mis mejores intenciones</title>
        <link>https://blog.omata.es/posts/una-herramienta-con-mis-mejores-intenciones</link>
        <guid isPermaLink="true">https://blog.omata.es/posts/una-herramienta-con-mis-mejores-intenciones</guid>
        <pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate>
        <description>CSS Bedrock, un framework lleno de reglas para trabajar mejor.</description>
        <content:encoded><![CDATA[<h2 id="apilar-cacharros">
  Apilar cacharros.
</h2>

<p>
  La informática y en concreto el trabajo de programador básicamente consiste en montar cacharros complicados usando otros cacharros complicados y con el resultado montar cacharros más grandes y más complicados que necesitan de esos otros que montaste antes. Cada capa le añade al asunto un poquito de complejidad con la contrapartida de ganar también en potencia y posibilidades.
</p>

<p>
  Esto es particularmente cierto en el caso de las herramientas que construimos para poder montar cosas más grandes.
</p>

<p>
  Tener una herramienta que automatice algún proceso que actualmente tiene que hacer un informático a mano es el sueño dorado de cualquier desarrollador.
</p>

<p>
  Apretar un botón y que todo automágicamente funcione solo, es la fantasía a la que aspiramos todos los programadores <em>(después de la fantasía de cobrar por el poquito de magia)</em>.
</p>

<blockquote>
  <p>
    En este sentido considero que la pereza es el pilar básico que sustenta toda la programación, con permiso de la codicia.
  </p>
</blockquote>

<h2 id="no-te-repitas">
  No te repitas.
</h2>

<p>
  Súmale a estas ganas de hacer que todo funcione con el mínimo esfuerzo la alegría que se siente cuando descubres que una solución que hiciste funciona y que no solo funciona sino que puedes usarla y repetir el truco <em>(...y cobrar por ello)</em> en otro proyecto.<br />
  Si consigues meterlo en una caja y ponerle un nombre, ¡Enhorabuena! porque has creado una herramienta.
</p>

<p>
  A partir de ahora puedes usar esa herramienta para generar parte de tu trabajo. Podríamos pensar que esto se traducirá en menos trabajo para ti o tu equipo pero eso es llevar las cosas demasiado lejos.
</p>

<p>
  Lo que sucede con ese tiempo y esfuerzo que ahorras es que puedes tener más tiempo para trabajar más y hacer cosas más grandes y más complicadas.<br />
  ¡Enhorabuena de nuevo! has apilado otra capa en la montaña de la complejidad computacional de tu profesión.
</p>

<p>
  La buena noticia es que ahora con una herramienta que se encuentra varias capas más abajo puedes arreglar un problema que se produce en un montón de aplicaciones más arriba de esa montaña de cacharros.
</p>

<p>
  La mala noticia es que si se rompe algo montaña abajo, todas las cosas de arriba se rompen a la vez.
</p>

<p>
  Pero no pasa nada porque los informáticos somos especialistas en arreglar cosas o en su defecto montar cacharros que arreglen esos errores.
</p>

<h2 id="volvemos-a-la-fantasía">
  Volvemos a la fantasía.
</h2>

<p>
  Después de explicar cómo funciona básicamente el mundo de la informática para gente que no es de la profesión, o al menos intentar explicar cómo es una de sus facetas.<br />
  Viene ahora lo que todo programador o equipo hace en cuanto tiene la posibilidad.
</p>

<p>
  Que es utilizar herramientas para ahorrarse trabajo en el día a día y esta oportunidad surge muy habitualmente pues los programadores somos gente muy entrenada en detectar patrones que se repiten.
</p>

<p>
  En cuanto descubres algo que ya hiciste en su momento dices: ¡Ah! ¿Dónde hice yo algo parecido antes? y te lanzas a buscar el trozo de código que hacía más o menos lo que ahora mismo necesitas para adaptarlo.
</p>

<p>
  En ocasiones incluso ante una tarea que se presenta compleja o repetitiva el demonio de la pereza que habita en el interior de todo informático que se precie, avisa al programador para que busque una herramienta en internet de alguien que ya haya hecho eso antes y haya compartido con la comunidad.
</p>

<blockquote>
  <p>
    (Algún día habrá que hablar de la sacrificada fraternidad universal de la pereza que tanto ha hecho avanzar a la humanidad en estos últimos 50 años. La diferencia en este caso de la autoría y los derechos de autor con otros campos de la creación da para una buena discusión).
  </p>
</blockquote>

<p>
  Y en algunas contadas ocasiones surge la oportunidad de crear para ti o junto a tu equipo una nueva herramienta, tu propuesta de cómo te han funcionado a ti las cosas, de esas ideas que encontraste y guardaste y que si consigues juntarlas y ponerles un nombre, te darán prestigio y ahorrarán mucho trabajo <em>(En teoría)</em>.
</p>

<p>
  Y ahí comienza la tarea, <em>(en la que nadie se pone de acuerdo por cierto)</em> de darle forma a un cacharro que te haga trabajar un poquito menos, repito <em>(En teoría)</em>.
</p>

<h2 id="el-génesis">
  El Génesis.
</h2>

<p>
  Y más o menos así es cómo nace la idea de programar cualquier herramienta, Ilusión, pereza algo de codicia y si hablamos de un proyecto en grupo una buena cantidad de discusiones, <em>(discusiones que por cierto suelen dar lugar a las mejores escisiones de grupos que generan nuevas herramientas)</em>.
</p>

<h2 id="ahora-mi-cacharro">
  Ahora mi cacharro.
</h2>

<p>
  Pero centrándonos en el proyecto del que quiero hablar, y como he vuelto a montar webs enseguida me ha surgido la opotunidad de crear una herramienta que me permita hacer más cosas en menos tiempo.
</p>

<p>
  He juntado algunas de las ideas que usé con éxito en anteriores trabajos y les he puesto nombre, el framework está todavía en desarrollo, es decir, voy añadiendo funcionalidades a medida que las voy necesitando en varios sitios, guardando cosas que ya he usado y puedo volver a usar más adelante en esta herramienta.
</p>

<p>
  Os dejo por aquí un enlace a <strong>
    <a href="https://katamo.github.io/css_bedrock/" rel="nofollow">
      CSS Bedrock
    </a>
  </strong>
  
  , un framework con un montón de reglas, buenas prácticas, herramientas y algunos bloques y componentes para ayudaros a montar aplicaciones web.
</p>

<p>
  Está orientado a no repetir cosas, a que se pueda aplicar en un equipo de varios desarrolladores y para proyectos medianamente grandes en código y duración.
</p>

<p>
  El conjunto de reglas y recomendaciones que recojo tienen su eficacia probada por mí y por compañeros con los que trabajé en proyectos larguísimos de varios años de duración en los que mantener el código antiguo limpio y revisable era de suma importancia.
</p>

<h2 id="el-desarrollador-tiene-que-ser-transparente">
  El desarrollador tiene que ser transparente.
</h2>

<p>
  Una de las ventajas que ofrece un conjunto de reglas así, es conseguir que en un equipo de varias personas trabajando a la vez, el programador pase a ser invisible, que no se pueda saber quién ha hecho qué parte porque las reglas solo te permiten hacer las cosas de una manera.
</p>

<p>
  Esto que podría parecer un problema en proyectos de muy larga duración se convierte en una ventaja, al hacer código sencillo y mantenible.
</p>

<h2 id="las-cosas-claras">
  Las cosas claras
</h2>

<p>
  Este proyecto quiere mantener una filosofía presente desde el inicio del desarrollo web y que es la idea principal que motivó la forma que tienen hoy ciertos lenguajes y es, separar contenido de presentación, algo que parece haberse olvidado en ciertas herramientas similares a ésta y que hoy en día gozan de una gran popularidad. En este sentido es claro, en el HTML <em>(contenido)</em> no se añade presentación <em>(estilos)</em>.
</p>

<p>
  Por otro lado también invita a que las piezas que desarrolles no dependan de otras piezas que pueden cambiar. <em>(Una de las pesadillas recurrentes de un programador es tener que arreglar algo que depende de otra cosa que cambió)</em>
</p>

<h2 id="plantillas-el-compañero-de-bedrock">
  Plantillas, el compañero de Bedrock.
</h2>

<p>
  Una de las cosas que me ha permitido montar Bedrock, además de este blog, es generar otra herramienta llamada <strong>
    <a href="https://github.com/Katamo/plantillas" rel="nofollow">
      Plantillas
    </a>
  </strong>
  
   <em>(sí, he apilado otra capa en esta montaña infernal de la complejidad)</em>. Y sirve para reutilizar trozos de código generados con Bedrock.
</p>

<p>
  Porque Bedrock propone buenas prácticas y un puñado de funciones, pero nada me impide con ese tratado de buenas maneras crear bloques que pueda reutilizar en un montón de proyectos.
</p>

<p>
  Pongo un ejemplo para que quede más claro, <strong>si en algún momento monto un layout de una cabecera un contenido principal y un footer para una web</strong>. ¿Por qué iba a tener que volver a programarlo si ya lo hice en algún lugar del espacio-tiempo? mi demonio de la pereza se revolvería dentro de mí si no lo hiciera.
</p>

<p>
  Así que esa es la idea fundacional de mi proyecto <strong>Plantillas</strong> del que podéis ver algunas piezas ya funcionando en <a href="https://katamo.github.io/plantillas/" rel="nofollow">este enlace</a>.
</p>

<h2 id="un-último-mensaje">
  Un último mensaje.
</h2>

<p>
  Si estás pensando usarlo porque crees que podría serte de utilidad, avísame, estoy disponible en github, copia el proyecto y destrípalo, añade modificaciones o coméntamelas.
</p>

<blockquote>
  <p>
    <strong>Advertencia</strong> El proyecto está en una fase inicial pero ya es usable, aún así puede que te encuentres con que no tiene alguna funcionalidad crítica que necesitas, valora qué te aporta la dependencia antes de añadirla a tu stack del proyecto.
  </p>
</blockquote>

<p>
  Nadie quiere hacer el trabajo dos veces si puede evitarlo, así que si este código te es de alguna utilidad, tuyo es.
</p>
]]></content:encoded>
        <category>Código</category>
        <category>Herramientas</category>
    </item>

    <item>
        <title>Hello World!</title>
        <link>https://blog.omata.es/posts/hello-world</link>
        <guid isPermaLink="true">https://blog.omata.es/posts/hello-world</guid>
        <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
        <description>Comienzo de un proyecto.</description>
        <content:encoded><![CDATA[<h2 id="saludos">
  ¡Saludos!
</h2>

<p>
  Pongo en funcionamiento esto con el primer post de mi nuevo proyecto <a href="https://blog.omata.es" rel="nofollow">blog</a>.<br />
  Hace 3 años abandoné el mundo de la programación por razones personales y me prometí no volver a encender un ordenador en la vida, pero como si fuera un propósito de año nuevo no me ha durado mucho el juramento.<br />
  Llevo unos meses probando tecnologías y haciendo pruebas, desarrollando prototipos de ideas que tenía guardadas en un cajón y montando un montón de cosas nuevas que se me han ocurrido en este tiempo.
  He pasado varios meses desoxidándome y recordando cómo era mi profesión, a decir verdad, he estado casi 3 años sin tocar un teclado y muy feliz.<br />
  La cabeza se acostumbra muy rápido a esa nueva realidad y va olvidando y haciendo pequeñas todas esas ideas y recursos mentales, haciendo hueco para esas nuevas cosas que vienen en la vida.
</p>

<h2 id="lo-echaba-de-menos">
  ¿Lo echaba de menos?
</h2>

<p>
  <strong>No.</strong> Bueno lo que se echa de menos es tener la cabeza ocupada resolviendo desafíos, afortunadamente me he mantenido despierto estudiando otras cosas que me apasionan, así que el cerebro se ha mantenido con músculo y es una cosa que agradezco mucho, ahora que retomo la actividad sesuda.<br />
  No os voy a engañar tampoco y en estos tres años he olvidado un montón de trucos y conocimientos básicos, vuelve a ser muy frustrante no recordar como centrar un <code><div></code>.
</p>

<p>
  Ahora que no tengo la presión de hacer entregas en un día, ni obligación de coordinarme con un equipo, ni de dejar todo absolutamente perfecto, la verdad es que programar vuelve a ser una cosa divertida.<br />
  Ahora que no tengo prisa por acabar a tiempo ni hay tensión por entregar algo sin errores es cuando las ganas por hacer proyectos regresan.
</p>

<p>
  En mi trabajo fui muy exigente sobre todo con lo que me pedían clientes y compañeros, perfeccionista hasta el extremo y un poco obsesivo con el acabado. Cuando trabajas en un sitio con gente muy buena <em>(y puedo asegurar que todos mis compañeros eran buenísimos)</em> tienes que ir siempre a por un acabado perfecto, demostrar que estás a la altura y eso a la larga acaba pasando factura.
</p>

<p>
  Ahora que ya no tengo el estrés de entregar algo perfecto en una fecha y puedo ser más flexible con el acabado y las soluciones es cuando <strong>estoy empezando a cogerle el gusto de nuevo a la profesión.</strong>
</p>

<h2 id="que-trabajen-las-máquinas">
  Que trabajen las máquinas.
</h2>

<p>
  De pequeño aprendí a programar yo solo y siempre tuve claro que quería trabajar con ordenadores.<br />
  Aunque empecé de diseñador web porque me encantaba también todo lo visual; a menudo y por mi forma de ser siempre era el que acababa encargándose del código y de que todo se viera bien.<br />
  Gracias a la programación descubrí que podía ahorrarme un montón de trabajo y que podía pedirle a una máquina que dibujara las cosas por mí, cosas que además no hubiera podido dibujar sin su ayuda, si le juntamos a eso la maravilla que sentía por los números de pequeño, está claro por qué acabé dedicándome a esto.
</p>

<h2 id="el-arte-de-contar-cosas">
  El arte de contar cosas.
</h2>

<p>
  Hace mucho tiempo comprendí una cosa que es muy reveladora y cambia tu manera de entenderlo todo. Y es que <strong>todos los medios expresivos tienen un lenguaje propio con el que comunicar el mensaje del autor</strong>.<br />
  Cuando aprendes a ver los medios expresivos de esa forma, de repente tu mundo se enriquece muchísimo. Cuando entiendes que detrás de cada obra hay alguien intentando contar algo y empiezas a fijarte en las palabras que usa y entonces descifras un poco su mensaje, lo reconoces en otras obras y empiezas a entender lo que alguien quiere contarte.<br />
  Entonces sucede algo muy bonito.
</p>

<p>
  Cuando entiendes que ese mecanismo está en un libro, un dibujo, una canción, o incluso un plato... y que en realidad puede estar en cualquier obra, aprendes a ver el mundo de otra manera, si puedes ver belleza, estilo e intención en el sitio donde lo puso el autor, vivirás en un lugar mas interesante y bello.
</p>

<p>
  Por eso <strong>creo que si encuentras el lenguaje adecuado</strong>, con un poco de trabajo puedes expresar tus ideas a través de cualquier medio.
  Así que volviendo al tema de la programación, poder contar cosas a través de los ordenadores es una cosa que me fascinó desde siempre y que supongo que es la principal razón por la que al final acabé dedicándome a programar.
</p>

<h2 id="entonces-de-qué-va-esto">
  Entonces de qué va esto.
</h2>

<p>
  Bueno, ahora que he recuperado un poco las ganas de programar cosas bonitas <em>(y hasta que me dure)</em> necesito un lugar donde contar algunas de las cosas que hago y este es el formato que se me ha ocurrido de momento.<br />
  He montado un blog minimalista al que iré añadiendo cosas <em>(o no)</em> según las vaya necesitando.<br />
  Inicialmente empiezo con un front donde puedo colgar mi última ocurrencia y un about me para los que no me conozcan.
</p>

<p>
  Quiero que sea un sitio cómodo de leer y ameno, pero seguramente no te interesen todas las cosas que cuento, bueno si has llegado hasta aquí creo que tienes un interés legítimo sobre las cosas que tengo que contar.
</p>

<p>
  He añadido sindicación RSS; si esto triunfa, quiero ponérselo fácil a cualquiera que quiera leer lo que escriba así que espero próximamente enlazarlo con las otras dos redes donde me podéis encontrar habitualmente, <a href="https://bsky.app/profile/odelamata.bsky.social" rel="nofollow">Bluesky</a> y <a href="https://mastodon.social/@odelamata" rel="nofollow">Mastodon</a>, si me sigues en alguno de esos otros lugares espero que en breve puedas interactuar con lo que aquí se escriba y estar al tanto de las novedades.
</p>

<h2 id="qué-contenidos-esperar">
  Qué contenidos esperar.
</h2>

<p>
  Esa es la pregunta del millón y no creo que sea capaz de responderla ahora, supongo que iré encontrando el tono y los temas a medida que escriba sobre ello, quiero hablar sobre cosas bonitas, pero eso puede ser un proyecto que estoy montando, un libro que leí o una película que me removió ¡a saber! si creo que puedo aportar algo interesante con ello lo pondré por aquí.
</p>

<p>
  Además <strong>el sitio y sus datos son míos</strong> así que no dependo de algoritmos de recomendación ni popularidad, tampoco dependo de formatos, porque como programador puedo montar lo que mejor se adapte al mensaje que quiero expresar.
</p>

<p>
  Es un gustazo cuando haces las cosas solo por el placer de hacerlas sin esperar encajar en ningún lugar y sobre todo con libertad total.
</p>

<p>
  ¡Aún así, espero que os guste!
</p>
]]></content:encoded>
        <category>Personal</category>
    </item>
    </channel>
</rss>