# Deploy a Chrome Extension to production

> This guide assumes you are using the Plasmo framework. If you need help applying these concepts to another framework, [contact support](https://clerk.com/contact/support).

## Create a production instance

In the Clerk Dashboard, navigate to the [**Native applications**](https://dashboard.clerk.com/~/native-applications) page and ensure that the Native API is enabled. This is required to integrate Clerk in your native application.

For Clerk production instances, there must be a domain associated with the instance. Even though there may not be a web application associated with your Chrome Extension, a domain is still required. Follow the [guide on deploying your Clerk app to production](https://clerk.com/docs/guides/development/deployment/production.md).

## Update your `.env.production` file

Add your Publishable and Frontend API keys for your Clerk production instance to your `.env.production` file. These keys can always be retrieved from the [**API keys**](https://dashboard.clerk.com/~/api-keys) page in the Clerk Dashboard. If you're using [the Sync Host feature](https://clerk.com/docs/guides/sessions/sync-host.md), you also need to set the `PLASMO_PUBLIC_CLERK_SYNC_HOST` environment variable. The value is the domain your web app's production server runs on. For example, `https://clerk.com`.

1. At the top of the Clerk Dashboard, in the instance selection dropdown, ensure that your production instance is selected.
2. In the navigation sidenav, select [**API keys**](https://dashboard.clerk.com/~/api-keys).
3. In the **Quick Copy** section, select **Chrome Extension** and copy your Clerk Publishable and Frontend API keys.
4. Paste your keys into your `.env.production` file.
5. If you are using [the Sync Host feature](https://clerk.com/docs/guides/sessions/sync-host.md), you will also need to set the `PLASMO_PUBLIC_CLERK_SYNC_HOST` environment variable. The value should be the domain your web app's production server runs on. For example, `https://clerk.com`.

The final result should resemble the following:

filename: .env.production
```env
PLASMO_PUBLIC_CLERK_PUBLISHABLE_KEY={{pub_key}}
CLERK_FRONTEND_API={{fapi_url}}
PLASMO_PUBLIC_CLERK_SYNC_HOST=https://clerk.your-domain.com
```

## Add production domain to `host_permissions`

`host_permissions` specifies which hosts, or websites, will have permission to sync auth state with your app. It accepts an array, allowing you to add more than one host. You must add your production domain to the `host_permissions` array.

> If you are using the Sync Host feature and followed [the configuration guide](https://clerk.com/docs/guides/sessions/sync-host.md), then you have already completed this step (the `http://$PLASMO_PUBLIC_CLERK_SYNC_HOST/*` value points to your production domain.)

In the `package.json` file, in the `manifest` object, update the `host_permissions` array. Add your domain and ensure it is preceded with `https://`. For example, `https://clerk.com`. Only add the root domain and not any subdomains. Then, add `/*` to the end of the domain.

The following example shows how to configure `host_permissions` for production:

filename: package.json
```json
{
  // The rest of your package.json file
  "manifest": {
    "key": "$CRX_PUBLIC_KEY",
    "permissions": ["cookies", "storage"],
    "host_permissions": ["https://<your-domain>/*", "$CLERK_FRONTEND_API/*"]
  }
}
```

## Add the Extension's ID to your web app's `allowed_origins`

> You may have already added the Extension ID to your web app's `allowed_origins` using your **development** Secret Key. You must repeat this step using your **production** Secret Key.

In your terminal, paste the following command and replace the `<CHROME_EXTENSION_KEY>` with your extension's ID.

1. At the top of the Clerk Dashboard, in the instance selection dropdown, ensure that your production instance is selected.
2. In the navigation sidenav, select [**API keys**](https://dashboard.clerk.com/~/api-keys).
3. Copy your Secret Key. It should begin with `sk_live_`.
4. In your terminal, paste the following command. Replace `YOUR_SECRET_KEY` with your Clerk Secret Key and the `<CHROME_EXTENSION_KEY>` with your extension's ID.

The final result should resemble the following:

filename: terminal
```bash
curl -X PATCH https://api.clerk.com/v1/instance \
  -H "Authorization: Bearer {{secret}}" \
  -H "Content-type: application/json" \
  -d '{"allowed_origins": ["chrome-extension://<CHROME_EXTENSION_KEY>"]}'
```

## Submit your extension for review

1. In your app, create a new zip of the `build/chrome-mv3-dev` folder.
2. In the top-right of the [Chrome Web Store Developer Dashboard](https://chrome.google.com/webstore/developer/dashboard), select **Upload new package** and upload the zip file.
3. Complete the required information to submit your extension for review. To check the requirements that must be met before submitting, select **Why can't I submit?**.

---

## Sitemap

[Overview of all docs pages](https://clerk.com/docs/llms.txt)
