# Wilfredo Rujel Blog > Practical articles on software engineering, system architecture, and modern web development — from patterns to production. Written by Wilfredo Rujel. 368 articles on software engineering, published in en, es, de. ## Categories - [Engineering](https://blog.wrujel.com/category/engineering): Software craft & practices - [Architecture](https://blog.wrujel.com/category/architecture): Systems & patterns - [Frontend](https://blog.wrujel.com/category/frontend): UI & user experience - [Backend](https://blog.wrujel.com/category/backend): APIs & server logic - [DevOps](https://blog.wrujel.com/category/devops): Pipelines & infrastructure - [Career](https://blog.wrujel.com/category/career): Level up your career - [Tutorials](https://blog.wrujel.com/category/tutorials): Step-by-step guides - [Security](https://blog.wrujel.com/category/security): Vulnerabilities & defenses - [Artificial Intelligence](https://blog.wrujel.com/category/ai): Models & integrations - [Productivity](https://blog.wrujel.com/category/productivity): Tools & workflows ## Latest articles - [Replication Lag: The Hidden Cost of Read Replicas](https://blog.wrujel.com/replication-lag-read-replicas-hidden-cost-5c78d9): Why read replicas introduce stale reads, how replication lag breaks consistency assumptions, and practical patterns to handle it safely. - [Why SQLite Deserves a Place in Your Backend Stack](https://blog.wrujel.com/sqlite-production-backends-abfb58): Not just for mobile apps: with WAL mode and the right replication strategy, SQLite runs production workloads with less operational overhead than Postgres. - [The CSS :has() Selector: A Practical Guide](https://blog.wrujel.com/css-has-selector-practical-guide-dff8b0): How the :has() pseudo-class finally gives CSS a parent selector, and the patterns, pitfalls and performance trade-offs that come with it. - [GraphQL Federation: Splitting a Schema Without Splitting Teams](https://blog.wrujel.com/graphql-federation-composing-supergraph-services-2394bd): A practical guide to GraphQL Federation for breaking up a monolithic schema across services without duplicating resolvers or gateway logic. - [CSS Anchor Positioning: The End of Popper.js](https://blog.wrujel.com/css-anchor-positioning-tooltips-without-js-6ae68a): CSS anchor positioning lets you position tooltips, popovers, and menus relative to any element without a JavaScript positioning library. - [HTTP/3 and QUIC: What Backend Engineers Should Know](https://blog.wrujel.com/http3-quic-backend-engineers-guide-2474c9): HTTP/3 replaces TCP with QUIC over UDP, eliminating head-of-line blocking at the transport layer — here's what actually changes for your services. - [Stop Reaching for any: Narrowing unknown in TypeScript](https://blog.wrujel.com/narrowing-unknown-typescript-safer-than-any-91b916): Why unknown is the type-safe replacement for any, and the narrowing patterns that make it practical in real code. - [Postgres Row-Level Security for Multi-Tenant Applications](https://blog.wrujel.com/postgres-row-level-security-multi-tenant-apps-bdc678): How to enforce tenant isolation at the database layer with Postgres RLS instead of relying on application code to remember a WHERE clause. - [Idempotent Background Jobs: Retries, Locks, Exactly-Once](https://blog.wrujel.com/designing-idempotent-background-jobs-retries-locks-exactly-once-illusion-e1f557): Exactly-once processing does not exist in distributed systems — here is how to design background jobs that survive retries, crashes and duplicate deliveries. - [Materialized Views in Postgres: Trading Freshness for Speed](https://blog.wrujel.com/postgres-materialized-views-tradeoffs-production-0d1d35): How to use materialized views to speed up expensive aggregations in Postgres without silently serving stale data to your users. - [Idempotency Keys in Practice: Making Retries Safe](https://blog.wrujel.com/idempotency-keys-in-practice-safe-retries-4da26e): How to design and implement idempotency keys so retried requests never double-charge, double-send, or double-create resources. - [Cancellation Patterns in TypeScript: Taming AbortController](https://blog.wrujel.com/cancellation-patterns-typescript-abortcontroller-28219a): Why most async TypeScript code ignores cancellation entirely, and how to build composable, leak-free cancellation with AbortController. - [Multi-Region Failover: What Actually Breaks in Production](https://blog.wrujel.com/multi-region-database-failover-lessons-production-9d47a1-f4c405): Multi-region failover looks simple on an architecture diagram — the reality is replication lag, split-brain writes and DNS caches that refuse to cooperate. - [Template Literal Types: Expressive, Type-Safe APIs](https://blog.wrujel.com/typescript-template-literal-types-expressive-apis-33b3b9): Use TypeScript template literal types to encode event names, route patterns and permission sets in the type system — no runtime checks, no string drift. - [Soft Deletes: The Feature That Costs More Than It Saves](https://blog.wrujel.com/soft-deletes-hidden-complexity-production-databases-f6a6a0): Soft deletes look like a simple safety net, but they silently corrupt your schema, poison your queries, and break your constraints — here's what to use instead. - [Evolving Event Schemas Without Breaking Consumers](https://blog.wrujel.com/evolving-event-schemas-backward-compatibility-39382e): How to add fields, rename properties, and restructure events in async systems without coordinating deployments or silently breaking downstream consumers. - [Request Coalescing: Stopping the Thundering Herd](https://blog.wrujel.com/request-coalescing-thundering-herd-prevention-nodejs-42e380): When a cache entry expires under load, dozens of requests race to rebuild it — inflight deduplication collapses that stampede into one upstream call. - [Full-Text Search in Postgres, Without Elasticsearch](https://blog.wrujel.com/postgres-full-text-search-without-elasticsearch-d9269e): Postgres has a powerful built-in full-text search engine using tsvector, tsquery, and GIN indexes — no Elasticsearch cluster required for most applications. - [Streaming Large Datasets in Node.js with Backpressure](https://blog.wrujel.com/streaming-large-datasets-nodejs-backpressure-55e2c4): Stop loading entire result sets into memory: how Node.js streams and async generators let you process millions of records without blowing the heap. - [Distributed Locks: Coordinating Work Across Multiple Nodes](https://blog.wrujel.com/distributed-locks-coordinating-work-across-nodes-cd19de): Stop racing conditions in distributed systems: a practical guide to implementing distributed locks with Redis and PostgreSQL advisory locks in Node.js. - [TypeScript satisfies: Type Safety Without Losing Inference](https://blog.wrujel.com/typescript-satisfies-operator-type-inference-38e542): The satisfies operator validates that a value matches a type while preserving literal inference — why that distinction matters and where to apply it. - [Type-Safe Event Emitters in TypeScript](https://blog.wrujel.com/type-safe-event-emitters-typescript-663c37): Replace Node's stringly-typed EventEmitter with a generic typed alternative that catches event name typos and payload mismatches at compile time. - [Durable Execution: Workflows That Survive Restarts](https://blog.wrujel.com/durable-execution-workflows-typescript-temporal-bb0781): Why job queues and database state machines break on complex multi-step processes, and how durable execution with Temporal survives crashes and deployments. - [Async Concurrency in Node.js: Semaphores and Backpressure](https://blog.wrujel.com/async-concurrency-control-nodejs-semaphores-70df4a): Unbounded Promise.all is a silent OOM killer — here's how to build semaphores, throttled queues, and stream backpressure into your Node.js applications. - [The DataLoader Pattern: Killing N+1 Queries Without an ORM](https://blog.wrujel.com/dataloader-pattern-eliminating-n-plus-one-typescript-c9fdcb): N+1 is not an ORM problem — implement the DataLoader batching pattern in TypeScript to collapse redundant fetches across any source, microservices included. - [The Transactional Outbox Pattern: Solving Dual-Write](https://blog.wrujel.com/transactional-outbox-pattern-reliable-event-publishing-bbc7e2): How the transactional outbox pattern eliminates the dual-write problem and guarantees reliable event publishing without coupling database to broker. - [Request Context in Node.js with AsyncLocalStorage](https://blog.wrujel.com/async-local-storage-request-context-nodejs-dd11f4): Use AsyncLocalStorage to carry request-scoped context — trace IDs, sessions, tenant data — through async call stacks without threading it everywhere. - [TypeScript Branded Types: Compile-Time Domain Modeling](https://blog.wrujel.com/typescript-branded-types-domain-modeling-564074): Eliminate a whole class of runtime bugs by teaching TypeScript the difference between a UserId and an OrderId — even when both are strings underneath. - [Contract-First API Design with OpenAPI and TypeScript](https://blog.wrujel.com/contract-first-api-design-openapi-typescript-2b59ac): Stop letting your API spec drift from your implementation — define the contract first, generate types for both sides, and let the compiler catch the gaps. - [Graceful Shutdown in Node.js Production Services](https://blog.wrujel.com/graceful-shutdown-nodejs-production-services-739770): Most Node.js services silently drop in-flight requests on every deploy. How to handle SIGTERM correctly, drain connections and exit cleanly in Kubernetes. - [Composable Middleware Pipelines in TypeScript](https://blog.wrujel.com/composable-middleware-pipelines-typescript-017190): Stop bolting middleware onto frameworks and start building type-safe, composable pipeline primitives you can test in isolation and reason about at a glance. - [Runtime Type Safety with Zod: Validating at Every Boundary](https://blog.wrujel.com/runtime-type-safety-zod-validation-boundaries-ed4ad0): TypeScript's type system stops at compile time — Zod closes the gap by validating data at the runtime boundaries where it actually matters. - [HTTP Caching: Cache-Control, ETags and CDN Strategies](https://blog.wrujel.com/http-caching-cache-control-etags-cdn-strategies-cfce0a): A practical guide to HTTP caching headers — what each directive actually does, when to use ETags, and how to stop fighting your CDN. - [React Server Actions: Patterns, Pitfalls, and Production Use](https://blog.wrujel.com/react-server-actions-patterns-pitfalls-production-381b58): Server Actions bring form handling and mutations back to the server in Next.js — how to use them well, what to avoid and which patterns actually scale. - [Finite State Machines for Complex UI Logic in TypeScript](https://blog.wrujel.com/finite-state-machines-complex-ui-logic-typescript-60ffc5): Replace boolean flag spaghetti with finite state machines: a TypeScript-first approach to UI states that makes impossible states impossible by construction. - [Worker Threads in Node.js: Offloading CPU-Bound Work](https://blog.wrujel.com/worker-threads-nodejs-cpu-bound-work-de8329): Learn how to use Node.js worker threads to handle CPU-intensive tasks without blocking the event loop, with thread pooling and type-safe messaging patterns. - [Error Handling in TypeScript: Patterns That Scale](https://blog.wrujel.com/error-handling-patterns-typescript-005a97): Move beyond try-catch soup: discriminated unions, Result types, and error boundaries that make TypeScript codebases more reliable and maintainable. - [Testing Strategies for Modern Web Apps: What Actually Works](https://blog.wrujel.com/testing-strategies-for-modern-web-apps): A practical guide to a testing strategy that catches real bugs: unit, integration and end-to-end with Vitest, Testing Library and Playwright. - [Docker Development Workflows That Actually Work](https://blog.wrujel.com/docker-development-workflow-bdccc3): Stop fighting Docker in local dev: multi-stage builds, bind mounts, Compose overrides, and the patterns that make containers feel native. - [Building a Design System: From Tokens to Components](https://blog.wrujel.com/building-a-design-system-e9110c): Design tokens, component APIs, and the organizational patterns that make a design system a force multiplier instead of a maintenance burden. - [Integrating LLMs: Patterns That Hold Up in Production](https://blog.wrujel.com/integrating-llms-into-your-app): Practical patterns for reliable, cost-efficient LLM features: prompt engineering, streaming, structured outputs, fallbacks and cost management. - [Building Scalable APIs with Next.js Route Handlers](https://blog.wrujel.com/building-scalable-apis-with-nextjs): A complete guide to designing scalable, production-ready APIs with Next.js Route Handlers, TypeScript, validation and error-handling patterns. - [From Junior to Senior: Lessons That Changed How I Write Code](https://blog.wrujel.com/from-junior-to-senior-lessons-learned): The mindset shifts, technical habits, and career decisions that shaped my growth from a junior developer to a senior engineer over seven years in the industry. - [React Performance: Patterns That Move the Needle](https://blog.wrujel.com/react-performance-optimization-patterns): Practical React performance techniques — memoization, virtualization, code splitting and profiling — with real before/after benchmarks and their tradeoffs. - [Microservices Architecture Patterns That Actually Work](https://blog.wrujel.com/microservices-architecture-patterns): Practical lessons from designing and operating microservices at scale: event-driven communication, service boundaries and the patterns that survived. - [Database Design Mistakes in Every Codebase, and Their Fixes](https://blog.wrujel.com/database-design-mistakes-and-fixes): The recurring database design mistakes behind slow queries, painful migrations and production incidents — with practical fixes and the reasoning. - [CI/CD Pipelines That Don't Get in Your Way](https://blog.wrujel.com/ci-cd-pipeline-best-practices): How to design CI/CD pipelines that are fast, reliable and genuinely trusted by your team: caching, parallelism, environment parity and deploy strategies. - [Web Security for Developers: The Essentials You Can't Skip](https://blog.wrujel.com/web-security-for-developers): The security vulnerabilities that appear most often in web applications, explained with real code examples and concrete fixes every developer should know. - [TypeScript Patterns for Large Codebases](https://blog.wrujel.com/typescript-patterns-for-large-codebases): Advanced TypeScript patterns I use daily: discriminated unions, branded types, the builder pattern and utility types that keep large codebases safe. - [State Management in 2026: What to Use and When](https://blog.wrujel.com/state-management-in-2026): A practical guide to choosing the right state management approach in modern React apps — useState, Zustand, React Query — and the reasoning behind each. ## Feeds and indexes - [RSS](https://blog.wrujel.com/feed.xml) - [Sitemap](https://blog.wrujel.com/sitemap.xml): every article, category and tag in every language - [Latest articles (JSON)](https://blog.wrujel.com/api/latest) ## Other languages - [es](https://blog.wrujel.com/es): same articles, translated - [de](https://blog.wrujel.com/de): same articles, translated