A developer’s network workflow rarely depends on one website. A normal workday may involve cloning a repository, downloading a container image, resolving packages from a registry, calling an external API, and waiting for a CI runner to complete an automated build. These tasks use different applications, DNS lookups, transport behaviors, and proxy settings. A connection that makes a browser feel faster may still leave Git, Docker, npm, or a build runner using the original route.
This guide explains how to build a practical VPN and proxy workflow for GitHub, Docker Hub, npm, private registries, APIs, and CI. The goal is not to force every packet through one tunnel. In many development environments, split tunneling is easier to maintain: development services that need an alternate route use the proxy, while local network resources, intranet systems, package mirrors, and ordinary applications remain direct. The same principles apply whether you use an official Windows, macOS, Android, iOS, or Linux client, or import a subscription into Clash Verge, sing-box, or Shadowrocket.
Map the developer network: identify what actually needs acceleration
Before selecting a node or changing proxy variables, list the destinations used by your workflow. Git operations may use HTTPS or SSH. Package installation may contact npm, PyPI, Maven, NuGet, a language-specific mirror, or a private registry. Docker may contact a registry API, an authentication endpoint, a token service, and a separate image storage endpoint. A browser test often checks only one of these destinations, so it cannot prove that the complete workflow will work.
It is also important to separate the application from the transport. Git is a command-line client, Docker usually has a command-line client that communicates with a daemon, and CI may run on another host entirely. A proxy configured in your desktop browser has no reason to be inherited by the Docker daemon or a remote CI runner. Similarly, a system-level VPN may route traffic from a desktop process without being respected by a container process that has its own network namespace or daemon configuration.
120+
Countries covered
250+
Available routes
5
Supported platforms
Unlimited
Online devices
A useful first inventory has four columns: tool, destination, connection method, and proxy control. For example, Git may be controlled by environment variables, Git configuration, or an SSH-specific setting. npm has its own registry and proxy configuration. Docker separates client behavior from daemon behavior. A CI job may expose HTTP proxy variables, but the runner host and container executor may each require additional configuration.
| Workload | Typical connection | Where proxy settings usually belong | First verification |
|---|---|---|---|
| Git over HTTPS | HTTPS to the code host | Shell environment or Git configuration | Inspect the remote URL and run a verbose fetch |
| Git over SSH | SSH, commonly on port 22 or an alternate endpoint | SSH configuration or an SSH-aware proxy method | Test the SSH handshake without cloning |
| npm and package registries | HTTPS requests, redirects, and archive downloads | npm configuration, environment variables, or a registry mirror | Check the active registry and request metadata |
| Docker images | Registry API, authentication, and layer downloads | Docker daemon service configuration | Pull a small known image and inspect daemon logs |
| CI services and APIs | HTTPS, webhooks, artifact storage, and API calls | Runner environment, job variables, or executor settings | Print safe proxy state and test the exact endpoint |
Do not assume that the nearest-looking route name is the best route for every task. A route labeled direct, relay, IEPL, BGP, or CN2 describes a transport or network path, not a universal guarantee for Git, registries, or APIs. IEPL is generally used to describe an international private-line transport, while BGP and CN2 refer to network connectivity and routing characteristics. None of these names replaces the client protocol. Shadowsocks, VMess, Trojan, Hysteria2, and WireGuard are different protocol or tunnel choices, and compatibility must be checked independently.
Choose the client and protocol: match the tool to the platform
On Windows, macOS, Android, iOS, and Linux, an official client is usually the simplest starting point because it can handle sign-in, subscription retrieval, route updates, and system permissions in one interface. After logging in, obtain the subscription link or use the client’s built-in import flow according to the service instructions. A subscription is configuration data; it is not itself a VPN client. The client must support the formats and protocols contained in that subscription.
Clash Verge is useful when you need rule groups, domain-based routing, and separate proxy or direct policies for development destinations. sing-box provides a flexible routing model and can be suitable for users who need more explicit inbound, outbound, DNS, and rule configuration. Shadowrocket is a common iOS option for importing compatible subscriptions and applying domain or application rules. These clients do not automatically support every subscription format, so check whether the supplied profile is intended for that client before importing it.
Protocol selection should follow the client and network environment rather than a marketing label. Shadowsocks is commonly used as an encrypted proxy transport. VMess and Trojan have their own authentication and transport requirements. Hysteria2 uses a QUIC-based design and can behave differently from TCP-based protocols on restrictive or unstable networks. WireGuard is a VPN tunnel protocol with a different configuration model from many proxy subscription formats. If a profile contains WireGuard information, use a client that can read that profile or configure it through the appropriate WireGuard-compatible interface.
- ✅ Confirm that the client supports the subscription format before importing the link.
- ✅ Keep one primary client active while testing so two system VPN interfaces do not compete.
- ✅ Start with a rule mode that sends only required development destinations through the alternate route.
- ✅ Keep a direct policy for local addresses, internal dashboards, printers, and private package services.
- ❌ Do not treat a successful import as proof that every node or protocol is compatible.
- ❌ Do not paste a complete subscription URL into an issue, terminal recording, or public support request.
For developer traffic, DNS behavior deserves special attention. A domain rule cannot work reliably if the hostname is resolved through an unsuitable DNS path and the result is cached incorrectly. Some clients provide fake-IP or enhanced DNS modes, while others use system DNS or a remote resolver. Choose a mode that matches the client’s documentation and your local requirements. When a private registry or intranet hostname stops resolving, test whether the problem is DNS policy rather than the route itself.
Configure Git, npm, and Docker: handle clients and daemons separately
Git over HTTPS is usually the easiest case. You can use a system-level tunnel, temporary HTTP_PROXY and HTTPS_PROXY variables, or Git’s own proxy setting. A temporary shell setting is useful for diagnosis because it limits the change to one terminal session. A persistent Git setting is convenient on a dedicated development machine, but it should be reviewed before sharing the machine or switching between work and personal networks.
git remote -v
git config --get http.proxy
git config --get https.proxy
git ls-remote https://example.invalid/owner/project.git
The example hostname is deliberately non-functional; replace it with a repository you are authorized to access. The important checks are whether the remote uses HTTPS, whether Git has an unexpected old proxy, and whether the request reaches the expected authentication stage. If the browser works but git ls-remote fails, inspect Git’s configuration rather than repeatedly changing nodes.
Git over SSH requires a different approach. An HTTP proxy setting does not automatically proxy SSH. Depending on the client and network, you may use an SSH configuration entry with a supported proxy command, an SSH endpoint provided by the code host, or switch the repository remote to HTTPS when that fits your authentication policy. Test the handshake first, then test repository access. A timeout before authentication suggests routing or port reachability; an authentication failure after the handshake points to keys, account permissions, or the remote URL.
npm has at least two independent concerns: the registry URL and the HTTP proxy path. A package can resolve from the registry metadata but fail while downloading a tarball if redirects or the storage host are not covered by the same policy. Check the active registry and proxy values with npm’s configuration commands. Avoid leaving a credential-bearing registry URL in shell history or project files. For teams, a managed internal registry or approved mirror is often easier to audit than asking every developer to maintain local exceptions.
npm config get registry
npm config get proxy
npm config get https-proxy
npm ping
npm view package-name version
Docker adds a common source of confusion because the Docker CLI and Docker daemon are separate processes. Setting a proxy variable in your terminal may affect a command that talks to the daemon, but image downloads are performed by the daemon. On Linux, daemon proxy configuration is normally managed by the service manager and requires a daemon reload or restart according to the operating system. Docker Desktop has its own settings for engine and resource behavior. In either case, change one layer at a time and confirm which daemon is actually serving the command.
Docker image pulls can involve more than the registry hostname shown in the command. The daemon may first request registry metadata, obtain an authentication token, and then download layers from storage endpoints. If authentication succeeds but layers stall, the route may cover the registry API while missing the storage domain. If a corporate proxy performs TLS inspection, certificate trust and daemon-level CA configuration may also be involved. Do not disable TLS verification as a first response; identify the certificate or proxy policy problem instead.
Hands-on split-tunnel setup: build a narrow rule set first
Begin with a clean baseline. Close other VPN applications, note whether the system is on Wi-Fi or mobile tethering, and record the current Git remote, npm registry, Docker context, and relevant proxy variables. Do not change the route, client, DNS mode, and application configuration simultaneously. If four variables change at once, a successful result is difficult to reproduce and a failure is difficult to explain.
- Import the profile: Add the subscription to the official client, Clash Verge, sing-box, or Shadowrocket only through the supported import method. Update the profile once and verify that the expected nodes and protocol types are visible.
- Select a node: Start with a route geographically and operationally suitable for the destination. Compare more than one route during the same kind of task, but do not describe a single connection result as a permanent speed guarantee.
- Choose rule mode: Use rule-based routing when you need local services to remain direct. Use a global mode only as a short diagnostic step or when your environment genuinely requires all traffic to share the tunnel.
- Add development domains: Include the code host, required registry domains, API endpoints, and image storage domains identified from logs. Avoid broad catch-all rules until you understand the side effects.
- Test DNS and HTTPS: Resolve the target hostname and make a simple HTTPS request. Compare the result with and without the rule, while keeping credentials and tokens out of command output.
- Test the actual tool: Run a Git metadata request, an npm metadata request, and a Docker pull. A browser test is not a substitute for these application tests.
- Document the result: Record the client, rule mode, node label, protocol, application configuration, and failure symptom. This turns future troubleshooting into a repeatable process.
In Clash-style rule systems, prefer explicit domain or domain-suffix rules for known services, followed by a clear final policy. In sing-box, pay attention to the order of route rules, DNS rules, and outbounds; an earlier match can prevent a later rule from taking effect. In Shadowrocket, verify that the selected rule set is active and that the application is not using a separate global override. Names differ between clients, but the principle is the same: make the intended match visible and keep a direct fallback for local resources.
# Temporary diagnostic variables for a Unix-like shell
export HTTP_PROXY=http://127.0.0.1:PORT
export HTTPS_PROXY=http://127.0.0.1:PORT
export NO_PROXY=localhost,127.0.0.1,.local
# Inspect the current environment without printing secret values
env | grep -E '^(HTTP|HTTPS|NO_PROXY|ALL)_PROXY='
The loopback port in this example is only a placeholder. Use the local HTTP proxy port exposed by your client, and do not assume that a SOCKS port can be used as an HTTP proxy without an adapter or application support. Some tools accept socks5 URLs directly; others accept only HTTP CONNECT proxies. A protocol mismatch can look like a broken node even when the node itself is healthy.
For Docker, apply the equivalent proxy setting to the daemon or Docker Desktop engine rather than copying a shell variable blindly. For CI, reproduce the same narrow rule set in the runner environment only when the build’s destinations require it. A local development proxy cannot help a remote runner unless the runner can reach that proxy through an approved and secure network path.
CI and API workflows: avoid confusing local speed with runner speed
Continuous integration introduces a boundary between your workstation and the build environment. If a local clone is slow, changing your local VPN may solve the developer experience without changing the CI job. If the CI runner cannot download dependencies, the runner needs its own network policy, proxy environment, registry mirror, or approved egress route. Treat the runner as a separate machine with its own DNS, certificates, firewall, and container executor.
Job-level variables such as HTTP_PROXY, HTTPS_PROXY, and NO_PROXY can help command-line tools, but they do not guarantee that the runner service, Docker-in-Docker daemon, sidecar container, or artifact uploader inherits them. Check the runner documentation and executor model. Keep proxy credentials in the CI secret store rather than committing them to workflow files. Mask values in logs and avoid commands that echo the complete environment.
Package caches and registry mirrors can reduce repeated downloads more reliably than routing every build through a broad proxy. A cache should still be monitored for freshness, access control, and integrity. Pin dependency versions and use lockfiles where appropriate, but remember that a lockfile controls versions, not network reachability. If the metadata host works while archive downloads fail, inspect redirects, storage domains, and certificate validation.
API requests need similar care. An API client may use its own proxy option and may not read browser or system settings. It may also maintain a persistent connection, use HTTP/2, or apply its own timeout and retry behavior. Test the exact API hostname with a harmless authenticated operation or a documented health endpoint. A successful DNS lookup proves only that a name resolved; it does not prove that TLS negotiation, authorization, streaming, or webhook delivery will work.
- ✅ Keep CI proxy credentials in protected secret variables, never in a repository or copied command.
- ✅ Add private registries, internal domains, and loopback addresses to the direct list where appropriate.
- ✅ Configure the Docker daemon used by the runner, not only the job shell.
- ✅ Test package metadata, package archives, image manifests, and image layers as separate stages.
- ❌ Do not assume a route that works from a laptop will be reachable from a hosted runner.
- ❌ Do not disable certificate verification or use a global proxy to hide an unknown CI failure.
Troubleshooting and budget options: turn failures into evidence
When a developer tool fails, classify the symptom before changing anything. A DNS error points toward name resolution or rule selection. A TCP timeout points toward reachability, firewall policy, or an unsuitable route. A TLS certificate error points toward interception, trust configuration, or a hostname mismatch. An HTTP authorization error usually means the request reached the service but the credentials or permissions are wrong. A Docker manifest success followed by a layer failure suggests that different registry endpoints are being handled differently.
Start by checking whether the intended client is connected and whether another application owns the system VPN interface. Then inspect the active rule mode, DNS mode, and selected outbound. Next, check application-specific configuration: Git proxy values, npm registry and proxy values, Docker context and daemon settings, and CI runner variables. Finally, compare a direct request and a proxied request to the same authorized endpoint. Keep the comparison controlled and avoid repeated destructive retries against package or image services.
Budget planning should follow traffic patterns rather than the number of applications. A light solo workflow may fit the monthly subscription with 60GB for ¥9.9 per month. A developer who regularly downloads dependencies and container layers may prefer 250GB for ¥18 per month, while heavier image builds and multiple workstations may make 500GB for ¥28 per month more appropriate. Monthly traffic resets each month on the activation date. If you upgrade during the current period, the price difference is calculated according to the remaining days.
For traffic that is used irregularly, the permanent traffic packages are another option: ¥158 for 300GB, ¥358 for 1000GB, or ¥658 for 3000GB. These packages remain available until used and do not expire. The practical choice depends on whether downloads are steady each month or concentrated around occasional projects, migrations, and build work. Do not select a route or plan only because a single container pull appears fast; measure the complete workflow and consider caching, registry policy, and CI location as well.
¥9.9
Monthly plan with 60GB
¥18
Monthly plan with 250GB
¥28
Monthly plan with 500GB
14 days
No-reason refund
All supported devices can use the same account without a fixed simultaneous-device limit, which is useful when a developer moves between a desktop, laptop, phone, and Linux build host. Supported platforms include Windows, macOS, iOS, Android, and Linux. Payment options are Alipay, WeChat Pay, and USDT, and registration requires only a username and password rather than an email address. A 14-day no-reason refund is available, so a short compatibility check is sensible before committing a workflow to one client or protocol.
The safest final configuration is usually narrow and documented. Keep local and private destinations direct, route only the code hosts, registries, APIs, and image endpoints that need it, and configure daemon or CI boundaries explicitly. If a tool still fails, temporarily simplify the rules to isolate DNS, protocol, application proxy, and route behavior one by one. Once the cause is known, restore split tunneling instead of leaving a broad global proxy enabled permanently.