Use one public app origin for the beta:
- the frontend Worker's
workers.devURL - or a custom domain such as
https://rocklist.live
Use the same origin everywhere that depends on the app URL.
If you plan to use a custom domain, attach it before you update Twitch settings so the panel and website keep one stable origin.
Set the production app URL in:
.env.deployAPP_URL=https://your-app-host
- GitHub Actions production secret
APP_URL=https://your-app-host
If you build the standalone panel artifact, also set:
VITE_TWITCH_EXTENSION_API_BASE_URL=https://your-app-host
If you use a custom domain:
- Open
Workers & Pagesin Cloudflare. - Select the frontend Worker:
request-bot. - Open
Settings->Domains & Routes. - Add the hostname for the app, such as
rocklist.live. - Wait for DNS and certificate provisioning to finish.
The backend Worker does not need a public domain.
Deploy the production app and backend:
npm run deployConfirm the site loads on the final app origin before you update Twitch settings.
Make sure the frontend Worker has:
TWITCH_CLIENT_IDTWITCH_CLIENT_SECRETTWITCH_EVENTSUB_SECRETTWITCH_EXTENSION_SECRETSESSION_SECRETADMIN_TWITCH_USER_IDSSENTRY_DSNwhen Sentry is enabled
Make sure the backend Worker has:
TWITCH_CLIENT_IDTWITCH_CLIENT_SECRETTWITCH_EVENTSUB_SECRETSENTRY_DSNwhen Sentry is enabled
In the Twitch developer console for the website app, set the OAuth redirect URLs for the final app origin:
https://your-app-host/auth/twitch/callbackhttps://your-app-host/auth/twitch/bot/callback
In the Twitch Extensions console, use the final production app origin for the panel:
Request Identity Link: enabledAllowlist for URL Fetching Domains:https://your-app-host
Keep Chat Capabilities disabled unless the panel sends extension chat messages.
Build the hosted panel files:
npm run build:extension:panelWhen you build the Hosted Test artifact, make sure the shell sets the final app origin:
VITE_TWITCH_EXTENSION_API_BASE_URL=https://your-app-host npm run build:extension:panelThe build requires VITE_TWITCH_EXTENSION_API_BASE_URL or APP_URL. If neither is set, it fails instead of falling back to the Twitch asset host.
Upload the contents of:
dist/twitch-extension/panel
Set the Hosted Test asset paths for the panel version:
Panel Viewer Path:index.htmlConfig Path:index.htmlLive Config Path: leave blank unless you add a live config surface
Use Hosted Test for beta channels that should load the production panel without your local dev server or tunnel.
The uploaded Twitch panel bundle is separate from the website deploy. When you change panel code or the extension API base URL, rebuild the panel artifact and upload a new zip before you retest Hosted Test.
Add beta channels to:
Testing Account Allowlist
If the version stays unreleased, only accounts on the testing allowlist can install and use the panel in testing mode.
Verify these paths on the Hosted Test build:
- viewer, unlinked:
- playlist loads
- search loads
- write actions require identity share
- viewer, linked:
- add request works
- add VIP request works when a VIP token is available
- edit current request works
- remove current request works
- channel owner:
- playlist moderation controls appear
- set current, mark played, shuffle, reorder, delete item, and request-kind changes work
- channel moderator:
- playlist moderation controls follow the channel's moderator capability settings
- queue shuffle and manual reorder work when request-management access is enabled
If an extension request fails in production, check the frontend Worker logs. Slow and failed panel bootstrap and state requests log a trace id, elapsed time, and stage timings for channel lookup, viewer resolution, viewer request state, and live playlist state.
The panel identity-share flow does not create a website session.
Opening the website from the panel uses the normal website auth state:
- the website recognizes the user when the browser already has the RockList.Live session cookie
- otherwise the website still requires the normal Twitch OAuth flow