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.
- 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.
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.
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 |
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.
tests.html— dependency-free in-browser test suite (open it; expectFAIL 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— regeneratesjs/unidata.jsfrom Python's stdlibunicodedataplus the vendoredtools/reference/Blocks.txt. One-time tool; its output is committed so the site never needs it at runtime.
| 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.
- Design tokens: terminal-workbench-design-system (MIT)
- Pet ghost: ported from worldclock, originally from vault (MIT)
- Unicode data: Unicode Character Database via Python's
unicodedataandBlocks.txt