Glyph v0.2: the release is the joinery Glyph v0.2 was released, adding seven new components to bring the total catalog from sixteen to twenty-three, but the key focus is that these components are designed to compose together. The release includes three single-binary terminal user interfaces (chat-cli, log-viewer, and dashboard) that demonstrate this composability, each built from multiple components in a single Go file with headless test suites. The update also fixes a previous issue where component gallery GIFs were broken on GitHub by updating the rendering pipeline and ensuring all GIFs are tracked in the repository. Glyph v0.2 landed today, a day after v0.1. Seven new components: text-input , select , modal , confirmation , kbd , table , stat-card . The catalog grew from sixteen to twenty-three. But the catalog is not the release. The release is that they compose. Alongside the components, v0.2 ships three single-binary TUIs in the examples/ tree: chat-cli , an agent-style REPL composing thirteen components: status-bar , chat-thread , chat-bubble , chat-input , key-hints , notification-toast , spinner , command-palette , modal , text-input , confirmation , select , theme .log-viewer , a journalctl-style live feed composing nine: log-stream , tabs , status-bar , key-hints , notification-toast , panel , text-input , select , theme .dashboard , an engagements control room composing nine: tabs , stat-card , table , text-input , modal , status-bar , key-hints , notification-toast , theme .Each is one Go file. Each has a headless test suite that drives the model with synthetic tea.Msg values and asserts on the rendered view. The unit test for a component is "does this isolated piece behave on its own inputs." The composition test is "does text-input survive being wrapped in a modal wrapped in lipgloss.Place drawn on top of a tab strip that listens for its own keys." The second test is the one that catches the bugs the first cannot see. I almost shipped the dashboard composing ten components. I had written = panel.New theme.Default at the top of main.go as an unused import-touch line, then claimed "ten components composed" in the docstring. The panel was never drawn anywhere. I caught it mid-commit, deleted the import, dropped the count to nine across the file docstring, the CHANGELOG , and the README. The dashboard composes nine. If you are reading a release post and a count seems padded, it usually is. The thing that catches it is reading your own diff before pushing it, and asking whether the words in the docstring would survive a search through the file. Four of the seven new components are overlay-shaped: modal , confirmation , select , and less obviously command-palette , which already shipped in v0.1. They all need the same three things from the host: Esc to a cancel message the parent can match on.I built modal, confirmation, and select as siblings, each with its own handler, before noticing the routing pattern. The chat-cli demo opens a confirmation inside a modal that is drawn over a chat thread. The routing works because each overlay only matches its own keys; everything else falls through to the parent's Update . That pattern was not designed. It emerged because every overlay needs the same thing. A future viewstack primitive would canonicalize this. Not in v0.2. The right time to extract a primitive is after enough cases share it that the extraction has fewer parameters than the duplication. Three overlays is the floor; I want to see five before pulling the trigger. The v0.1 release page promised per-component gallery GIFs. The README rendered them as raw HTML