Engineering guides
Backend systems, Node.js, TypeScript, AI coding, fintech infrastructure, and engineering career proof.
Latest posts
Page 7 of 18TypeScript satisfies vs annotation: preserve useful inference
The satisfies operator checks compatibility while preserving the expression’s narrower inferred type, unlike some broad annotations.
Declaration maps in TypeScript: debug the source, not dist files
Declaration maps let editor navigation return to original TypeScript source, but published paths must match the package contents.
TypeScript project references: when incremental builds go stale
Project references speed large repositories only when dependency direction, outputs, and build info files stay consistent.
TypeScript package exports: expose types and runtime together
A package should expose matching type and runtime entry points so consumers do not resolve declarations from a path Node cannot execute.
NodeNext module resolution: why file extensions matter
NodeNext follows Node’s ESM rules, so relative imports in emitted code need runtime-valid extensions even when the source file is TypeScript.
TypeScript verbatimModuleSyntax: type imports without surprises
Verbatim module syntax keeps imports and exports closer to what you wrote, making type-only intent explicit and exposing module mismatches earlier.
TypeScript exactOptionalPropertyTypes: missing is not undefined
With exact optional properties, an absent key and a present key holding undefined are different states, which matters for patches and serialization.
TypeScript noUncheckedIndexedAccess: fix unsafe lookups clearly
This option makes array and dictionary access include undefined, revealing assumptions that need a guard, a default, or a stronger data model.
Benchmark TypeScript 7 correctly: cold build vs editor latency
A single tsc timing misses the experience developers feel, so measure clean builds, incremental builds, editor startup, and completion latency separately.
TypeScript 7 migration checklist for a Node.js monorepo
Treat the TypeScript 7 upgrade as a compiler and tooling migration: capture the TypeScript 6 baseline, remove deprecated options, then compare diagnostics package by package.
Node.js CVE-2026-58044: HTTP header truncation and request smuggling
CVE-2026-58044 can create HTTP request-smuggling risk when Node.js forwards truncated headers. Learn the proxy conditions, affected versions, tests, and fix.
Node.js SQLTagStore CVE-2026-58041: stale iterators can replay writes
CVE-2026-58041 affects Node.js SQLTagStore iterator reuse in Node 24 and 26. Learn how stale iteration could repeat writes, how to audit code, and update.
Node.js HTTPS Agent CVEs: mTLS identity and hostname verification risks
Two July 2026 Node.js HTTPS Agent fixes affect PFX identity reuse and TLS hostname checks. Learn who is exposed, how to test connection reuse, and patch safely.
Node.js Permission Model CVE-2026-58043: radix path overgrant explained
CVE-2026-58043 could let Node.js Permission Model path rules grant broader access than intended. Learn affected versions, realistic risk, tests, and fixes.
Node.js HTTP/2 CVEs in July 2026: memory retention and use-after-free
Two high-severity Node.js HTTP/2 flaws were patched in July 2026. Learn which versions are affected, how to identify exposure, test safely, and update.
Graceful shutdown in Node.js: drain HTTP, queues, and database work
Closing the HTTP listener is only the first step; a process must stop taking work, finish bounded in-flight tasks, and then release.
CORS preflight caching: reduce OPTIONS traffic without weakening policy
Preflight caching can reduce repeated OPTIONS requests, but it cannot repair an overly broad origin or credential.
Server-Sent Events in Node.js: production reconnects and backpressure
SSE is simple for one-way updates, but production code must handle proxy buffering, disconnect cleanup, event IDs, and slow.
HTTP 103 Early Hints: when preloading helps and when it wastes bandwidth
Early Hints can start critical fetches before the final response, but incorrect hints compete with the resources a page actually.
Passkey backend verification: the checks tutorials often omit
A browser ceremony is not authentication until the server validates challenge, origin, RP ID, signature, counters, and credential.
Node.js diagnostics_channel: add observability without patching libraries
diagnostics_channel provides low-coupling instrumentation points, but subscribers must remain cheap and protect sensitive.
OpenTelemetry in Node.js: trace one request across API, queue, and worker
Distributed tracing becomes useful when context survives asynchronous boundaries and span names describe operations rather than framework.
Docker multi-stage builds for Node.js: smaller without missing runtime files
A smaller image is useful only when native modules, certificates, migrations, and source maps required at runtime still arrive in the final.
Docker BuildKit cache in GitHub Actions: stop rebuilding every layer
Remote BuildKit cache can reduce CI time, but only if Dockerfile ordering and cache ownership match the repository.
Kafka partition count planning: throughput is only one constraint
Partitions control parallelism, ordering, recovery work, and metadata cost, which makes a single messages-per-second formula.
Kafka consumer lag is not enough: measure processing age too
A consumer can have low offset lag while processing old events, so operations need both queue depth and event-age.
Kafka KRaft migration: a rollback-aware plan for production clusters
Moving Kafka metadata from ZooKeeper to KRaft is an operational migration, not a configuration rename, and each phase needs a stop.
Redis hot-key detection: find the key behind uneven latency
A healthy average can hide one key receiving a disproportionate share of traffic and blocking a Redis.
Redis vector sets in Node.js: build semantic search you can debug
A vector search feature becomes maintainable only when embeddings, distance metrics, filters, and evaluation examples are versioned.
Redis 8.8 arrays explained: where ordered values fit
Redis arrays add another way to represent ordered data, so teams should compare update patterns and memory rather than replacing lists.