Orchestrate the scan behind one cached, budgeted call

FeatureSecurityService
Shipped
August 25, 2026 at 4:50 PM UTC
Author
Kamo
Commit
66a4785

One response rather than three endpoints because it is one scan: the logo must be downloaded before its pixels can contribute a colour, and the colours are wanted on a step the member reaches before the backgrounds. Splitting it would mean scanning the site three times. The extractors stay pure readers over a parsed page. This is the only class that decides which candidates are worth a request and the only one that knows the response has a size ceiling -- which is what lets the extractors be tested against fixture HTML with no I/O at all. Assets are deduped on their BYTES, not their URL: the same logo served from /logo.png, a CDN path and the favicon is the normal case, and three identical cards is noise. A 200 is not accepted as HTML on its own -- parked domains, captive portals and JSON error pages all answer 200, and parsing one as a page yields a confidently empty scan. Failure is quiet everywhere: unreachable, unparseable or not-a-website all return 200 with empty lists. These three steps are optional and already work; telling a member their own site failed a scan on the screen where they are building their brand turns a bonus into a defect they did not cause and cannot fix.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing