# App

URL: /business/nouns/app · Id: `noun:app`

> An App is an Interface where people work with a Product’s Nouns and Verbs through screens, backed by its API.

An App is an [Interface](/business/nouns/interface) where people work with a [Product](/business/nouns/product)’s [Nouns](/business/nouns/noun) and [Verbs](/business/nouns/verb) through screens, backed by its API.

## Properties
| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `personas` | list of [Persona](/business/nouns/persona) | No | The Personas it serves. |
| `views` | list of [Dashboard](/business/nouns/dashboard) | No | Its Dashboards, compiled by default from the Persona’s Role: a list and record per Noun, a form per Verb. |
| `slots` | `json` | No | Named places where a Component replaces a default part, such as a record header or the ask control. |

<details>
<summary>Inherited from [Interface](/business/nouns/interface): 3 properties</summary>

| Property | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | `string` | Yes | One of `api`, `mcp`, `cli`, `sdk`, `site`, `app`, `docs`, or `webhooks`. |
| `path` | `string` | No | Where it is mounted on its Domain, such as `/api`. |
| `conformsTo` | `json` | No | The Standards it also speaks, each mapping the Standard’s operations onto the Product’s Verbs. |

</details>

## Object
```json
{
  "$id": "https://api.sb/routewise.dev/apps/app_1",
  "$type": "App",
  "kind": "api",
  "path": "/",
  "conformsTo": {
    "standard": "openai-chat",
    "operations": {
      "chat.completions.create": "Listing.write"
    }
  },
  "personas": [
    "persona_1"
  ],
  "views": [
    "dashboard_1"
  ],
  "slots": {}
}
```

## Relationships
- <a id="rel-guides"></a>An App **guides** many [Flows](/business/nouns/flow): the [Flows](/business/nouns/flow) an App runs on first sign-in, one per [Persona](/business/nouns/persona) and [Offer](/business/nouns/offer), each ending at the activation [Event](/business/nouns/event). `guides`, inverse [`app`](/business/nouns/flow#rel-app).
- <a id="rel-presents"></a>An App **presents** many [Dashboards](/business/nouns/dashboard): an App opens on [Dashboards](/business/nouns/dashboard) for the people signed in to it. `presents`, inverse [`presentedIn`](/business/nouns/dashboard#rel-presented-in).

## Verbs
| Verb | Description | Subject | Event | Class |
| --- | --- | --- | --- | --- |
| [App.publish](/business/nouns/app/publish) | Publish releases an App to its Customers, so each Tenant runs its newest build. | [Engineering Lead](/agents/engineering/engineering-lead) | [`App.published`](/business/events/App.published) | None. |

## Permissions
Which Access level may call each Verb. One-way Verbs wait their delay window.

| Operation | `owner` | `admin` | `member` | `viewer` |
| --- | --- | --- | --- | --- |
| `App.publish` | Yes | Yes | Yes | No |

## Call it

**Ask**

```text
Publish the app “Grain-free kibble, 12 lb”.
```

**API**

```bash
curl -X POST https://api.sb/petpantry.shop/apps/app_1/publish \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
```

```json
{
  "api": "https://api.sb/petpantry.shop",
  "app": {
    "$id": "https://api.sb/petpantry.shop/apps/app_1",
    "$type": "App",
    "kind": "api"
  },
  "action": {
    "$id": "https://api.sb/petpantry.shop/actions/action_1",
    "operation": "App.publish",
    "status": "done"
  },
  "links": {
    "self": "https://api.sb/petpantry.shop/actions/action_1"
  }
}
```

**SDK**

```ts
import { $ } from 'startup-builder'

const app = await $.App.publish({ app: 'app_1' })
```

**CLI**

```bash
npx startup-builder do App.publish --json '{"app":"app_1"}'
```

**MCP**

```json
{
  "name": "do",
  "arguments": {
    "code": "return await $.App.publish({ app: 'app_1' })"
  }
}
```

## Example
The App of an invoicing [Software](/business/nouns/software) Product shows each [Invoice](/business/nouns/invoice) on a screen with `bill` and `void` buttons. Each button calls the same API a script calls.