> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://contentful.com/developers/docs/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://contentful.com/developers/docs/_mcp/server.

# Extending and customizing Compose

> Learn how to customize and extend Compose to fit your project needs | Extending the Compose content models with custom fields

> **Info**
>
> Compose is being deprecated. It is in maintenance mode and won’t be updated with any new features. Current installations will work until the end of 2026.

> **Info**
>
> This document describes Compose that is driven by a legacy content model. If you set up Compose after April 21st 2022, please refer to the updated [Compose documentation](/compose/what-is-compose).

## App framework support

You can install [Marketplace apps](https://www.contentful.com/marketplace/) and custom apps in your space to customize the editing experience and
integrate with other services.

Currently Compose only supports a subset of [App Locations](/extensibility/app-framework/locations).

The following table shows the support status for the App Locations:

<table>
  <tr>
    <td>
      **App Location**
    </td>

    <td>
      **Status**
    </td>
  </tr>

  <tr>
    <td>
      [App Configuration](/extensibility/app-framework/locations#app-configuration)
    </td>

    <td>
      Not supported
    </td>
  </tr>

  <tr>
    <td>
      [Page](/extensibility/app-framework/locations#page)
    </td>

    <td>
      Not supported
    </td>
  </tr>

  <tr>
    <td>
      [Dialogue](/extensibility/app-framework/locations#dialog)
    </td>

    <td>
      Supported
    </td>
  </tr>

  <tr>
    <td>
      [Entry Editor](/extensibility/app-framework/locations#entry-editor)
    </td>

    <td>
      Not supported
    </td>
  </tr>

  <tr>
    <td>
      [Entry Field](/extensibility/app-framework/locations#entry-field)
    </td>

    <td>
      Supported
    </td>
  </tr>

  <tr>
    <td>
      [Entry Sidebar](/extensibility/app-framework/locations#entry-sidebar)
    </td>

    <td>
      Supported
    </td>
  </tr>
</table>

> **Info**
>
> **No support for UI Extensions**\
>
> UI Extensions are not supported in Compose. If you need custom Entry Field editors then you should consider to [migrate your UI Extension into an app](/developers/docs/extensibility/app-framework/migrating-extension-to-app/).

## App SDK support

Not all the App SDK methods are available in Compose.

The following table displays the App SDK methods which are **not supported** (grouped by namespace):

<table>
  <tr>
    <th>
      **Namespace**
    </th>

    <th>
      **Methods**
    </th>

    <th>
      **Status**
    </th>
  </tr>

  <tr>
    <th rowspan="3">
      **sdk.navigator**
    </th>

    <td>
      openNewEntry
    </td>

    <td>
      doesn't open new entry in slideIn editor but only creates a new entry
    </td>
  </tr>

  <tr>
    <td>
      openEntry
    </td>

    <td>
      doesn't open the entry in slideIn editor but in a new window instead
    </td>
  </tr>

  <tr>
    <td>
      openPageExtension\

      openCurrentAppPage\

      openBulkEditor\

      openAppConfig\

    </td>

    <td>
      not implemented: calls to these methods are ignored
    </td>
  </tr>

  <tr>
    <th>
      **sdk.space**
    </th>

    <td>
      createContentType\

      deleteContentType\

      getPublishedEntries\

      getPublishedAssets\

      getEntityScheduledActions\

      getAllScheduledActions\

    </td>

    <td>
      not supported
    </td>
  </tr>
</table>

## Extending the Compose content models with custom fields

It's possible to extend the "Compose: Page" and "Compose: SEO" content types with custom fields of any type except Rich
text. If you need to include Rich text fields in your page, consider adding a reference to a content type with a Rich
text field or consider adding the Rich text fields to your [page types](/compose/legacy/page-types).

Compose allows you to edit custom reference fields in the "Page settings" tab by adding and removing references to
existing content. Referenced entries can't be expanded and edited directly from the "Page settings" tab, though.
Instead, clicking them will open them in the Web app where you can continue editing.

## Custom sidebar

Custom sidebar for Compose is configured in the web app, on a content type level.
To configure a custom sidebar for a specific Compose [page type](/compose/legacy/page-types) - for example, "Help Center Article" - make changes to the corresponding page type content type in the web app.

It is not possible to configure a sidebar only for Compose pages. The configuration will also be applied to the entry editor of the corresponding content type in the web app.
Only apps widgets can be added to the custom sidebar of Compose page type. Built-in widgets are currently not supported in Compose.
UI Extensions also won't be displayed in Compose custom sidebar: we have retired UI Extensions and
recommend [converting them to apps](/extensibility/app-framework/migrating-extension-to-app).
If you have some apps installed in the web app that you would like to use in the Compose page editor, add their corresponding widgets to the custom sidebar of the relevant page type content type.

To learn how to set up custom sidebar, please refer to [Customizing sidebar](/extensibility/app-framework/customizing-sidebar).

## Localizing pages

Compose supports field-level and entry-level localization of page content via the locale selector at the top of the page
editor. Localization for media fields is not supported, so these fields are always treated as non-localized, allowing to
see and edit only the default locale’s values.

Non-localized fields are always displayed in the default locale, regardless of the selected locale. If the selected
locale is different from the default one, a label is also displayed next to those fields, showing their respective
locale.

### Supported localization patterns and best practices

Avoid relying on required fields for localizing content. This can create a possible issue where localized required
fields block publishing of an entry if that entry has not been referenced to a locale. (This is more likely to happen if
you use reference fields for region-specific content). For this reason, we also recommend always enabling "Allow empty
fields for this locale" when adding or editing locales.

For more about localization, see our [guide on localization](/developers/docs/tutorials/general/setting-locales/) and
read more about [field-level vs entry-level localization](/help/field-and-entry-localization/).

If an entry has field validation errors in a locale where the entry isn't linked (i.e. the entry doesn't show up if you
select that locale) those fields will be displayed when trying to publish the page. This allows the user to fix the
issue in an otherwise unreachable value.

![Compose dead path error duplicate video ID](/developers/docs/_fern-img/5e4e8f3ac4e7c17b7330f42aa46a4883d04d4be2fea9197ae56f981a5f5d2e98.webp)