Run Upwarden inside your perimeter.
Self-hosted Upwarden is launching soon — run the firewall on your own infrastructure, with nothing about your dependencies ever leaving your network and zero telemetry. The same scanner and silent rollback as the managed service: one container, three datastores, one config line per ecosystem. Join the early-access list and we'll invite you the moment self-host is generally available.
Coming soon. Self-hosted Upwarden is launching soon — free to run on your own infrastructure, with nothing leaving your network. The steps below are a preview of how self-hosting will work once it's generally available. Join the early-access list and we'll invite you the moment it opens — or, if you'd rather not operate a server, Upwarden Cloud is the managed version we'll host for you.
1 · What you need
Three datastores and one outbound dependency — all stable, mature components you may already run:
- PostgreSQL 17+ with pgvector — audit log, policy, scanner verdicts and the embedding index. pgvector is required (the scanner does similarity search over package-content embeddings).
- Redis 7+ — rate limiting, manifest cache, idempotency and fast-pass coordination. Cluster mode supported.
- Object storage — tarball staging for the scanner. GCS by default; S3/MinIO-compatible for portability.
- An embedding endpoint — any OpenAI-compatible API for the similarity scanner's vectors.
A Stytch account is optional — only the hosted dashboard auth needs it; operators running with the admin-token bearer can skip it.
2 · Run the container
Upwarden ships as a single image. The simplest path is docker compose — the compose file boots the engine plus a local Postgres and Redis for evaluation (swap in your managed datastores for production). Migrations run automatically on boot.
$ git clone https://github.com/upwarden-io/upwarden.git $ cd upwarden $ cp .env.example .env # set DATABASE_URL, REDIS_URL, GCS_BUCKET, EMBEDDING_ENDPOINT, … $ docker compose up -d
For Kubernetes, the manifests in k8s/ are the reference — the same ones we run in production for Upwarden Cloud. Set SCANNER_ENABLED=true and the datastore URLs; every variable is in the environment reference.
3 · Create your first key
Each install authenticates with a vk_… project key. As admin, create a tenant, a project, and a key from the dashboard or the JSON admin API. Full walkthrough: Create your first key.
4 · Point your package manager
Exactly like the managed service — one registry line per ecosystem (npm, bun, yarn, pnpm, pip, uv, cargo, Go, Maven, NuGet, RubyGems), pointed at your instance hostname instead of ours. The Quickstart covers each ecosystem in two lines.
5 · Verify it works
Confirm the engine is up, then prove the block path:
$ curl -fsS https://npm.pkg.your-domain.com/healthz {"ok":true}
Then install a known-blocked version and watch it roll back. The full three-step proof is in Verify it's working.
What stays yours
- Nothing leaves your perimeter. No package names, machine identifiers or org names egress — zero telemetry, by design, not a setting.
- You hold the audit log. Every manifest served, block, quarantine and rewrite is recorded in your database, tied to client identity.
- Explainable verdicts. Every decision carries a reason your team can audit and defend.
- Going further: SIEM export and audit streaming (gzipped JSONL) are available today at Org+; fully air-gapped operation is on the enterprise roadmap.
Self-hosted when you want sovereignty. Managed when you want speed.
Run it free inside your own perimeter, or let us host it — and talk to us if you're rolling out across an org.