Every package your code pulls, checked at the door.
A free, self hosted proxy between your builds and the public registries. Malicious, typosquatted and vulnerable packages are stopped before they reach a laptop or a pipeline, and you always know who pulled what.
Replay of a real run of setup.sh on a clean Ubuntu 24.04 server. Long waits are shortened and marked, and the password and key are masked.
Developers
Laptops and IDEs, with the package managers they already use
- npm
- pnpm
- Yarn
- Bun
- uv
- Poetry
- .NET
- Gradle
- Composer
- SwiftPM
CI/CD pipelines
Every build installs through the same checks
- GitHub Actions
- GitLab CI
- Jenkins
Build servers and clusters
Image pulls, and dnf and apt on the hosts
- Docker
- Podman
- Kubernetes
- Red Hat
- Debian
- Ubuntu
- Allowed: fetched once, cached, served
- Malware and known malicious
- Typosquats and lookalikes
- Dependency confusion
- Releases too new to trust
- Vulnerable or wrong license
Records who pulled what
Public registries
- npm registry
- PyPI
- Docker Hub, GHCR, Quay
- nuget.org
- Maven Central
- RubyGems.org
- Packagist
Linux repositories
- Red Hat, AlmaLinux, Rocky
- Debian
- Ubuntu
What it does
One address for every package and image, checked before it is served
npm, pip, docker, dotnet, Maven, Bundler, Composer, CocoaPods, SwiftPM, dnf and apt ask ForgeRepo™ instead of the internet. It checks the request against your rules, fetches it if it is allowed, keeps a copy, and hands it back. Anything refused says why, and opens a request an approver can say yes to in one click.
Hijacked releases
A maintainer account is stolen, a poisoned version goes up, and every build that floats to it installs it within hours. Cooling off and the kill switch stop it.
Typosquats
reqeusts, lodahs, python-numpy. One typo and
the package that installs is not the one anybody meant. Lookalike names are caught.
Dependency confusion
Somebody publishes your internal name on the public registry at a higher version. Reserved names are never fetched from outside.
Pick your path
Start where your job starts
Developers
One line of config, and installs work exactly as they did, lockfiles included.
Security teams
Block before download, kill a bad release for everyone, and see who pulled it.
Platform and DevOps
One container, about two minutes, and every pipeline pulls through it.
Evaluating
What it does well, what it will not do, and the source to check both.
The short list
What you get on day one
There are 35 feature pages. These are the ones people install it for.
Malware scanning
ClamAV, a hash blocklist, your own scanner and the OpenSSF known malicious feed, on every cached file. Optionally before the first download.
Read moreKill switch
Take a package, a version range, one file hash or a whole advisory away from everyone, at once.
Read moreDependency confusion protection
Reserve your npm scopes, PyPI prefixes, image namespaces and NuGet ids. A public package with your internal name is never fetched.
Read moreCooling off new releases
Brand new versions wait a few days before your builds see them, which is when hijacks get caught.
Read moreWho has it
Search a package, a hash or a CVE and see the applications, environments and pipelines that pulled it.
Read moreRequests and auto approve
A blocked install opens a request. Clean ones can approve themselves, risky ones wait for a person.
Read moreAn honest comparison
We score ourselves third out of four
33 capabilities against JFrog, Sonatype and Cloudsmith, each scored on the best thing they sell. Sixteen rows go against us, and every one says why. We come first in two sections: When something goes wrong and Developers and approvals.
#1
137
JFrog
self hosted from $27,000 a year
#2
134
Sonatype
Firewall priced on request
#3
127
ForgeRepo™
this project, and it is free
#4
100
Cloudsmith
SaaS only, policies on Ultra
Latest attacks
This keeps happening
The newest entries in our timeline of real supply chain incidents, each with what would have stopped it.
keyv and cacheable worm
After a maintainer GitHub account was compromised, keyv 6.0.0 carried a worm from the Shai-Hulud family that spread to more than 400 npm packages. It stole cloud credentials, developer secrets, AI tool configuration and cryptocurrency wallets.
What would have stopped itMastra packages
A maintainer account was taken over and poisoned versions of more than 140 mastra and @mastra packages added easy-day-js, a lookalike of dayjs, whose postinstall script downloaded and ran a second stage. Microsoft attributed it to Sapphire Sleet, a North Korean group.
What would have stopped itaxios hijack
After the maintainer account was compromised, axios 1.14.1 and 0.30.4 were published with a new dependency, plain-crypto-js, whose postinstall script dropped a remote access trojan for macOS, Windows and Linux and then cleaned up after itself.
What would have stopped itTwo minutes from a bare server
Copy one script, run it, and it installs Docker if it is missing, builds the image, starts the registry and prints how to sign in. Safe to run twice. Free, MIT licensed, nothing to sign up for.