CodeVetter
← All unpacks
CodeVetter · Repo Unpack evidence

remix-run/react-router

Scanned commit a6090382ed dated 2026-09-30 — last upstream commit. Generated by codevetter 1.15.0 on 2026-10-02.

github.com/remix-run/react-router ↗ · 1187 files · 8.5 MB

[![npm package][npm-badge]][npm] [![build][build-badge]][build] [npm-badge]: https://img.shields.io/npm/v/react-router.svg [npm]: https://www.npmjs.org/package/react-router [build-badge]: https://img.shields.io/github/actions/workflow/status/remix-run/react-ro

Deep analysis by cli:codex via the codex CLI on 2026-10-02 (runtime not recorded) — every claim below links to its cited source files. Source inspection; upstream code and tests were not executed.

Overview

React Router is a React routing library and application framework for developers who need nested navigation, loader/action data handling, and server rendering. This pinned checkout packages the browser routing engine, Vite tooling, server adapters, session utilities, and unstable React Server Component integrations in a pnpm monorepo. Its distinctive architecture shares routing semantics across browser and server runtimes while keeping framework compilation and platform adaptation in separate packages.

System map

The repository distributes a routing engine and framework tooling rather than one deployed application. Browser history, React rendering, Fetch-based server handling, and Vite compilation form distinct boundaries. Persistence is supplied through session strategies rather than a central database. The inspected configuration establishes pnpm, Jest, Playwright, and package-specific builds.

Feature catalog

The user-facing surface primarily consists of developer APIs and CLI commands. Inspected capabilities include browser routing, data loading, mutation submission, independent fetchers, URL state, server rendering, and session persistence. Framework tooling adds route configuration, type generation, and server/client separation. Playground entrypoints demonstrate ordinary framework, RSC, and Cloudflare integration shapes.

Data flow

Route configuration becomes normalized route objects and runtime matching state. Browser submissions become Fetch Requests whose results update route data and errors. Server adapters convert platform inputs into the same request abstraction and return streamed responses. Session data follows a separate cookie-to-storage lifecycle controlled by application code.

Behavior traces

Four concrete flows were followed through source: browser startup, mutation submission, server document handling, and file session persistence. These traces describe call order and state transitions without asserting runtime success. Initialization and submissions converge on the shared navigation machinery. Server and persistence flows cross explicit adapter and serialization boundaries.

Testing signals

Tests and CI were inspected, not executed; test existence is not a passing result. The inspected unit configuration uses Jest, with jsdom for the core React package and Node overrides for filesystem sessions. Playwright integration tests exercise application fixtures and browser behavior. This is a bounded inspection, so coverage outside the cited tests remains unassessed.

Risk map

The observations below identify security and correctness boundaries, not confirmed vulnerabilities. Cookie signing, filesystem identifiers, client/server module separation, request origins, and proxy-derived URLs deserve focused review when changed. The shared navigation engine has a large behavioral blast radius because cancellation, hydration, actions, and loading meet there. Runtime failures, deployment policy, and uninspected tests remain unverified.

Extension points

Extension seams exist at route configuration, data execution, context injection, observability, persistence, and platform adaptation. Framework route exports provide a convention-based interface, while Data mode exposes explicit constructor options. Filesystem routing is an adapter over route configuration rather than the only route discovery model. Most seams are typed factory inputs or exports rather than a single global plugin registry.

Contributor handoff

Use the pinned checkout and mode-specific source as the authority for future work. Tests and CI were inspected, not executed, and this inventory is bounded rather than exhaustive. Start edits at the runtime or tooling boundary responsible for the behavior, preserving generated artifacts and package conventions. Any future validation report must distinguish configured checks from commands actually run.

Languages

LanguageFilesShare of source
TypeScript66793%
Markdown287docs/config
JSON86docs/config
JavaScript466%
YAML26docs/config
CSS20docs/config
Shell30%
TOML20%

Start reading here

Probable source entrypoint: packages/ — inferred from the directory tree and manifest, not the upstream docs.

Source roots

packages/ (474 files)

Repository structure

Top-level pathFiles
packages/474
playground/216
docs/209
integration/160
.github/33
scripts/26
decisions/20
.agents/12

Docs found: AGENTS.mdCLAUDE.mdCONTRIBUTING.mdLICENSE.mdREADME.mddocs/api/components/Await.mddocs/api/components/Form.mddocs/api/components/Link.mddocs/api/components/Links.mddocs/api/components/Meta.md

Package

package.json — @remix-run/react-router, 41 declared dependencies.

@babel/core@babel/preset-env@babel/preset-react@babel/preset-typescript@eslint/compat@mdx-js/rollup@playwright/test@types/jest@types/jsdom@types/react@types/react-dom@types/react-test-renderer

CI & config entrypoints

Structural health signals

Average score 5.4/10 across 96 analyzed source files; 89 hotspots surfaced.

These are deterministic review leads — size, churn, and structural signals — not proof of a bug in this project.

Recent history