How Zalgo Text Generator works
This zalgo text generator makes glitchy, cursed-looking text by adding Unicode combining marks to every character you type. A combining mark is a character with no width of its own that attaches to the letter before it; stack enough of them and the text spills above and below its line. You choose where the marks go (above, through the middle, below) and an intensity from 1 to 10, and the result updates as you type. The marks are picked by a seeded generator, so a given text, setting and variation number always produces exactly the same output. Two further modes strip the marks off pasted zalgo text. The output is plain Unicode, not a font or an image, so it can be pasted anywhere that keeps combining characters.
Zalgo text examples at different intensities
Real output from the tool. Enter the same text, settings and variation number and you get the same characters, because the marks are chosen by a seeded generator.
Light: intensity 1
Your text: Zalgo text. Intensity 1. All three positions ticked. Variation number 1.
Z̤̀͘a̯͛͘l̡̘̓g̢̬ͤo̢̱ͦ t̨͚̉ȩ̣ͤx̡̗͛t̫ͩ͘
27 marks added (9 above, 9 middle, 9 below). 10 characters become 37; 64 bytes in UTF-8.
The default: intensity 3
Your text: Zalgo text. Intensity 3. All three positions ticked. Variation number 1.
Z̧͇̬͚̀͂ͯa̢̯̘̾̆l̛̳͍ͤ̍g̷͇̭̉͑ọ̧̝ͯ̋ͤ ṭ̵͚͇͊̆̌e͕͎͖̎͒͘x̸͖̼̞́ͩt̨̫̦ͭ̆ͮ
53 marks added (22 above, 9 middle, 22 below). 10 characters become 63; 116 bytes.
Heavy: intensity 10
Your text: Zalgo text. Intensity 10. All three positions ticked. Variation number 1.
Z̴̴̡̨̞̯̘̫͈̥̀͂ͯͮ̍͌͛̔â̵̷̢̭͉͚̣͈̝̦̬̣̔͋ͦ̎̉l̸̢̫̥̻͙͖̼͕͎͖͛͊̆̌̂͘ǵ̶̶̡͚̞̫̜̫ͩ̎ͪ̿͘o̡̧̥̝̺̱̦̜̝̘̥̻͑̿͂̃ͦͩ t̢̛̛͇͓̙̣͓͍̅̿͂̊ͦ̌ͯͭ͘e̵̶̢̨̟̤͖͙̞̦̊̄̇̓͆̍ͪ̎ͫx̸̴̧̨̩̣̰͈͉̗̠̹̺́ͥ̒̋̇ṯ̵̛̲̺̜̘͍̝̼̤̺̏̔ͩ͑̑
157 marks added (57 above, 30 middle, 70 below). 10 characters become 167; 324 bytes.
Marks above only
Your text: Hello. Intensity 4. Only Marks above ticked. Variation number 1.
H̀͂ͯe̍͌͛̔l̾̆̓̚l̇̾o̒ͤ
15 marks added, all above. The baseline stays clean, which keeps the text easier to read.
A different variation of the same text
Your text: Hello. Intensity 3. All three positions ticked. Variation number 2.
H̵̩͉̏̍͂e̸̝̻̪ͥ̉ĺ̢͖̭ͫ̂l̛̙̘͙ͯ̋̽ò̴̻̘ͯ̃
31 marks added. Variation number 1 with the same settings gives a different pattern with 28 marks.
Cleaning zalgo text
Mode: Remove zalgo marks (keep accented letters). Your text: the phrase Café naïve after zalgo at intensity 6.
Café naïve
101 marks removed; 111 characters became 10. The é and ï survive because they are single precomposed letters.
Marks per character at each intensity
Intensity sets how many marks are stacked on each character. The number is random within a range, chosen separately for each character and position. The last column is the total with all three positions ticked.
| Intensity | Marks above | Marks through the middle | Marks below | Total per character |
|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 3 |
| 2 | 1 to 2 | 1 | 1 to 2 | 3 to 5 |
| 3 | 2 to 3 | 1 | 2 to 3 | 5 to 7 |
| 4 | 2 to 4 | 1 to 2 | 2 to 4 | 5 to 10 |
| 5 | 3 to 5 | 1 to 2 | 3 to 5 | 7 to 12 |
| 6 | 3 to 6 | 1 to 2 | 3 to 6 | 7 to 14 |
| 7 | 4 to 7 | 1 to 3 | 4 to 7 | 9 to 17 |
| 8 | 4 to 8 | 1 to 3 | 4 to 8 | 9 to 19 |
| 9 | 5 to 9 | 1 to 3 | 5 to 9 | 11 to 21 |
| 10 | 5 to 10 | 1 to 4 | 5 to 10 | 11 to 24 |
Spaces and line breaks get no marks. Each mark adds 1 to the character count and 2 bytes in UTF-8.
How the number of marks is worked out
above = random whole number from ceil(intensity / 2) to intensity; below = the same range; middle = random whole number from 1 to ceil(intensity / 3)
ceil means round up. For each character the generator draws a count for every ticked position, then picks that many marks at random from the set for that position: 48 marks that sit above, 11 that run through or hook onto the letter, and 39 that sit below, 98 in all. They all come from the Combining Diacritical Marks block, U+0300 to U+036F. The random numbers come from a seeded generator (mulberry32) started from the Variation number, which is why the output is repeatable. It is a visual effect, not encryption: anyone can strip the marks and read the text.
What is inside a zalgo character
The two letters Hi at intensity 2, variation number 1, come out as these ten code points. The letters H and i are untouched; everything else is a combining mark attached to the letter before it.
| Code point | Unicode name | Position |
|---|---|---|
| U+0048 | Latin capital letter H | The letter |
| U+0300 | Combining grave accent | Above |
| U+0342 | Combining Greek perispomeni | Above |
| U+0358 | Combining dot above right | Middle |
| U+0333 | Combining double low line | Below |
| U+0069 | Latin small letter i | The letter |
| U+0314 | Combining reversed comma above | Above |
| U+036F | Combining Latin small letter x | Above |
| U+0334 | Combining tilde overlay | Middle |
| U+032B | Combining inverted double arch below | Below |
The tool reports this as 2 characters marked, 8 marks added, 10 characters and 18 bytes in UTF-8.
Why zalgo text looks different from app to app
Unicode says what the marks are, not how high a pile of them should be drawn. That is left to the text engine and the font, so the same string looks different in different places.
Some apps draw the whole stack and let it run over the lines above and below. Others clip everything to the height of the line, so only the first few marks show. Some limit the number of combining marks per letter or delete them all, usually to stop messages from covering their neighbours. A few fonts have no glyphs for the rarer marks and show boxes instead. None of this can be controlled from the text itself, and apps change their handling over time, so paste and look before relying on it.
There is also a cleaning problem that this tool handles in two ways. Some apps normalise text, which merges the first mark into its letter: a followed by a combining grave becomes the single letter à. The mode Remove zalgo marks (keep accented letters) deletes every separate combining mark but cannot tell a merged mark from a genuine accent, so it leaves both. Remove zalgo marks and all accents splits every letter first and then deletes the marks, which clears the leftovers but also turns é into e.
Limits and cautions
- One Intensity setting covers all three positions. You can switch a position off but cannot give above and below different strengths.
- Input is limited to 5,000 characters, because the output is many times longer than the input.
- The marks are taken from U+0300 to U+036F only. The cleaning modes also remove marks from the other combining-mark blocks (U+0483 to U+0489, U+1AB0 to U+1AFF, U+1DC0 to U+1DFF, U+20D0 to U+20FF and U+FE20 to U+FE2F).
- Cleaning removes accents that are stored as separate marks, as some Mac file names and Vietnamese text are. Letters stored as single precomposed characters are kept in the first cleaning mode.
- Screen readers may read zalgo text mark by mark or skip it, and search will not match it. Do not use it for anything people must be able to read, such as names on forms, alt text or instructions.
- Heavy zalgo can cover nearby messages. Many communities treat that as spam, and moderators may remove it.
Step by step
- 1
Type or paste into Your text. Leave Mode on Add zalgo marks.
- 2
Drag Intensity between 1 (a light scatter) and 10 (tall stacks).
- 3
Tick or untick Marks above, Marks through the middle and Marks below to choose where the marks go.
- 4
Change Variation number if you want a different pattern at the same intensity.
- 5
Press Copy on the Zalgo text panel and paste it where you need it.
- 6
To clean text instead, paste it and set Mode to Remove zalgo marks (keep accented letters).