---
site: protos.rip
page: docs/guides/create-and-publish-a-module
---
navigation
# Create and publish a module
```bashbuf registry login protos.ripbuf config init protos.rip/acme/shipments # scaffold buf.yamlbuf registry module create protos.rip/acme/shipments # create the module recordbuf push # first commit, on label "main"buf push --label v1.0.0```
## Sign in
Run
`buf registry login protos.rip` and approve the request in the browser tab that opens. If the browser doesn’t launch, open the verification URL the CLI prints.For headless machines or other sign-in options, see [Sign in and API keys](/docs/guides/sign-in-and-api-keys).
## Configure buf.yaml
From the directory holding your
`.proto` files, run `buf config init` to scaffold a `buf.yaml` with `name` and `path` pre-filled:```bashbuf config init protos.rip/acme/shipments```
If you already have a
`buf.yaml`, add a `modules` entry instead — `path` is the directory holding your `.proto` files relative to `buf.yaml`, and `name` is the registry module ref:```yamlversion: v2modules:- path: .name: protos.rip/acme/shipments```
`buf push` reads this to determine which module receives the commit.## Create the module
```bashbuf registry module create protos.rip/acme/shipments```
Replace
`acme` with your username or org slug — visible in your dashboard URL — and `shipments` with your module name.Module names start with a lowercase letter; the rest may be lowercase letters, digits, hyphens, or underscores, up to 64 characters total.
New modules default to private. Change visibility from the module page in the dashboard.
## Push
Run
`buf push` from the directory containing `buf.yaml`:```bashbuf push```
The commit lands on the
`main` label by default. Re-pushing identical content is a no-op.## Tag a release
Pass
`--label` to apply a named label to the commit:```bashbuf push --label v1.0.0```
Use labels to mark stable releases your consumers can pin to.