Protocol Buffers
When You Need This Skill
- Creating or editing
.proto files
- Setting up
buf.yaml or buf.gen.yaml
- Designing gRPC or Connect services
- Adding protovalidate constraints
- Troubleshooting buf lint or breaking change errors
Core Workflow
1. Match Project Style
Before writing proto code, review existing .proto files in the project.
Match conventions for naming, field ordering, structural patterns, validation, and documentation style.
If none exists, ask the user what style should be used or an existing library to emulate.
2. Write Proto Code
- Apply universal best practices from best_practices.md
- Add protovalidate constraints to every field—this is not optional for production APIs
- For service templates, see assets/
3. Verify Changes
Always run after making changes:
buf format -w && buf lint
Check for a Makefile first—many projects use make lint or make format.
Fix all errors before considering the change complete.
Quick Reference
| Task |
Reference |
| Field types, enums, oneofs, maps |
quick_reference.md |
| Schema evolution, breaking changes |
best_practices.md |
| Validation constraints |
protovalidate.md |
| Complete service examples |
examples.md, assets/ |
| buf CLI, buf.yaml, buf.gen.yaml |
buf_toolchain.md |
| Migrating from protoc |
migration.md |
| Lint errors, common issues |
troubleshooting.md |
| Proto API review checklist |
review_checklist.md |
Project Setup
New Project
Create directory structure:
proto/
├── buf.yaml
├── buf.gen.yaml
└── company/
└── domain/
└── v1/
└── service.proto
Use assets/buf.yaml as starting point
Add buf.build/bufbuild/protovalidate as a dependency in buf.yaml and run buf dep update
Use assets/buf.gen.*.yaml for code generation config
Code Generation Templates
| Template |
Use For |
buf.gen.go.yaml |
Go with gRPC |
buf.gen.go-connect.yaml |
Go with Connect |
buf.gen.ts.yaml |
TypeScript with Connect |
buf.gen.python.yaml |
Python with gRPC |
buf.gen.java.yaml |
Java with gRPC |
Proto File Templates
Located in assets/proto/example/v1/:
| Template |
Description |
book.proto |
Entity message, BookRef oneof, enum |
book_service.proto |
Full CRUD with batch ops, pagination, ordering |
Common Tasks
Add a new field
- Use next sequential field number
- Add protovalidate constraints: every field should have validation appropriate to its type (format validators, length bounds, numeric ranges, enum constraints, etc.)
- Document the field
- Run
buf format -w && buf lint
Remove a field
- Reserve the field number AND name:
reserved 4;
reserved "old_field_name";
- Run
buf breaking --against '.git#branch=main' to verify
Add protovalidate constraints
Every field in a production API should have appropriate validation.
See protovalidate.md for the full reference.
Common constraints:
- String formats:
.string.uuid, .string.email, .string.uri, .string.pattern
- String bounds:
.string.min_len, .string.max_len
- Numeric bounds:
.int32.gte, .uint32.lte
- Enum validation:
.enum.defined_only, .enum.not_in = 0
- Repeated bounds:
.repeated.min_items, .repeated.max_items
- Required fields:
(buf.validate.field).required = true
- Oneof required:
(buf.validate.oneof).required = true
Verification Checklist
After making changes:
1---2name: protobuf3description: Use when working with Protocol Buffer (.proto) files, buf.yaml, buf.gen.yaml, or buf.lock. Covers proto design, buf CLI, gRPC/Connect services, protovalidate constraints, schema evolution, and troubleshooting lint/breaking errors.4---5
6# Protocol Buffers
7
8## When You Need This Skill
9
10- Creating or editing `.proto` files
11- Setting up `buf.yaml` or `buf.gen.yaml`
12- Designing gRPC or Connect services
13- Adding protovalidate constraints
14- Troubleshooting buf lint or breaking change errors
15
16## Core Workflow
17
18### 1. Match Project Style
19
20Before writing proto code, review existing `.proto` files in the project.
21Match conventions for naming, field ordering, structural patterns, validation, and documentation style.
22If none exists, ask the user what style should be used or an existing library to emulate.
23
24### 2. Write Proto Code
25
26- Apply universal best practices from [best_practices.md](references/best_practices.md)
27- Add [protovalidate](references/protovalidate.md) constraints to every field—this is not optional for production APIs
28- For service templates, see [assets/](assets/)
29
30### 3. Verify Changes
31
32**Always run after making changes:**
33
34```bash
35buf format -w && buf lint
36```
37
38Check for a Makefile first—many projects use `make lint` or `make format`.
39
40Fix all errors before considering the change complete.
41
42## Quick Reference
43
44| Task | Reference |
45|------|-----------|
46| Field types, enums, oneofs, maps | [quick_reference.md](references/quick_reference.md) |
47| Schema evolution, breaking changes | [best_practices.md](references/best_practices.md) |
48| Validation constraints | [protovalidate.md](references/protovalidate.md) |
49| Complete service examples | [examples.md](references/examples.md), [assets/](assets/) |
50| buf CLI, buf.yaml, buf.gen.yaml | [buf_toolchain.md](references/buf_toolchain.md) |
51| Migrating from protoc | [migration.md](references/migration.md) |
52| Lint errors, common issues | [troubleshooting.md](references/troubleshooting.md) |
53| Proto API review checklist | [review_checklist.md](references/review_checklist.md) |
54
55## Project Setup
56
57### New Project
58
591. Create directory structure:
60 ```
61 proto/
62 ├── buf.yaml
63 ├── buf.gen.yaml
64 └── company/
65 └── domain/
66 └── v1/
67 └── service.proto
68 ```
69
702. Use `assets/buf.yaml` as starting point
713. Add `buf.build/bufbuild/protovalidate` as a dependency in `buf.yaml` and run `buf dep update`
724. Use `assets/buf.gen.*.yaml` for code generation config
73
74### Code Generation Templates
75
76| Template | Use For |
77|----------|---------|
78| `buf.gen.go.yaml` | Go with gRPC |
79| `buf.gen.go-connect.yaml` | Go with Connect |
80| `buf.gen.ts.yaml` | TypeScript with Connect |
81| `buf.gen.python.yaml` | Python with gRPC |
82| `buf.gen.java.yaml` | Java with gRPC |
83
84### Proto File Templates
85
86Located in `assets/proto/example/v1/`:
87
88| Template | Description |
89|----------|-------------|
90| `book.proto` | Entity message, BookRef oneof, enum |
91| `book_service.proto` | Full CRUD with batch ops, pagination, ordering |
92
93## Common Tasks
94
95### Add a new field
96
971. Use next sequential field number
982. Add [protovalidate](references/protovalidate.md) constraints: every field should have validation appropriate to its type (format validators, length bounds, numeric ranges, enum constraints, etc.)
993. Document the field
1004. Run `buf format -w && buf lint`
101
102### Remove a field
103
1041. Reserve the field number AND name:
105 ```protobuf
106 reserved 4;
107 reserved "old_field_name";
108 ```
1092. Run `buf breaking --against '.git#branch=main'` to verify
110
111### Add protovalidate constraints
112
113Every field in a production API should have appropriate validation.
114See [protovalidate.md](references/protovalidate.md) for the full reference.
115
116Common constraints:
117- String formats: `.string.uuid`, `.string.email`, `.string.uri`, `.string.pattern`
118- String bounds: `.string.min_len`, `.string.max_len`
119- Numeric bounds: `.int32.gte`, `.uint32.lte`
120- Enum validation: `.enum.defined_only`, `.enum.not_in = 0`
121- Repeated bounds: `.repeated.min_items`, `.repeated.max_items`
122- Required fields: `(buf.validate.field).required = true`
123- Oneof required: `(buf.validate.oneof).required = true`
124
125## Verification Checklist
126
127After making changes:
128- [ ] Every field has appropriate protovalidate constraints
129- [ ] `buf format -w` (apply formatting)
130- [ ] `buf lint` (check style rules)
131- [ ] `buf breaking --against '.git#branch=main'` (if modifying existing schemas)