Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .agents/skills/fix-bug/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ Fix the bug reported in the following GitHub issue: $ARGUMENTS

Bug fixes should start from a clean working tree. If there are changes, prompt me to resolve them before continuing.

Bugs should be fixed from the `dev` branch in in a new branch using the format `{author}/{semantic-branch-name}` (i.e., `brophdawg11/fix-navigation`):
Bugs should be fixed from the `main` branch in a new branch using the format `{author}/{semantic-branch-name}` (i.e., `brophdawg11/fix-navigation`):

```sh
git branch {author}/{semantic-branch-name} dev
git branch {author}/{semantic-branch-name} main
git checkout {author}/{semantic-branch-name}
```

Expand Down Expand Up @@ -144,4 +144,4 @@ Ask me to review the changes and iterate based on any feedback.

### 8. Open PR

Once I approve the fix, commit the changes and open a PR to `dev`. Include a `Closes #NNNN` in the description to link the PR to the original issue. Also link the issue in the `Development` sidebar
Once I approve the fix, commit the changes and open a PR to `main`. Include a `Closes #NNNN` in the description to link the PR to the original issue. Also link the issue in the `Development` sidebar
10 changes: 5 additions & 5 deletions .agents/skills/implement-rfc/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ Implement the RFC from the following GitHub discussion: $ARGUMENTS

RFC implementations should start from a clean working tree. If there are uncommitted changes, stop and ask me to resolve them before continuing.

- If you are already on a named branch that is at the same HEAD as `dev`, use that branch.
- Otherwise, create a branch from `dev` using the format `{author}/rfc-{semantic-name}`:
- If you are already on a named branch that is at the same HEAD as `main`, use that branch.
- Otherwise, create a branch from `main` using the format `{author}/rfc-{semantic-name}`:
```sh
git branch {author}/rfc-{semantic-name} dev
git branch {author}/rfc-{semantic-name} main
git checkout {author}/rfc-{semantic-name}
```

Expand Down Expand Up @@ -224,10 +224,10 @@ Ask me to review and iterate before opening a PR.

### 12. Commit

Once I approve, commit and open a PR to `dev`:
Once I approve, commit and open a PR to `main`:

```sh
gh pr create --base dev --title "feat: <RFC title>" --body "..."
gh pr create --base main --title "feat: <RFC title>" --body "..."
```

PR body should include:
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ body:
馃弳 The most helpful reproduction is to use our _bug report integration test_ template:

1. [Fork `remix-run/react-router`](https://github.com/remix-run/react-router/fork)
2. Open [`integration/bug-report-test.ts`](https://github.com/remix-run/react-router/blob/dev/integration/bug-report-test.ts) in your editor
2. Open [`integration/bug-report-test.ts`](https://github.com/remix-run/react-router/blob/main/integration/bug-report-test.ts) in your editor
3. Follow the instructions to create a failing bug report test
4. Link to your forked branch with the failing test in this issue

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/deduplicate-lock-file.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: 鈿欙笍 Deduplicate lock file
on:
push:
branches:
- dev
- main
paths:
- pnpm-lock.yaml

Expand Down
1 change: 0 additions & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ on:
push:
branches:
- main
- dev
paths:
- "packages/**/*.ts"
- "packages/**/*.tsx"
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/format.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ on:
push:
branches:
- main
- dev

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/integration-full.yml
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
name: Branch

# main/dev branches will get the full run across
# The main branch gets the full run across
# all OS/browsers for multiple node versions

on:
push:
branches:
- main
- dev
paths-ignore:
- "packages/*/.changes/**"
- "decisions/**"
Expand Down
16 changes: 8 additions & 8 deletions .github/workflows/preview.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Create "installable" preview branches
#
# Commits to `dev` push builds to a `preview/dev` branch:
# pnpm install "remix-run/react-router#preview/dev&path:packages/react-router"
# Commits to `main` push builds to a `preview/main` branch:
# pnpm install "remix-run/react-router#preview/main&path:packages/react-router"
#
# Pull Requests create `preview/pr-{number}` branches:
# pnpm install "remix-run/react-router#preview/pr-12345&path:packages/react-router"
Expand All @@ -14,7 +14,7 @@ name: Preview Build
on:
push:
branches:
- dev
- main
workflow_dispatch:
inputs:
baseBranch:
Expand All @@ -28,8 +28,8 @@ on:

concurrency:
# Include `event_name` here because when a pull_request is merged (closed), the
# `github.ref` goes back to `ref/heads/dev` which will conflict with the run on
# `dev` from the merged PR
# `github.ref` goes back to `ref/heads/main` which will conflict with the run on
# `main` from the merged PR
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}
cancel-in-progress: true

Expand Down Expand Up @@ -72,12 +72,12 @@ jobs:
git config --local user.email "hello@remix.run"
git config --local user.name "Remix Run Bot"

# Build and force push over the preview/dev branch
# Build and force push over the preview/main branch
- name: Build/push branch (push)
if: github.event_name == 'push'
run: |
pnpm run previews:branch preview/dev
git push --force --set-upstream origin preview/dev
pnpm run previews:branch preview/main
git push --force --set-upstream origin preview/main
echo "馃捒 pushed installable branch: https://github.com/$GITHUB_REPOSITORY/commit/$(git rev-parse HEAD)"

# Build and force push over the PR preview/pr-{number} branch + comment on the PR
Expand Down
25 changes: 21 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
#
# Specific jobs only run on the proper trigger:
#
# - Change file driven stable releases (push to release/hotfix branches)
# - Change file driven stable releases (push to main/hotfix branches)
# - Experimental releases (from a workflow_dispatch trigger)

name: 馃殺 Release/Publish

on:
push:
branches:
- "release"
- "main"
- "hotfix"
workflow_dispatch:
inputs:
Expand All @@ -31,6 +31,7 @@ jobs:
runs-on: ubuntu-latest
outputs:
has_change_files: ${{ steps.check.outputs.has_change_files }}
should_publish: ${{ steps.needs-publish.outputs.should_publish }}
steps:
- name: Checkout
uses: actions/checkout@v6
Expand All @@ -45,10 +46,25 @@ jobs:
echo "$change_files"
echo "has_change_files=true" >> $GITHUB_OUTPUT
else
echo "No change files found, proceeding to publish."
echo "No change files found."
echo "has_change_files=false" >> $GITHUB_OUTPUT
fi

- name: needs-publish
id: needs-publish
if: steps.check.outputs.has_change_files == 'false'
run: |
version=$(node -p "require('./packages/react-router/package.json').version")
published_version=$(npm view "react-router@$version" version || true)

if [ "$published_version" = "$version" ]; then
echo "react-router@$version is already published. Skipping publish."
echo "should_publish=false" >> $GITHUB_OUTPUT
else
echo "react-router@$version is not published yet. Publishing is needed."
echo "should_publish=true" >> $GITHUB_OUTPUT
fi

pull_request:
name: Open pull request
needs: check
Expand All @@ -61,6 +77,7 @@ jobs:
- name: Checkout
uses: actions/checkout@v6
with:
ref: ${{ github.ref_name }}
fetch-depth: 0
token: ${{ secrets.FORMAT_PAT }}

Expand All @@ -84,7 +101,7 @@ jobs:
publish:
name: Publish
needs: check
if: needs.check.outputs.has_change_files == 'false'
if: needs.check.outputs.should_publish == 'true'
runs-on: ubuntu-latest
permissions:
contents: write # enable pushing changes to the origin
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ on:
push:
branches:
- main
- dev
tags-ignore:
- v*
paths-ignore:
Expand All @@ -19,6 +18,9 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
test:
name: "馃И Test: (Node: ${{ matrix.node }})"
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ build.utils.d.ts
worker-configuration.d.ts
/.env
/NOTES.md
/packages/react-router/docs/

# v7 reference docs
/public
Expand Down
5 changes: 2 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,10 +136,9 @@ Brief description of the change

## Branching

- **`main`**: Latest stable release
- **`dev`**: Active development (branch from here for code changes)
- **`main`**: Active Development
- **`v6`**: v6.x maintenance
- Branch from `main` for docs-only changes
- Branch from `main` for code and docs changes

## Key Files

Expand Down
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ We manage release notes in this file instead of the paginated Github Releases Pa
<summary>Table of Contents</summary>

- [React Router Releases](#react-router-releases)
- [v7.17.0](#v7170)
- [v7.16.0](#v7160)
- [Stabilized `future.v8_trailingSlashAwareDataRequests`](#stabilized-futurev8_trailingslashawaredatarequests)
- [Pre-v8 Future Flag Warnings](#pre-v8-future-flag-warnings)
- [v7.15.1](#v7151)
- [v7.15.0](#v7150)
- [Stabilizations](#stabilizations)
Expand Down Expand Up @@ -174,6 +177,28 @@ We manage release notes in this file instead of the paginated Github Releases Pa

</details>

## v7.17.0

Date: 2026-06-04

### Minor Changes

- `react-router` - Ship a subset of the official documentation inside the `react-router` package ([#15121](https://github.com/remix-run/react-router/pull/15121))
- Markdown docs are now available in `node_modules/react-router/docs`, letting AI coding agents and the React Router agent skills read official docs locally
- Excludes auto-generated API docs (`api/`), `community/` content, and tutorials (`tutorials/`)

### Patch Changes

- `@react-router/dev` - Fix future flag warning URLs and only log each future flag warning one time ([#15138](https://github.com/remix-run/react-router/pull/15138))

### Unstable Changes

鈿狅笍 _[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) are not recommended for production use_

- `@react-router/dev` - Prevent RSC route module server exports from being scanned by the client dependency optimizer when `future.unstable_optimizeDeps` is enabled. ([#15005](https://github.com/remix-run/react-router/pull/15005))

**Full Changelog**: [`v7.16.0...v7.17.0`](https://github.com/remix-run/react-router/compare/react-router@7.16.0...react-router@7.17.0)

## v7.16.0

Date: 2026-05-28
Expand Down
34 changes: 13 additions & 21 deletions DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,44 +4,36 @@

Releases are handled by a mostly automated process consisting of:

- Manual [`release.sh`](./scripts/changes/release.sh) scripts to start/finish releases
- Typescript scripts in [`scripts/changes/`](./scripts/changes/)
- The [release.yml](./.github/workflows/release.yml) Github workflow

When you are ready to begin the release process:

- Start with a clean git working directory on the `dev` branch
- Pull latest `dev`
- Manually run `./scripts/changes/release.sh start`
- creates the `release` branch from `dev`
- merges in latest `main`
- pushes to `origin/release`
- The `release.yml` workflow will see the `release` branch with change files in it:
- Merge all release-bound changes to `main` with their change files
- The `release.yml` workflow will see the `main` branch with change files in it:
- This triggers the "PR" step and runs `scripts/changes/pr.ts`
- This will create a new `release-pr` branch from `release`
- This will create or update a `release-pr` branch from `main`
- Runs `scripts/changes/version.ts`
- Updates versions
- Generate changelogs
- Deletes change files
- Opens a PR to the `release` branch
- Once that PR is merged, the `release.yml` workflow will run again against `release` and see no change files:
- This triggers the "publish" step and runs `scripts/changes/publish.ts`
- Opens a PR from `release-pr` to `main`
- Once that PR is merged, the `release.yml` workflow will run again against `main` and see no change files:
- This triggers the `needs-publish` step, which checks npm to see if the current `react-router` version is already published
- If publishing is needed, this triggers the "publish" step and runs `scripts/changes/publish.ts`
- Publishes all packages to npm
- Tags the commits and pushes tags to the origin
- Creates a github release
- Pull latest `release` branch
- Manually run `./scripts/changes/release.sh finish`
- Merges the `release` branch into `dev` and `main` and pushes to origin
- Deletes the `release` branch
- The `release-pr` branch can be deleted after the PR is merged

### Iterating a release branch
### Iterating a release PR

You may need to make changes to a release while the release PR is open - to do so:

- Branch off of `release` and make whatever changes you need
- Branch off of `main` and make whatever changes you need
- Add changes files as needed
- Push your branch to GitHub and PR it to `release`
- Once reviewed/approved, merge the PR to the `release` branch
- Push your branch to GitHub and PR it to `main`
- Once reviewed/approved, merge the PR to `main`
- This will trigger an update of the release PR created above

## Hotfix releases
Expand All @@ -66,5 +58,5 @@ Hotfix releases operate like the above but off of a hotfix branch that is create
- Publishes all packages to npm
- Tags the commits and pushes tags to the origin
- Creates a github release
- Merge the `hotfix` branch into `dev` and `main` and push to origin
- Merge the `hotfix` branch into `main` and push to origin
- Deletes the `hotfix` branch
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[npm-badge]: https://img.shields.io/npm/v/react-router-dom.svg
[npm]: https://www.npmjs.org/package/react-router-dom
[build-badge]: https://img.shields.io/github/actions/workflow/status/remix-run/react-router/test.yml?branch=dev&style=square
[build-badge]: https://img.shields.io/github/actions/workflow/status/remix-run/react-router/test.yml?branch=main&style=square
[build]: https://github.com/remix-run/react-router/actions/workflows/test.yml

React Router is a multi-strategy router for React bridging the gap from React 18 to React 19. You can use it maximally as a React framework or minimally as a library with your own architecture.
Expand Down
3 changes: 3 additions & 0 deletions contributors.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
- Armanio
- arnassavickas
- aroyan
- arpitjain099
- Artur-
- ashusnapx
- avipatel97
Expand Down Expand Up @@ -239,6 +240,7 @@
- kigawas
- kilavvy
- kiliman
- KimHyeongRae0
- kirillgroshkov
- kkirsche
- kno-raziel
Expand Down Expand Up @@ -425,6 +427,7 @@
- stmtk1
- sukvvon
- sunnyraindy
- sushichan044
- swalker326
- szhsin
- tanayv
Expand Down
2 changes: 1 addition & 1 deletion docs/api/framework-conventions/entry.server.tsx.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,5 +160,5 @@ Note that this does not handle thrown `Response` instances from your `loader`/`a
[streaming]: ../../how-to/suspense
[rendertopipeablestream]: https://react.dev/reference/react-dom/server/renderToPipeableStream
[rendertoreadablestream]: https://react.dev/reference/react-dom/server/renderToReadableStream
[node-streaming-entry-server]: https://github.com/remix-run/react-router/blob/dev/packages/react-router-dev/config/defaults/entry.server.node.tsx
[node-streaming-entry-server]: https://github.com/remix-run/react-router/blob/main/packages/react-router-dev/config/defaults/entry.server.node.tsx
[templates-repo]: https://github.com/remix-run/react-router-templates
Loading