Unhappy Paths
Read Issue 01

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

Issue 01Unicode & bidirectional text

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
  1. Plate A: What is actually one character?An inspector for grapheme clusters, code points, UTF-16 and UTF-8.
  2. Plate B: Why does this sentence change direction?A bidirectional text playground with four markup strategies.
  3. 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Read the principles in full

Territories still to map.

Planned, not published. Each becomes an issue only once its plates work and its claims are checked.

  1. Time zones & daylight savingUpcoming

    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.

  2. Mobile viewport & keyboardUpcoming

    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.

  3. Input handling & validationUpcoming

    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.

  4. AccessibilityUpcoming

    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.

  5. CSS layoutUpcoming

    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.

  6. Browser renderingUpcoming

    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.

  7. Network conditionsUpcoming

    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.