Slack browse + post
mnml-msg-slack is a terminal browse + post client for Slack. List your channels + DMs, peek the latest 30 messages in any channel, run interactive search, post messages, reply in threads, react with a quick-pick of common emojis, and copy permalinks to the clipboard. Runs standalone in any terminal.
┌─ slack — Acme ───────────────────────────────────────────────────────────┐│ ▸1.channels (37) 2.dms (12) 3.search (0) 4.threads │└──────────────────────────────────────────────────────────────────────────┘┌─ channels (37) ───────────────┐ ┌─ #general ──────────────────────────┐│ ▸ #general │ │ 09:14:22 chrism morning team ││ #announcements │ │ 09:18:01 alice heads up... ││ #eng-platform │ │ 09:24:33 bob ↳3 thread ││ #random │ │ 09:42:11 carol shipped 1.2 │└───────────────────────────────┘ └─────────────────────────────────────┘ 1-9 tab · Enter open · / search · p post · R react · T thread · y permalink · r refresh · q quitInstall
Section titled “Install”cargo install --git https://github.com/chris-mclennan/mnml-msg-slack mnml-msg-slackmnml-msg-slack --installSlack tokens live behind app creation. Five steps:
-
Visit https://api.slack.com/apps → Create New App → From scratch. Pick a workspace.
-
OAuth & Permissions → Scopes → User Token Scopes. Add:
channels:read·channels:history·groups:read·groups:history·im:read·im:history·mpim:read·mpim:history·search:read·chat:write·reactions:read·reactions:write·users:read -
OAuth Tokens for Your Workspace → Install to Workspace. Approve.
-
Copy the User OAuth Token (starts with
xoxp-…). -
Export + verify:
Terminal window export SLACK_USER_TOKEN=xoxp-...mnml-msg-slack --check
SLACK_BOT_TOKEN (xoxb-…) is a fallback but search.messages requires the user token.
Config
Section titled “Config”~/.config/mnml-msg-slack/config.toml (scaffolded on first run):
refresh_interval_secs = 60post_multiline = false
[[tabs]]name = "channels"kind = "channels"
[[tabs]]name = "dms"kind = "dms"
[[tabs]]name = "search"kind = "search"Tab kinds
Section titled “Tab kinds”kind | What it shows |
|---|---|
channels | Public + private channels you’re a member of |
dms | 1:1 DMs + multi-person group DMs |
search | Interactive search.messages query (/ to enter) |
threads | v0.2 stub — will surface unread thread replies |
| Chord | Action |
|---|---|
1-9 / Tab | Switch tabs |
↑ / k, ↓ / j | Move selection |
PgUp / PgDn, g / G | Jump 10 rows / top / bottom |
Enter | Open channel / thread |
/ | Search input (Enter = submit, Esc = cancel) |
p | Post — type + Enter sends chat.postMessage |
R | Reaction picker (12 quick emojis; ←→ pick, Enter react) |
T | Thread reply — same as p with thread_ts set |
y | Yank permalink for the focused message |
r | Force-refresh (bypasses the 5-min conversation-list cache) |
q / Esc / Ctrl+C | Quit |
Two run modes
Section titled “Two run modes”Standalone
Section titled “Standalone”mnml-msg-slackHosted as a mnml Pty pane
Section titled “Hosted as a mnml Pty pane”:term mnml-msg-slackOr <leader>iS after mnml-msg-slack --install.
Caching + rate limits
Section titled “Caching + rate limits”conversations.listcached in-memory for 5 minutes;rforces refresh.- User-id → name lookups cached per session (lazy on first sight).
- On HTTP 429, status bar shows
slack: rate-limited, retry in Ns(fromRetry-After). v0.1 does not auto-retry.
Security
Section titled “Security”The user token (xoxp-…) has broad access — treat it like a password. Store in a keychain, not a dotfile. Revoke unused tokens at api.slack.com → your app → OAuth & Permissions → Revoke Tokens.