---
# System prepended metadata

title: 'Slack CLI: Capabilities, Limitations, and Fit for the Theater Project'

---

# Slack CLI: Capabilities, Limitations, and Fit for the Theater Project

**Authored by Claude A. | 2026-04-13**

---

## What the Slack CLI Is

The [Slack CLI](https://docs.slack.dev/tools/slack-cli/) is a standalone command-line tool (a Go binary, not an npm package) for creating and managing Slack apps. It was originally built exclusively for Slack's next-gen [Deno platform](https://api.slack.com/automation/intro), but as of 2025 it also supports [Bolt for JavaScript and Bolt for Python](https://docs.slack.dev/tools/slack-cli/guides/using-slack-cli-with-bolt-frameworks/).

### Installation

```bash
# macOS / Linux
curl -fsSL https://downloads.slack-dev.com/slack-cli/install.sh | bash
slack login
```

See: [Installing the Slack CLI (Mac & Linux)](https://docs.slack.dev/tools/slack-cli/guides/installing-the-slack-cli-for-mac-and-linux/)

---

## What the CLI Can Do

### For all app types (Deno, Bolt JS, Bolt Python)

| Command | What it does | Docs |
|---|---|---|
| [`slack create`](https://docs.slack.dev/tools/slack-cli/reference/commands/slack_create/) | Scaffolds a new app from a template (including Bolt JS/Python templates) | [Guide](https://docs.slack.dev/tools/slack-cli/guides/using-slack-cli-with-bolt-frameworks/) |
| [`slack run`](https://docs.slack.dev/tools/slack-cli/reference/commands/slack_run/) | Runs the app locally for development (Socket Mode) | [Developing locally](https://docs.slack.dev/tools/deno-slack-sdk/guides/developing-locally/) |
| `slack login` / [`slack auth`](https://docs.slack.dev/tools/slack-cli/reference/commands/slack_auth/) | Manages workspace authentication and tokens | |
| [`slack trigger`](https://docs.slack.dev/tools/slack-cli/reference/commands/slack_trigger/) | Creates and manages Triggers (event-driven entry points) | [Using triggers](https://docs.slack.dev/tools/deno-slack-sdk/guides/using-triggers/) |
| [`slack manifest`](https://docs.slack.dev/tools/slack-cli/reference/commands/slack_manifest/) | Validates and inspects app manifests | [App manifests](https://docs.slack.dev/app-manifests/) |

### Deno SDK apps only (not available for Bolt)

| Command | What it does | Docs |
|---|---|---|
| [`slack deploy`](https://docs.slack.dev/tools/slack-cli/reference/commands/slack_deploy/) | Deploys to Slack's managed Deno infrastructure | [Deploying to Slack](https://docs.slack.dev/tools/deno-slack-sdk/guides/deploying-to-slack/) |
| Local manifest as source of truth | The app manifest lives in code (`manifest.ts`) and syncs to Slack on deploy | [Configuring manifests](https://docs.slack.dev/app-manifests/configuring-apps-with-app-manifests/) |

### Bolt-specific behavior and limitations

When using the CLI with Bolt apps ([docs](https://docs.slack.dev/tools/slack-cli/guides/using-slack-cli-with-bolt-frameworks/)):

- **Scaffolding works:** `slack create` can generate Bolt JS and Bolt Python starter apps from templates.
- **Local dev works:** `slack run` starts the app locally via Socket Mode.
- **No `slack deploy`:** Bolt apps are self-hosted. You deploy them yourself (to your own server, Heroku, a laptop, etc.). The CLI cannot deploy Bolt apps to Slack's infrastructure.
- **Remote manifest:** Bolt apps default to using the Slack web dashboard as the source of truth for app configuration, not a local manifest file. The CLI can read the manifest but doesn't write it authoritatively.
- **Python caveat:** Bolt for Python apps don't get automatic dependency installation via the CLI — you manage your own `pip install` / virtual environment.

---

## What the CLI Cannot Do (Regardless of App Type)

- **Create multiple apps in one command.** Each `slack create` invocation scaffolds one app. There is no batch mode.
- **Manage OAuth scopes programmatically.** Scopes are configured via the [app settings dashboard](https://api.slack.com/apps) or the [`apps.manifest.*` Web API methods](https://docs.slack.dev/reference/methods/apps.manifest.create/), not the CLI.
- **Post messages or call arbitrary Web API methods.** The CLI is a development/deployment tool, not an API client. To call `chat.postMessage`, you use the [`@slack/web-api`](https://docs.slack.dev/tools/bolt-js/) or [`@slack/bolt`](https://docs.slack.dev/tools/bolt-js/getting-started/) packages in your app code.
- **Override bot identity per message.** The [`chat:write.customize`](https://docs.slack.dev/reference/scopes/chat.write.customize/) scope and `username`/`icon_url` parameters are runtime API features, not CLI features.

---

## Enterprise Grid Considerations

Since you have Enterprise Slack, a few things are relevant:

- **Org-level app approval:** Org Admins can [approve and install apps at the organization level](https://slack.com/help/articles/360000281563-Manage-apps-in-an-Enterprise-organization), cascading access to all workspaces. This simplifies deployment if you go the multi-app route — you don't need per-workspace approval for each bot.
- **Admin API methods:** The [`admin.apps.*`](https://api.slack.com/methods?filter=admin.apps) family of methods lets you programmatically approve, restrict, and manage app installations across the org. Useful if you're scripting the creation of multiple apps.
- **Org-level policies:** Admins can [set policies](https://slack.com/help/articles/360038559694-Set-organization-policies-for-apps-on-Enterprise-Grid) for which apps are pre-approved, which require review, etc.
- **Rate limits:** Enterprise Grid does **not** provide higher rate limits than standard Slack plans. The same [rate limit tiers](https://docs.slack.dev/apis/web-api/rate-limits/) apply.
- **Socket Mode:** Works the same on Enterprise Grid. See [Socket Mode docs](https://docs.slack.dev/apis/events-api/using-socket-mode/).

---

## Why the CLI Alone Won't Cover This Project

The Theater of the Future needs a runtime application that:

1. **Reads character configurations from Airtable** at startup
2. **Calls LLM APIs** (Claude or Gemini) with per-character system prompts to generate responses
3. **Posts messages to Slack** as different characters, using `username`/`icon_url` overrides via [`chat:write.customize`](https://docs.slack.dev/reference/scopes/chat.write.customize/)
4. **Listens to channel messages** and orchestrates bot-to-bot conversation with loop prevention
5. **Runs custom director logic** to decide which characters speak when

The CLI is a **development and scaffolding tool**, not a runtime. It can help you *set up* the project (scaffold a Bolt app, run it locally during development), but the actual bot behavior — LLM calls, Airtable reads, identity overrides, conversation orchestration — is all application code running in a Bolt app.

### Where the CLI fits in the workflow

```
CLI territory                          App code territory
─────────────                          ──────────────────
slack create my-theater-bot            Airtable config fetching
slack run (local dev)                  LLM API calls (Claude/Gemini)
slack auth (token management)          chat.postMessage with identity overrides
                                       Conversation orchestration / director logic
                                       Loop prevention
                                       Channel event handling
```

The CLI is a useful **starting point** — `slack create` with a Bolt JS template will scaffold the boilerplate, and `slack run` will handle Socket Mode connection during development. But the substantive work of the project lives in application code that the CLI doesn't touch.

### Recommended workflow using the CLI

1. `slack create theater-bot --template bolt-js` — scaffold the app
2. Add scopes (`chat:write`, `chat:write.customize`, `channels:history`, `channels:read`, `connections:write`) via the [app settings dashboard](https://api.slack.com/apps) or [`apps.manifest.update`](https://docs.slack.dev/reference/methods/apps.manifest.update/)
3. `slack run` — develop and test locally via Socket Mode
4. Write all bot logic (Airtable integration, LLM calls, identity overrides, director logic) as application code within the scaffolded Bolt app
5. For the class session: run the app from a laptop via `slack run` or `node app.js` — no deployment infrastructure needed

---

## Summary Table

| "Can the CLI do X?" | Answer |
|---|---|
| Scaffold a Bolt JS/Python app | Yes |
| Run a Bolt app locally (Socket Mode) | Yes |
| Deploy a Bolt app to a server | No — self-host |
| Create multiple apps at once | No — one at a time |
| Manage OAuth scopes | No — use dashboard or Web API |
| Post messages as different personas | No — runtime app code |
| Call LLM APIs | No — runtime app code |
| Read from Airtable | No — runtime app code |
| Orchestrate bot-to-bot conversation | No — runtime app code |

---

## References

- [Slack CLI Overview](https://docs.slack.dev/tools/slack-cli/)
- [Using Slack CLI with Bolt Frameworks](https://docs.slack.dev/tools/slack-cli/guides/using-slack-cli-with-bolt-frameworks/)
- [Slack CLI Installation (Mac/Linux)](https://docs.slack.dev/tools/slack-cli/guides/installing-the-slack-cli-for-mac-and-linux/)
- [Bolt for JavaScript — Getting Started](https://docs.slack.dev/tools/bolt-js/getting-started/)
- [App Manifests](https://docs.slack.dev/app-manifests/configuring-apps-with-app-manifests/)
- [`apps.manifest.create` API Method](https://docs.slack.dev/reference/methods/apps.manifest.create/)
- [`chat:write.customize` Scope](https://docs.slack.dev/reference/scopes/chat.write.customize/)
- [Socket Mode](https://docs.slack.dev/apis/events-api/using-socket-mode/)
- [Rate Limits](https://docs.slack.dev/apis/web-api/rate-limits/)
- [Enterprise Grid App Management](https://slack.com/help/articles/360000281563-Manage-apps-in-an-Enterprise-organization)
- [Enterprise Grid App Policies](https://slack.com/help/articles/360038559694-Set-organization-policies-for-apps-on-Enterprise-Grid)
- [Next-Gen Platform Overview](https://api.slack.com/automation/intro)
- [Slack Quickstart](https://docs.slack.dev/quickstart/)
