<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gersom Hernandez Ramos</title>
    <description>The latest articles on DEV Community by Gersom Hernandez Ramos (@gersomsim).</description>
    <link>https://dev.to/gersomsim</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3256959%2Fe3eb4588-f778-4c89-8888-90c8b23ce9e3.jpeg</url>
      <title>DEV Community: Gersom Hernandez Ramos</title>
      <link>https://dev.to/gersomsim</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gersomsim"/>
    <language>en</language>
    <item>
      <title>¿Qué pasa cuando el switchMap no es suficiente?</title>
      <dc:creator>Gersom Hernandez Ramos</dc:creator>
      <pubDate>Tue, 03 Feb 2026 03:29:01 +0000</pubDate>
      <link>https://dev.to/gersomsim/que-pasa-cuando-el-switchmap-no-es-suficiente-2i2</link>
      <guid>https://dev.to/gersomsim/que-pasa-cuando-el-switchmap-no-es-suficiente-2i2</guid>
      <description>&lt;p&gt;En el desarrollo mobile (Ionic + Angular), solemos confiar en &lt;strong&gt;RxJS&lt;/strong&gt; para encadenar peticiones. Todo funciona genial con &lt;strong&gt;switchMap&lt;/strong&gt; hasta que entra en juego el mundo real: la falta de conexión.&lt;/p&gt;

&lt;p&gt;Recientemente tuve que implementar un flujo crítico para ventas: &lt;br&gt;
1️⃣ Crear ticket. &lt;br&gt;
2️⃣ Obtener geolocalización. &lt;br&gt;
3️⃣ Actualizar ticket con GPS. &lt;br&gt;
4️⃣ Crear registro de prospecto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;El problema&lt;/strong&gt;: Si el internet fallaba en el paso 3, terminábamos con &lt;strong&gt;datos huérfanos&lt;/strong&gt; y &lt;strong&gt;procesos duplicados&lt;/strong&gt; al reintentar. El switchMap moría con la suscripción.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La solución&lt;/strong&gt;: Un Orquestador Offline con SQLite. 💡&lt;/p&gt;

&lt;p&gt;En lugar de disparar y rezar, implementé una estrategia de Cola con Checkpoints:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Persistencia Local&lt;/strong&gt;: Creé un servicio QueueLeads en SQLite. Cada paso del proceso se guarda localmente con un estado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Orquestador de Estados&lt;/strong&gt;: Un servicio que actúa como máquina de estados. No procesa todo en un for (porque los Observables son asíncronos), sino que toma el último registro pendiente, revisa en qué paso se quedó y lo retoma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resiliencia&lt;/strong&gt;: Si la app se cierra o se pierde la señal, el orquestador se reinicia en cuanto hay conexión, leyendo la base de datos y continuando exactamente donde falló.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resultado&lt;/strong&gt;: Eliminamos el 100% de los datos duplicados y aseguramos que cada venta se registre, sin importar si el vendedor está en un sótano sin señal.&lt;/p&gt;

&lt;p&gt;A veces, la mejor decisión técnica no es usar el operador más complejo de RxJS, sino dar un paso atrás y asegurar la integridad de los datos en el disco.&lt;/p&gt;

&lt;p&gt;¿Alguna vez te ha tocado lidiar con flujos offline complejos? Te leo en los comentarios. 👇&lt;/p&gt;

</description>
      <category>ionic</category>
      <category>rxjs</category>
      <category>architecture</category>
      <category>webdev</category>
    </item>
    <item>
      <title>TaskMaster el futuro del desarrollo con IA</title>
      <dc:creator>Gersom Hernandez Ramos</dc:creator>
      <pubDate>Thu, 03 Jul 2025 21:08:12 +0000</pubDate>
      <link>https://dev.to/gersomsim/taskmaster-el-futuro-del-desarrollo-con-ia-k36</link>
      <guid>https://dev.to/gersomsim/taskmaster-el-futuro-del-desarrollo-con-ia-k36</guid>
      <description>&lt;h3&gt;
  
  
  ¡Hola, programadores!
&lt;/h3&gt;

&lt;p&gt;Con la llegada de la inteligencia artificial y los agentes, la programación ha dado pasos agigantados. Agentes como Cursor son herramientas muy útiles para tareas repetitivas que, comúnmente, nos llevarían más tiempo del necesario. Hace unos días, realicé un pequeño proyecto en Angular 18. Le pedí el diseño a Cursor y, al implementar una arquitectura hexagonal, solicité a Cursor todos los archivos necesarios con un prompt específico. Hasta aquí, todo bien. Todos hemos realizado algún trabajo con IA, ¿pero qué sucede si queremos crear un sistema grande, como un ERP o un CRM?&lt;/p&gt;

&lt;h2&gt;
  
  
  El problema: La sobrecarga de contexto
&lt;/h2&gt;

&lt;p&gt;Como sabemos, las solicitudes a la IA se generan a través de tokens. Esto nos lleva a la &lt;strong&gt;ventana de contexto&lt;/strong&gt;. No sé si les ha pasado que están trabajando en una ventana y la IA no puede responder más. Esto ocurre porque llegamos al &lt;strong&gt;límite del contexto&lt;/strong&gt; que la IA puede almacenar en memoria. Google ha solucionado esto en parte, pero ese no es el tema principal. El verdadero desafío es realizar un proyecto grande sin perder el contexto.&lt;/p&gt;

&lt;h2&gt;
  
  
  La solución: TaskMaster
&lt;/h2&gt;

&lt;p&gt;¿Pero qué es TaskMaster?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TaskMaster&lt;/strong&gt; es un sistema de gestión de tareas que &lt;strong&gt;descompone proyectos complejos en tareas manejables&lt;/strong&gt;. Es decir, en lugar de pedirle a nuestro agente (como Cursor) que recuerde todo lo que ya hizo o lo que hará, ahora le daremos *&lt;em&gt;pequeños pasos, como si fuera una receta&lt;/em&gt;. Véamoslo así: sin importar la complejidad de la comida que queramos cocinar, si seguimos la receta al pie de la letra, podremos hacerla. No necesitamos memorizar ni los pasos ni los ingredientes; solo necesitamos saber qué hemos hecho y cuál es el siguiente paso.&lt;/p&gt;

&lt;p&gt;TaskMaster tiene como propósito principal &lt;strong&gt;mantener a tu agente de IA en el camino correcto&lt;/strong&gt;, eliminando la sobrecarga de contexto y evitando que la IA rompa nuestro código.&lt;/p&gt;

&lt;h3&gt;
  
  
  Características principales:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CLI independiente:&lt;/strong&gt; Cuenta con una interfaz de línea de comandos (CLI) que es independiente de la plataforma o editor de texto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integración con editores de IA:&lt;/strong&gt; Diseñado para integrarse perfectamente con editores de código impulsados por IA como Cursor AI, Lovable, Windsurf y Roo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soporte MCP:&lt;/strong&gt; Incluye un servidor MCP, lo cual es excelente porque no necesitas cambiar de contexto a una ventana diferente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Powered by Claude:&lt;/strong&gt; Utiliza la API de Anthropic (Claude).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open source:&lt;/strong&gt; Completamente gratuito y de código abierto. Solo necesitas traer tus propias claves API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si bien este artículo no se centrará en su funcionamiento interno, veamos un caso simple.&lt;/p&gt;




&lt;h3&gt;
  
  
  Nuestro ejemplo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Actividad:&lt;/strong&gt; Realizar una aplicación en Angular 19 que gestione tareas asignadas, que tenga autenticación con JWT y que use técnicas de refresh token al expirar nuestro &lt;em&gt;token&lt;/em&gt; principal.&lt;/p&gt;

&lt;p&gt;Este es nuestro &lt;em&gt;prompt&lt;/em&gt; principal, pero si te das cuenta, hay muchos vacíos, como si debería usar Tailwind o CSS puro con SASS, o si debe tener una guía de estilos específica, entre otras cosas. Aquí es donde entra nuestro TaskMaster.&lt;/p&gt;

&lt;p&gt;Este prompt sencillo lo guardaremos en un archivo &lt;code&gt;prd.txt&lt;/code&gt; y se lo pasaremos a TaskMaster para que genere las tareas usando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;task-master parse-prd scripts/prd.txt
task-master generate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto, TaskMaster generará algunos archivos para que nuestro editor siempre tenga el contexto sin saturar la ventana del mismo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;proyecto/
├── scripts/
│   └── prd.txt
├── tasks/
│   ├── task_001.txt
│   ├── task_002.txt
│   └── ...
├── tasks.json
└── .cursor/
    └── rules/
        └── dev_workflow.mdc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora podemos ver y trabajar con tareas usando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;task-master list &lt;span class="c"&gt;# ver todas las tareas&lt;/span&gt;
task-master next &lt;span class="c"&gt;# ver cuál es la siguiente tarea a trabajar&lt;/span&gt;
task-master set-status &lt;span class="nt"&gt;--id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 &lt;span class="nt"&gt;--status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;done&lt;/span&gt; &lt;span class="c"&gt;# marcamos como completada una tarea&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aquí tienes un ejemplo de la salida de &lt;code&gt;task-master list&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;===&lt;/span&gt; PROJECT TASKS &lt;span class="o"&gt;===&lt;/span&gt;
📋 Total Tasks: 8
✅ Completed: 2
🔄 In Progress: 1
⏳ Pending: 5
&lt;span class="o"&gt;===&lt;/span&gt; TASK LIST &lt;span class="o"&gt;===&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;001] ✅ DONE     | Setup project structure and dependencies  | Priority: high    | Dependencies: none
&lt;span class="o"&gt;[&lt;/span&gt;002] ✅ DONE     | Create database schema and models         | Priority: high    | Dependencies: 001
&lt;span class="o"&gt;[&lt;/span&gt;003] 🔄 PROGRESS | Implement user authentication system      | Priority: high    | Dependencies: 002
&lt;span class="o"&gt;[&lt;/span&gt;004] ⏳ PENDING  | Build user registration API endpoint      | Priority: medium  | Dependencies: 003
&lt;span class="o"&gt;[&lt;/span&gt;005] ⏳ PENDING  | Create login/logout functionality         | Priority: medium  | Dependencies: 003
&lt;span class="o"&gt;[&lt;/span&gt;006] ⏳ PENDING  | Implement JWT token management            | Priority: medium  | Dependencies: 004, 005
&lt;span class="o"&gt;[&lt;/span&gt;007] ⏳ PENDING  | Build todo CRUD operations                | Priority: high    | Dependencies: 006
&lt;span class="o"&gt;[&lt;/span&gt;008] ⏳ PENDING  | Create frontend components                | Priority: low     | Dependencies: 007
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si lo integramos a nuestro editor como servidor MCP, podemos usar lenguaje natural como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;"¿Puedes parsear mi PRD en &lt;code&gt;scripts/prd.txt&lt;/code&gt;?"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"¿Cuál es la siguiente tarea en la que debo trabajar?"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"Ayúdame a implementar la tarea 3."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"La tarea 2 está completa, actualiza su estado."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y lo mejor es que podemos hacer las tareas aún más pequeñas. Con esto, nuestro agente podrá realizar tareas más eficientes y sin dañar código que ya esté revisado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Este es un &lt;em&gt;preview&lt;/em&gt; de &lt;strong&gt;TaskMaster&lt;/strong&gt;. Estaré realizando algunos proyectos para mi portafolio personal y, después, haré un post paso a paso de cómo utilizarlo con un proyecto de la vida real.&lt;/p&gt;

&lt;p&gt;Por ahora, esto es todo, Devs. Les mando un saludo y recuerden que &lt;strong&gt;nunca es tarde para empezar a aprender&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por favor, envíame un tweet a &lt;a class="mentioned-user" href="https://dev.to/gersomsim"&gt;@gersomsim&lt;/a&gt; y dime qué te pareció este primer vistazo.&lt;/p&gt;

&lt;p&gt;¡Gracias por leer y saludos! 😎&lt;/p&gt;

</description>
      <category>taskmaster</category>
      <category>ia</category>
      <category>desarrolloia</category>
      <category>programacion</category>
    </item>
    <item>
      <title>🚀 Deploy Your Astro Static Site on Railway</title>
      <dc:creator>Gersom Hernandez Ramos</dc:creator>
      <pubDate>Sun, 15 Jun 2025 01:59:48 +0000</pubDate>
      <link>https://dev.to/gersomsim/deploy-your-astro-static-site-on-railway-pah</link>
      <guid>https://dev.to/gersomsim/deploy-your-astro-static-site-on-railway-pah</guid>
      <description>&lt;p&gt;Before we begin, note that there are two ways to deploy an Astro site on Railway:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;If your website uses SSR (Server-Side Rendering) or adapters.&lt;/li&gt;
&lt;li&gt;If your website is completely static.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This post focuses on the second option: deploying a fully static Astro site on Railway.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Initialize Your Astro Project
&lt;/h2&gt;

&lt;p&gt;First, create your Astro project. Open your terminal and run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm create astro@latest&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Follow the prompts to set up a static site. In my case, I'm building a personal portfolio to showcase my projects.&lt;/p&gt;

&lt;p&gt;You can fork or contribute to my repo here: &lt;a href="https://github.com/Gersomsim/Pesonal-web" rel="noopener noreferrer"&gt;https://github.com/Gersomsim/Pesonal-web&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Prepare Your Site for Deployment
&lt;/h2&gt;

&lt;p&gt;Once your site is ready, modify your &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
  "dev": "astro dev",
  "build": "astro build",
  "preview": "astro preview",
  "start": "npx serve dist" // Crucial for static Astro sites
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add this at the end of &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"engines": {
  "node": "&amp;gt;=18.0.0" // Tells Railway the minimum Node.js version
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Configuration Files
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 astro.config.mjs
&lt;/h3&gt;

&lt;p&gt;Projects scaffolded with Astro default to static output. Just confirm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { defineConfig } from 'astro/config';

export default defineConfig({
  // output: "static" (default value)
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uncomment the &lt;code&gt;output&lt;/code&gt; line if unsure, but it’s &lt;code&gt;static&lt;/code&gt; by default.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Create Railway’s Config File (railway.json)
&lt;/h3&gt;

&lt;p&gt;Add this to instruct Railway’s builder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "builds": [
    {
      "src": "package.json",
      "use": "@railway/nixpacks"
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.3 Optional: static.json (Static Server Config)
&lt;/h3&gt;

&lt;p&gt;Create this file to configure static file serving:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "root": "dist",
  "clean_urls": true,
  "routes": {
    "**": "index.html"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ready to Deploy!
&lt;/h2&gt;

&lt;p&gt;With these steps complete, your static site is prepped for Railway.&lt;/p&gt;

&lt;p&gt;Deployment is straightforward:&lt;/p&gt;

&lt;p&gt;1.- Log into Railway with your GitHub account&lt;br&gt;
2.- Grant repository access&lt;br&gt;
3.- Select your repo&lt;br&gt;
4.- Railway handles the rest automatically&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Railway?
&lt;/h2&gt;

&lt;p&gt;You might wonder: "Why Railway over Vercel/Netlify?" While alternatives exist, I chose Railway for its $5/month Hobby Plan. This lets me host:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend projects&lt;/li&gt;
&lt;li&gt;Backend APIs (Laravel, NestJS, etc.)&lt;/li&gt;
&lt;li&gt;My entire portfolio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the price of a coffee, I avoid juggling multiple services.&lt;/p&gt;

&lt;p&gt;Thanks for reading my first post! 🚀&lt;/p&gt;

&lt;p&gt;Cheers!&lt;/p&gt;

</description>
      <category>deploy</category>
      <category>astro</category>
      <category>railway</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
