Registry Forwarding Behavior
The English user guide is currently in beta preview. Most of the documents have been automatically translated from the Japanese version. Should you find any inaccuracies, please reach out to Flatt Security.
This page describes how Takumi Guard currently forwards requests to each registry and what it responds with. Use it, for example, when you configure a proxy or firewall that restricts outbound traffic.
The behavior described here is what Takumi Guard does today. Changes are announced in the release notes, except where an urgent security fix requires changing it without notice.
Traffic Flow
Takumi Guard does not relay package artifacts. Metadata goes through Takumi Guard, but for an artifact request it returns an HTTP 302 and the client connects directly to the public host to download it. See Package Blocking for the full flow.
Destinations
On a public registry host, the paths listed below sit alongside paths that receive no traffic because Takumi Guard handles them. The two cannot be told apart by host name.
Takumi Guard
Takumi Guard is served on a separate host per ecosystem, and traffic goes to the host for the ecosystem you use.
| Host | Ecosystem |
|---|---|
npm.flatt.tech | npm |
pypi.flatt.tech | PyPI |
rubygems.flatt.tech | RubyGems |
golang.flatt.tech | Go |
packagist.flatt.tech | Packagist |
Public Registries (Artifact Download)
Package artifacts are downloaded directly from the host Takumi Guard redirects to.
| Host | Paths used | Purpose |
|---|---|---|
registry.npmjs.org | GET /{package}/-/*.tgzGET /@{scope}/{package}/-/*.tgz | npm package artifact |
files.pythonhosted.org | GET /packages/** | wheel and sdist artifacts |
rubygems.org | GET /gems/*.gemGET /quick/Marshal.4.8/**GET /specs.4.8.gzGET /latest_specs.4.8.gzGET /prerelease_specs.4.8.gz | gem artifact and index |
proxy.golang.org | GET /**/@v/*.zip | Go module artifact |
For RubyGems, Bundler falls back to the legacy index (/specs.4.8.gz and /quick/Marshal.4.8/) when the Compact Index is unavailable. Takumi Guard redirects those requests too.
For Composer, the artifact host is whatever the package metadata names as its distribution source. A package hosted on GitHub redirects to api.github.com and from there to codeload.github.com. If a dependency is distributed from somewhere else, traffic goes to that host instead. dist.url in https://packagist.flatt.tech/p2/{vendor}/{package}.json shows the source for each dependency.
Traffic Other Than Artifact Redirects
The following traffic also occurs, although it is not an artifact redirect.
Go Checksum Database
Where checksum verification is enabled, the Go toolchain queries the checksum database before fetching a module. Takumi Guard does not proxy this verification, so the client connects directly to sum.golang.org (all paths).
URLs by Ecosystem
The traffic that occurs per ecosystem.
npm
Shared across npm, pnpm, yarn, and bun.
GET https://npm.flatt.tech/{package}- Purpose: Fetch metadata
- Destination:
Takumi Guard
- Status: 200 / 304
POST https://npm.flatt.tech/-/npm/v1/security/advisories/bulk- Purpose: Query advisories (npm only)
- Destination:
Takumi Guard
- Status: 200
POST https://npm.flatt.tech/-/npm/v1/security/audits,/-/npm/v1/security/audits/quick- Purpose: Query advisories (pnpm and yarn)
- Destination:
Takumi Guard
- Status: 200
GET https://npm.flatt.tech/-/npm/v1/keys,GET https://npm.flatt.tech/-/npm/v1/attestations/{path}- Purpose: Verify signing keys and provenance
- Destination:
Takumi Guard
- Status: 200
GET https://npm.flatt.tech/-/v1/search- Purpose: Search for packages (
npm search) - Destination:
Takumi Guard
- Status: 200
- Purpose: Search for packages (
GET https://npm.flatt.tech/{package}/-/{file}.tgz- Purpose: Request the artifact
- Destination:
Takumi Guard
- Status: 302 (redirects to
registry.npmjs.org)
GET https://registry.npmjs.org/{package}/-/{file}.tgz- Purpose: Download the artifact
- Destination: Public registry
- Status: 200
For scoped packages the path is /@{scope}/{package}. yarn, pnpm and bun URL-encode the slash when fetching metadata, sending /@{scope}%2f{package}. %2F is handled the same way, so a path rule needs to match either case.
On a first install with no lockfile, the artifact is requested from registry.npmjs.org directly rather than through Takumi Guard. Metadata is still fetched through Takumi Guard, and the hosts involved are the same as above.
PyPI
Shared across pip and uv.
GET https://pypi.flatt.tech/simple/{project}/- Purpose: Fetch metadata
- Destination:
Takumi Guard
- Status: 200
GET https://pypi.flatt.tech/files/packages/{hash-path}/{file}- Purpose: Request the artifact
- Destination:
Takumi Guard
- Status: 302 (redirects to
files.pythonhosted.org)
GET https://files.pythonhosted.org/packages/{hash-path}/{file}- Purpose: Download the artifact
- Destination: Public distribution host
- Status: 200
A project with the per-repository setup goes through pypi.flatt.tech just like pip and uv. Without it, metadata is not fetched through Takumi Guard and the following requests occur instead.
See poetry in the quickstart for how to configure it.
GET https://pypi.org/simple/{project}/- Purpose: Fetch metadata
- Destination: Public registry
- Status: 200
GET https://pypi.org/pypi/{project}/{version}/json- Purpose: Fetch metadata
- Destination: Public registry
- Status: 200
RubyGems
Traffic from Bundler.
GET https://rubygems.flatt.tech/versions- Purpose: Fetch the index
- Destination:
Takumi Guard
- Status: 200 / 206 / 304 (206 for an incremental fetch)
GET https://rubygems.flatt.tech/info/{gem}- Purpose: Fetch metadata
- Destination:
Takumi Guard
- Status: 200
GET https://rubygems.flatt.tech/gems/{gem}-{version}.gem- Purpose: Request the artifact
- Destination:
Takumi Guard
- Status: 302 (redirects to
rubygems.org)
GET https://rubygems.org/gems/{gem}-{version}.gem- Purpose: Download the artifact
- Destination: Public registry
- Status: 200
GET https://rubygems.flatt.tech/specs.4.8.gz,/latest_specs.4.8.gz,/prerelease_specs.4.8.gz,/quick/Marshal.4.8/{gem}-{version}.gemspec.rz- Purpose: Fetch the legacy index, when the Compact Index is unavailable
- Destination:
Takumi Guard
- Status: 302 (redirects to the same path on
rubygems.org)
GET https://rubygems.org/specs.4.8.gzand the other redirect targets above- Purpose: Download the legacy index
- Destination: Public registry
- Status: 200
Go
Traffic from the Go toolchain.
GET https://golang.flatt.tech/sumdb/sum.golang.org/supported- Purpose: Check whether the checksum database can be queried through the proxy
- Destination:
Takumi Guard
- Status: 404 (expected response; the client connects to
sum.golang.orgdirectly)
GET https://golang.flatt.tech/{module}/@v/list- Purpose: List versions
- Destination:
Takumi Guard
- Status: passes the upstream status through
GET https://golang.flatt.tech/{module}/@latest- Purpose: Resolve the latest version (
go get module@latestand similar) - Destination:
Takumi Guard
- Status: passes the upstream status through
- Purpose: Resolve the latest version (
GET https://golang.flatt.tech/{module}/@v/{version}.info- Purpose: Fetch metadata
- Destination:
Takumi Guard
- Status: passes the upstream status through
GET https://golang.flatt.tech/{module}/@v/{version}.mod- Purpose: Fetch metadata
- Destination:
Takumi Guard
- Status: passes the upstream status through
GET https://golang.flatt.tech/{module}/@v/{version}.zip- Purpose: Request the artifact
- Destination:
Takumi Guard
- Status: 302 (redirects to
proxy.golang.org)
GET https://proxy.golang.org/{module}/@v/{version}.zip- Purpose: Download the artifact
- Destination: Public proxy
- Status: 200
GET https://sum.golang.org/lookup/{module}@{version}- Purpose: Verify checksums
- Destination: Checksum database
- Status: 200
GET https://sum.golang.org/tile/{tile-path}- Purpose: Verify checksums
- Destination: Checksum database
- Status: 200
Packagist
Traffic from Composer.
GET https://packagist.flatt.tech/packages.json- Purpose: Fetch the repository definition
- Destination:
Takumi Guard
- Status: 200 / 304
GET https://packagist.flatt.tech/p2/{vendor}/{package}.json,/p2/{vendor}/{package}~dev.json- Purpose: Fetch metadata (Composer 2 fetches both)
- Destination:
Takumi Guard
- Status: 200 / 304
POST https://packagist.flatt.tech/api/filter- Purpose: Query the packages to install (
composer installandcomposer audit) - Destination:
Takumi Guard
- Status: 200
- Purpose: Query the packages to install (
GET https://packagist.flatt.tech/dist/{vendor}/{package}/{version}/{reference}.{type}- Purpose: Request the artifact
- Destination:
Takumi Guard
- Status: 302 (redirects to the distribution source named in the metadata;
api.github.comfor a package hosted on GitHub)
GET https://api.github.com/repos/{owner}/{repo}/zipball/{reference}- Purpose: Request the artifact
- Destination: GitHub
- Status: 302 (redirects to
codeload.github.com)
GET https://codeload.github.com/{owner}/{repo}/legacy.zip/{reference}- Purpose: Download the artifact
- Destination: GitHub
- Status: 200
POST https://packagist.org/downloads/- Purpose: Report install statistics (does not affect whether an install succeeds)
- Destination: Public site
- Status: 201
This page reflects the following versions, as of September 2026.
- npm v10.8 / v11.19 / v12.0, pnpm v10.33 / v11.25, yarn v1.22 / v4.12 / v4.18, bun v1.4
- pip v22.0 / v26.2, uv v0.12, Poetry v2.4
- Bundler v2.5 / v4.0
- Go v1.23 / v1.27
- Composer v2.10
Reference
Configuring a Proxy or Firewall
The forwarding uses the following destinations besides Takumi Guard. Each is used to download a package artifact or to verify checksums, and installs do not complete if they cannot be reached.
| Host | Paths |
|---|---|
registry.npmjs.org | /{package}/-/*.tgz/@{scope}/{package}/-/*.tgz |
files.pythonhosted.org | /packages/** |
rubygems.org | /gems/*.gem/quick/Marshal.4.8/**/specs.4.8.gz/latest_specs.4.8.gz/prerelease_specs.4.8.gz |
proxy.golang.org | /**/@v/*.zip |
sum.golang.org | All paths |
Using Composer
With Composer, the distribution source differs per dependency. You therefore need to check dist.url in https://packagist.flatt.tech/p2/{vendor}/{package}.json and work out the destinations for each dependency.
For a package published on GitHub, for example, the destinations are as follows.
| Host | Paths |
|---|---|
api.github.com | /repos/*/*/zipball/* |
codeload.github.com | /*/*/legacy.zip/* |
If a dependency is distributed from somewhere other than GitHub, traffic goes to that source as well.
Private Packages (npm, PyPI, RubyGems, Packagist)
Where a separate registry is configured, the client connects to that registry directly. How it is configured differs per ecosystem.
- Private packages on npm (a registry per scope)
- Private packages on PyPI (an extra index URL)
- Private gems on RubyGems (a
sourceblock in theGemfile) - Private packages on Packagist (a repository declaration)
Private Modules (Go)
A module matching GOPRIVATE is fetched with git from the host in its module path, going through neither Takumi Guard nor the checksum database. See Using with Private Modules.
Hosts That Receive No Traffic
With Takumi Guard configured, no traffic reaches the following hosts.
| Host | Reason |
|---|---|
repo.packagist.org | Takumi Guard fetches the metadata on its own side |
pypi.org | pip, uv, and a Poetry project with the per-repository setup do not contact it |
index.rubygems.org | Bundler does not contact it |
packagist.org receives only the install statistics report. An install completes even when that request does not get through.
If blocking any of this traffic causes a problem, we will help investigate as far as we can, but it may fall outside the scope of support.