Basic Cohub abilities. Most agents already have these mounted; listed here for reference.
Platform Published by the Neta team.
Official Made by the Neta team.
Verified Reviewed by the Neta team.
Community Shared by a Cohub user. Not reviewed — read SKILL.md before you use it.
polaroid-purikura
Verified@granola/polaroid-purikura
Use it in Cohub
Paste this into your agent's chat — it fetches the skill and follows it.
Use the skill: polaroid-purikura. Run `npx -y @neta-art/neta-search-cli@latest skills use @granola/polaroid-purikura --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.
npx -y @neta-art/neta-search-cli@latest skills use @granola/polaroid-purikura
Summary
Turn your world's characters into a keepsake photo: a soft Polaroid or a sparkly Shibuya-style photo-booth sticker print.
Pick from three formats: a Polaroid with a white border and date, a photo-booth sticker print, or a tall four-photo strip with a different pose in each.
Characters keep their own art style. A pixel-art character stays pixel art, an anime character stays anime, and nobody is turned photorealistic.
Poses come from each character's personality and relationships: couples lean head to head, best friends squish cheeks, rivals stand back to back.
Set in a place from your world on a cosy, bright day, with hearts, sparkles and doodles on the sticker prints.
With no characters in your world, you still get a Polaroid of a place, with its everyday details and a date stamp.
SKILL.md
# Polaroid & Purikura Photo
Makes **one finished photo** from the world on disk:
| Format | Who is in it | Fixed look |
|---|---|---|
| **Polaroid** | the world's characters, or a place if there are none | white instant-film border, a date on the bottom strip, a light film filter, fresh and airy, like a real snapshot |
| **Shibuya purikura** | characters only | a photo-booth print with bright beauty light, a pastel frame, heart and sparkle stickers, glitter-pen doodles, and an optional date |
| **4-shot purikura** | characters only | the same booth look, as four photos stacked top to bottom on one **tall 1:3 strip** (960×2880), each frame a different pose |
Each image has two layers. Keep them apart in your head and in the prompt:
1. **The format layer is fixed.** The border, date, film filter, stickers and doodles look the same in every world.
2. **The picture layer follows the source.** The characters, and the world they stand in, are drawn in the same art style as their own reference art. A pixel-art character gets a pixel-art photo, a 2D anime character gets a 2D photo, and a 3D or realistic character gets a 3D or realistic photo. **Never turn everyone photoreal by default.** "Real snapshot" describes how the photo is framed and lit, not how it is rendered.
---
## Speed
The image itself takes about 75–110 seconds, whatever the quality setting, and nothing in this skill makes it faster. Every extra tool round before or after it adds waiting time on top, so keep the rounds few:
| Run | Tool rounds |
|---|---|
| First photo in a chat | read the world → ask (if needed) → look at the references → generate → check → place |
| Another photo in the same chat | generate → check → place |
- Batch: one shell command reads all the files, one command downloads all the references, and all the images open in one response.
- Don't run lookups the world files already answer: the cover URLs are in each atom's `media`, and the model's parameters are listed in Step 6.
## Step 0: Another photo in the same chat
If this chat already made a photo with this skill, reuse what that run settled: the cast, the place, each character's style phrase and the key appearance details. Go straight to Step 4. Run Steps 1–3 again only for a character or place that wasn't in the earlier photo.
## Step 1: Read the world (one command)
Read the whole world in a single call. Each file is printed whole, except the long `visualStyle` line, which is cut to its first 100 characters (enough to see the style's name):
```bash
cd /workspace && shopt -s nullglob && for f in world/WORLD.md world/characters/*.md world/locations/*.md; do
echo "=== $f"; sed -E 's/^("?visualStyle"?: .{100}).*/\1 … (trimmed)/' "$f"; echo
done
```
- `world/WORLD.md` gives you `language`, `era` and the overview. Read its body for the mood of the world. The full `visualStyle` is only needed for Step 3's fallback.
- In each character file, read **Basic Information** (looks), **Personality** and **Relationships**. Write down any canon detail about appearance and keep it. The first entry in its frontmatter `media` is the cover; keep that URL for Step 3. A relative `media` path is relative to the atom file.
- For each location, read its body. Note what makes it look like *home*: the furniture, the light, small objects in it.
- Characters can sit in other `world/` folders too. If `characters/` is empty but the overview names characters, run `node /mods/neta/neta atom list --type character` once.
Then decide which branch you are on:
- **At least one character → Character photo.** This is the default whenever characters exist.
- **No characters → Scene Polaroid.** The only format is Polaroid. Do not offer purikura.
## Step 2: Ask once (one questionnaire round)
Skip any question the creator already answered in their message or an earlier run in this chat settled (Step 0), and skip any question with only one possible answer. If nothing is left to ask, go straight to Step 3. If there is a round, send it right after Step 1, with no other call in between. Run the round through the `questionnaire` skill (`node /mods/neta/neta questionnaire ask`). Write it in the creator's language, using the real names of the world's characters and places.
**Character photo:**
| id | Ask when | Variant | Options |
|---|---|---|---|
| `format` | the creator didn't name one | `cards` | **Polaroid**: a soft, everyday instant snapshot with a date on the white border · **Shibuya purikura**: a photo-booth sticker print with hearts, sparkles and doodles · **4-shot purikura**: a tall photo-booth strip of four shots, each a different pose |
| `cast` | more than 1 character | `pills`, `multi: true` | each character by name; recommend at most 4 |
| `place` | more than 1 location | `pills` | each location by name |
**Scene Polaroid:**
| id | Ask when | Variant | Options |
|---|---|---|---|
| `place` | more than 1 location | `cards` | each location by name, each with a one-line description of what the snapshot would catch |
How to read the answers:
- `__defer__` on `cast`: pick the pair or group with the strongest relationship in the atoms, up to 4 characters. If there is no clear relationship, pick the main character on their own.
- `__defer__` on `place`: pick the place the chosen characters are most often found in, according to their atoms.
- If the world has no location atoms, take the most iconic everyday spot from the `WORLD.md` overview.
## Step 3: Lock each character's style
Do this for every character in the shot. **This step decides how the picture is rendered.**
1. The reference is the character's cover, the first `media` entry from Step 1. Run `node /mods/neta/neta find images "<character name>"` only if the character has no cover, or if its atom or the creator mentions a three-view or character sheet. That sheet then beats the cover.
2. **Look at them all at once.** Download every reference in one command, then open them all with parallel read calls in a single response:
```bash
curl -sL "<url1>" -o /tmp/ref-1.webp & curl -sL "<url2>" -o /tmp/ref-2.webp & wait
```
Name each style in one phrase. For example: "16-bit pixel art, hard pixel edges, limited palette", "2D anime cel shading, clean lineart", "soft 3D toy render", "photoreal".
3. **The atom text beats the picture.** A cover can be older than the atom; for example, it may still show a pet the character no longer has. Where the two disagree, follow the atom, and name the canon version in the prompt (for example, "a black border collie, NOT a dachshund"). `@Name` attaches that old cover, so this line is what keeps it from winning.
4. If there is no image, fall back in this order: the world's `visualStyle` (read the whole line with `grep -m1 -E '^"?visualStyle"?:' /workspace/world/WORLD.md`; use its `name`, `prompt.base` and `visual` fields; **never** its `negative`, which forbids text and frames and would erase the date and stickers) → the canonical look of the IP the character comes from (for example, SpongeBob is a flat 2D cartoon) → 2D illustration.
5. If the creator explicitly asks for a style, that style wins over everything above.
6. If the characters come from different styles, render them all in the **world's** style. Say so in one line in your reply.
## Step 4: Direct the pose
Every pose comes from the character's **Personality** and **Relationships** sections. Keep it cute and warm, as if the photo were taken on a good day. Faces are close to the camera and most of the frame is upper bodies (a 大头贴 is a head-and-shoulders photo).
A real booth session is mostly about **how close the two are**, not hand signs. Build every shot from **a contact pose** and **an expression**, framed in the classic booth view (4b). Hand signs are extras.
### 4a. Contact poses (pick one)
| Family | Poses |
|---|---|
| Head and face contact | **head-to-head**, temples touching, both looking at the lens · **forehead-to-forehead**, eyes closed and smiling, shot from the side · **cheek-to-cheek**, both pouting · nose-to-nose · one rests their head on the other's head or shoulder · one rests their **chin on top of the other's head** |
| Hugs and holds | **back hug**, arms looped around the other's neck from behind, chin on their shoulder, peeking out · a sideways hug, one arm round the shoulders · one leans back against the other's chest |
| Hands on the other | **squishing the other's cheeks** with both hands while they puff their cheeks · **poking a cheek** while they pout · cupping the other's face · patting or ruffling their head · covering the other's eyes from behind (peekaboo) · fixing their hair or hat · holding hands up by the face, fingers laced |
| Kisses and near-kisses | a kiss on the cheek while the other looks surprised · a pretend kiss on the hand · a whisper into the other's ear · one leans in and the other leans away, laughing |
| Props | pulling sunglasses down the nose · booth props: animal-ear headbands, hats, a flower, a heart sign · the world's own objects (a book, a mug, a toy) held up together |
| Hand signs (use sparingly) | two hands making one heart · finger hearts · peace signs · bunny ears behind the other's head |
### 4b. Angle (default: the classic booth view)
Almost every shot uses the **classic booth view**. Only two other angles exist, and they are the exception.
| Angle | When | What it looks like |
|---|---|---|
| **Classic booth view (default)** | every shot, unless one of the two below is called for | eye level, straight into the lens, head-and-shoulders close-up; the faces fill most of the frame |
| High angle from above (俯拍) | the creator asks for it, or for variety in a 4-shot or a follow-up photo | the camera looks down from just above; they look up into the lens with big eyes, **cropped at the chest so the faces stay big** (never full body on the floor, even with 3+ characters) |
| Side profile | a forehead-to-forehead, nose-to-nose or whisper pose | both in profile, faces close, the frame cuts at the shoulders |
### 4c. Expressions (pick one per character)
big grin · closed-eye smile · puffed cheeks / pout · wide surprised eyes · a wink · a sleepy, content smile · a smug little smirk · a kiss face
### Who gets what
| Who | Lean towards |
|---|---|
| Couple or crush | head-to-head, forehead-to-forehead, back hug with chin on shoulder, cheek kiss, chin on head |
| Best friends | cheek squish, cheek-to-cheek pout, bunny ears, matching expressions |
| Siblings or family | arm around the shoulders, head ruffle, chin on the smaller one's head, everyone pulling the same face |
| Person and pet or creature | head-to-head with the animal, its chin resting on their shoulder, hugging it to the cheek, holding up its paw, a lick on the cheek, the pet tucked under their chin |
| Rivals | back to back, one squishing the other's cheek against their will, competing expressions |
| Solo | cheek resting on one hand, a hand under the chin, peeking from behind a prop, puffed cheeks |
| Non-human or mascot | translate the pose into the body it has: paw instead of hand, wing round the shoulder, tail curled into a heart |
Rules:
- Name the contact pose, the angle and each expression concretely in the prompt ("classic booth view, eye level, head-and-shoulders close-up, temples touching", not "a cute pose").
- **At most one hand sign** per single photo, and in a 4-shot at most one of the four frames is built around a hand sign.
- **4-shot:** four different contact families and different expressions. At least two frames use the classic booth view; the others may use the high angle or side profile. For example: head-to-head (classic) → cheek squish with puffed cheeks (classic) → forehead-to-forehead (side profile) → looking up, chin on head (high angle).
- Shy or reserved characters get the gentler versions (head on a shoulder, a hand on a sleeve), but still real contact.
Every character keeps canon appearance and outfit, unchanged. Never add extra people.
## Step 5: Build the prompt
Background: use the chosen location, shown on a **cosy, everyday** day or evening. Pick props from its atom body.
Mood: **never gloomy.** Even a stormy or dark world gets its warm, safe corner. Use soft natural daylight or warm lamplight, gentle contrast, and airy, slightly pastel colours. Do not use harsh flash, deep black shadows, heavy vignettes, noir or horror moods. Do not add extra shading that the source style doesn't have.
Date: by default, use today's date. Write it exactly and quote it in the prompt.
- Polaroid: a small orange date stamp in the bottom-right corner of the bottom white strip, for example `NOV 4 '26`. Switch to a handwritten pen date if the creator prefers.
- Purikura: a glitter-pen doodle date, for example `2026.11.04`. Leave it out if the creator asks for no date.
Text: every word in the image is written out exactly, in quotes. Use no more than 3 short words or symbols in total, and nothing else.
### Polaroid template (characters)
```text
@<Name1>, @<Name2>, A real Polaroid instant photo print. Format layer: classic white instant-film border with a thicker bottom strip, a soft fresh "小清新" film look with gentle warm tint, light grain, a faint light leak at one edge, a slightly faded print. A small orange date stamp in the lower-right of the bottom white strip reads exactly "<DATE>". Picture layer, rendered in <STYLE PHRASE> exactly like the reference art (do not convert to photorealism): <Name1> and <Name2>, <ANGLE>, <CONTACT POSE>, <EXPRESSIONS>, happy candid moment. Background: <LOCATION> with <2-3 PROPS>, cosy everyday moment, <soft daylight | warm lamplight>, bright and airy, low contrast, no harsh flash, no deep shadows, no extra shading beyond the source style. Keep each character's canon look: <KEY APPEARANCE DETAILS>. No other text, no extra people.
```
### Shibuya purikura template (characters)
```text
@<Name1>, @<Name2>, A real Shibuya purikura photo-booth sticker print. Format layer: bright, even beauty-ring lighting, clean white balance, a pastel patterned frame border, glossy stickers of hearts, stars, sparkles and bows, plus <1-2 WORLD MOTIFS> as stickers, playful glitter-pen doodles (hearts, stars, little crowns, whisker or blush marks), handwritten pink doodle text reading exactly "<WORD>" and a doodled date "<DATE>". Picture layer, rendered in <STYLE PHRASE> exactly like the reference art (do not convert to photorealism; do not redraw the characters in another style): <Name1> and <Name2> squeezed into the booth frame, <ANGLE>, <CONTACT POSE>, <EXPRESSIONS>, cute and sweet. Backdrop: a booth backdrop printed with <LOCATION> or its colours and motifs. Keep each character's canon look: <KEY APPEARANCE DETAILS>. No other text, no extra people.
```
If there is no date, drop `and a doodled date "<DATE>"`. Pick `<WORD>` to match the relationship, for example "BFF", "LOVE", "♡", "BEST DAY".
### 4-shot purikura template (characters)
```text
@<Name1>, @<Name2>, A real Shibuya purikura photo-booth sticker strip: one tall vertical print divided into exactly four stacked square photo frames, top to bottom, separated by thin white gutters, with a little extra margin at the bottom for the date. Format layer: bright, even beauty-ring lighting, clean white balance, a <pastel patterned | clean white | black film-style> border, a few glossy stickers of hearts, stars and sparkles plus <1-2 WORLD MOTIFS>, light glitter-pen doodles, handwritten doodle text reading exactly "<WORD>" in one frame and a doodled date "<DATE>" at the bottom of the strip. Picture layer, rendered in <STYLE PHRASE> exactly like the reference art (do not convert to photorealism; do not redraw the characters in another style). The same <Name1> and <Name2> in all four frames, each frame a different pose and expression: Frame 1 (top): <ANGLE>, <CONTACT POSE>, <EXPRESSIONS>. Frame 2: <...>. Frame 3: <...>. Frame 4 (bottom): <...>. Backdrop in every frame: a booth backdrop in <LOCATION colours and motifs>. Keep each character's canon look: <KEY APPEARANCE DETAILS>. Only these characters, the same in every frame. No other text, no extra people.
```
The 4-shot is always this tall single strip, at the 1:3 proportions of the reference strip (`960x2880`). Don't switch to a 2×2 grid or any other proportion.
### Scene Polaroid template (no characters)
```text
A real Polaroid instant photo print of <LOCATION>, as if a resident snapped their favourite corner on an ordinary good day. Format layer: classic white instant-film border with a thicker bottom strip, soft fresh "小清新" film look, gentle warm tint, light grain, faint light leak, slightly faded print. A small orange date stamp in the lower-right of the bottom strip reads exactly "<DATE>". Picture layer, rendered in <WORLD STYLE PHRASE>: <LOCATION> with <3-4 SIGNATURE PROPS FROM ITS ATOM>, a lived-in everyday detail (<a mug left on a table / a book open / laundry on a line>), <soft daylight | warm lamplight>, bright and airy, low contrast, no harsh flash, no deep shadows. Nobody in frame. No other text.
```
## Step 6: Generate
```bash
node /mods/neta/neta generate image \
--work-title "<Names> · Polaroid" \
--param size=<SIZE> --param quality=high \
--prompt "<prompt from Step 5>" \
[--image <three-view or sheet URL, only if it differs from the cover>]
```
- Don't run `generate image params` before every photo. The default model (`gpt-image-2.5`) takes `size` as `WIDTHxHEIGHT`: both sides a multiple of 16, an aspect ratio between 1:3 and 3:1, and 655,360–8,294,400 pixels in total. `quality` is one of `auto`, `low`, `medium`, `high`, `xhigh` or `max`. It also accepts reference images. Run `params` once only if the command rejects a parameter, or if the world uses a different model.
- Sizes: Polaroid `1024x1216` (instant-film proportions), purikura `1152x1536` (3:4), 4-shot purikura strip `960x2880` (1:3, four frames stacked).
- Keep `quality=high`. A side-by-side test found `medium` no faster, and slightly less detailed.
- `@Name` already attaches that character's cover. Add `--image` only for a *different*, better reference you found in Step 3.
- Run it **synchronously**. It is one image, and the creator is waiting for it. Don't poll its status: the call returns when the image is ready, with `mediaPath`, `url` and `work.path`.
- Work title: `<Names> · Polaroid` / `<Names> · Purikura` / `<Names> · 4-Shot Purikura` / `<Location> · Polaroid`, in the world's language.
## Step 7: Look, fix once, place
Open the returned `mediaPath` with your read tool straight away and check it against this list:
- [ ] The characters are rendered in **their reference style**, not photoreal (unless the source is photoreal).
- [ ] The right characters are in the shot, with canon looks and no extras.
- [ ] Faces and hands are whole, and the pose and angle are the ones you directed (in a 4-shot: four different poses, at least two frames in the classic booth view, four clean frames stacked in one 1:3 strip).
- [ ] The format layer is right: a white border with the date, or purikura stickers, doodles and a frame.
- [ ] The date and doodle words are spelled exactly as given.
- [ ] The mood is warm and everyday, with no gloom and no heavy shadows.
If any item fails, re-render **once** with `--target-work <workId>` and a prompt that names the miss explicitly. If it still misses, stop and tell the creator plainly what is still off.
Once it passes, put the result on the board next to the main character or the location it came from. For another photo in the same chat, use `--near` with the previous photo's `work.path`:
```bash
node /mods/neta/.agents/skills/board-ops/scripts/place.mjs \
--title "<work title>" --near "<main character or location atom id>" \
--work "<outputs[].work.path>"
```
## Step 8: Reply
- One line on what the photo caught: who, the pose, the place.
- Embed the returned `url`, then hand the Work over as a tappable link.
- Say in one line what you checked. If you swapped styles (mixed-style cast) or used a fallback style, say so too.
- Close with next steps. Good follow-ups: the other format with the same cast, a different pair of characters, or a 4-shot purikura.
## Never
- Never default to photorealism, or restyle a character away from its reference art.
- Never make a dark, flash-noir or horror-toned photo, or pile on extra shadows.
- Never offer purikura when the world has no characters.
- Never invent text beyond the date and up to 3 short doodle words.
- Never paste the world `visualStyle` negative prompt into these prompts, because it removes the frame, date and stickers.