Official Manual · Configuration Guide

Shadowrocket
Rules and Configuration Guide

First check whether the configuration is active, then find out why a rule matched. This guide follows the file structure, matching conditions, and verification steps to help you inspect specific fields and routing results.

If you’re importing an existing subscription, choosing a server, and connecting for the first time, start with the quick-start tutorial. Once you’ve covered the basics, return here to understand Config and rule files. The tutorial walks through the process; this guide explains how configuration sections interact, where their limits lie, and how to verify changes.

01 Configuration file structure and scope

A configuration must first be read correctly; only then can you assess whether its rules behave as expected. Shadowrocket configuration files are usually divided into sections: names in square brackets identify each section, and the lines below are interpreted according to that section’s syntax. The same line can mean different things in different sections. When reviewing or copying an example, check the section name, line content, and target policy together—not just a few keywords in isolation.

What General, Rule, and Host do

[General] contains general settings, such as options related to DNS resolution and bypassing traffic. [Rule] contains rules that determine where connections go. [Host] contains static mappings for specified hostnames. Each answers a different question: “What baseline conditions apply to connections?”, “Which policy should this destination use?”, and “Which address maps to this name?” Since they serve different purposes, changing one section does not necessarily change the outcome of another.

SectionPrimary purposeWhat to check
[General]General connection and resolution settingsOption spelling, values, and current network conditions
[Rule]Select a policy based on conditionsRule order, match fields, and policy names
[Host]Map a specified name to an addressWhether the domain and address still point to the same service
[URL Rewrite]Match and process visible URLsRegex scope, target URL, and handling method

Learn the syntax from a minimal file

The snippets below illustrate the structure; they are not complete configurations for every network. Example domains and documentation addresses do not represent usable services. In practice, keep settings that are still needed in your current configuration and confirm that your existing server works. PROXY is a policy; adding it to a file does not create a server. Likewise, adding a domain rule does not fix that domain’s resolution or service status.

[General]
dns-server = system

[Rule]
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY

[Host]
test.example.com = 192.0.2.10

Section headers use English square brackets, rule fields are separated by English commas, and ordinary options connect names and values with an equals sign. Full-width commas, curly quotation marks, and invisible spaces inserted by an input method can prevent otherwise similar text from parsing as expected. After copying, check each line in an editor, especially for explanatory text accidentally appended at the end. Put explanations in the surrounding text or on separate comment lines; don’t append them to policy fields.

A file existing doesn’t mean it’s in use

In Config, first check which configuration is currently selected, then open it for editing. Saving a file that isn’t selected won’t switch the active configuration. Similarly, updating an existing subscription usually changes the server list; it doesn’t mean the rules file was updated too. Check server source, configuration source, and current selection separately to avoid repeatedly editing the wrong item.

Before you start, keep a local copy and note the name of the file currently in use. If the configuration comes from an updateable URL, distinguish the remote original from your local edits: after fetching it again, you may need to review those changes. Don’t treat “saved” as “verified.” Saving only writes the text; whether it takes effect depends on Global Routing, connection status, and the rule that actually matched.

If the file fails to load, check the sections you edited most recently, then look for duplicate section headers or rules placed in the wrong section. If the file opens but connections behave unexpectedly, check the mode, policies, and match order instead. Treat syntax errors and runtime behavior as separate problems. That way, you won’t change DNS, servers, and the entire rule set to fix a comma—and then lose track of the real cause.

02 Global Routing and policy selection

Before checking rules, look at Global Routing. In Config mode, the active configuration determines where connections go. Proxy mode sends connections normally handled by that mode through the proxy route. Direct mode uses a direct connection. The domain, address, and final fallback rules discussed here should primarily be tested in Config mode. If a mode change alters a rule’s behavior, that doesn’t necessarily mean the file is faulty.

Use the three modes for different checks

ModeInterface labelWhat to check
ConfigConfigVerify routing rules in the active configuration
ProxyProxyCheck the proxy route and server connectivity
DirectDirectCheck direct connections on the current network

You can temporarily compare modes while troubleshooting, but keep the test conditions consistent: use the same network, destination, and server, and start a new connection if possible. If a destination works in Proxy but fails in Config, first check where the configuration routes it. If both fail, also check the server details, resolution, and remote service. A single mode switch cannot prove that every rule is correct.

PROXY, DIRECT, and REJECT policies

PROXY uses a proxy policy; the available route depends on the selected server and related policy settings. DIRECT connects to the destination directly. REJECT blocks connections that match the rule. These are policy keywords in rules, not the same thing as the mode names in the interface. In particular, don’t treat app-wide Proxy mode and PROXY at the end of a rule as identical settings.

[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN,local.example.com,DIRECT
DOMAIN,blocked.example.com,REJECT
FINAL,PROXY

The first line only says that the destination domain should use the proxy route. It doesn’t define a server address, authentication method, or transport parameters. If your existing server details are incomplete, a connection can still fail even when the log shows a PROXY match. Likewise, a DIRECT match only selects a direct connection; it doesn’t guarantee that the current network can reach the destination. Verify rule selection and route reachability separately.

Use REJECT only for clearly defined destinations you actually want to block. An overly broad reject rule can affect sign-in, images, push notifications, or app startup because an app often contacts multiple domains. When testing a reject policy, start with a full domain and note the specific requests affected before widening the scope. Don’t assume that blocking a request is harmless just because its name looks related to analytics or ads.

Check policy names too

Some configurations refer to custom policy names. If you encounter one, find its definition in the configuration and confirm the name exists, is spelled consistently, and still points to an available route. Don’t casually replace a policy group with a server remark, and don’t copy only the rule that refers to it. When organizing a file for the first time, validate the basics with a built-in policy you can identify clearly, then investigate how custom policies relate to one another.

Check the app’s connection toggle separately from the routing mode. If the toggle is off, editing a file won’t send traffic through its rules. If it’s on, the displayed connection status still doesn’t verify a website or app request. For the initial setup sequence, see the step-by-step tutorial; this guide explains why specific rules match. Return to your original mode after testing so temporary troubleshooting settings don’t become your long-term setup.

03 DOMAIN domain rules

When you know the destination domain, start with a domain rule. A domain rule describes a hostname, not the full URL in a browser’s address bar. For api.example.com, don’t include the protocol, path, query parameters, or page title. In a URL, the slash and everything after it belong to a different part of the address and can’t be used directly as a DOMAIN match field.

Exact and suffix matches

DOMAIN matches an exact domain. Adding example.com does not also add www.example.com. DOMAIN-SUFFIX is suitable for covering a domain and its subdomains: with example.com as the condition, it can match the domain itself and its subdomains. This distinction determines whether a rule affects just one hostname or a group of services under the same domain.

[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.org,DIRECT
FINAL,PROXY

Before using a suffix rule, check the domain boundary. It isn’t an arbitrary string-ending comparison, and matching text that merely looks similar doesn’t mean a domain is included. A similar-looking name may belong to a different domain. When troubleshooting, compare the full hostname in the log with the rule field, paying attention to extra subdomains, different top-level domains, and other service domains used after an app redirects.

DOMAIN-KEYWORD has a wider scope

DOMAIN-KEYWORD matches a keyword in the domain. Use it when you genuinely need a string-based match. It doesn’t understand brands, service ownership, or business purpose, so the same text can appear in unrelated domains. The shorter the keyword, the harder it is to predict unintended matches. When you can list full domains, exact rules are usually easier to explain and maintain than broad keyword matches.

[Rule]
DOMAIN,ads.example.com,REJECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,tracking,REJECT
FINAL,PROXY

This example puts the specific exception before the broader rule. A request to ads.example.com matches the exact reject rule first; other hosts under the same domain then use the suffix rule and go through the proxy. The keyword rule later in the list won’t reprocess connections that already matched. This example demonstrates ordering; it isn’t a general-purpose blocklist. Base the actual reject scope on your own targets and logs.

A webpage often uses more than one domain

The main page, images, scripts, sign-in endpoints, and media may come from different hosts. Setting a policy only for the domain in the address bar doesn’t guarantee that every resource uses the same route. If the page opens but images don’t load, check the actual hostnames of the failed resources instead of immediately applying the same policy to an entire suffix. Widening the scope gradually helps avoid disrupting other services that work normally.

Domain rules also depend on having a hostname available when a connection is handled. If an app connects directly to a numeric address, or the name-to-address association isn’t available at that point, knowing that the address belongs to a website doesn’t mean a domain rule will match. Check the target type shown in the connection record, then decide whether an address rule is needed. Don’t change all unmatched connections to direct just to fix a single request.

After changing a domain condition, send a new request. Browsers and apps may reuse existing connections, so the updated rule might not get a chance to handle the same session. Close and reopen the relevant page, and reconnect if necessary, then check the new records. Judge the result by the new request’s destination and match—not by whether previously loaded content is still visible. A cached page can’t show which rule handled a network request.

When maintaining rules, add a brief note about the purpose of each group, such as “exact-domain exception” or “entire service domain.” If a domain stops working, first check whether the service has switched to another host before deleting the rule. Without notes, accumulated rules can end up assigning different policies to the same domain. Order determines which one wins; the rules aren’t automatically combined into a better result.

04 IP-CIDR, IPv6, and GEOIP

Address rules match destination IPs, not domain text. IP-CIDR covers IPv4 ranges, IP-CIDR6 covers IPv6 ranges, and GEOIP checks the region associated with an address in a database. All three involve destination addresses, but they differ in their data sources and coverage. Before choosing one, decide whether you need a specific range or a category of addresses based on region.

CIDR prefixes define address ranges

CIDR notation combines an address with a prefix length after the slash. For IPv4, a longer prefix covers a smaller range; a single address can use a 32-bit prefix. IPv6 addresses are longer, so IPv4 prefix lengths don’t apply in the same way. When entering a range manually, verify it against network information you already have. Don’t assume addresses belong to the same range just because their first few characters match.

[Rule]
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
IP-CIDR,198.51.100.8/32,PROXY,no-resolve
IP-CIDR6,2001:db8::/32,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

The addresses above are reserved for documentation examples and do not represent real, reachable servers. The second line shows a single IPv4 address; the third shows an IPv6 prefix. In a real configuration, the range must match the destination you need to handle. Copying the example as-is won’t fix routing for a real service, and it tells you nothing about whether a server is available.

no-resolve controls resolution during matching

When a connection target is still represented as a domain, checking an address rule may involve DNS resolution. The trailing no-resolve prevents this address rule from actively triggering domain resolution just for the match. If a destination address is already available, the rule can still check it. This option doesn’t disable all DNS or force connections to avoid domains. Mistaking it for a global resolution switch can lead to incorrect expectations.

Whether to add this option depends on the purpose of the rule. It may be appropriate if you want to handle only connections that already start with an IP address, or avoid adding a resolution step for domain targets. If you expect a domain to be resolved and then match a specified range, check the actual matching path. A rule that prevents its own resolution can’t always match an address that hasn’t been obtained yet. Verify the outcome in the connection records.

GEOIP does not identify a service’s region

GEOIP,CN,DIRECT checks the region assigned to the destination address in a database. It does not check a website’s language, domain suffix, company registration, or the user’s location. Services using content delivery networks may resolve to different addresses over time, and database locations may not match how a service is commonly understood. Use regional rules as broad categories, not as a substitute for explicit rules for important service domains.

RuleWhat it matchesCommon limitation
IP-CIDRIPv4 address rangeA change in the domain’s resolved address may put it outside the range
IP-CIDR6IPv6 address rangeAn IPv4-only rule won’t cover IPv6 connections
GEOIPAddress database regionDoes not indicate a domain’s or service’s business affiliation

A domain can return both IPv4 and IPv6 addresses. If you write a rule for only one address family, connections using the other may fall through to a later regional rule or FINAL. When the same URL sometimes connects directly and sometimes uses a proxy, check the address family, actual destination address, and time of the new connection—not just the URL text. Verify separately that the network has a working IPv6 route.

Put explicit domain exceptions before broader address or regional rules, and keep a final fallback. If a service must always use a specific policy, describing its domain is usually more reliable than guessing which region its addresses will resolve to. When you do need an address range, record its source and purpose so an old rule doesn’t affect connections after the service changes its addresses.

05 Rule order, USER-AGENT, and FINAL

In a standard [Rule] list, rules are checked in configuration order, and the matching rule supplies the policy. The process does not automatically pick “the most specific rule.” A specific condition can only match if it appears in a position where it gets a chance to run. If an earlier, broader condition already covers the destination, a later exact rule won’t change the result. Rule order matters as much as the conditions themselves.

Put exceptions before broader matches

[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,example,REJECT
GEOIP,CN,DIRECT
FINAL,PROXY

In this example, the login domain uses a direct connection first. Other hosts under the same domain go through the proxy under the suffix rule. The keyword rule handles only destinations not already covered that contain the specified text. If you move the suffix rule to the first line, the login domain will match the proxy rule too. The file doesn’t give a longer or more precise-looking line higher priority automatically.

Understand duplicate rules in terms of order. If the same domain has DIRECT first and PROXY later, those aren’t two selectable routes; the first matching rule supplies the result. When checking for conflicts, search not only for identical lines but also for suffix, keyword, and other broad conditions that could include the domain. Different-looking text can still overlap on the same request.

USER-AGENT depends on available request data

USER-AGENT sets a condition based on the request’s User-Agent information. It doesn’t identify an app by name, and including an app name in a rule doesn’t guarantee that every connection from that app will be recognized. The rule can only evaluate information available when the request is handled. For encrypted connections, don’t assume all request headers are automatically visible, and don’t rely on this rule as the sole condition for covering every connection.

[Rule]
USER-AGENT,ExampleClient*,PROXY
DOMAIN,api.example.com,PROXY
FINAL,DIRECT

The client identifier in this example only demonstrates the matching format; it doesn’t refer to a real app. In practice, verify the actual field using request information you can inspect, then check whether the rule matches. Different components of the same app may use different identifiers, and system services may initiate requests on its behalf. If you can describe a destination by domain, keeping a domain condition is usually easier to explain than relying on a guessed request-header value.

FINAL is only the last-resort rule

FINAL selects a policy when none of the preceding rules match and is usually placed at the end of the list. It doesn’t raise priority or fix faulty rules. If you put it earlier in the list, later rules may never get a chance to match. Choose FINAL,PROXY or FINAL,DIRECT based on the route you want for unclassified connections—not simply because another file uses one.

With a proxy fallback, unclassified requests depend on an available proxy route. With a direct fallback, uncovered traffic attempts to use the current network directly. Verify either choice in practice. The key is to understand the result: if a destination matches the final rule, that usually means earlier conditions didn’t cover it—not that the final rule “stole” a connection that should have matched. Check the destination name, address, and rule scope.

When merging configurations, decide which final rule to keep, then place specific conditions before it. Appending two complete files often leaves multiple sections, duplicate rules, and a fallback appearing too early. Start with one working file and move rules over in groups by purpose, checking how each group changes the match results. If something breaks, you can trace it to the most recently added scope instead of guessing across hundreds of lines.

06 General, DNS, and Host mappings

Resolution and routing are related but separate processes. DNS translates names into addresses; rules determine which policy a matching connection uses. A domain can match a proxy rule and still be unreachable because resolution failed. Or resolution can succeed while the selected route cannot reach the returned address. A displayed latency value alone doesn’t prove that name resolution, transport, and the app response all completed successfully.

Keep the baseline settings understandable

Interpret options in [General] in the context of your current configuration and the in-app documentation. When troubleshooting resolution, note the original DNS settings and change one factor at a time. The example dns-server = system shows a configuration that uses the system’s DNS source; it isn’t a universal recommendation. The current network, DNS service reachability, and other configuration options can all affect the outcome.

[General]
dns-server = system

[Host]
test.example.com = 192.0.2.10

[Rule]
DOMAIN,test.example.com,DIRECT
FINAL,PROXY

This example shows a static mapping and a policy separately. [Host] assigns an address to the test domain; [Rule] sets that domain to use a direct connection. Changing the mapping doesn’t change the policy, and changing the policy doesn’t guarantee that the address is correct. The example address is for documentation only and shouldn’t be used to test a real website. For a real service, use mapping information you can verify.

A Host mapping can’t replace service configuration

Static mappings are useful when you genuinely need a fixed name-to-address relationship, such as in your own test environment. They bypass the name’s usual dynamic resolution and may preserve an outdated address. For services that use content delivery networks, rotate addresses, or return different results by region, a manually fixed address can break their normal behavior. Don’t keep an address that worked once as a permanent, general-purpose fix.

Even if an address is reachable, HTTPS still requires the hostname to match the certificate and other settings. Mapping a domain to another server doesn’t give that server the domain’s certificate or website content. If you see a certificate warning, the wrong site, or a refused connection, restore the original mapping and verify the server details instead of widening the rules. The domain, address, and service identity must all match.

How to investigate resolution failures

First determine whether the failure happened during resolution or after an address was obtained. If the connection record shows a name-resolution error, check DNS settings and reachability first. If it shows a destination address, check the policy, server, and destination response. Don’t rely on a single browser error message: different underlying causes can produce similar pages. Note the time and target of a complete failed request so you can find it in the logs.

Next, check for an old [Host] mapping. A static mapping for the same domain can make tests appear unchanged after you update the DNS server. Confirm that no outdated address is pinned, then compare system resolution with the result from the current configuration. Account for cached results too; don’t mistake an old record for output from the new settings. Start a fresh request and reconnect if needed.

Also distinguish the route for DNS requests from the route for application traffic. A business rule set to PROXY doesn’t mean all DNS traffic necessarily uses the same server; check what the current resolution settings actually do. When changing DNS, don’t also switch servers, change the final policy, and add a Host mapping. Even if the website starts working, you won’t know which change made the difference.

For internal network names, check whether only the current local network can resolve them. If a name stops resolving after you leave that network, the environment may have changed; the rules file may be fine. Conversely, keeping an address that only works on a particular local network while using an external network can cause persistent failures. Recheck environment-dependent settings when the network changes.

For a more detailed troubleshooting sequence, see DNS troubleshooting: latency is normal, but pages won’t load. The approach here is to identify the stage that failed, then change settings directly related to it. Check routing after resolution succeeds, and check the destination service after routing is correct. Don’t reduce every problem to “try a different DNS.”

07 URL Rewrite scope and limitations

[URL Rewrite] processes requests based on URL conditions; this is different from the connection routing policies in [Rule]. The former concerns available URL information and how to handle it, while the latter determines the route a connection takes. To send a domain through a proxy, start with a domain rule. Consider rewrite conditions and actions when you need a specific old page URL to redirect to a new one.

Start with the full target, then narrow the regex

A rewrite rule typically includes a matching expression, a target, and a handling method. The example below shows an exact old URL redirected temporarily to a new address. It demonstrates syntax and match boundaries only; you don’t need to visit the example domain. When editing, confirm that the current app accepts the line, then test it with a new request. Don’t rely on whether the file can be saved as proof that the rule works.

[URL Rewrite]
^http://example\.com/old$ http://example.com/new 302

The opening ^ anchors the start of the expression; the closing $ anchors its end. The dot in a domain is written as \. to match a literal period. Without the escape, a dot in a regex usually matches any single character, which can include addresses you didn’t intend to match. Understand each symbol before editing; that’s easier than changing a few characters in a long expression and hoping the scope stays narrow.

This example does not cover subdomains, extra paths, or query parameters. Adding a query string at the end of a URL may prevent the exact end condition from matching as intended. If you need to handle parameters, first decide whether to preserve, remove, or rearrange them, then design the expression accordingly. Don’t add a broad catch-all pattern: it could also include sign-in callbacks, resource paths, or later pages.

Verify redirects and connection policies separately

A redirect sends the request to a new destination. That destination still needs to resolve and connect under the applicable routing rules. A direct route for the old domain doesn’t mean a different domain after the redirect will also use a direct connection. Record both the original and final URLs when troubleshooting. If you check only the first request, it may look as if the policy failed when the actual issue is the follow-up destination.

Don’t use URL Rewrite to fix server authentication errors, missing protocol fields, or an unreachable DNS service. These problems occur at different layers; changing URL text can’t supply missing connection parameters. If a request times out before the connection is established, start with the server, resolution, and policy. Check the regex and redirect behavior only after confirming that the request has reached a stage where rewriting can apply.

Understand HTTPS visibility separately

HTTPS paths and request headers are inside an encrypted connection. Don’t assume that adding a rewrite line lets you read and change all content. Whether a particular rule can apply depends on the protocol, app behavior, and relevant configuration conditions. Settings involving certificate trust change the security boundary and shouldn’t be treated as a default step for making rules work. Ordinary domain routing doesn’t require access to encrypted content.

If a rewrite doesn’t take effect, first rule out a pattern that doesn’t cover the actual URL, a reused connection, or a cached result. Don’t immediately widen the match or add every domain to a set that needs extra handling. If you can’t verify the purpose of a certificate or setting, stop editing, preserve the last known working state, and confirm its source and necessity before proceeding. Broader rules cost more to verify and can have a wider impact.

Also guard against redirect loops: if the new URL matches the original condition again, the same action may be triggered repeatedly. During testing, check whether the URL keeps changing, the page reports too many redirects, or the log shows repeated destinations. Make the old-URL condition precise and ensure the target no longer matches it. Don’t try to hide a loop by switching proxy servers.

When maintaining a configuration, keep connection rules and URL handling in separate groups. If basic access returns after you remove or disable a rewrite, narrow down the problem in that section instead of immediately changing the entire routing setup. If you only need domain-based routing, leave the rewrite section empty or omit it. A configuration is complete when it meets your needs—not when it includes every available feature.

08 Configuration changes, verification, and troubleshooting

Make configuration changes reversible: keep the original file, set one clear goal, change one related group of conditions, start a new request, and verify the actual match and connection result. Each test should answer one question, such as “Does this exact domain use the proxy?” Don’t try to test resolution, protocol settings, every page resource, and the entire rule set at once. Specific questions produce results that are easier to interpret.

Keep a minimal troubleshooting record

Before starting, note the selected configuration, Global Routing mode, selected server, network, and test target. Don’t include subscription URLs or authentication details. If you describe the issue to someone else, hide passwords, full subscription links, and other identifying information first. Query parameters in local logs can also contain sensitive data; hiding only the server name isn’t enough.

  1. In Config, confirm the active file, keep a copy, and identify the section you plan to edit.
  2. Check English punctuation, section placement, policy spelling, and the position of the final rule. Save the file and confirm it can be read.
  3. Switch back to Config for testing and confirm the connection toggle is in the expected state.
  4. Reopen the target page or start a new request, then compare the destination, matching rule, and policy in the connection record.
  5. If the result is unexpected, revert the latest group of changes and trace the failing stage instead of adding more exceptions.

Narrow the checks based on what you observe

Observed resultCheck firstNext step
Configuration fails to loadSection names, English punctuation, and field countRevert the latest changes and add them back one line at a time
Always matches FINALTarget type and the scope of preceding conditionsVerify the actual domain, address, and available request information
Expected policy matches, but the connection times outResolution, server, and destination reachabilityTest the selected route separately; don’t keep adding rules
Some resources failSubresource domains and redirect destinationsCheck the failed requests; don’t widen the entire list
Problems start after changing networksLocal network mappings, resolution conditions, and address familyRecheck environment-dependent settings, then test the same destination

If every request matches FINAL, first confirm that you’re actually using the file you just edited. Then check whether a domain field mistakenly includes a full URL, and whether preceding conditions depend on information that isn’t available. If only one destination behaves unexpectedly, search for every condition that could cover it, especially earlier suffix and keyword rules. The final rule only reveals that earlier rules didn’t match; it shouldn’t be the first thing you keep changing.

If the expected policy matches but the connection still fails, stop adding rules. Confirm that your existing server details match the protocol, including the address, port, authentication, and transport fields. Similar-looking fields in different protocols may not be interchangeable; changing a rule can’t fix an authentication failure. For help identifying fields, see VMess and VLESS field guide, then check each item against your existing service details.

Manage subscriptions, configurations, and servers separately

If something changes after a subscription update, compare the server list and current selection first instead of assuming the rules file changed. Before removing duplicates, check which existing subscription each entry belongs to, so manually imported entries and subscription updates don’t leave the same content in place. For groups, updates, and duplicate entries, see managing multiple subscriptions. For sharing formats, see node links versus subscription URLs.

After verification, keep a concise note about the final working changes, including the goal, reason, and test result. Remove temporary exceptions once they’re no longer needed, so repeated troubleshooting doesn’t leave conflicting rules behind. Recheck local differences after refreshing a remote configuration. Long-term maintainability isn’t about the number of rules; each group should remain understandable, have a clear purpose, and be easy to roll back if something goes wrong.

Finally, check the app’s availability and usage requirements. Shadowrocket is primarily used on iPhone and iPad; compatibility and purchase availability for Mac, Apple TV, and Apple Vision are as listed on the App Store page. App updates are managed through the App Store. Configuration examples on this page don’t change system requirements or include network services. Before purchasing, verify the developer, Shadow Launch Technology Limited, the official icon, and app ID 932747118.

If you haven’t completed the basic setup, return to the tutorial and follow the steps in order. If you’ve identified a specific issue, look for the relevant category in Troubleshooting. Keep a minimal configuration that reliably reproduces the result, then restore other rules gradually. This is usually easier than adding broad conditions and helps reduce disruption to connections that already work.