The project's README from github.com/pantoniou/libfyaml. As one markdown file: README.md.
libfyaml is a high-performance YAML 1.2 and JSON parser/emitter with zero-copy operation, full document and event APIs, and the two major 1.0 features:
The 1.0 series adds a clear progression:
1.0.0-beta2 is a correctness and portability release. It adds no new API.
The linker interface version moves to 8:1:6: the interfaces are unchanged.
The center of the generic API is fy_generic.
fy_generic is the sum-type value used to represent YAML and JSON data in C.
It carries one runtime value of one type: null, bool, int, float, string,
sequence, mapping, or YAML-specific wrappers.
It is a single pointer-sized word with inline storage for common small values, including 61-bit signed integers on 64-bit builds, short strings, and inline 32-bit floats.
The rest of the generic API is about working with fy_generic values:
fy_generic values from C literals or parsed inputfy_generic into anotherThat gives C a Python-like data model:
fy_generic valuesfy_value(), fy_sequence(), and fy_mapping()If you know Python dict / list workflows, serde_json::Value,
tagged unions, or other sum-type/value-tree APIs, generics are the direct fit.
The reflection subsystem provides schema-driven typed serdes:
Reflection is the typed layer for stable C data models.
The Python binding in python-libfyaml/ is built on the
generic runtime. It is a direct bridge into the C generics API:
FyGeneric lazy wrappers mirror C fy_generic valuesSee the binding reference at
python-libfyaml/docs/API.md.
Choose the core library when you need:
Choose generics when you need:
Choose reflection when you need:
#include <libfyaml/libfyaml-generic.h>
fy_generic config = fy_mapping(
"server", fy_mapping(
"host", "localhost",
"port", 8080,
"tls", true),
"features", fy_sequence("http", "metrics", "admin"));
fy_generic doc = fy_parse(
"values: [1, 2, 3, 4]",
FYOPPF_DISABLE_DIRECTORY | FYOPPF_INPUT_TYPE_STRING,
NULL);
fy_generic values = fy_get(doc, "values", fy_invalid);
fy_generic first = fy_first(values);
#include <libfyaml/libfyaml-reflection.h>
struct fy_reflection *rfl = fy_reflection_from_c_file_with_cflags(
"schema.h", "", false, true, NULL);
struct fy_type_context_cfg cfg = {
.rfl = rfl,
.entry_type = "struct app_config",
};
struct fy_type_context *ctx = fy_type_context_create(&cfg);
Start with these pages:
doc/generics-guide.rst: value model, schemas, lifetimesdoc/reflection-guide.rst: typed serdes, libclang, packed blobsReference pages:
The refreshed examples directory now covers the new alpha workflows:
See examples/README.md for the full list.
libfyaml also remains:
libfyaml is built and tested on these platforms:
| Platform | Versions | Architectures | Compilers |
|---|---|---|---|
| Linux (Ubuntu) | 22.04, 24.04, 26.04 | x86-64, arm64 | gcc, clang |
| Linux (other distributions) | Debian stable and testing, Fedora, Arch, Rocky Linux 9, Alpine (musl), Nix | x86-64 | gcc |
| Linux (other architectures) | Ubuntu / Debian | i386, armv7, riscv64, ppc64 (big-endian) | gcc |
| macOS | 15, 26 | arm64 | Apple clang, gcc |
| Windows | Server 2022, Server 2025, 11 | x64, arm64, x86 (Win32) | MSVC, clang, MinGW-w64 gcc |
| FreeBSD | 15.1 | x86-64 | clang |
| NetBSD | 11.0 | x86-64 | gcc |
| OpenBSD | 7.9 | x86-64 | clang |
| illumos (OmniOS) | r151058 | x86-64 | gcc |
Pushes and pull requests build a subset of these. The full CMake matrix, including ASAN builds on Linux and macOS, runs daily, and every platform above runs weekly.
Some features depend on the platform:
fy_durable_arena_gc() fails with ENOSYS
elsewhere.region_base.find_package(libfyaml 1.0 REQUIRED)
target_link_libraries(your_app PRIVATE libfyaml::libfyaml)
If the installed package was built with libclang support, the CMake package also
exports libfyaml_HAS_LIBCLANG.
pkg-config --cflags libfyaml
pkg-config --libs libfyaml
Using CMake:
mkdir build && cd build
cmake ..
cmake --build .
ctest --progress -j"$(nproc)"
Using Autotools:
./bootstrap.sh
./configure
make
make check
llvm-dev libclang-dev: author reflection metadata directly from C headersSphinx documentation targets require the Python documentation toolchain:
sphinxsphinx_rtd_themesphinx-markdown-builderlinuxdocPDF documentation also requires a LaTeX toolchain with:
latexmkpdflatexxcolor.stywrapfig.styOn Debian/Ubuntu, the practical package set is:
python3 -m pip install sphinx sphinx_rtd_theme sphinx-markdown-builder linuxdoc
sudo apt-get install latexmk tex-gyre texlive-fonts-recommended texlive-latex-base texlive-latex-recommended texlive-latex-extra
Then build the docs with:
cmake --build build --target doc-html
cmake --build build --target doc-latexpdf
The binding lives in python-libfyaml/. Run its tests with:
cd python-libfyaml
python3 -m pytest tests/
The binding is part of the 1.0 release story and shows the generic runtime's
data model in regular use. v1.0.0-alpha3 improved the Windows story for the
binding, v1.0.0-alpha4 repaired the wheel and sdist packaging flow,
v1.0.0-alpha5 broadened build and CI coverage, and v1.0.0-alpha6 expands
generic formatting/document handling. v1.0.0-alpha7 adds transparent parse
caching, optimized generic emission, and Stable ABI Python wheels.
v1.0.0-alpha8 adds durable storage, auto-anchor emission, stronger comment
round-tripping, and more complete generic helper APIs. v1.0.0-beta1 starts
the beta cycle with additional conversion, predicate, iteration, formatting,
and correctness fixes on top of that alpha surface. v1.0.0-beta2 fixes the
fuzzing reports and extends the supported platforms.
libfyaml is fully MIT licensed.