Back to the BSR
Manuals / The Buf Schema Registry (BSR) / Automate code generation

Code Generation

The BSR facilitates both local and remote code generation, simplifying how module consumers get access to generated code.

Hosting modules on the BSR allows anyone with proper access to consume those modules. This eliminates the need to coordinate and sync Protobuf files manually amongst multiple consumers, which is error-prone and leads to drift.

Instead, users generate code from a single source of truth: a hosted module on the BSR.

In your buf.gen.yaml, define plugins and their respective options, and then generate your code with the buf CLI by referencing a BSR module:

$ buf generate

Local code generation

The buf generate command enables you to run local plugins to generate code from remote modules hosted on the BSR. If you already have a workflow that invokes plugins with protoc, then adopting buf generate should be straightforward.

Add a buf.gen.yaml file, and list all the plugins as well as their options. Here is a quick example that generates C++ and Java code.

version: v1
  - plugin: cpp
    out: gen/proto/cpp
  - plugin: java
    out: gen/proto/java

The buf CLI infers the protoc-gen-{name} prefix for each plugin specified by the name key, similar to protoc behaviour.

Once you set up a buf.gen.yaml file, run this command and specify a module hosted on the BSR. That's right, you can reference a hosted BSR module without having the Protobuf files locally!

$ buf generate <MODULE_NAME>

This generates C++ and Java code in the local /gen/proto/{cpp,java} directories.

For a more advanced example, check out the Tour - Generate Go Code

Remote Plugins

The Buf team packages and distributes plugins to the BSR, browsable at:

If you're interested in how these plugins are packaged see the bufbuild/plugins repository for more details.

To learn more about how remote plugins can be used in code generation workflows, check out the remote plugins' documentation.

Remote Packages

By combining a BSR module and a plugin, you can fetch generated SDKs with your language's package manager:

Go Module Proxy

$ go get

NPM Registry

$ npm install @buf/bufbuild_eliza.bufbuild_connect-es@latest

For more information about available packages, see the Remote Packages documentation.