Skip to content

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 quit
Terminal window
cargo install --git https://github.com/chris-mclennan/mnml-msg-slack mnml-msg-slack
mnml-msg-slack --install

Slack tokens live behind app creation. Five steps:

  1. Visit https://api.slack.com/appsCreate New App → From scratch. Pick a workspace.

  2. OAuth & PermissionsScopes → 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

  3. OAuth Tokens for Your Workspace → Install to Workspace. Approve.

  4. Copy the User OAuth Token (starts with xoxp-…).

  5. 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/mnml-msg-slack/config.toml (scaffolded on first run):

refresh_interval_secs = 60
post_multiline = false
[[tabs]]
name = "channels"
kind = "channels"
[[tabs]]
name = "dms"
kind = "dms"
[[tabs]]
name = "search"
kind = "search"
kindWhat it shows
channelsPublic + private channels you’re a member of
dms1:1 DMs + multi-person group DMs
searchInteractive search.messages query (/ to enter)
threadsv0.2 stub — will surface unread thread replies
ChordAction
1-9 / TabSwitch tabs
/ k, / jMove selection
PgUp / PgDn, g / GJump 10 rows / top / bottom
EnterOpen channel / thread
/Search input (Enter = submit, Esc = cancel)
pPost — type + Enter sends chat.postMessage
RReaction picker (12 quick emojis; ←→ pick, Enter react)
TThread reply — same as p with thread_ts set
yYank permalink for the focused message
rForce-refresh (bypasses the 5-min conversation-list cache)
q / Esc / Ctrl+CQuit
Terminal window
mnml-msg-slack
:term mnml-msg-slack

Or <leader>iS after mnml-msg-slack --install.

  • conversations.list cached in-memory for 5 minutes; r forces refresh.
  • User-id → name lookups cached per session (lazy on first sight).
  • On HTTP 429, status bar shows slack: rate-limited, retry in Ns (from Retry-After). v0.1 does not auto-retry.

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.

github.com/chris-mclennan/mnml-msg-slack. MIT.