How to format incident postmortems for slack
- Step 1Wrap severity tags and identifiers in backticks — Before converting, put
SEV-1,P1, hostnames, and tokens likecache_node_3in backticks so they survive as inline code. This stops the italic rule from accidentally italicising underscores in identifiers and keeps SEV tags monospace-visible. - Step 2Decide how timestamps should appear — The converter leaves plain timestamps as text — it does not generate Slack
<!date^…>tokens. If you want localised, timezone-aware times, plan to add the<!date^…|fallback>syntax in Slack after pasting. - Step 3Paste or upload the postmortem — Use Paste text for a draft, or Upload file for a saved postmortem (accepts
.md,.mdx,.markdown,.txt). One file per run — convert one incident at a time. - Step 4Run the conversion — Click Run MD → Slack. Section headings become bold lines, the timeline list passes through, and links become
<url|label>in the result panel. - Step 5Verify root-cause emphasis and links — Check that the root-cause and action-item sections read clearly. Note that
**bold**emphasis renders italic — use a single asterisk if a critical line (e.g. customer-impact) must be bold. - Step 6Post as a parent message, thread the discussion — Click Copy or Download (
-slack.txt) and paste into #incidents as a parent message; keep the analysis thread under it. For very long postmortems, use a Slack canvas.
Postmortem constructs and their Slack output
How each incident-doc element converts. Backtick your identifiers and severity tags; plan timestamp and mention handling separately.
| Postmortem element | Slack output | Status | Action before converting |
|---|---|---|---|
## Root Cause heading | *Root Cause* (bold line) | Supported | None |
- 14:02 alert fired timeline bullet | - 14:02 alert fired (unchanged) | Supported | None |
SEV-1 ` severity tag | SEV-1 ` (unchanged, monospace) | Supported | Wrap in backticks in the source |
[Grafana](https://…) link | <https://…|Grafana> | Supported | None |
raw 2026-06-10 14:02 UTC timestamp | plain text (no Slack date token) | By design | Add <!date^…> syntax in Slack after pasting |
@oncall mention | @oncall (plain text, no ping) | Unsupported | Type a real Slack mention after pasting |
metrics table | metric | value | | raw pipes as plain text | Unsupported | Flatten to a bulleted list |
**Customer impact:** callout | _Customer impact:_ (italic) | Quirk | Use a single * for bold |
Privacy and limits for incident content
Where incident data lives and the input limits that apply. Nothing is uploaded — relevant for confidential security postmortems.
| Concern | Behaviour |
|---|---|
| Where conversion runs | Entirely in your browser via the markdown engine |
| What reaches a server | Nothing — only an anonymous processed-count metric for dashboard stats |
| Free-tier input cap | 1 MB / 500,000 characters / 1 file |
| Pro input cap | 10 MB / 5,000,000 characters |
| Slack post-time cap | ~40,000 characters per message — thread or canvas for longer |
Cookbook
Real postmortem fragments and the exact mrkdwn the converter emits, so the incident timeline and root cause land cleanly in #incidents.
A timeline section converts to a clean list
The timeline is the most-read part of an incident post. Section heading becomes bold; the timestamped bullets pass through unchanged as a native Slack list.
Input (postmortem.md): ## Timeline - 14:02 UTC alerting fired on p99 latency - 14:09 UTC paged on-call, began rollback - 14:21 UTC service recovered Output (Slack mrkdwn): *Timeline* - 14:02 UTC alerting fired on p99 latency - 14:09 UTC paged on-call, began rollback - 14:21 UTC service recovered
Severity tag and hostname survive in backticks
Wrapping SEV-1 and cache_node_3 in backticks keeps them monospace and stops the italic rule from mangling the underscores in the hostname.
Input (postmortem.md): Severity: `SEV-1`. The fault was isolated to `cache_node_3`. Output (Slack mrkdwn): Severity: `SEV-1`. The fault was isolated to `cache_node_3`.
Root cause with a dashboard link
Root-cause sections usually cite a dashboard or trace. The link converts to Slack's angle-bracket form so responders can jump straight to the evidence.
Input (postmortem.md): ## Root Cause A misconfigured TTL caused a cache stampede ([trace](https://grafana.example.com/d/abc)). Output (Slack mrkdwn): *Root Cause* A misconfigured TTL caused a cache stampede (<https://grafana.example.com/d/abc|trace>).
Customer-impact callout needs a single asterisk
The customer-impact line is often the one leaders read first. Written as **, it renders italic — use a single asterisk in the source so it is bold.
Input (postmortem.md): **Customer impact:** 4% of API requests failed for 19 minutes. Output (italic, not bold): _Customer impact:_ 4% of API requests failed for 19 minutes. Write the source as `*Customer impact:*` for Slack bold: *Customer impact:* 4% of API requests failed for 19 minutes.
Timestamps stay plain — add date tokens in Slack
The converter does not produce Slack's localised date tokens. The timestamp passes through as text; add <!date^…|fallback> in Slack afterward if you need per-viewer timezones.
Input (postmortem.md):
- Detected at 2026-06-10 14:02 UTC
Output (plain text):
- Detected at 2026-06-10 14:02 UTC
Optional, edit in Slack to localise:
- Detected at <!date^1781013720^{date_short} {time}|2026-06-10 14:02 UTC>Edge cases and what actually happens
Timestamps are not converted to Slack date tokens
By designThe converter leaves plain timestamps as text. To get localised, timezone-aware display, replace them with Slack's <!date^epoch^{format}|fallback> syntax in the message after pasting — the tool does not generate these tokens.
`@oncall` and `@here` do not page anyone
ExpectedMentions are passed through as plain text and do not notify. To actually page on-call from the postmortem post, type a real Slack @-mention (or @here/@channel) directly in the composer after pasting so it resolves and notifies.
Hostnames with underscores get italicised
Watch outThe italic rule matches _..._, so a bare cache_node_3 in prose can be partly italicised. Wrap hostnames, service names, and identifiers in backticks in the source so they are treated as inline code and left intact.
Customer-impact bold callout renders italic
By designBecause **bold** is reduced to *bold* then _bold_, a **Customer impact:** callout comes out italic. Use a single asterisk (*Customer impact:*) in the source so the line leaders read first is bold.
Metrics/error-budget table shows as raw pipes
UnsupportedSlack has no table element and the converter does not flatten pipes, so an SLO or error-budget table appears as literal pipe text. Rewrite it as a bulleted list of metric: value pairs in the source before posting.
Confidential details — where do they go?
Preserved locallyConversion runs entirely in the browser; incident content, customer impact, and internal hostnames are never sent to a server (only an anonymous processed count is recorded). This is the relevant property for security postmortems — but the resulting Slack post is, of course, visible to everyone in the channel.
Long postmortem exceeds Slack's message limit
Slack limitSlack truncates message text around 40,000 characters. A detailed postmortem with a long timeline can exceed that. Post the summary/root-cause/action-items as a parent message and link to a Slack canvas, or split the doc with md-splitter at /markdown-tools/md-splitter.
Input exceeds the character limit
400 over limitFree tier caps input at 1 MB / 500,000 characters; a single postmortem is well under that, but a combined multi-incident review may not be. Convert one incident at a time, or upgrade to Pro (10 MB / 5,000,000 characters).
Frequently asked questions
Will my timestamps render as localised Slack times?
No. The converter leaves plain timestamps as text — it does not generate Slack's <!date^…> date tokens. Add the <!date^epoch^{format}|fallback> syntax in the Slack message after pasting if you want per-viewer timezones.
Can I include severity levels?
Yes. Wrap severity tags in backticks (` SEV-1 , P1 `) in your source — they survive conversion as monospace inline code and stay visible at a glance. Backticking also protects identifiers from accidental italicisation.
Why did my customer-impact callout turn italic?
The emphasis rule order reduces **bold** to *bold* then _bold_, which Slack renders italic. Write the callout with a single asterisk (*Customer impact:*) so it is bold.
Will `@oncall` page the on-call engineer?
No. The converter passes mentions through as plain text and they do not notify. Type a real Slack @-mention in the composer after pasting if you need to page someone.
Should the postmortem go in a thread?
A common pattern is to post the summary, root cause, and action items as a parent message and keep the analysis in a thread under it. For very long postmortems, a Slack canvas avoids the message-length limit.
Are timeline bullets preserved?
Yes. The converter does not rewrite list markers, so your - 14:02 … timeline bullets pass through unchanged and render as a native Slack list.
What happens to an SLO or error-budget table?
Slack cannot render tables and the converter passes pipes through as raw text. Rewrite the table as a bulleted list of metric: value pairs in the source before posting.
Is confidential incident content uploaded anywhere?
No. The conversion runs entirely in your browser via the markdown engine. Incident details, customer impact, and internal hostnames never reach a server; only an anonymous processed-count metric is recorded. The posted Slack message is, of course, visible to the channel.
What input formats and sizes are supported?
Paste text, or upload a single .md, .mdx, .markdown, or .txt file. Free tier allows up to 1 MB / 500,000 characters; Pro raises that to 10 MB / 5,000,000.
How do runbook and dashboard links convert?
Markdown links [Grafana](url) become Slack's <url|Grafana> form and stay clickable. Validate the URLs first with md-link-validator at /markdown-tools/md-link-validator so responders do not hit dead links.
Can I archive the converted postmortem to the incident ticket?
Yes. Click Download to save the mrkdwn as a -slack.txt file you can attach to the incident ticket, or use md-to-jira at /markdown-tools/md-to-jira to produce Jira wiki markup for the ticket description.
Does it redact secrets like tokens or keys?
No — md-to-slack does not redact. If your postmortem includes logs with credentials, run them through md-secret-redactor at /markdown-tools/md-secret-redactor before converting and posting.
Privacy first
All Markdown processing runs locally in your browser using JavaScript. No file is ever uploaded to JAD Apps servers — only metadata counters are saved for signed-in dashboard stats.