# Apps

URL: /code/file-conventions/apps · Id: `page:code/file-conventions/apps`

> An app folder is one App over the Startup's Nouns, its kind, its Personas and what each may call.

A folder in `apps/` is one [App](/business/nouns/app): a kind, the [Personas](/business/nouns/persona) who use it, and what each may call. Its screens derive from the [Nouns](/business/nouns/noun) it mounts, as the [app product](/products/app) describes.

```text
apps/portal/
├── app.mdx                          kind, mount, Personas
└── leases/[lease]/view.mdx          replaces one derived screen
```

## Reference
`app.mdx` is frontmatter only.

| Key | Type | Holds |
| --- | --- | --- |
| `kind` | `saas \| admin \| directory \| commerce` | The App's shape |
| `mount` | path | Where it serves; `/app` by default, `/admin` for `admin` |
| `nouns` | Noun names | The Nouns it shows |
| `personas` | map | Each Persona and the [Verbs](/business/nouns/verb) it `may` call |

## Examples
### Minimal
```mdx title="apps/portal/app.mdx"
---
kind: saas
nouns: [Lease]
---
```

### Leaseline
Leaseline declares a `Lease` Noun. Managers run every Verb; residents only read and answer.

```mdx title="apps/portal/app.mdx"
---
kind: saas
mount: /app
nouns: [Lease]
personas:
  manager: { may: [Lease.create, Lease.renew, Lease.notify] }
  resident: { may: [Lease.get] }
---
```

## What it builds
The [SoftwareBuilder](/code/builders/software) compiles the folder and publishes it with `App.publish`.

- an `App` with a list and a detail screen per Noun, and a form per Verb a Persona may call
- an inbox of the [Tasks](/business/nouns/task) waiting on the signed-in person
- authorization before any screen renders, from the Personas map
- the [Event](/business/nouns/event) `App.published`

## Routing
| Path | Screen |
| --- | --- |
| `/app/leases` | The list |
| `/app/leases/{lease}` | One record |
| `/app/leases/{lease}/renew` | The form for `Lease.renew` |

The same URL returns HTML, JSON or Markdown, by reader.

## Good to know
- A derived screen is replaced one at a time with a [view](/code/file-conventions/views); the rest keep deriving.
- The customer portal is an App of kind `saas` with a `customer` Persona; see [portal](/products/site/portal).