Methodology

Last updated: 2025-09-18

This page documents how I test two parts of the site:

  1. Invisible Text Copy for zero-width and whitespace characters
  2. 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.

CategoryTypical version example
Windows11 23H2
macOSSonoma 14.x
iOS17.x
Android14
Chrome128+ stable
Firefox129+ stable
Safari17.x on macOS and iOS
Edge128+ stable
Google DocsWeb current channel
Apple NotesiOS 17.x, macOS 14.x

Sampling strings

Short test strings make differences easy to spot.

  • Character probe: A[CHAR]B where [CHAR] repeats N times
  • Mixed sample: The quick brown fox 0123456789 !?
  • Multiscript: বাংলা বাংলা • Ελληνικά • Русский
  • Generator probe: Sample 123 plus a sentence length line for selection tests

Per-page test protocol

Do this for each generator page and for the Invisible Text tool.

  1. Generate
    Open the page. Enter the probe string. Copy the output using the page button.
  2. Paste
    Paste into each target. Try plain paste and rich paste if available.
  3. Save and reload
    Save the document or note. Close and reopen. Export and re-import when possible.
  4. Re-copy
    Copy back from the target. Compare with the original output.
  5. Normalize and diff
    Check equality on raw, NFC, NFD, NFKC, NFKD. See the helpers below.
  6. 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 typeMethod summaryWhat I verifyReversible
Bold, Italic, Cursive, Double-struck, Monospace, Old EnglishMap letters to Mathematical Alphanumeric Symbols or Fraktur code pointsOutput uses the intended block. Unmapped characters pass through. Round-trip mapping where definedYes when reverse map exists
Bubble, Squared, Regional indicatorsMap to enclosed or flag lettersCoverage of A-Z and digits where applicable. Rendering on mobileYes by reverse map
Full-widthConvert ASCII to full-width code pointsASCII 33..126 convert as expectedYes
Underline, Strikethrough, Outline, Neon, Shadow, Glow, Wavy, Cracked, Broken, Melting, DistortedAppend combining marks to each characterCombining marks are present. Selection and copy do not drop marksPartly, by stripping combining marks
Reverse, Mirror, Upside downReverse string and map glyphs where neededText order and mapped glyphs look correct. Caret navigation makes senseReverse is yes. Mirror and flip are partial
Zalgo and GlitchAdd many combining marks above, mid, belowCopy and paste keep marks. Decoder removes them cleanlyDecoder restores base text
Binary, MorseEncode characters to a text representationEncoder and decoder agree. Word gaps preservedYes
BrailleMap letters and numbers to Braille patternsNumber marker and letter mapping correctYes
Greek, Cyrillic, RunicSwap alphabet via static mapsMap is consistent. Unmapped symbols pass throughYes with reverse map
Emoji decorations and keycap digitsDecorate or overlay with emoji or keycapsKeycap rendering varies by platform. Document behaviorYes by removing decorations
Invisible (U+2800 and U+200B)Repeat a single code pointCode point matches generator. Copy result length is correctN/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-label and 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

  1. Open the specific generator page or the Invisible Text tool.
  2. Generate the sample output.
  3. Paste into the target app using plain and rich paste.
  4. Save, reload, or export and re-import.
  5. Copy back out and run analyze(original, received).
  6. 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

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.