TOOLINGBiome v2.5: 500 Lint Rules, Plugin Code Fixes, and Cross-File Linting
Biome v2.5 crosses the milestone of 500 lint rules, promoting 73 nursery rules to stable groups across correctness, suspicious, style, and security categories. The release introduces two cross-language nursery rules powered by Biome's module graph: noUnusedClasses and noUndeclaredClasses, which detect CSS class mismatches across CSS, JSX, and HTML files. GritQL plugins can now declare safe or unsafe code fixes using the => symbol, and plugins can be scoped to specific file paths via an includes option. Other additions include a --watch mode for the lint, format, and check commands, go-to-definition support in the language server, a new delimiterSpacing formatter option, a biome upgrade CLI command, and a concise reporter designed to reduce token usage with AI coding agents. The linter and checker are approximately 13% faster in this release.
Read Articlearrow_forward Article · FRAMEWORKREAD TIME: 16m
Angular 22: Key Features and Changes
Angular 22 makes OnPush the default change detection strategy for new components, adding ChangeDetectionStrategy.Eager as the explicit opt-in for legacy behavior along with an automatic migration. Signal Forms and the resource() and httpResource() APIs graduate from experimental to stable, with fixes for subscription leaks in long-running apps. The router now inherits parent route parameters by default (paramsInheritanceStrategy: 'always'), removing the need for route.parent?.parent?.snapshot.params chains. New additions include the @Service decorator as a simpler alternative to @Injectable({ providedIn: 'root' }) and the injectAsync helper for lazy-loading services with optional prefetch triggers. The experimental WebMCP feature allows Angular forms and services to register as typed tools callable by in-browser AI agents via navigator.modelContext. The release also contains significant SSRF protections in platform-server and stricter sanitization for SVG href bindings and TransferCache defaults.
READ_FULL_LOGarrow_forwardArticle · FRAMEWORKREAD TIME: 5m
What's New in Svelte: June 2026
June's Svelte update focuses on improvements to SvelteKit's remote forms and query APIs across versions 2.57 through 2.61. The form submit method now returns a boolean for validity, the requested() API now requires limit and yields structured entries, and the .run() method on remote queries has been removed in favor of direct await. The new query.live() API enables long-lived, async-iterable remote query subscriptions, while enhance callbacks now receive a copy of the remote form instance with a programmatic submit() API. On the Svelte core side, templates now support inline declarations directly in markup, and svelte-language-tools gains TypeScript 6.0 support across the language server, svelte2tsx, svelte-check, and svelte-preprocess packages. The Svelte MCP server's stdio mode can now read file content directly, reducing round trips in local tool workflows.
READ_FULL_LOGarrow_forwardArticle · LIBRARYREAD TIME: 15m
TanStack Table V9 Beta: Tree-Shakable, Signal-Based State, and Custom Features
TanStack Table V9 enters beta after a multi-year rewrite driven by two core problems with V8: incompatibility with the React Compiler's rules and the lack of true tree-shakability. V9 adopts TanStack Store as its state management layer, enabling selector-based subscriptions via a table.Subscribe component that mirrors TanStack Form's form.Subscribe API, so row selection changes no longer trigger re-renders across unrelated parts of the tree. Features are now opt-in plugins registered via tableFeatures(), meaning unused code such as sorting or pagination is excluded from the bundle and TypeScript knows which APIs are available based on what is registered. A new createTableHook utility lets teams define shared table configurations once and reuse them across an app, similar to TanStack Form's createFormHook. Memory efficiency was improved by moving row, cell, and header APIs to shared prototypes. A dedicated @tanstack/react-table-devtools package provides structured inspection of table state without console.log spelunking.
READ_FULL_LOGarrow_forwardArticle · DEEP DIVEREAD TIME: 8m
JavaScript Reactivity (Part 3): Coarse vs. Fine-Grained Reactivity
The third installment in Jim Schofield's reactivity series maps JavaScript frameworks along two axes: the scope at which changes are detected (window, application, service, component, template, DOM node) and the mechanism used within that scope. Zone.js represents the coarsest end, monkey-patching all async operations and triggering full component tree walks with no knowledge of what changed. React, Preact, Redux, and Zustand sit at the application layer, relying on virtual DOM reconciliation and reference equality checks to prune re-renders. Vue and Ember occupy a middle ground: Vue tracks only properties actually read in the template via recursive proxies, while Ember uses incremented clocks on tracked data to identify which templates need re-rendering. Fine-grained systems like Angular signals, Solid signals, Svelte 5 runes, and Preact signals update at the DOM node level but introduce dependency-tracking challenges including the diamond problem, where a single state change can propagate through multiple paths and cause glitches without topological sorting.
READ_FULL_LOGarrow_forwardArticle · SERVICE WORKERSREAD TIME: 15m
Why Are We Not Using Service Workers?
Despite broad browser support since 2018, Service Workers remain largely absent from small and medium-sized company codebases. This article presents three production case studies to reframe Service Workers beyond offline support. Slack used cache-keyed buckets tied to deploy timestamps, a custom webpack manifest plugin, and jittered re-registration intervals to cut boot times by roughly 50%, with warm boots 25% faster than cold ones. Mux intercepted HLS manifest requests in a Service Worker to strip renditions below 720p, solving an adaptive bitrate problem without a server-side proxy. A Vite deployment incident led to a polling-based version.json strategy where the worker precaches new assets before notifying open tabs, eliminating the Failed to fetch dynamically imported module error loop. The author also explains how Partytown uses a Service Worker to bridge synchronous DOM reads from analytics scripts running in a Web Worker via fake synchronous XHR calls intercepted by the worker.
READ_FULL_LOGarrow_forwardArticle · RUNTIMEREAD TIME: 9m
Node.js 26.3.0 (Current)
Node.js 26.3.0 ships four SEMVER-MINOR additions alongside a notice about possible future changes to macOS Universal Binary availability as Apple progressively drops Intel architecture support. Buffer.poolSize default increases from 8 KiB to 64 KiB, improving allocation performance for high-throughput workloads. The http module gains an httpValidation option to configure whether incoming header values are validated. The inspector module now exposes precise coverage start information to the JavaScript runtime. The permission model receives a new permission.drop API allowing applications to voluntarily surrender specific permissions at runtime. The release also includes extensive QUIC improvements covering hostname verification, stream idle timeouts, block list support, rate limiting for session creation and version negotiation, recvmmsg batching, and ECN marking support, all contributed by James M Snell.
READ_FULL_LOGarrow_forwardsummarizeDigest_Summary
This week's JavaScript category was dominated by major framework and tooling releases. Biome v2.5 crossed the 500 lint rules milestone, introducing cross-file analysis with two new nursery rules (noUnusedClasses and noUndeclaredClasses) that detect CSS class mismatches across CSS, JSX, and HTML files — a capability previously impossible with per-file linters. A new --watch mode, GritQL plugin code fixes, and a 13% speed improvement round out the release. Angular 22 made OnPush the default change detection strategy, graduated Signal Forms and the resource()/httpResource() APIs to stable, and added the experimental WebMCP feature for exposing Angular services as typed tools to in-browser AI agents via navigator.modelContext.
TanStack Table V9 entered beta after a multi-year rewrite targeting two V8 pain points: incompatibility with the React Compiler and lack of true tree-shakability. V9 adopts TanStack Store for selector-based subscriptions via a table.Subscribe component, and features are now opt-in plugins registered via tableFeatures() — unused code like sorting or pagination is excluded from the bundle automatically. Node.js 26.3.0 shipped four SEMVER-MINOR additions including a Buffer.poolSize increase from 8 KiB to 64 KiB, a new permission.drop API, and broad QUIC improvements covering rate limiting, recvmmsg batching, and ECN marking. A detailed reactivity deep-dive mapped frameworks from Zone.js's coarse monkey-patching to fine-grained DOM-node-level signals in Angular, Solid, and Svelte 5.
SvelteKit versions 2.57-2.61 refined the remote forms and query APIs: the new query.live() enables async-iterable long-lived subscriptions, the .run() method was removed in favor of direct await, and svelte-language-tools gained TypeScript 6.0 support. A compelling case study article reframed Service Workers beyond offline support, with Slack achieving 50% faster boot times using cache-keyed deploy buckets, and Mux solving adaptive bitrate problems by intercepting HLS manifests inside a worker.
Key Takeaways- Biome v2.5's noUnusedClasses and noUndeclaredClasses are the first cross-file lint rules that catch CSS/JSX/HTML class mismatches using a module graph — upgrade and enable them now.
- TanStack Table V9's opt-in tableFeatures() plugin model means unused features (sorting, pagination) are tree-shaken automatically, fixing the React Compiler incompatibility that blocked V8 adoption.
- Angular 22's experimental WebMCP exposes Angular forms and services as typed tools callable by in-browser AI agents via navigator.modelContext, signaling a new frontier for agent-native web apps.