---
modificationDate: February 26, 2026
title: Expo Router notation
description: Learn how to use special filenames and notation to expressively define your app's navigation tree within your project's file structure.
---

<AgentInstructions>

## Submitting Feedback

If this page contains errors, outdated information, or gaps that blocked you from completing a task, report it so the docs can be improved:

curl -X POST https://api.expo.dev/v2/feedback/docs-send -H 'Content-Type: application/json' -d '{"url":"/router/basics/notation/","feedback":"🤖 Agent feedback: <specific, actionable description>"}'

Only submit when you have something specific and actionable to report.

</AgentInstructions>

# Expo Router notation

Learn how to use special filenames and notation to expressively define your app's navigation tree within your project's file structure.

> For the complete documentation index, see [llms.txt](/llms.txt). Use this file to discover all available pages.

When you look inside the **src/app** directory in a typical Expo Router project, you'll see a lot more than some simple file and directory names. What do the parentheses and brackets mean? Let's learn the significance of file-based routing notation and how it allows you to define complex navigation patterns.

## Types of route notation

### Simple names/no notation

`src`

 `app`

  `home.tsx`

  `feed`

   `favorites.tsx`

Regular file and directory names without any notation signify _static routes_. Their URL matches exactly as they appear in your file tree. So, a file named **favorites.tsx** inside the **feed** directory will have a URL of `/feed/favorites`.

### Square brackets

`src`

 `app`

  `[userName].tsx`

  `products`

   `[productId]`

    `index.tsx`

If you see square brackets in a file or directory name, you are looking at a _dynamic route_. The name of the route includes a parameter that can be used when rendering the page. The parameter could be either in a directory name or a file name. For example, a file named **[userName].tsx** will match `/evanbacon`, `/expo`, or another username. Then, you can access that parameter with the `useLocalSearchParams` hook inside the page, using that to load the data for that specific user.

### Parentheses

`src`

 `app`

  `(home)`

   `index.tsx`

   `settings.tsx`

A directory with its name surrounded in parentheses indicates a _route group_. These directories are useful for grouping routes together without affecting the URL. For example, a file named **src/app/(home)/settings.tsx** will have `/settings` for its URL, even though it is not directly in the **src/app** directory.

Route groups can be useful for simple organization purposes, but often become more important for defining complex relationships between routes.

### index.tsx files

`src`

 `app`

  `(home)`

   `index.tsx`

  `profile`

   `index.tsx`

Just like on the web, an **index.tsx** file indicates the default route for a directory. For example, a file named **profile/index.tsx** will match `/profile`. A file named **(home)/index.tsx** will match `/`, effectively becoming the default route for your entire app.

### _layout.tsx files

`src`

 `app`

  `_layout.tsx`

  `(home)`

   `_layout.tsx`

  `feed`

   `_layout.tsx`

**_layout.tsx** files are special files that are not pages themselves but define how groups of routes inside a directory relate to each other. If a directory of routes is arranged as a stack or tabs, the layout route is where you would define that relationship by using a stack navigator or tab navigator component.

Layout routes are rendered before the actual page routes inside their directory. This means that the **_layout.tsx** directly inside the **src/app** directory is rendered before anything else in the app, and is where you would put the initialization code that may have previously gone inside an **App.jsx** file.

### Plus sign

`src`

 `app`

  `+not-found.tsx`

  `+html.tsx`

  `+native-intent.tsx`

  `+middleware.ts`

Routes that include a `+` have special significance to Expo Router, and are used for specific purposes. A few examples:

-   [`+not-found`](/router/error-handling#unmatched-routes), which catches any requests that don't match a route in your app.
-   [`+html`](/router/web/static-rendering#root-html) is used to customize the HTML boilerplate used by your app on web.
-   [`+native-intent`](/router/advanced/native-intent) is used to handle deep links into your app that don't match a specific route, such as links generated by third-party services.
-   [`+middleware`](/router/web/middleware) is used to run code before a route is rendered, allowing you to perform tasks like authentication or redirection for every request.

> Some path names such as `/assets` are reserved by Metro and Expo Router. Avoid using them for routes. See [Reserved paths](/router/reference/reserved-paths) for the complete list.

## Route notation applied

Consider the following project file structure to identify the different types of routes represented:

`src`

 `app`

  `(home)`

   `_layout.tsx`

   `index.tsx`

   `feed.tsx`

   `profile.tsx`

  `_layout.tsx`

  `users`

   `[userId].tsx`

  `+not-found.tsx`

  `about.tsx`

-   **src/app/about.tsx** is a static route that matches `/about`.
-   **src/app/users/[userId].tsx** is a dynamic route that matches `/users/123`, `/users/456`, and so on.
-   **src/app/(home)** is a route group. It will not factor into the URL, so `/feed` will match **src/app/(home)/feed.tsx**.
-   **src/app/(home)/index.tsx** is the default route for the **(home)** directory, and will match the `/` URL.
-   **src/app/(home)/_layout.tsx** is a layout file defining how the pages inside **src/app/(home)/** relate to each other.
-   **src/app/_layout.tsx** is the root layout file, and is rendered before any other route in the app.
-   **src/app/+not-found.tsx** is a special route that will be displayed if the user navigates to a route that doesn't exist in your app.
