What counts as remote code

A rejection that often surprises developers, because "my extension does not download code."

Manifest V3 requires that the executable code making up the extension ships inside the package. Developers who get this rejection usually believe they comply — and often the offending line is a single hosted analytics tag someone added months ago.

The distinction that matters

The question is not whether your extension talks to the network. It is whether what comes back can change what your extension executes.

Fine: fetching JSON, text, images, or any other data your extension then displays or processes.
Not allowed: loading a script file from a server and running it, or taking a string from a server and evaluating it as code.

Data is fine. Instructions are not.

Things that get flagged

Things that are usually not the problem

How to fix it

1. Bundle the dependency

Download the library, put it in your extension folder, and reference it locally.

<!-- before -->
<script src="https://cdn.example.com/chart.min.js"></script>

<!-- after -->
<script src="lib/chart.min.js"></script>

This also makes your extension work offline, which is usually an improvement anyway.

2. Drop the hosted analytics tag

Hosted analytics snippets load remote script and are a frequent cause of this rejection. If you need usage numbers, send your own events to your own endpoint from bundled code, and disclose that collection in your privacy policy and permission justifications.

3. Replace dynamic evaluation

If something evaluates a string, restructure it so the branches exist in your shipped code and the server response only selects between them.

4. Check the whole package, not just what was flagged

Assume the full package may be reviewed again on resubmission. Grepping your source for http://, https://, eval( and new Function( is a useful first pass — it also matches ordinary API and image URLs, and it will miss dynamically built URLs, so read the results rather than trusting the count. Include any library folder you vendored.

What to write in the appeal or notes

All executable code ships inside the package. The extension makes network requests only to retrieve data (JSON from our API), which is rendered in the UI and never evaluated. The chart library previously loaded from a CDN is now bundled at lib/chart.min.js.

Name the specific thing you changed. A general statement of compliance without naming the change tends to invite follow-up questions.

Not sure what your manifest declares? The free manifest checker lists your permissions and flags the parts reviewers question most. Your manifest is read in your browser and is not uploaded; the page itself keeps an anonymous view count.

The Chrome Web Store Submission Kit (paid, opens in a new tab) covers the full submission — permissions, privacy policy, listing, and the resubmission checklist.