configuration
slk reads a single TOML file at ~/.config/slk/config.toml.
Every key is optional — sensible defaults cover everything. This page
walks through each section in the order you'd typically reach for it.
Copy this into ~/.config/slk/config.toml as a starting point, then trim what you don't need.
[general]
default_workspace = "myteam"
use_slack_sections = true # use real Slack sidebar sections (default).
# set false to use [sections.*] globs instead.
[appearance]
theme = "dracula"
timestamp_format = "3:04 PM"
image_protocol = "auto" # auto | kitty | sixel | halfblock | off
max_image_rows = 20 # cap inline image height in terminal rows
max_image_cols = 60 # cap inline image width in terminal columns
[sidebar]
hide_inactive_after_days = 30 # auto-hide stale channels; 0 disables
[animations]
enabled = true
smooth_scrolling = true
typing_indicators = true
[notifications]
enabled = true
on_mention = true
on_dm = true
on_keyword = ["deploy", "incident"]
quiet_hours = "22:00-08:00" # planned
[cache]
message_retention_days = 30
max_db_size_mb = 500
max_image_cache_mb = 200
[sections.Alerts]
channels = ["alerts", "ops", "*-alerts"]
order = 1
[sections.Engineering]
channels = ["eng-*", "deploys", "bugs"]
order = 2
# Per-workspace overrides — slug is whatever you chose at --add-workspace
# time; team_id ties it to the underlying Slack workspace.
[workspaces.work]
team_id = "T01ABCDEF"
order = 1 # rail position; 1-based, used by 1-9 keys
theme = "dracula"
use_slack_sections = false # this workspace uses [sections.*] globs;
# other workspaces still use Slack sections
[workspaces.work.sections.Engineering]
channels = ["eng-*", "deploys"]
order = 1
[theme]
primary = "#4A9EFF"
accent = "#50C878"
background = "#1A1A2E"
text = "#E0E0E0"
Workspace-wide defaults.
default_workspace — name of the workspace to focus on launch. Useful when you have many connected workspaces and always start in the same one.use_slack_sections — when true (the default), slk reads your real Slack sidebar sections directly from the API and keeps them live over WebSocket. Any [sections.*] blocks in this file are ignored in that mode. Set to false globally — or per-workspace under [workspaces.<slug>] — to use the glob-based [sections.*] tables instead.How slk looks at the surface level.
theme — name of any built-in or custom theme. See all 35 built-in themes. Live-switch at runtime with Ctrl+y.timestamp_format — Go time-format string. "3:04 PM" for 12-hour, "15:04" for 24-hour, "15:04:05" if you want seconds.image_protocol — how inline images render. auto picks kitty graphics on capable terminals (kitty, ghostty, recent WezTerm), sixel on foot/mlterm, half-block (▀) everywhere else. Force one with kitty / sixel / halfblock, or disable inline images entirely with off. Inside tmux, slk falls back to half-block automatically.max_image_rows — cap inline image height in terminal rows so a tall screenshot doesn't eat the message pane.max_image_cols — cap inline image width in terminal columns. Defaults to 60; the image is also bounded by the available message-pane width when narrower.Keep the channel list focused on what you actually use.
hide_inactive_after_days — auto-hide channels whose last-read timestamp is older than this many days. Defaults to 30; set to 0 to disable. Channels matching a custom [sections.*] glob, channels with unread messages, and the currently-selected channel are never hidden regardless of this setting.If your terminal is slow or you find motion distracting, set enabled = false and the others stop applying.
enabled — master switch. true by default.smooth_scrolling — interpolated scrolling vs. line-at-a-time jumps.typing_indicators — show "@dani is typing…" pulses.OS-level desktop notifications. Suppressed automatically when you're focused on the relevant channel.
enabled — master switch.on_mention — fire on @you, @here, @channel.on_dm — fire on direct messages.on_keyword — list of strings; fires whenever a message contains any of them. Case-insensitive.quiet_hours — planned. A "HH:MM-HH:MM" window during which all notifications are suppressed.slk keeps a local SQLite cache of message history. These knobs control how aggressive it is.
message_retention_days — how many days of scrollback to keep. Older messages are evicted on the next backfill.max_db_size_mb — hard cap on the cache file size. When hit, the oldest messages are dropped first.max_image_cache_mb — hard cap on the inline image LRU cache at ~/.cache/slk/images/. Defaults to 200 MB.By default (use_slack_sections = true) slk reads your actual Slack sidebar sections — names, emoji, linked-list order, and channel/DM membership — and keeps them in sync over WebSocket. Reorder, rename, create, or delete sections in any other Slack client; slk catches up within a couple of seconds. Editing is read-only for v1: you do it in the official client, slk reflects the result.
Set use_slack_sections = false globally, or under a single [workspaces.<slug>], to opt that scope into the glob-based tables instead. Globs are also used as a fallback when Slack's section API is unreachable.
# Only consulted when use_slack_sections = false (globally or # per-workspace), or when Slack's section API is unreachable. [sections.Alerts] channels = ["alerts", "ops", "*-alerts"] order = 1 [sections.Engineering] channels = ["eng-*", "deploys", "bugs"] order = 2
channels — a list of glob patterns. Any channel matching one is rolled into this section.order — sort key. Lower numbers appear higher in the sidebar.Alerts, Engineering).stars, slack_connect, salesforce_records, and agents are hidden (matching the official client). Sections with more than 10 channels may load partially on first connect; missing channels temporarily fall into the catch-all bucket and migrate as WebSocket events fire.If you live in more than one Slack workspace, you can give each one its own rail position, theme, sidebar mode, and channel sections. The slug is whatever you typed at --add-workspace time; team_id ties it to the underlying Slack workspace.
[workspaces.work]
team_id = "T01ABCDEF"
order = 1 # rail position; 1-based, used by 1-9 keys
theme = "dracula" # overrides [appearance].theme
use_slack_sections = false # this workspace uses [sections.*] globs;
# other workspaces still use Slack sections
[workspaces.work.sections.Alerts]
channels = ["alerts", "*-alerts"]
order = 1
[workspaces.work.sections.Engineering]
channels = ["eng-*", "deploys"]
order = 2
# A second workspace, ordered after the first, with no per-workspace
# sections — falls back to the global [sections.*] above.
[workspaces.side]
team_id = "T02XYZ"
order = 2
order — controls position in the rail and the digit-key mapping (1–9). Lower numbers come first; workspaces without an order sort after explicitly ordered ones, alphabetically by slug. The order is stable across runs regardless of which WebSocket connects first.theme — overrides [appearance].theme for this workspace only.use_slack_sections — overrides the global [general].use_slack_sections. Set to false here to use this workspace's [workspaces.<slug>.sections.*] globs while the rest of your workspaces keep using Slack-native sections.[workspaces.<slug>.sections.*] blocks fully replace the global [sections.*] for that workspace. Workspaces with no per-workspace sections fall back to the global table.[workspaces.T01ABCDEF]) keep working unchanged.If you like a built-in theme but want to nudge a few colors, set them under [theme]. They override the active theme's values, leaving everything else intact.
[theme] primary = "#4A9EFF" accent = "#50C878" background = "#1A1A2E" text = "#E0E0E0"
For a full theme — every color, sidebar variants, etc. — write a custom theme file instead (next section).
Drop a .toml file into ~/.config/slk/themes/ to add a new theme. The filename (minus extension) is the theme's slug; set theme = "<slug>" under [appearance] to use it.
name = "My Theme" [colors] primary = "#BD93F9" accent = "#50FA7B" warning = "#FFB86C" error = "#FF5555" background = "#282A36" surface = "#343746" surface_dark = "#21222C" text = "#F8F8F2" text_muted = "#6272A4" border = "#44475A" # Optional: separate sidebar/rail palette so the sidebar can be darker # than the message pane (Slack's default look). Falls back to # background/text/text_muted/surface_dark when omitted. sidebar_background = "#19171D" sidebar_text = "#D1D2D3" sidebar_text_muted = "#9A9B9E" rail_background = "#19171D"
slk follows the XDG base directory spec.
| Path | Contents |
|---|---|
~/.config/slk/ | Configuration, custom themes |
~/.local/share/slk/ | SQLite cache, tokens |
~/.cache/slk/ | Avatars, image cache |
Stuck or want a key documented that's not here? Open an issue.