react-router-file-routes
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.
More from atman-33/skills
dnd-kit-implementation
Guide for implementing sortable and droppable components using dnd-kit library. Use this skill when building React applications that require drag-and-drop functionality with both container reordering (useSortable) and item dropping (useDroppable) capabilities, such as Kanban boards, file management systems, or playlist editors.
36tech-article-humanizer
Transform technical article drafts or source materials into human-like, high-quality Japanese technical articles. Use this skill when the user wants to generate, rewrite, or humanize technical articles (especially about TypeScript, JavaScript, React, or frontend topics) following specific human-writing patterns and style guidelines. Triggers include requests like "記事を人間風に", "tech article を生成", "humanize this article", or providing article source materials.
4agent-memory
Use this skill when the user asks to save, remember, recall, or organize memories. Triggers on phrases like 'remember this', 'save this', 'note this', 'what did we discuss about...', 'check your notes', 'clean up memories'. Also use proactively when discovering valuable findings worth preserving.
2react-router-v7-app
Implements React Router v7 app structure, routing patterns, and component templates. Use when creating or modifying React Router v7 applications to ensure consistent folder structure, data loading patterns, and component architecture.
2pr-assistant
Analyzes git changes and assists with creating comprehensive pull requests. Use when user wants to create a PR, review changes before PR, or needs help drafting PR descriptions. Triggers on phrases like 'create PR', 'make a pull request', 'draft PR description', 'what changed in this branch', 'prepare PR'.
1openspec-bulk-archive-change
Archive multiple completed changes at once. Use when archiving several parallel changes.
1