<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title><![CDATA[Blog de Wilfredo Rujel]]></title>
        <description><![CDATA[Artículos prácticos sobre ingeniería de software, arquitectura de sistemas y desarrollo web moderno — desde patrones hasta producción.]]></description>
        <link>https://blog.wrujel.com/es</link>
        <generator>RSS for Node</generator>
        <lastBuildDate>Wed, 02 Sep 2026 00:30:28 GMT</lastBuildDate>
        <atom:link href="https://blog.wrujel.com/es/feed.xml" rel="self" type="application/rss+xml"/>
        <pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate>
        <copyright><![CDATA[© 2026 Wilfredo Rujel. Todos los derechos reservados.]]></copyright>
        <language><![CDATA[es]]></language>
        <item>
            <title><![CDATA[Diseñando jobs en segundo plano idempotentes: reintentos, locks y la ilusión del exactly-once]]></title>
            <description><![CDATA[El procesamiento exactly-once no existe en sistemas distribuidos: así se diseñan jobs en segundo plano que sobreviven reintentos, caídas y entregas duplicadas.]]></description>
            <link>https://blog.wrujel.com/es/designing-idempotent-background-jobs-retries-locks-exactly-once-illusion-e1f557</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/designing-idempotent-background-jobs-retries-locks-exactly-once-illusion-e1f557</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[background-jobs]]></category>
            <category><![CDATA[idempotency]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[queues]]></category>
            <category><![CDATA[reliability]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1787710479/74f37d5190e35b94.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Materialized Views en Postgres: cambiar actualidad por velocidad]]></title>
            <description><![CDATA[Cómo usar materialized views para acelerar agregaciones costosas en Postgres sin servir a escondidas datos desactualizados a tus usuarios.]]></description>
            <link>https://blog.wrujel.com/es/postgres-materialized-views-tradeoffs-production-0d1d35</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/postgres-materialized-views-tradeoffs-production-0d1d35</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[postgres]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[sql]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1787393357/blog/fb4e4ee5-e96a-4ac5-89ae-4543cb40b782_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Claves de idempotencia en la práctica: reintentos seguros]]></title>
            <description><![CDATA[Cómo diseñar e implementar claves de idempotencia para que las solicitudes reintentadas nunca cobren, envíen o creen recursos por duplicado.]]></description>
            <link>https://blog.wrujel.com/es/idempotency-keys-in-practice-safe-retries-4da26e</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/idempotency-keys-in-practice-safe-retries-4da26e</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[idempotency]]></category>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 15 Aug 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1786788541/blog/bfb398f3-ed90-4c04-ba0f-3d59866eabf8_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Patrones de cancelación en TypeScript: domando AbortController]]></title>
            <description><![CDATA[Por qué la mayoría del código asíncrono en TypeScript ignora por completo la cancelación, y cómo construir una cancelación componible y sin fugas con AbortController.]]></description>
            <link>https://blog.wrujel.com/es/cancellation-patterns-typescript-abortcontroller-28219a</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/cancellation-patterns-typescript-abortcontroller-28219a</guid>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[async]]></category>
            <category><![CDATA[cancellation]]></category>
            <category><![CDATA[performance]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1786234133/blog/5fb6f8a2-0158-4663-bbfa-9a7972010636_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Failover de bases de datos multirregión: qué falla realmente en producción]]></title>
            <description><![CDATA[El failover multirregión parece sencillo en un diagrama de arquitectura, pero la realidad implica retraso de replicación, escrituras en split-brain y cachés DNS que se niegan a cooperar.]]></description>
            <link>https://blog.wrujel.com/es/multi-region-database-failover-lessons-production-9d47a1-f4c405</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/multi-region-database-failover-lessons-production-9d47a1-f4c405</guid>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[databases]]></category>
            <category><![CDATA[high-availability]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[disaster-recovery]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1786208165/blog/f66fdf65-0d74-4561-9991-f70a633fe428_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[TypeScript Template Literal Types: cómo crear APIs expresivas y type-safe]]></title>
            <description><![CDATA[Usa los template literal types de TypeScript para codificar nombres de eventos, patrones de rutas y conjuntos de permisos directamente en tu sistema de tipos, sin comprobaciones en tiempo de ejecución ni desincronización de cadenas de texto.]]></description>
            <link>https://blog.wrujel.com/es/typescript-template-literal-types-expressive-apis-33b3b9</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/typescript-template-literal-types-expressive-apis-33b3b9</guid>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[type-safety]]></category>
            <category><![CDATA[patterns]]></category>
            <category><![CDATA[developer-experience]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1786201442/blog/f1bd158e-4321-4d2b-8d59-d3987459619b_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Soft Deletes: la función que cuesta más de lo que ahorra]]></title>
            <description><![CDATA[Los soft deletes parecen una red de seguridad simple, pero corrompen tu esquema en silencio, contaminan tus consultas y rompen tus restricciones — esto es lo que deberías usar en su lugar.]]></description>
            <link>https://blog.wrujel.com/es/soft-deletes-hidden-complexity-production-databases-f6a6a0</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/soft-deletes-hidden-complexity-production-databases-f6a6a0</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[sql]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[patterns]]></category>
            <category><![CDATA[backend]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1786070061/blog/04880c37-fb61-45e5-8c40-cee26c451593_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Evolución de esquemas de eventos sin romper consumidores]]></title>
            <description><![CDATA[Cómo agregar campos, renombrar propiedades y reestructurar eventos en sistemas asíncronos sin coordinar despliegues ni romper silenciosamente a los consumidores aguas abajo.]]></description>
            <link>https://blog.wrujel.com/es/evolving-event-schemas-backward-compatibility-39382e</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/evolving-event-schemas-backward-compatibility-39382e</guid>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[schema-evolution]]></category>
            <category><![CDATA[backward-compatibility]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1786069038/blog/ec2cfe42-b736-4d23-9812-eb10196cbf39_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Request Coalescing: cómo prevenir el Thundering Herd en Node.js]]></title>
            <description><![CDATA[Cuando una entrada de caché expira bajo alta carga, docenas de solicitudes compiten por reconstruirla al mismo tiempo. Así es como el request coalescing —deduplicar las solicitudes en curso— convierte esa estampida en una sola llamada al servicio de origen.]]></description>
            <link>https://blog.wrujel.com/es/request-coalescing-thundering-herd-prevention-nodejs-42e380</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/request-coalescing-thundering-herd-prevention-nodejs-42e380</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[caching]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[concurrency]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1786061323/blog/b6e3cd91-8460-47ad-aa36-cda83c8c725d_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Búsqueda de texto completo en Postgres: prescinde de Elasticsearch en la mayoría de los casos]]></title>
            <description><![CDATA[Postgres cuenta con un potente motor de búsqueda de texto completo integrado que utiliza tsvector, tsquery e índices GIN — no se necesita un clúster de Elasticsearch para la mayoría de las aplicaciones.]]></description>
            <link>https://blog.wrujel.com/es/postgres-full-text-search-without-elasticsearch-d9269e</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/postgres-full-text-search-without-elasticsearch-d9269e</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[full-text-search]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[typescript]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1784323427/blog/fae350bd-2c1f-4a47-8033-15381345bcbb_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Streaming de grandes volúmenes de datos en Node.js: backpressure y generadores asíncronos]]></title>
            <description><![CDATA[Deja de cargar conjuntos de resultados completos en memoria: cómo los streams de Node.js y los generadores asíncronos te permiten procesar millones de registros sin reventar el heap.]]></description>
            <link>https://blog.wrujel.com/es/streaming-large-datasets-nodejs-backpressure-55e2c4</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/streaming-large-datasets-nodejs-backpressure-55e2c4</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[streams]]></category>
            <category><![CDATA[backpressure]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[performance]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1784323410/blog/5d19e549-a7b2-4e7f-99c8-f8e8ab320498_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Bloqueos distribuidos: coordinar el trabajo entre múltiples nodos]]></title>
            <description><![CDATA[Evita condiciones de carrera en sistemas distribuidos: una guía práctica para implementar bloqueos distribuidos con Redis y los bloqueos consultivos de PostgreSQL en Node.js.]]></description>
            <link>https://blog.wrujel.com/es/distributed-locks-coordinating-work-across-nodes-cd19de</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/distributed-locks-coordinating-work-across-nodes-cd19de</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[redis]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[concurrency]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1784323409/blog/1c31eef1-b3f9-4cd7-bb49-bb22fbb09415_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[El operador satisfies de TypeScript: seguridad de tipos sin perder la inferencia]]></title>
            <description><![CDATA[El operador satisfies de TypeScript valida que un valor cumpla con un tipo sin perder la inferencia de literales; esto explica por qué esa distinción importa y dónde aplicarla.]]></description>
            <link>https://blog.wrujel.com/es/typescript-satisfies-operator-type-inference-38e542</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/typescript-satisfies-operator-type-inference-38e542</guid>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[type-safety]]></category>
            <category><![CDATA[inference]]></category>
            <category><![CDATA[patterns]]></category>
            <category><![CDATA[generics]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1784323371/blog/c391486d-9936-4cfd-a1af-1d14dd87bc90_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Emisores de eventos con tipado seguro en TypeScript]]></title>
            <description><![CDATA[Sustituye el EventEmitter de tipado débil de Node por una alternativa genérica y tipada que detecta errores en los nombres de eventos y payloads incorrectos en tiempo de compilación.]]></description>
            <link>https://blog.wrujel.com/es/type-safe-event-emitters-typescript-663c37</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/type-safe-event-emitters-typescript-663c37</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[events]]></category>
            <category><![CDATA[type-safety]]></category>
            <category><![CDATA[patterns]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1784323384/blog/53947eba-1955-4697-975a-da567d9edeab_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Ejecución durable: cómo construir flujos de trabajo largos que sobrevivan a reinicios]]></title>
            <description><![CDATA[Por qué las colas de trabajos y las máquinas de estados en base de datos fallan ante procesos complejos de varios pasos, y cómo la ejecución durable con Temporal te da flujos de trabajo que sobreviven a reinicios, reintentos y despliegues.]]></description>
            <link>https://blog.wrujel.com/es/durable-execution-workflows-typescript-temporal-bb0781</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/durable-execution-workflows-typescript-temporal-bb0781</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[temporal]]></category>
            <category><![CDATA[workflows]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[reliability]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1784323340/blog/f21c2af9-5522-4c12-9475-a98f007ffe9a_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Control de concurrencia asíncrona en Node.js: semáforos, throttling y backpressure]]></title>
            <description><![CDATA[Un Promise.all sin límites es un OOM silencioso: así se construyen semáforos, colas con throttling y backpressure de streams en tus aplicaciones Node.js.]]></description>
            <link>https://blog.wrujel.com/es/async-concurrency-control-nodejs-semaphores-70df4a</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/async-concurrency-control-nodejs-semaphores-70df4a</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[concurrency]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[async]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[streams]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1780720244/blog/9c263b7d-e4ad-4de7-80f7-ac27023f9161_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[El patrón DataLoader: eliminar consultas N+1 sin un ORM]]></title>
            <description><![CDATA[N+1 no es un problema de ORM: aprende a implementar el patrón de agrupación DataLoader en TypeScript para reducir las consultas redundantes en cualquier fuente de datos, incluidos los microservicios.]]></description>
            <link>https://blog.wrujel.com/es/dataloader-pattern-eliminating-n-plus-one-typescript-c9fdcb</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/dataloader-pattern-eliminating-n-plus-one-typescript-c9fdcb</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[batching]]></category>
            <category><![CDATA[graphql]]></category>
            <category><![CDATA[patterns]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1780721125/blog/ab3149a8-7931-4777-8f76-1ee91ca8549a_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[El patrón Transactional Outbox: cómo resolver la doble escritura en sistemas distribuidos]]></title>
            <description><![CDATA[Cómo el patrón Transactional Outbox elimina el problema de la doble escritura y garantiza la publicación fiable de eventos sin acoplar tu base de datos a tu broker de mensajes.]]></description>
            <link>https://blog.wrujel.com/es/transactional-outbox-pattern-reliable-event-publishing-bbc7e2</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/transactional-outbox-pattern-reliable-event-publishing-bbc7e2</guid>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1778970724/blog/2e1e1f15-fc39-4bb6-8111-db3a878b240c_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Contexto de petición sin prop drilling: AsyncLocalStorage en Node.js]]></title>
            <description><![CDATA[Usa AsyncLocalStorage para propagar contexto con ámbito de petición — IDs de traza, sesiones de usuario, datos del tenant — a través de pilas de llamadas asíncronas sin pasar valores por cada firma de función.]]></description>
            <link>https://blog.wrujel.com/es/async-local-storage-request-context-nodejs-dd11f4</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/async-local-storage-request-context-nodejs-dd11f4</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[async]]></category>
            <category><![CDATA[context]]></category>
            <category><![CDATA[observability]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1778642543/blog/11671b1c-1a30-4739-a7a3-78751ba14bd5_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[TypeScript Branded Types: modelado de dominio en tiempo de compilación]]></title>
            <description><![CDATA[Elimina toda una clase de errores en tiempo de ejecución enseñándole al sistema de tipos de TypeScript la diferencia entre un UserId y un OrderId, incluso cuando ambos son strings internamente.]]></description>
            <link>https://blog.wrujel.com/es/typescript-branded-types-domain-modeling-564074</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/typescript-branded-types-domain-modeling-564074</guid>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[type-safety]]></category>
            <category><![CDATA[domain-modeling]]></category>
            <category><![CDATA[patterns]]></category>
            <category><![CDATA[branded-types]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1778642478/blog/bc98ecd8-28e3-4832-9001-84175bab286a_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Diseño de API contract-first con OpenAPI y TypeScript]]></title>
            <description><![CDATA[Deja de permitir que tu especificación de API se desvíe de tu implementación: define primero el contrato, genera los tipos para ambos lados y deja que el compilador detecte las diferencias.]]></description>
            <link>https://blog.wrujel.com/es/contract-first-api-design-openapi-typescript-2b59ac</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/contract-first-api-design-openapi-typescript-2b59ac</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[openapi]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[api-design]]></category>
            <category><![CDATA[code-generation]]></category>
            <category><![CDATA[rest]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1778642468/blog/2efe62b4-8e8e-4d01-9837-f386592de234_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Apagado controlado en servicios Node.js en producción]]></title>
            <description><![CDATA[La mayoría de los servicios Node.js descartan silenciosamente las solicitudes en curso en cada despliegue; aquí se explica cómo manejar SIGTERM correctamente, drenar las conexiones y salir limpiamente en Kubernetes.]]></description>
            <link>https://blog.wrujel.com/es/graceful-shutdown-nodejs-production-services-739770</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/graceful-shutdown-nodejs-production-services-739770</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[production]]></category>
            <category><![CDATA[reliability]]></category>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1776534337/blog/0886e74d-468c-497a-a56e-05b802a99986_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Pipelines de middleware componibles en TypeScript]]></title>
            <description><![CDATA[Deja de atornillar middleware a los frameworks y empieza a construir primitivas de pipeline componibles y con tipado seguro que puedes probar de forma aislada y entender de un vistazo.]]></description>
            <link>https://blog.wrujel.com/es/composable-middleware-pipelines-typescript-017190</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/composable-middleware-pipelines-typescript-017190</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[middleware]]></category>
            <category><![CDATA[patterns]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1776002444/blog/6aa479db-670c-405c-b56f-0229208314cf_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Seguridad de tipos en tiempo de ejecución con Zod: valida en cada límite]]></title>
            <description><![CDATA[El sistema de tipos de TypeScript se detiene en tiempo de compilación — Zod cierra esa brecha validando los datos en los límites de ejecución donde realmente importa.]]></description>
            <link>https://blog.wrujel.com/es/runtime-type-safety-zod-validation-boundaries-ed4ad0</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/runtime-type-safety-zod-validation-boundaries-ed4ad0</guid>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[zod]]></category>
            <category><![CDATA[validation]]></category>
            <category><![CDATA[type-safety]]></category>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[patterns]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 11 Apr 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1776001906/blog/8c300ec1-5066-4788-84cb-7a2ef2c38878_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[El caché HTTP sin misterios: Cache-Control, ETags y estrategias de CDN]]></title>
            <description><![CDATA[Una guía práctica de las cabeceras de caché HTTP — qué hace realmente cada directiva, cuándo usar ETags y cómo dejar de pelearte con tu CDN.]]></description>
            <link>https://blog.wrujel.com/es/http-caching-cache-control-etags-cdn-strategies-cfce0a</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/http-caching-cache-control-etags-cdn-strategies-cfce0a</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[http]]></category>
            <category><![CDATA[caching]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[cdn]]></category>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[web]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1775476662/blog/6707b48e-e08b-4ff5-b1b1-e59806ca8a13_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[React Server Actions: patrones, errores comunes y uso en producción]]></title>
            <description><![CDATA[Las Server Actions devuelven la gestión de formularios y las mutaciones al servidor en Next.js — cómo usarlas bien, qué evitar y cómo construir patrones que escalen.]]></description>
            <link>https://blog.wrujel.com/es/react-server-actions-patterns-pitfalls-production-381b58</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/react-server-actions-patterns-pitfalls-production-381b58</guid>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[server-actions]]></category>
            <category><![CDATA[forms]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[patterns]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1775489836/blog/84ba41e5-98c4-4cdf-b717-a497b4e8df89_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Máquinas de estados finitos para lógica compleja de UI en TypeScript]]></title>
            <description><![CDATA[Reemplaza el espagueti de banderas booleanas con máquinas de estados finitos: un enfoque centrado en TypeScript para estados de UI que hace imposibles los estados imposibles por construcción.]]></description>
            <link>https://blog.wrujel.com/es/finite-state-machines-complex-ui-logic-typescript-60ffc5</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/finite-state-machines-complex-ui-logic-typescript-60ffc5</guid>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[state-machines]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[ui-patterns]]></category>
            <category><![CDATA[frontend]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774887345/blog/fc4d5352-9ac3-4dd6-9b87-ed4677809a68_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Worker Threads en Node.js: cómo delegar trabajo intensivo de CPU sin bloquear el event loop]]></title>
            <description><![CDATA[Aprende a usar los worker threads de Node.js para manejar tareas intensivas de CPU sin bloquear el event loop, con patrones de pool de hilos y mensajería con tipado seguro.]]></description>
            <link>https://blog.wrujel.com/es/worker-threads-nodejs-cpu-bound-work-de8329</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/worker-threads-nodejs-cpu-bound-work-de8329</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[worker-threads]]></category>
            <category><![CDATA[concurrency]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[performance]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774874365/blog/46fe06a7-576a-41ed-a23d-eda7f2c0449e_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Manejo de errores en TypeScript: patrones que escalan]]></title>
            <description><![CDATA[Deja atrás el caos de try-catch: uniones discriminadas, tipos Result y límites de error que hacen las bases de código en TypeScript más confiables y mantenibles.]]></description>
            <link>https://blog.wrujel.com/es/error-handling-patterns-typescript-005a97</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/error-handling-patterns-typescript-005a97</guid>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[error-handling]]></category>
            <category><![CDATA[patterns]]></category>
            <category><![CDATA[type-safety]]></category>
            <category><![CDATA[best-practices]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740831/blog/035271d9-5dbc-4e4a-b85e-dd417cf8b02c_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Estrategias de Pruebas para Aplicaciones Web Modernas: Lo Que Realmente Funciona]]></title>
            <description><![CDATA[Una guía práctica para construir una estrategia de pruebas que detecta errores reales — pruebas unitarias, de integración y end-to-end con Vitest, Testing Library y Playwright, además de las ventajas y desventajas de cada capa.]]></description>
            <link>https://blog.wrujel.com/es/testing-strategies-for-modern-web-apps</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/testing-strategies-for-modern-web-apps</guid>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[vitest]]></category>
            <category><![CDATA[playwright]]></category>
            <category><![CDATA[testing-library]]></category>
            <category><![CDATA[tdd]]></category>
            <category><![CDATA[quality]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740903/blog/a3f1c8e2-7b4d-4e9f-b62a-1d5e0c9f2847_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Flujos de trabajo con Docker que realmente funcionan]]></title>
            <description><![CDATA[Deja de pelearte con Docker en local: builds multi-stage, bind mounts, overrides de Compose y los patrones que hacen que los contenedores se sientan nativos.]]></description>
            <link>https://blog.wrujel.com/es/docker-development-workflow-bdccc3</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/docker-development-workflow-bdccc3</guid>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[containers]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[compose]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740821/blog/b9add1fb-3fd2-43a4-b0cf-4903a4ddbe78_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Construyendo un sistema de diseño: de los tokens a los componentes]]></title>
            <description><![CDATA[Tokens de diseño, APIs de componentes y los patrones organizativos que convierten un sistema de diseño en un multiplicador de fuerza en lugar de una carga de mantenimiento.]]></description>
            <link>https://blog.wrujel.com/es/building-a-design-system-e9110c</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/building-a-design-system-e9110c</guid>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[design-system]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[css]]></category>
            <category><![CDATA[components]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[ui]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740762/blog/278025a4-bca3-4a15-b8b8-f7eee31ba2a7_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Integrando LLMs en tu aplicación: patrones que funcionan en producción]]></title>
            <description><![CDATA[Patrones prácticos para construir funciones basadas en LLM que sean fiables y rentables — ingeniería de prompts, streaming, salidas estructuradas, mecanismos de respaldo y gestión de costos.]]></description>
            <link>https://blog.wrujel.com/es/integrating-llms-into-your-app</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/integrating-llms-into-your-app</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[openai]]></category>
            <category><![CDATA[claude]]></category>
            <category><![CDATA[prompt-engineering]]></category>
            <category><![CDATA[nextjs]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740850/blog/2b5741a0-7651-4c52-aac7-ba5430c28ce1_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Cómo construir APIs escalables con Route Handlers de Next.js]]></title>
            <description><![CDATA[Una guía completa para diseñar y construir APIs escalables y listas para producción usando Route Handlers de Next.js con TypeScript, validación y patrones de manejo de errores.]]></description>
            <link>https://blog.wrujel.com/es/building-scalable-apis-with-nextjs</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/building-scalable-apis-with-nextjs</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[api]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[scalability]]></category>
            <category><![CDATA[rest]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740782/blog/40e2189d-ff0f-4fe7-9334-1df4641c9453_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[De junior a senior: lecciones que cambiaron cómo escribo código]]></title>
            <description><![CDATA[Los cambios de mentalidad, hábitos técnicos y decisiones profesionales que moldearon mi crecimiento de desarrollador junior a ingeniero senior durante siete años en la industria.]]></description>
            <link>https://blog.wrujel.com/es/from-junior-to-senior-lessons-learned</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/from-junior-to-senior-lessons-learned</guid>
            <category><![CDATA[career]]></category>
            <category><![CDATA[career]]></category>
            <category><![CDATA[growth]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[mentoring]]></category>
            <category><![CDATA[best-practices]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740837/blog/3ab8bb82-7085-45e5-a17f-419c7bdcc5ae_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Optimización del rendimiento en React: patrones que realmente marcan la diferencia]]></title>
            <description><![CDATA[Técnicas prácticas de rendimiento en React — memoización, virtualización, división de código y perfilado — con comparativas reales de antes y después, y las ventajas y desventajas de cada enfoque.]]></description>
            <link>https://blog.wrujel.com/es/react-performance-optimization-patterns</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/react-performance-optimization-patterns</guid>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[optimization]]></category>
            <category><![CDATA[memoization]]></category>
            <category><![CDATA[web-vitals]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740878/blog/cfced8d6-5de5-4d63-999c-47d9c9989360_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Patrones de arquitectura de microservicios que realmente funcionan]]></title>
            <description><![CDATA[Lecciones prácticas sobre el diseño y la operación de microservicios a gran escala — comunicación basada en eventos, límites de servicio y los patrones que sobrevivieron en producción.]]></description>
            <link>https://blog.wrujel.com/es/microservices-architecture-patterns</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/microservices-architecture-patterns</guid>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[event-driven]]></category>
            <category><![CDATA[domain-driven-design]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740860/blog/e9af0b8c-8f21-4c81-a82b-54d50c77999b_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Errores de diseño de bases de datos que veo en cada codebase (y cómo corregirlos)]]></title>
            <description><![CDATA[Los errores recurrentes de diseño de bases de datos que causan consultas lentas, migraciones dolorosas e incidentes en producción — con soluciones prácticas y el razonamiento detrás de cada uno.]]></description>
            <link>https://blog.wrujel.com/es/database-design-mistakes-and-fixes</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/database-design-mistakes-and-fixes</guid>
            <category><![CDATA[backend]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[postgresql]]></category>
            <category><![CDATA[sql]]></category>
            <category><![CDATA[performance]]></category>
            <category><![CDATA[schema-design]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740804/blog/ce37b00f-01e8-48a3-9b1d-8573b2dd6eb9_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Pipelines de CI/CD que no te estorban]]></title>
            <description><![CDATA[Cómo diseñar pipelines de CI/CD que sean rápidos, fiables y en los que tu equipo realmente confíe: caché, paralelismo, paridad de entornos y estrategias de despliegue.]]></description>
            <link>https://blog.wrujel.com/es/ci-cd-pipeline-best-practices</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/ci-cd-pipeline-best-practices</guid>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[ci-cd]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[github-actions]]></category>
            <category><![CDATA[deployment]]></category>
            <category><![CDATA[automation]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740787/blog/ad5612e2-12b6-4db0-a9b0-a8c3aaa039ef_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Seguridad web para desarrolladores: los fundamentos que no puedes saltarte]]></title>
            <description><![CDATA[Las vulnerabilidades de seguridad más frecuentes en las aplicaciones web, explicadas con ejemplos de código reales y soluciones concretas que todo desarrollador debería conocer.]]></description>
            <link>https://blog.wrujel.com/es/web-security-for-developers</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/web-security-for-developers</guid>
            <category><![CDATA[security]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[web]]></category>
            <category><![CDATA[owasp]]></category>
            <category><![CDATA[authentication]]></category>
            <category><![CDATA[xss]]></category>
            <category><![CDATA[sql-injection]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740914/blog/5e87ddd9-424c-44ee-bbde-f04809367566_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Patrones de TypeScript para bases de código grandes]]></title>
            <description><![CDATA[Patrones avanzados de TypeScript que uso a diario — uniones discriminadas, branded types, el patrón builder y tipos de utilidad que hacen que las bases de código grandes sean más seguras y fáciles de mantener.]]></description>
            <link>https://blog.wrujel.com/es/typescript-patterns-for-large-codebases</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/typescript-patterns-for-large-codebases</guid>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[patterns]]></category>
            <category><![CDATA[best-practices]]></category>
            <category><![CDATA[type-safety]]></category>
            <category><![CDATA[dx]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740908/blog/f449c251-e9a9-442d-8b46-c4c875ba33b1_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Gestión de estado en 2026: qué usar y cuándo]]></title>
            <description><![CDATA[Una guía práctica para elegir el enfoque de gestión de estado adecuado en aplicaciones React modernas — desde useState hasta Zustand y React Query — y el razonamiento detrás de cada elección.]]></description>
            <link>https://blog.wrujel.com/es/state-management-in-2026</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/state-management-in-2026</guid>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[state-management]]></category>
            <category><![CDATA[zustand]]></category>
            <category><![CDATA[react-query]]></category>
            <category><![CDATA[frontend]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740895/blog/f15fc988-a75d-4054-9b82-9e007e2592db_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Reflexiones sobre cinco años de lecciones en ingeniería de software]]></title>
            <description><![CDATA[Cinco años de ingeniería de software condensados en las lecciones que más importan: priorizar los fundamentos sobre los frameworks de moda, ganar confianza con entregas fiables, escribir código para quien venga después y saber cuándo la sencillez gana a la ingeniosidad.]]></description>
            <link>https://blog.wrujel.com/es/reflecting-five-years-software-engineering-lessons-c8a2c1</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/reflecting-five-years-software-engineering-lessons-c8a2c1</guid>
            <category><![CDATA[career]]></category>
            <category><![CDATA[career]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[lessons-learned]]></category>
            <category><![CDATA[growth]]></category>
            <category><![CDATA[reflection]]></category>
            <category><![CDATA[best-practices]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774744530/blog/0bcfca71-555c-488d-9d0b-dedc8348101e_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Protección de claves de API y secretos en aplicaciones frontend]]></title>
            <description><![CDATA[Protege claves de API y secretos en aplicaciones frontend con proxies de backend, custodia de tokens, buenas prácticas de variables de entorno, inyección de secretos en tiempo de ejecución y patrones de credenciales de cliente que evitan su exposición en el navegador y el control de versiones.]]></description>
            <link>https://blog.wrujel.com/es/securing-api-keys-secrets-frontend-applications-70aa71</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/securing-api-keys-secrets-frontend-applications-70aa71</guid>
            <category><![CDATA[security]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[api-keys]]></category>
            <category><![CDATA[secrets-management]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[environment-variables]]></category>
            <category><![CDATA[authentication]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 27 Dec 2025 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774744535/blog/1645c6f6-de4b-4e22-8953-f596f4709e5f_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Cómo crear plataformas internas para desarrolladores que los equipos realmente usan]]></title>
            <description><![CDATA[Diseña plataformas internas para desarrolladores que aceleren las entregas con infraestructura de autoservicio, golden paths, APIs de plataforma, métricas de experiencia del desarrollador y estrategias de adopción que ganan confianza en lugar de imponer cumplimiento.]]></description>
            <link>https://blog.wrujel.com/es/building-internal-developer-platforms-teams-use-207964</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/building-internal-developer-platforms-teams-use-207964</guid>
            <category><![CDATA[career]]></category>
            <category><![CDATA[developer-experience]]></category>
            <category><![CDATA[platform-engineering]]></category>
            <category><![CDATA[internal-tools]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[engineering-culture]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sun, 21 Dec 2025 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774744468/blog/3c5b0dc1-e01f-470c-aaed-0db80406a921_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Cultura de code review: cómo dar feedback que realmente ayuda]]></title>
            <description><![CDATA[Los principios y prácticas que transforman la revisión de código de un ritual de control en una verdadera herramienta de aprendizaje, tanto para quien revisa como para quien escribe el código.]]></description>
            <link>https://blog.wrujel.com/es/code-review-culture</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/code-review-culture</guid>
            <category><![CDATA[career]]></category>
            <category><![CDATA[code-review]]></category>
            <category><![CDATA[team-culture]]></category>
            <category><![CDATA[collaboration]]></category>
            <category><![CDATA[feedback]]></category>
            <category><![CDATA[engineering]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740790/blog/403c5138-deb4-490e-b5c9-39b9fbc5df2d_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Patrones de inyección de dependencias en aplicaciones TypeScript]]></title>
            <description><![CDATA[Implementa inyección de dependencias en TypeScript mediante inyección por constructor, funciones fábrica, contenedores de DI y patrones de composición a nivel de módulo que mejoran la testabilidad y desacoplan componentes sin depender de un framework.]]></description>
            <link>https://blog.wrujel.com/es/dependency-injection-patterns-typescript-applications-73b8d6</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/dependency-injection-patterns-typescript-applications-73b8d6</guid>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[dependency-injection]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[design-patterns]]></category>
            <category><![CDATA[testing]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[clean-code]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774744488/blog/eb113513-792c-4ab5-a9ef-971101df3d92_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Estrategias de monitoreo y alertas para reducir la fatiga de alertas]]></title>
            <description><![CDATA[Diseña sistemas de monitoreo y alertas que detectan problemas reales mediante alertas basadas en SLO, detección por síntomas, jerarquías de enrutamiento, runbooks automatizados y técnicas de reducción de ruido que mantienen al equipo de guardia enfocado en lo importante.]]></description>
            <link>https://blog.wrujel.com/es/monitoring-alerting-strategies-reduce-alert-fatigue-f1f00b</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/monitoring-alerting-strategies-reduce-alert-fatigue-f1f00b</guid>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[monitoring]]></category>
            <category><![CDATA[alerting]]></category>
            <category><![CDATA[slo]]></category>
            <category><![CDATA[observability]]></category>
            <category><![CDATA[on-call]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774744519/blog/d7a396c3-c727-4867-8942-03a15b91ea8a_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Fundamentos de diseño de sistemas que todo desarrollador debería conocer]]></title>
            <description><![CDATA[Los conceptos fundamentales del diseño de sistemas escalables — balanceo de carga, caché, escalado de bases de datos, colas de mensajes y las disyuntivas que guían las decisiones de arquitectura.]]></description>
            <link>https://blog.wrujel.com/es/system-design-fundamentals</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/system-design-fundamentals</guid>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[system-design]]></category>
            <category><![CDATA[scalability]]></category>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[distributed-systems]]></category>
            <category><![CDATA[caching]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774740900/blog/f259bcf3-c2a2-4bab-98f0-faa78f862476_image_1.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Diseño de arquitecturas SaaS multicliente que escalan]]></title>
            <description><![CDATA[Diseña aplicaciones SaaS multicliente usando estrategias de aislamiento de base de datos, middleware consciente del tenant, cuotas de recursos, patrones de partición de datos y límites de seguridad que escalan de diez a diez mil tenants sin rediseñar el sistema.]]></description>
            <link>https://blog.wrujel.com/es/designing-multi-tenant-saas-architectures-scale-4c87bf</link>
            <guid isPermaLink="true">https://blog.wrujel.com/es/designing-multi-tenant-saas-architectures-scale-4c87bf</guid>
            <category><![CDATA[architecture]]></category>
            <category><![CDATA[multi-tenant]]></category>
            <category><![CDATA[saas]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[scalability]]></category>
            <category><![CDATA[isolation]]></category>
            <category><![CDATA[architecture]]></category>
            <dc:creator><![CDATA[Wilfredo Rujel]]></dc:creator>
            <pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate>
            <enclosure url="https://res.cloudinary.com/dwovtydne/image/upload/f_auto,q_auto/v1774744491/blog/b0b903fd-93ac-40c5-b80f-38216644300e_image_1.webp" length="0" type="image/webp"/>
        </item>
    </channel>
</rss>