Pull-Through Proxy
Use Stout as a caching proxy for upstream registries — fetched on first request, served from cache after.
How It Works
When you request a package through the proxy, Stout follows this flow:
1. Request
Package manager hits Stout
2. Cache check
Is it cached and fresh?
3. Fetch upstream
If not cached, fetch from origin
4. Store
Cache metadata + artifact in S3
5. Serve
Return to client, serve from cache next time
Cache misses still become warm installs
Organization-scoped pull-through
Use the global proxy path for shared caching, or put an organization slug after /o/ to route installs through that organization's trust gate. Organization-scoped installs are advisory by default, then enforce high and critical CVEs once enabled; malware heuristics gate supported source ecosystems, while Docker malware findings are surfaced as advisory.
registry=https://your-stout-host/npm/Pattern
https://your-stout-host/o/<org-slug>/npm/
https://your-stout-host/o/<org-slug>/python/simple/
https://your-stout-host/o/<org-slug>/go
https://your-stout-host/o/<org-slug>/<ecosystem>/The same shape works across supported ecosystems. For namespace-aware registries, keep the ecosystem's normal subpath after the organization prefix, such as /o/acme/nuget/v3/index.json or /o/acme/docker/library/nginx.
Metadata TTL
Metadata is cached with a configurable TTL (default 5 minutes). Stale data is served if the upstream is unreachable.
Artifact Caching
Artifacts (tarballs, wheels, JARs) are stored in S3 on first fetch and served directly on subsequent requests.
Safe Defaults
512 MB max artifact size, 30s upstream timeout, path traversal protection, and namespace isolation from user-published packages.
Proxy defaults are intentionally bounded
Configure Package Managers
Proxy caching does not run package scripts
Default Upstream
https://crates.io
Usage
[source.crates-io]
replace-with = "stout"
[source.stout]
registry = "sparse+https://your-stout-host/rust/_proxy/"Replaces the crates.io source with the Stout proxy — no credential needed for the mirror. All transitive dependencies are also fetched through the proxy. A first-party crate index (/rust/~you/) is authenticated: see its package page for the token setup.
Install Through Stout
Mirror configuration can require a service restart
Default Upstream
https://repo1.maven.org/maven2
Usage
<repositories>
<repository>
<id>stout</id>
<url>https://your-stout-host/maven/</url>
</repository>
</repositories>Can be configured as a Maven Central mirror in settings.xml to proxy all dependency resolution. Supports both release and snapshot repositories.
Default Upstream
https://registry-1.docker.io
Usage
Implements the OCI Distribution Spec. Library images use the library/ prefix. Restart Docker daemon after changing daemon.json.
Cache & Refresh
Warm common packages before first use
Admin Configuration
Administrators can configure the proxy via the admin panel or API.
Enable / Disable
Toggle the proxy on or off from Admin → Proxy. When disabled, all requests go directly to the local registry only.
Custom Upstreams
Override the default upstream URL for any ecosystem. Useful for pointing at internal mirrors or Artifactory instances.
PUT /api/v1/admin/proxy/config
{
"enabled": true,
"metadata_ttl": "10m",
"upstreams": {
"npm": "https://my-internal-registry.corp/npm/",
"go": "https://goproxy.corp"
}
}Cache Warmup
Pre-populate the cache with popular packages so first requests are instant. Stout ships with 130+ seed packages across all ecosystems.
POST /api/v1/admin/proxy/warm
{
"concurrency": 5,
"artifacts": true
}Runs in the background. Check status at GET /api/v1/admin/proxy/warm/status.
Seed Packages
Manage which packages are pre-warmed. Add custom packages or use the discover endpoint to auto-populate from upstream popularity rankings.
# Add custom seed packages
POST /api/v1/admin/proxy/seed-packages
{
"packages": [
{ "package_type": "npm", "name": "my-internal-lib" }
]
}
# Auto-discover popular packages from upstreams
POST /api/v1/admin/proxy/discover
{ "top": 50, "warm": true }