Changes Announced on July 10, 2026
Edition 2026
We are planning to release Protobuf Editions to the open source project in 36.x in Q3 2026.
These describe changes as we anticipate them being implemented, but due to the flexible nature of software some of these changes may not land or may vary from how they are described in this topic.
More documentation on Edition 2026 will be published in Feature Settings for Editions, including the migration guide.
Changes to Existing Features
This section details any existing features whose edition_default will be changed in Edition 2026.
enforce_naming_style: STYLE2026
The enforce_naming_style feature default will be updated to STYLE2026 to
discourage common field naming collisions.
default_symbol_visibility: STRICT
https://protobuf.dev/programming-guides/symbol_visibility/
The default_symbol_visibility feature default will be updated to STRICT to
encourage explicit use of export and local keywords and to, by default,
disallow exporting nested types.
This feature encourages the best-practices defined in 1-1-1 Best Practice, which advocates for narrowly defined .proto files to limit dependency bloat.
New Features
This section details new features that will be introduced in Edition 2026.
JSON option: custom JSON string for values
Edition 2026 introduces a new JSON custom string option for enum values.
Prior to this release, we support custom keys using the json_name option. This
new option extends this behavior to values.
Renaming may be desirable for conflict avoidance, help in migrations, or to satisfy external requirements.
Sample usage:
enum FOO {
...
FOO_BAR = 5 [(pb.enumvalue.json).string = "custom_string_here"];
...
}
C++ option: namespace
Edition 2026 introduces the new namespace C++ option as a custom option to
explicitly set the generated bindings namespace.
This allows C++ developers to specify binding language packaging independent of the .proto package.
Use the new namespace C++ option as an example:
import option "google/protobuf/cpp_options.proto";
package clock.time;
option (pb.file.cpp).namespace = "clock_time";
C++ options: C++ custom options moved out from descriptor.proto
In Edition 2026, C++ language-specific options are moved from descriptor.proto
to separate custom option files.
To access these custom options for C++ in Edition 2026, import C++ language custom options from using ```protobuf import option “google/protobuf/cpp_features.proto”;
option features.(pb.cpp).repeated_type = PROXY
The proxy type returned follows STL container naming conventions.
Some methods currently available on `RepeatedPtrField`/`RepeatedField` will not
be available via proxies, such as `AddAllocated`/`ReleaseLast`,
data/mutable_data, `pointer_begin`/`pointer_end`, and `GetArena`.
Sample usage:
```cpp
// Before:
google::protobuf::RepeatedPtrField<MyMessage>* rpf = message.mutable_repeated_message();
MyMessage* element1 = rpf->Add();
const MyMessage& element2 = rpf->Get(0);
MyMessage* element3 = rpf->Mutable(1);
// After:
google::protobuf::RepeatedFieldProxy<MyMessage> rpf = message.mutable_repeated_message();
MyMessage& element1 = rpf.emplace_back();
const MyMessage& element2 = rpf.get(0);
MyMessage& element2 = rpf[0];
RepeatedFieldProxy has no public constructors (aside from a shallow copy
constructor). Proxies can only be backed by repeated fields within a message. To
aid with migration, we have introduced a new type, RepeatedFieldOrProxy, which
is implicitly convertible from either a RepeatedFieldProxy or a legacy
RepeatedPtrField/RepeatedField reference. It otherwise has an identical
interface to RepeatedFieldProxy.
C#: Add option and code generation for nullable reference types
Edition 2026 adds support for generating C# code that utilizes nullable reference types.
This feature is opt-in and satisfies existing external user requests.
Grammar Changes
There is no new or removed grammar in Edition 2026.