
This is a generic Bolt for JavaScript (TypeScript) template app used to build Slack apps with Next.js
Before getting started, make sure you have a development workspace where you have permissions to install apps. You can use a developer sandbox or create a workspace
git clone https://github.com/vercel-partner-solutions/slack-bolt-with-next.git && cd slack-bolt-with-next && pnpm install
manifest.json into the text box that says "Paste your manifest code here" (JSON tab) and click NextSLACK_BOT_TOKENSLACK_SIGNING_SECRETNGROK_AUTH_TOKEN to your .env file
slack app linkupdate the manifest source to remote select yesLocal when prompted.slack/config.json and update your manifest source to local{"manifest": {"source": "local"},"project_id": "<project-id-added-by-slack-cli>"}
slack run. If prompted, select the workspace you'd like to grant access toyes if asked "Update app settings with changes to the local manifest?"hello. Your app should reply with world!SLACK_BOT_TOKENSLACK_SIGNING_SECRETrequest_url and url fields use https://<your-app-domain>/api/slack/eventshello and your app will respond with world!manifest.jsonmanifest.json defines your Slack app's configuration. With a manifest, you can create or update an app with a pre-defined configuration
src/bolt/app.tsThis is the Bolt app entry. It initializes @vercel/slack-bolt's VercelReceiver and registers listeners
src/bolt/listenersEvery incoming request is routed to a "listener". Inside this directory, we group each listener by Slack Platform feature, e.g. messages for message events
src/app/api/slack/events/route.tsThis file defines your Next.js Route Handler that receives Slack events. Its pathname matches the URLs defined in your manifest.json. Next.js uses file-based routing for API handlers. Learn more in the Next.js docs: https://nextjs.org/docs/app/building-your-application/routing/route-handlers
pnpm dev:tunnel: A helper script to automatically start your Slack app with ngrok tunnelingexpress being externalized: @slack/bolt ships an Express receiver. Turbopack may analyze its static import even if you don't use it. Keeping express as a dependency or aliasing it to a stub resolves this during development.

