Polishing Codex

rubyrailsbuilding-in-public

Codex has been in use for a couple of months now and the big features are in place. What we’re spending time on now is polish: the attention to detail that makes people feel the difference between a tool that was shipped and a tool that was loved. Users notice when someone cared about the small things, even if they can’t always articulate what feels different.

You’d think searching pull requests would be a day-one feature. It wasn’t. We were focused on the merge queue, push policies, and GPG verification. The core workflow worked. But once you have more than a dozen PRs, finding the one you want by scrolling is painful.

PR search filters by title, author, status, and branch. It’s a TurboSearch component from Sirius2, which does server-side search via Turbo Frames, so the results update as you type without a full page reload. The same pattern we use in Meera and Journey.

Here’s a small concern that solved a surprisingly common UX problem. When you click “Edit” on a repository setting or a PR task, you land on a form page. The form has a “Cancel” button. Where should Cancel take you?

Back to the previous page, obviously. But javascript:history.back() is fragile: what if the user opened the edit link in a new tab? What if they navigated through multiple pages to get here? The browser history might not go where you expect.

HasBacklink is a controller concern that captures the referrer on the inbound request and passes it to the view as a @backlink. The Cancel button uses the backlink if available, falls back to a sensible default if not. Four lines of code, used on every edit form in the app.

Tooltip clipping

This one was a Sirius2 fix triggered by Codex. Tooltip arrows were visually clipped by the drop shadow of the content box. The arrow element sits outside the tooltip’s bounding box, and the box-shadow on the tooltip was casting over it. The fix was adjusting the arrow’s position relative to the shadow. Tiny visual issue, but tooltips appear on every commit metadata badge, every status icon, every action button. When they look broken, the whole app looks unpolished.

Empty states with illustrations

Empty states matter more than you’d think. “No branches yet” as plain text feels like the app is broken. “No branches yet” with an illustration and a “Create branch” action feels like the app is waiting for you to do something. We added illustrated empty states for branches, PRs, and repositories. The illustrations came from our Sirius2 EmptyState component. Same component, different illustrations per context.

Activity feed polish

The activity feed in Codex tracks everything: commits pushed, branches created and deleted, PRs opened and merged, tags created, comments added. Each event type has its own rendering component. This week was about making those renderings consistent: same icon sizes, same spacing, same metadata formatting across all event types. Branch update events now show which commits were added. Tag events render the annotation if present.

It’s not the glamorous work that goes on a marketing page, like the features that make a tool useful. But the polish is what makes it feel like someone really cared.