Current limits
Dyno tests web UI. Keep platform UI tests for native iOS and macOS apps, and real-device checks for behavior a desktop viewport can’t prove.
Browser support
Section titled “Browser support”The runner needs ES2022 and modern APIs: AbortSignal.timeout, AbortSignal.any, Promise.withResolvers, crypto.getRandomValues, and EventSource. Older browsers, including historical WebOS builds, need compatibility work. Phones, iOS, and TVs still need verification of companion popups and background execution. See browser setup.
Ordinary Interactor actions use DOM methods and synthetic events. Use explicit native actions for browser defaults or trusted input. Closed shadow roots, downloads, video, visual baselines, and HTTPS gateway serving are outside this version.
App origins and isolation
Section titled “App origins and isolation”The gateway uses HTTP. Secure cookies and secure-context features may need a different test origin. HTML routes, including fixtures, need the app’s opener and agent-cluster isolation headers; changing policy can disconnect the companion even on the same origin.
Avoid changing window.name during a run; Dyno uses it to keep the companion connected. Tests and app code have separate contexts but share an origin. This isn’t a security sandbox. An infinite loop can freeze the browser; Node can stop a managed browser, but can’t recover a manual browser’s event loop.
Run limits
Section titled “Run limits”The gateway rejects unknown Host headers and foreign WebSocket origins. Event and command requests have a 1 MB limit. Large observer views stream in bounded records; a slow reader may disconnect without losing accepted results or saved output.
Up to 20 browser runs can be active. Dyno drops finished runs as new ones join. If all 20 are still active, finish or close one before joining again.