Skip to main content

gRPC Proto Linter

Lint your .proto files for naming conventions and best practices. Catches style violations that pass the compiler but break SDK generators, API design guides, and cross-team consistency. Runs entirely in your browser — nothing is sent to any server.

✓ Naming conventions ✓ Request/Response suffixes ✓ Field type suggestions ✓ Proto3 best practices ✓ Runs 100% in your browser

Frequently Asked Questions

What is the difference between a proto linter and a proto validator?▼

A validator checks that your .proto file is structurally correct — required fields, valid syntax, no duplicate field numbers. A linter checks code style, naming conventions, and best practices — things that compile fine but may cause issues with SDK generation, readability, or cross-team consistency. This linter focuses on style and conventions.

What naming conventions does this linter enforce?▼

Following Google's Protocol Buffer Style Guide: service and message names must be PascalCase (e.g. UserService, GetUserRequest), RPC method names must be PascalCase (e.g. GetUser, ListUsers), field names must be snake_case (e.g. user_id, created_at), and enum values must be SCREAMING_SNAKE_CASE prefixed with the enum type name (e.g. STATUS_ACTIVE for enum Status).

Why should RPC request types end with 'Request' and responses with 'Response'?▼

The Request/Response naming convention is a widely adopted best practice (used by Google's own APIs and buf.build's style guide). It makes it immediately clear which messages are input vs output, allows tools to auto-detect request/response pairs, and improves readability when many message types are defined in one file.

Why should repeated fields be plural?▼

A field like 'repeated string role' is ambiguous — is it one role or many? Using 'repeated string roles' makes the intent clear. This is a recommendation from Google's API design guide and adopted by most protobuf linting tools.

Why use google.protobuf.Timestamp instead of int64 for timestamps?▼

google.protobuf.Timestamp is a well-known type that maps to RFC 3339 timestamps in JSON, is timezone-aware, and works consistently across all language bindings. Using int64 forces consumers to decide whether it's milliseconds, seconds, or microseconds — a common source of bugs. Timestamp also provides clear semantics for tooling.

Why should enum values be prefixed with the enum type name?▼

In proto3, enum values share the namespace of the enclosing .proto file. If you have two enums that both define ACTIVE = 1, the compiler will complain. Prefixing (STATUS_ACTIVE, ROLE_ACTIVE) avoids these collisions. It also makes the value self-documenting when used outside the enum context.

Share this tool: X / Twitter LinkedIn
✓ 60,000+ developers use DevPlaybook ★★★★★ 4.8 / 5 on Gumroad ✓ MIT licensed · Instant download ✓ No login required

Related Products

on Gumroad

You Might Also Need

More Free Tools

Enjoying this tool? Get more like it.

Weekly developer tool guides, productivity playbooks & AI tricks. Free. No spam.

DevPlaybook Pro 7 days free

Unlock AI-Powered Dev Tools

  • ⚡ AI Code Review, Doc Generator & SQL Builder
  • ⚡ All premium templates & early access
  • ⚡ Member discounts on Gumroad products
Start Free Trial →

$9/mo after trial · Cancel anytime

Want the full toolkit?

Get DevPlaybook Pro

Every template, guide, boilerplate, and automation script in one bundle. 13 premium products — grab them all at once and save big.

$79
$241 separately Save $162 (67% off)
Get DevPlaybook Pro — $79 →

MIT licensed · Instant download · No subscription

See what's included → Browse all deals →