The local sandbox has a list of domains that is added to your own in one of the network modes. Understanding how it works matters more than remembering its contents: it exists so that ordinary development does not require listing dozens of addresses by hand - package registries, distribution mirrors, artifact storage and source code hosts. Without such a set, the very first dependency install would turn into a separate network configuration task.
The modes differ fundamentally. In one, a default set is added to your list; in another only your list applies; in the third domain restrictions do not apply at all. The choice between them is a choice between convenience and precision: the default set saves configuration and covers a typical build, your own list gives control and explainability, and turning restrictions off removes the question together with the protection itself.
It helps to look at the composition by category rather than alphabetically once. Below is that map: package registries of the main ecosystems, operating system mirrors, source code hosts, cloud storage and auxiliary services of tools. The categories show what counts as an ordinary build need and help you see what your project is missing: if your ecosystem is not on the list, its addresses will have to be described by you.
| Category | Examples | Why it is on the list |
|---|---|---|
| Package registries | registry.npmjs.org, crates.io, pypi.org, cpan.org, cocoapods.org | Installing dependencies without listing them by hand |
| Distribution mirrors | archive.ubuntu.com, debian.org, alpinelinux.org, centos.org, archlinux.org | System packages in containers and on build machines |
| Source code hosts | codeload.github.com, bitbucket.org, the pattern *.githubusercontent.com | Fetching sources and attachments |
| Cloud storage | the patterns *.cloudflarestorage.com, *.public.blob.vercel-storage.com | Artifacts and binary dependencies |
| Tools and runtimes | the patterns *.docker.com and *.docker.io, awscli.amazonaws.com, binaries.prisma.sh | Downloading build tools and their components |
| Service endpoints |
| the patterns *.googleapis.com, *.gvt1.com, apt.llvm.org |
| Auxiliary downloads and tool updates |
An entry comes in three kinds: an exact domain, a subdomain pattern and an address range in CIDR notation. The difference is the same as in any network policy: a pattern covers the whole subtree of names, including hosts you have never heard of and ones that may appear tomorrow, while an exact domain covers only itself. When composing your own list it is worth preferring exact entries and adding a pattern only where subdomains are actually used - for example with artifact storage that has dynamic host names.
The sign of a network restriction in real work rarely looks like a network error. More often a package manager fails during dependency resolution, an image download hangs or a tool's cache silently stays empty, and the output shows only the top-level failure. So the first step is to find the specific host that could not be reached, and only then to decide. That host is the missing entry; everything else in the output is usually a consequence.
The main limitation to remember: an address list governs where it is possible to reach but not what comes back. An allowed registry can serve a package containing anything, and an allowed source host a repository with hostile content. A network policy reduces the surface but does not check meaning, and it works as one layer among several rather than as a replacement for the rest.
The gap is closed by other mechanisms, and it is worth naming them alongside. A version lockfile and checksums answer for the content being exactly what was expected rather than a substitution under the same name. An internal registry mirror narrows the source to a single address you control and, as a bonus, makes the build reproducible when the outside world is unavailable. In sensitive environments a short list plus a mirror of your own is almost always better than a long list of someone else's addresses.
There is also a practical technique: start from the default set, observe actual refusals and add what is missing precisely. That way you get a list that reflects your real build rather than someone's idea of it. And, more importantly, every added entry is explainable: it appeared in response to a specific need rather than just in case, and it can be removed when the need is gone.
The engineering conclusion is simple: the default list is a convenient base for development rather than a security policy. For sensitive environments a list of your own is assembled; for ordinary work the base is used and extended. In both cases remember that an open domain is permission to reach rather than a guarantee about the content.
The typical failures are predictable. Treating the default list as a security policy. Turning on the mode without domain restrictions to avoid dealing with it. Writing patterns where exact entries would do. Reading the topmost build error instead of finding the host that was refused. And adding addresses in advance instead of reacting to a specific refusal.