[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f13fx636npfnnm":3},{"code":4,"message":5,"data":6,"timestamp":57},10000,"success",{"full_name":7,"position":8,"description":9,"language":10,"stars":11,"forks":12,"stars_gained":13,"age_days":14,"hn_threads":15,"one_liner":34,"summary_md":35,"topic":36,"github_topics":39,"license":48,"homepage":49,"updated_at":50,"history":51},"protocolbuffers\u002Fprotobuf",10,"Protocol Buffers - Google's data interchange format","C++",72131,16327,3,4442,[16,21,26,30],{"id":17,"title":18,"points":13,"comments":19,"posted_at":20},40470253,"Show HN: Protobuf Editions now available in v27.0",2,"2024-05-24",{"id":22,"title":23,"points":13,"comments":24,"posted_at":25},37098731,"How to learn to use protoc in 21 easily infuriating steps",0,"2023-08-12",{"id":27,"title":28,"points":19,"comments":24,"posted_at":29},42613538,"Μpb: Small, Fast C Protobufs","2025-01-06",{"id":31,"title":32,"points":19,"comments":24,"posted_at":33},22962550,"Proto3 is getting field presence support","2020-04-23","A schema-first serialization format for teams that need typed, versionable data contracts across services and languages.","Protobuf is worth adopting when you have a real interface contract to maintain across services or languages, and it is a poor first choice for a small script or a payload you send once. The repository is Google's canonical implementation of the format, including the `protoc` compiler and language runtimes.\n\n## The problem\n\nA team starts with JSON: someone writes a payload, another service reads it, and the field names are agreed in chat. When a field gets renamed, a number flips between string and int, or a new consumer arrives in another language, the mismatch surfaces at runtime. With protobuf, the schema lives in a `.proto` file, and that file is the unit both sides build from. The change happens at the schema step: you edit the file, regenerate code for each language, and the compiler rejects malformed definitions before deploy. The result is a typed, versionable contract rather than an informal convention.\n\n## What's different\n\nProtobuf separates the schema from the generated code. `protoc` turns `.proto` definitions into typed classes for C++, Java, Python, and the other supported runtimes, so each service gets native accessors instead of hand-parsing bytes. The wire format is compact and explicitly versioned: field numbers, not field names, travel on the wire, which is what makes additive schema evolution possible.\n\nThat design has a cost. The toolchain is a second build step, and the README is explicit that you need both `protoc` and a runtime for your language. For C++, you build from source, and the README warns that the head of main can break source compatibility, so it tells you to pin a release commit on a release branch. For everyone else, pre-built binaries are available from releases. Cross-language work also splits across repositories: Go, JavaScript, and Dart live in separate projects, so versioning is not entirely one-stop.\n\nEditions, the newer way to express schema behavior, was the subject of an author's [blog post](https:\u002F\u002Fbuf.build\u002Fblog\u002Fprotobuf-editions-are-here) shared when v27.0 shipped. Treat that as material describing a schema-model change, not an argument for migrating immediately.\n\n## Who should try it\n\nGood fit: a backend team exposing an API to several client languages, or a platform group that owns shared event schemas and wants compile-time checks when a producer and consumer disagree. A second good fit is a C++ codebase that already builds with Bazel, since the README documents `bazel_dep` integration with Bzlmod and a WORKSPACE path.\n\nPoor fit: a solo developer prototyping a small service, or a project whose entire data contract is one JSON blob consumed by one program. The schema-plus-codegen loop adds files and a build dependency before it saves anything.\n\n## Requirements and limitations\n\nThe main setup cost is the compiler\u002Fruntime pair. Non-C++ users can grab a `protoc-$VERSION-$PLATFORM.zip` from [releases](https:\u002F\u002Fgithub.com\u002Fprotocolbuffers\u002Fprotobuf\u002Freleases), but C++ users must follow the [C++ build instructions](https:\u002F\u002Fgithub.com\u002Fprotocolbuffers\u002Fprotobuf\u002Fblob\u002Fmain\u002Fsrc\u002FREADME.md). Mixing versions between `protoc` and a runtime is a real failure mode, so pin both.\n\nOngoing upkeep matters more than initial setup. The README's support policy lives on a separate [version support page](https:\u002F\u002Fprotobuf.dev\u002Fversion-support\u002F), and the README warns that release branches can be unstable between release commits. If you vendor from main, expect occasional breakage; if you pin, plan the upgrade cadence yourself.\n\n## HotRepo's take\n\nHotRepo's only observations are 2026-10-24 and 2026-10-25, each showing +3 stars, on the daily board both days. That is two dated snapshots, not evidence of momentum either way; persistence cannot be judged from it. For a project this old, the decision is not about trend. Before committing, check the version support page for how long your chosen language runtime stays supported, since that, not popularity, determines your upgrade burden.",{"slug":37,"name":38},"developer-tools","Developer Tools",[40,41,42,43,44,45,46,47],"marshalling","protobuf","protobuf-runtime","protoc","protocol-buffers","protocol-compiler","rpc","serialization","NOASSERTION","http:\u002F\u002Fprotobuf.dev","2026-10-25T03:27:33Z",[52,55],{"date":53,"stars":54,"stars_gained":13},"2026-10-24",72128,{"date":56,"stars":11,"stars_gained":13},"2026-10-25",1792915056]