## Summary With the tab gone, everything that fed it is unreachable. This deletes `packages/react-devtools-timeline` (74 files) and the backend that produced its data, `backend/profilingHooks.js`, along with `SidebarEventInfo`, the two timeline test suites, the `timelineData` snapshot serializer, and the scheduling-profiler fixture. It also unwires the plumbing that only existed to carry timeline data: `recordTimeline` across the reload-and-profile path (hook → sessionStorage → agent → renderer), `timelineData` on `ProfilingDataBackend` and the profile export, the `supportsTimeline` Store config, the `rootSupportsTimelineProfiling` capability, the `DevToolsProfilingHooks` type and the `ReactRenderer` members DevTools used to inject it, the 40 `--color-timeline-*` theme variables in both themes plus the orphaned `--color-scroll-caret`, and `hook.js`'s internal-module-range tracking with its `react-devtools-facade` stubs. `yarn.lock` is regenerated: 52 distinct package-versions and 68 requirement specs drop out, with no additions and no version changes to anything that remains. ## Deliberate non-changes - **`PROFILER_EXPORT_VERSION` stays at 5.** `prepareProfilingDataFrontendFromExport` compares versions with `!==`, so a bump would reject every profile anyone has already saved. `timelineData` was an optional key, so dropping it is invisible in both directions. - **Profiling flag bit `0b010` is retired, not reused**, and the constant is replaced by a comment saying so. Shipped backends keep setting it, so renumbering `PROFILING_FLAG_PERFORMANCE_TRACKS_SUPPORT` into that slot would make a new frontend misread older backends as tracks-capable. - **The `displayName` properties on DevTools' cache thenables are kept.** They look timeline-only, but `ReactFiberThenable` reads `thenable.displayName` to name I/O in async debug info, which feeds the Performance tracks. Only their stale comments are corrected. - **`react-reconciler`, `shared/ReactFeatureFlags.js` and `scripts/rollup` are untouched**; `enableSchedulingProfiler` is still live for www and native-fb. ## Follow-ups (not in this stack) Three stale comments still name the removed package: `scripts/rollup/wrappers.js:532` and `ReactFiberLane.js:38,125`. Left alone to keep this stack purely DevTools-side. ## Test plan `yarn linc`, `yarn flow dom-node`, and the DevTools suite all pass on this commit in isolation (40/40 suites, 582 tests).
react-devtools-facade
Experimental, private package that defines building blocks for querying React runtime state.
The facade installs the __REACT_DEVTOOLS_GLOBAL_HOOK__ that React looks for at
initialization time — enabling fiber-root tracking without the overhead of the
full DevTools backend — and exposes a small, framework-agnostic library API that
integrators compose into tools.
This package is intentionally low-level. It does not install any tool
globals and it does not decide how tools are surfaced. It installs the hook,
tracks fiber roots, and hands back building blocks; the integrator (for example,
a chrome-devtools-mcp integration) decides everything else — including whether
to expose anything else on globals.
API
installFacade(target = globalThis): Facade
Installs __REACT_DEVTOOLS_GLOBAL_HOOK__ on target and returns a Facade
handle holding the hook plus the runtime state it tracks (fiberRoots,
rendererInternals, profilingState). Building blocks read from the returned
Facade; they never reach for globals.
Call this before React initializes so the hook captures the first commit:
import {installFacade} from 'react-devtools-facade';
const facade = installFacade();
// ...load React, render your app...
installFacade installs only the DevTools hook. It does not install
__REACT_TOOLS__, __REACT_LLM_TOOLS__, or any other global. Once the tool
building blocks land, an integrator composes them from the returned Facade and
decides whether to expose anything on globals.