fig 2.2.0

Parse, edit, and convert config files while preserving comments. Supports JSON, YAML, TOML, and more.
```fig
title = fig
version = 2.1.1
author = adammharris
created = 2026-05-08
updated = 2026-07-05T21:46:34-06:00
contents = [[fig docs](docs/docs.md)]
```

<h1 align="center">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="assets/fig-banner-dark.svg">
    <img src="assets/fig-banner.svg" width="220" alt="fig">
  </picture>
</h1>

`fig` is a Zig library for parsing and editing config files.

Originally made for [Diaryx](https://diaryx.org), `fig` allows editing frontmatter in markdown files without reserializing the data, preserving comments and other trivia. `fig` has since been expanded to include many different kinds of configuration formats and different kinds of embedding.

It currently supports the following formats:

- YAML (1.2.2 and 1.1)
- JSON (strict, JSONC, JSON5)
- TOML (1.1 and 1.2)
- ZON (Zig Object Notation)
- XML (experimental, not included by default)
- Fig (.figl), an in-house authoring dialect authored by yours truly!

And you can use `fig` in the following programming languages:

- [Zig]docs/zig.md
- [Rust]docs/rust.md
- [Typescript]docs/typescript.md (experimental)
- C (not tested, but likely works)

## Command-line interface

Download from Github Releases or with Homebrew:

```bash
brew tap adammharris/tap
brew install adammharris/tap/fig
```

Or run it with no install at all (needs Node 20+; experimental — see
[docs/npm-wasi.md](docs/npm-wasi.md)):

```bash
npx @adammharris/fig-wasi get config.yaml
```

Run `fig help` for instructions for how to use it on your files.

## Planned features

- Better testing for the Typescript bindings
- Styling directives (maintain styling across formats, such as mapping TOML inline->YAML inline)
- More distribution options (package managers, etc.)
- More bindings
- Advanced filtering/querying capabilties ("convert to this format, except without this node")

## Fine print

**Contibutions**

Contributions are welcome, subject to my approval.

**AI Use**

`fig`, like many deceptively simple systems-level codebases, require careful thought and intention. AI tools can generate code rapidly, often at the cost of this important design thinking. Therefore, I have chosen to limit the use of AI code generation in this codebase.

I started writing this library by hand (no AI) for my own education, and for use in my larger project, [Diaryx](https://diaryx.org). After writing a JSON tokenizer and parser by hand, and designing the Document, Token, and Language abstractions, I decided to make use of the Codex AI tool to generate specific portions of the code that would otherwise require hours of tedious, repetitive work.

Using Codex, I was able to make a compliant YAML parser much faster than I would have been able to otherwise. Later, I used Claude Code to do the same for TOML, ZON, and JSON5. For each of these, I made a conformance suite in order to ensure a correct implementation.

All of the code generated was carefully reviewed and edited according to my taste before being accepted. I take full responsibility and ownership of the code in this repository. If you have any questions or concerns about AI use in this project, [please contact me!](<#Contact Me>)

**License**

MIT or Apache 2.0, at your discretion. If you use `fig` in your work, I would love to hear from you and feature you here! [Please contact me!](<#Contact Me>)

**Credits**

I took the JSON test suite at `testdata/json` from [Nicolas Seriot's JSONTestSuite repository](https://github.com/nst/JSONTestSuite). I'm grateful that it is licensed under the MIT license, so I am allowed to use it for `fig`. A copy of the license is included in this repository at `testdata/json/LICENSE`.

Likewise, test suite licenses are included for JSON5, TOML, and YAML. I am thankful for each of them.

I am also thankful for the `toml-edit` Rust crate, which provided inspiration for the complex structural edits required by any format-preserving TOML editor.

## Contact Me

<amh421@icloud.com>, or leave an issue.