GitHub timeouts, slow Docker pulls, and failed npm installs can interrupt an otherwise productive development day. The problem is not always the VPN itself. A repository operation may use Git over HTTPS, an image pull may be handled by the Docker daemon, and an npm command may read proxy settings from a completely different configuration file. If only the browser is routed through a VPN, command-line tools can continue using the local network and fail independently.
A practical developer setup therefore needs more than a connected status indicator. You need to identify which process creates the request, decide whether that process should use a system proxy, a local HTTP or SOCKS proxy, or a TUN interface, then verify name resolution, authentication, and routing. This guide maps those choices to GitHub, Docker Hub, npm registries, APIs, and CI/CD workflows without assuming that one setting controls every application.
Map the development traffic before changing settings
“The internet is slow” is too broad a diagnosis for a development machine. GitHub access may involve repository metadata, authentication endpoints, release downloads, raw files, and package references. Docker uses a registry API followed by content delivery endpoints, and the daemon may run outside the user session. npm can contact the configured registry, fetch package metadata, download tarballs, and execute lifecycle scripts that make additional network requests. A successful browser test checks only one portion of this chain.
Begin by recording the symptom and the exact command. A Git operation that stalls during authentication points to a different layer than one that fails while fetching a large pack file. A Docker command that resolves the registry but cannot download a layer may indicate a proxy mismatch between the Docker CLI and daemon. An npm install that finds package metadata but fails on a tarball URL may be using a registry whose download host is not covered by the same route.
- ✅ Identify the process that opens the connection: Git, Docker daemon, npm, a browser, or a build runner.
- ✅ Check the configured Git remote and npm registry before assuming the VPN route is broken.
- ✅ Read the client connection log while reproducing one failure.
- ✅ Test DNS resolution and HTTPS access separately when an error message is vague.
- ❌ Do not conclude that every command is proxied because a browser page loads.
- ❌ Do not run several VPN or proxy clients simultaneously while diagnosing routing.
There are three common routing models. A system proxy is simple and works well for applications that honor the operating system’s proxy settings, but command-line programs and background services may ignore it. A local application proxy gives you explicit control: Git, npm, and Docker can be pointed at the same local listener while other traffic remains direct. TUN mode creates a virtual network interface and can capture more traffic, including software that does not understand proxy variables, but it requires suitable permissions and can conflict with virtualization, security software, or another virtual adapter.
Protocol compatibility also matters. A subscription may contain Shadowsocks, VMess, Trojan, VLESS, Hysteria2, or WireGuard configurations, but not every client supports every protocol or import format. Clash Verge and sing-box are useful when rule-based routing and multiple protocol types are needed; Shadowrocket is commonly used on Apple mobile devices. On a development workstation, choose the client according to the operating system, supported core, subscription format, logging quality, and ability to expose HTTP or SOCKS access. Do not select a client only because its name appears in a tutorial written for another platform.
90+
Countries covered
200+
Available routes
Unlimited
Devices
5
Supported platforms
Speed up GitHub and Git operations
Git can connect through HTTPS or SSH, and the two paths have different configuration points. HTTPS usually follows Git’s own proxy configuration or environment variables. SSH does not use an HTTP proxy setting; it needs a SOCKS-aware wrapper, a reachable route, or a different transport strategy. Before changing anything, inspect the remote with a command such as:
git remote -v
git config --global --get http.proxy
git config --global --get https.proxy
If the remote uses HTTPS, configure only the scope you need. A global proxy is convenient on a personal workstation, but a repository-specific setting is safer when work and personal projects require different routes. The local proxy address and port must match what the VPN client actually exposes. Avoid copying a port from a different client profile or from an old setup.
git config --global http.proxy http://127.0.0.1:LOCAL_HTTP_PORT
git config --global https.proxy http://127.0.0.1:LOCAL_HTTP_PORT
# Remove the settings when they are no longer needed
git config --global --unset http.proxy
git config --global --unset https.proxy
The placeholder above is intentional: replace it with the local listener shown by your client rather than treating it as a universal value. If the client exposes SOCKS instead of HTTP, use the scheme supported by your Git build and local proxy arrangement. Some setups require a SOCKS-to-HTTP bridge, while others can use a command wrapper. The important point is to confirm the protocol expected by Git and the protocol offered by the listener.
For a first test, use a low-impact operation such as listing remote references or fetching a small repository. Watch both the Git output and the VPN connection log. If authentication succeeds but the transfer stops, inspect the route used for the repository host and any separate object or release domains. If Git reports a certificate error, do not disable TLS verification as a shortcut. Check system time, certificate interception by security software, the configured proxy type, and whether the local proxy is passing HTTPS correctly.
SSH repositories need a different plan. A command like git clone [email protected]:owner/project.git opens an SSH connection, so http.proxy and https.proxy do nothing. You can instead use an HTTPS remote where appropriate, route SSH through a supported SOCKS mechanism, or use the network mode that captures the SSH process. In a managed work environment, verify that the organization permits the selected method and that the account’s SSH key policy is respected.
Do not place access tokens or proxy passwords directly in a shared shell history or committed configuration file. If the local proxy requires authentication, use the client’s documented credential mechanism or an operating-system secret store. After testing, review the effective configuration:
git config --show-origin --get-regexp 'http\..*proxy|https\..*proxy'
This helps find a proxy inherited from a system-level file, a user-level file, or a repository-level file. A common failure is believing that a setting was removed when a second configuration layer is still active. Another is leaving a temporary proxy in a project-specific configuration, causing colleagues or automated jobs to inherit an unreachable local address.
Configure Docker pulls and builds correctly
Docker has a particularly important distinction: the command you type and the daemon that performs the network operation may not be the same process. On a native Linux installation, the Docker daemon usually runs as a service. On Docker Desktop, the engine runs inside a managed environment. A browser or terminal proxy setting may therefore have no effect on image pulls, base-image downloads, or build steps.
First separate the operation. docker pull asks the daemon to contact the registry. A Dockerfile build may pull a base image, download package indexes, and run commands inside build containers. A Compose workflow can add another layer of environment and service configuration. If the daemon cannot reach the registry, configure the daemon or Docker Desktop network settings. If the build container cannot reach a package source, configure build-time proxy arguments or the package manager inside the image according to the project’s security policy.
docker info
docker pull alpine:latest
The image name in the example is only a connectivity test; use an image that is appropriate for your own environment. Read the error carefully. “Unauthorized” is an authentication problem, “manifest unknown” is often an image or tag problem, and a timeout or name-resolution error points more strongly toward routing, DNS, or proxy behavior.
On Docker Desktop, use the application’s network or proxy settings and restart the engine if the interface requests it. On a Linux daemon, follow the distribution’s service configuration method and apply the proxy to the daemon rather than only exporting variables in your interactive shell. The exact file location can differ by installation method, so copying a configuration path from an unrelated system can create a false fix.
For builds that need outbound access, proxy variables may be passed as build arguments:
docker build \
--build-arg HTTP_PROXY=http://127.0.0.1:LOCAL_HTTP_PORT \
--build-arg HTTPS_PROXY=http://127.0.0.1:LOCAL_HTTP_PORT \
--build-arg NO_PROXY=localhost,127.0.0.1 \
-t example-image .
Do not bake proxy credentials into an image layer. Credentials can remain in build history, caches, or exported artifacts. Prefer a local unauthenticated listener restricted to the machine, a secret mechanism supported by the build system, or a CI runner-level configuration that is not copied into the final image. Keep NO_PROXY precise: internal registries, service names, loopback addresses, and cluster domains may need direct access, while an overly broad entry can silently bypass the route you intended to test.
There is also a difference between pulling from Docker Hub and accessing a registry mirror or a private registry. A VPN route that helps one endpoint may not improve another. If a project uses a private registry, confirm its certificate chain, login method, and allowlist requirements before changing the global Docker route. For teams, document whether the proxy belongs to the developer machine, the Docker daemon, the build environment, or all three.
Do not confuse CLI settings with daemon settings
Exporting HTTP_PROXY in your terminal may affect a command-line tool while leaving the Docker daemon unchanged. Test the daemon with an image operation, then test a build separately. These are two different network paths.
Make npm installs more reliable
npm has its own registry and proxy configuration. It may also inherit environment variables, project configuration, user configuration, and settings supplied by a package manager wrapper. Start by checking the effective values instead of editing files blindly:
npm config get registry
npm config get proxy
npm config get https-proxy
npm config get noproxy
For a normal public registry workflow, make sure the registry URL is the one intended by the project or organization. If the registry responds but package downloads fail, inspect the resolved tarball host and the client log. Metadata and package archives do not always follow the same hostname, and a rule that covers only the registry API can leave downloads outside the expected route.
When using an explicit local HTTP proxy, npm can be configured with commands such as:
npm config set proxy http://127.0.0.1:LOCAL_HTTP_PORT
npm config set https-proxy http://127.0.0.1:LOCAL_HTTP_PORT
# Return to direct access when appropriate
npm config delete proxy
npm config delete https-proxy
Again, use the listener shown by the VPN client. If the local endpoint is SOCKS-only, use a compatible arrangement rather than placing a SOCKS URL into a setting that expects HTTP proxy semantics. A connection can appear active while npm fails because the proxy protocol, authentication, or TLS handling is incompatible.
Project-level configuration deserves special care. A committed .npmrc may intentionally define a private registry, but it should not contain a developer’s personal proxy address or credentials. User-level settings are convenient for local work, while environment variables are often easier to control in temporary shells and CI jobs. When a package install behaves differently in a terminal and an IDE, compare the environment inherited by both processes.
Do not treat every npm failure as a network failure. A lockfile can refer to an unavailable package version, a private scope can require login, a certificate can be rejected by the runtime, or a lifecycle script can fail after all packages have downloaded. Separate these cases by checking whether the error occurs during metadata lookup, archive download, integrity verification, or script execution. Keep package integrity checks enabled, and do not resolve certificate errors by disabling strict SSL without understanding the trust-chain problem.
A hands-on routing workflow for a development machine
The safest setup is incremental. Install the official desktop client or a compatible client from a trusted source, import the subscription link through the client’s documented interface, select one suitable route, and note the local HTTP or SOCKS listener. If you use Clash Verge or sing-box, confirm which core is active and which configuration profile received the imported nodes. On mobile, Shadowrocket and similar clients have their own local routing controls; those settings do not automatically configure a Windows, macOS, or Linux workstation.
- Start with one route. Avoid changing nodes, modes, DNS, and proxy types at the same time. A stable baseline makes each later result meaningful.
- Test the client itself. Confirm that the connection log shows an established session and that the selected mode is the one you intended: system proxy, local proxy, or TUN.
- Test name resolution. Resolve the relevant Git hosting, registry, and package domains. If DNS fails before an HTTPS request begins, changing Git or npm credentials will not help.
- Configure Git. Use an HTTPS remote for the simplest first test, or explicitly plan how SSH will be routed. Run a small fetch and inspect the log.
- Configure Docker separately. Apply the proxy to Docker Desktop or the daemon, then test a pull and a build. Do not infer daemon behavior from terminal environment variables.
- Configure npm separately. Check the registry, proxy, and no-proxy values, then install a project with a lockfile and review which stage fails.
- Check direct exceptions. Keep localhost, internal services, private registries, and company domains in the appropriate bypass list when required.
- Record the working configuration. Note the client mode, route policy, registry choice, and which applications need explicit proxy settings.
Rule-based routing is usually more maintainable than sending every connection through one route. Development machines often need direct access to local virtual machines, internal dashboards, package caches, and container bridges, while public code-hosting and registry traffic may need the VPN. A global TUN rule can be useful when an application ignores proxy settings, but introduce it only after checking that it does not disrupt local containers, DNS resolution, or corporate access controls.
When a route is slow, compare a different route rather than repeatedly reinstalling tools. The route type can matter: IEPL, BGP, and CN2 are network-line descriptions, not magic guarantees, and the best choice depends on the destination, time, congestion, and the application’s connection pattern. A node suitable for interactive Git operations may not be the best choice for large container layers. Keep the client’s subscription updated, but do not update it in the middle of a controlled test.
Choose a budget that fits development work
Developer traffic is often bursty. A small project may use a monthly plan for source control and package installation, while container-heavy work can consume more traffic during repeated image rebuilds. QhVPN monthly options are ¥9.9/month with 60GB, ¥18/month with 250GB, and ¥28/month with 500GB. Traffic resets monthly from the activation date, and an upgrade difference is calculated according to the remaining days. For traffic that should remain available until it is used, the permanent packages are ¥158/300GB, ¥358/1000GB, and ¥658/3000GB.
Do not choose only by the largest allowance. First estimate whether the main workload is Git metadata, package archives, container layers, or repeated CI artifacts. Keep Docker image caching enabled where appropriate, use lockfiles to avoid unnecessary dependency changes, and avoid rebuilding a large base image when a local cache is valid. These practices reduce traffic regardless of the selected route.
QhVPN supports Windows, macOS, iOS, Android, and Linux, with unlimited simultaneous devices. That can be useful when the same account is used for a workstation, a test phone, and a separate build machine, but each device still needs its own client configuration and routing decision. Supported payment methods include Alipay, WeChat Pay, and USDT. Registration requires only a username and password, without an email address, and the service offers a 30-day no-questions-asked refund.
Security should remain separate from speed claims. Use SSH keys or carefully managed access tokens, keep registry credentials out of shell history and Docker layers, and review the client permissions requested by the operating system. A VPN encrypts the connection between the client and its service endpoint; it does not make an untrusted package safe, remove repository permissions, or replace dependency auditing. Keep TLS verification enabled and verify package integrity through the project’s normal lockfile and checksum mechanisms.
- ✅ Use a dedicated configuration for development traffic instead of changing every application blindly.
- ✅ Keep internal services and local container networks in a deliberate bypass list.
- ✅ Remove temporary proxy settings before handing the machine to another user.
- ✅ Review Git, npm, Docker, and CI logs independently.
- ❌ Do not commit tokens, proxy credentials, or personal localhost addresses.
- ❌ Do not disable TLS verification merely because a registry or repository is slow.
- ❌ Do not assume a VPN route is permitted by an employer, client, or hosting provider; check the applicable policy first.
If you want to compare supported clients and import methods, the usage guide explains the general subscription workflow. For a clean conclusion, test the exact commands that matter to your work: clone or fetch a repository, pull a representative image, install dependencies from the project registry, and run one build step. A configuration is successful when those workflows are predictable, not merely when the VPN application displays “Connected.”