Engineering guides
Backend systems, Node.js, TypeScript, AI coding, fintech infrastructure, and engineering career proof.
Back to engineering guidesLatest posts
Page 5 of 14Test native Node.js addons before upgrading to Node 26
A major Node and V8 update can require rebuilt binaries or updated addon releases. Test clean installs for every architecture, prefer Node-API packages, and build the production container in CI.
Should production use Node.js 26 Current before LTS?
Node.js 26 is the Current line and is scheduled to enter LTS in October 2026. Use Current for evaluation and controlled services; keep critical production on a supported LTS unless a verified benefit justifies earlier adoption.
Node.js 26 V8 14.6 upgrade: what backend teams should test
Node.js 26 moves to V8 14.6 from the Chromium 146 line. Benchmark startup, hot endpoints, memory, worker threads, and native dependencies on production-shaped traffic.
Node.js 26 removes legacy _stream modules: dependency audit guide
Node.js 26 removes legacy `_stream_wrap`, `_stream_readable`, `_stream_writable`, and related internal modules. Scan the dependency tree and upgrade packages before changing the production runtime.
Node.js 26 removes writeHeader: migrate to writeHead
Node.js 26 fully removes `http.ServerResponse.prototype.writeHeader()` and directs users to `writeHead()`. Search application and dependency code, replace direct calls, and test response status and headers.
Undici 8 in Node.js 26: fetch migration and regression checklist
Node.js 26 updates Undici to version 8.0.2. Test redirects, aborts, proxy use, streaming bodies, connection reuse, and timeout policy against real services.
Iterator.concat in Node.js 26: combine lazy sequences without arrays
V8 14.6 in Node.js 26 includes iterator sequencing through `Iterator.concat()`. Use lazy concatenation when inputs are ordered iterables and consumers can process incrementally.
Node.js 26 Map getOrInsert: practical cache initialization examples
Node.js 26 ships V8 14.6 with `Map.prototype.getOrInsert` and `getOrInsertComputed` support. Use computed initialization for per-key objects and keep compatibility checks for older LTS environments.
TypeScript 6 function inference changes: fix order-sensitive generic errors
TypeScript 6 changes context sensitivity for functions without `this`, reducing some order-dependent inference behavior. Add an explicit type argument or variable annotation at the unstable boundary.
TypeScript 6 DOM iterable merge: simplify the lib array
TypeScript 6 folds DOM iterable and async-iterable declarations into `lib.dom.d.ts`; the separate entries remain empty compatibility files. Remove redundant entries and type-check browser, worker, and server configs separately.
Map getOrInsert in TypeScript 6: replace repeated cache initialization
TypeScript 6 includes types for the standardized upsert methods `getOrInsert` and `getOrInsertComputed` in appropriate libraries. Use the computed form for expensive defaults and verify runtime support before removing a helper.
Fix TypeScript TS5112 when compiling one file beside tsconfig.json
TypeScript 6 reports TS5112 and requires `--ignoreConfig` when file arguments intentionally bypass `tsconfig.json`. Use `tsc -p` for project checks and reserve `--ignoreConfig` for isolated experiments.
TypeScript 6 no-default-lib directive removal: use noLib correctly
TypeScript 6 no longer supports `/// <reference no-default-lib="true"/>`. Use `noLib` or explicit `lib` configuration at the project boundary.
Import assertions to import attributes in TypeScript 6
TypeScript 6 deprecates import assertions and directs projects to the `with` keyword. Update source, runtime versions, tests, and bundler support together.
TypeScript 6 removes outFile: migrate to a real bundler
TypeScript 6 removes the `outFile` compiler option. Use TypeScript for checking and declaration emit, then bundle JavaScript with Vite, Rollup, esbuild, or another maintained tool.
TypeScript 6 alwaysStrict false removal: find sloppy-mode code safely
TypeScript 6 assumes strict semantics and no longer allows `alwaysStrict: false`. Search emitted JavaScript assumptions and run behavior tests before deleting the setting.
TypeScript 6 esModuleInterop is always enabled: import migration examples
TypeScript 6 no longer permits `esModuleInterop` or `allowSyntheticDefaultImports` to be false. Remove the false settings and test default imports from CommonJS dependencies.
TypeScript 6 removes moduleResolution classic: modern replacement guide
TypeScript 6 removes `moduleResolution: classic` rather than only warning about it. Choose `NodeNext` for direct Node execution or `Bundler` when a bundler resolves imports.
TypeScript 6 removes AMD, UMD, SystemJS, and module none: what to use instead
TypeScript 6 no longer supports `module` values `amd`, `umd`, `systemjs`, or `none`. Emit ESM or CommonJS for the real runtime and let a maintained bundler create distribution formats.
TypeScript 6 downlevelIteration deprecation: remove a setting that no longer helps
Because TypeScript 6 deprecates the ES5 target, setting `downlevelIteration` now produces a deprecation error. Remove the option after confirming the project targets ES2015 or newer.
TypeScript 6 deprecates target ES5: migration options for legacy browsers
TypeScript 6 deprecates `target: es5` and recommends a newer target or an external transformation step when ES5 remains mandatory. Measure actual browser support, move TypeScript to ES2015 or newer, and use a dedicated transpiler only for verified le
TypeScript 6 libReplacement false: understand the performance change
TypeScript 6 sets `libReplacement` to false by default to avoid unnecessary failed resolutions and watcher overhead. Leave it disabled unless the project deliberately supplies replacement lib packages.
TypeScript 6 noUncheckedSideEffectImports default: fix hidden import typos
TypeScript 6 enables `noUncheckedSideEffectImports` by default so unresolved side-effect-only imports are reported. Fix the path or add a narrow ambient module declaration for intentionally loader-managed assets.
How Claude Code became an agent: product lessons for developer tools
Anthropic’s Claude Code retrospective describes its path from an internal CLI to a broader coding agent. Build around inspectable actions, permission boundaries, fast feedback, and real repository workflows.
Claude Sonnet 5: migration checklist for coding and agent workloads
Anthropic introduced Claude Sonnet 5 for coding, agents, and professional work at scale. Replay repository tasks, tool calls, and structured outputs before replacing the previous model.
Publish an AI Studio Android app safely to the internal test track
Google announced Play Console integration, browser emulation, ADB testing, and Internal Test Track publishing from AI Studio. Add source review, permission review, signing ownership, and device tests before publishing.
Migrate from Gemini CLI to Antigravity CLI without losing project rules
Google is unifying its agent development experience around Antigravity CLI and recommends porting Gemini CLI custom skills. Inventory every customization, migrate in a branch, and compare behavior on fixed tasks.
Evaluate AI-generated web interfaces from Gemini 3.5 Flash
Google says Gemini 3.5 Flash can generate richer interactive web interfaces and graphics. Test real data, empty states, localization, keyboard input, and constrained mobile widths.
Gemini 3.5 Flash for long-running agents: design checkpoints and recovery
Google highlights Gemini 3.5 Flash for longer agentic work through its Antigravity harness. Store checkpoints after planning, data collection, modification, and verification so work can resume safely.
Gemini 3.5 Flash vs larger models: choose with task-level evaluations
Google positions Gemini 3.5 Flash as combining flagship-level intelligence with Flash-series latency and strong coding and agent benchmarks. Compare completion rate, tool errors, latency, and cost on your actual tasks.