A lens-based implementation of protocol buffers in Haskell.

Version on this page:
LTS Haskell 22.29:
Stackage Nightly 2024-07-20:
Latest on Hackage:

See all snapshots proto-lens appears in

The proto-lens library provides an API for protocol buffers using modern Haskell language and library patterns. Specifically, it provides:

  • Composable field accessors via lenses

  • Simple field name resolution/overloading via type-level literals

  • Type-safe reflection and encoding/decoding of messages via GADTs


Changelog for proto-lens


  • Support GHC 9.4


  • Relax upper bounds for ghc-9.2


  • Support GHC 9.0.
  • Fixed parsing of UTF8 chars in text format proto string literals.
  • Support all valid text format boolean field values
  • Remove redundant (.&. 127) from putVarInt (#396)


  • Support GHC 8.10.
  • Add a method to Data.ProtoLens.Message for getting the DescriptorProto of a given message. For a simpler API, see Data.ProtoLens.Descriptor from proto-lens-protobuf-types.
  • Bump ghc-source-gen to version
  • Bump upper bound to allow base-4.14.
  • Bump upper bound to allow ghc-prim-0.6.


Breaking Changes

  • Bump lower bounds to base-4.10 (ghc-8.2).
  • Move Proto.Google.Protobuf.Descriptor and Proto.Google.Protobuf.Compiler.Plugin to the proto-lens-protobuf-types package.

Backwards-Compatible Changes

  • Bump upper bound to allow profunctors-5.5.
  • Support dependencies on base-4.13 (ghc-8.8) and lens-family-2.0.


  • Add decodeMessageDelimitedH to decode delimited messages from a file handle (#61).


  • Bump the upper bound on profunctors to allow 5.4.
  • Bump the upper bound on primitive to allow 0.7.
  • Allow text format protobuf strings to contain unescaped quote characters different from the delimiters (#320).

Breaking Changes

  • Merge the lens-labels library into proto-lens:
    • Lens.Labels => Data.ProtoLens.Fields
    • Lens.Labels.Unwrapped => Data.ProtoLens.Labels
    • Lens.Labels.Prism => Data.ProtoLens.Prism
  • Simplify the API of Data.ProtoLens.Encoding.Wire, using a plain ADT rather than a GADT to represent unknown field values.
  • If fields have the wrong wire type, store them in unknownFields rather than failing the parse. (#125)

Backwards-Compatible Changes

  • Merge proto-lens-combinators into the proto-lens library.
  • Use generated Haskell code to encode/decode proto messages more quickly. In particular:
    • Add the methods parseMessage and buildMessage to Data.ProtoLens.Message
    • Expose an opaque Parser monad, which is used by the generated code.
    • Expose the module Data.ProtoLens.Encoding.Bytes, which is used by the generated code.
    • Various other, related performance optimizations.
  • Add functionality for storing unknown fields as Vectors. (See the changelog of proto-lens-protoc for more details.) Exposes the Growing type for mutable vectors of growing capacity.
  • Export the new function parseMessageDelimited. (#61)


  • Bump the dependencies on base and containers to


  • Don’t use data-default for default proto values (#194).
  • Update the proto descriptors to protobuf-3.6.1.
  • Use simplified lens-labels instances. (#208)


  • Bump the lower bound on base to indicate we require ghc>=8.0.


  • Improve references to types/fields in decoding error messages (#187).
  • Bump the dependency on base for ghc-8.4.2.
  • Make Registry an instance of Semigroup.


  • Remove support for ghc-7.10. (#136)
  • Use a .cabal file that’s auto-generated from hpack. (#138)
  • Add buildMessageDelimited: size-delimited streams of Messages (#102)
  • Add support for parsing Any messages in google protobuf text format (#124)
  • Use the Tag newtype consistently. (#127)
  • Add support for tracking unknown fields. (#129)
  • Improve an error message. (#132)
  • Bundle enum pattern synonyms with their type. (#136)
  • Implement proto3-style “open” enums. (#137)
  • Consolidate proto-lens-descriptors into proto-lens. (#140)
  • Split the Message class into separate methods. (#139)
  • Improve an error message when decoding Anys. (#146)
  • Refactor the `FieldDescriptorType. (#147)
  • Improve text format error messages. (#148)
  • Add module Data.ProtoLens.Service.Types. (#154)
  • Add Haddock comments to fields. (#172)


  • Bump the dependency on base to support ghc-8.2.1.


  • Include base’s modules in the reexport list.
  • Use custom-setup in packages that depend on proto-lens-protoc.
  • Allow .proto files to import between Haskell packages.
  • Add the proto-lens-protobuf-types package.


  • Make the libraries ‘-Wall -Werror’-clean for the latest version of GHC.


  • Support OverloadedLabels with the new lens-labels package.
  • Fix codegen for field names that are already camel-cased.
  • Increase version bounds to work with Stackage lts-8.


  • Fix the handling of packed repeated fields (#38)
  • Improve space usage and time of decoding (#63)
  • Print fields ordered by tag number (#40)


  • Relaxed dependency constraints on data-default-class for new stackage LTS.


  • In printing and parsing protocol buffers use/interpret escape sequences in a way compatible with the Protocol Buffer distribution’s C/C++ escaping style, closing Issues #44 and #45. This makes the text output incompatible with previous versions; earlier versions will misinterpret text written by this version and this version will misinterpret text written by previous versions.
  • Support reading text protocol buffers with single quote characters (’) for string delimiters, closing Issue #20.


  • Expose more of protoc-gen-haskell to plugins.
  • Support enum aliases.
  • TextFormat prints enum names instead of numbers.


  • Support ghc-8.
  • Handle .proto files without a “package” declaration (#11).


  • Initial version.