<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://lycheeisle.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://lycheeisle.com/" rel="alternate" type="text/html" /><updated>2026-05-26T23:17:03+00:00</updated><id>https://lycheeisle.com/feed.xml</id><title type="html">Lychee Isle</title><subtitle>Indie Mac and iOS apps by Xun</subtitle><author><name>Xun</name></author><entry><title type="html">The email that fixed ReTab</title><link href="https://lycheeisle.com/blog/adding-voiceover-to-retab/" rel="alternate" type="text/html" title="The email that fixed ReTab" /><published>2026-05-25T00:00:00+00:00</published><updated>2026-05-25T00:00:00+00:00</updated><id>https://lycheeisle.com/blog/adding-voiceover-to-retab</id><content type="html" xml:base="https://lycheeisle.com/blog/adding-voiceover-to-retab/"><![CDATA[<p>A visually impaired user emailed me last week:</p>

<blockquote>
  <p>I am visually impaired and rely on the screen reader (VoiceOver) built in to the OS.</p>

  <p>When I invoke Re-Tab via CMD+E and then release/depress E, VoiceOver reads “ReTab (tap to hop, hold to cycle)” instead of the tab title, preventing access to the functionality of the app.</p>
</blockquote>

<p>A year of shipping ReTab, fifteen versions, and the picker was unreadable to a screen reader the whole time. I hadn’t thought to test.</p>

<h2 id="i-had-it-backwards">I had it backwards</h2>

<p>The picker lives inside a Shadow DOM, opened in <code class="language-plaintext highlighter-rouge">mode: "closed"</code> to stop Dark Reader from inverting the highlight color on some pages. I’d assumed closed mode also hid the picker from VoiceOver, so I’d never bothered with ARIA.</p>

<p>It doesn’t. The <code class="language-plaintext highlighter-rouge">closed</code> part only blocks JavaScript — the accessibility tree walks right through. The picker had been sitting there, perfectly visible to VoiceOver, with nothing labeled for it to read.</p>

<h2 id="an-afternoons-work">An afternoon’s work</h2>

<p>I added six attributes. The panel became a <code class="language-plaintext highlighter-rouge">listbox</code>, each card an <code class="language-plaintext highlighter-rouge">option</code> labeled with the tab title, and <code class="language-plaintext highlighter-rouge">aria-activedescendant</code> followed the highlight.</p>

<p>Then I trimmed the manifest description. Mine read <code class="language-plaintext highlighter-rouge">"ReTab (tap to hop, hold to cycle)"</code> — which Safari announced on <em>every</em> press while Cmd+E was held. Cycle through four tabs, hear the same eight syllables four times. The App Store listing and options page already explain the gesture, so the manifest got cut to one word:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ReTab"</span><span class="w">
</span></code></pre></div></div>

<h2 id="what-it-sounds-like-now">What it sounds like now</h2>

<p>Before, cycling four tabs:</p>

<blockquote>
  <p>“ReTab tap to hop hold to cycle.” [silence]
“ReTab tap to hop hold to cycle.” [silence]
“ReTab tap to hop hold to cycle.” [silence]</p>
</blockquote>

<p>After:</p>

<blockquote>
  <p>“ReTab. GitHub, 1 of 5, selected.”
“Stack Overflow, 2 of 5, selected.”
“MDN, 3 of 5, selected.”
[Cmd released, tab switches]</p>
</blockquote>

<p>Same picker, same code path. Six attributes and one trimmed string later, it sounds like macOS Cmd+Tab.</p>

<h2 id="takeaway">Takeaway</h2>

<p>A year of broken accessibility against an afternoon of fixing it. The ratio is bad even if only one person was affected.</p>

<p>ReTab 3.2 ships this week with the fix. If you use a screen reader and try it, I’d love to hear how it feels — and thanks to the reader who sent the email.</p>]]></content><author><name>Xun</name></author><summary type="html"><![CDATA[A visually impaired user emailed about ReTab being unusable with VoiceOver. The fix took an afternoon — and uncovered a wrong assumption I'd carried for a year.]]></summary></entry></feed>