Home Explore Blog Models CI



nix

doc/manual/source/protocols/nix-archive.md
d18ab647e15623b266a2856d18f06b82350006f3010268770000000300000686
# Nix Archive (NAR) format

This is the complete specification of the [Nix Archive] format.
The Nix Archive format closely follows the abstract specification of a [file system object] tree,
because it is designed to serialize exactly that data structure.


The format of this specification is close to [Extended Backus–Naur form](https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form), with the exception of the `str(..)` function / parameterized rule, which length-prefixes and pads strings.
This makes the resulting binary format easier to parse.

Regular users do *not* need to know this information.
But for those interested in exactly how Nix works, e.g. if they are reimplementing it, this information can be useful.

```ebnf
nar = str("nix-archive-1"), nar-obj;

nar-obj = str("("), nar-obj-inner, str(")");

nar-obj-inner
  = str("type"), str("regular") regular
  | str("type"), str("symlink") symlink
  | str("type"), str("directory") directory
  ;

regular = [ str("executable") ], str("contents"), str(contents);

symlink = str("target"), str(target);

(* side condition: directory entries must be ordered by their names *)
directory = { directory-entry };

directory-entry = str("entry"), str("("), str("name"), str(name), str("node"), nar-obj, str(")");
```

The `str` function / parameterized rule is defined as follows:

- `str(s)` = `int(|s|), pad(s);`

- `int(n)` = the 64-bit little endian representation of the number `n`

- `pad(s)` = the byte sequence `s`, padded with 0s to a multiple of 8 byte

Chunks
171e1dbc (1st chunk of `doc/manual/source/protocols/nix-archive.md`)
Title: Nix Archive (NAR) Format Specification
Summary
This document specifies the Nix Archive (NAR) format, designed to serialize file system object trees. The specification uses an Extended Backus–Naur Form (EBNF)-like syntax, including a special `str()` function that length-prefixes and pads strings for easier binary parsing. While not necessary for regular users, this information is crucial for anyone interested in the internal workings of Nix or attempting to reimplement it. The text provides EBNF rules for `nar`, `nar-obj`, `regular` files, `symlink`s, and `directory` structures, along with definitions for the `str()`, `int()`, and `pad()` functions.