<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Overlay on ErrorZap</title><link>https://errorzap.com/tags/overlay/</link><description>Recent content in Overlay on ErrorZap</description><image><title>ErrorZap</title><url>https://errorzap.com/og.png</url><link>https://errorzap.com/og.png</link></image><generator>Hugo</generator><language>en-US</language><copyright>ErrorZap</copyright><lastBuildDate>Sat, 05 Sep 2026 02:20:00 -0600</lastBuildDate><atom:link href="https://errorzap.com/tags/overlay/index.xml" rel="self" type="application/rss+xml"/><item><title>Wispr Flow's Android Bubble Was There—It Was Just Invisible</title><link>https://errorzap.com/posts/wispr-flow-android-bubble-invisible-not-touchable/</link><pubDate>Wed, 02 Sep 2026 15:00:00 -0600</pubDate><guid>https://errorzap.com/posts/wispr-flow-android-bubble-invisible-not-touchable/</guid><description>September 5 update: Wispr failed again, Android restarted, and my recovery helper also failed. I paid for Letterly despite preferring Wispr. Here is what the logs prove—and what they do not.</description><content:encoded><![CDATA[<h2 id="september-5-update-i-paid-for-letterly-because-i-need-dictation-to-work">September 5 update: I paid for Letterly because I need dictation to work</h2>
<p>Wispr stopped working on my Pixel 7 Pro again. I tried the recovery app I built around it. That did not fix it. I rebooted. That did not immediately fix it either. The phone then crashed, appeared to reinitialize parts of the system, and Wispr eventually worked again.</p>
<p>I am tired of this. I paid for Letterly as an alternative even though I still prefer Wispr&rsquo;s results. Letterly does not work nearly as well for the way I dictate. This is not a claim that Letterly wins a controlled accuracy or reliability benchmark; it is where repeated interruptions have pushed me as a customer.</p>
<p>I want Wispr to work. Liking the output does not make losing my input method acceptable.</p>
<h3 id="what-we-actually-found-on-the-phone">What we actually found on the phone</h3>
<p>The investigation connected to the actual Pixel and examined retained Android crash records, process exits, permissions, services, recovery status, and alarm scheduling. Wispr was version <strong>2.3.1, build 156</strong>, on Android 16. All times below are Mountain Daylight Time on September 5.</p>
<table>
	<thead>
			<tr>
					<th>Time</th>
					<th>Retained evidence</th>
					<th>What it establishes</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1:21 a.m.</td>
					<td>Android recorded a boot.</td>
					<td>A reboot occurred in this incident window.</td>
			</tr>
			<tr>
					<td>1:21:45 a.m.</td>
					<td>Phone-local Termux ADB aborted with <code>Address already in use</code> on its server socket.</td>
					<td>A recovery-control dependency had a startup collision. The same signature also appeared the previous afternoon.</td>
			</tr>
			<tr>
					<td>1:23 a.m.</td>
					<td>Several apps reported <code>DeadSystemException</code>; Android&rsquo;s system process reported a lost network stack.</td>
					<td>The failure extended beyond Wispr.</td>
			</tr>
			<tr>
					<td>1:23:53 a.m.</td>
					<td>Android recorded <code>SYSTEM_RESTART</code>.</td>
					<td>A framework restart occurred after the boot.</td>
			</tr>
			<tr>
					<td>1:28:18 a.m.</td>
					<td>My recovery worker recorded <code>control_unavailable</code>.</td>
					<td>It could not establish the connection needed to inspect or repair Wispr on that attempt.</td>
			</tr>
			<tr>
					<td>1:29 a.m.</td>
					<td>Wispr&rsquo;s foreground service and overlay activity resumed.</td>
					<td>Wispr was starting again; this alone is not proof that dictated text reached an editor.</td>
			</tr>
	</tbody>
</table>
<p>During the later working-state inspection, Wispr&rsquo;s accessibility service was enabled and bound. Its effective overlay permission was allowed, its microphone permission was granted, and it was already exempt from device-idle optimization. Roughly 45 GB of storage was free. Simply saying “enable the permissions” does not explain this incident.</p>
<p><strong>We did not prove that Wispr caused the Android crash.</strong> The system exception explicitly describes the lost network stack as a downstream effect. The initiating cause was not established by the surviving records. Nor did we capture the original, pre-reboot Wispr failure state this time. The invisible, non-touchable overlay documented below is an earlier verified incident, not a diagnosis we can automatically apply to every later failure.</p>
<h3 id="my-recovery-app-needs-fixing-too">My recovery app needs fixing too</h3>
<p>The workaround is mine, and its shortcomings belong in this update:</p>
<ul>
<li>It could not reach its ADB control connection, so the actual repair never began on the recorded failed attempt.</li>
<li>Its concurrency lock is acquired <strong>after</strong> ADB startup and discovery. Those operations therefore sit outside that protection. A socket collision is confirmed; the exact competing caller is not.</li>
<li>The app reported <code>termux_check_requested</code>, while the worker&rsquo;s separate result was <code>control_unavailable</code>. Requested is not checked, and checked is not repaired.</li>
<li>Android delayed the nominal three-minute alarm by about <strong>51 minutes</strong> under app standby during inspection. My original wording below overstated that schedule as an execution guarantee.</li>
</ul>
<p>The next repair is specific: protect connection startup, rediscover the paired connection after reboot, report results independently of that connection, and verify actual scheduling under standby. Then test a successful dictation after recovery. No permanent fix was installed during this investigation, and there is no evidence that my helper was what eventually restored Wispr that night.</p>
<h3 id="what-i-want-from-wispr">What I want from Wispr</h3>
<p>Please make the Android input path recover reliably, expose a useful failure state, and provide diagnostics that distinguish overlay failure, accessibility disconnection, and transcription or insertion failure. Users should not need a second application to babysit the first.</p>
<p>Wispr&rsquo;s <a href="https://docs.wisprflow.ai/articles/5002934560-why-is-the-wispr-bar-is-not-appearing-or-disappearing">bubble troubleshooting guide</a> describes reconnection and repair indicators. Its <a href="https://wisprflow.ai/whats-new">release notes</a> list Android 2.3.2, but the listed change is sign-in handoff—not a demonstrated fix for this incident.</p>
<p>I would rather keep using the dictation I like than build another app or keep paying for alternatives. But reliability has to be part of the product. The detailed findings above are why I am asking for a real fix, while being clear about the problems in my own workaround and the causes we have not established.</p>
<p><em>The original September 2 field note follows. Raw device logs and private identifiers are not published.</em></p>
<h2 id="original-september-2-field-note">Original September 2 field note</h2>
<p>Wispr Flow disappeared from my Pixel 7 Pro on September 2.</p>
<p>The obvious explanation was wrong.</p>
<p>The app was still installed and enabled. Its overlay permission was allowed. Its Accessibility Service was bound. The foreground service and process were alive. I had a normal text editor focused, the keyboard was open, and the microphone was not recording.</p>
<p>The Flow bubble was even still attached to Android&rsquo;s window manager.</p>
<p>It was just invisible and impossible to touch.</p>
<h2 id="the-failure-state">The failure state</h2>
<p>This happened with Wispr Flow 2.3.1 on Android 16. The important window-manager fields looked like this:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>window type: APPLICATION_OVERLAY
</span></span><span style="display:flex;"><span>requested size: 263 x 263
</span></span><span style="display:flex;"><span>alpha: 0.0
</span></span><span style="display:flex;"><span>shown alpha: 0.0
</span></span><span style="display:flex;"><span>flag: NOT_TOUCHABLE
</span></span></code></pre></div><p>That is a nasty failure mode because almost every normal health check says the app is fine. Reinstalling, randomly toggling permissions, or blaming Android&rsquo;s process killer would have missed the actual condition.</p>
<p>The reliable test was not “is the permission enabled?” It was:</p>
<blockquote>
<p>Is the real overlay window attached, visible, nontransparent, on screen, and touchable while a harmless editor has an active input connection?</p>
</blockquote>
<p>In this case the answer was no.</p>
<p>Wispr&rsquo;s own Android documentation says the Flow bubble depends on both display-over-other-apps permission and its Accessibility Service. Those prerequisites were present here. The broken state was one layer deeper: the overlay lifecycle had produced an attached but inert window. The official <a href="https://docs.wisprflow.ai/articles/2809924024-android-download-installation-guide">Android setup guide</a> and <a href="https://docs.wisprflow.ai/articles/2772472373-what-is-flow">Flow overview</a> explain the intended permission stack and bubble behavior.</p>
<h2 id="what-restored-it">What restored it</h2>
<p>The recovery had to account for an Android 16 behavior that can make a careless fix destructive: force-stopping Flow removes Flow&rsquo;s component from the enabled Accessibility Service list.</p>
<p>So the recovery order was:</p>
<ol>
<li>Capture the complete enabled Accessibility Service list.</li>
<li>Refuse to proceed if the phone identity, editor state, overlay permission, microphone state, or non-Flow service baseline is unsafe.</li>
<li>Confirm the same fault twice, 20 seconds apart.</li>
<li>Force-stop only Wispr Flow.</li>
<li>Verify every non-Flow accessibility component survived, normalizing Android&rsquo;s short and fully qualified component-name formats.</li>
<li>Reinsert only Flow&rsquo;s accessibility component.</li>
<li>Launch Flow, return to the original editor, and inspect the actual bubble window again.</li>
</ol>
<p>The repaired window read:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>alpha: 0.8
</span></span><span style="display:flex;"><span>shown alpha: 0.8
</span></span><span style="display:flex;"><span>on screen: true
</span></span><span style="display:flex;"><span>visible: true
</span></span><span style="display:flex;"><span>touchable: true
</span></span><span style="display:flex;"><span>requested size: 263 x 263
</span></span></code></pre></div><p>It held that state in a second check 20 seconds later. The microphone remained idle, and every other accessibility service remained enabled.</p>
<h2 id="i-added-a-watchdog-because-this-was-not-a-one-off">I added a watchdog because this was not a one-off</h2>
<p>I have now seen the Flow affordance disappear on both a TCL phone and this Pixel. A manual repair is useful; a recurring input failure needs a guarded recovery loop.</p>
<p>The Pixel now has an isolated, device-bound watchdog modeled after the one I built for the TCL. It requests a safe check on a nominal three-minute schedule and after boot/unlock events. <strong>September 5 correction: Android can defer that alarm, and a requested check can fail before reaching Wispr; see the update above.</strong> It does not type, record audio, or touch arbitrary apps. It refuses to repair while the phone is locked, the microphone is active, a sensitive input type is focused, the overlay permission is missing, or the non-Flow accessibility baseline cannot be proven.</p>
<p>It also has:</p>
<ul>
<li>two-sample fault confirmation</li>
<li>a 10-minute cooldown</li>
<li>a maximum of six recoveries per day</li>
<li>concurrent-run locking and stale-lock recovery</li>
<li>rollback on accessibility-list mismatch</li>
<li>device, model, and app-scoped identity binding</li>
<li>a post-repair requirement that the original editor regain focus and the bubble become visible and touchable</li>
</ul>
<p>The offline regression suite passed 19 scenarios, including healthy no-op, sleeping and locked devices, sensitive editors, an active microphone, revoked overlay permission, wrong-device refusal, a flapping fault, concurrent workers, stale locks, missing accessibility, a missing bubble, and an inert bubble.</p>
<p>Then I tested it against the real phone. The worker first reported a healthy no-op with all accessibility services unchanged. It later detected the inert bubble, performed one ordered restart, preserved the accessibility list, and logged a verified healthy bubble. When I deliberately injected another fault inside the 10-minute window, it correctly refused a second restart as <code>cooldown</code> instead of entering a repair loop.</p>
<p>That last distinction matters. “The automation ran” is not proof. A useful watchdog needs evidence that it repaired the intended condition, evidence that it preserved unrelated state, and evidence that it knows when not to act.</p>
<h2 id="what-wispr-should-fix">What Wispr should fix</h2>
<p>The product-side fix is smaller than my workaround.</p>
<p>Wispr&rsquo;s Android watchdog should treat an attached overlay as unhealthy when any of these are true in an active text-input context:</p>
<ul>
<li>effective alpha is zero</li>
<li>shown alpha is zero</li>
<li>the window is non-touchable</li>
<li>the overlay is off screen or not visible</li>
</ul>
<p>When that state survives a short debounce, Flow should rebuild the overlay without requiring the user to toggle permissions or restart the whole app.</p>
<p>The current health model appears to stop too early at “service alive” or “window attached.” An invisible, non-interactive microphone button is not healthy just because Android still has a window record for it.</p>
<h2 id="the-practical-takeaway">The practical takeaway</h2>
<p>If Flow vanishes on Android, check the actual overlay state before tearing apart the installation:</p>
<ol>
<li>Confirm the app, Accessibility Service, and overlay permission are present.</li>
<li>Open a harmless text editor and show the keyboard.</li>
<li>Confirm Flow is not actively recording.</li>
<li>Inspect whether the overlay is attached but transparent or non-touchable.</li>
<li>Preserve the full accessibility list before any force-stop or rebind.</li>
<li>Verify the repaired bubble itself, not just the process.</li>
</ol>
<p>Wispr Flow is still the dictation tool I keep using. That is exactly why this failure is so aggravating: when a tool becomes part of your input system, an invisible button is not a cosmetic bug. It is an outage.</p>
]]></content:encoded></item></channel></rss>