mrkeyoor.com_
Fri 16 Oct 18:54 UTC
Dev Toolsevaluationupdated 10 Oct 2026

protobuf review

Protocol Buffers turns a shared message definition into code that programs in different languages can use to exchange structured data. It helps services agree on what a message means as their code changes, at the cost of maintaining schemas and generated code.

+7stars / 7d
Verdict

Our protobuf Python install took 6 seconds and its build passed in 1 second, but tests were skipped and pip-audit reported 2 known vulnerabilities. Choose it for shared message contracts across services when you can own schema and compiler/runtime compatibility. Use supported releases and inspect the audit details before accepting our measured environment.

We ran it

Lab card: what happened when we ran protobufScreenshot of protobuf (protobuf.dev)
Install✓ · 6s38 packages · 101 MB
Build✓ · 1s
Testsn/ano test script
Known vulns2(pip-audit)
Repo3706 files~1,280,033 lines of source · 103.9 MB · 24 CI workflows

Answers from our run

Does protobuf build from source?

Dependencies installed in 6 seconds (38 packages), and the build succeeded in 1 seconds. We cloned commit 8ae1b29 into a clean Debian container with 3 CPUs and no project-specific setup.

Does protobuf have tests you can run?

Not through a standard command: the project exposes no test script or target that our harness could run.

Does protobuf have known vulnerabilities in its dependencies?

pip-audit flagged 2 known advisories in the dependency tree at the time of our run.

Who should not use protobuf?

Teams expecting arbitrary JSON to work without schema design: protobuf generates message code from .proto definitions.

What are the alternatives to protobuf?

FlatBuffers, Cap'n Proto. Our protobuf Python install took 6 seconds and its build passed in 1 second, but tests were skipped and pip-audit reported 2 known vulnerabilities.

Setup4/56-second Python install, with a separate compiler to manage
Docs5/5Explicit source routes and language-specific compatibility rules
Community5/5October 10 push and recent Python and upb pull requests
Maturity4/5Maintained releases, though our harness skipped tests

Discussed on

  1. hnProtocol Buffers v3.0.0 released278 points
  2. hnProtobuf-ES: Protocol Buffers TypeScript/JavaScript runtime205 points
  3. hnDemystifying the protobuf wire format63 points
  4. hnFaster Protocol Buffers (2019)59 points
  5. hnFast and dynamic encoding of Protocol Buffers in Go50 points

Who it’s for

Teams whose independently deployed services need shared message definitions across languages.
Python developers consuming existing protobuf schemas who want the packaged runtime.
Maintainers willing to review schema changes and coordinate compiler/runtime upgrades.

Who it’s NOT for

Teams expecting arbitrary JSON to work without schema design: protobuf generates message code from .proto definitions.
C++ or Rust libraries that need freely interchangeable runtime versions: the official policy requires an exact match with generated code.
Developers expecting setup.py to work directly in the Python GitHub checkout: its README explicitly excludes that route.
Teams taking main as a stable application dependency: the root README warns about incompatible changes and recommends release commits.

Setup reality

Our sandbox installed Python commit 8ae1b29 in 6 seconds, adding 38 packages and using 101 MB on disk. The build passed in 1 second. Tests were skipped because the harness found no script or target. Pip-audit reported 2 known vulnerabilities without package or severity details in the supplied summary.

Local use needs no hosted API credentials. The runtime package and protoc compiler are separate requirements when you generate messages. The README recommends supported releases, with prebuilt compiler binaries for non-C++ users.

We ran the ./python/ path on Python 3.12 in a fresh Debian container. This does not validate the C++ compiler or other runtimes. Direct setup.py use against the GitHub checkout is unsupported, and compiler/runtime compatibility rules differ by language.

Generated messages make a shared schema enforceable

Changing a message that another service still reads is where Protocol Buffers earns its place. You describe the fields in a .proto file, then protoc generates code for each consumer's language. That gives a Python worker and a Java service a shared definition to work against. Pick it when coordinating those definitions has become real work and you can give someone responsibility for schema changes. The project README separates the compiler from the language runtime explicitly.

Our Python checkout path needed 38 packages and occupied 101 MB after installation. That's a manageable starting point for evaluating the runtime, though the repository itself spans several languages. An application using protobuf doesn't need to absorb all that source. The decision is whether generated messages suit your interface, especially when readers and writers update separately. A binary format also makes casual inspection less convenient than opening a JSON document.

What happened when we ran it

Our sandbox installed commit 8ae1b29 in 6 seconds and built the Python path in 1 second on October 8, 2026. Installation pulled 38 packages and used 101 MB on disk. The unprivileged Debian container had 3 CPUs and 8 GB of RAM, used ghcr.io/astral-sh/uv:python3.12-bookworm, and held no secrets. Both steps succeeded. This result covers the Python project under ./python/, rather than every compiler and language runtime in the repository.

The harness found no test script or target, so it skipped tests. Its scan recorded 24 CI workflow files, no Dockerfile, and no tests directory. Those are discovery results, not proof that upstream has no tests. The checkout contained 3,706 files, approximately 1,280,033 source lines, and occupied 103.9 MB. A successful build tells us this path completed in this container. It provides no evidence about round-trip correctness, compatibility, or serialization speed.

Pip-audit reported 2 known vulnerabilities in our installed environment. The supplied result doesn't identify affected packages, advisory IDs, or severity, so we cannot assign either finding to protobuf itself. A security-sensitive adoption needs that detail before accepting the environment. Equally, the skipped suite should remain a skipped suite in your decision: our run produced no passing test count to balance against the audit findings.

The runtime package still needs a compiler for new schemas

The Python README recommends pip install protobuf for ordinary users. Creating or changing your own message definitions also requires protoc, with released binaries available separately. Neither local message serialization nor code generation needs a hosted API credential. You need a compatible compiler, the runtime in each consumer, and a place in your workflow for generated files. Python's README explains the package and source routes.

The 1-second build we measured shouldn't become an estimate for compiling the C++ compiler. Python's source instructions use Bazel to produce wheels, and they explicitly rule out invoking setup.py directly against the GitHub checkout or its source tarball. The root README recommends released versions and warns that main can contain incompatible or insufficiently tested changes. For application work, take that recommendation seriously instead of treating the default branch as a dependable package release.

Field numbers become commitments once messages leave your process

A protobuf field's numeric identifier persists in the wire format. The language guide says to reserve removed identifiers rather than reuse them, because old data can otherwise acquire a different meaning. That is the operating cost behind schema evolution: reviewing a rename is easy, spotting an unsafe number reuse requires discipline. Put the schema review next to the service change. The proto3 field rules spell out the restriction and its consequences.

The 6-second installation removes little of that work. For a small browser-facing endpoint with loosely structured data, keeping JSON may be the better decision. For independently deployed consumers, a named message contract gives reviewers something concrete to inspect. Protobuf also has a JSON mapping, but adopting it means following its mapping rules. It doesn't turn arbitrary existing JSON into interchangeable protobuf messages merely because both describe objects.

Compiler and runtime updates must follow the compatibility policy

Generated code and its runtime have a compatibility relationship of their own, separate from the schema's wire compatibility. The official policy forbids pairing newly generated code with an older runtime. C++ and Rust require exact generated-code and runtime matches, while Python has broader guarantees. A team sharing schemas across languages therefore needs language-specific upgrade decisions. The runtime compatibility policy is worth reading before the first dependency update, not after an import fails.

Our Python 3.12 container result cannot certify those other language paths. The Python README also distinguishes the default upb extension from a pure Python backend and a deprecated C++ extension. Legacy applications relying on Python/C++ message sharing should examine that distinction before moving packages. For a new application, the normal package route looks reasonable. For a library embedded in other people's processes, compatibility deserves more attention than the brief successful build.

October activity supports using releases rather than chasing main

GitHub recorded a last push on October 10, 2026, with 379 open issues and PRs combined. The latest release was v36.2, published September 17. Recent open pull requests address Python JSON handling and upb internals, so activity extends beyond tagging releases. These are signs of ongoing maintenance, not a promise about response times. The v36.2 release notes also describe language-specific fixes rather than one uniform change across every runtime.

FlatBuffers is worth considering when direct access to serialized buffers drives the design. Cap'n Proto adds a capability-based RPC approach worth evaluating if that communication model fits. Neither substitutes for protobuf's schema decisions automatically. If protobuf fits your consumers, start with a supported compiler and runtime pair, then make one schema change survive an older reader. The installation is the easy part. Keeping that reader correct is the reason to choose this tool.

Alternatives

ProjectWhat it isPick it when
FlatBuffersA schema-based serialization library that reads data directly from buffers.pick this instead when direct buffer access matters more than protobuf compatibility with existing consumers.
Cap'n ProtoA binary message format and capability-based RPC system.pick this instead when its RPC model suits your system and you can adopt its schema and tooling.

Sources

  1. Protobuf README
  2. Python runtime README
  3. Proto3 language guide
  4. Cross-version runtime guarantee
  5. Protobuf v36.2 release
  6. GitHub repository facts and activity
  7. FlatBuffers
  8. Cap'n Proto

More dev tools reviews

compose-samples · librepods · sqlmap · coucou · world-execute-me-dsh-pv · mcp-extensions · the whole board →