Announcing Linkumori CLN Format 1.0 #163
Replies: 1 comment
Linkumori CLN Format 1.0 (Final)Oct 2, 2026 · @Subham
Status and scopeThis document is CLN Format 1.0 in its final form. It supersedes the 1.0 text announced on 2 October 2026, and there is no compatibility mode for that earlier text. It is written against the 1.0 announcement. What it keeps. Every key, array and pattern of the earlier 1.0 text stays valid. A file written for that text loads without edits, so no converter is needed. What it changes. Run order, duplicate handling, toggle ids, filter escaping, and the safety of redirects and remote rule files. There are ten changes in all. No backward compatibility. Every rule in this document applies to every rule file. A file that relied on the earlier behavior runs differently; Changes for existing rule files lists the cases. Summary of changes1.0 final differs from the earlier 1.0 text in ten places, and all ten apply to every rule file.
The earlier text is silent on rows 8 and 9, so 1.0 final writes them down. File structureA rule file gains one optional top-level key, {
"cln": "1.0",
"defaults": { "requestTypes": ["main_frame"] },
"providers": {
"shop": {
"domainPatterns": ["||shop.example^"],
"rules": ["utm_source"]
}
}
}The top-level keys are now
One 1.0. There is no separate value for the earlier 1.0 text. A file with no key and a file with Why the key exists. It lets a later format version be told apart from 1.0 without guessing from the file's shape. Why not Rejection. A rejected remote file is not loaded and Remote Rules Health reports it as an error. A rejected built-in or custom file fails Processing orderRaw rules always run before field rules, and The stage sequence for each matching provider is unchanged:
Stages 5 and 6 are sorted by one key, which gains a leading
Read the key left to right; the first part that differs decides.
A cleanup that must happen before a raw rule is written as a raw rule. A raw rule is a regex against the whole URL, so it can express any parameter removal. Three things carry over from the earlier 1.0 text. Entries that are off are left out. Worked example{
"cln": "1.0",
"providers": {
"shop": {
"domainPatterns": ["||shop.example^"],
"rawRules": [
"\\/ref=[^/?]*",
{ "id": "strip-jsessionid", "matchPattern": ";jsessionid=[^/?#]*", "order": 20 }
],
"rules": [
"utm_source",
{ "id": "token-rewrite", "matchPattern": "token", "replacePattern": "clean-§1§", "order": 5 },
"fbclid",
{ "id": "aff-id", "matchPattern": "aff_id", "referralMarketing": true },
{ "id": "sid", "matchPattern": "sid", "order": 20 },
"$removeparam=/^pk_/"
],
"referralMarketing": ["tag"]
}
}
}With "allow referral marketing" off, the provider runs in this sequence. The last column shows where the earlier 1.0 text put the same entry.
The Whole-number matchPattern entriesAn entry written like In the earlier 1.0 text these entries jumped ahead of their group, smallest number first. The cause is recorded in the 1.0 docs update: the engine keys these lists by text, and JavaScript lists number-like keys first. 1.0 final removes the two whole-number rows from the rank table and makes Engine requirement. An engine that keys rule lists by text must use a structure that keeps insertion order for every key, such as a Lint. The warning for a whole-number entry without an Worked example{
"cln": "1.0",
"providers": {
"numbers": {
"domainPatterns": ["||numbers.example^"],
"rawRules": ["r", "3"],
"rules": ["a", "20", { "matchPattern": "9", "referralMarketing": true }, "b"],
"referralMarketing": ["rm", "5"]
}
}
}With "allow referral marketing" off:
Every entry runs where the file lists it. Rows 6 to 8 follow the unmarked Same text twiceA definition that replaces an earlier one now keeps the earlier one's position, The groups are unchanged: raw ( Two things change. Position. A winning definition without its own Ids. The
Across field and referral. Unchanged in substance. While referral-marketing rules run, a referral entry with the same text as a field entry replaces it. Without its own Raw and field. Entries with the same text in the raw and field groups still do not collide; both run. Within one file. Two different entries with the same text in one array remain a Overload modeA remote copy of a built-in rule no longer drops the built-in Four parts of overload mode are unchanged from the earlier 1.0 text:
Two parts change. Position inheritance. The rule in Same text twice applies to the merged provider. A remote copy without an Remote Rules Health levels. A rule replaced by a merge is a notice that names the replacing file. An error is reserved for a file or entry that did not load.
Rule ids and togglesA toggle is now keyed by provider and rule together, as The earlier 1.0 text keys the toggle off the rule
Worked exampleThe built-in rules define
$removeparam and @@ exceptionsAny parameter name can now be targeted, and an Value escapesA backslash in a
Three rules bound the feature:
In a JSON rule file each backslash is written twice: Where @@ is matchedAn {
"cln": "1.0",
"providers": {
"shop": {
"domainPatterns": ["||shop.example^"],
"rawRules": ["\\/ref=[^/?]*"],
"rules": [
"$removeparam=tag",
"@@||shop.example^/ref=$removeparam=tag"
]
}
}
}For
Unchanged
Redirect and block safetyA redirect may only go to an absolute Redirect targetsA redirect target is valid when it parses as an absolute URL, its scheme is The check covers all three sources of a target: the capture group of a
TerminationProcessing a request ends after a bounded number of cycles. The earlier 1.0 text says the cycle repeats on each new URL and states no bound. Read literally, a rewrite such as
Remote file capabilitiesA remote file's capabilities are derived from its content when it loads. A file does not declare them.
ConformanceAn engine conforms to CLN 1.0 when it reproduces every worked example and table in this document and the vectors below. Lint checks
The warning for a whole-number Run-order vectorsThe worked examples under Processing order and Whole-number matchPattern entries are normative. So are the result tables under Same text twice, Overload mode and Rule ids and toggles. Redirect vectorsThe provider matches
In each "no redirect" row the provider's later stages still run on the request URL. Termination vectorThe Changes for existing rule filesEvery file written for the earlier 1.0 text is a valid 1.0 final file, so there is no converter and no compatibility mode. Five behaviors change, and a file that relied on one needs an edit.
Four engine rules also take effect for every file:
A toggle saved under a bare Deferred to 2.01.0 final leaves the file layout alone, so six known problems stay open for 2.0.
Sources
Where the earlier 1.0 text is silent, this document says so and sets a rule. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
All reactions