Skip to content
A BERT serializer and BERT-RPC client for .Net, written in F#
F# C# Other
Branch: develop
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

Issue Stats Issue Stats

Filbert (@FilbertFs)


Filbert is a simple BERT serializer and BERT-RPC client for .Net, written in F#. NuGet Status

What is BERT?

[BERT] ( is a flexible binary serialization format using the same encoding format as Erlang's [external term format] ( but supports only the following data types:

  • SMALL_INTEGER_EXT (tag 97) : unsigned 8-bit integer.
  • INTEGER_EXT (tag 98) : signed 32-bit integer in big-endian format (MSB first).
  • FLOAT_EXT (tag 99) : a float stored in scientific string format, e.g. .ToString("e20").
  • ATOM_EXT (tag 100) : an Erlang atom, the maximum allowed length for atom is 255.
  • SMALL_TUPLE_EXT (tag 104) : a tuple with up to 255 elements.
  • LARGE_TUPLE_EXT (tag 105) : same as SMALL_TUPLE_EXT but supports up to 4294967295 (uint.MaxValue) elements.
  • NIL_EXT (tag 106) : represents an empty list.
  • STRING_EXT (tag 107) : string does NOT have a corresponding Erlang representation, but is an optimization for sending lists of bytes, the maximum number of bytes in the string is 65534.
  • LIST_EXT (tag 108) : a list of elements of any type specified in this list, supports up to 4294967295 elements. For the sake of simplicity, Filbert does not support improper lists ([a|b]) right now.
  • BINARY_EXT (tag 109) : supports up to 4294967295 bytes.
  • SMALL_BIG_EXT (tag 110) : big integer up to +/- 255*256^254.
  • LARGE_BIG_EXT (tag 111) : big integer up to +/- 4294967295*256^4294967294!

In addition, BERT also specifies a number of complex types as tuples whose first item is the atom bert:

  • nil : { bert, nil }, the equivalent of null/nil in other languages. (Erlang associated the primitive nil with the empty array [] only)
  • boolean : { bert, true } or { bert, false } for true and false respectively.
  • dictionary : { bert, dict, [{name, <<"Yan">>}, {nick, theburningmonk}] }, a dictionary is represented as a tuple with 3 items - the atoms bert and dict followed by a list of 2 item tuples each representing a key-value pair.
  • time : { bert, time, 1255, 295581, 446228 }, equals to 1255 megaseconds (millions of secons) + 295581 seconds + 446228 microseconds (millionths of a second, or 10 ticks) since the Unix Epoch time (1970 Jan 1st).

How does it work?

Please see the [wiki page] ( for a quick tutorial on how to use Filbert.


Download and install Filbert using NuGet.

NuGet package


The default maintainer account for projects under "fsprojects" is @fsprojectsgit - F# Community Project Incubation Space (repo management)

You can’t perform that action at this time.