Skip to content
Part of: How-to format
How-To

Telegram Text Formatting: Bold, Italic, Monospace & More

In any Telegram chat, select your text to open a formatting menu for bold, italic, underline, strikethrough, monospace, spoiler, quote, and links — it works on every client. On Desktop and Web you can also type markdown like `**bold**` or use Ctrl/Cmd+B. Bots use a different system (Bot API MarkdownV2 or HTML with parse_mode). For places with no menu — channel titles, display names, bios — the menu and markdown do nothing, so paste Unicode styled characters instead.

Shreyas Bagal·Jun 22, 2026·5 min

In any Telegram chat, select your text to open a formatting menu for bold, italic, underline, strikethrough, monospace, spoiler, quote, and links — it works on every client. On Desktop and Web you can also type markdown like `**bold**` or use Ctrl/Cmd+B. Bots use a different system (Bot API MarkdownV2 or HTML with parse_mode). For places with no menu — channel titles, display names, bios — the menu and markdown do nothing, so paste Unicode styled characters instead.

Key takeaways

  • The universal path is selection-based: highlight your text in any Telegram chat (iOS, Android, Desktop, macOS, Web) and a menu offers bold, italic, underline, strikethrough, monospace, spoiler, quote, and link.
  • Telegram Desktop and Web add two extras: typed markdown in the compose box (**bold**, _italic_, __underline__, ~~strike~~, `code`, ||spoiler||) and keyboard shortcuts like Ctrl/Cmd+B. Typed-markdown conversion is reliable there but inconsistent across mobile clients and versions.
  • Bots are a separate world: they set parse_mode to MarkdownV2 or HTML. Note MarkdownV2 uses a single asterisk for bold (*bold*), the opposite of the in-app double-asterisk.
  • Channel titles, group names, display names, and bios render plain text only — no menu, no markdown. Paste Unicode styled characters there instead, but never in the @username (it is ASCII-only).
  • Unicode styled text copies anywhere but is not real text: screen readers often read each character by its Unicode name (e.g. "mathematical bold capital H") or skip it entirely, in-app search will not match it, and rare styles can show as boxes. Keep essential words plain.
Telegram Text Formatting: Bold, Italic, Monospace & More
On this page

How-to guide

Telegram actually has three separate ways to format text, plus a Unicode trick for the places none of them reach — and mixing them up is where most people get stuck. Here's the short version, then the full map.

The one path that works everywhere: in any chat, on any client (iOS, Android, Desktop, macOS, Web), select the text you typed and a formatting menu appears. That menu gives you bold, italic, underline, strikethrough, monospace, spoiler, quote, and link. On Desktop and Web you also get typed markdown and keyboard shortcuts. Bots use a completely different system. And channel titles, display names, and bios accept none of it — there you paste Unicode styled characters instead.

The universal path: select your text

This is the method that behaves the same on every Telegram app, and it's the one to remember if you only learn one thing.

Type your message first. Then highlight the words you want to style. How you reach the menu differs slightly by platform:

  • iOS: long-press the text, then choose the formatting option (the B/U or Format item) from the popup.
  • Android: select the text, then use the context menu or the three-dot overflow.
  • Desktop / macOS: right-click the selection and choose Formatting, or use the small toolbar that appears.

The styles available through this menu are the ones Telegram supports in messages: bold, italic, underline, strikethrough, monospace (code), spoiler, blockquote (quote), and inline link. This is real formatting — it renders correctly for everyone who sees the message, and screen readers handle it properly because the underlying letters stay normal.

Desktop & Web extras: typed markdown and shortcuts

Telegram Desktop and Telegram Web add two conveniences on top of the selection menu.

Typed markdown in the compose box. As you write, you can type shorthand and Telegram converts it on send:

  • **bold**bold
  • _italic_italic
  • __underline__ → underline
  • ~~strikethrough~~strikethrough
  • `inline code`inline code
  • ```code block``` → a fixed-width code block
  • ||spoiler|| → a hidden spoiler

Note the double asterisks for bold here, and that a single underscore is italic while a double underscore is underline. That asterisk detail matters later, because the Bot API does the opposite.

Keyboard shortcuts (Desktop and Web):

ActionShortcut
BoldCtrl/Cmd + B
ItalicCtrl/Cmd + I
UnderlineCtrl/Cmd + U
StrikethroughCtrl + Shift + X
MonospaceCtrl + Shift + M
Remove formattingCtrl + Shift + N
Insert linkCtrl + K (or Ctrl + Shift + K)

One honest caveat: typed-markdown auto-conversion is reliable on Desktop and Web, but inconsistent across mobile clients and app versions — some Android and iOS builds convert **bold** on send, others leave it as raw text. So on phones, the select-then-menu route is the dependable one. The keyboard shortcuts above are a Desktop/Web feature; the phone apps don't offer them.

Formatting from a bot: the Bot API

If you're building a bot, formatting works through a different mechanism entirely. The bot sets a parse_mode on each sendMessage, choosing one of three values: MarkdownV2 (the modern, recommended mode), HTML, or Markdown (legacy, kept only for backward compatibility).

MarkdownV2 syntax (note: single asterisk for bold, single underscore for italic, double for underline):

*bold*
_italic_
__underline__
~strikethrough~
||spoiler||
`inline code`
```language
code block

link text


That single asterisk is the **opposite** of the in-app double-asterisk convention. The two systems are not interchangeable — `*bold*` is bold to a bot but not to a human typing in Desktop, and `**bold**` is bold to a human but raw text to a bot. (The underscore tokens, helpfully, *are* the same in both: single = italic, double = underline.)

**HTML mode** uses tags instead: `<b>` or `<strong>`, `<i>` or `<em>`, `<u>` or `<ins>`, `<s>`/`<del>`/`<strike>`, `<span class="tg-spoiler">` (or `<tg-spoiler>`), `<code>`, `<pre>`, `<a href="...">`, and `<blockquote>`.

Two practical warnings:

1. **MarkdownV2 demands escaping.** Every literal `_ * [ ] ( ) ~ \` > # + - = | { } . !` must be preceded by a backslash. One unescaped character causes the entire send to error out. This strict escaping is the main reason many developers prefer HTML mode — it's far more forgiving.
2. **`code` and `pre` don't nest — at all.** Bold, italic, underline, strikethrough, and spoiler can be nested with each other and combined with other entities, but `` `code` `` and `pre` blocks can neither contain another styled entity nor be contained by one. Don't try to bold text inside a `` `code` `` span, and don't wrap a code block in another style.

## Where the menu can't go: names, channels, bios

Here's the gap. The formatting menu and markdown only work inside **message bodies**. They do nothing in:

- channel and group **titles**
- user **display names** (first and last name)
- **bios**

Those fields render plain text and ignore markdown entirely. There's no menu to summon. So how do people get a bold channel name or a script-style display name?

They paste **Unicode styled characters** — distinct code points that already *look* bold, italic, monospace, or cursive (𝗯𝗼𝗹𝗱, 𝘪𝘵𝘢𝘭𝘪𝘤, 𝚖𝚘𝚗𝚘, 𝓼𝓬𝓻𝓲𝓹𝓽). Because the style is baked into the character rather than applied as a formatting layer, it survives into these plain-text fields and displays across platforms. This is exactly what a tool like BoldlyType's [Telegram text formatter](/telegram-text-formatter) produces. (Curious how the swap works under the hood? See [how bold text generators work](/blog/how-bold-text-generators-work).)

A few honest trade-offs come with Unicode text. It isn't real letters, so it carries real costs: **screen readers** often read each character by its full Unicode name — "mathematical bold capital H, mathematical bold small I" for "Hi" — or go silent on glyphs they can't name; either way the result is unintelligible to anyone listening. **In-app search** won't match it against the plain word. And rarer styles can render as empty **boxes** on devices missing the glyph. So use it for decoration, and keep anything load-bearing in plain text.

**One firm limit:** your **@username** — the actual handle people type to find you — only accepts ASCII letters, digits, and underscores. Unicode styled characters will *not* work in the @handle. They work only in the display name, channel/group title, and bio. Style the name; keep the handle plain.

## The quick mental model

If you remember nothing else: in a **message**, select your text and use the menu — it's real, accessible formatting that works on every client. On **Desktop or Web**, type markdown (`**bold**`, `_italic_`, `__underline__`, `||spoiler||`) or hit Ctrl/Cmd+B if you'd rather. If you're a **bot**, set `parse_mode` and mind that MarkdownV2 flips the asterisk count and demands escaping. And for the **names, titles, and bios** the menu can't touch, paste Unicode styled characters — just never in your @username, and never for words that have to stay searchable or screen-reader-friendly.

Ready to put this into practice?

Open a formatter

Sources

Spotted an error? Email hello@boldlytype.com — we update guides quarterly and welcome corrections.

Frequently asked questions

Latest questions readers ask us about this topic.

How does Telegram text formatting work?

Telegram gives you the same formatting menu on every client. Type your message, then select (highlight) the text you want to style — on iOS long-press and choose the formatting item, on Android use the context menu, on Desktop right-click and pick Formatting. You'll get bold, italic, underline, strikethrough, monospace (code), spoiler, quote, and link. Telegram Desktop and Web add two shortcuts: you can type markdown directly (**bold**, _italic_, __underline__, ~~strike~~, `code`, ||spoiler||) and use keyboard combos like Ctrl/Cmd+B. That typed-markdown conversion is reliable on Desktop and Web but inconsistent across mobile clients and app versions — on phones, the select-then-menu path is the dependable route. Bots format messages through a separate Bot API mechanism (parse_mode) entirely.

Does Telegram formatting work everywhere, and why do I sometimes see boxes?

The selection menu works in message bodies on every Telegram client, and that formatting displays consistently for everyone. But it does not work in channel/group titles, display names, or bios — those fields render plain text only. For those spots people paste Unicode styled characters from a font generator. Unicode copies anywhere because the style is baked into the character, but it is not real text: it can appear as empty boxes (□) on devices missing that glyph, especially with rarer styles like fraktur or script. Boxes mean the recipient's font lacks that specific character. Stick to widely supported styles like bold sans-serif, and keep anything essential — handles, links — in plain text so nothing breaks.

What's the difference between Telegram's in-app markdown and the Bot API?

They're two separate systems with conflicting syntax, which trips up a lot of people. In-app markdown — what you type in Telegram Desktop's compose box — uses double asterisks for bold (**bold**), matching the legacy Markdown convention. The Bot API's recommended MarkdownV2 mode uses a single asterisk (*bold*), the exact opposite. So a string that's bold when typed by a human in Desktop is not the same string a bot sends. Bots set parse_mode to MarkdownV2, HTML, or legacy Markdown on each message. Many developers prefer HTML mode because MarkdownV2 requires escaping a long list of special characters with backslashes, and a single unescaped character causes the whole send to fail.

How do I make my Telegram channel name or display name bold?

You can't use the formatting menu or markdown in a channel title, group name, display name (first/last name), or bio — those fields strip formatting and show plain text. The only workaround is to paste Unicode styled characters that already look bold, italic, monospace, or script, generated from a tool like BoldlyType's /telegram-text-formatter. Because they're distinct Unicode code points rather than a formatting layer, they survive into those plain-text fields and look consistent across platforms. One hard limit: your @username (the actual handle people type to find you) only accepts ASCII letters, digits, and underscores, so Unicode characters won't work there. Style the display name; leave the @handle plain.

What are the Bot API formatting modes, and which should I use?

A Telegram bot sets parse_mode on each sendMessage to one of three values: MarkdownV2 (the modern recommended mode), HTML, or legacy Markdown (kept only for backward compatibility). MarkdownV2 syntax: *bold*, _italic_, __underline__, ~strikethrough~, ||spoiler||, `inline code`, triple-backtick code blocks, and [text](url). HTML uses tags like <b>, <i>, <u> (or <ins>), <s>, <tg-spoiler>, <code>, <pre>, <a href>, and <blockquote>. Many developers choose HTML because MarkdownV2 forces you to backslash-escape these literal characters: _ * [ ] ( ) ~ ` > # + - = | { } . ! — and one missing escape causes a send error. Note also that code and pre can neither contain nor be contained by any other entity; those blocks don't nest with styling.

Is BoldlyType free and safe to use for Telegram text?

Yes. BoldlyType is free with no signup, and it runs entirely in your browser — nothing you type is stored or sent to a server. You paste or type your text, pick a style, and copy the result. It's most useful for the places Telegram's built-in menu can't reach: channel titles, display names, and bios, where you need Unicode styled characters instead of real formatting. For ordinary message bodies, Telegram's native selection menu (or Desktop markdown) is the better tool — it produces real, accessible formatting. Use the /telegram-text-formatter for the gaps, and keep load-bearing text like links and your @username in plain characters so screen readers and search still work.

The sub-questions readers ask next — answered, with where to go.

LinkedIn's post box — used for feed posts, comments, your headline and your About section — is plain text with no formatting toolbar and no markdown, so there's no bold button. The workaround the whole creator economy uses is Unicode bold: type your line, convert it to bold Unicode characters (𝗯𝗼𝗹𝗱) in a generator, then paste it back and the emphasis sticks, because the style is baked into the characters themselves. Bold only the hook — the part that shows before the “…see more” cut-off — to earn the click, and keep the rest plain so the post stays skimmable. Two caveats matter: Unicode text isn't read by LinkedIn's search and is announced poorly by screen readers, so never bold the keywords, names or hashtags you want found or read aloud. For true rich text (headings, lists), use LinkedIn's separate 'Write article' editor instead.

Format a LinkedIn post

Instagram's native composer collapses the line breaks you type, which is why captions paste in as one dense block — it's worst when you post from the web or through some schedulers. The reliable fix is to compose the caption with the spacing you want and paste it back with the breaks preserved, rather than relying on invisible-character hacks (blank Unicode characters can break Instagram's search and are read poorly by screen readers). Write the caption with your intended breaks, generate the spaced version, and paste it into the caption field. Put your strongest hook on line one, since that's the part that shows before the 'more' cut-off in the feed. Keep paragraphs short — two or three lines — so the caption stays skimmable on a phone, where almost everyone reads it.

Open the line-break tool

Yes — WhatsApp is the exception among messaging and social apps because it has its own built-in markup that it renders for everyone. Wrap text in *asterisks* for bold, _underscores_ for italic, ~tildes~ for strikethrough, and triple backticks for monospace; the symbols disappear and the styling shows. So you usually don't need Unicode characters on WhatsApp at all. Reach for a Unicode formatter only when you want a style WhatsApp's markdown doesn't cover — small caps or script for a Status, say — or when you're writing one message to post across several apps that don't share WhatsApp's syntax (Instagram, X and Threads strip these symbols and show them literally). For everyday bold and italic inside WhatsApp itself, the native markup is the better and more accessible choice.

Format for WhatsApp

Because that editor is plain text and strips anything it doesn't parse. Markdown (*bold*), HTML tags and rich-text styling only render where the platform explicitly supports them — paste them into Instagram, X/Twitter or a LinkedIn post and you see the raw asterisks, or nothing at all, because those boxes have no formatting engine. Unicode styling works differently: the bold or italic look is baked into each character (a Unicode bold 'A' is its own code point), so it survives any plain-text field and travels with a copy-paste. That's the whole reason Unicode 'fancy text' formatters exist. The trade-off is accessibility — because they aren't ordinary letters, screen readers can mis-read them and in-app search may not match them — so use Unicode for short emphasis, not for body copy or anything that must be searchable.

Generate paste-proof styles

Related in this series

See all in How-to format

Explore the topic cluster

More tools and guides across this topic cluster.

Get the next post.

Craft notes on writing for the internet. One short email, every other week. No spam.

Keep reading