Site Logo
WellAged.dev

Why are Protobufs not more popular? - WIP

AI-assisted: I developed the arguments and references in this post. Claude helped organize and expand the draft.

It isn’t about he protocol it is about the schema. You don’t need to give up REST to get the benefits of Protobufs.

Contract-first is a different mindset

Some developers naturally think in terms of defining the contract before writing any code. The service, its methods, its message types, all defined up front. Then tooling generates everything from that definition.

JSON is the default

JSON is human-readable, universally supported, and works everywhere. Curl, browser dev tools, Postman, every language. That’s a real strength and it’s why JSON became the default format for APIs. Nothing wrong with that.

Most developers have only used one approach

JSON’s ubiquity means fewer developers actively think about their serialization or schema choice. It’s just what you use.

Bringing attention to Protobufs

Rising tides float all boats. The goal is to teach developers another way to define their APIs that opens up more opportunities.

DevRel strategy

Start with open source tools that already have developer-facing APIs. Contribute Protobuf definitions to real projects.

Do it live

Stream the contributions. Demystifies the Protobuf workflow for developers who have never touched a .proto file.

It is time to reconsider Protobuf - Blog and Talk

The ROI on Protobuf has never been better. The tooling, the ecosystem, and the developer experience have all changed since the common criticisms were written.

CFP

It Is Time to Reconsider Protobuf

Protobuf adoption remains low despite years of maturity, but not for the reasons most developers think. The real barrier is not complexity or tooling; it is that most developers have only ever worked with JSON and never had a reason to choose something different. Protobuf does not ask you to compete with JSON on its home turf. It asks you to think about your interfaces differently.

The real case for Protobuf isn’t serialization speed. It’s contract-first development. One .proto file drives type generation across every language in your stack, schema drift becomes a lint error, and breaking changes get caught before they ship. Modern tooling (buf, ConnectRPC, protovalidate) has removed every historical friction point. This talk covers the practical path to adopting Protobuf without abandoning REST or JSON where they already work.

The tooling story has changed significantly. buf handles linting, formatting, and breaking change detection in CI. ConnectRPC works over plain HTTP without a proxy. protovalidate puts validation rules directly in the schema. Postman, VS Code, and IntelliJ all have native support.

This talk walks through the most common criticisms of Protobuf and gRPC, acknowledges where they came from, and shows what has changed. You’ll see the current state of the tooling, a practical workflow for adopting Protobuf schemas in an existing project, and why the real ROI is in schema-driven development, not raw throughput.

Talk outline

15 min lightning. Budget ~13 min of content, 2 min of slack. No live demo, screen recordings only. No Q&A built in.

  1. The hook: watch what happens around every new protocol (1 min)
    • MCP is the newest protocol most of this room has touched. It’s JSON-RPC, and in December 2025 its maintainers decided transports should be pluggable rather than blessing new official ones.
    • Google withdrew its dedicated gRPC transport proposal, because with pluggable transports it wasn’t needed.
    • Buf then published a full Protobuf mapping of MCP anyway, the same way they’ve shown up next to every other protocol.
    • That’s the pattern worth noticing. Schema tooling arrives next to whatever the new thing is, because the schema question is independent of the protocol question. Hold that thought.
  2. You remember the bumpy years (2 min)
    • Most of this room formed an opinion about Protobuf and gRPC somewhere between 2016 and 2020, and it was rough: protoc in your build, no browser story, thin IDE support, “you’re not Google.”
    • Source it honestly from I Reviewed 1,000s of Opinions on gRPC so nobody thinks you’re strawmanning. Those complaints were correct.
    • Say plainly that you’re not here to argue the complaints were wrong. You’re here because the thing they were about has changed underneath them.
    • Do not attempt a point-by-point rebuttal. It reads as defensive and burns the clock.
  3. The reframe: Protobuf is a schema language (4 min)
    • This is the talk. Everything before it is setup, everything after is evidence.
    • Any object crossing an application boundary is a candidate: DTOs, events, API responses, config.
    • Kafka and Confluent Schema Registry treat Protobuf as a first-class schema with zero gRPC involved. Strongest proof that schema and transport are separate decisions, and most of the room hasn’t connected it.
    • Forward and backward compatibility as a built-in property, not a versioning convention you maintain by hand.
    • Land the line: the deciding question is not “do I need gRPC,” it’s “does data cross a boundary here.”
  4. It became first-class while you weren’t looking (4 min)
    • The point of this section is accumulation, not any single item. Nobody announced “Protobuf is ready now.” It arrived one platform at a time, starting at the infrastructure edge and working inward toward the code you write.
    • Run it as a timeline slide, roughly one line each, fast:
      • 2020: AWS ALB routes gRPC natively with end-to-end HTTP/2. Confluent Schema Registry makes Protobuf first-class alongside Avro.
      • 2022: Postman ships gRPC support. The “you can’t just poke at it” objection loses its tool of choice.
      • 2023: Kubernetes 1.27 promotes native gRPC health probes to GA. No sidecar, no wrapper binary.
      • 2025: gRPC Swift 2 lands as a full async/await rewrite. Tonic is donated into the gRPC project under CNCF and becomes the official Rust implementation. protovalidate reaches v1.0.
      • 2026: Protobuf gets a real language server. Spring Boot 4.1 ships first-party gRPC auto-configuration for server, client, and test.
    • Then slow down and show exactly one of them. The LSP is the right pick: a twenty-second screen recording of go-to-definition and completion inside a .proto does more than any claim you can make out loud.
    • Second artifact if time allows: buf breaking failing in CI on a renamed field. One screenshot, no narration.
    • The line that ties it together: none of these were Protobuf asking for special treatment. Each one was a platform deciding a schema-defined contract was worth supporting directly.
  5. Monday morning (1.5 min)
    • Pick one DTO that already exists in your codebase. Define it as a .proto.
    • Generate it alongside your current JSON. Change no transport, delete no code.
    • Add buf lint and buf breaking to CI. That’s the whole first step.
    • The point is that adoption is additive. Nobody has to approve a migration.
  6. Close (0.5 min)
    • One slide: the reframe restated, a QR code to the reference list, done.

Cut for time, deliberately

Slide outline

18 slides, ~10 minutes narrated, 15 minute slot. Same beats as the talk outline. The difference is that no slide is a sentence I’m about to say out loud.

The rule: three slide types, nothing in between.

TypeWhat’s on screenWord budget
ArtifactA real screenshot or recording of the thing itselfA label. 3–6 words.
DiagramBoxes, arrows, a timeline. Something with a shape.Node labels only. No sentences.
PunctuationOne short phrase, large, alone5 words maximum

If a slide needs a sentence to make sense, it’s a slide I haven’t figured out yet. The audience is either reading or listening, never both, and I’d rather they listen.

The spine of the deck is one visual callback. Slide 4 shows a .proto file open in a 2018 editor: gray monospace, no highlighting, no help. Slide 13 shows the same file under the language server. I don’t explain the pairing. Nine slides apart, it lands on its own.

Act 1: The pattern (3 slides, ~1 min)

1. Title — 10s · punctuation Talk title, name, handle. Nothing else.

2. Three real screenshots — 30s · artifact Side by side, in order: the MCP “pluggable transports” blog post header, the SEP-1352 GitHub issue with its Closed badge visible, and the bufbuild/mcp-proto repo header. Dates under each. On screen: the three dates only. Say: MCP decided transports should be pluggable rather than blessing new ones. That made Google’s dedicated gRPC proposal unnecessary, so Google closed it themselves. Buf mapped the protocol to Protobuf anyway.

3. Every protocol grows a schema — 25s · diagram Five columns, protocol on top and its schema language underneath. SOAP → WSDL. REST → OpenAPI. gRPC → Protobuf. GraphQL → SDL. MCP → (blank, then fills in). On screen: ten words, all of them proper nouns. Say: This keeps happening. The protocol shows up first and a schema language grows next to it, because the schema question is separate from the protocol question. That’s the whole talk.

Act 2: The bumpy years (3 slides, ~1.5 min)

4. A .proto file in 2018 — 30s · artifact Screenshot of a .proto open in an editor of the era. Flat gray monospace, no syntax highlighting, no go-to-definition, no error squiggles. Nothing but text. On screen: “2018”. Say: This is what the file looked like. Your editor had no idea what it was.

5. What people actually said — 45s · artifact Screenshots of real HN and Reddit comments. Cropped tight, four of them, timestamps visible. Say: Read two aloud, let the others land silently. Why screenshots: typed-out quotes read as strawmen no matter how accurate they are. A screenshot with a timestamp can’t be accused of paraphrasing, and it solves the sourcing problem at the same time.

6. All true — 15s · punctuation On screen: “All of it was true.” Say: I’m not here to tell you those were wrong. The thing they were about changed underneath them.

Act 3: The reframe (5 slides, ~4 min) — this is the talk

7. Thesis — 20s · punctuation On screen: “Protobuf is a schema language.” Say: Nothing. Let it sit for two seconds.

8. One file, many outputs — 50s · diagram A single .proto in the center. Arrows fanning out to Go structs, TypeScript types, a Python client, a Kafka topic, and generated docs. The center node is small; the fan is the point. On screen: six node labels. Say: One definition. Every consumer generates from it. Nobody hand-writes the shape twice, and nobody’s copy drifts.

9. A Kafka topic with a schema — 40s · artifact Screenshot of a schema registry UI showing a topic with schema type PROTOBUF. No arrows, no annotation. On screen: “No gRPC in this picture.” Say: Protobuf as a first-class schema type since 2020, alongside Avro. Topics, evolution, breaking-change checks. This is the proof that schema and transport are separate decisions.

10. Old reader, new message — 50s · diagram Two writers and one reader. v2 writer emits a message with an extra field; the v1 reader parses it fine, with the unknown field drawn grayed out and passing straight through. On screen: “v1”, “v2”, “ignored”. Say: Add a field, pick an unused number, ship it. Compare that to a version key in a JSON envelope and a convention nobody wrote down.

11. The question — 40s · punctuation On screen: “Does data cross a boundary here?” Say: Say it, pause, move on. Don’t elaborate. It returns on the last slide.

Act 4: It became first-class (4 slides, ~3 min)

12. Timeline — 60s · diagram Horizontal axis, 2020 to 2026. Markers with platform logos, revealed left to right. Underneath, an arrow labeled “inward” running from infrastructure to your framework. On screen: years, logos, five one-word themes. Say: Name each year and what tier it hit. AWS and Confluent, then Postman, then Kubernetes, then the language implementations, then Spring Boot and the IDEs. Don’t read the items — the shape is the argument.

13. The same file, now — 40s · artifact Twenty second silent capture: go-to-definition across files, then completion inside a message. The same .proto from slide 4. On screen: “2026”. Say: Almost nothing. Let people notice the callback themselves.

14. buf breaking fails the build — 30s · artifact Screenshot of the red CI check on a renamed field. On screen: nothing beyond the screenshot. Say: Schema drift is a build failure now, not an incident.

15. No launch day — 20s · punctuation On screen: “Nobody announced this.” Say: Each platform independently decided a schema-defined contract was worth supporting. That’s what maturing actually looks like, and it’s easy to miss.

Act 5: What to do (3 slides, ~1.5 min)

16. One new file — 60s · diagram A file tree, before and after. The after side has exactly one new .proto and a generated directory, marked green. Everything else is unchanged and gray. On screen: the tree, plus buf lint and buf breaking. Say: Pick a DTO you already have, define it as a proto, generate next to your existing JSON, add the two checks to CI. No transport changes. No deletions.

17. Additive — 20s · punctuation On screen: “Nobody has to approve a migration.”

18. Close — 20s · punctuation On screen: the question again, plus a QR to the reference list.

Assets to produce

Real work is here now, not in the slide text. Roughly in order of how long each takes.

Slides deliberately not made

Target audience

Polyglot developers, API designers, and platform engineers who evaluated Protobuf or gRPC in the past and decided against it, or who have only ever worked with JSON APIs.

Takeaways


References

Schema-driven development and the case for Protobuf

Protobuf compatibility and schema evolution

Bridging REST and gRPC

Tooling and ecosystem

Protobuf Editions

ConnectRPC and the browser story

First-class support, platform by platform

The timeline behind the talk’s central claim: Protobuf and gRPC support arrived incrementally across the industry, starting at the infrastructure edge and working inward.

Language and framework integration

Protobuf beyond RPC: events and data pipelines

Running it in production

Developer sentiment and community discourse

Protobuf/gRPC momentum