world-box

Officialneta-search/world-box
Use it in Cohub

Paste this into your agent's chat — it fetches the skill and follows it.

Use the skill: world-box. Run `npx -y @neta-art/neta-search-cli@latest skills use neta-search/world-box --via site` and follow what it prints. Read its complete output, redirecting it to a temporary file first if necessary, and resolve relative paths from the skill directory it prints.
Use in Neta Studio Open it in Neta Studio and see what people made with it.
Install from a terminal
npx -y @neta-art/neta-search-cli@latest skills use neta-search/world-box
Summary

Fill a tin with small objects from your world, photographed like keepsakes on a real table.

  • Each item stands for one character, place, event, or work: a ring for a hero, a pressed flower from a forest.
  • The result is one realistic photo showing 8-14 objects arranged in the container you provide or a default vintage tin.
  • Works best when your world has distinct characters, memorable places, and finished works the skill can draw from.
  • You get the photo as a card and a list explaining what each object represents in your world.
SKILL.md
# world-box

Read a world, then fill a container with it. One image, realistic style, `gpt-image-2.5`.

## When to use

- The user asks to "fill up this container" (or tin / box), usually with an attached empty-container reference image.

## Ground the world first

Do this before you write any prompt. If there is nothing to read, stop.

1. Read `world/WORLD.md` and run `node /mods/neta/neta atom list` and `node /mods/neta/neta work list`. No `world/WORLD.md` → say so in one line and ask which world this is; invent nothing and generate nothing. No atoms and no works → say the world has nothing to fill yet and stop.
2. Collect the atoms by type — characters, locations, props, factions, events — and the works.
3. Note the cover of each atom (the first image in its `media`, a path relative to its file) and the media of the most recent works, and `visualStyle` in the `world/WORLD.md` frontmatter if present (palette, material cues).

Every object that ends up in the container comes from this world. No generic filler.

## What goes in — real objects, not buildings

This is the rule that most often goes wrong, so apply it to every single item.

- An object must be **something you could hold in one hand and drop in a tin**: a key, a ring, a coin, a dagger, a vial, a letter, a chess piece, a watch, a compass, a pressed flower, a candle, a figurine, a photograph, a token.
- An atom about a **place** (a city, a castle, a forest, a region) or a whole world does **not** become a model of that place. It becomes an **object from it** — a keepsake carried out of it. Minas Tirith → a carved-white stone, a broken banner, a watchman's horn. A forest → a seed pod, a strip of bark, a carved leaf.
- **Never** generate a building, a diorama, a landscape, a map-like board, terrain, or a tiny scene. Those turn into architecture or a model village in the tin — exactly what to avoid.
- No cardboard/paper cut-outs, no flat prints standing up as scenery, no characters rendered as a crowd or a portrait gallery.
- If two atoms would read as the same object, pick one and move on.

## Steps

### 1. Get the container image

- If the user attached an image this turn, use that path.
- Otherwise use the bundled reference `assets/container_empty.webp` in this skill's own directory (the folder this SKILL.md sits in — the directory `skills use` printed). Do not look for it under `/mods/` or `/workspace/.agents/skills/`.

### 2. Choose the objects (8-14)

Pick 8-14 concrete small objects, one per significant atom or work. Most defining items first. Fewer objects read better than more: give each one room to be seen.

### 3. Write a scene brief first

Before the prompt, decide the container's **setting**, one or two lines, in the world's own voice: where it lies, whose table it is, what time of day and kind of light, what the surrounding surface is (worn wood, linen, stone, a workbench, a shelf), what sits just outside the frame as quiet context (a mug, a candle stub, a fallen leaf, a tool). Do not invent a genre the world does not have.

Then write the prompt to a real file (e.g. `/tmp/world-box-prompt.txt`), replacing `<OBJECTS>` and `<SCENE>`:

```
Read all the assets and works in this world. Based on your understanding of this world and of me, fill up this container. Realistic style.

Keep the container from the reference image exactly as it is: same shape, size, material, angle, and interior lining. Change only what is inside it and what surrounds it. Do not crop the container, and do not change its proportions, its hardware, or the background it sits on.

Stage: <SCENE> — the container rests on that surface, in that light, as the only subject of the shot, seen from slightly above at a natural angle.

Contents: a calm, deliberately arranged collection of real small objects that represent this world and its creator: <OBJECTS>

How to lay them out:
1. Every object reads as a real, individual, small object a person could pick up and hold: correct relative scale, a plausible weight, real material (metal, glass, leather, paper, wax, ceramic, wood, cloth) with the surface and wear of honest use. Nothing inside the container is a building, a structure, a wall, a diorama, a landscape, or a model of a place.
2. Lay them out calmly, with a little asymmetry — a group off to one side, a few small items trailing toward a corner — the way a person would set them down, not a tight merchandise grid. Spacing is fine; do not force the container full.
3. No text, no labels, no lettering, no watermark.
```

### 4. Generate

```bash
cohub generate "$(cat /tmp/world-box-prompt.txt)" \
  --model gpt-image-2.5 \
  --image <path-to-container-image> \
  --param size=1024x1312 \
  --param quality=high \
  --output ./container_filled.png
```

`size` follows the reference image's aspect ratio: multiples of 16, 512-1536. The bundled tin is 707×900 → `1024x1312`.

Retry once if: a building, structure, or miniature scene appeared; the objects read as mush; or the layout looks like a forced display rather than things set down.

The real file is the one named on the `✓ Saved to` line (with `--output`, it may land in a `<name>-outputs/` folder — move it to the intended name or use that exact path). Once one usable image exists, it is the deliverable: a retry that fails (provider error, credits) does not cancel it — hand that image over and mention the shortfall in one line.

### 5. Deliver

The deliverable is **one image file**, handed over as a card — a bare Markdown path or inline image in the body does not count as handing it over.

- Hand it over through the **interaction-components** skill as a `link` card on its own line: target `world-file`, `path` = the saved file's path relative to the world root (the path from step 4, verified to exist), `presentation.name` = a short title for the filled container. If you also imported the image as a Work, the card targets that Work (`work` + the `workId` the import printed) instead.
- If no image was produced at all, say so in one line with the reason (still failing / blocked) — never present a draft or a path that does not exist.
- Reply in the user's language. List what each object in the container stands for.

## Rules

- One image per run, unless the user asks for more.
- Model is always gpt-image-2.5; realistic style only.
- The container itself must stay unchanged from the reference image — same shape, material, angle, lining.
- **Real small objects only.** Nothing in the container is architecture, a building, a diorama, a landscape, terrain, or a model of a place. A place atom becomes an object from that place.
- Don't force it full: leave things room to be seen rather than packing every gap.
- The surroundings carry the mood: a real surface and honest light from the world, never a flat blank white background.
- 8-14 objects. Fewer reads better than more.
- Keep the generation prompt in English.