Re-indexing seem sub-optimal. I can't think of a use case where people care if the design changes. Even some content changes are not going to be interesting. Someone corrected a typo, updated punctuation, that kind of thing... such things are just noise if you are trying to react to content changes.
Your system needs to know not only what changed, but whether or not it matters. Splitting meaningful content from irrelevant noise is exceedingly important. If you know that, you do not need to re-index because you can diff only the meaningful content.
As far as the 100K URLs, each URL has between 200 and 1000 sub-pages beneath the top-level page. They all need to be periodically scanned for updates, while capturing that distinction of noise vs. meaningful change. I've actually got code that does the needed work - it is scaling it up to that level that I didn't want to take on.
I'm not sure what you mean by no browsers. My existing scraper uses headless browsers, in order to capture JavaScript-driven content and navigate through a SPA without having to re-load at every URL change. If you are not using even a headless browser, how are you getting dynamic content?
Let me clarify, it just reindexes if the structured data changes, so it ignores layout changes. So it diffs the extractions.
Would be curious to try it out on your sites if you want to shoot me a few over - I can share my email.
It does use a browser to find dynamic content but does not afterwards.