Quickstart — Self-hosted
Run Pookie on your own infra. Three paths below — pick one and follow it end to end. About fifteen minutes.
Before you start
You'll need:
- A Slack workspace where you have permission to install apps.
- An OpenAI API key (
OPENAI_API_KEY). Get one at platform.openai.com/api-keys. - A Redis instance — only if you're deploying to Vercel. Railway and Docker bundle their own. Upstash free tier is fine.
Deploy on Vercel
1. Click the deploy link
Open the Vercel deploy link.
2. Fill in env vars
The deploy flow automatically provisions an Upstash Redis instance and injects the credentials. Vercel asks for the remaining env vars. Use placeholders for the three SLACK_* values — you'll replace them in step 5. Real values for the rest:
SLACK_CLIENT_ID=placeholder
SLACK_CLIENT_SECRET=placeholder
SLACK_SIGNING_SECRET=placeholder
OPENAI_API_KEY=sk-your-openai-key
IS_SELF_DEPLOYED=true
Click Deploy. Vercel hands you a URL like pookie-yourname.vercel.app. That's your deploy URL.
3. Create your Slack app
Visit https://YOUR-DEPLOY-URL/install in a browser. Pookie detects you're self-hosted and walks you through generating a Slack app manifest with your URLs baked in. Click through to Slack, click Create App.
4. Copy the OAuth credentials
In the Slack app dashboard, go to Basic Information → App Credentials. Copy these three values:
- Client ID →
SLACK_CLIENT_ID - Client Secret →
SLACK_CLIENT_SECRET - Signing Secret →
SLACK_SIGNING_SECRET
5. Replace the placeholder env vars
In your Vercel project, Settings → Environment Variables, replace the three SLACK_* placeholders with the real values from step 4.
6. Redeploy
Vercel doesn't auto-redeploy on env-var changes. Deployments tab → latest deployment → three-dot menu → Redeploy.
7. Install Pookie into your Slack workspace
Open https://YOUR-DEPLOY-URL/api/slack/install. Slack walks through workspace selection and scope approval, then redirects back to your deploy.
8. Add Pookie to a channel
/invite @pookie
Pookie posts a hello on join. DMs work without invite.
9. Run /onboarding
/onboarding
Pookie posts an interactive card with one-click MCP server connectors (Linear, GitHub, Sentry, PostHog, etc.). Click the OAuth links to wire each one up.
10. Try your first query
@pookie what did we decide about the Q3 launch?
Pookie replies inline with sources cited. Done.
Vercel-specific gotchas
If Slack manifest creation fails on URL verification, Deployment Protection is the usual culprit. Vercel Dashboard → Project Settings → Deployment Protection → Protection Bypass for Automation → copy the secret. Edit the manifest in Slack's dashboard → JSON tab → add ?x-vercel-protection-bypass=YOUR_SECRET to the webhook URL → Save.
Deploy on Railway
1. Click the template
One-click Railway template. Provisions Pookie + managed Redis side by side.
2. Fill in env vars
At the deploy form:
- Set
OPENAI_API_KEYto your real value. - Leave the three
SLACK_*placeholders alone — you'll replace them in step 5. REDIS_URL,BASE_URL, andIS_SELF_DEPLOYEDauto-wire from Railway's variable references and the Dockerfile.
Click Deploy. Railway hands back a URL like pookie-production-xxxx.up.railway.app. That's your deploy URL.
3. Create your Slack app
Visit https://YOUR-DEPLOY-URL/install. Pookie detects you're self-hosted and walks you through generating a Slack app manifest. Click through to Slack, click Create App.
4. Copy the OAuth credentials
In the Slack app dashboard: Basic Information → App Credentials. Copy:
- Client ID →
SLACK_CLIENT_ID - Client Secret →
SLACK_CLIENT_SECRET - Signing Secret →
SLACK_SIGNING_SECRET
5. Replace the placeholder env vars
In Railway, click your Pookie service → Variables tab. Replace the three SLACK_* placeholders with the real values from step 4.
6. Redeploy
railway redeploy
Or trigger a redeploy from the Railway dashboard.
7. Install Pookie into your Slack workspace
Open https://YOUR-DEPLOY-URL/api/slack/install. Slack walks through workspace selection and scope approval.
8. Add Pookie to a channel
/invite @pookie
9. Run /onboarding
/onboarding
Click the OAuth links to connect MCP servers.
10. Try your first query
@pookie what did we decide about the Q3 launch?
Deploy on Docker
For Docker on a VPS, Cloud Run, Fly, or any container host.
1. Clone and start
git clone https://github.com/millionco/pookie
cd pookie
OPENAI_API_KEY=sk-... docker compose up
The included docker-compose.yml bundles Redis. The Dockerfile sets IS_SELF_DEPLOYED=true automatically.
2. Expose the deployment publicly
Pookie binds to 0.0.0.0:3000 inside the container. Put it behind HTTPS — the Slack webhook needs to be publicly reachable. On a VPS, that means a reverse proxy (Caddy, nginx, Traefik). On Cloud Run / Fly, the platform handles HTTPS.
3. Set BASE_URL
Add BASE_URL=https://your-pookie.example.com to your env so Pookie knows its own URL. Restart the container:
docker compose up -d --force-recreate
4. Create your Slack app
Visit https://your-pookie.example.com/install. Pookie walks you through generating a Slack app manifest. Click through to Slack, click Create App.
5. Copy the OAuth credentials
In the Slack app dashboard: Basic Information → App Credentials. Copy:
- Client ID →
SLACK_CLIENT_ID - Client Secret →
SLACK_CLIENT_SECRET - Signing Secret →
SLACK_SIGNING_SECRET
6. Set the env vars and restart
Add the three values to your .env (or wherever docker-compose.yml reads from), then:
docker compose up -d --force-recreate
7. Install Pookie into your Slack workspace
Open https://your-pookie.example.com/api/slack/install. Slack walks through workspace selection and scope approval.
8. Add Pookie to a channel
/invite @pookie
9. Run /onboarding
/onboarding
Click the OAuth links to connect MCP servers.
10. Try your first query
@pookie what did we decide about the Q3 launch?
Common issues
| Symptom | Cause | Fix |
|---|---|---|
| Bot doesn't respond in a channel | Forgot /invite @pookie | Invite it |
| Bot doesn't respond at all | Env vars not picked up after redeploy | Force a redeploy |
Bot still using placeholder Slack creds | Initial deploy values never replaced | Replace with real values, redeploy |
OAuth fails with invalid_client_id | Slack credentials wrong or still placeholder | Re-copy from Slack's Basic Information page, redeploy |
Logs show invalid_signature | SLACK_SIGNING_SECRET doesn't match the Slack app | Re-copy from Slack's Basic Information page, redeploy |
| AI calls fail with auth errors | No OpenAI key configured | Set OPENAI_API_KEY |
| Slack manifest creation fails on URL verification (Vercel) | Deployment Protection blocking Slack | See the Vercel-specific gotchas section above |
Stuck?
File an issue on GitHub or jump in Discord.