# Olive Project File Reference
This document describes Olive's XML project format as implemented in the current codebase. It is intended to be detailed enough to implement a compatible reader/writer.
> Source of truth: `app/node/project.cpp`, `app/node/node.cpp`, `app/node/value.*`, `app/node/keyframe.*`, `app/node/project/serializer/*`.
## 1. Root Document
```xml
...
```
- `version`: serializer version in `YYMMDD` format (latest is `230220`).
- `url`: optional source path.
## 2. Project Container
For full saves, the serializer writes a project container:
```xml
......
```
- Inner `` stores actual project data.
- `` stores UI layout (`MainWindowLayoutInfo::fromXml`).
## 3. Project Data (`Project::Save`)
```xml
............
```
### 3.1 `uuid`
- QUuid string.
### 3.2 `plugins`
List of OpenFX plugins referenced by nodes in the project. This is used during load to rescan plugin paths **before** nodes are instantiated.
```xml
```
Attributes:
- `id`: OFX plugin identifier (matches node `id`).
- `major` / `minor`: OFX plugin version.
- `bundle`: bundle directory path (preferred).
- `file`: plugin binary path (fallback).
Loading behavior:
- If `plugins` exists, Olive adds each `bundle` (or `file` if `bundle` empty) to the OFX plugin path, scans, then registers plugin nodes before parsing ``.
### 3.3 `nodes`
The node graph. Each `` is written by `Node::Save()` and read by `Node::Load()`.
```xml
3
...
..................
```
Attributes:
- `id`: node type identifier. For OpenFX nodes, this equals the OFX plugin identifier.
- `ptr`: numeric pointer ID used to resolve connections and context positions.
- `version`: currently `1`.
### 3.4 `settings`
Project settings stored as key/value text elements.
Known keys from code:
- `cachesetting`
- `customcachepath`
- `colorconfigfilename`
- `defaultinputcolorspace`
- `colorreferencespace`
- `root` (pointer id of the root Folder node)
## 4. Node Serialization (`Node::Save` / `Node::Load`)
### 4.1 `label`
User-visible node label.
### 4.2 `color`
Override color index (integer), only written if not `-1`.
### 4.3 `input`
Each input is serialized as:
```xml
......
```
- `primary`: element `-1` (the main input).
- `subelements`: array elements (if input is an array). `count` is the array size.
#### 4.3.1 Immediate Values (`primary` / `element`)
Each immediate block contains:
```xml
0|1
...
............
```
- `keyframing`: whether input is keyframed (only written if input is keyframable).
- `standard`: default/static values (one `