Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Character Analyzer — see everything about every character, in the Terminal Workbench style

Live site · Features · Run it · Keyboard · Host it yourself · Development

Paste any string — a password, a suspicious URL, a filename that "looks right" — and see everything about its characters. Every character gets its own colored box so lookalikes (I vs l vs 1, O vs 0, Cyrillic а vs Latin a) are unmistakable, invisible characters have nowhere to hide, and MD5/SHA hashes are one click away. Styled with the Terminal Workbench design system: calm graphite surfaces, restrained ANSI accents, monospace manifest labels.

No network. No dependencies. No build step. Every lookup uses committed data tables, every hash is computed in your browser, and nothing you paste ever leaves the page. Open index.html from a USB stick and it works.

Features

  • Character grid — one box per character (grapheme-aware: a 👨‍👩‍👧 family is one box), colored by class: uppercase, lowercase, digits, symbols, whitespace/invisible, other. The code point rides under every glyph, so identical-looking characters are still distinguishable at a glance.
  • Nothing hides — spaces, tabs, newlines, NBSP, zero-width characters and bidi controls all render as visible symbolic placeholders (, , ZWSP, RLO…) in warning red.
  • Inspector — click any box for the full record: official Unicode name, code point, category, block, UTF-8 bytes, UTF-16 units, decimal/hex/binary, HTML entities, and the characters it's easily confused with.
  • Warnings — automatic flags for mixed-script homoglyphs (Cyrillic а in a Latin word), invisible characters, smart punctuation, and lookalike pairs co-present in the same string.
  • Statistics — graphemes vs code points vs bytes, counts per class, distinct/repeated characters, and a Shannon entropy estimate.
  • Hashes & encodings — MD5 (pure JS, verified against the RFC 1321 vectors), SHA-1/256/512, CRC32, Base64, hex, URL- and HTML-escaped forms — each with click-to-copy.
  • Unicode-complete — a compact generated table of all 38k+ Unicode names, categories and blocks is committed to the repo; CJK, Hangul, Tangut and Nushu names are computed algorithmically. No runtime fetch.
  • Both themes, six accents — dark by default, light by preference or toggle; scrollbars, inputs and focus rings all follow the theme.
  • The ghost — the family site pet, ported from worldclock. It drifts, peeks at your panels, naps, and flees the cursor. Click it to recolor it.
  • Private by construction — no network requests, no analytics, no external fonts. The footer isn't kidding: nothing leaves your browser.

Run it

Open index.html. That's it — it works from file://, a USB stick, or any static file server.

For a local server:

python -m http.server 8000

then visit http://localhost:8000.

Keyboard

Press ? in the app to bring up this same list at any time.

Key Action
/ focus the input
s settings
t toggle theme
? this help
esc close / unfocus

Host it yourself

Everything needed to host is in this repository — static files only, no build.

GitHub Pages: fork or push this repo, then Settings → Pages → Deploy from branch → main / / (root). The included .nojekyll is required (it stops Jekyll from mangling the files).

GitLab Pages: the included .gitlab-ci.yml publishes the site on every push to the default branch — no configuration needed. Works on self-hosted/airgapped GitLab too; the job only copies files, nothing is fetched.

Anything else: copy index.html, css/, and js/ to any web root.

Offline / airgapped: grab the zip from the latest release — it contains everything above; no network is needed to host or run it.

Development

  • tests.html — dependency-free in-browser test suite (open it; expect FAIL 0). Covers the RFC 1321 MD5 vectors, CRC32/SHA vectors, encoders, Unicode name/category/block lookups (including algorithmic CJK and Hangul names), character classification, confusable detection, grapheme segmentation and entropy.
  • tools/gen_unicode.py — regenerates js/unidata.js from Python's stdlib unicodedata plus the vendored tools/reference/Blocks.txt. One-time tool; its output is committed so the site never needs it at runtime.

Architecture

File Responsibility
js/unidata.js generated Unicode tables: names, category runs, block ranges (committed)
js/uniinfo.js lookup API: names (incl. algorithmic), categories, blocks, character classes, invisible placeholders
js/hashes.js pure-JS MD5 + CRC32, crypto.subtle SHA wrappers, Base64/hex/URL/HTML encoders
js/confusables.js curated lookalike groups, script detection, warning analysis
js/analyzer.js grapheme segmentation, statistics, character grid, inspector, live pipeline
js/settings.js preference store (sole localStorage owner), settings panel, theme/accent, shortcuts, help
js/pet.js the ghost

Plain scripts, one shared CA namespace, and two window events (ca:prefs, ca:pet) — no framework, no modules, view-source friendly.

Credits

License

MIT

Releases

Contributors

Languages