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.
charm-strap-workshop
Community@u252119f2fa58/charm-strap-workshop
Community skill — not reviewed. It was shared by 秋雨微澜 and has not been checked by Neta. Read SKILL.md below before letting an agent use it.
Use it in Cohub
Paste this into your agent's chat — it fetches the skill and follows it.
Use the skill: charm-strap-workshop. Run `npx -y @neta-art/neta-search-cli@latest skills use @u252119f2fa58/charm-strap-workshop --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.
Install from a terminal
npx -y @neta-art/neta-search-cli@latest skills use @u252119f2fa58/charm-strap-workshop
Summary
Design a hanging acrylic charm strap for your character, play with how it swings, and save it as a card.
Drag charms onto a hanging strap: a character portrait in the middle, small charms above and below, and one long dangling piece at the bottom.
The strap behaves like the real thing: charms hang, bump into each other, and swing when you shake your phone or drag them.
Choose from 3 portrait expressions, 9 short charms and 4 long drops, with up to 3 short charms on each strand.
Try five ready-made styles, rename your creation, and collect all 16 pieces in a collection page as you discover them.
Save the finished strap as a portrait card with your title and a list of its parts. Works best with a character who has a distinctive look and clear symbols.
SKILL.md
# Charm Strap Workshop
A charm strap is a small physical object the player composes: a portrait plate at the centre, short charms stacked above and below it, one long drop at the bottom, and a metal ring that carries the weight. The page has to feel like the real thing — the charms hang, collide, click, and swing when the phone moves. The product is one web Work, playable on a phone, with a save card at the end.
Read this file fully before writing files or generating assets. Resolve relative paths from this skill's directory.
## Language
Reply in the user's language, whatever language this file is in — every message, the final handover included. Translate what scripts print instead of pasting it. Everything the player sees — title, tab labels, strand names, toasts, export card — follows the user's language. Write one language into `data.js`; do not leave two.
## When to use / when not
Use when the user asks for an acrylic charm designer, a keychain or strap DIY, a 谷子/merch mock-up, a drag-and-drop charm workshop, or a character goods page. Not for a sticker pack or an emoji set — say this skill builds a hanging charm strap and stop.
## Inputs
| Item | Required | Counts as given when |
|---|---|---|
| Character | yes | The user names a character, OC or IP; their card or profile is in the world |
| Motif set | no — default 9 short + 4 long from research | The user names motifs that must appear |
| Palette / accent | no — default from the character's official art | The user names a colour or hex |
| Language | no — default the user's language | The user writes in a language |
If the character is missing, ask once, then stop. If every required item is given, do not ask and do not wait: build through to delivery.
## The object and its limits
| Part | Count | Size (px at reference) | Rule |
|---|---|---|---|
| Portrait plates | 3 | 236 tall | One plate is always at the centre; swapping it keeps the rest |
| Short charms | 9 available, max 3 per strand | 84 | Stack above or below the plate |
| Long drops | 4 available, max 1 per strand | 205 | Always the last item on a strand; a new one replaces the old |
| Keyring + jump ring | 1 each | 132 / 9 | Hardware, not draggable |
| Strands | 3 | — | left ring, below plate, right ring |
| Dex | 16 | — | Every distinct charm or plate seen, saved in localStorage |
| Export card | 1 | 900×1200 | Background, strap, name and a parts line |
## Steps
1. **Research the motifs.** Read the character's card and cover. Write `works/webs/<slug>/notes/research.md` with 10–15 facts and pick:
- three portrait expressions (wave / sing / eat, or the character's own three);
- nine short charms that each carry a fact (a symbol, a food, an instrument, a colour, a relationship);
- four long drops that read as weight (tassel, ribbon, blade, candy skewer);
- five recipes that are actually wearable, not random.
2. **Copy the template and write `data.js`.**
```bash
node /mods/neta/neta work init web works/webs/<slug> --title "<title in the user's language>"
cp -r .agents/skills/charm-strap-workshop/template/. works/webs/<slug>/
```
Fill `plates`, `shorts`, `longs`, `recipes`, `ui`, `accent`, `title`, `defaults`. Keep `maxShort: 3`, `dexTotal: 16`, and the 3/9/4 counts. Set `example: false`.
3. **Generate the 5×4 sheet and cut it.**
```bash
node scripts/gen-assets.mjs works/webs/<slug>
bash scripts/cut_sheet.sh works/webs/<slug>/assets/sheet.png works/webs/<slug>/assets
node scripts/build_manifest.mjs works/webs/<slug>
```
One image, 20 cells: 3 plates + 9 shorts + 4 longs + keyring + jump ring + 1 spare. The cut and manifest scripts need ImageMagick (`convert`, `identify`); Node is already in the sandbox. The fixed cell order is in `references/asset-prompts.md` and `assets/sheet-map.txt`. The manifest script computes each asset's alpha box and top/bottom anchors; the keyring also gets `ringCenter`/`ringR`.
4. **Check the build.**
```bash
node scripts/verify.mjs works/webs/<slug>
```
It writes `verify-report.json` in the Work folder. Fix every FAIL and rerun.
5. **Play it on a phone-sized viewport.** At 390×844 and 1440×900: drag a charm from the shelf onto each strand; fill a strand to 3 and try a fourth (must refuse); add a long drop, then replace it; move an item between strands; remove one; apply every recipe; clear; rename; export the card; toggle music/sound; shake (or drag) and watch the swing. Check: no console errors, the strap stays in frame, the drawer never covers the strap's last charm, and the export card shows the name and the parts line.
6. **Publish and hand over.** See Deliver.
## Deliver
A **web Work**:
```bash
node /mods/neta/neta work publish web works/webs/<slug> --title "<title in the user's language>"
```
Then, as the last step — the run is not delivered until it is done:
7. **Hand over with a card.** One `interaction-components` card on its own line, target `{ "type": "work", "workId": "<id>" }`, the id from the publish output (fallback: `cohubWorkId` in `works/webs/<slug>/meta.json`). Never a made-up id, a folder or a `world-file` link to `index.html`. Then one or two lines on what it is, in the user's language.
## Out of scope
- Do not change world settings or delete files that existed before the run.
- Do not modify memory, character cards, installed scripts, existing Works or roleplays.
- Make only the workshop Work; no shop, checkout or social feed.
- Do not add more than four long drops or a fourth strand; the physics and the drawer are tuned for three.
- No real merchandise files (print-ready die-lines) — this is a screen mock-up.
## When to stop
- No character named and no material to read: ask once, then stop.
- The user asks for a sticker pack, a poster or a print die-line: say this skill builds a playable charm strap and stop.
- The character has no visual reference at all: ask for one image or a written description; do not invent a face for the plates.
## Gotchas
- **The keyring is the pivot.** The whole strap hangs from `keyring.top`; moving that anchor makes every charm swing from the wrong point.
- **Physics units:** gravity 2000, damping `exp(-1.15·dt)`, 10 constraint iterations, 120 Hz fixed step, max 8 steps per frame. Do not raise the step count; it makes the strap feel like rubber.
- **Mass matters:** plate 3.2, short 1, long 1.4. A heavier plate makes the charms hang straighter; a lighter plate lets the side strands fly.
- **A long drop is always last.** Inserting one in the middle makes the chain bend through it; the `insertInto` function places it at the end.
- **The sheet is row-major and fixed.** A swapped cell gives the wrong motif to the wrong recipe; names live in `assets/sheet-map.txt`.
- **The export is 900×1200, not a screenshot.** It draws a background, the strap, a name plate and the parts line; a screenshot of the page includes the drawer.
- **`prefers-reduced-motion`:** keep the swing, but stop the ambient jingle and the auto sway; do not remove the drag.