Quick answer
Duplicate resource references occur when a page asks for the same image, script, or stylesheet URL more than once. NOTABIS reports duplicate-resource when its measured resource references contain a repeated URL that is not the normal preload-plus-stylesheet pair. Remove unnecessary duplicates after checking dependency order and browser behaviour.
What the issue means
A layout can include the same asset through two components:
<script src="/js/app.js"></script>
<script src="/js/app.js"></script>
Browsers may reuse a cached response, but duplicate markup still adds parsing and coordination work and can hide an accidental dependency. A preload followed by the stylesheet it prepares is a recognised pattern and is not treated as a duplicate by this rule when those are the only two references.
Why it matters for SEO
Repeated assets can increase page work and make performance debugging harder. They do not create a direct ranking penalty, and a cached duplicate may have little user-visible impact. Measure real loading and Core Web Vitals before removing a resource that a component genuinely needs.
How NOTABIS detects it
The duplicate-resource rule collects absolute URLs from img[src], script[src], and link[href] in the measured HTML. It flags each URL whose count is at least two, except a pair consisting of one rel="preload" link and one rel="stylesheet" link. It records the duplicated URLs and reference count at page scope; it does not fetch assets or measure network timing.
How to check it yourself
Inspect the DOM and View Source, then filter the Network panel by URL. Check whether the same asset appears under different query strings or hosts, whether a preload has a matching consumer, and whether a client-side component adds it again during navigation. Review bundler output and shared layouts.
How to fix it
Make one component or layout responsible for each shared asset, remove duplicate tags, and deduplicate bundle imports. Preserve deliberate preload and stylesheet pairs and verify that removing a script does not break a route or consent state. Recheck the final markup and resource timing after deployment.
When this is intentional or does not need fixing
A preload, stylesheet, and module may intentionally reference related resources, and a repeated asset in separate documents is not a page-level duplicate. Third-party widgets can add their own resources. Keep an intentional duplicate when testing shows it is required, but document why and confirm it is not an accidental cache-busting variant.
Related issues
Compare render-blocking resource candidates, HTTP compression, and slow server responses.
Run a NOTABIS audit
NOTABIS lists repeated image, script, and stylesheet URLs in the measured HTML so you can trace them to layouts, bundles, or third-party widgets.