# 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.

- URL: https://tools.itlibra.com/en/protobuf-studio
- On-device・No upload
- Last updated: 2026-10-31

## 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.

## 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

## 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.


## Supported formats

### Input

- .proto (proto2, proto3, editions)
- with or without the syntax or edition line
- UTF-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

| Feature | Support | Notes |
| --- | --- | --- |
| Reading .proto with the syntax or edition line for proto2, proto3 and editions | Supported | — |
| Lists of package, import, nested message, enum, oneof, map, service and rpc (stream) | Supported | — |
| Field number, type and label (optional, repeated, map) for each field | Supported | — |
| Issues: number range, reserved numbers, duplicates, reused reserved numbers, proto3 enums, duplicate names, undefined types | Supported | Not identical to protoc checks. These are the issues this tool reads |
| Comparing numbers, types, labels, removals, reserved, enums and rpcs | Supported | Judged by wire compatibility in general. Stored data and the code that reads it are not known |
| extend and proto2 group | Partial | extend is skipped with a note. A group is shown as a line that cannot be read |
| Moving fields between oneofs, and option values | Not supported | Not compared |
| Checking imported files or the types they define | Not supported | Not fetched. Types from an import are noted as not checked |
| Decoding binary data (use the binary data tool) | Not supported | — |
| Code generation or running protoc | Not supported | — |
| Offline use | Supported | Works 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.
