Skip to content

Deploy to Vercel

The scaffolded app is already shaped for Vercel. Deployment mainly means linking the project, setting env vars, enabling snapshot warmup support, and pointing Slack at the production URL.

Authenticate and link the local app to a Vercel project:

Terminal window
pnpm dlx vercel@latest login
pnpm dlx vercel@latest link

If your account requires a team scope, pass the same --scope <team-slug> value to Vercel commands.

The scaffolded package.json includes the production build script:

package.json
{
"scripts": {
"check": "junior check",
"dev": "vite dev",
"build": "junior snapshot create && vite build"
}
}

Keep the Vercel build command as pnpm build. junior snapshot create prepares sandbox runtime dependencies declared by enabled plugins before request handling starts.

Set the core runtime variables in Vercel:

VariableRequiredPurpose
SLACK_SIGNING_SECRETYesVerifies Slack requests.
SLACK_BOT_TOKEN or SLACK_BOT_USER_TOKENYesPosts replies and calls Slack APIs.
REDIS_URLYesQueue and runtime state storage.
JUNIOR_SECRETYesSigns internal callbacks and sandbox requester context.
JUNIOR_BASE_URLConditionalCanonical URL for OAuth and callback URLs when Vercel URL envs are not enough.
AI_GATEWAY_API_KEYOptionalAI Gateway auth when your setup requires it.

Use one stable JUNIOR_SECRET per deployment:

Terminal window
node -e "console.log(require('node:crypto').randomBytes(32).toString('base64url'))"

Plugin pages list provider-specific env vars such as GitHub App settings or Datadog keys.

If enabled plugins need sandbox runtime dependencies, junior snapshot create runs during build. In Vercel, enable OIDC so VERCEL_OIDC_TOKEN is available during the build.

Snapshot warmup also needs REDIS_URL during build because the snapshot registry is Redis-backed.

Update these Slack URLs to your production domain:

https://<your-domain>/api/webhooks/slack

Apply the URL to:

  • Event Subscriptions
  • Interactivity
  • /jr slash command

Reinstall the Slack app if scopes changed.

Run these checks after deployment:

  1. GET https://<your-domain>/health returns status: "ok".
  2. A Slack mention produces a thread reply in the expected workspace.
  3. App Home opens without an error.
  4. Queue callback and turn logs show successful processing.
  5. One enabled plugin workflow succeeds end to end.

Use Verify & Troubleshoot for first-response checks, then monitor production with Observability.