> [!CAUTION]
> **Important:** Chrome will be removing support for Chrome Apps on all platforms. Chrome browser and the Chrome Web Store will continue to support extensions. [**Read the announcement**](https://blog.chromium.org/2020/08/changes-to-chrome-app-support-timeline.html) and learn more about [**migrating your app**](https://developer.chrome.com/apps/migration).

The `externally_connectable` manifest property declares which extensions, apps, and web pages can
connect to your app via [`runtime.connect`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connect) and [`runtime.sendMessage`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendMessage).

For a tutorial on message passing see [cross-extension and app messaging](https://developer.chrome.com/docs/extensions/develop/concepts/messaging#external) and [sending messages
from web pages](https://developer.chrome.com/docs/extensions/develop/concepts/messaging#external-webpage).

## Connecting without externally_connectable

If `externally_connectable` is not declared in your app's manifest, all extensions and apps can
connect, but no webpages can connect. As a consequence, when updating your manifest to use
`externally_connectable`, if `"ids": ["*"]` is not specified then other extensions and apps will
lose the ability to connect to your app. This may be an unintended consequence, so keep it in mind.

## Sample manifest.json

    {
      "name": "My externally connectable app",
      "externally_connectable": {
        // Extension and app IDs. If this field is not specified, no
        // extensions or apps can connect.
        "ids": [
          "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
          "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
          ...
          // Alternatively, to match all extensions and apps, specify only
          // "*".
          "*"
        ],
        // Match patterns for web pages. Does not affect content scripts.
        // If this field is not specified, no webpages can connect.
        "matches": [
          "https://*.google.com/*",
          "*://*.chromium.org/*",
          ...
        ],
        // Indicates that the extension would like to make use of the TLS
        // channel ID of the web page connecting to it. The web page must
        // also opt to send the TLS channel ID to the extension via setting
        // includeTlsChannelId to true in runtime.connect's connectInfo
        // or runtime.sendMessage's options.
        "accepts_tls_channel_id": false
      },
      ...
    }

## Reference

The externally_connectable manifest key can have the following properties:

- **`ids` (array of string)** - optional

  The IDs of extensions or apps that are allowed to connect. If left empty or unspecified, no
  extensions or apps can connect.

  The wildcard `"*"` will allow all extensions and apps to connect.
- **`matches` (array of string)** - optional

  The URL patterns for *web pages* that are allowed to connect. *This does not affect content
  scripts.* If left empty or unspecified, no web pages can connect.

  Patterns cannot include wildcard domains nor subdomains of [(effective) top level domains](https://publicsuffix.org/list/);
  `*://google.com/*` and `https://*.chromium.org/*` are valid, while `<all_urls>`, `https://*/*`,
  `*://*.com/*`, and even `https://*.appspot.com/*` are not.
- **`accepts_tls_channel_id` (boolean)** - optional

  If `true`, messages sent via [`runtime.connect`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connect) or [`runtime.sendMessage`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendMessage) will set
  [`runtime.MessageSender.tlsChannelId`](https://developer.chrome.com/docs/extensions/reference/api/runtime#property-MessageSender-tlsChannelId) if those methods request it to be. If `false`,
  [`runtime.MessageSender.tlsChannelId`](https://developer.chrome.com/docs/extensions/reference/api/runtime#property-MessageSender-tlsChannelId) will never be set under any circumstance.