
# Ekko Rules
**Turn an airport subscription into one configuration you can import as-is**
Nodes · DNS · policy groups · routing rules, all in a single file
[](LICENSE)
[](https://github.com/ZaunEkko/ekko-rules/actions/workflows/validate.yml)
[](#three-steps)
[](#run-it-yourself)
[](#three-steps)
**[Convert online](https://sub.boxnook.cc)** · [Self-host](#run-it-yourself) · [Rules](#key-routing-groups) · [中文](README.md)
---
## Three steps
**1.** Open **[sub.boxnook.cc](https://sub.boxnook.cc)**
**2.** Paste your subscription URL (the field is masked by default)
**3.** Press "one-tap import" — the button follows whichever client you picked
Done. The first visit walks you through these three steps; "重看引导" next to the heading replays it. Flip UDP, XUDP and the rest under advanced options if you need them — the link rewrites itself as you go. Copying the link or scanning it with a phone works too. Shadowrocket is the exception: the page presents two ordered actions and two QR codes, **1. node subscription** and **2. routing config**. Import both in that order. The first is added from Home and owns refreshes, the profile name, the traffic/expiry banner, and the node list. The second is added from Configuration: native `PROXY` follows the Home-selected node by default, while groups can select Home subscription nodes, `DIRECT`, `REJECT`, or the nested manual selector. A user confirmed this two-step configuration works on a device with `site-v0.4.31`.
**The site stores nothing.** No accounts and no profile list; the subscription body is held in memory for the conversion and deleted straight after, and no log records the address. The trade-off is that **the link carries your subscription credential** — import it into your own client, do not forward it.
Rules default to this repository's Ekko Rules. The page can also switch to the common ACL4SSR sets, or take a remote configuration URL of your own.
## Import or refresh failed? Check in this order
The same checklist sits under step 3 on the page; expand it there.
1. **Is the subscription switched on in the provider's panel?** Plenty of
providers keep it disabled by default, and changing plan or resetting the
link disables it again; an expired plan or used-up traffic fails the same
way. The URL still resolves, but what comes back is empty. Check that the
subscription is enabled and that you copied the current link; after a reset,
generate a new link from the new address.
2. **Did the whole address get copied?** The token usually sits after the `?`,
and a truncated one reads as an invalid subscription. Press "显示" (show)
next to the field and compare.
3. **Did the provider block the converter?** A public converter fetches your
subscription from its own server, so the provider sees an unfamiliar IP.
Some refuse it outright; others only answer a specific client User-Agent.
Try these in order of effort:
- Set a custom User-Agent under "advanced options" — often that is all the
provider checks.
- **Run it on your own computer** (the next section). The fetch then comes
from your home connection, the address the provider already sees from you.
Deploying to a VPS is not the same thing: that is still a datacenter IP
and can be blocked for the same reason.
4. **What does the client report?** `400`: the fetch worked but produced no
usable nodes — see 1 and 2. `502`: the provider refused the site's fetch —
see 1 and 3. A timeout: try again shortly; if it keeps timing out, see 3.
5. **Still stuck?** Open an [issue](https://github.com/ZaunEkko/ekko-rules/issues)
with a screenshot of the client's error, subscription address covered.
## Client switches that rewrite the profile
What you import is a complete configuration — nodes, DNS, proxy groups and
routing rules — and the parts depend on each other. The rules are only accurate
because the DNS and the groups that ship with them are in place.
Most clients offer switches that **replace** part of that with the client's own:
| Switch | What it replaces |
|---|---|
| DNS override / DNS settings | the whole `dns:` section — split resolution, fake-ip, encrypted upstreams |
| Smart core / smart groups | how the proxy groups are typed and select nodes |
| Global merge / script | any part of the profile |
**If you are not sure what they do, leave them off.** This side is already
handled. Take it over only if you know exactly what you are changing.
## Run it yourself
Rather not involve anyone else? The same code in its other shape: the real subscription goes only to your own Docker, **never appearing in a URL at all**, and you get a stable local address that your client keeps refreshing.
```bash
git clone https://github.com/ZaunEkko/ekko-rules.git
cd ekko-rules/selfhost
docker compose up --build -d
```
Open [http://127.0.0.1:8787](http://127.0.0.1:8787) to create one, and you get `http://127.0.0.1:8787/sub/