Pinpoint the failure: download, parsing, or loading
A Clash subscription update involves several steps. The client first requests the subscription URL and receives a response, then parses the config, saves the file, and passes it to the core to load. A successful download does not mean the format is valid, and a saved config does not guarantee the current core can process every field. Identifying the step where the error occurs is more useful than repeatedly clicking “Update.”
Subscription management is generally handled by the graphical client. The capabilities of Clash, Clash Meta, and mihomo cores are not the same as the client's download behavior. Update proxies, timers, and error messages vary between clients. The sections below explain the relevant settings and troubleshooting sequence; menu names may differ in your version.
- In the client's “Subscriptions” or “Profiles” page, note the failed entry's name, last update time, and full error message.
- Keep your current working config. Don't delete the subscription or clear its proxies yet. Before importing it again, confirm that the original link still returns content.
- Open the client log, trigger one manual update, then check download and core-loading errors around the same timestamp.
- Distinguish “update failed” from “proxies unavailable after update.” The latter also requires checking proxy status, proxy groups, and rules; it should not automatically be blamed on the subscription download.
| Error shown | Likely stage | Check first |
|---|---|---|
timeout、context deadline exceeded | Connecting or reading | Network route, update proxy, response time |
x509、certificate | TLS handshake | System clock, certificate chain, hostname |
401、403、429 | HTTP response | Link permissions, access restrictions, request rate |
yaml、unmarshal | Parsing content | Response body, subscription format, field types |
| Unsupported proxy type, missing policy | Core validation or loading | Core compatibility, policy references |
Troubleshoot timeouts: compare direct and proxied updates
Tell DNS failures apart from connection timeouts
no such host usually points to a DNS resolution problem; connection refused means the connection was rejected; and i/o timeout requires checking the log to see whether it happened during connection, handshake, or response reading. Don't change DNS for every network error, and don't assume the subscription endpoint works just because you can open the provider's home page in a browser.
In Windows, run the two commands below in PowerShell to check HTTPS connectivity and local listening ports. The first checks only this site's port 443; it does not replace testing the actual subscription hostname. The second uses 7890 as a common mixed-port example—check it against the value shown in your client.
Test-NetConnection clash-winpc.com -Port 443
Test-NetConnection 127.0.0.1 -Port 7890
If the subscription log identifies a specific hostname that failed to connect, replace the hostname in the first command with that subscription hostname and test it locally. Use only the hostname; never paste a full URL containing an access token into a public screenshot or issue title. An open port alone does not confirm that TLS, authentication, and response downloads are all working.
The browser works, but the client times out
The browser may use the system proxy while the client's subscription downloader connects directly. Conversely, the downloader may be configured to use a proxy that is no longer working. TUN mode can also affect routing, so choosing “Direct connection for updates” in the UI does not always mean the traffic is ultimately left untouched.
- Open the failed subscription's edit menu and look for “Update proxy,” “Update via proxy,” or a similar option. Note the current setting.
- Test once with a direct connection, then once through a confirmed working proxy route. Change only one setting at a time and keep the logs for each test.
- If you need to enter a proxy address manually, check whether the downloader accepts HTTP or SOCKS proxies. A mixed-port example is
http://127.0.0.1:7890; use the protocol and port configured in your client. - If the proxy is listening but requests still time out, check whether the selected proxy can reach the subscription hostname and whether an unavailable policy, authentication issue, or network restriction is involved.
If requests fail after a consistent delay, such as about 30 seconds each time, check whether the client offers a download timeout setting. Don't assume every client has a 30-second default. Increasing the read timeout may help with slow responses, but it won't fix an invalid hostname, a rejected connection, or a permissions error.
Certificate errors: check the clock, hostname, and trust chain
HTTPS certificate checks verify the server's identity. If a certificate error occurs, fix the system clock or trust chain first; disabling certificate validation is not a routine workaround. Subscription URLs often contain access credentials, and weakening validation can put those credentials and config contents at risk.
- Not yet valid or expired: In Windows 11, go to Settings → Time & language → Date & time, turn on “Set time automatically,” and select “Sync now.” Confirm the system date is correct, then try again.
- Hostname mismatch: Check that the subscription URL still uses the hostname provided by the service. Don't replace an HTTPS hostname with an IP address or keep using an old endpoint that has been retired.
- Unknown issuer: The server may be missing part of its certificate chain, the local trust store may have a problem, or a corporate network may be inspecting HTTPS traffic. Install system updates first, then check with the provider or network administrator.
- Works in the browser, fails in the client: The browser and downloader may use different trust stores or network routes. Note the exact client version and error message; a working browser page alone does not rule out a certificate issue.
In a proxy config, skip-cert-verify controls certificate validation for that proxy connection; it is not a general switch for the graphical client's subscription downloader. Changing this field usually won't fix an x509 error when downloading a subscription, and enabling it across the board is not a safe troubleshooting step.
HTTP status codes and format errors: verify that the response is a config
Resolve access and rate-limit issues before checking YAML
A server response does not necessarily contain a subscription file. A login page, account-expiration notice, or access verification page may be downloaded by the client and then appear as a YAML parse error. Even an HTTP 200 response may contain HTML.
| Status or response detail | Possible cause | What to do |
|---|---|---|
401 / 403 | Expired credentials, missing permissions, or access restrictions | Sign in to the provider's account page, check the subscription status, and copy a fresh dedicated subscription link. |
404 / 410 | Endpoint missing or removed | Get the current endpoint from your account page; don't guess the URL path. |
429 | Request rate limit reached | Stop retrying repeatedly. If the response includes Retry-After, wait for the specified duration. |
502 / 503 / 504 | Temporary server or upstream issue | Try again later and note the status code and time of the failure. |
<!DOCTYPE html>, login form | A web page was returned instead of a config | Check the URL type, redirect destination, and server-side access verification. |
When checking the response, use a local text editor and inspect only its structure; don't share the full file. Subscriptions may contain proxy passwords, tokens, internal hostnames, and other sensitive data. Third-party online checkers or converters can access that data too.
Full configs, proxy lists, and provider files are not interchangeable
A full Clash YAML config commonly includes sections such as proxies, proxy-groups, and rules, but not every valid config must contain all three. A Base64-encoded proxy list or a list of URIs starting with schemes such as ss:// does not become a Clash config just because its file extension is changed to .yaml.
Proxy files used by proxy-providers typically organize proxies under proxies:, while rule providers use their own rule payload structure. Neither should be imported directly as a full desktop config. Choose an output the provider identifies as compatible with Clash or mihomo, then check that your client supports the import method.
- Indentation error: YAML uses spaces for indentation; avoid tabs. Check the line reported and the line above it—a missing colon on the previous line can cause the next line to be flagged.
- Type error: A field expected to be a list may be written as a string, or a value may not match the type expected by the core. Don't just delete the flagged field without considering what it does.
- Core incompatibility: New protocols or extended fields intended for mihomo may not work with the original Clash core. Note the core and version actually in use, then choose a compatible output.
- Invalid reference: A config may parse successfully but fail to load if a proxy group or rule refers to a name that doesn't exist. Check spelling, capitalization, and proxy changes after the subscription update.
Auto-update intervals: distinguish client subscriptions from core providers
Client subscription timer
Desktop clients usually offer auto-update settings under “Subscriptions/Profiles” → the subscription's menu → “Edit”; some versions put them in global settings. Find “Auto update,” “Update interval,” and “Update proxy,” check the units shown beside each field, then save. There is no universal default across projects, so a setting in one client's UI is not a Clash core standard.
For typical use, start by considering an update every 6 hours: enter 360 if the UI uses minutes, or 21600 if it uses seconds. These are suggested values, not universal defaults. Follow any minimum interval specified by your provider. If proxies rarely change, updating every 12 or 24 hours may be enough. Don't set updates to every minute to mask a failure.
- Make sure the subscription updates successfully by hand before enabling auto-update.
- After saving the interval, return to the subscription list and confirm the setting was kept. Note the last successful update time.
- Check the log after the next expected update time. A desktop timer generally won't keep running while the computer is asleep or the client is closed.
- If “Update on startup” is enabled, test that behavior separately; it is not the same as updating at a fixed interval.
mihomo HTTP provider update settings
If your config uses proxy-providers, the core can refresh remote proxy providers independently. For an HTTP provider, interval is measured in seconds; the supported proxy field specifies the outbound name used to download the resource. The snippet below shows fields inside an existing HTTP provider—it is not a complete config and cannot be imported on its own:
# Add this inside an existing HTTP proxy-provider definition
interval: 21600
proxy: DIRECT
DIRECT selects the direct outbound; it does not guarantee that the resource is reachable from your current network. If you use a proxy or policy-group name instead, that name must exist in the config. Avoid relying on the same provider before it has downloaded. Check actual config validation results to confirm support in your core version.
Verification after recovery and reporting issues
Once the error is gone, confirm that the new content has actually made it into the active config. A changed file timestamp alone isn't enough: the download may succeed while overwriting, merging, or core validation still fails. Follow the checks below, and avoid changing the proxy, DNS, TUN, and config format all at once.
- Confirm the download succeeded: The subscription list shows a new successful update time, and the log has no related HTTP or TLS errors.
- Confirm the config loaded: The active config has no parse errors and proxy groups appear normally. If the subscription had no changes, the proxy count may stay the same.
- Confirm connectivity: Select a known working outbound, visit the target site, and check the matched rule and actual outbound in the connection log.
- Confirm auto-refresh: Leave the client running, wait for one configured update interval, and check the next successful update time.
When reporting an issue to the provider or client project, include your OS version, client version, actual core version, time of the issue, error message, and results comparing direct and proxied updates. Redact the path, query parameters, and proxy credentials in subscription URLs; don't upload your full config to a public issue tracker. For import and connection steps, see the site's user guide; for parameter definitions, refer to the protocol reference.