<?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[Wilfredo Rujel Blog]]></title>
        <description><![CDATA[Praktische Artikel zu Softwareentwicklung, Systemarchitektur und moderner Webentwicklung — von Mustern bis zur Produktion.]]></description>
        <link>https://blog.wrujel.com/de</link>
        <generator>RSS for Node</generator>
        <lastBuildDate>Wed, 02 Sep 2026 00:30:28 GMT</lastBuildDate>
        <atom:link href="https://blog.wrujel.com/de/feed.xml" rel="self" type="application/rss+xml"/>
        <pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate>
        <copyright><![CDATA[© 2026 Wilfredo Rujel. Alle Rechte vorbehalten.]]></copyright>
        <language><![CDATA[de]]></language>
        <item>
            <title><![CDATA[Idempotente Background-Jobs entwerfen: Retries, Locks und die Illusion von Exactly-Once]]></title>
            <description><![CDATA[Exactly-Once-Verarbeitung gibt es in verteilten Systemen nicht – so entwirfst du Background-Jobs, die Retries, Abstürze und doppelte Zustellungen trotzdem überstehen.]]></description>
            <link>https://blog.wrujel.com/de/designing-idempotent-background-jobs-retries-locks-exactly-once-illusion-e1f557</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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 in Postgres: Aktualität gegen Geschwindigkeit eintauschen]]></title>
            <description><![CDATA[Wie du materialized views nutzt, um teure Aggregationen in Postgres zu beschleunigen, ohne deinen Nutzern unbemerkt veraltete Daten auszuliefern.]]></description>
            <link>https://blog.wrujel.com/de/postgres-materialized-views-tradeoffs-production-0d1d35</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Idempotenzschlüssel in der Praxis: Wiederholungen sicher gestalten]]></title>
            <description><![CDATA[Wie man Idempotenzschlüssel entwirft und implementiert, damit wiederholte Anfragen nie doppelt abrechnen, doppelt senden oder doppelt Ressourcen anlegen.]]></description>
            <link>https://blog.wrujel.com/de/idempotency-keys-in-practice-safe-retries-4da26e</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Cancellation-Patterns in TypeScript: AbortController gezähmt]]></title>
            <description><![CDATA[Warum der Großteil des asynchronen TypeScript-Codes Cancellation komplett ignoriert, und wie man mit AbortController komponierbares, leckfreies Abbrechen aufbaut.]]></description>
            <link>https://blog.wrujel.com/de/cancellation-patterns-typescript-abortcontroller-28219a</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Multi-Region-Datenbank-Failover: Was in der Produktion wirklich kaputtgeht]]></title>
            <description><![CDATA[Multi-Region-Failover wirkt auf einem Architekturdiagramm simpel, doch in der Praxis geht es um Replikationsverzögerung, Split-Brain-Schreibzugriffe und DNS-Caches, die sich weigern mitzuspielen.]]></description>
            <link>https://blog.wrujel.com/de/multi-region-database-failover-lessons-production-9d47a1-f4c405</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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: Ausdrucksstarke, typsichere APIs entwickeln]]></title>
            <description><![CDATA[Nutze TypeScript Template Literal Types, um Event-Namen, Routenmuster und Berechtigungssätze direkt in dein Typsystem zu kodieren — ganz ohne Laufzeitprüfungen und ohne dass Strings auseinanderdriften.]]></description>
            <link>https://blog.wrujel.com/de/typescript-template-literal-types-expressive-apis-33b3b9</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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: Das Feature, das mehr kostet, als es einspart]]></title>
            <description><![CDATA[Soft Deletes wirken wie ein einfaches Sicherheitsnetz, doch sie beschädigen dein Schema unbemerkt, verfälschen deine Abfragen und brechen deine Constraints – hier erfährst du, was du stattdessen verwenden solltest.]]></description>
            <link>https://blog.wrujel.com/de/soft-deletes-hidden-complexity-production-databases-f6a6a0</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Event-Schemas weiterentwickeln, ohne Consumer zu brechen]]></title>
            <description><![CDATA[Wie man in asynchronen Systemen Felder hinzufügt, Eigenschaften umbenennt und Events neu strukturiert, ohne Deployments abzustimmen oder downstream-Consumer stillschweigend zu brechen.]]></description>
            <link>https://blog.wrujel.com/de/evolving-event-schemas-backward-compatibility-39382e</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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: den Thundering Herd in Node.js verhindern]]></title>
            <description><![CDATA[Wenn ein Cache-Eintrag bei hoher Last abläuft, wetteifern Dutzende Anfragen gleichzeitig darum, ihn neu aufzubauen. So verwandelt Request Coalescing – die Deduplizierung gleichzeitig laufender Anfragen – diesen Ansturm in einen einzigen Aufruf an das Backend.]]></description>
            <link>https://blog.wrujel.com/de/request-coalescing-thundering-herd-prevention-nodejs-42e380</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Volltextsuche in Postgres: Elasticsearch ist in den meisten Fällen überflüssig]]></title>
            <description><![CDATA[Postgres verfügt über eine leistungsstarke integrierte Volltextsuche auf Basis von tsvector, tsquery und GIN-Indizes — für die meisten Anwendungen ist kein Elasticsearch-Cluster nötig.]]></description>
            <link>https://blog.wrujel.com/de/postgres-full-text-search-without-elasticsearch-d9269e</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Große Datenmengen in Node.js streamen: Backpressure und asynchrone Generatoren]]></title>
            <description><![CDATA[Schluss mit dem vollständigen Laden von Ergebnismengen in den Speicher: Wie Node.js-Streams und asynchrone Generatoren es ermöglichen, Millionen von Datensätzen zu verarbeiten, ohne den Heap zu sprengen.]]></description>
            <link>https://blog.wrujel.com/de/streaming-large-datasets-nodejs-backpressure-55e2c4</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Verteilte Locks: Arbeit über mehrere Knoten koordinieren]]></title>
            <description><![CDATA[Vermeide Race Conditions in verteilten Systemen: ein praktischer Leitfaden zur Implementierung verteilter Locks mit Redis und PostgreSQL-Advisory-Locks in Node.js.]]></description>
            <link>https://blog.wrujel.com/de/distributed-locks-coordinating-work-across-nodes-cd19de</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Der satisfies-Operator von TypeScript: Typsicherheit ohne Inferenzverlust]]></title>
            <description><![CDATA[Der satisfies-Operator von TypeScript prüft, ob ein Wert einem Typ entspricht, ohne die Inferenz der Literale zu verlieren — hier erfährst du, warum dieser Unterschied zählt und wann du ihn einsetzt.]]></description>
            <link>https://blog.wrujel.com/de/typescript-satisfies-operator-type-inference-38e542</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Typsichere Event-Emitter in TypeScript]]></title>
            <description><![CDATA[Ersetzen Sie Nodes stringbasierten EventEmitter durch eine generische, typisierte Alternative, die Tippfehler in Eventnamen und falsche Payload-Strukturen bereits zur Kompilierzeit erkennt.]]></description>
            <link>https://blog.wrujel.com/de/type-safe-event-emitters-typescript-663c37</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Durable Execution: Langlaufende Workflows erstellen, die Neustarts überleben]]></title>
            <description><![CDATA[Warum Job-Warteschlangen und Datenbank-Zustandsmaschinen bei komplexen mehrstufigen Prozessen an ihre Grenzen stoßen, und wie Durable Execution mit Temporal Workflows liefert, die Abstürze, Wiederholungen und Deployments überstehen.]]></description>
            <link>https://blog.wrujel.com/de/durable-execution-workflows-typescript-temporal-bb0781</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Asynchrone Nebenläufigkeitssteuerung in Node.js: Semaphore, Throttling und Backpressure]]></title>
            <description><![CDATA[Ein unbegrenztes Promise.all ist ein stiller OOM-Killer — so baust du Semaphore, gedrosselte Queues und Stream-Backpressure in deine Node.js-Anwendungen ein.]]></description>
            <link>https://blog.wrujel.com/de/async-concurrency-control-nodejs-semaphores-70df4a</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Das DataLoader-Muster: N+1-Abfragen ohne ORM eliminieren]]></title>
            <description><![CDATA[N+1 ist kein ORM-Problem: lerne, wie du das DataLoader-Batching-Muster in TypeScript implementierst, um redundante Datenabfragen über jede Datenquelle hinweg zusammenzufassen – auch Microservices.]]></description>
            <link>https://blog.wrujel.com/de/dataloader-pattern-eliminating-n-plus-one-typescript-c9fdcb</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Das Transactional-Outbox-Pattern: Dual-Write in verteilten Systemen lösen]]></title>
            <description><![CDATA[Wie das Transactional-Outbox-Pattern das Dual-Write-Problem eliminiert und zuverlässiges Event-Publishing garantiert, ohne die Datenbank fest an den Message-Broker zu koppeln.]]></description>
            <link>https://blog.wrujel.com/de/transactional-outbox-pattern-reliable-event-publishing-bbc7e2</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Request-Kontext ohne Prop Drilling: AsyncLocalStorage in Node.js]]></title>
            <description><![CDATA[Nutze AsyncLocalStorage, um Request-Kontext — Trace-IDs, Benutzersitzungen, Mandantendaten — durch asynchrone Aufrufketten zu propagieren, ohne Werte durch jede Funktionssignatur zu reichen.]]></description>
            <link>https://blog.wrujel.com/de/async-local-storage-request-context-nodejs-dd11f4</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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: Domänenmodellierung zur Compile-Zeit]]></title>
            <description><![CDATA[Eliminieren Sie eine ganze Klasse von Laufzeitfehlern, indem Sie TypeScripts Typsystem beibringen, zwischen einer UserId und einer OrderId zu unterscheiden – selbst wenn beide intern Strings sind.]]></description>
            <link>https://blog.wrujel.com/de/typescript-branded-types-domain-modeling-564074</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Contract-First-API-Design mit OpenAPI und TypeScript]]></title>
            <description><![CDATA[Lass deine API-Spezifikation nicht länger von der Implementierung abdriften — definiere zuerst den Vertrag, generiere die Typen für beide Seiten und lass den Compiler die Lücken finden.]]></description>
            <link>https://blog.wrujel.com/de/contract-first-api-design-openapi-typescript-2b59ac</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Graceful Shutdown in Node.js-Produktionsdiensten]]></title>
            <description><![CDATA[Die meisten Node.js-Dienste brechen bei jedem Deployment laufende Requests stillschweigend ab; hier erfährst du, wie du SIGTERM korrekt behandelst, Verbindungen drainst und sauber in Kubernetes beendest.]]></description>
            <link>https://blog.wrujel.com/de/graceful-shutdown-nodejs-production-services-739770</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Komponierbare Middleware-Pipelines in TypeScript]]></title>
            <description><![CDATA[Hör auf, Middleware an Frameworks anzuflanschen, und baue stattdessen typsichere, komponierbare Pipeline-Primitive, die du isoliert testen und auf einen Blick verstehen kannst.]]></description>
            <link>https://blog.wrujel.com/de/composable-middleware-pipelines-typescript-017190</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Typsicherheit zur Laufzeit mit Zod: Validierung an jeder Grenze]]></title>
            <description><![CDATA[Das Typsystem von TypeScript endet bei der Kompilierung — Zod schließt diese Lücke, indem es Daten genau dort zur Laufzeit validiert, wo es wirklich darauf ankommt.]]></description>
            <link>https://blog.wrujel.com/de/runtime-type-safety-zod-validation-boundaries-ed4ad0</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[HTTP-Caching entmystifiziert: Cache-Control, ETags und CDN-Strategien]]></title>
            <description><![CDATA[Ein praxisnaher Leitfaden zu HTTP-Caching-Headern — was jede Direktive wirklich bewirkt, wann ETags sinnvoll sind und wie du aufhörst, gegen dein CDN zu kämpfen.]]></description>
            <link>https://blog.wrujel.com/de/http-caching-cache-control-etags-cdn-strategies-cfce0a</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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: Muster, Fallstricke und Praxiseinsatz]]></title>
            <description><![CDATA[Server Actions holen die Formularverarbeitung und Mutationen in Next.js zurück auf den Server — so setzt man sie richtig ein, das sind die Fallstricke, und so baut man Muster, die mitwachsen.]]></description>
            <link>https://blog.wrujel.com/de/react-server-actions-patterns-pitfalls-production-381b58</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Finite State Machines für komplexe UI-Logik in TypeScript]]></title>
            <description><![CDATA[Ersetze Boolean-Flag-Spaghetti durch Finite State Machines: ein TypeScript-zentrierter Ansatz für UI-Zustände, der unmögliche Zustände durch Konstruktion unmöglich macht.]]></description>
            <link>https://blog.wrujel.com/de/finite-state-machines-complex-ui-logic-typescript-60ffc5</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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 in Node.js: CPU-intensive Arbeit auslagern, ohne den Event Loop zu blockieren]]></title>
            <description><![CDATA[Erfahre, wie du mit Worker Threads in Node.js CPU-intensive Aufgaben verarbeitest, ohne den Event Loop zu blockieren – mit Thread-Pooling und typsicheren Messaging-Patterns.]]></description>
            <link>https://blog.wrujel.com/de/worker-threads-nodejs-cpu-bound-work-de8329</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Fehlerbehandlung in TypeScript: Muster, die skalieren]]></title>
            <description><![CDATA[Weg vom try-catch-Wirrwarr: discriminated unions, Result-Typen und Fehlergrenzen, die TypeScript-Codebasen zuverlässiger und wartbarer machen.]]></description>
            <link>https://blog.wrujel.com/de/error-handling-patterns-typescript-005a97</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Teststrategien für moderne Web-Apps: Was wirklich funktioniert]]></title>
            <description><![CDATA[Ein praktischer Leitfaden für eine Teststrategie, die echte Bugs findet – Unit-, Integrations- und End-to-End-Tests mit Vitest, Testing Library und Playwright sowie die Kompromisse jeder Ebene.]]></description>
            <link>https://blog.wrujel.com/de/testing-strategies-for-modern-web-apps</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Docker-Entwicklungsworkflows, die wirklich funktionieren]]></title>
            <description><![CDATA[Hör auf, mit Docker im lokalen Entwicklungsalltag zu kämpfen: Multi-Stage-Builds, Bind Mounts, Compose-Overrides und die Patterns, die Container nativ fühlen lassen.]]></description>
            <link>https://blog.wrujel.com/de/docker-development-workflow-bdccc3</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Ein Design-System aufbauen: Von Tokens zu Komponenten]]></title>
            <description><![CDATA[Design-Tokens, Komponenten-APIs und die organisatorischen Muster, die ein Design-System zu einem Multiplikator statt zu einem Wartungsrisiko machen.]]></description>
            <link>https://blog.wrujel.com/de/building-a-design-system-e9110c</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[LLMs in deine App integrieren: Muster, die in der Produktion bestehen]]></title>
            <description><![CDATA[Praktische Muster für zuverlässige, kosteneffiziente LLM-Funktionen – Prompt-Engineering, Streaming, strukturierte Ausgaben, Fallback-Mechanismen und Kostenmanagement.]]></description>
            <link>https://blog.wrujel.com/de/integrating-llms-into-your-app</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Skalierbare APIs mit Next.js Route Handlers bauen]]></title>
            <description><![CDATA[Ein umfassender Leitfaden zum Entwerfen und Bauen skalierbarer, produktionsreifer APIs mit Next.js Route Handlers, TypeScript, Validierung und Error-Handling-Mustern.]]></description>
            <link>https://blog.wrujel.com/de/building-scalable-apis-with-nextjs</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Vom Junior zum Senior: Lehren, die meinen Code verändert haben]]></title>
            <description><![CDATA[Die Mentalitätswechsel, technischen Gewohnheiten und Karriereentscheidungen, die mein Wachstum von einem Junior-Entwickler zu einem Senior-Ingenieur über sieben Jahre in der Branche geprägt haben.]]></description>
            <link>https://blog.wrujel.com/de/from-junior-to-senior-lessons-learned</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[React-Performance-Optimierung: Patterns, die wirklich etwas bewirken]]></title>
            <description><![CDATA[Praktische Performance-Techniken für React — Memoisierung, Virtualisierung, Code-Splitting und Profiling — mit echten Vorher-Nachher-Benchmarks und den Kompromissen jedes Ansatzes.]]></description>
            <link>https://blog.wrujel.com/de/react-performance-optimization-patterns</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Microservices-Architekturmuster, die wirklich funktionieren]]></title>
            <description><![CDATA[Praktische Lektionen aus dem Entwurf und Betrieb von Microservices im großen Maßstab — ereignisgesteuerte Kommunikation, Servicegrenzen und die Muster, die sich im Produktivbetrieb bewährt haben.]]></description>
            <link>https://blog.wrujel.com/de/microservices-architecture-patterns</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Datenbank-Designfehler, die ich in jeder Codebase sehe (und wie man sie behebt)]]></title>
            <description><![CDATA[Die wiederkehrenden Datenbank-Designfehler, die langsame Abfragen, schmerzhafte Migrationen und Produktionsvorfälle verursachen — mit praktischen Lösungen und der Begründung hinter jedem einzelnen.]]></description>
            <link>https://blog.wrujel.com/de/database-design-mistakes-and-fixes</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[CI/CD-Pipelines, die nicht im Weg stehen]]></title>
            <description><![CDATA[Wie man CI/CD-Pipelines baut, die schnell und zuverlässig sind und denen das Team tatsächlich vertraut – mit Caching, Parallelisierung, Umgebungsparität und Deployment-Strategien.]]></description>
            <link>https://blog.wrujel.com/de/ci-cd-pipeline-best-practices</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Websicherheit für Entwickler: Die Grundlagen, die du nicht überspringen darfst]]></title>
            <description><![CDATA[Die Sicherheitslücken, die am häufigsten in Webanwendungen auftreten – erklärt anhand realer Codebeispiele und konkreter Lösungen, die jeder Entwickler kennen sollte.]]></description>
            <link>https://blog.wrujel.com/de/web-security-for-developers</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[TypeScript-Patterns für große Codebasen]]></title>
            <description><![CDATA[Fortgeschrittene TypeScript-Patterns, auf die ich täglich zurückgreife — Discriminated Unions, Branded Types, das Builder-Pattern und Utility-Types, die große Codebasen sicherer und wartbarer machen.]]></description>
            <link>https://blog.wrujel.com/de/typescript-patterns-for-large-codebases</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[State Management 2026: Was du wann einsetzen solltest]]></title>
            <description><![CDATA[Ein praktischer Leitfaden zur Wahl des richtigen State-Management-Ansatzes in modernen React-Apps – von useState über Zustand bis React Query – und die Überlegungen hinter jeder Entscheidung.]]></description>
            <link>https://blog.wrujel.com/de/state-management-in-2026</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Fünf Jahre Softwareentwicklung: Rückblick auf die wichtigsten Lektionen]]></title>
            <description><![CDATA[Fünf Jahre Softwareentwicklung, verdichtet auf die Lektionen, die wirklich zählen: Grundlagen vor Framework-Hypes, Vertrauen durch verlässliche Lieferungen, Code für die nächste Entwicklerin oder den nächsten Entwickler und das Gespür dafür, wann Einfachheit klüger ist als Cleverness.]]></description>
            <link>https://blog.wrujel.com/de/reflecting-five-years-software-engineering-lessons-c8a2c1</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Schutz von API-Schlüsseln und Secrets in Frontend-Anwendungen]]></title>
            <description><![CDATA[Schütze API-Schlüssel und Secrets in Frontend-Anwendungen mit Backend-Proxys, sicherer Token-Verwahrung, sauberer Umgebungsvariablen-Handhabung, Secret-Injection zur Laufzeit und Client-Credential-Mustern, die eine Offenlegung im Browser-Bundle und in der Versionskontrolle verhindern.]]></description>
            <link>https://blog.wrujel.com/de/securing-api-keys-secrets-frontend-applications-70aa71</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Interne Entwicklerplattformen bauen, die Teams wirklich nutzen]]></title>
            <description><![CDATA[Entwickle interne Entwicklerplattformen, die die Auslieferung beschleunigen – mit Self-Service-Infrastruktur, Golden Paths, Plattform-APIs, Metriken zur Developer Experience und Adoptionsstrategien, die Vertrauen schaffen statt Compliance zu erzwingen.]]></description>
            <link>https://blog.wrujel.com/de/building-internal-developer-platforms-teams-use-207964</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Code-Review-Kultur: Wie man Feedback gibt, das wirklich hilft]]></title>
            <description><![CDATA[Die Prinzipien und Praktiken, die Code Reviews von einem Kontrollritual in ein echtes Lernwerkzeug verwandeln — für den Reviewer wie für den Autor.]]></description>
            <link>https://blog.wrujel.com/de/code-review-culture</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Dependency-Injection-Muster in TypeScript-Anwendungen]]></title>
            <description><![CDATA[Implementiere Dependency Injection in TypeScript mit Constructor Injection, Factory Functions, DI-Containern und Kompositionsmustern auf Modulebene, die Testbarkeit verbessern und Komponenten ohne Framework-Lock-in entkoppeln.]]></description>
            <link>https://blog.wrujel.com/de/dependency-injection-patterns-typescript-applications-73b8d6</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Monitoring- und Alerting-Strategien gegen Alert-Müdigkeit]]></title>
            <description><![CDATA[Gestalte Monitoring- und Alerting-Systeme, die reale Probleme zeigen – mit SLO-Alerts, symptombasierter Erkennung, Eskalationsrouting, automatisierten Runbooks und Techniken zur Rauschreduzierung, die dem Bereitschaftsteam den Fokus aufs Wesentliche erhalten.]]></description>
            <link>https://blog.wrujel.com/de/monitoring-alerting-strategies-reduce-alert-fatigue-f1f00b</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Grundlagen des Systemdesigns, die jeder Entwickler kennen sollte]]></title>
            <description><![CDATA[Die zentralen Konzepte skalierbaren Systemdesigns — Lastverteilung, Caching, Datenbankskalierung, Warteschlangen und die Kompromisse, die architektonische Entscheidungen leiten.]]></description>
            <link>https://blog.wrujel.com/de/system-design-fundamentals</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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[Multimandantenfähige SaaS-Architekturen, die skalieren]]></title>
            <description><![CDATA[Entwickle multimandantenfähige SaaS-Anwendungen mit Strategien zur Datenbankisolierung, mandantenbewusstem Middleware, Ressourcenkontingenten, Datenpartitionierungsmustern und Sicherheitsgrenzen, die von zehn auf zehntausend Mandanten skalieren, ohne das System neu zu entwerfen.]]></description>
            <link>https://blog.wrujel.com/de/designing-multi-tenant-saas-architectures-scale-4c87bf</link>
            <guid isPermaLink="true">https://blog.wrujel.com/de/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>