Protobuf .proto Check and Compatibility

Paste a .proto to list its messages, field numbers, types, labels, enums and rpcs, with issues such as duplicate or out-of-range numbers by line number. Paste an old and a new version to see changes that may break compatibility, such as a changed field number or type, apart from cautions and safe changes. Nothing leaves your browser.

On-device・No uploadMobile friendlyWorks offline

Your files and input are processed only inside your browser on this device and are never uploaded to our servers.

Before (old definition)
0 / 300,000
After (new definition)
0 / 300,000
Up to 300,000 characters per .proto. Press Ctrl (⌘) + Enter to compare.
Paste a .proto and press “Check definition” or “Compare” to see the result here.
Rules
  • Breaking change candidate A change that may break existing data or the code that reads it (a candidate).
  • Caution (compatible pair or rename) Compatible on the wire, but the value range or the name changes, so check it.
  • Safe change A change that existing data and reading code keep working with.

How to use

  1. Paste the old .proto in “Before (old definition)” and the new one in “After (new definition)”, or open a file with “Open file”. “Try a sample” also works.

  2. To check one definition, press “Check definition” (it reads the left pane). To compare two, press “Compare” (or Ctrl / ⌘ + Enter).

  3. The check lists messages, fields (number, type and label), enums, services and rpcs, with issues by line. The comparison shows breaking change candidates, cautions and safe changes.

  4. Use “Copy Markdown” to paste a table into a pull request description, or “Save JSON” to keep the verdict, counts and changes.

What it does

Definition list

Reads package, import, nested message, enum, oneof, map, service and rpc (stream), and lists each field with its number, type and label.

Issues by line number

Shows numbers outside 1 to 536870911, the reserved 19000 to 19999 range, duplicate numbers or names, reused reserved numbers, the first value of a proto3 enum and undefined types, each with its line.

Compatibility groups

Changed field numbers, reused numbers, type and label changes, and removed fields not marked reserved are breaking candidates. Compatible pairs such as int32 and int64 are cautions.

A reason on every row

Each row says which rule put it in its group. The rules are on the page, so the basis can be used in a review.

Runs only in your browser

The .proto is not sent anywhere and is analysed inside your browser. Imported files are never fetched.

Use cases

  • Check a pull request that edits a .proto for changed field numbers or types
  • Confirm that a removed field was reserved, using the list
  • Find duplicate or out-of-range numbers and reused reserved numbers by line before generating code
  • Compare internal .proto definitions without sending them outside

Supported formats

Input

.proto (proto2, proto3, editions)with or without the syntax or edition lineUTF-8 (with or without BOM)

Output

On-screen lists (definitions, issues, changes)Markdown (table for a pull request)JSON (verdict, counts and changes)

Capability matrix

FeatureSupportNotes
Reading .proto with the syntax or edition line for proto2, proto3 and editionsSupported—
Lists of package, import, nested message, enum, oneof, map, service and rpc (stream)Supported—
Field number, type and label (optional, repeated, map) for each fieldSupported—
Issues: number range, reserved numbers, duplicates, reused reserved numbers, proto3 enums, duplicate names, undefined typesSupportedNot identical to protoc checks. These are the issues this tool reads
Comparing numbers, types, labels, removals, reserved, enums and rpcsSupportedJudged by wire compatibility in general. Stored data and the code that reads it are not known
extend and proto2 groupPartialextend is skipped with a note. A group is shown as a line that cannot be read
Moving fields between oneofs, and option valuesNot supportedNot compared
Checking imported files or the types they defineNot supportedNot fetched. Types from an import are noted as not checked
Decoding binary data (use the binary data tool)Not supported—
Code generation or running protocNot supported—
Offline useSupportedWorks without a connection once the page has loaded

Limits & notes

  • Up to 300,000 characters per .proto. Files up to 1 MB.
  • Lists and issues count every item, then show them on the screen.
  • The verdict follows general compatibility practice. Each API may have its own policy.

Privacy & safety

The .proto is analysed only inside your browser. Nothing is sent or stored, and closing the page discards it. Analytics only record that a run happened, with no content or counts.

FAQ

What happens if I change a field number?
Protobuf reads data by field number, so existing data is no longer read correctly after a change. Reusing a removed number for another field can also corrupt data.
Is changing int32 to int64 safe?
int32, uint32, int64, uint64 and bool are treated as a compatible group on the wire, so the tool shows it as a caution. The range of values changes, so check the code that reads it. sint32 and sint64, fixed32 and sfixed32, fixed64 and sfixed64, string and bytes, and an enum and an integer type are cautions too.
How should I handle a removed field?
Write its number and name in reserved so that they cannot be reused. A removed field that is reserved is shown as a safe change.
Can it check types from imported files?
No. Imported files are not fetched, so their types are noted as not checked. Paste the related files together to check them more easily.
Can it read binary data?
No. The tool reads only the .proto definition. Use the binary data tool for binary data. It does not generate code either.

Schema Codegen — JSON to Types & Schema

Paste sample JSON, a JSON Schema or an OpenAPI document to get type definitions in 10 formats. Put several samples in a row to infer optional keys and unions. Your data never leaves your device.

No upload

Binary Data Studio (Hex Viewer)

Drop a file to open it as a hex dump with offsets, hex bytes and a text column. Only the visible rows are read, so even multi-gigabyte files open without freezing, and nothing leaves your device. Search, value interpretation, compare and export are on the same screen.

No upload

OpenAPI Diff (Breaking Change Checker)

Paste the old and new OpenAPI (or Swagger 2.0) definitions to list the changes that break clients: removed paths, newly required fields, type changes and more. Each change is sorted into breaking, caution or non-breaking, with the reason on its row. Nothing leaves your browser.

No upload

AsyncAPI Check and Event API Diff

Paste AsyncAPI YAML or JSON to list its servers, channels, operations and messages, with issues such as unresolved $ref and unused components by line number. Paste an old and a new version to see candidates such as removed channels or operations, and removed or newly required payload properties. Nothing leaves your browser.

No upload

GraphQL Schema Check and Breaking Changes

Paste a GraphQL SDL schema (schema.graphql) to list its types, fields and arguments, with issues such as undefined types by line number. Paste an old and a new schema to see breaking change candidates, such as removed fields or newly required arguments, apart from safe changes. Nothing leaves your browser.

No upload

Diff Tool — Text & Code Compare

Paste or drop two versions and see added and removed lines, plus the exact words that changed inside each line. Copy or save the result as a unified patch. Nothing leaves your browser.

No upload

Last updated: