A terminal Slack client built on Textual
Project description
slak
A terminal Slack client built on Textual.
Unofficial. Uses Slack's internal browser protocol and may violate Slack's TOS. Not affiliated with Slack Technologies, LLC.
Features
Keyboard-first. Borderless Textual UI — workspace rail, channel sidebar, message
pane, compose. The compose box is focused on launch, so you just start typing. Tab
cycles focus, Ctrl+P opens the command palette (every action), and F1 shows the
full keybinding reference.
Workspaces & navigation
- Multiple workspaces with concurrent live connections;
Alt+1…Alt+9jump,Ctrl+Wopens a filterable switcher. Ctrl+Kfuzzy channel/DM finder;Alt+←/Alt+→walk channel history;Ctrl+Btoggles the sidebar,Ctrl+Tthe thread panel.- Cache-first startup: your last context renders instantly while sync runs behind it.
Messaging
- Send, edit (
Ctrl+E), and delete messages; reactions (Ctrl+R); threads with a follow-the-cursor reply panel. Ctrl+Nnew-message composer (DM and group DM);@/:mention & emoji autocomplete;Ctrl+Oopens link(s) in a message;Spacepreviews image attachments.- In-channel (
Ctrl+F) and workspace-wide (Ctrl+Shift+F) search. - Typing indicators, both directions.
Sidebar
- Slack-native sections (
users.channelSections.list, linked-list order) with a pinned★ Starredsection, or config-glob sections ([sections.<name>]) as a fallback — grouped, collapsible, live-updated on section/star events. - A
⚑ Threadsrow opens the threads view (your subscribed threads, newest-reply first). DM and group-DM names are resolved to member display names.
Rendering
- Slack markdown, mentions, custom emoji (inline images on kitty), and Block Kit / legacy attachments (headers, sections, fields, context, dividers, controls).
- Inline images for files and attachments — kitty graphics on kitty,
▀half-blocks on any truecolor terminal. Spacepreviews the selected message's image full-screen. Default is an in-terminal preview (works over SSH); set[appearance] image_preview = guito open it in an external viewer on the local machine instead.- ~70-slot color themes (12 built-in incl. terminal-following
ansi-dark/ansi-light, plus~/.config/slak/themes/*.tomland[theme]overrides), switched live withCtrl+Y; the sidebar is auto-kept contrasting (CIELAB). - Optional user avatars beside messages (
[appearance] avatars = on, off by default) — rendered as 4×2 half-blocks in a left gutter. - Optional coloured author names (
[appearance] colored_names = true, off by default) — each name tinted by a deterministic hash of the user id. - Local nicknames —
Ctrl+Gon a message renames its author just for you (stored by user id in[nicknames]); the nickname shows everywhere that name does. - Private channels show a padlock — the single-width `` glyph when an installed
font covers it (Nerd Font / FontAwesome, detected via fontconfig), else a narrow
⚿fallback (`[appearance] nerd_font = auto|on|off`).
Realtime & integration
- RTM with exponential-backoff reconnection and missed-history backfill.
- Desktop notifications, presence/DND, terminal tab-title unread indicator.
- Opt-in embedded MCP server (
[mcp] enabled = true) — an AI client reads your context (slak_get_context) and drafts a reply (slak_set_draft, draft-only). Run the adapter withslak --mcp(pip install 'slak[mcp]').
Underneath: a pluggable SlackClient (browser-cookie auth, with an in-memory fake
for offline/dev), a self-healing SQLite cache (WAL + FTS5), and round-trippable TOML
config. ~340 tests.
Not yet wired: the sixel image protocol (half-blocks cover non-kitty terminals).
Install
Recommended — pipx installs it isolated and puts slak
on your PATH globally:
pipx install slak
pipx install 'slak[mcp]' # with the optional MCP adapter
Or with pip (ideally in a virtualenv):
pip install slak
Debian / Ubuntu (.deb)
Build a self-contained package (bundles slak + all deps in a private venv under
/usr/lib/slak; depends only on the matching system python3.X):
packaging/build-deb.sh # -> dist/slak_<version>_<arch>.deb
sudo dpkg -i dist/slak_*.deb # or: sudo apt install ./dist/slak_*.deb
slak
Build it on the same Ubuntu/Debian release you install on — the bundle is tied to
that release's Python minor version and CPU architecture. Remove with
sudo apt remove slak.
Nix
A flake is provided:
nix run github:Frodotus/slak # run without installing
nix profile install github:Frodotus/slak
nix develop # dev shell with deps + pytest
Either way you get a slak command:
slak --help
Use a real workspace
slak --add-workspace # paste your browser xoxc token + d cookie
slak # connects to it (falls back to demo if no token)
slak --demo # always use the seeded demo workspace
Develop
python3 -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"
python -m slak # run against a seeded demo workspace
textual run --dev slak/dev.py # run with live CSS hot-reload
textual console # (separate terminal) stream logs
pytest # run the test suite
The look is themeable CSS — edit slak/ui/styles/app.tcss while running under
--dev to restyle instantly.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file slak-0.1.5.tar.gz.
File metadata
- Download URL: slak-0.1.5.tar.gz
- Upload date:
- Size: 155.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
46b6f6e1475c88a1fb116b871ccb08b2f6472e8050ae67c0a0519ed71bfe25b6
|
|
| MD5 |
d0754d4ada4bafce3188777846c507b1
|
|
| BLAKE2b-256 |
e6e9c21a31e12c619ff109879b4c9efda1cf119c6d3a031113b4298e596b2f00
|
Provenance
The following attestation bundles were made for slak-0.1.5.tar.gz:
Publisher:
release.yml on Frodotus/slak
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
slak-0.1.5.tar.gz -
Subject digest:
46b6f6e1475c88a1fb116b871ccb08b2f6472e8050ae67c0a0519ed71bfe25b6 - Sigstore transparency entry: 1850123267
- Sigstore integration time:
-
Permalink:
Frodotus/slak@b8e0a55b15afab807d773a64d234fae9ec9fd2f3 -
Branch / Tag:
refs/tags/v0.1.5 - Owner: https://github.com/Frodotus
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b8e0a55b15afab807d773a64d234fae9ec9fd2f3 -
Trigger Event:
push
-
Statement type:
File details
Details for the file slak-0.1.5-py3-none-any.whl.
File metadata
- Download URL: slak-0.1.5-py3-none-any.whl
- Upload date:
- Size: 122.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e4fbd4d7035fb8bf9eb7004b40645a8243849c06cdd5d84520ff8516c332d433
|
|
| MD5 |
2ad291261e435dfd1abf161320cd9890
|
|
| BLAKE2b-256 |
4fe431ca20df86719c853d3f890a813e3b4d66836d3913a3c1ea628a5599e9a6
|
Provenance
The following attestation bundles were made for slak-0.1.5-py3-none-any.whl:
Publisher:
release.yml on Frodotus/slak
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
slak-0.1.5-py3-none-any.whl -
Subject digest:
e4fbd4d7035fb8bf9eb7004b40645a8243849c06cdd5d84520ff8516c332d433 - Sigstore transparency entry: 1850123710
- Sigstore integration time:
-
Permalink:
Frodotus/slak@b8e0a55b15afab807d773a64d234fae9ec9fd2f3 -
Branch / Tag:
refs/tags/v0.1.5 - Owner: https://github.com/Frodotus
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b8e0a55b15afab807d773a64d234fae9ec9fd2f3 -
Trigger Event:
push
-
Statement type: