<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/protobuf-in-python-and-typescript-is-actually-good-now-lcdrka9bs" -->

---
title: Protobuf in Python and TypeScript is actually good now
description: Buf has rebuilt Protobuf and gRPC tooling from scratch for TypeScript and Python because the official Google libraries were poorly maintained ports of C++ and...
canonical: https://daily.dev/posts/protobuf-in-python-and-typescript-is-actually-good-now-lcdrka9bs
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Protobuf in Python and TypeScript is actually good now | daily.dev
og:description: Buf has rebuilt Protobuf and gRPC tooling from scratch for TypeScript and Python because the official Google libraries were poorly maintained ports of C++ and...
og:url: https://daily.dev/posts/protobuf-in-python-and-typescript-is-actually-good-now-lcdrka9bs
og:image: https://api.daily.dev/og/posts/lCdrKA9Bs.png
og:image:alt: Protobuf in Python and TypeScript is actually good now
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Protobuf in Python and TypeScript is actually good now

**[Buf Blog](https://daily.dev/sources/buf)** · 6 min read · 5 upvotes · 0 comments

## Summary

Buf has rebuilt Protobuf and gRPC tooling from scratch for TypeScript and Python because the official Google libraries were poorly maintained ports of C++ and Java code. For TypeScript, @bufbuild/protobuf generates plain objects with real TypeScript types and was the first JS/TS library to pass 100% of Google's Protobuf conformance suite. @connectrpc/connect lets RPCs run in the browser via fetch without a proxy. For Python, the new protobuf-py library generates normal classes with inline type annotations that work with pyright and mypy, and it passes the full conformance suite, something Google's own Python runtime still fails. connect-py pairs with it to expose RPC services as standard ASGI or WSGI apps, with async and sync clients powered by pyqwest.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://buf.build/blog/elevating-the-protobuf-ecosystem>

## Questions this post answers

### Why can't I mount a gRPC service inside FastAPI or Django using Google's grpcio library?

Google's grpcio library doesn't support WSGI or ASGI at all, so it can't be mounted inside frameworks like FastAPI or Django. An alternative is connect-py paired with protobuf-py, which exposes RPC services as standard ASGI or WSGI applications and offers both async (ElizaServiceClient) and sync (ElizaServiceClientSync) clients with streaming, interceptors, and compression support.

_If ASGI compatibility blocks your gRPC setup, daily.dev surfaces the Protobuf and Connect ecosystem updates addressing it._

### Why don't autocomplete and type checkers work with Python code generated by protoc from .proto files?

The generated _pb2.py files use metaclasses to create classes dynamically at module load time, so there's no readable class definition in the file, which breaks IDE autocomplete unless you configure --pyi_out to generate extra .pyi stub files. Quirks from C++, like map fields behaving like std::map instead of a Python dict, also leak through. An alternative, protobuf-py, generates normal Python classes with inline type annotations that work with pyright and mypy without extra flags or stub files.

_Developers fighting generated-code quirks can track Protobuf tooling fixes like this on daily.dev._

### Which TypeScript Protobuf library was the first to pass 100% of Google's Protobuf conformance test suite?

Protobuf-ES (@bufbuild/protobuf) was the first JS/TS library to pass 100% of Google's Protobuf conformance test suite. It generates messages as plain objects with standard TypeScript types instead of Java-style getter and setter methods, supports discriminated unions for oneof fields, and is written so bundlers can tree-shake unused schemas to reduce bundle size.

_Teams picking a Protobuf runtime for TypeScript can follow conformance and tooling comparisons like this on daily.dev._

## Similar posts on daily.dev

- [protobuf-py: Protobuf for Python, without compromises · Buf](https://daily.dev/posts/protobuf-py-protobuf-for-python-without-compromises-buf-twtgzw6ex) · Hacker News · 4 upvotes · 0 comments
- [The modern Protobuf workflow · Buf](https://daily.dev/posts/the-modern-protobuf-workflow-buf-c2m7gywhe) · Buf Blog · 1 upvotes · 0 comments
- [Medium](https://daily.dev/posts/medium-tabvj9lmr) · Medium · 0 upvotes · 0 comments
- [ConnectRPC: Generate Typed SDKs from Your GraphQL API](https://daily.dev/posts/connectrpc-generate-typed-sdks-from-your-graphql-api-cgx6z8ayk) · WunderGraph · 9 upvotes · 0 comments
- [gRPC-Web Failed the Web · Buf](https://daily.dev/posts/grpc-web-failed-the-web-buf-yxi6aoslo) · Buf Blog · 51 upvotes · 8 comments

---

Tags: [#python](https://daily.dev/tags/python), [#backend](https://daily.dev/tags/backend), [#typescript](https://daily.dev/tags/typescript), [#grpc](https://daily.dev/tags/grpc)

[View this post on daily.dev](https://daily.dev/posts/protobuf-in-python-and-typescript-is-actually-good-now-lcdrka9bs)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Protobuf in Python and TypeScript is actually good now","url":"https://daily.dev/posts/protobuf-in-python-and-typescript-is-actually-good-now-lcdrka9bs","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/protobuf-in-python-and-typescript-is-actually-good-now-lcdrka9bs"},"datePublished":"2026-10-26T17:41:39.854Z","dateModified":"2026-10-26T17:56:48.068Z","description":"Buf has rebuilt Protobuf and gRPC tooling from scratch for TypeScript and Python because the official Google libraries were poorly maintained ports of C++ and...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/3368917715c7944bf448e4760a0eba32?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/3368917715c7944bf448e4760a0eba32?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Buf Blog","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Buf Blog","logo":"https://media.daily.dev/image/upload/s--2YBgo_Nm--/f_auto,q_auto/v1787469605/logos/buf?_a=BAMAMicg0","url":"https://daily.dev/sources/buf"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/protobuf-in-python-and-typescript-is-actually-good-now-lcdrka9bs","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":5},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"python,backend,typescript,grpc","timeRequired":"PT6M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Buf Blog","item":"https://daily.dev/sources/buf"},{"@type":"ListItem","position":3,"name":"Protobuf in Python and TypeScript is actually good now"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/protobuf-in-python-and-typescript-is-actually-good-now-lcdrka9bs#faq","mainEntity":[{"@type":"Question","name":"Why can't I mount a gRPC service inside FastAPI or Django using Google's grpcio library?","acceptedAnswer":{"@type":"Answer","text":"Google's grpcio library doesn't support WSGI or ASGI at all, so it can't be mounted inside frameworks like FastAPI or Django. An alternative is connect-py paired with protobuf-py, which exposes RPC services as standard ASGI or WSGI applications and offers both async (ElizaServiceClient) and sync (ElizaServiceClientSync) clients with streaming, interceptors, and compression support. If ASGI compatibility blocks your gRPC setup, daily.dev surfaces the Protobuf and Connect ecosystem updates addressing it."}},{"@type":"Question","name":"Why don't autocomplete and type checkers work with Python code generated by protoc from .proto files?","acceptedAnswer":{"@type":"Answer","text":"The generated _pb2.py files use metaclasses to create classes dynamically at module load time, so there's no readable class definition in the file, which breaks IDE autocomplete unless you configure --pyi_out to generate extra .pyi stub files. Quirks from C++, like map fields behaving like std::map instead of a Python dict, also leak through. An alternative, protobuf-py, generates normal Python classes with inline type annotations that work with pyright and mypy without extra flags or stub files. Developers fighting generated-code quirks can track Protobuf tooling fixes like this on daily.dev."}},{"@type":"Question","name":"Which TypeScript Protobuf library was the first to pass 100% of Google's Protobuf conformance test suite?","acceptedAnswer":{"@type":"Answer","text":"Protobuf-ES (@bufbuild/protobuf) was the first JS/TS library to pass 100% of Google's Protobuf conformance test suite. It generates messages as plain objects with standard TypeScript types instead of Java-style getter and setter methods, supports discriminated unions for oneof fields, and is written so bundlers can tree-shake unused schemas to reduce bundle size. Teams picking a Protobuf runtime for TypeScript can follow conformance and tooling comparisons like this on daily.dev."}}]}
```

