How to Strike Through Text in Markdown
Markdown strikethrough uses double tildes on each side of the text. Where it works, where single tildes mean something else, and the HTML fallback.
Short answer: Markdown strikethrough is ~~two tildes~~ on each side of the text, which renders as struck-through text. It's a GitHub Flavored Markdown extension, not part of the CommonMark spec, so it works on GitHub, GitLab, Slack, Discord, Reddit, and Obsidian — but not in every parser. Where it fails, use the HTML <del> tag.
Strikethrough is the most-used markdown feature that isn't actually in markdown. John Gruber's original 2004 spec has no syntax for it. GitHub added it in GFM, everyone copied GitHub, and now it's effectively universal — with just enough inconsistency at the edges to trip you up.
The Syntax
Wrap the text in double tildes:
~~This text is struck through.~~
Renders as:
<del>This text is struck through.</del>
That's the whole feature. A few rules worth knowing:
Both delimiters must match. ~~text~ leaves the tildes as literal characters.
No spaces inside the delimiters. ~~ text ~~ fails in most parsers — the opening delimiter can't be followed by whitespace. Write ~~text~~.
It works mid-word in GFM. un~~fortunate~~ly strikes only the middle. Some stricter parsers require word boundaries.
It doesn't span blank lines. Strikethrough is an inline element. To strike a multi-paragraph block, you need <del> tags around each paragraph, or a single <del> wrapping raw HTML.
The Single Tilde Problem
Here's where it gets messy. A single tilde on each side — ~text~ — means three different things depending on who's parsing it.
| Parser | ~text~ produces |
|---|---|
| GitHub Flavored Markdown | Strikethrough (GitHub accepts one or two tildes) |
| Pandoc | Subscript |
| Obsidian | Literal text (requires ~~) |
| CommonMark (strict) | Literal text |
| markdown-it with the strikethrough plugin | Literal text (requires ~~) |
GitHub's own spec allows one or two tildes for strikethrough. Pandoc, meanwhile, uses a single tilde for subscript — so H~2~O in Pandoc gives you a properly subscripted chemical formula, and the same string on GitHub gives you "H2O" with a struck-through 2. Two completely different results from identical source.
The rule: always use two tildes. Double tildes mean strikethrough in every parser that supports strikethrough at all. Single tildes are ambiguous and portable markdown avoids them. If you actually want subscript, see subscript and superscript in markdown for the reliable approaches.
The HTML Fallback
Three HTML tags produce a line through text, and they are not interchangeable:
<del>Removed from the document</del>
<s>No longer accurate</s>
<strike>Deprecated HTML element</strike>
<del>means the content was deleted from the document. It's semantic — screen readers can announce it, and it acceptsciteanddatetimeattributes to record why and when. This is what GFM's~~compiles to.<s>means the content is no longer accurate or relevant, without implying an edit. Correct for a crossed-out price or a superseded status.<strike>is obsolete. It was removed from the HTML spec years ago. Browsers still render it, but don't write new markup with it.
Use <del> or <s> when you need strikethrough in a renderer that doesn't support ~~, or when you want the extra semantics:
Ships <del>Tuesday</del> <ins>Thursday</ins>.
The <ins> tag is the counterpart — inserted text, usually rendered underlined. Pairing them is the cleanest way to show a correction inline.
Raw HTML passes through most markdown renderers but is stripped by some. GitHub allows <del>, <s>, and <ins>. Reddit, Discord, and Slack strip all HTML — but all three support ~~ natively, so you're covered either way.
Where Strikethrough Works
| Platform | ~~text~~ | <del> HTML |
|---|---|---|
| GitHub / GitLab | Yes | Yes |
| Discord | Yes | No HTML allowed |
| Slack | Yes (converted to ~text~ internally) | No HTML allowed |
| Yes | No HTML allowed | |
| Obsidian | Yes | Yes |
| Notion | Yes (converts on paste) | No |
| Pandoc | Yes | Yes |
| Strict CommonMark | No | Yes |
| OpenMark | Yes | Yes |
Slack is the odd one. Its own message formatting uses single tildes, but the composer accepts ~~text~~ pasted from markdown and converts it. Discord requires exactly two.
If you're writing for a renderer you don't control — a corporate wiki, a documentation generator, an unfamiliar static site — test it once with a throwaway line before relying on it. Strikethrough silently degrading into visible tildes in published output looks worse than not using it.
Combining With Bold and Italic
Strikethrough nests with the other inline styles. Order doesn't matter, but the delimiters have to nest properly rather than overlap:
~~**Struck and bold**~~
**~~Bold and struck~~**
~~*Struck and italic*~~
~~**_All three at once_**~~
All four work in GFM. What doesn't work is overlapping the delimiters:
~~**overlapping~~ delimiters**
That produces garbage, because the parser has to close one span before opening the next. Nest, don't interleave.
If your text contains a literal tilde that's being eaten by the parser, escape it with a backslash: \~. See escaping special characters in markdown for the full list of what needs a backslash and when.
What It's Actually For
Two use cases account for nearly all legitimate strikethrough.
Task lists. Marking a checkbox complete is the checkbox's job, but striking the text makes finished items visually recede:
- [x] ~~Ship the beta~~
- [x] ~~Write the changelog~~
- [ ] Announce on the blog
OpenMark renders these with clickable checkboxes in Document view — clicking one updates the underlying .md file — and struck text greys out, so a long list reads as progress rather than a wall of items.
Changelogs and corrections. When a document is a record rather than a snapshot, deleting text destroys information. Striking it preserves the history:
- Price: ~~$14.99~~ $9.99
- Status: ~~In review~~ Approved
- ~~Deprecated in 2.0~~ Removed in 3.0
This is exactly what <del> was designed for, and it's why GFM compiles ~~ to <del> rather than a styled span.
What strikethrough is not for is emphasis. Crossed-out text as a joke — "this is terrible fine" — reads as noise in documentation and is announced awkwardly by screen readers, which may read the deleted text aloud with no indication it was struck. Keep it for content that genuinely was removed or superseded.
For the rest of GFM's additions to standard markdown — tables, task lists, autolinks, footnotes — see markdown extensions: GFM and MDX, or markdown for GitHub for what renders specifically in READMEs and issues.
Download OpenMark → — $9.99, one-time, native macOS. Full GFM support including strikethrough, task lists, and tables, rendered live as you write.