Static Rulesets, the Bundled Rule Files
A static ruleset is a JSON file of blocking rules shipped inside the extension. Chrome reads it at install and applies it directly. Because the rules are bundled, blocking starts the moment the extension loads and needs no network request, ever.
Why it matters
Older ad blockers fetched their filter lists from the internet every time you started your browser. EasyList would download from easylist.to, get parsed, and then applied. That meant the blocker needed an internet connection to start working, and it added startup time.
Static rulesets flip this around. The rules are built into the extension at build time. Chrome loads them from disk, not from the internet. Blocking works offline. There's no parsing overhead, no network call, no delay. The rules are ready when you load your first page.
This also means the rules are auditable. They're part of the extension's source code, not a fetched list that changes invisibly. You can check what's actually blocking.
How it works
During build, Scalpel converts filter lists (like EasyList) into Chrome's declarativeNetRequest JSON format. The resulting JSON files are placed in a /rules directory inside the extension. The manifest references them:
{
"declarative_net_request": {
"rule_resources": [
{
"id": "easylist",
"enabled": true,
"path": "rules/easylist.json"
},
{
"id": "easyprivacy",
"enabled": true,
"path": "rules/easyprivacy.json"
}
]
}
}
When you install Scalpel, Chrome reads these files and loads them into memory. The ID ("easylist", "easyprivacy") is how the extension refers to each ruleset. The enabled flag says whether to activate the rules on startup (it can be toggled later in settings).
A ruleset file is just JSON: an array of rule objects, each with an ID, priority, action, and condition. Chrome applies all enabled rules immediately. No parsing, no conversion. Just matching.
You can also disable a ruleset by default. Scalpel does this for optional lists that are more aggressive but might cause more false positives.
What does not matter
Static rulesets can't change after the extension is installed. If EasyList updates tomorrow, your browser won't know until you update Scalpel itself. This is a trade-off: you get reliability and auditability, but you lose the ability to refresh lists without reinstalling.
Some blockers see this as a downside. Scalpel treats it as an advantage. The rules are fixed and predictable. You know exactly what you're running. There's no silent rule update that breaks a site.
Ruleset files can be large (the JSON is verbose), but Chrome compresses them, and disk space is cheap. The real constraint is the rule limit, not the file size.
Code example
A simplified static ruleset JSON file might look like this:
[
{
"id": 1,
"priority": 1,
"action": {
"type": "block"
},
"condition": {
"urlFilter": "||ads.example.com^",
"resourceTypes": ["script", "image", "stylesheet"]
}
},
{
"id": 2,
"priority": 1,
"action": {
"type": "block"
},
"condition": {
"urlFilter": "*://tracker.com/*",
"resourceTypes": ["script", "xhr", "fetch"]
}
},
{
"id": 3,
"priority": 2,
"action": {
"type": "allow"
},
"condition": {
"urlFilter": "||ads.example.com^",
"initiatorDomains": ["friendly-news-site.com"]
}
}
]
Rule 1 blocks scripts and images from ads.example.com. Rule 2 blocks tracking scripts from tracker.com. Rule 3, with higher priority, allows rule 1's requests if they come from friendly-news-site.com.
This ruleset is bundled inside the extension. Chrome reads it once at startup and applies it to every request for the lifetime of your session.
How Scalpel Ads Blocker shows it
Scalpel ships static rulesets for EasyList, EasyPrivacy, and other common blocking lists. They're enabled by default and active from the moment you install.
In Scalpel's settings, you can toggle these rulesets on and off. When you disable EasyList, Scalpel immediately stops applying those rules. But the ruleset file is still in the extension (it's just not active). Re-enabling it reactivates the same rules instantly.
This is different from fetching a list. You're not downloading anything. You're just toggling which of your bundled rulesets Chrome applies. Everything happens locally.
If you want new blocking rules, you have to update Scalpel from the Chrome Web Store. This is a longer cycle than other blockers, but it means your rules are always from a version you explicitly chose, not an auto-updated list that might break something.