SlackCLI is a single binary that reads, sends, searches and replies across one or many Slack workspaces, straight from your terminal. It signs in with the session you already have, so there is no Slack app to register and nothing to get approved. Every command speaks JSON, which is what makes it usable by a script or an AI agent as easily as by you.
You are in the terminal. The answer is in Slack. So you switch, get pulled into three other threads, and come back having forgotten what you were doing. The cost is not the reading, it is the re-entry.
slackcli conversations unreadEvery other route into Slack starts with registering an app, picking OAuth scopes, and waiting for a workspace admin who has better things to do. Most useful automation dies right there, unbuilt.
slackcli auth login-autoYour AI agent can read the whole repository and still miss the thread that explains why the code is that way. Slack is where the context lives, and most tooling cannot get at it without a webhook server.
slackcli search messages … --jsonslackcli conversations unreadRead a channel or a threadslackcli conversations read --permalink="$LINK"Reply, edit, or reactslackcli messages send --message="On it"Search the whole workspaceslackcli search messages "release notes"Find a channel or a personslackcli search people "ada"Upload a file with a messageslackcli messages send --file=./report.pdfPost rich Block Kit contentslackcli messages send --blocks=@blocks.jsonRead a Canvas as Markdownslackcli canvas read F0123456789Work through saved for laterslackcli saved list --state=to_doJuggle several workspacesslackcli conversations list --workspace=acmeAlsofiles·custom emoji·user groups·team info·paste a Slack link anywhere an ID goes
--json is not bolted onto the read commands alone. send, edit and draft echo back what they wrote, so a later step can edit or react to the exact message. Exit codes are meaningful, so a pipeline can branch on failure instead of grepping stderr.
# post, then keep the handle for a later step sent=$(slackcli messages send --recipient-id=C123 \ --message="Deploying now" --json) slackcli messages react --permalink="$(jq -r .permalink <<<"$sent")" \ --emoji=eyes
SlackCLI ships a Claude Code plugin with a /slackcli skill, so an agent can catch up on a channel, pull the thread behind an incident, and post the summary back, without you writing a single command for it.
It works the same for anything that can run a binary and parse JSON: a cron job, a CI step, a Makefile target. No webhook server, no callback URL, no public endpoint.
# turn today's unreads into a digest slackcli conversations unread --json \ | jq '[.unread_channels[] | {name, unread_count}]'
A browser window opens, you sign in the way you always do, and SlackCLI keeps the session tokens for every workspace on that account. It acts as you, so it can do exactly what you can do, and nothing you could not.
slackcli auth login-autoIf you already have an xoxb or xoxp token, hand it over. It is validated against Slack before anything is written to disk, so a bad token fails at sign-in rather than at three in the morning.
slackcli auth login --token="xoxb-..." \ --workspace-name="My Team"
--workspace.Stored at~/.config/slackcli/workspaces.jsonmode 0600, never printed back
One formula, and brew upgrade slackcli keeps it current. There is no runtime to install alongside it: SlackCLI ships as a single self-contained binary.
brew tap shaharia-lab/tap && brew install slackcli
curl -L https://github.com/shaharia-lab/slackcli/releases/download/v0.16.0/slackcli-macos-arm64 -o slackcli chmod +x slackcli mkdir -p ~/.local/bin && mv slackcli ~/.local/bin/
xattr -d com.apple.quarantine ~/.local/bin/slackcli
Apple menu, About This Mac, tells you which chip you have. Homebrew above picks for you.
curl -L https://github.com/shaharia-lab/slackcli/releases/download/v0.16.0/slackcli-linux -o slackcli chmod +x slackcli mkdir -p ~/.local/bin && mv slackcli ~/.local/bin/
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc && exec $SHELL
Works on any distribution. The binary bundles its own runtime, so there is no Node.js or Bun to install.
Homebrew is not an option here, so the binary is the route. WSL users want the Linux build instead.
Thenslackcli auth login-auto·Verify with checksums.txt ↗·Build from source
No, and that is the point. Run slackcli auth login-auto, sign in to Slack in the browser window that opens, and SlackCLI captures the session tokens for every workspace on that account. No app to register, no OAuth scopes to justify, no admin approval to wait for. If you would rather use a real Slack app token (xoxb or xoxp), that works too and is the better choice for CI and service accounts.
Authentication ↗No. SlackCLI is an unofficial, MIT-licensed project and is not affiliated with, endorsed by, or supported by Slack Technologies. Slack ships its own CLI, and it is a different tool for a different job: theirs is for building and deploying Slack apps, this one is for driving a workspace you already belong to.
Documentation ↗Credentials live in ~/.config/slackcli/workspaces.json, in a directory created with mode 0700 and a file with mode 0600. SlackCLI never prints a token value, and it talks to exactly two hosts: Slack, and GitHub for the daily update check, which you can ignore. There is no account, no telemetry and no server in the middle. Treat that config directory as sensitive, because anything that can read it can act as you in Slack.
Where credentials live ↗Yes, that is a first-class use case rather than an afterthought. Every command that returns data speaks --json, and so do the commands that write: send, edit and draft echo back what they just wrote, so a later step can edit or react to it. Exit codes are meaningful, so a pipeline can branch on failure. SlackCLI also ships a Claude Code plugin whose /slackcli skill lets an agent read, post and search a workspace without you writing the commands.
Scripting and JSON ↗Both. Every workspace you authenticate is stored under its own profile key, the first one becomes the default, and every command that talks to Slack accepts --workspace <id|name>. That means one machine can hold your own account, a bot token for automation, and a second company's workspace side by side, and each command picks the one it needs.
Workspaces and profiles ↗Eleven command groups: list channels and DMs, read history and threads, see what is unread, send and reply and edit and react, upload files, post Block Kit, search messages and channels and people, read your saved-for-later list, read a Canvas as Markdown, inspect and download files, list custom emoji, manage user groups, and update itself. Anywhere a command wants a channel ID or a timestamp, you can paste a Slack permalink instead.
Every command ↗Stars are how the next person drowning in Slack finds this. It is the whole of the distribution: no ad budget, no launch post, nothing tracking you here.
One command to install, one to sign in, and the next time somebody asks what happened in #incidents you can answer without leaving the shell.