---
# System prepended metadata

title: Next Page setup

---

# Next Page setup

The folder hierarchy inside the `app` directory represents the pages of your application, as managed by Next.js.

To ensure consistency in page creation, let's establish some conventions and helpers.

## Meta titles with application name

For **accessibility** and **SEO**, every page should have a unique title that ends with the application name.

By convention each location in the page title should be **separated with `-`** and the **application name should always appear at the end**.

For example, if the application name is "Next Stack":
- The **login page title** should be: `Login | Next Stack`
- The **admin user page for "Minova"** should be: `Admin - Users - Minova | Next Stack`

### Storing the application name in .env file

To avoid hardcoding the application name in every page, store it in an `.env` file.

1. Add the following to `.env.example`:
```
NEXT_PUBLIC_APP_NAME="Next Stack"
```
2. If `.env` file does not exist, create it by copying `.env.example`:
```
cp .env.example .env
```
Or manually add the same variable inside `.env`.

Then lets create `.env` if it does not exist yet by copy-pasing `.env.example` file or just add `NEXT_PUBLIC_APP_NAME="Next Stack"` in `.env` file if it already exists.

> ⚠️ `.env` should **NEVER** be tracked in Git.
The `.env.example` file is meant to help set up local environments quickly but should **NEVER** contain sensitive data.

### Using the application name in page titles

By default, a page title is defined like this in `app/organizations/page.tsx`:
```typescript
export const metadata: Metadata = {
  title: 'Organizations | Next Stack'
};
```

Repalce hardcoded app name with `Next Stack` with `NEXT_PUBLIC_APP_NAME`:
```typescript
export const metadata: Metadata = {
  title: `Organizations | ${process.env['NEXT_PUBLIC_APP_NAME']}`
};
```

Using an array makes it easier to manage nested page titles:
```typescript
export const metadata: Metadata = {
  title: ['Organizations', process.env['NEXT_PUBLIC_APP_NAME']].join(' | ')
};
```

### Create a page title helper

To simplify title management across the app, create a utility function.

Create the `web` feature folder if it does not exist:
```bash
mkdir -p src/features/web
```

Then create the `app-page-title.util.ts` file:
```bash
touch src/features/web/app-page-title.util.ts
```

Add the following function:
```typescript
export const appPageTitle = (...pageTitle: string[]): string =>
  pageTitle.length === 0
    ? `${process.env['NEXT_PUBLIC_APP_NAME']}`
    : [pageTitle.join(' - '), process.env['NEXT_PUBLIC_APP_NAME']].join(' | ');

```

Ensure it's exported in` src/features/web/index.ts`:
```bash
touch src/features/web/index.ts
echo "export * from './app-page-title.util';" >> src/features/web/index.ts
```

Now, update `app/organizations/page.tsx`:
```typescript
import { appPageTitle } from '@/features/web';

export const metadata: Metadata = {
  title: appPageTitle('Organizations')
};
```

For subpages, simply add more parameters to `appPageTitle`:
```typescript
export const metadata: Metadata = {
  title: appPageTitle('Organizations', 'My organization')
};
```

---

[Next](https://hackmd.io/JZzKYRqRRAe9iIJu1vNYbw)
[Home](https://hackmd.io/9GoEP2IbT6SIJQHOf03PbA)
