Skip to main content
EN

Home / Blog / Config Basics

How subscription conversion works — the mechanics, the uses and the risk you should not ignore

Config Basics2026-05-281306 words3 min read
How subscription conversion works — the mechanics, the uses and the risk you should not ignore

"Subscription conversion" is a step many people cannot avoid: the provider only offers v2ray format, the client wants Clash format, and a conversion service sits in between.

This explains what it does, what the risks are, and how to use it less — or not at all.

Why the thing exists

Different clients eat different formats:

Three mainstream subscription formatsClash Mihomo YAMLa full confiClash Verge, FlClash, CMFAthe most completev2ray base64a pile of vm links, basev2rayN, v2rayNGnodes only, no rulessing-box JSONa full confising-box, NekoBoxa different structure
The formats are not interchangeable, so something has to convert between them

What a conversion service does:

The conversion flowYou hand your subscription URL to the servicepassed as a parameterThe service fetches your original subscriptionit now has every one of your nodesIt reassembles from a templateadding policy groups and rulesIt returns config in the new formatyour client fetches that address
The critical part is step two: the conversion service has seen your node credentials in full

Where the risk lies

Concretely:

Three layers of risk1Nodes get used by otherswith the password they can connect directly and burn your data2Your subscription is recordedthe operator can keep fetching it and track node changes over time3Everything breaks when the service doesif the converter goes down, your client can no longer update its config
The third happens most often: free conversion services are rarely stable

Also, the configuration a converter returns contains a rule template. If the template's origin is not trustworthy, arbitrary rules can in principle be inserted — pointing certain domains at a particular node, for instance.

When conversion is genuinely needed

First check whether you actually need it:

Situations where you do notThe provider's dashboard already offers a Clash Your client can import a v2ray subscription (NekoBox, some builds of FlClash)You have only a few nodes and can write them into the config by handYou are comfortable writing your own policy groups and rules

Plenty of people do not realise their provider already has a Clash-format link. Look carefully in the dashboard; there are usually buttons for several formats on the subscription page, or appending ?flag=clash to the same link yields Clash format.

Cases where conversion genuinely helps:

  • The provider really does only offer v2ray base64, and your client cannot read it
  • You need to merge several subscriptions in different formats into one
  • You want a ready-made rule template, and the provider's config has no rules

Safer alternatives

Option 1: write your own config and pull nodes with proxy-provider

If your provider offers Clash format, the cleanest approach is to write the main config yourself (groups and rules entirely under your control) and pull nodes through proxy-providers:

proxy-providers:
  main:
    type: http
    url: "your subscription URL"
    interval: 3600
    path: ./providers/main.yaml
    header:
      User-Agent: ["clash.meta"]
    health-check:
      enable: true
      url: http://www.gstatic.com/generate_204
      interval: 300

proxy-groups:
  - name: "PROXY"
    type: select
    use: [main]
    proxies: ["AUTO", DIRECT]
  - name: "AUTO"
    type: url-test
    use: [main]
    interval: 300
    tolerance: 50

rules:
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

Only your client ever sees the subscription URL; no third party is involved.

See managing and merging multiple subscriptions.

Option 2: use the client's extended config

The provider's Clash config has thin rules? You do not need conversion — top them up locally with the Merge extended config:

prepend-rules:
  - RULE-SET,my-proxy,PROXY
  - RULE-SET,my-direct,DIRECT

rule-providers:
  my-proxy:
    type: http
    behavior: domain
    url: "rule set address"
    path: ./ruleset/proxy.txt
    interval: 86400

Rule sets are public domain lists containing nothing private, so hosting them elsewhere carries no risk.

Option 3: self-host a converter

If you genuinely need conversion but would rather not hand your nodes to anyone, run your own. Common open-source implementations start with a single Docker command:

docker run -d --name subconverter \
  --restart always \
  -p 25500:25500 \
  a-converter-image

Then use http://127.0.0.1:25500/sub?... as the conversion address.

The benefit of self-hosting: node information never leaves your own machine. The cost is a service to maintain.

The trade-off between the threeprovider directlysafest, mostneeds the provider to offer Clash formatfirst choiceLocal Merge for rulessafe and fleyou write a little YAML yourselfsecond choiceSelf-hosted conversionhandles any a service to maintainwhen conversion is genuinely needed
A public third-party converter should be the last option

If you must use a third-party converter

How to reduce the riskPrefer a "generate once" workflow — convert once, save the result as a local config file, and do not let your client keep requesting the conversion addressInspect the generated config immediately and confirm there is nothing suspicious in the rulesDo not use a conversion address containing your personal identifier as a long-term subscriptionReset your subscription address in the provider's dashboard periodicallyKeep nodes from important accounts (your own servers) out of conversion entirely

"Generate once" is the key idea: letting the client request the conversion address indefinitely means giving a third party ongoing access to your nodes. Convert once, take the YAML, save it locally and maintain it yourself — the exposure is a single moment.

Inspecting the result

Once you have the converted config, look at three places at minimum:

1. Anything suspicious in the rules section

rules:
  - DOMAIN-SUFFIX,an-unfamiliar-domain,a-specific-node   # ← be wary of this

A normal rule template does not point a specific domain at one particular node.

2. Extra nodes in the proxies section

Compare against the node count in your original subscription. Where did any extras come from?

3. Where the rule-providers urls point

Rule set addresses should be public rule repositories, not odd-looking domains.

On "your subscription URL is a credential"

Worth restating:

What a subscription URL gives someone1Every one of your nodesserver, port and password, all of it2Direct use of your trafficsomeone else browsing on your plan3Knowledge of your provider and planthe response reveals a great deal4Ongoing trackingwhen your nodes change, they get the update too
Protecting a subscription URL matters as much as protecting an account password

So:

  • Do not post it in public groups, forums or issue trackers
  • When sharing screenshots of the client, blur the subscription field
  • Do not import it on a device you do not trust
  • Reset it in the provider's dashboard the moment you suspect a leak

In short

  • First check whether your provider has a Clash-format link — they probably do, and then you need no conversion at all
  • A conversion service sees all of your node credentials, which is its biggest risk
  • Prefer proxy-provider plus a local config, so the subscription URL touches no third party
  • Use public rule sets for rules; those contain nothing private, so third-party hosting is fine
  • If conversion is unavoidable, self-host — or at minimum "generate once" rather than requesting indefinitely

Related: managing several subscriptions and the Merge extended config.


Related docs