<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/a-faster-protovalidate-buf-skhp41uy2" -->

---
title: A faster Protovalidate · Buf | daily.dev
description: Protovalidate's Go, Java, and TypeScript implementations now run standard validation rules as native code instead of interpreting CEL expressions, delivering...
canonical: https://daily.dev/posts/a-faster-protovalidate-buf-skhp41uy2
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: A faster Protovalidate · Buf | daily.dev
og:description: Protovalidate's Go, Java, and TypeScript implementations now run standard validation rules as native code instead of interpreting CEL expressions, delivering...
og:url: https://daily.dev/posts/a-faster-protovalidate-buf-skhp41uy2
og:image: https://api.daily.dev/og/posts/SKhP41UY2.png
og:image:alt: A faster Protovalidate · Buf
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.

# A faster Protovalidate · Buf

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

## Summary

Protovalidate's Go, Java, and TypeScript implementations now run standard validation rules as native code instead of interpreting CEL expressions, delivering roughly 3x (Go), 10x (Java), and 13x (TypeScript) speedups. protovalidate-py 2.0 goes further, replacing its pure-Python CEL interpreter with a native extension wrapping the C++ implementation (protovalidate-cc), making a complex-schema benchmark 485x faster and dropping latency from 36ms to 75 microseconds. Native rules are enabled by default in Go, Java, and TypeScript with an opt-out flag; unsupported and custom rules still fall back to CEL. protovalidate-py also renames its repository, switches to the protobuf-py runtime, and ships prebuilt wheels requiring no C++/Rust toolchain. Python and C++ implementations still use CEL for all rules for now, with fully native rule evaluation planned next.

## Full article

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

## Questions this post answers

### How much faster is protovalidate-go v1.4.0 compared to the older CEL-based validation?

Native rule evaluation in protovalidate-go is roughly 3x faster than the CEL path. Native rules are enabled by default starting in protovalidate-go v1.3.0, and allocations drop to zero in simple scalar cases; the WithDisableNativeRules option restores the old CEL-based behavior if needed.

_Track protobuf tooling upgrades like this on daily.dev before they surprise you in a build._

### What changed in protovalidate-py 2.0 that makes validation so much faster?

protovalidate-py 2.0 replaces its pure-Python CEL interpreter with a native extension built around protovalidate-cc, the C++ implementation. A complex-schema validation that took 36 milliseconds per message in v1 now takes about 75 microseconds, a roughly 485x improvement, and installation requires no C++ or Rust toolchain since prebuilt wheels are provided.

_Developers planning a protovalidate-py upgrade can follow releases like this on daily.dev._

### What do I need to know before upgrading protovalidate-py from 1.x to 2.0?

The package now uses protobuf-py instead of google.protobuf as its primary runtime, so Violation messages returned by the library are protobuf-py messages, nested messages can be None instead of auto-becoming empty messages, and JSON serialization uses protobuf-py's API. The repository was renamed to protovalidate-py, though the PyPI package name stays protovalidate and old URLs redirect automatically.

_Teams migrating Python validation libraries can watch for breaking changes like this via daily.dev._

## Community discussion

Top comments from developers on daily.dev.

**@trevorsuna** · 1 upvotes

> Moving standard rules from interpreted CEL to native paths is a huge gain, especially the Python jump. The safety net should be cross-language conformance tests that run native and fallback evaluation on the same corpus, so an optimization never changes validation behavior silently when custom or unsupported rules are mixed in.

## Similar posts on daily.dev

- [Protobuf-ES just got a lot faster · Buf](https://daily.dev/posts/protobuf-es-just-got-a-lot-faster-buf-rcovndatq) · Buf Blog · 18 upvotes · 1 comments
- [Protobuf, JSON Schema, and OpenAPI · Buf](https://daily.dev/posts/protobuf-json-schema-and-openapi-buf-00wgyenfv) · Buf Blog · 7 upvotes · 0 comments
- [protobuf-py: Protobuf for Python, without compromises · Buf](https://daily.dev/posts/protobuf-py-protobuf-for-python-without-compromises-buf-twtgzw6ex) · Hacker News · 3 upvotes · 0 comments
- [Google Protocol Buffers flaw turns schemas into shells](https://daily.dev/posts/google-protocol-buffers-flaw-turns-schemas-into-shells-ssmnskxpa) · CSO Online · 8 upvotes · 0 comments
- [Valibot v1.5: Faster schema construction, Unicode code points, and stricter validation](https://daily.dev/posts/valibot-v1-5-faster-schema-construction-unicode-code-points-and-stricter-validation-fcqzm9kyo) · Valibot: The modular and type safe schema library · 5 upvotes · 1 comments

---

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

[View this post on daily.dev](https://daily.dev/posts/a-faster-protovalidate-buf-skhp41uy2)

```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":"A faster Protovalidate · Buf","url":"https://daily.dev/posts/a-faster-protovalidate-buf-skhp41uy2","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/a-faster-protovalidate-buf-skhp41uy2"},"datePublished":"2026-09-17T13:45:38.715Z","dateModified":"2026-09-17T13:53:09.548Z","description":"Protovalidate's Go, Java, and TypeScript implementations now run standard validation rules as native code instead of interpreting CEL expressions, delivering...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/6a6eb25542d039cf6c1718399d38a97e?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/6a6eb25542d039cf6c1718399d38a97e?_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":1,"discussionUrl":"https://daily.dev/posts/a-faster-protovalidate-buf-skhp41uy2","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":15},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":1}],"keywords":"python,performance,backend,golang","timeRequired":"PT5M"}
{"@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":"A faster Protovalidate · Buf"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/a-faster-protovalidate-buf-skhp41uy2","comment":[{"@type":"Comment","text":"Moving standard rules from interpreted CEL to native paths is a huge gain, especially the Python jump. The safety net should be cross-language conformance tests that run native and fallback evaluation on the same corpus, so an optimization never changes validation behavior silently when custom or unsupported rules are mixed in.","datePublished":"2026-09-20T09:14:46.175Z","url":"https://daily.dev/posts/SKhP41UY2#c-reJRMoNIi","author":{"@type":"Person","name":"Trevor Suna","url":"https://daily.dev/trevorsuna","image":"https://media.daily.dev/image/upload/s--dZ7gXxpp--/f_auto/v1784081551/avatars/avatar_EMoP47rpuw8DNjhp6R1b6?_a=BAMAMicg0"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/a-faster-protovalidate-buf-skhp41uy2#faq","mainEntity":[{"@type":"Question","name":"How much faster is protovalidate-go v1.4.0 compared to the older CEL-based validation?","acceptedAnswer":{"@type":"Answer","text":"Native rule evaluation in protovalidate-go is roughly 3x faster than the CEL path. Native rules are enabled by default starting in protovalidate-go v1.3.0, and allocations drop to zero in simple scalar cases; the WithDisableNativeRules option restores the old CEL-based behavior if needed. Track protobuf tooling upgrades like this on daily.dev before they surprise you in a build."}},{"@type":"Question","name":"What changed in protovalidate-py 2.0 that makes validation so much faster?","acceptedAnswer":{"@type":"Answer","text":"protovalidate-py 2.0 replaces its pure-Python CEL interpreter with a native extension built around protovalidate-cc, the C++ implementation. A complex-schema validation that took 36 milliseconds per message in v1 now takes about 75 microseconds, a roughly 485x improvement, and installation requires no C++ or Rust toolchain since prebuilt wheels are provided. Developers planning a protovalidate-py upgrade can follow releases like this on daily.dev."}},{"@type":"Question","name":"What do I need to know before upgrading protovalidate-py from 1.x to 2.0?","acceptedAnswer":{"@type":"Answer","text":"The package now uses protobuf-py instead of google.protobuf as its primary runtime, so Violation messages returned by the library are protobuf-py messages, nested messages can be None instead of auto-becoming empty messages, and JSON serialization uses protobuf-py's API. The repository was renamed to protovalidate-py, though the PyPI package name stays protovalidate and old URLs redirect automatically. Teams migrating Python validation libraries can watch for breaking changes like this via daily.dev."}}]}
```

