React Router File Routes
Complete reference for React Router v7 file-based routing conventions and file naming patterns.
Core Concepts
React Router v7 uses file-based routing where file names in app/routes/ directory automatically become routes. Special characters in file names create specific routing behaviors.
File Naming Conventions
Basic Routes
| File Name | URL Path | Description |
|-----------|----------|-------------|
| _index.tsx | / | Index route at the root or parent path |
| about.tsx | /about | Simple static route |
| contact.tsx | /contact | Another static route |
Nested Routes with Dots
Dots (.) create nested URL paths and establish parent-child relationships.
| File Name | URL Path | Parent Layout |
|-----------|----------|---------------|
| concerts.tsx | /concerts | root.tsx |
| concerts._index.tsx | /concerts | concerts.tsx |
| concerts.trending.tsx | /concerts/trending | concerts.tsx |
| concerts.$city.tsx | /concerts/:city | concerts.tsx |
| settings.profile.tsx | /settings/profile | root.tsx |
| settings.profile.edit.tsx | /settings/profile/edit | root.tsx |
Example structure:
app/
├── routes/
│ ├── _index.tsx
│ ├── concerts.tsx # Layout for /concerts/*
│ ├── concerts._index.tsx # Renders at /concerts
│ ├── concerts.trending.tsx # Renders at /concerts/trending
│ └── concerts.$city.tsx # Renders at /concerts/:city
└── root.tsx
Dynamic Segments
Prefix with $ to create URL parameters.
| File Name | URL Path | Params |
|-----------|----------|--------|
| blog.$slug.tsx | /blog/:slug | { slug: string } |
| users.$userId.tsx | /users/:userId | { userId: string } |
| teams.$teamId.projects.$projectId.tsx | /teams/:teamId/projects/:projectId | { teamId: string, projectId: string } |
Access params in component:
import type { Route } from "./+types/blog.$slug";
export async function loader({ params }: Route.LoaderArgs) {
// params.slug is available here
}
export default function Component({ params }: Route.ComponentProps) {
return <div>Post: {params.slug}</div>;
}
Optional Segments
Append ? to make a segment optional (works with both static and dynamic segments).
| File Name | URL Path | Matches |
|-----------|----------|---------|
| $lang.categories.tsx | /:lang?/categories | /categories and /en/categories |
| users.$userId.edit.tsx | /users/:userId/edit? | /users/123 and /users/123/edit |
Pathless Layout Routes
Prefix with _ (underscore) to create layouts that don't affect the URL structure.
| File Name | URL Path | Layout Parent |
|-----------|----------|---------------|
| _auth.tsx | N/A (pathless) | root.tsx |
| _auth.login.tsx | /login | _auth.tsx |
| _auth.register.tsx | /register | _auth.tsx |
Example structure:
app/
├── routes/
│ ├── _auth.tsx # Pathless layout
│ ├── _auth.login.tsx # URL: /login (wrapped in _auth layout)
│ ├── _auth.register.tsx # URL: /register (wrapped in _auth layout)
│ └── dashboard.tsx # URL: /dashboard (not wrapped in _auth)
└── root.tsx
Escaping Layouts with Trailing Underscore
Suffix with _ to create a nested URL without inheriting parent layout.
| File Name | URL Path | Layout Parent |
|-----------|----------|---------------|
| concerts.tsx | /concerts | root.tsx |
| concerts.trending.tsx | /concerts/trending | concerts.tsx |
| concerts_.mine.tsx | /concerts/mine | root.tsx (skips concerts.tsx) |
Splat Routes (Catch-All)
Use $ to create catch-all routes that match remaining URL segments.
| File Name | URL Path | Params |
|-----------|----------|--------|
| files.$.tsx | /files/* | { "*": string } |
| $.tsx | /* | { "*": string } (404 catch-all) |
Access splat params:
export async function loader({ params }: Route.LoaderArgs) {
const filePath = params["*"]; // Everything after /files/
return getFileInfo(filePath);
}
Escaping Special Characters
Use [] brackets to escape special characters and include them literally in URLs.
| File Name | URL Path | Purpose |
|-----------|----------|---------|
| sitemap[.]xml.tsx | /sitemap.xml | Resource route with extension |
| blog[$slug].tsx | /blog/$slug | Literal $slug in URL (not a param) |
| about[.].tsx | /about. | Literal dot in URL |
Complete File Structure Examples
Standard Nested Routes
app/
├── routes/
│ ├── _index.tsx # /
│ ├── about.tsx # /about
│ ├── concerts.tsx # /concerts layout
│ ├── concerts._index.tsx # /concerts
│ ├── concerts.$city.tsx # /concerts/:city
│ └── concerts.trending.tsx # /concerts/trending
└── root.tsx
Pathless Layout Routes
app/
├── routes/
│ ├── _auth.tsx # Pathless layout
│ ├── _auth.login.tsx # /login
│ ├── _auth.register.tsx # /register
│ └── dashboard.tsx # /dashboard
└── root.tsx
Mixed Layouts
app/
├── routes/
│ ├── _index.tsx # /
│ ├── concerts.tsx # /concerts layout
│ ├── concerts._index.tsx # /concerts
│ ├── concerts.trending.tsx # /concerts/trending
│ └── concerts_.mine.tsx # /concerts/mine (skips layout)
└── root.tsx
Quick Reference
| Pattern | File Example | URL Result | Notes |
|---------|-------------|------------|-------|
| Simple route | about.tsx | /about | Static route |
| Nested path | a.b.c.tsx | /a/b/c | Dots create slashes |
| Index route | concerts._index.tsx | /concerts | Default child route |
| Dynamic segment | blog.$slug.tsx | /blog/:slug | Creates param |
| Multiple params | $a.$b.tsx | /:a/:b | Multiple dynamic segments |
| Optional segment | $lang?.about.tsx | /about or /:lang/about | Optional param |
| Pathless layout | _auth.login.tsx | /login | Uses _auth.tsx layout |
| Escape layout | parent_.child.tsx | /parent/child | Skips parent.tsx layout |
| Splat route | files.$.tsx | /files/* | Catches all after /files/ |
| Escape chars | api[.]json.tsx | /api.json | Literal . in URL |
Common Patterns
Authentication Routes
_auth.tsx # Shared auth layout
_auth.login.tsx # /login
_auth.register.tsx # /register
_auth.forgot.tsx # /forgot
Admin Dashboard
_admin.tsx # Admin layout
_admin._index.tsx # /admin
_admin.users.tsx # /admin/users
_admin.users.$userId.tsx # /admin/users/:userId
Blog with Categories
blog.tsx # Blog layout
blog._index.tsx # /blog
blog.$slug.tsx # /blog/:slug
blog.category.$cat.tsx # /blog/category/:cat
Resource Routes
api.json.tsx # /api/json
sitemap[.]xml.tsx # /sitemap.xml
robots[.]txt.tsx # /robots.txt
scripts/
Executable code (Python/Bash/etc.) that can be run directly to perform specific operations.
Examples from other skills:
- PDF skill:
fill_fillable_fields.py,extract_form_field_info.py- utilities for PDF manipulation - DOCX skill:
document.py,utilities.py- Python modules for document processing
Appropriate for: Python scripts, shell scripts, or any executable code that performs automation, data processing, or specific operations.
Note: Scripts may be executed without loading into context, but can still be read by Codex for patching or environment adjustments.
references/
Documentation and reference material intended to be loaded into context to inform Codex's process and thinking.
Examples from other skills:
- Product management:
communication.md,context_building.md- detailed workflow guides - BigQuery: API reference documentation and query examples
- Finance: Schema documentation, company policies
Appropriate for: In-depth documentation, API references, database schemas, comprehensive guides, or any detailed information that Codex should reference while working.
assets/
Files not intended to be loaded into context, but rather used within the output Codex produces.
Examples from other skills:
- Brand styling: PowerPoint template files (.pptx), logo files
- Frontend builder: HTML/React boilerplate project directories
- Typography: Font files (.ttf, .woff2)
Appropriate for: Templates, boilerplate code, document templates, images, icons, fonts, or any files meant to be copied or used in the final output.
Not every skill requires all three types of resources.
微信扫一扫