Bug
Running skillui --url <url> --mode ultra against any site that holds long-lived network connections fails with:
✗ Ultra extraction page.goto: Timeout 30000ms exceeded.
Call log:
- navigating to "https://<site>/", waiting until "networkidle"
Root cause
waitUntil: 'networkidle' requires zero in-flight network connections for 500ms straight. That condition never becomes true on sites that hold connections open indefinitely:
- Cloudflare Turnstile / Bot Management (3+ long-poll connections per protected page)
- Chat widgets — Tawk.to, Intercom, Drift, LiveChat, Zendesk
- Session recording — Hotjar, FullStory, LogRocket
- Remarketing pixels — Google Ads
ga-audiences, Meta Pixel
That's most of the commercial web. On affected sites the 25–30s timeout fires and ultra extraction silently bails with no useful data.
Repro
skillui --url https://gironroofing.com --mode ultra
Instrumented Playwright on that page and confirmed 4 connections still open 10s after load fired:
| host |
role |
challenges.cloudflare.com/... (×3) |
Cloudflare Turnstile bot-detection iframes |
www.google.com/ads/ga-audiences |
Google Ads remarketing beacon (intentionally never returns) |
Fix
PR #3 replaces waitUntil: 'networkidle' with waitUntil: 'load' plus a soft waitForLoadState('networkidle', { timeout: 8000 }) in try/catch across 6 ultra/computed extractor goto sites. Well-behaved sites still benefit from the network-idle wait; affected sites continue rather than silently failing.
Also adds &screenshot.fullPage=true to the Microlink screenshot URL so screenshots/homepage.png captures the entire scrollable page rather than just the 1280×720 viewport.
Related
Bug
Running
skillui --url <url> --mode ultraagainst any site that holds long-lived network connections fails with:Root cause
waitUntil: 'networkidle'requires zero in-flight network connections for 500ms straight. That condition never becomes true on sites that hold connections open indefinitely:ga-audiences, Meta PixelThat's most of the commercial web. On affected sites the 25–30s timeout fires and ultra extraction silently bails with no useful data.
Repro
Instrumented Playwright on that page and confirmed 4 connections still open 10s after
loadfired:challenges.cloudflare.com/...(×3)www.google.com/ads/ga-audiencesFix
PR #3 replaces
waitUntil: 'networkidle'withwaitUntil: 'load'plus a softwaitForLoadState('networkidle', { timeout: 8000 })in try/catch across 6 ultra/computed extractor goto sites. Well-behaved sites still benefit from the network-idle wait; affected sites continue rather than silently failing.Also adds
&screenshot.fullPage=trueto the Microlink screenshot URL soscreenshots/homepage.pngcaptures the entire scrollable page rather than just the 1280×720 viewport.Related