Every subscription update overwrites the whole profile, wiping any DNS or TUN settings you added by hand. Mixin solves exactly this: your custom fragment is stored in the client and merged into every profile just before it takes effect - update-proof by design.
Enabling it
- Settings → Profile Mixin, choose YAML mode, click Edit.
- After saving, turn on the Mixin switch on the General page (an easily missed step).
- Re-activate the current profile (click its card on Profiles) to apply the merge.
YAML mode example
mixin:
# unified DNS with fake-ip
dns:
enable: true
enhanced-mode: fake-ip
nameserver:
- 1.1.1.1
- 8.8.8.8
fallback:
- https://1.1.1.1/dns-query
# settings needed by TUN mode
tun:
enable: true
stack: gvisor
dns-hijack:
- 198.18.0.2:53
# pin the mixed port
mixed-port: 7890
Top-level keys present in the Mixin replace the matching sections of the profile (objects merge by key, Mixin winning). Whatever you don't mention stays as the subscription wrote it.
JavaScript mode (advanced)
YAML mode replaces whole sections; JavaScript mode edits the config programmatically - e.g. prepending rules to the existing list:
module.exports.parse = ({ content }) => {
content.rules = [
"DOMAIN-SUFFIX,example.com,DIRECT",
...content.rules,
];
return content;
};
To process one specific subscription rather than everything, use Parsers instead - similar syntax, narrower scope.