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

  1. Settings → Profile Mixin, choose YAML mode, click Edit.
  2. After saving, turn on the Mixin switch on the General page (an easily missed step).
  3. 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.

Debugging: a syntax error in the Mixin makes profiles fail to load, with a YAML error in the Logs page. Glance at the logs after every Mixin edit.