Every Glyph, No Faff
An ad-free, bloat-free browser for every emoji, every HTML entity, every named Unicode symbol.
~7,000 characters in one minimal grid. Every emoji, every HTML entity, every named Unicode symbol. Search in 15 languages,
click to copy, or download a crisp 2048×2048 transparent PNG. Pure client-side: data.json loads once, the page
works offline after.
Finding the right unicode symbol or emoji online means wading through ad-funded sites bloated with newsletter popups, "trending" panels and other engagement-bait. Fair enough, they have to pay the bills somehow. But the experience is bad.
"I can make one of those" - and that is exactly what happened. A weekend pair-with-Claude exercise produced a clean tool that does one job, fast. Free, no ads, no signup, no analytics. A small everyday annoyance, solved properly.
Vanilla JS, no framework. The full character dataset is ~700KB gzipped data.json served once and cached aggressively;
after the first load the page works offline. Search is fuzzy-matched against names in 15 languages. Each glyph renders into a 2048×2048
transparent canvas on demand for download. A dozen quiet interface puzzles are buried in here: how to display 7,000 symbols
without scroll-jank, how to keep search instant, how to make "click to copy" obvious without intruding, how to handle right-to-left
scripts, how to keep the keyboard navigation sensible.
The curiosity-to-tool practice in its purest form: notice a small annoyance, build the tool you wanted, deploy it as a free utility. Same instinct produces the Mars Water Level demo and the AI-Native CMS. Find a problem or an interesting puzzle, solve it properly, leave the result running.
If your product is the answer to a small everyday annoyance, the bar this hits is the bar to aim for.
All experimentsThis article was drafted with the help of AI to populate the page. I'm in the process of rewriting it - a principle I adhere to across all projects. AI produces boilerplate, not production-quality output.
If your product is the answer to a small everyday annoyance, the bar this hits is the bar to aim for.
Misbehaving stack? Codebase that won't play fair?