The cases your interface was never tested on.
Short names, one language, a fast connection, a wide screen: that is the happy path. Unhappy Paths reproduces what happens off it, in your own browser, explains it from the specification, fixes it and hands you the tests.
Read Issue 01How an issue works
How long is this?
Counted by your browser
- Characters, to a reader
- 1
- Code points
- 7
- JavaScript’s
.length - 11
- Bytes in UTF-8
- 25
Three counts disagree with what a reader sees.
Text Is Not as Simple as It Looks
What counts as one character, why JavaScript disagrees, and how browsers lay out mixed Arabic and English text. Three live experiments, production patterns and reusable test fixtures.
Read the issue- Plate A: What is actually one character?An inspector for grapheme clusters, code points, UTF-16 and UTF-8.
- Plate B: Why does this sentence change direction?A bidirectional text playground with four markup strategies.
- Plate C: An order summary that survives real dataA production pattern you can switch between Arabic and English.
Every issue walks the same four steps.
Reproduce
A live plate that runs your browser’s real behaviour, never a simulation of it.
Paste a family emoji and watch four counts disagree.
Understand
The mechanism in plain language, traced to the specification that defines it.
Why digits after Arabic letters change sides: rule W2 of the bidi algorithm.
Fix
Production code you can copy, with the trade-offs it makes stated openly.
<bdi>,dir="ltr"and logical CSS in a real order summary.Test
Fixtures, checklists and test code to take back to your own project.
23 test strings with expected results, as tables and as JSON.
Correct before clever.
- Real behaviour.
- Plates use the browser’s own rendering and APIs. If something cannot be shown honestly, it is not shown.
- Primary sources.
- Claims link to the specification, standard or reference that supports them.
- Stated limits.
- Each issue says what it covers, what it does not, and where browsers may differ.
- Private by construction.
- Static pages, no accounts, no analytics. Nothing you type leaves your browser.
Territories still to map.
Planned, not published. Each becomes an issue only once its plates work and its claims are checked.
Time Is a Local Arrangement
Why can a local time like 02:30 simply not exist on some days, and occur twice on others?
Wall-clock time versus instants, daylight-saving gaps and overlaps, and storing a future event without losing the time zone it was planned in.
The Viewport Is Not the Window
What happens to 100vh when the browser toolbar collapses or the on-screen keyboard opens?
Large, small and dynamic viewport units, the visual viewport, and keeping a focused input visible above a software keyboard.
Every Keystroke Is a Negotiation
Why does validating on every keydown break typing in Japanese, Chinese or Korean?
Composition events and input method editors, paste and autofill, and validation that respects how people actually enter text.
What the Screen Reader Hears
Your button looks labelled. Does it have an accessible name?
How accessible names are computed, when live regions announce (and when they stay silent), and focus that survives a re-render.
When Content Refuses the Box
Why does one long word push a flex item out of its container?
Automatic minimum sizes in flexbox and grid, unbreakable strings, and layouts that survive translation and real user data.
Same Markup, Different Pixels
Which font is actually drawing this glyph?
Font fallback per character, form controls that look native everywhere, and the rendering differences worth testing for.
Slow, Offline, Retried
What does your interface show while a request is neither finished nor failed?
Timeouts, duplicate submissions, optimistic updates that need undoing, and states between loading and loaded.