formatting-slack-messages
Skill727 starsChanged yesterdayMITView on GitHub
Builds and validates Slack Block Kit messages, modals, and App Home layouts. Use for Slack formatting, block selection, Markdown, cards, tables, charts, metadata, buttons, and menus. Covers live schemas, payload validation, accessibility, and actual Slack rendering. Not for workspace setup.
We split this skill into the rules it gives an agent
31 rules. About 0 are common, 26 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈26
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 27
Ask only when missing information changes the implementation.
- Distinctive: line 33
Use the Block Kit index to find the current component pages.
- Distinctive: line 36
Follow index links rather than guessing slugs.
- Distinctive: line 39
Check required fields, allowed nesting, text types, limits, and supported surfaces separately.
- Distinctive: line 40
Do not treat this skill's comparison tables as permanent schemas.
- Distinctive: line 65
Use block selection for limits, table comparisons, and template patterns.
- Distinctive: line 66
Keep required findings visible outside carousels, pagination, and collapsed groups.
- Distinctive: line 67
Do not add dividers between every block or put a one-line notice in a card without a reason.
- Distinctive: line 68
Use a consistent size and hierarchy across comparable messages.
- Distinctive: line 69
Keep at most one visually primary action per message or view.
- Distinctive: line 74
Use task cards for work with progress updates.
- Distinctive: line 81
Avoid repeating the same title, link, or value in adjacent blocks unless it answers a different question.
- Distinctive: line 82
Keep required information and actions outside collapsed or paginated detail.
- Distinctive: line 83
Use consistent widths and emphasis for comparable items.
- Distinctive: line 87
Use inline code for identifiers, literal values, names, or short phrases when that emphasis helps the reader.
- Distinctive: line 88
Keep surrounding text regular.
- Distinctive: line 89
Follow the user's chosen emphasis style.
- Distinctive: line 90
Use descriptive action labels and avoid duplicate navigation controls.
- Very specific: line 99
Do not pass one format into another unchanged.
- Very specific: line 100
Keep dynamic text separate from formatting syntax.
- Very specific: line 102
Use Unicode emojis or supported emoji elements.
- Distinctive: line 108
Check labels, units, image size, and readability on narrow screens.
- Very specific: line 111
Do not clear top-level text only to remove duplication.
- Distinctive: line 117
Use blocks.validate with concrete values in place of placeholders.
- Distinctive: line 118
Read the live method reference before choosing request parameters.
- Distinctive: line 126
If a Slack CLI is available, read its help before using its API or authentication flags.
- Distinctive: line 127
Do not hardcode CLI flags from memory.
- Very specific: line 131
Check supported surfaces and count limits independently, including nested blocks.
- Distinctive: line 137
Use Block Kit Builder to inspect the intended surface with representative sample content.
- Distinctive: line 138
If the user authorizes a live message, send the payload to the authorized destination and inspect its rendering.
- Distinctive: line 150
Keep essential content visible in the initial layout.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Formatting Slack messages
Build a layout that makes the result, its context, and the next action clear. This workflow adapts Slack's official Block Kit skill. It is self-contained; another installed skill is not required. See sources for upstream attribution.
1. Identify the surface and the change
Infer the surface from the request or existing payload:
- A message has
blocksorattachmentsand goes to a channel or direct message. - A modal has
type: modaland a view lifecycle. - An App Home view has
type: homeand is published for a user.
Inspect the existing payload before changing its layout.
For modifications, preserve unchanged content, source links, block_id, action_id, values, and menu choices.
Ask only when missing information changes the implementation. Do not repeat questions the user already answered.
For a clear small edit, read the relevant schema, make the edit, and validate it.
For a broad redesign, establish the content order before building the payload.
2. Read live schemas
Use the Block Kit index to find the current component pages.
Fetch each selected block, element, and composition object's schema and example.
Append .md to Slack documentation URLs when a Markdown response is easier to read.
Follow index links rather than guessing slugs; select menus share one reference page.
Reuse pages already read during the task.
Check required fields, allowed nesting, text types, limits, and supported surfaces separately. Do not treat this skill's comparison tables as permanent schemas.
Common errors:
markdownis a block type. It is not a text-object type.- Text objects use
plain_textormrkdwn. Atextelement is valid inside the appropriaterich_textstructure, not as a standalone block. - Valid JSON does not establish valid Block Kit.
- A schema-validation success does not establish surface compatibility or block-count compliance.
3. Match the structure to the content
| Content | Starting point |
| One change or important number | A short sentence with its comparison and units |
| Independent facts about one item | section.fields with short labels and values |
| Several comparable rows | table |
| Rows that need sorting, pagination, filtering, or row actions | data_table |
| A compact entity with a short body and a few buttons | card |
| Optional peer items for browsing | A carousel of cards |
| A related group of blocks | container |
| A real task or investigation step with progress updates | task_card or plan |
| A view-wide notice in a modal | alert |
| Existing generated Markdown | markdown, if supported and safe for the intended message |
| Formatted text assembled in code | rich_text |
Use block selection for limits, table comparisons, and template patterns. Keep required findings visible outside carousels, pagination, and collapsed groups. Do not add dividers between every block or put a one-line notice in a card without a reason. Use a consistent size and hierarchy across comparable messages. Keep at most one visually primary action per message or view. Leave equal navigation choices unstyled.
For modals, check the view wrapper, title, callback, close, and submit requirements. An input-containing modal needs a submit action. Do not compete with Submit using another primary button. For App Home, handle first use, empty results, and view refresh for the current user. Use task cards for work with progress updates. Their states describe task progress.
4. Establish a clear hierarchy
- Lead with the main result or subject. Link its name to the source when useful.
- Explain the result in a short sentence before optional detail.
- Group related metadata and keep units with values.
- Avoid repeating the same title, link, or value in adjacent blocks unless it answers a different question.
- Keep required information and actions outside collapsed or paginated detail.
- Use consistent widths and emphasis for comparable items.
- State status in words. Do not rely on color or emoji alone.
- Show only facts the source provides. Do not invent priority, causes, or recommendations.
Use inline code for identifiers, literal values, names, or short phrases when that emphasis helps the reader. Keep surrounding text regular. Reserve stronger emphasis for the few items that matter most. Follow the user's chosen emphasis style; do not bold every label and value. Use descriptive action labels and avoid duplicate navigation controls. For a one-time notification, use wording that remains accurate later. A current status needs an update lifecycle.
Text formats and safe content
mrkdwnuses*bold*,_italic_, backticks, and<url|label>links.- A native
markdownblock uses standard Markdown, including**bold**and[label](url)links. rich_textuses typed elements and explicit styles. Use itscodestyle for inline-code emphasis.
Do not pass one format into another unchanged.
Keep dynamic text separate from formatting syntax. Apply the required link policy before adding links.
Escape dynamic mrkdwn values and prevent unintended mentions. Keep literal identifiers separate from formatting.
Use Unicode emojis or supported emoji elements; check the text object's emoji behavior.
Charts and accessibility
Choose an image block for a supplied chart image. Use a native chart block when its supported features fit the data.
State the main finding in text and provide useful alt_text for images.
Check labels, units, image size, and readability on narrow screens.
Supply useful notification and screen-reader fallback text.
Do not clear top-level text only to remove duplication; adjust the visible heading and check the result.
An attachment fallback is not proof of equivalent accessibility or notification behavior.
Button labels must explain their action without relying on color or an icon.
5. Validate the payload
Use blocks.validate with concrete values in place of placeholders. Read the live method reference before choosing request parameters. Send exactly one of:
blocks: the JSON-encoded block array.message: the JSON-encoded complete message, including attachments.view: the JSON-encoded modal or App Home view.
The method requires no scopes. Use an available Slack API client or connector. If a Slack CLI is available, read its help before using its API or authentication flags. Do not hardcode CLI flags from memory.
Inspect ok and each validation error's pointer, message, and constraint.
Fix the offending fields and validate again.
Check supported surfaces and count limits independently, including nested blocks.
For example, alert is modal-only, and a container accepts at most ten child blocks.
A validation success is a schema result, not a visual or functional approval.
6. Inspect the rendered layout
Use Block Kit Builder to inspect the intended surface with representative sample content. If the user authorizes a live message, send the payload to the authorized destination and inspect its rendering.
Check:
- Long text, long names, missing fields, and empty results.
- Desktop and narrow layouts.
- Initial expansion, pagination, and content hidden by scrolling.
- Text hierarchy, links, emojis, and image readability.
- Notification and screen-reader fallback text.
- Button labels and placement. Check interaction behavior separately when it is in scope.
Legacy colored attachments can collapse. Check block support before nesting newer components inside them. Keep essential content visible in the initial layout. Compare layouts with the same content so their differences are clear. Distinguish schema validation, visual inspection, and interaction checks when reporting results.
In this repository124 other files it gives its agents.
- AGENTS.mdAGENTS.md
- common/AGENTS.mdAGENTS.md
- hog/AGENTS.mdAGENTS.md
- proto/AGENTS.mdAGENTS.md
- rust/AGENTS.mdAGENTS.md
- .cursor/rules/django-python.mdcCursor rule
- .cursor/rules/react-typescript.mdcCursor rule
- .cursor/rules/rust.mdcCursor rule
- adding-activity-loggingSkill
- adding-api-scopesSkill
- adding-inbound-webhooksSkill
- adding-inbox-sourcesSkill
- adding-ingestion-warningsSkill
- adding-mcp-store-serversSkill
- adding-personhog-rpcSkill
- adding-product-alertingSkill
- adding-project-secret-api-key-authSkill
- adding-today-highlightsSkill
- adopting-generated-api-typesSkill
- analyzing-experiment-precompute-canarySkill
- analyzing-experiment-query-performanceSkill
- analyzing-insights-across-teamsSkill
- announcing-behavior-changesSkill
- auditing-llm-gateway-paritySkill
- auditing-warehouse-source-coverageSkill
- authenticating-to-clickhouseSkill
- authoring-ci-workflowsSkill
- building-product-empty-statesSkill
- building-the-toolbarSkill
- clickhouse-migrationsSkill
- debugging-ci-failuresSkill
- debugging-local-replaySkill
- debugging-local-task-agent-runsSkill
- debugging-mcp-analyticsSkill
- debugging-signals-pipelineSkill
- debugging-table-access-deniedSkill
- depot-ciSkill
- depot-container-buildsSkill
- depot-github-runnersSkill
- developing-subscriptionsSkill
- django-migrationsSkill
- django-startup-timeSkill
- documenting-warehouse-sourcesSkill
- editing-agents-mdSkill
- establishing-code-ownershipSkill
- extending-hobby-smoke-testsSkill
- extending-personhog-test-harnessSkill
- finding-llm-gateway-migration-candidatesSkill
- fixing-flaky-testsSkill
- gating-production-deploysSkill
- gating-sensitive-actionsSkill
- generating-clickhouse-query-performance-reportsSkill
- hogliSkill
- implementing-mcp-toolsSkill
- implementing-mcp-ui-appsSkill
- implementing-warehouse-sourcesSkill
- improving-drf-endpointsSkill
- improving-mcp-toolsSkill
- ingestion-pipeline-doctor-nodejsSkill
- instrumenting-first-party-metricsSkill
- The first 60 shown.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

