v1.6.0WebsiteLatest
3 min read

Accessibility, Consent Transparency & Hero Performance

Dialogs are now real dialogs with a focus trap, every form field is properly labelled, the MCP consent screen shows where it is about to send you, and the landing page stops downloading a screenshot it never shows.

#What's Changed

  • [Security] The MCP authorization screen now shows the redirect destination and marks the client name as unverified. Client names and their matching brand icons come from dynamic registration, so anything can register as “Claude Desktop” and appear with that logo on the page where keys:reveal is granted. The redirect origin is the one part of the request a user can actually judge, and it was previously read but never displayed.
  • [Fix] Escape now closes only the topmost dialog. Each open modal registered its own key handler, so dismissing a vault key prompt stacked over an edit form closed both and discarded the form.
  • [Fix] Dialogs now expose role="dialog" and aria-modal, are named by their title, trap Tab within themselves, take focus on open, and return focus to whatever opened them on close. They were previously plain divs that a screen reader never announced and that Tab walked straight out of.
  • [Fix] Form fields across sign-in, registration, password reset, onboarding, settings, and vault key entry are now programmatically associated with their labels. 60 of 65 labels had no htmlFor, so screen readers announced the fields as unnamed and clicking a label did not focus its input.
  • [Fix] Form errors and success messages are announced to assistive tech via role="alert" and role="status". Submitting a wrong password previously appeared to do nothing at all.
  • [Fix] Checkboxes no longer render a nested <label>. Several call sites wrap the component in their own label, which produced invalid markup and unreliable click-to-toggle; the indeterminate state is now set on the input so it is reported as partially checked rather than unchecked.
  • [Improvement] The landing hero serves one screenshot instead of two. Both the desktop and mobile crops were rendered and hidden with CSS, which does not stop the download, and both carried priority — so a phone fetched the desktop image at 3840px wide and never showed it. The desktop crop now loads at 1080px, and mobile loads only the mobile crop.
  • [Improvement] The site now honours the operating system's “reduce motion” setting, stopping the integrations marquee and smooth scrolling, while leaving loading spinners running since they convey state.
  • [Improvement] Every interactive element has a visible keyboard focus ring. The shared Button had no focus style at all, so primary actions fell back to a browser outline that is nearly invisible on the solid black fill.
  • [Improvement] Added branded 404 and error pages with a way back. An unknown URL previously landed on the stock Next.js screen with no navigation, which matters most for stale /user/project links.
  • [Improvement] The landing page and docs gained a skip link and a <main> landmark, the integrations marquee no longer reads every tool name three times, and the service and role pickers expose combobox semantics with arrow-key navigation.
  • [Improvement] Light-mode accent colours now meet the 4.5:1 contrast minimum as small text, touch targets reach 44px on coarse pointers, and the homepage no longer re-reads 19 integration icons from disk on every request.