About this fancy text generator

A small, dependency-free tool that maps plain text onto 20 sets of existing Unicode characters. No account, no upload, and nothing you type is ever recorded.

Why it exists

Decorative Unicode text is everywhere — bios, usernames, Discord nicknames — and it is easy to get subtly wrong. Copy a table from an unreliable source and you'll often get a tofu box in place of italic h, because the table author mapped straight into a Unicode slot that was never assigned a character. This tool exists to do that mapping correctly: every letter in every style was checked individually against the Unicode code charts, not against how it happened to render in one browser on one day.

How the mapping is implemented

Thirteen of the twenty styles (bold, italic, bold italic, script, bold script, gothic, bold gothic, double-struck, four sans-serif weights, monospace) come from arithmetic over the Mathematical Alphanumeric Symbols block (U+1D400-U+1D7FF): each style is a run of 26 consecutive code points for capitals and another 26 for lowercase, so "letter index + range start" gives the output character directly. The seven remaining styles are not part of that block at all and are built differently:

  • Circled and squared come from Enclosed Alphanumerics and its Supplement — the blocks behind ①②③ and 🅰🅱🅾.
  • Small caps is a hand-built table spanning three separate blocks, because no single contiguous range of small-capital letters exists in Unicode.
  • Fullwidth is a fixed +0xFEE0 offset over printable ASCII, with an explicit override for the space character.
  • Upside down is a look-alike table plus a full string reversal — not a geometric rotation, because Unicode has no dedicated "turned" character for most letters.
  • Strikethrough and underline insert a combining mark (U+0336 / U+0332) after each character rather than substituting a different letter.

Two implementation details matter more than they sound:

  • The reserved slots are handled explicitly, not by accident. Twenty-four specific letters across italic, script, gothic and double-struck have their own override table pointing at the correct pre-existing Letterlike Symbols character (see the reserved-slots table on the main page for the full list) instead of falling through to the unassigned Mathematical Alphanumeric Symbols slot.
  • Input is walked by Unicode code point, never by UTF-16 index. The text is split with Array.from(), so an emoji or any other character outside the Basic Multilingual Plane is treated as one unit instead of being torn into two orphaned surrogate halves that would each render as a broken character.

How it was verified

Before this tool shipped, its logic was run under Node — separately from the browser, with no rendering involved — against a set of fixed checks:

Verification checks and their results
CheckExpectedResult
Bold "abc"𝐚𝐛𝐜match
Italic "h"ℎ (U+210E)match, not the reserved U+1D455 slot
Script "H"ℋ (U+210B)match
Double-struck "R"ℝ (U+211D)match
Gothic "C"ℭ (U+212D)match
All 24 reserved-slot letters, all stylesDocumented Letterlike Symbols character24/24 match
Full A-Z / a-z / 0-9 + punctuation, all 20 stylesNo U+FFFD, no reserved-slot code pointclean
Emoji in input, all 20 stylesSurvives Array.from iteration intactclean
Unmapped characters (e.g. punctuation in Bold)Pass through unchangedmatch

The mapping logic lives in a single file with no DOM access and a module.exports hatch at the bottom specifically so it can run this way — under plain Node, with nothing browser-specific anywhere in the code path being tested.

How the site is built

  • Static HTML, one small stylesheet, two small scripts. No framework, no build step, no bundler.
  • Nothing is fetched from the network. No CDN font, no remote image; the favicon is an inline SVG data URI. Once loaded, the page works offline.
  • System font stack for the page's own interface text — only the generated output uses the special Unicode characters described above.
  • Nothing you type is transmitted. The whole conversion happens in your browser; there is no server call anywhere in this tool.
  • Dark mode follows your system setting via prefers-color-scheme.

Scope and honesty about limits

This tool cannot make a style render on a device whose fonts don't cover the Unicode range in question — that is a font-coverage question the visitor's own device controls, not something a web page can fix. It cannot make these styles accessible to screen readers, because the underlying characters genuinely carry no semantic "this is bold" information the way an HTML <strong> tag does; see the FAQ on the main page for what that means in practice. And it cannot add characters Unicode simply never defined — small-capital X and squared digits are documented gaps, not oversights.