Slow development downloads are not always a GitHub or Docker problem. The delay may come from a route that is poor for one destination, a proxy configured in the wrong layer, a registry that is responding slowly, or a timeout in your tool. The practical fix is to identify which request is slow and make sure the relevant program—not just your browser—uses the intended connection.
This guide covers GitHub cloning and releases, Docker Hub pulls, npm packages, and pip installs. It also explains where settings belong in terminals, IDEs, containers, and CI, and how to troubleshoot without exposing credentials. Treat a VPN or proxy as a route option, not a guarantee of a particular download speed: results depend on the destination, the active route, local network conditions, and the service itself.
Map the request before changing settings
Start by naming the exact operation that is slow. A browser downloading a release, Git fetching a repository, Docker pulling an image, and pip installing a package can use different programs and configuration sources. A successful browser test therefore does not prove that a terminal command or an IDE is using the same route.
Write down the command or action, the destination, the time at which it fails, and whether the problem affects other destinations. For example, a Git clone that stalls while fetching objects points to a different layer than a Docker pull that cannot resolve a registry hostname. If only one tool is affected, investigate that tool’s proxy and timeout settings before changing the operating system’s network configuration.
4
Developer tools covered
5
Configuration layers to check
1
Change at a time
The configuration layers are the network client or system route, shell environment, application-specific settings, container or daemon settings, and CI runner settings. A setting in one layer does not automatically apply to the others. A desktop proxy client may provide system-wide routing, but a command-line program can still use its own proxy variables, a remote Docker daemon may need separate configuration, and a CI job runs in its own environment.
Before editing anything, check which route mode is active in your client. Rule-based routing can send different destinations along different paths; global routing can send more traffic through the proxy. If a service is slow under one mode, compare it with another mode only when permitted by your network and service policies. Avoid running multiple proxy clients at once: they can compete for system proxy settings, virtual interfaces, or DNS handling.
Test the exact action that fails. A page loading in a browser is not a reliable substitute for checking a Git fetch, registry pull, package install, or CI build.
Speed up GitHub with Git-aware settings
Git access and GitHub website access are separate paths. A repository can be cloned over HTTPS or SSH, while release assets and web pages are fetched through a browser or another download tool. If the website opens but git clone stalls, check the Git process, its remote URL, and the environment inherited by the terminal.
First inspect the remote URL for an existing checkout with git remote -v. An HTTPS remote typically uses the HTTPS proxy configuration understood by Git or the process environment. An SSH remote uses SSH transport, so an HTTP proxy setting alone may not affect it. If you change transport, use the URL format supported by your organization and make sure your authentication method still works. Do not paste access tokens into a remote URL that may be saved in shell history, IDE logs, or repository configuration.
Git can use proxy settings at different scopes. A command such as git config --global affects the current user’s Git configuration, while a per-repository setting affects only that checkout. A temporary environment variable is useful for a short test and disappears when the shell session ends. Prefer the narrowest scope that solves the problem, and inspect existing settings before adding new ones with git config --show-origin --get-regexp 'http.*proxy'. If the result contains an old proxy address or credentials, remove or replace it rather than layering another setting on top.
For a simple test, set proxy environment variables in the terminal that launches Git, then retry the same clone or fetch. Many command-line tools recognize HTTPS_PROXY and HTTP_PROXY; some also check lowercase variants. Support varies by program and version, so verify the tool’s own documentation and test whether the process inherited the variable. A terminal opened before changing system proxy settings may retain its old environment until restarted.
Large repositories may appear slow because Git is transferring substantial history, submodules, or large files. Check whether the repository uses Git LFS or submodules and whether the operation is waiting on those separate downloads. A shallow clone with --depth can reduce the initial history transfer when the project workflow allows it, but it changes what history is available locally. It is not a general fix for a broken route, and it may not suit release, bisect, or history-dependent workflows.
If an IDE clone works differently from a terminal clone, compare the IDE’s configured Git executable, proxy option, and environment. Some IDEs use the system Git; others may launch it with a separate environment or provide their own network settings. Restart the IDE after changing proxy configuration, then test a fetch from the IDE’s own terminal and its Git integration separately.
Configure Docker and package managers at the right layer
Docker CLI and daemon are not the same thing
The Docker command-line client sends requests to a Docker daemon, and the daemon performs image pulls. Configuring a proxy only in the shell that runs docker pull may not change the daemon’s outbound connection. This distinction matters especially when Docker uses a remote context, a desktop-managed virtual machine, or a service running separately from the current terminal.
Check which context is active with docker context show, then confirm whether the daemon is local or remote. Configure outbound proxy access using the method supported by that daemon or Docker environment, and restart the relevant service if its documentation requires it. Docker Desktop, a Linux service, and a remote host can have different configuration screens and files. Do not copy a configuration example from another operating system without checking the target daemon’s instructions.
Registry mirror settings are not a universal proxy shortcut. A mirror must be one you trust and are authorized to use, and it must support the images and authentication requirements of your workflow. A mirror can have different availability, freshness, or access policies than the original registry. If a pull fails, inspect the image name, tag, registry hostname, authentication state, and daemon logs before changing mirror configuration.
Keep npm and pip settings scoped
npm and pip each have their own configuration mechanisms in addition to environment variables. For npm, inspect the effective registry and proxy settings with the npm configuration tools before changing a user-level or project-level configuration. A project configuration may be committed and shared with teammates, so do not put personal credentials in a file that will enter version control. If a project uses scoped packages, verify that the relevant package scope points to the registry intended by the project rather than changing every package source unnecessarily.
For pip, inspect the index configuration and any environment variables or configuration files that may override it. An alternate package index should be used only when it is approved for the project and provides the packages and trust guarantees the team expects. Avoid treating --trusted-host as a general speed setting: it changes certificate verification behavior for the specified host and can weaken protection. Do not disable TLS verification to work around a timeout or certificate error; diagnose the certificate chain, system clock, corporate inspection proxy, or configured index instead.
Timeouts should match the network and operation, not conceal a persistent routing failure. If a transfer is progressing but occasionally needs more time, a documented timeout adjustment may help. If it repeatedly stops at the same point, fails name resolution, or cannot establish a connection, increasing the timeout may only delay a useful error. Compare the same package or image from the same machine and route, and distinguish connection setup failures from slow data transfer.
Hands-on checklist: test one layer at a time
Use this sequence when a developer download is unreliable. Keep a note of the original setting so you can restore it, and change one thing per test. That makes it easier to identify the setting that actually matters instead of leaving behind several overlapping proxy rules.
- Reproduce the failure. Record the exact command, destination, and error text. Avoid running unrelated downloads in parallel while comparing results.
- Check the active route. Confirm that the intended VPN or proxy client is connected and that the selected mode routes the destination as expected. If the client offers rules, check whether the destination matches a direct or proxy rule.
- Inspect the process environment. In the same terminal used for the failing command, check whether proxy variables are present. Confirm that the values point to a reachable local proxy or approved network endpoint; do not share output containing credentials.
- Inspect the application setting. Check Git configuration, npm registry and proxy settings, pip indexes, or Docker context and daemon configuration as appropriate. Look for stale entries that override the environment.
- Run one controlled retry. Repeat the original operation after changing a single setting. If it still fails, restore that setting before testing a different layer.
For example, if Git fetch is slow but npm installs normally, do not immediately change the system-wide route. Inspect Git’s remote, proxy configuration, and authentication path first. If Docker pulls are slow but terminal downloads are normal, verify the active Docker context and daemon configuration. If both package managers fail to resolve the same host, investigate DNS or the common network route rather than editing each package manager independently.
Keep a clean baseline. Close and reopen the terminal or IDE after changing environment variables, and restart a daemon only when the relevant documentation says the change requires it. Then run a small representative operation before starting a large clone or image pull. If a change makes other destinations worse, revert it and document the result so it is not mistaken for a lasting fix.
- ✅ Verify the exact client, destination, and active route before editing settings.
- ✅ Prefer a per-tool or per-project setting when it meets the need.
- ✅ Keep a record of the previous configuration and test one change at a time.
- ❌ Do not run multiple proxy clients that compete for system routing.
- ❌ Do not disable certificate checks to make a package download proceed.
When comparing connection modes, use the same command and destination each time. A different repository, image tag, or package index can change the amount of data transferred and the authentication path, making the comparison misleading. If the destination is controlled by an employer or school, follow its network and software supply-chain policies rather than redirecting traffic to an unapproved mirror.
Containers, IDEs, and CI need separate network plans
A container build introduces more than one possible network context. The host may download a base image, while a build step downloads packages from inside the build environment. A proxy available to the host does not necessarily exist inside a container, and a build-time environment variable does not automatically configure the Docker daemon. Identify whether the delay occurs during image pull, dependency installation, or a later application step before choosing a fix.
When a build needs proxy variables, pass only the configuration required for that stage and use the build system’s documented mechanism. Avoid baking proxy credentials into image layers, Dockerfiles, build arguments that may be recorded, or committed configuration. Prefer a secret-management mechanism supported by the build platform, limit access to the job that needs it, and ensure logs do not print secret values. Remove temporary configuration from the final image when it is no longer required.
IDE network settings can differ from those of the integrated terminal. A browser panel, extension marketplace, Git integration, and terminal may all use distinct networking paths. Test the affected feature directly, check whether the IDE uses the system proxy or an application-specific one, and restart it after changes. If an extension or remote development environment runs on another host, configure and troubleshoot that host separately from the local desktop.
CI runners also have their own network environment. A workflow can run on a hosted runner, a self-hosted machine, or inside a job container; each has different access to environment variables, secrets, DNS, and egress rules. Store credentials in the CI platform’s secret store, restrict them to the necessary workflow or environment, and avoid printing configuration during debugging. Pin dependencies and container image versions according to project policy so a network retry does not silently change what the build consumes.
For recurring failures, capture sanitized logs that include the tool version, operation, destination hostname, and failure category. Remove tokens, authorization headers, private repository names, and internal addresses before sharing. A clear report helps distinguish DNS resolution, TLS negotiation, authentication, registry throttling, and transfer stalls—problems that can look similar when the only symptom is a long wait.
Protect credentials and choose a maintainable setup
Proxy credentials, Git tokens, registry passwords, and package-index credentials are secrets. Avoid placing them in shell history, source files, shared screenshots, image layers, or URLs saved in project metadata. Use an operating-system credential store, the tool’s supported credential helper, or a CI secret store where appropriate. If a secret has been exposed, revoke or rotate it through the service that issued it; removing the visible text from a file does not make an exposed token safe again.
Choose the smallest configuration scope that covers the workflow. A developer who needs a proxy only for one command can use a temporary environment setting. A team that shares package sources may document a project-level registry configuration without including personal credentials. A daemon or CI runner may need administrator-managed network settings because it performs requests independently of the interactive shell. Document who owns each setting and how it can be reset.
Keep security checks intact while troubleshooting. HTTPS certificate validation helps confirm that a connection reaches the expected service, and package signatures or lockfiles help preserve dependency integrity. A certificate warning is a diagnostic signal, not an invitation to turn verification off. If traffic inspection or a private certificate authority is required by an organization, install and configure the approved certificate chain using its documented process.
Finally, reassess the route when the network environment changes. A configuration that works on a home connection may conflict with a corporate VPN, captive portal, local development service, or remote container context. If local hosts become unreachable, DNS behaves unexpectedly, or only some tools lose connectivity, return to the active route rules and proxy ownership rather than adding another unreviewed setting.