惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
Spread Privacy
Spread Privacy
T
Threatpost
C
Cisco Blogs
P
Palo Alto Networks Blog
AI
AI
Cyberwarzone
Cyberwarzone
NISL@THU
NISL@THU
P
Privacy & Cybersecurity Law Blog
G
GRAHAM CLULEY
Simon Willison's Weblog
Simon Willison's Weblog
T
Tor Project blog
Latest news
Latest news
AWS News Blog
AWS News Blog
D
Docker
S
SegmentFault 最新的问题
博客园 - 聂微东
WordPress大学
WordPress大学
Vercel News
Vercel News
S
Securelist
爱范儿
爱范儿
J
Java Code Geeks
Know Your Adversary
Know Your Adversary
S
Schneier on Security
Hugging Face - Blog
Hugging Face - Blog
F
Fortinet All Blogs
Last Week in AI
Last Week in AI
D
DataBreaches.Net
宝玉的分享
宝玉的分享
D
Darknet – Hacking Tools, Hacker News & Cyber Security
MongoDB | Blog
MongoDB | Blog
Engineering at Meta
Engineering at Meta
K
Kaspersky official blog
美团技术团队
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
量子位
博客园_首页
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
Google Online Security Blog
Google Online Security Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
腾讯CDC
T
Threat Research - Cisco Blogs
雷峰网
雷峰网
有赞技术团队
有赞技术团队
www.infosecurity-magazine.com
www.infosecurity-magazine.com
P
Privacy International News Feed
S
Security Affairs

kmcd.dev

gRPC-Web Should Have Fixed gRPC Making Dynamic Protobuf Fast in Go Proxy, Record, and Mock gRPC APIs with FauxRPC Exploring Protocol Buffers Interactively Ghost in the Shell: The Manga Behind the Anime The Hidden Cost of google.protobuf.Value Why Networking Built Its Own Data Modeling Language Zero-Friction Demos with WASM Let's Learn About BGP ConnectRPC: Where is it now? Building APIs with Contracts The Case for Greppable Code Unknown Fields in Protobuf IRC Log: Reactionary Faking protobuf data in Go Y'all are Sleeping on Mise-en-Place IRC Log: Standup 2 HTTP/2 From Scratch: Part 4 IRC Log: rm -rf /var/opt/gitlab/postgresql/data HTTP/2 From Scratch: Part 3 Building a Live BGP Map HTTP/2 From Scratch: Part 2 IRC Log: The Cloud Scale Incident Visualizing the Internet (2026) Shell Log: Namaste HTTP/2 From Scratch: Part 1 IRC Log: Standup HTTP/1.1 From Scratch WHOIS is dead, long live RDAP Months Considered Harmful Encryption vs. Compression On Creating My Own Cover Art Traceroute Tool from Scratch in Go My Favorite Interview Question From JSON to Protobuf Breaking gRPC Morse Code Can You Hack a Phone with Your Voice? Visualizing the Internet (2025) HTTP QUERY and Go I made a daily word game Protovalidate: Can Input Validation Be This Easy? Behold! The Barcode Scanner Mixing CEL and Protobuf for Fun FauxRPC and Protovalidate The Call of the Monolithic Codebase FauxRPC + Test Containers Self-Documenting Connect Services gRPC Over HTTP/3: Followup JSON to Protobuf Conversion gRPC: The Ugly Parts Working with Protobuf in 2024 Introducing FauxRPC HTTP/1.0 From Scratch Y'all are sleeping on HTTP/3 HTTP/0.9 From Scratch What version of HTTP are you using? Texans in Denmark gRPC Over HTTP/3 gRPC: The Good Parts Leaving Texas for Greener Pastures gRPC: The Bad Parts Unit Testing ConnectRPC Servers Daily Prompts Adding chart.js to Hugo Why I'm Rebranding Benchmarking gRPC (golang) Blog Update gRPC From Scratch: Part 3 - Protobuf Encoding Tracking the Wins Visualizing the Internet (2024) Dropping Unknown Fields in ConnectRPC RESTless: Web APIs After REST Introducing unknownconnect-go Making gRPC more approachable with ConnectRPC Inspecting Protobuf Messages Introducing protoc-gen-connect-openapi gRPC From Scratch: Part 2 - Server gRPC From Scratch: Part 1 - Client Why you should use gNMI over SNMP in 2026 The Rollercoaster of Productivity in Side Projects Lessons from a Decades-Long Project How I learned to code Economists with (virtual) Guns Visualizing the Internet (2023) softlayer-python: language bindings/CLI for a cloud company SwFTP: SFTP/FTP Server For Openstack Swift Video: Morning Copenhagen Commute Goodbye Evepraisal Visualizing the spectrum of the sun (Part 2) Visualizing the Internet (2022) Evepraisal: A price estimation tool for Eve Online Visualizing the spectrum of the sun
Introducing ProtoDocs
2026-06-23 · via kmcd.dev

Protocol Buffers are fantastic for defining API contracts. They give you a massive ecosystem of tooling, backward compatibility guarantees, and rock-solid schemas. But if you have ever tried sharing protobuf docs with an API consumer, you know the generated documentation story usually feels like a complete afterthought.

Most tooling forces you into a frustrating compromise. You either get docs that are technically complete but too ugly to send to others, or you get something pretty that requires a mountain of custom templates, glue code, and endless project-specific maintenance. Or you just share the protobuf files, which is also not amazing.

That frustration is exactly why I originally built protoc-gen-connect-openapi. The OpenAPI ecosystem has tools like Redocly and Swagger UI that give you beautiful, browsable websites out of the box. Translating Connect APIs into OpenAPI made sense at the time, but it solved the problem in a round-about way. I will say that it works remarkably well, but I wanted a tool that starts from protobuf, keeps the schema front and center, and still looks polished enough to publish.

So I made ProtoDocs.

A screenshot of the ProtoDocs interface showing protobuf files, services, messages, and RPC calls.

A screenshot of the ProtoDocs interface showing protobuf files, services, messages, and RPC calls.

Protobuf-first documentation

ProtoDocs is a web-based documentation browser for Protocol Buffer definitions. It is built around protobuf concepts directly: files, packages, services, RPCs, messages, enums, fields, oneofs, options, and comments.

What does “protobuf-first” actually mean? It means the tool is not ashamed of the raw protobuf source. Personally, I think protobuf schemas are pretty clean, expressive, and highly readable, which is something I definitely can’t say for the verbose, nested JSON/YAML of OpenAPI. Instead of hiding the schemas behind abstract templates, ProtoDocs leans into the source code itself. It renders the actual protobuf syntax directly (complete with syntax highlighting), but overlays it with rich, interactive tooltips on everything, from keywords and field names to type references and custom options, making it easy to navigate and learn as you browse.

Fun fact: the configuration of ProtoDocs itself is defined as a Protocol Buffer schema. That means ProtoDocs is self-documenting. You can browse the official configuration options directly on protodocs.dev, which is a pretty fun way to showcase the tool.

The main goal is simple: make protobuf documentation pretty, navigable, and useful without turning it into a completely different API description format first.

What it does

ProtoDocs gives you a documentation UI that lets you explore the API from a few different angles:

  • Browse files and packages through a clean directory hierarchy that merges common path prefixes, making large proto trees easier to scan.
  • Inspect services and RPC methods, including unary and streaming signatures, alongside custom method options.
  • Drill into messages, enums, custom options, oneof declarations, nested types, comments, and linked type references.
  • Jump to definitions and find references across the loaded files. Type tooltips can be pinned, allowing you to move from a field to the type declaration or see where a type is used without losing your place.
  • Interactive “Try it out” panel for sending live Connect, gRPC-Web, and proxied gRPC requests (including streaming calls) directly to target RPC services from the browser.
  • Websocket-based proxy to tunnel browser requests and streaming calls, avoiding CORS restrictions and enabling direct connection to your services.
  • Syntax highlighting and interactive help for the underlying protobuf source code, rendering it cleanly and adding keyword tooltips that explain what they do.
  • Multiple schema loading options including serving pre-built descriptor set files (e.g. from buf or protoc), querying live servers using reflection, or reading directly from an in-memory Go registry for embedded usage.

As you edit input parameters in the client panel, ProtoDocs also generates command snippets for Connect, grpcurl, and buf curl, serving as a bridge from browser exploration to reproducible terminal commands.

Built for Connect, but not only Connect

ProtoDocs is heavily designed around ConnectRPC servers.

That is where the experience feels the most natural to me, because a Connect server can expose the Connect protocol, gRPC, and gRPC-Web from the exact same API surface. ProtoDocs leverages that to provide browser-native exploration while staying close to the real RPC contract.

The interactive client supports:

  • Connect
  • gRPC-Web
  • gRPC through proxy mode

The documentation side is protobuf-first, so the schema browsing makes sense anywhere you have protobuf descriptors. The richer interactive path is where ConnectRPC servers truly shine.

A screenshot showing that you can make requests, similar to swagger.

A screenshot showing that you can make requests, similar to swagger.

Three ways to run it

There are three primary ways to deploy ProtoDocs:

  • Static Website
  • With a backend
  • Embedded into Go applications

All three of these approaches have strengths and weaknesses, so let’s dig into how this works:

Static website

ProtoDocs can be hosted as a static site. Put the built frontend on Nginx, S3, Netlify, GitHub Pages, or any other static host, point it at one or more descriptor files, and you have browsable protobuf documentation.

This mode is the simplest deployment. The browser talks directly to your target API server for interactive requests, so your API server needs CORS configured if you want the “Try it out!” panel to work.

D2 Diagram

Website with a small backend

ProtoDocs can also run with a small backend proxy.

In this mode, browser requests and streaming calls tunnel through the proxy. That avoids CORS problems and lets the backend forward requests to gRPC, gRPC-Web, or Connect services.

D2 Diagram

I expect this mode to be the most useful for internal tools and developer portals where “open the docs and call the API” needs to work out of the box.

Embedded Go handler

ProtoDocs can be embedded directly into a Go HTTP server.

This gives you the documentation UI, descriptor loading from the Go registry, and the proxy path all from the same application. If you already have a Go service exposing Connect or gRPC handlers, mounting ProtoDocs alongside it makes the service self-documenting without requiring a separate docs deployment.

At a high level, it looks like this:

handler, err := protodocs.NewHandler(protodocs.Config{
    Title:    "My Service Documentation",
    LogoText: "My Service",
    Registry: protoregistry.GlobalFiles,
    Prefix:   "/docs/",
})
if err != nil {
    log.Fatal(err)
}

http.Handle("/docs/", handler)

Themes, source, and sharp edges

ProtoDocs has light, dark, and cyberpunk themes. They can follow system preferences or be toggled manually.

It can render source views, markdown comments, structured options, package trees, service lists, search results, and linked type details. The idea is to make the source schema readable without forcing people to clone a repo, find the right proto directory, and mentally resolve every import by hand.

It is also still early days.

There are bugs. There are parts of the UI and runtime behavior that will inevitably change as the project gets more real-world use.

But it is far enough along that I want people to try it, complain about what is confusing, and show me the protobuf schemas that break it. If you run into any sharp edges, have feedback on how to improve the layout, or want to contribute a fix, please head over to GitHub to open an issue or submit a PR!

Try it

You can try the live demo at protodocs.dev.

A protobuf-first documentation browser for APIs that deserve better than ugly generated docs.

If you have a ConnectRPC, gRPC-Web, or descriptor-heavy protobuf project, I would love for you to point ProtoDocs at it and see where it falls over.