Need help with upb?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

1.1K Stars 201 Forks Other 1.7K Commits 13 Opened issues


a small protobuf implementation in C

Services available


Need anything else?

Contributors list

μpb - a small protobuf implementation in C

|Platform|Build Status| |--------|------------| |macOS|Build Status| |ubuntu|Build Status|

μpb (often written 'upb') is a small protobuf implementation written in C.

upb generates a C API for creating, parsing, and serializing messages as declared in

files. upb is heavily arena-based: all messages always live in an arena (note: the arena can live in stack or static memory if desired). Here is a simple example:
#include "conformance/conformance.upb.h"

void foo(const char* data, size_t size) { upb_arena *arena;

/* Generated message type. */ conformance_ConformanceRequest *request; conformance_ConformanceResponse *response;

arena = upb_arena_new(); request = conformance_ConformanceRequest_parse(data, size, arena); response = conformance_ConformanceResponse_new(arena);

switch (conformance_ConformanceRequest_payload_case(request)) { case conformance_ConformanceRequest_payload_protobuf_payload: { upb_strview payload = conformance_ConformanceRequest_protobuf_payload(request); // ... break; }

case conformance_ConformanceRequest_payload_NOT_SET:
  fprintf(stderr, "conformance_upb: Request didn't have payload.\n");

default: {
  static const char msg[] = "Unsupported input format.";
      response, upb_strview_make(msg, sizeof(msg)));


/* Frees all messages on the arena. */ upb_arena_free(arena); }

API and ABI are both subject to change! Please do not distribute as a shared library for this reason (for now at least).

Using upb in your project

Currently only Bazel is supported (CMake support is partial and incomplete but full CMake support is an eventual goal).

To use upb in your Bazel project, first add upb to your

file, either as a
or as a
with a Git Submodule. (For an example, see `examples/bazel/ in this repo).
# Add this to your WORKSPACE file.
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")

git_repository( name = "upb", remote = "", commit = "d16bf99ac4658793748cda3251226059892b3b7b", )

load("@upb//bazel:workspace_deps.bzl", "upb_deps")


Then in your BUILD file you can add

rules that generate code for a corresponding
rule. For example:
# Add this to your BUILD file.
load("@upb//bazel:upb_proto_library.bzl", "upb_proto_library")

proto_library( name = "foo_proto", srcs = ["foo.proto"], )

upb_proto_library( name = "foo_upbproto", deps = [":foo_proto"], )

cc_binary( name = "test_binary", srcs = ["test_binary.c"], deps = [":foo_upbproto"], )

Then in your

file you can #include the generated header:
#include "foo.upb.h"

/* Insert code that uses generated types. */

Lua bindings

This repo has some Lua bindings for the core library. These are experimental and very incomplete. These are currently included in order to validate that the C API is suitable for wrapping. As the project matures these Lua bindings may become publicly available.


Author: Josh Haberman ([email protected], [email protected])

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.