slack-block-kit

v1.0.0

Send rich Slack Block Kit messages — native tables, structured layouts. Use when formatting tabular data for Slack, sending Block Kit payloads, or when markd...

0· 175· 1 versions· 0 current· 0 all-time· Updated 1mo ago· MIT-0

Slack Block Kit

Send native Block Kit payloads to Slack. Primary use case: tables (Slack's native table block type).

When to Use

  • Tabular data in Slack (financial summaries, comparison grids, status dashboards)
  • Markdown tables render poorly or not at all in Slack — use Block Kit tables instead

Sending Block Kit Tables

Quick Path: scripts/table.mjs

Generate table JSON from headers + rows:

node <skill_dir>/scripts/table.mjs \
  --headers '["Source","Amount","Status"]' \
  --rows '[["Mochary","$11K","Pending"],["MHC","$13.4K","Invoiced"]]' \
  --align '1:right' \
  --compact --blocks-only

Options:

  • --headers '["H1","H2"]' — first row (bold by default)
  • --rows '[["a","b"],["c","d"]]' — data rows
  • --json '{"headers":[...],"rows":[...]}' — single JSON input
  • --stdin — read JSON from stdin
  • --align '<col>:<left|center|right>,...' — column alignment (0-indexed)
  • --wrap '<col>,...' — columns to wrap text
  • --no-bold-headers — plain text headers
  • --compact — minified JSON
  • --blocks-only — output just the blocks array (for API calls)

Empty cells are handled automatically (zero-width space).

Posting to Slack

The message tool does not pass blocks through. Use the Slack API directly:

BLOCKS=$(node <skill_dir>/scripts/table.mjs --compact --blocks-only \
  --headers '["Col A","Col B"]' \
  --rows '[["val1","val2"]]')

curl -s -X POST https://slack.com/api/chat.postMessage \
  -H "Authorization: Bearer $SLACK_BOT_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$(jq -n \
    --arg channel "$CHANNEL_ID" \
    --arg thread "$THREAD_TS" \
    --argjson blocks "$BLOCKS" \
    '{channel: $channel, thread_ts: $thread, text: "Fallback text", blocks: $blocks}')"

The bot token is in openclaw.json at channels.slack.botToken. The text field is required (accessibility fallback) but won't display when blocks render.

Table Block Constraints

  • 1 table per message (Slack limit)
  • Max 100 rows, max 20 columns
  • Cells: raw_text (plain) or rich_text (bold, links, mentions)
  • Empty text is not allowed — the script uses zero-width spaces automatically

Combining Text + Table

Post your text message first via message tool, then post the table in the same thread via curl. Or include a section block before the table in the blocks array.

Manual Block Kit JSON

For non-table blocks or custom layouts, construct the JSON directly. Reference: https://docs.slack.dev/reference/block-kit/blocks/table-block/

Cell with bold text:

{"type": "rich_text", "elements": [{"type": "rich_text_section", "elements": [{"type": "text", "text": "Bold", "style": {"bold": true}}]}]}

Plain text cell:

{"type": "raw_text", "text": "Plain"}

Version tags

latestvk97bkkqcqdzxhswamafy79q3018343by