// the find
outsideris/citizen
A Private Terraform Module/Provider Registry
Citizen is a self-hosted implementation of Terraform's module and provider registry protocols, letting teams publish private modules and providers without routing through the public registry or Terraform Cloud. It's aimed at platform/infra teams who already run their own CI and just need an internal artifact server Terraform CLI can talk to natively.
It covers both registry protocols, not just modules — provider publishing handles SHA256SUMS generation and GPG signing automatically, which is the part most DIY registries skip. Storage and DB backends are both pluggable (file/S3/GCS, sqlite/MySQL/MongoDB via Prisma), so it fits into whatever infra you already have instead of forcing a specific stack. It ships as prebuilt binaries for linux/darwin (amd64+arm64)/windows plus a Docker image and Helm chart, so getting it running isn't a build-it-yourself exercise. The test suite includes actual integration tests that drive the real Terraform CLI against a tunneled instance, which is a meaningfully stronger signal than unit tests alone that the protocol implementation actually works.
There's no auth or access control described anywhere — for something billed as a 'private' registry shared across teams, that's a real gap you'd have to solve yourself (network-level restriction, a proxy, something). It requires HTTPS fronted by your own reverse proxy and depends on external `shasum`/`gpg` binaries on the publishing machine, so there's setup surface beyond just running the binary. MongoDB only works as a replica set, and migrations are backend-specific through Prisma, so switching databases later isn't a clean swap. Last push was October 2024 with modest star count, so if Terraform's provider registry protocol shifts, it's unclear how quickly (or whether) this gets updated to match.