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.
world-radio
Community@yijun/world-radio
Community skill — not reviewed. It was shared by Kraken 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: world-radio. Run `npx -y @neta-art/neta-search-cli@latest skills use @yijun/world-radio --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 @yijun/world-radio
Summary
Get an original song about your world, playing in a full-screen music player styled to match its mood.
One original song with vocals, written from your world's characters, places and current story, with lyrics that open from the line under the title.
The player fills the screen on phone and desktop, in one of 9 looks such as desert, fairy, space, wasteland or eastern.
Keep adding songs to the same player. You get 3 ideas for what to write next and pick one.
Don't like a take? Swap to the other version for free, or remove a song.
Works best with a world that has named characters, memorable places and a story moment worth singing about. Takes about 1.5 minutes per song.
SKILL.md
# World Radio
The user gets one original song about their world, playing in a full-screen player skinned for that world (phone and desktop). They can keep adding songs to the same player.
Read this file fully before generating anything. Paths are relative to this skill's folder; run the scripts from the workspace root.
## Language
**The user's language = the language of the user's latest message**, even if every earlier message, the world files and the character cards are in another language. Don't weigh it against the rest of the thread: a short English line in a Chinese chat means English. It decides everything: your replies, the lyrics, the song title, the station name, the next-song ideas and the player's buttons. Translate what you take from the world (names may stay as written). Only when that message itself asks for a song in a specific language, use that language for the song. Never mix languages in one song. This holds for every message of the run, above all the final handover.
Put it in the spec as `"lang"` (`en`, `zh`, `ja`, …), and copy the user's latest message as typed into `"request"`: `song.py` checks they agree. `song.py` stops with `language mismatch` if the visible text is in another language, adds the vocal language to the style tags, and keeps each language in its own player (a world with Chinese songs gets a separate player for English ones). Cover prompts and style tags are always English.
## When to use / when not
- **Song** (default): one song with vocals per request. Also for "music" or "soundtrack" requests that don't ask for a set.
- **Scene radio**: only when the user explicitly asks for a set of looping instrumental background tracks → `references/scenes.md`.
- Not for editing an existing audio file, covers of real songs, or songs about real people: say this skill writes original songs for a world, and stop.
## Inputs
| Item | Required | Counts as given when |
|---|---|---|
| The world | yes | the chat or a roleplay describes it; the workspace has setting files (world notes, character cards, places); `world-radio-work/worlds/<id>/lore.md` exists; or the user names the world with a one-line description |
| What the song is about | no — default: the main character at the current moment of the story | |
| Style | no — default: chosen from the world's mood | |
If the world is missing, ask once which world the song is for, then stop. If it is given, ask nothing and do not wait for a go-ahead: build through to delivery and state your choices in the handover.
## Steps
1. **Read the world** (read only): `lore.md` if it exists, then the workspace's setting files and the recent roleplay. Write a 5–8 line summary: world, characters, places, current plot, recurring images.
2. **Pick a skin**: `python3 scripts/match_template.py "<world description>"` → the top result; if every score is 0, pick the closest in mood (`references/song-spec.md` lists the 9 skins).
3. **Write the spec** `_runs/world-radio/<timestamp>/song.json` following `references/song-spec.md`: `lang` first, then exactly one song and 3 next-song ideas, all in that language.
4. **Run** `python3 scripts/song.py <world id> --spec <spec> --from <skin> --publish` (later songs: same command without `--from`). It generates the song and cover in parallel (about 1.5 minutes, about $0.3), prepares the audio, builds the page and publishes.
5. **Self-check** (run by `song.py` before publishing; rerun by hand after any change):
```bash
node scripts/verify.mjs world-radio-work/dist/<id>
```
It passes when every song has its audio, cover and a real duration, vocal songs have lyrics, the page language is set and nothing loads from other sites; it writes `verify-report.json` in that folder. On FAIL or `ERROR`, do not deliver.
## Deliver
A web Work (kind: web) — the player page with the new song selected.
- In Neta Studio, `song.py` registers it with `node /mods/neta/neta work init web works/webs/world-radio-<id>` (first song) and `node /mods/neta/neta work publish web works/webs/world-radio-<id> --title "<station name>"`; the Work id is `workId` in the `RESULT` line. Later songs update the same Work.
- Outside Studio it uploads to the space's public files; the link is `url` in `RESULT`.
6. **Hand over with a card** — the run is not delivered until this is done. One `interaction-components` link card on its own line, target `{ "type": "work", "workId": "<RESULT.workId>" }` (fallback: `cohubWorkId` in `works/webs/world-radio-<id>/meta.json`; outside Studio, give `RESULT.url`). Then, in the user's language: one line on whom and where the song is about, that lyrics open from the line under the title, the 3 next-song ideas as options, and the time and cost (about $0.3 per song).
## Later requests
| The user wants | Do |
|---|---|
| Another song / picks an idea | New spec, same command — one song. If they ask for several at once, state the total (about $0.3 each) first |
| The other version | `song.py <id> --swap <song id> --publish` (each generation makes two takes; free) |
| To remove a song | `song.py <id> --remove <song id> --publish` — only when asked |
## Out of scope
- Do not change world settings (world config, visual style, slug).
- Do not delete existing files (anything that existed before the run).
- Do not modify memory, character cards, installed scripts, existing Works or roleplays; write only under `world-radio-work/`, `_runs/world-radio/` and `works/webs/world-radio-<id>/`, and do not move those folders.
- One song per request. The next-song ideas are options for the user: do not make any of them until the user picks one.
- Never read or send credentials or user data unrelated to the world.
## When to stop
- No world given: ask once, stop.
- Generation rejected by moderation: say why and what you would change; generate again only after the user agrees.
- A script prints `ERROR`: tell the user in plain words; never edit this skill's files to make it run.
## Gotchas
- Chinese world files + an English request = English song. If `song.py` prints `language mismatch`, rewrite the listed fields in `lang`; don't change `lang` to fit the text.
- No IP names, real artists or existing lyrics in prompts, tags or lyrics — moderation rejects them.
- Suno returns Opus audio, which old iPhones cannot play; `song.py` converts it to AAC. Don't hand over Suno's file directly.
- Outside Studio, publishing needs `COHUB_SPACE_ID` or `--space <space id>`; without it cohub would upload to another space.