> ## Documentation Index
> Fetch the complete documentation index at: https://docs.upshiftcloud.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 6. Publishing

> Add marketplace metadata and publish your app.

Your app works. The last step is to describe it for the marketplace and publish.

## Add marketplace metadata

The [application config](https://docs.upshiftcloud.com/en/developers/extend/apps/config/application.md) carries the
identity that shows up in the marketplace: author, category, logo, and support
links. Put a logo in `public/` and reference it with `logo`.

```ts filename="src/application-config.ts" theme={null}
import { defineApplication } from 'twenty-sdk/define';

export default defineApplication({
  universalIdentifier: APPLICATION_UNIVERSAL_IDENTIFIER,
  displayName: 'Document Generator',
  description:
    'Create reusable document templates and generate personalized documents from your CRM records.',
  logo: 'public/document-generator.svg',
  author: 'Exceev Technology',
  category: 'Productivity',
  websiteUrl: 'https://docs.upshiftcloud.com/en/developers/extend/apps/tutorials/document-generator/overview',
  termsUrl: 'https://exceev.com/privacy#terms',
  emailSupport: 'contact@exceev.com',
  issueReportUrl: 'mailto:contact@exceev.com',
});
```

> [!TIP]
>
> The default role is declared with `defineApplicationRole()` in its own file — you
> don't pass `defaultRoleUniversalIdentifier` here anymore.

Also add the `twenty-app` keyword to `package.json` so the app is discoverable:

```json filename="package.json" theme={null}
{ "keywords": ["twenty-app"] }
```

## Add gallery screenshots

A marketplace listing sells itself with screenshots. Drop a few PNGs in
`public/gallery/` and reference them with `galleryImages` — they render as a
gallery on the listing page, in array order.

```ts filename="src/application-config.ts" theme={null}
export default defineApplication({
  // ...identity from above
  galleryImages: [
    'public/gallery/01-generated-document.png',
    'public/gallery/02-command-menu.png',
    'public/gallery/03-template-editor.png',
    'public/gallery/04-documents.png',
  ],
});
```

> [!TIP]
>
> Lead with the payoff: make the first screenshot the finished result (a generated
> document), then show how it's triggered and authored. Use crisp, high-resolution
> captures — they're the first thing a user sees.

Give `README.md` the same treatment — it's the front page on npm and GitHub.
Open with the value proposition and a screenshot, list the headline features,
then keep the build details below the fold.

## Check before you ship

Run the same gates CI does:

```bash filename="Terminal" theme={null}
yarn lint          # oxlint
yarn typecheck     # tsgo
yarn test:unit     # unit tests
yarn twenty plan   # preview the metadata diff
```

The plan prints exactly what would change on the server without applying it —
a good final sanity check. See
[Testing](https://docs.upshiftcloud.com/en/developers/extend/apps/operations/testing.md) and
[Syncing & recovery](https://docs.upshiftcloud.com/en/developers/extend/apps/operations/sync-and-recovery.md).

## Publish

```bash filename="Terminal" theme={null}
# Public app → npm (default)
yarn twenty app:publish

# Or deploy privately to a specific server's registry
yarn twenty app:publish --private -r <remote>
```

`app:publish` builds and publishes to npm by default; `--private` uploads a
tarball to a Upshift server's private registry instead. To surface a published app
in an instance's marketplace, trigger a catalog sync:

```bash filename="Terminal" theme={null}
yarn twenty dev:catalog-sync -r <remote>
```

Full details and the release checklist:
[Publishing](https://docs.upshiftcloud.com/en/developers/extend/apps/operations/publishing.md).

## You built an app 🎉

In six chapters you used most of the SDK surface:

* **Objects, fields, and a relation** to model the data
* A **logic function** exposed as an **AI tool**, a **workflow action**, and **HTTP routes**
* **Views, navigation, a command, and a front component** for the UI
* An **agent + skill** for natural-language generation
* **Marketplace metadata** and the publish flow

The finished app is at
[`packages/twenty-apps/examples/document-generator`](https://github.com/exceev-technology/upshift/tree/main/packages/twenty-apps/examples/document-generator).

## Where to go next

> **[Data reference](https://docs.upshiftcloud.com/en/developers/extend/apps/data/overview.md)**
>
> Every field type, relation, and index option.

> **[Logic reference](https://docs.upshiftcloud.com/en/developers/extend/apps/logic/overview.md)**
>
> Cron and database-event triggers, the key-value store, OAuth connections.

> **[Layout reference](https://docs.upshiftcloud.com/en/developers/extend/apps/layout/overview.md)**
>
> Page layouts, dashboard widgets, and more UI surfaces.

> **[Operations](https://docs.upshiftcloud.com/en/developers/extend/apps/operations/overview.md)**
>
> CLI, testing, remotes, and CI.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.