# How ipx was built The long-form record, newest first: what landed each day, what was wrong before, and what it cost to find out. [CHANGELOG.md](../CHANGELOG.md) has the short version, by release; this is where the reasoning lives. New write-ups go at the top. See [README.md](../README.md) for what the thing is. ## 2026-09-11 — A design pass on the web UI A review against screenshots of every view in all three themes found that Dark and Light read as a generic dark dashboard: one pale blue did every job, most labels were bold, and nothing led. The list it produced, in `TODO.md`, was worked through in one go. What was worth knowing: - **Amber means new.** Badges, unread dots and download bars take the icon's EQ amber; blue is left for the primary action and links. Light's amber was `#b06f10`, which gives white text 4.1:1, short of AA for 11 px bold. It is `#9a5f0a` now, 5.2:1. - **EQ bars mark what is playing.** Three `` bars stand at 60, 100 and 40 % and animate only while `body.playing` is set. The first version left the animation on but paused, expecting each bar to hold a different frame. The frames it held were within a pixel of each other, and on screen the bars read as three dots. Under reduced motion one rule drops every animation and transition, which leaves the bars standing. - **The focus ring was clipped.** `.tgroup` and `#topbar` both set `overflow:hidden`, so a ring drawn outside a toolbar button was cut off. Rings inside clipping parents are inset instead. - **The feed list could not be used from the keyboard at all.** Rows were `
`s and the triangle a ``, so Tab went from the feed filter to Sign out. Rows now take focus, the triangle is a `