Steps to reproduce
moli fetch --dump json --wait-until done --timeout 30000 https://habr.com/en/articles/
Expected
A best-effort snapshot of the page (it is fully usable in a real browser at this point).
Actual
Error: failed to fetch `https://habr.com/en/articles/`
Reason: fetch readiness timed out after 30000 ms while waiting for load
Zero bytes of output. --wait domcontentloaded, domstable, and networkidle all time out as well, because readiness is anchored to load completion.
Analysis
On this page (habr.com/en/articles/), document.readyState reaches "interactive" and stays there forever — load never fires. Chrome 154 behaves the same way (it also never fires load), but Chrome users still see the content because the page is usable at the interactive stage. moli treats "load did not fire" as "give the user nothing".
document.readyState === "interactive" is readable throughout, so the fallback is feasible with data moli already has.
This is the single largest cause of fetch failures in our 192-URL public-web regression pool (~90 domains).
Suggestion
On readiness timeout, fall back to a best-effort snapshot at the DOMContentLoaded/interactive stage instead of aborting with zero output.
Environment
- moli 1.1.10 (9b2f86b), Linux
- Verified 2026-09-24, direct network and via proxy, same result
Steps to reproduce
Expected
A best-effort snapshot of the page (it is fully usable in a real browser at this point).
Actual
Zero bytes of output.
--wait domcontentloaded,domstable, andnetworkidleall time out as well, because readiness is anchored to load completion.Analysis
On this page (habr.com/en/articles/),
document.readyStatereaches"interactive"and stays there forever —loadnever fires. Chrome 154 behaves the same way (it also never fires load), but Chrome users still see the content because the page is usable at the interactive stage. moli treats "load did not fire" as "give the user nothing".document.readyState === "interactive"is readable throughout, so the fallback is feasible with data moli already has.This is the single largest cause of fetch failures in our 192-URL public-web regression pool (~90 domains).
Suggestion
On readiness timeout, fall back to a best-effort snapshot at the DOMContentLoaded/interactive stage instead of aborting with zero output.
Environment