The Rule Limits, and How Scalpel Stays Inside Them
Chrome guarantees a minimum number of enabled static blocking rules per extension, currently 30,000, plus caps on rulesets and dynamic rules. Scalpel keeps its default lists inside the guarantee and ships the overflow as optional rulesets you can switch on.
Why it matters
Chrome sets limits on how many blocking rules an extension can use. These limits exist to prevent extensions from slowing down the browser or hogging memory. EasyList alone has over 100,000 rules. Most blockers built on declarativeNetRequest have to split their lists into pieces or remove rules to fit inside Chrome's guarantee.
Scalpel solves this by shipping the main lists inside the 30,000 rule limit and putting the rest behind an optional toggle. You get effective blocking by default. If you want aggressive blocking, you can enable the extra lists.
How it works
Chrome guarantees at least 30,000 enabled static blocking rules per extension. This number is called GUARANTEED_MINIMUM_STATIC_RULES. But there are more limits below the surface.
Each ruleset file can hold a limited number of rules. You can have many rulesets active at once, and their rules all count toward the 30,000 total. There's also a cap on the total number of rulesets you can define (enabled and disabled combined), and a separate cap on regex rules (rules that use patterns instead of simple URL filters).
Dynamic rules (the ones you add at runtime) have their own limit. Scalpel uses these for your allowlist, and the limit is high enough that personal allowlists won't hit it.
When you build an ad blocker with multiple lists, you have to choose. You can:
- Bundle all rules and hit the limit (Scalpel's default lists fit here).
- Ship some rules disabled by default and let users opt in (Scalpel's optional lists).
- Ship fewer rules and build a more selective blocker.
Scalpel chooses option 2: smart defaults within the guarantee, plus optional lists for users who want more.
What does not matter
The 30,000 limit sounds restrictive, but it's more than enough for blocking adverts and trackers. EasyList covers most adverts across the web with about 40,000 rules, but many of those rules are redundant or target niche cases. Scalpel's curated subset of EasyList fits comfortably inside 30,000 and catches nearly all common adverts.
Regex rules are powerful but have a separate, much tighter cap. Scalpel doesn't use many regex rules, so this cap rarely matters. If you build a custom regex-heavy ruleset, you'd hit the limit faster. Custom regex ad lists aren't common.
Code example
Scalpel's rulesets might be split like this. In the manifest:
{
"manifest_version": 3,
"declarative_net_request": {
"rule_resources": [
{
"id": "easylist",
"enabled": true,
"path": "rules/easylist.json"
},
{
"id": "easyprivacy",
"enabled": true,
"path": "rules/easyprivacy.json"
},
{
"id": "extra_rules",
"enabled": false,
"path": "rules/extra_lists.json"
}
]
}
}
The first two rulesets are enabled by default. Their combined rules fit inside the 30,000 guarantee. The third ruleset is disabled by default. Users can enable it in Scalpel's settings if they want stricter blocking. When enabled, some rules might drop off if the total exceeds the limit (Chrome disables the oldest rules), but Scalpel prioritises rules carefully so the important ones survive.
How Scalpel Ads Blocker shows it
In Scalpel's settings, under "Filter lists," you see toggles for each list. EasyList and EasyPrivacy are on by default. They fit inside Chrome's rule limit without dropping any rules.
Below them, you'll find "Extra lists" or similar. These are optional rulesets with additional rules for aggressive blocking. The toggle warns you that enabling them uses extra resources and might exceed the rule limit on some systems.
Scalpel also shows you how many rules are currently active in the extension details page (in Chrome's extension manager). If the number dips below what's enabled, it means you've hit the limit and Chrome's priority system has dropped the lowest-priority rules. Keeping your filter list count reasonable helps avoid this.