# Palettes and moodboards

> Save your own colour palettes and moodboards once, then steer every Generate Image run with your colours, your description and your style reference images.

Source: https://nodaro.ai/docs/guides/palettes-and-moodboards

A **palette** is your own set of colours, and a **moodboard** is your own set of reference images with a description. You save them once, then steer any [Generate Image](https://nodaro.ai/docs/nodes/image/generate-image) run with one. They work like the built-in colour looks and styles, but with your colours and your images.

You create palettes and moodboards through the REST API, the SDK, the CLI or an AI assistant over MCP. The editor has no screen to create or edit them. They work on every edition.

## What each one holds

| | A palette | A moodboard |
| --- | --- | --- |
| **What it holds** | A name, 2 to 12 colours as `#RRGGBB`, and an optional note of up to 500 characters | A name, an optional description of up to 1,000 characters, and 1 to 12 image links, each with an optional caption |
| **How a run uses it** | `direction.colorLook: "palette:<id>"` | `direction.style: "moodboard:<id>"` |
| **What the run gets** | Every colour in the prompt, by an everyday name and its hex code | The description in the prompt, and the images as style references |

Both belong to you only. Another person's id answers `404`, the same as an id that does not exist.

## How a palette steers an image

A run names each colour of the palette in the prompt, in your order, as `color palette: <name> <hex>, …`. Each colour gets its nearest everyday name, because a model follows a named colour more reliably, and its exact hex code. The palette's note is for you and is not added to the prompt.

The words go where a built-in colour look would go, in the style section at the end of the prompt. When a prompt is over the model's limit, these words are removed first. Your own prompt and your references are never cut.

## How a moodboard steers an image

A moodboard adds its description to the prompt as you wrote it. A moodboard with no description sends only its images.

The images go to the model as reference images. Each image comes with a short line that tells the model to take the colours, light, texture and mood from it, and not its subject or layout. Its caption is added when it has one.

- **Your own references come first.** Images you send yourself, and a connected character, keep their places. The moodboard's images fill only the reference seats left after them.
- **Never more than the model takes.** Each model accepts a set number of reference images. The images that do not fit, in your moodboard's order, are not sent. A model that takes no reference images gets none, but the description still goes in.
- **Aspect ratio Auto** keeps the shape of the first image the run sends. When you send no image of your own, that is the moodboard's first image.

### The warning when images are not sent

When some images do not fit, the run goes ahead and the answer carries a warning with the code `moodboard_images_not_sent`. The message says how many images were not sent and why. The job keeps the same warning. For example:

```text
5 of the 12 images of moodboard "Nordic calm" were not sent as style references: the model (nano-banana-pro) takes at most 8 reference images, and your own references come first.
```

## Limits

- **Image links, not copies.** Each image is a public `http` or `https` link of up to 2,048 characters, and a caption is up to 200 characters. A link to a private network is refused. An image you delete, or one that your plan's media retention removes, is gone from the moodboard too.
- **Generate Image only.** A video request that names a palette or a moodboard answers `400`.
- **Not with a preset in the same request.** A call that applies a preset (`presetId`) cannot use a palette or a moodboard, and answers `400`. This includes a preset saved with one in its direction.
- **The latest version is used.** A run records the ids, not a copy. Change a palette and the next run uses the new colours. Delete it, and a run that still names it answers `404`.
- **Errors come before any charge.** A malformed id answers `400`, and an id that is not yours or no longer exists answers `404`. A built-in id that is unknown is skipped, but your own palette or moodboard is never ignored in silence.

## What it costs

Saving, listing and changing palettes and moodboards is free. A moodboard's images are references, so a run is priced like any run with that many references. A text-to-image model with references runs on its image-to-image version, and a model priced per reference image counts them. The price checked before the run counts only the images that are actually sent.

## In a workflow

A Generate Image node whose direction names a palette or a moodboard is resolved each time the workflow runs, including app runs, schedules and webhooks. Such a node is written into the workflow from code or by an AI assistant.

- **The Final view shows a note** where the palette or the moodboard will go, because its words are added when the run starts.
- **Run the workflow, not the node.** The node's own run button refuses such a node, with nothing sent or charged. The message ends with "Run the workflow to use it — nothing was charged."
- **In a published app,** a palette or a moodboard saved in the workflow is looked up among the creator's. One that a person who runs the app supplies is looked up among their own, so they can never name the creator's other palettes or moodboards.
- **A palette or moodboard that cannot be found** fails that node before anything is made or charged.

## Create and use them from code

**REST**

`GET`, `POST`, `PATCH` and `DELETE` on `/v1/palettes` and `/v1/moodboards` list, create, change and delete them. OAuth apps need `assets:read` to read and `assets:write` to write. Writes are limited to 30 requests a minute. Then pass the id in the `direction` of `POST /v1/generate-image`. See [Your own palettes and moodboards](https://nodaro.ai/docs/developers/api/nodes#palettes-and-moodboards).

**SDK**

`client.palettes` and `client.moodboards` manage them. On `nodes.run("generate-image", …)`, pass `direction: { colorLook: paletteDirectionId(id), style: moodboardDirectionId(id) }`. The answer types the `warnings`. See [Pickers, presets and prompts](https://nodaro.ai/docs/developers/sdk/pickers-and-prompts) and [Run nodes](https://nodaro.ai/docs/developers/sdk/nodes).

**CLI**

`nodaro palettes` and `nodaro moodboards` list, create, change and delete them. See [Commands](https://nodaro.ai/docs/developers/cli/commands).

**MCP**

An AI assistant uses `list_palettes`, `save_palette`, `list_moodboards` and `save_moodboard`. The `generate_image` tool takes `palette_id` and `moodboard_id`, and passes the warning on. There is no delete tool over MCP. See the MCP [Image](https://nodaro.ai/docs/mcp/tools/image) tools.

## Frequently asked questions

### What is the difference between a palette and a moodboard?

A palette is a named set of 2 to 12 colours, which a run names in the prompt. A moodboard is a description and 1 to 12 image links, which a run adds to the prompt and sends as style references.

### How do I create a palette or a moodboard?

Through the REST API, the SDK, the CLI, or an AI assistant connected over MCP. The editor has no screen to create them.

### Do moodboard images cost extra?

The images are sent as references, so a run is priced like any run with that many references. The price checked before the run counts only the images that are actually sent.

### What happens when a moodboard has more images than the model takes?

Your own references come first, and the moodboard's images fill the seats that are left. The images that do not fit are not sent, and the answer carries a warning that says how many.

### Can someone else use my palette?

No. Palettes and moodboards belong to you. Another person's id answers 404, the same as an id that does not exist. A published app can use its creator's moodboard when the moodboard is saved in the workflow.
