---
site: protos.rip
page: compare/workflows
---
__ ______
_ ______ _____/ /__/ __/ /___ _ _______
| | /| / / __ \/ ___/ //_/ /_/ / __ \ | /| / / ___/
| |/ |/ / /_/ / / / ,< / __/ / /_/ / |/ |/ (__ )
|__/|__/\____/_/ /_/|_/_/ /_/\____/|__/|__/____/
# protobuf schema workflows: ad-hoc, bsr, and open source
when Protocol Buffers definitions outgrow a single repository, sharing and versioning
`.proto` files across multiple services becomes a bottleneck. teams using the `buf` CLI for local linting and code generation face a difficult choice: rely on ad-hoc manual file sharing, take on the operational burden of self-hosting custom infrastructure, or commit to Buf’s per-type registry pricing.understanding how these trade-offs unfold in practice helps clarify which workflow fits your architecture.
## 1. the starting point: buf cli + ad-hoc file management
managing Protobuf schemas through ad-hoc file management is the natural starting point for many teams. whether copying
`.proto` files between repositories by hand, maintaining custom sync scripts in CI, vendoring directories, or mounting shared repositories via submodules or subtrees, this approach costs $0 and avoids adding third-party SaaS to the stack.this setup works reliably across two or three repositories. as the service graph expands, however, treating schema distribution as raw file copying reaches its limits:
- >environment and onboarding friction: distributing raw files across repositories requires strict synchronization hygiene. whether relying on copy scripts, vendored folders, or shared repository mounts, developers frequently commit stale definitions, break fresh checkouts, and spend hours debugging path mismatches, access permissions, or custom sync scripts in Docker builds and CI runners.
- >unversioned upstream dependencies:
without a registry, importing third-party standards (
`google/api/annotations.proto`,`buf/validate/validate.proto`) means manually copying foreign`.proto`trees into your repository, losing cryptographic checksums and automated update paths. - >diamond dependencies without a resolver:
when multiple services depend on different versions of a shared common schema, raw file copies
provide no module graph or lockfile (
`buf.lock`) to resolve transitive collisions. - >asynchronous codegen drift: copying schemas out-of-band means client code generation happens asynchronously, opening windows where downstream services run against stale or incompatible definitions.
## 2. the official upgrade: buf schema registry (buf.build)
when ad-hoc file copying hits its operational ceiling, the natural next step is
`buf.build`, the official Buf Schema Registry.upgrading from local ad-hoc workflows to BSR turns Protobuf into a managed central package management system:
- >central private module publishing:
running
`buf push`publishes versioned schemas to a managed registry, letting downstream services depend on schemas by module name instead of manually tracking raw files. - >remote code generation:
`buf generate`executes plugins remotely in the cloud, removing the need for developers or CI containers to install local`protoc`compiler toolchains. - >enterprise governance: for organizations
with complex compliance needs,
`buf.build`adds hosted language package registries ([Generated SDKs](https://buf.build/docs/bsr/generated-sdks/)), custom plugin container hosting, [server-enforced review gates](https://buf.build/docs/bsr/checks/), per-repository RBAC, and SAML SSO.
for large enterprises, this governance model solves cross-organization distribution. for typical engineering teams, however, the pricing model introduces friction: Buf charges $0.50 per private type per month on Teams (counting every
`message`, `enum`, and `rpc`), scaling to $5.00/type/month with a $3,000/month floor on Pro. as schemas grow, bills scale with API design decisions rather than infrastructure consumption.## 3. the cost-avoidance detour: self-hosted protobuf registry alternatives (buffrs, pbuf.io)
bouncing off per-type pricing or SaaS constraints, some teams look toward open-source dependency managers or community server implementations. while technically interesting, none of these tools are drop-in replacements for the
`buf` CLI. choosing an open-source solution means adopting a bespoke toolchain and operating the underlying registry infrastructure yourself.### buffrs
[buffrs](https://github.com/helsing-ai/buffrs) is a standalone package manager built to publish and resolve Protobuf schemas independently of the
`buf` toolchain.while buffrs offers a fleshed-out toolchain, it abandons the
`buf` CLI for specialized architectural opinions specific to its authors that rarely benefit typical engineering teams:- >bespoke toolchain and manifests: instead
of standard
`buf.yaml`and`buf.lock`files, every developer and CI runner must install a separate CLI binary and maintain custom manifests (`Proto.toml`). - >
loss of remote plugins and public modules:you forfeit access to remote plugins (
`protocolbuffers/go`,`connectrpc/es`) and upstream dependencies (`googleapis`,`protovalidate`). - >backend infrastructure requirements: buffrs is not a standalone registry server. hosting private packages requires your team to provision, configure, and license an enterprise JFrog Artifactory instance.
### pbuf.io
[pbuf.io](https://pbuf.io) is an open-source attempt to build an independent Protobuf registry and CLI ecosystem outside of Buf.
while ambitious, adopting pbuf.io illustrates the operational trade-offs of self-hosted registries:
- >incompatible wire protocol: pbuf.io does
not implement the BSR wire protocol. it requires teams to abandon standard
`buf`CLI commands in favour of custom CLI binaries, manifests, and deployment patterns. - >heavyweight infrastructure: the recommended deployment for pbuf.io requires provisioning and operating a Kubernetes cluster, a substantial operational burden for developer plumbing that sits entirely off the production request path.
migrating to a bespoke CLI and operating your own servers trades a billing annoyance for permanent toolchain and infrastructure debt.
## 4. the middle ground: protorip (protos.rip)
the
`buf` CLI already solved workspace configuration, deterministic digests, and remote code generation. the missing piece was never a new CLI syntax or a self-hosted Kubernetes cluster, it was a dependable, flat-rate schema registry speaking the standard BSR wire protocol.[protorip](/) (
`protos.rip`) provides that middle ground:```yamlversion: v2modules:- path: protoname: protos.rip/acme/platformdeps:- protos.rip/googleapis/googleapis- protos.rip/bufbuild/protovalidate```
```bashbuf dep updatebuf lintbuf breaking --against .git#branch=mainbuf generatebuf push```
protorip covers the standard 90% of day-to-day
`buf` CLI workflows without infrastructure or per-type metering:- >drop-in buf CLI compatibility: no new
CLIs, manifests, or plugins to learn. your
`buf.yaml`files,`buf.lock`dependency graphs, and CI actions (`buf-setup`) work unchanged. - >
hosted community plugins & standard public modules:run
`buf generate`remotely against standard plugins (`protocolbuffers/go`,`connectrpc/es`,`protocolbuffers/python`) and resolve upstream dependencies (`googleapis`,`protovalidate`) using the same module names and plugin identifiers you already use on buf.build. - >predictable flat pricing: $9/month Solo, $49/month Team, and $0 for Free and [open source](/oss), with unlimited private modules, unlimited types, and unlimited team members, enabled by serverless edge economics rather than per-type metering.
- >zero infrastructure to manage: fully hosted and backed by Cloudflare edge primitives, providing high durability and low latency without requiring you to operate databases or maintain Kubernetes clusters.
| capability | 1. ad-hoc file management | 2. buf.build (bsr) | 3. bespoke oss (`buffrs`, `pbuf`) | 4. protorip (`protos.rip`) |
|---|---|---|---|---|
| cli & manifest | standard `buf.yaml` | standard `buf.yaml` | bespoke (`Proto.toml`, `pbuf.yaml`) | standard `buf.yaml` |
| infrastructure | none (local files / scripts) | zero (managed SaaS) | high (self-hosted DBs/Artifactory) | zero (managed SaaS) |
| dependency resolution | manual / none | native BSR (`buf.lock`) | local vendoring / custom | native BSR (`buf.lock`) |
| remote codegen | none / custom scripts | native plugins + custom containers | none / local `protoc` | hosted community plugins |
| pricing model | $0 SaaS, developer time | $0.50/type/mo ($3k min Pro) | $0 license, platform overhead | flat $9/$49/mo (unlimited types) |
## which workflow should you choose?
- >use
`buf`CLI + ad-hoc file management if you have two or three consumer repositories, zero budget, and rarely change your`.proto`definitions. - >use
`buf.build`if your organisation needs hosted language package registries (Generated SDKs), server-enforced review gates, SAML SSO, or per-repository RBAC. - >use self-hosted open source if strict air-gapped or regulatory mandates legally prohibit using a managed SaaS registry, and you have dedicated platform engineering bandwidth to maintain custom infrastructure and bespoke CLIs.
- >use protorip (
`protos.rip`) if you want the standard`buf`CLI workflow, private modules, upstream dependencies, and remote code generation at a predictable flat price without maintaining ad-hoc sync scripts or operating servers.