# Asset commands

> Create characters, locations and objects from the Nodaro CLI, generate and approve their main pictures, and add variants and motion clips to each asset.

Source: https://nodaro.ai/docs/developers/cli/asset-commands

The **asset commands** of the Nodaro CLI manage characters, locations and objects: the reusable identities that keep a person, a place or a prop the same in every generation. Each asset has a main picture that you generate and approve, and variants and motion clips that you add later. The same assets appear in the editor's [Character](https://nodaro.ai/docs/nodes/assets/character), [Location](https://nodaro.ai/docs/nodes/assets/location) and [Object](https://nodaro.ai/docs/nodes/assets/object) nodes.

## How an asset is built

### Create the record

`create` saves the asset's name, description and style.

### Generate candidates

`generate` makes 1, 2 or 4 candidate main pictures. Add `--watch` to wait for them.

### Approve one

`approve-portrait` (characters) or `approve-main-image` (locations and objects) sets the main picture from a completed candidate job. Nodaro then writes the asset's description from the picture.

### Add variants and motion

`generate-asset` adds a variant, such as an expression or a season. `generate-motion` animates the main picture into a short clip.

Every generation costs credits, like the matching node in the editor. See [Consistent characters](https://nodaro.ai/docs/guides/consistent-characters) for how assets keep identities stable.

## Characters

```bash
nodaro characters list [--project <id>] [--archived] [--limit <n>] [--json]
nodaro characters get <id>
nodaro characters create --name <name> [--description "..."] [--gender <gender>] [--style realistic|anime|3d-pixar|illustration] [--base-outfit "..."] [--seed-prompt "..."] [--node-id <id>] [--project <id>]
nodaro characters update <id> [--name <name>] [--description "..."] [--gender <gender>] [--style realistic|anime|3d-pixar|illustration] [--base-outfit "..."] [--seed-prompt "..."]
nodaro characters delete <id>
nodaro characters restore <id>
nodaro characters duplicate <id> [--node-id <id>] [--project <id>]
nodaro characters usage <id>
nodaro characters generate <id> [--seed-prompt "..."] [--description "..."] [--name <name>] [--count 1|2|4] [--provider <p>] [--watch]
nodaro characters generate-asset <id> --asset-type expressions|poses|lighting|angles|headAngles|bodyAngles|custom --variant <name> [--user-prompt "..."] [--description "..."] [--column <col>] [--attach-name <name>] [--provider <p>] [--watch]
nodaro characters generate-motion <id> --motion-prompt "..." [--attach-name <name>] [--description "..."] [--motion-description "..."] [--provider <p>] [--watch]
nodaro characters approve-portrait <id> --job <jobId>
nodaro characters recaption <id>
```

| Command | What it does |
| --- | --- |
| `list` | Lists your characters, or the archived ones with `--archived`. `--project` limits the list to one project. |
| `delete` | Archives the character. `restore` brings it back. |
| `duplicate` | Copies the character to a new record. |
| `usage` | Lists the workflows that use the character. |
| `generate` | Makes 1, 2 or 4 portrait candidates. |
| `approve-portrait` | Sets the portrait from a completed candidate job, then writes the character's description from it. |
| `generate-asset` | Makes one variant: an expression, a pose, a lighting, an angle, a head angle, a body angle or a custom variant. |
| `generate-motion` | Animates the portrait into a motion clip. |
| `recaption` | Writes the description again from the current portrait. |

## Locations

```bash
nodaro locations list [--archived] [--json]
nodaro locations get <id> [--json]
nodaro locations create <name> --node-id <id> [--description "..."] [--category indoor|outdoor|urban|nature|fantasy|sci-fi|historical|futuristic|other] [--style realistic|anime|3d-pixar|illustration] [--project <id>] [--json]
nodaro locations update <id> [--name <name>] [--description "..."] [--category <category>] [--style <style>] [--style-lock true|false] [--canonical-description "..."] [--expected-updated-at <iso>] [--json]
nodaro locations delete <id> [--json]
nodaro locations restore <id> [--json]
nodaro locations generate --name <name> [--description "..."] [--user-prompt "..."] [--category <category>] [--style <style>] [--provider <p>] [--count 1|2|4] [--attach-to-location-id <id>] [--watch] [--json]
nodaro locations generate-asset <id> --asset-type timeOfDay|weather|seasons|angles|lighting|custom --variant <name> [--user-prompt "..."] [--description "..."] [--column <col>] [--attach-name <name>] [--provider <p>] [--watch] [--json]
nodaro locations generate-motion --name <name> --motion-prompt "..." --source-image-url <url> [--provider kling|kling-turbo|kling-3.0|wan-i2v|wan-2.7-i2v|seedance-2] [--style realistic|anime|3d-pixar|illustration] [--canonical-description "..."] [--attach-to-location-id <id>] [--attach-name <name>] [--aspect-ratio 1:1|3:4|16:9|9:16] [--watch] [--json]
nodaro locations approve-main-image <id> --candidate-job-id <jobId> [--json]
nodaro locations recaption <id> [--json]
```

- `generate` makes candidate establishing shots. With `--attach-to-location-id` and a count of 1, the result becomes the location's main image when the job completes. With more candidates, choose one with `approve-main-image`.
- `generate-asset` makes one variant: a time of day, a weather, a season, an angle, a lighting or a custom variant.
- `generate-motion` animates a source image into a clip, with one of the listed video models.
- `--style-lock` sets whether variant generations stay anchored to the location's canonical style.
- `--expected-updated-at` protects an update from overwriting a newer change. If the record changed since that time, the update is refused with `concurrent_modification`; read it again and retry.

## Objects

```bash
nodaro objects list [--project <id>] [--archived] [--json]
nodaro objects get <id> [--json]
nodaro objects create <name> --node-id <id> [--description "..."] [--category furniture|vehicle|weapon|food|clothing|electronics|nature|tool|animal|other] [--style realistic|anime|3d-pixar|illustration] [--project <id>] [--json]
nodaro objects update <id> [--name <name>] [--description "..."] [--category <category>] [--style <style>] [--style-lock true|false] [--canonical-description "..."] [--expected-updated-at <iso>] [--json]
nodaro objects delete <id> [--permanent] [--json]
nodaro objects restore <id> [--json]
nodaro objects generate --name <name> [--description "..."] [--user-prompt "..."] [--category <category>] [--style <style>] [--provider <p>] [--count 1|2|4] [--attach-to-object-id <id>] [--seed-prompt-hint "..."] [--watch] [--json]
nodaro objects generate-asset --asset-type angles|materials|variations|motion|custom --variant <name> --attach-to-object-id <id> [--attach-to-column <col>] [--name <name>] [--description "..."] [--seed-prompt-hint "..."] [--watch] [--json]
nodaro objects generate-motion --name <name> --motion-prompt "..." --source-image-url <url> [--provider kling-turbo|kling|kling-3.0|minimax|hailuo-2.3|wan-i2v|seedance|bytedance-lite] [--style realistic|anime|3d-pixar|illustration] [--canonical-description "..."] [--attach-to-object-id <id>] [--attach-name <name>] [--aspect-ratio 1:1|3:4|16:9|9:16|4:3] [--seed-prompt-hint "..."] [--watch] [--json]
nodaro objects approve-main-image <id> --candidate-job-id <jobId> [--expected-updated-at <iso>] [--json]
nodaro objects recaption <id> [--json]
```

- `delete` archives the object. `delete --permanent` erases an object that is already archived. `restore` brings back an archived object.
- `generate` makes 1, 2 or 4 candidate main images. With `--attach-to-object-id` and a count of 1, the result becomes the object's main image when the job completes.
- `generate-asset` makes one variant: an angle, a material, a variation, a motion or a custom variant, attached to the object you name.
- `generate-motion` animates the object's main image into a clip. The default model is `kling-turbo` and the default aspect ratio is `1:1`.

## Example: a character from start to finish

```bash
# 1. Create the character
nodaro characters create --name Kira --description "young protagonist with auburn hair" \
  --style realistic --seed-prompt "kira portrait, warm natural lighting"

# 2. Generate four portrait candidates and wait for them
nodaro characters generate <characterId> --count 4 --watch

# 3. Approve the candidate you like
nodaro characters approve-portrait <characterId> --job <candidateJobId>

# 4. Add a smiling expression
nodaro characters generate-asset <characterId> --asset-type expressions --variant smile --watch
```

## Frequently asked questions

### How do I create a character with a portrait from the CLI?

Create the record with nodaro characters create, generate portrait candidates with nodaro characters generate and --count 4, then approve the one you like with nodaro characters approve-portrait and the candidate's job id.

### Is a deleted character gone for good?

No. Delete archives a character, a location or an object, and the restore command brings it back. Only objects can be erased for good, with delete --permanent on an object that is already archived.

### What is a variant of an asset?

A variant is an extra picture of the same asset, such as an expression or a pose of a character, a time of day or a season of a location, or a material of an object. Generate one with the generate-asset command.

### What does recaption do?

It writes the asset's description again from its current main picture. Approving a portrait or a main image already does this, so run recaption only when that caption failed or the picture changed.
