Skip to content

fix: gate pods on WebAssembly JSPI and drop the iOS user-agent check - #51

Merged
GabrielaReyna merged 2 commits into
mainfrom
fix/browser-checks
Oct 26, 2026
Merged

GabrielaReyna merged 2 commits into
mainfrom
fix/browser-checks

Conversation

@sderossi

@sderossi sderossi commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Summary

BrowserPod 3.1.0+ starts its runtime through WebAssembly.promising (JSPI) with no fallback (bfe367f in BrowserPod). podBlocker() only checked Atomics.waitAsync and isolation, so browsers without JSPI passed the check and then broke partway through boot.

  • JSPI check: podBlocker() now also requires WebAssembly.promising. Safari 16.4–26 and Firefox 145–152 get the "Incompatible Browser" overlay instead of a broken pod.
  • Overlay text: "Requires WebAssembly JSPI (Chrome and Edge 137+, Firefox 153+, Safari 27+)". The old text listed Safari 16.4+ as compatible.
  • iOS modal removed: the global modal and the hard stop in agents/boot.ts.
    • The modal also blocked Java projects, which run on CheerpJ and need neither JSPI nor cross-origin isolation.
  • iOS still blocked for pods, through podBlocker() instead: Safari 27 does support JSPI, so iOS clears the feature check, boots a pod, and then fails at pod.run — agents hang on "Starting Claude...", the IDE errors at the dev server stage. isIos() now returns an 'unsupported-platform' blocker, checked before the feature detection, with its own overlay branch. A stopgap until the cause is known (suspected memory limits). Java keeps working on iOS, since CheerpjRuntime.blocker() still returns null.

Plus README updates.

BrowserPod 3.1.0+ starts its runtime through WebAssembly.promising, so
browsers with Atomics.waitAsync but no JSPI (Safari 16.4-26, Firefox
145-152) passed podBlocker() and then failed during boot. Check for JSPI
too, and state the real minimum versions in the overlay and the README.

With the feature check deciding, the iOS user-agent check is redundant:
iOS 26 and older now fail it, and the global modal also wrongly blocked
Java projects, which run on CheerpJ and need neither JSPI nor
cross-origin isolation. The README and embedding guide now say Java
embeds don't need the isolation headers.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Deploying browsercode with  Cloudflare Pages  Cloudflare Pages

Latest commit: b306b7d
Status: ✅  Deploy successful!
Preview URL: https://82778c18.browsercode.pages.dev
Branch Preview URL: https://fix-browser-checks.browsercode.pages.dev

View logs

Testing the JSPI gate on an iPhone running iOS 27.0.1 showed Safari 27
supports JSPI, so iOS passes podBlocker() and the pod boots. Process
execution is what fails: agents hang forever on "Starting Claude..." at
bootCLI's pod.run, and the IDE errors at the dev server stage. The cause
is unknown, suspected to be an iOS memory limit rather than a missing
WebAssembly feature, so no feature check can stand in for it yet.

Bring isIos() back as an 'unsupported-platform' blocker, checked before
the feature detection because iOS clears all of it. The check lives in
podBlocker() rather than in a global modal, so CheerpjRuntime.blocker()
still returns null and Java projects keep running on iOS, which is what
dropping the modal was for. The overlay gets its own branch: falling
through to the JSPI text would tell an iOS 27 user to upgrade to
Safari 27. Marked a stopgap in the doc comment, to remove once pods run
there.

Also corrects the comment above the AgentShell gate, which still
explained it in terms of SharedArrayBuffer alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@GabrielaReyna
GabrielaReyna merged commit 59fa9e9 into main Oct 26, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants