Last updated: 2025-09-18
This page documents how I test two parts of the site:
- Invisible Text Copy for zero-width and whitespace characters
- Text Generators, each published on its own page, one generator per page
The goals are accuracy, repeatability, and clear limits. You can reproduce every result with the steps and code here.
Goals
- Measure behavior on paste, save, reload, export, and re-copy.
- Record outcomes as Keep, Strip, Re-encode, or Varies, with dates and app versions.
- Check normalization and round-trip behavior.
- Protect user privacy. Processing happens in the browser.
Scope
Characters and controls
- Zero-width and whitespace: U+200B, U+200C, U+200D, U+2060, U+FEFF, U+034F, U+2063, U+2028, U+2029, U+2000..U+200A, U+202F, U+205F, U+3000, U+00A0
Transform classes used by separate generator pages
- Mapped alphabets: bold, italic, cursive, double-struck, bubble, monospace, old English, small caps, squared, full-width
- Effects with combining marks: underline, strikethrough, outline, neon, shadow, glow, wavy, broken, cracked, melting, distorted, zalgo
- Directional or positional: reverse, mirror, upside down, curved
- Encodings: binary, Morse, Braille
- Script swaps and themed: Greek, Cyrillic, Runic, leetspeak, regional indicators, emoji decorations
- Invisible: Braille blank U+2800 and Zero-Width Space U+200B
Platforms and targets
- OS: Windows 11, macOS, iOS, Android
- Browsers: Chrome, Firefox, Safari, Edge
- Apps: Google Docs, Apple Notes, common textareas, contentEditable editors, simple desktop editors
Out of scope: cloaking, keyword stuffing, or any use that breaks platform rules.
Site structure for generators
Each generator has its own page. The page renders a single card that uses the corresponding transform function.
Examples
- Bold Text Generator →
/generators/bold-text-generator - Small Caps Generator →
/generators/small-caps-generator - Reverse Text Generator →
/generators/reverse-text-generator - Zalgo Text Generator →
/generators/zalgo-text-generator - Invisible Text Generator →
/generators/invisible-text-generator
Each page sets a SINGLE_STYLE key in a small inline script so the UI renders only that generator card. This keeps the test surface simple and makes results per-page easy to reproduce.
Status codes
- Keep. Exact code points survive paste, save, reload, and re-copy.
- Strip. Removed at any stage.
- Re-encode. Replaced by a different code point or sequence, for example a newline.
- Varies. Depends on app version, paste path, font fallback, or editor mode.
Notes include the stage where the change occurred and any conditions that control it.
Environments and version tracking
I test stable releases and retest after notable OS or app updates. I log dates and versions for reproducibility.
| Category | Typical version example |
|---|---|
| Windows | 11 23H2 |
| macOS | Sonoma 14.x |
| iOS | 17.x |
| Android | 14 |
| Chrome | 128+ stable |
| Firefox | 129+ stable |
| Safari | 17.x on macOS and iOS |
| Edge | 128+ stable |
| Google Docs | Web current channel |
| Apple Notes | iOS 17.x, macOS 14.x |
Sampling strings
Short test strings make differences easy to spot.
- Character probe:
A[CHAR]Bwhere[CHAR]repeats N times - Mixed sample:
The quick brown fox 0123456789 !? - Multiscript:
বাংলা বাংলা • Ελληνικά • Русский - Generator probe:
Sample 123plus a sentence length line for selection tests
Per-page test protocol
Do this for each generator page and for the Invisible Text tool.
- Generate
Open the page. Enter the probe string. Copy the output using the page button. - Paste
Paste into each target. Try plain paste and rich paste if available. - Save and reload
Save the document or note. Close and reopen. Export and re-import when possible. - Re-copy
Copy back from the target. Compare with the original output. - Normalize and diff
Check equality on raw, NFC, NFD, NFKC, NFKD. See the helpers below. - Record
Log status, date, versions, and a short note. If behavior flips by paste path or editor mode, mark Varies and write the condition.
Generators by method
This table explains how the separate generator pages work and what I verify on each.
| Generator page type | Method summary | What I verify | Reversible |
|---|---|---|---|
| Bold, Italic, Cursive, Double-struck, Monospace, Old English | Map letters to Mathematical Alphanumeric Symbols or Fraktur code points | Output uses the intended block. Unmapped characters pass through. Round-trip mapping where defined | Yes when reverse map exists |
| Bubble, Squared, Regional indicators | Map to enclosed or flag letters | Coverage of A-Z and digits where applicable. Rendering on mobile | Yes by reverse map |
| Full-width | Convert ASCII to full-width code points | ASCII 33..126 convert as expected | Yes |
| Underline, Strikethrough, Outline, Neon, Shadow, Glow, Wavy, Cracked, Broken, Melting, Distorted | Append combining marks to each character | Combining marks are present. Selection and copy do not drop marks | Partly, by stripping combining marks |
| Reverse, Mirror, Upside down | Reverse string and map glyphs where needed | Text order and mapped glyphs look correct. Caret navigation makes sense | Reverse is yes. Mirror and flip are partial |
| Zalgo and Glitch | Add many combining marks above, mid, below | Copy and paste keep marks. Decoder removes them cleanly | Decoder restores base text |
| Binary, Morse | Encode characters to a text representation | Encoder and decoder agree. Word gaps preserved | Yes |
| Braille | Map letters and numbers to Braille patterns | Number marker and letter mapping correct | Yes |
| Greek, Cyrillic, Runic | Swap alphabet via static maps | Map is consistent. Unmapped symbols pass through | Yes with reverse map |
| Emoji decorations and keycap digits | Decorate or overlay with emoji or keycaps | Keycap rendering varies by platform. Document behavior | Yes by removing decorations |
| Invisible (U+2800 and U+200B) | Repeat a single code point | Code point matches generator. Copy result length is correct | N/A |
Paste paths and stages
- Plain paste often keeps raw code points and removes styling.
- Rich paste can normalize or replace code points.
- Save and reload may normalize content on some platforms.
- Export to a different format can re-encode.
I log each stage. If a change appears first on save, the note says so.
Analysis helpers
JavaScript diff
function cps(s) { return [...s].map(c => 'U+' + c.codePointAt(0).toString(16).toUpperCase().padStart(4,'0')); }
function analyze(original, received) {
const forms = ['NFC','NFD','NFKC','NFKD'];
const out = { rawEqual: original === received, cpsOriginal: cps(original), cpsReceived: cps(received), forms: {} };
for (const f of forms) out.forms[f] = original.normalize(f) === received.normalize(f);
return out;
}
Strip combining marks
function stripCombining(s) {
return s.normalize('NFD').replace(/[\u0300-\u036F\u0488\u0489]/g, '');
}
Create a character probe
// Example: 3 copies of U+200B
const probe = 'A' + '\u200B'.repeat(3) + 'B';
Call page transforms in console
If a page exposes a global function, you can call it directly.
// Example: bold page
const input = 'Sample 123';
const output = TRANSFORMATIONS?.boldtextgenerator ? TRANSFORMATIONS.boldtextgenerator(input) : input;
Result logging
Results live in CSV and in the public Support Matrix on the About page.
CSV schema
test_id,page_slug,feature,code_point_or_map,platform,app_version,paste_path,stage,status,note,tester,date
Examples
invisible-zwsp-2025-09-18,invisible-text-generator,invisible,U+200B,macOS Safari,17.6,plain,paste,Strip,"Stripped on paste",Anit,2025-09-18
bold-2025-09-18,bold-text-generator,mapped,math-bold,Windows Chrome,128,rich,save,Keep,"No change after save",Anit,2025-09-18
zalgo-2025-09-18,zalgo-text-generator,combining,multi,Android Chrome,128,plain,copy,Keep,"Dense combining retained",Anit,2025-09-18
Status rules
- Keep only if raw and NFC match through re-copy.
- Re-encode must include the new code points, for example U+2028 to newline.
- Varies must include the condition that flips the result.
Accessibility checks per page
- Labels. Textareas have
aria-labeland clear headings. - Keyboard. Copy buttons are reachable and have visible focus.
- Feedback. Copy actions announce status with a live region.
- Readability. Avoid long invisible sequences in visible fields.
- Screen readers. Spot check that combining mark effects do not create chaos.
- Alternatives. Suggest HTML and CSS for spacing on the web.
Performance and stability
- Keep the page to one generator card.
- Use the Clipboard API with a fallback.
- Limit heavy combining output to reduce jank on mobile.
- Avoid blocking scripts. Load analytics deferred.
Security and ethics
- Do not hide keywords or mislead users with look-alike scripts.
- Be careful with homoglyphs that can spoof names or links.
- Output is plain text. The site does not insert scripts.
Change management
- Retest after browser, OS, or app updates that touch text or clipboard behavior.
- Update the Support Matrix with the new date and versions.
- Add an entry in the Changelog that describes what changed and where.
Reproducibility steps
- Open the specific generator page or the Invisible Text tool.
- Generate the sample output.
- Paste into the target app using plain and rich paste.
- Save, reload, or export and re-import.
- Copy back out and run
analyze(original, received). - Log status, date, versions, and any conditions.
Known limits
- Fonts and shaping engines affect what you see.
- Some apps normalize on paste or save.
- Keycap digits and flag sequences render differently by platform.
- Mirror and upside-down sets do not cover all glyphs.
- Heavy combining text is hard to edit and select.
I record these in notes and mark Varies when needed.
Privacy
- Processing happens in your browser.
- Pasted content is not sent to a server.
- Clipboard access is user-initiated.
- Analytics, if used, are described in the Privacy Policy.
References
- The Unicode Standard
https://www.unicode.org/standard/standard.html - Unicode Character Database
https://www.unicode.org/ucd/ - UAX 14 Line Breaking
https://www.unicode.org/reports/tr14/ - UAX 15 Normalization
https://www.unicode.org/reports/tr15/ - UAX 29 Text Segmentation
https://www.unicode.org/reports/tr29/
Contact
Corrections and questions: [email protected].
Include the page URL, the character or generator, your device and OS, app versions, the paste path, and the date.