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.
floating-companion
Community@xixi/floating-companion
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: floating-companion. Run `npx -y @neta-art/neta-search-cli@latest skills use @xixi/floating-companion --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 @xixi/floating-companion
Summary
Turn one character into a draggable desktop companion that stays nearby, answers a tap with one line, and falls asleep when left alone.
Makes one web page with your character standing on a transparent background, so it sits over whatever else is on your screen.
Drag the character anywhere; on release it settles and snaps to the nearer side edge. Its position is remembered when you reload.
Each tap gets exactly one short line in the character's own voice, with no menus or dialogue choices.
Left alone, it dims after about a minute and a half, then falls asleep. A touch wakes it with a sleepy line.
Works best with a character who has a distinct look and a recognizable way of talking. Three sample lines are enough to start.
SKILL.md
# Floating Companion
One character, one page, nothing to finish. The character sits in the corner of the screen, can be dragged anywhere and snaps to the nearest edge, answers a tap with exactly one line, and slowly dims and falls asleep if untouched — then wakes on the next touch. There is no task list, no affection meter, no ending, and no dialogue tree.
Read this file fully before generating anything or writing files. Resolve relative paths from this skill's directory.
## Language
Reply in the user's language, whatever language this file is in. This holds for every message of the run, above all the final handover; translate what the scripts print, don't paste it. All visible text — bubble lines, the first-run hint, the Work title — follows the user's language; lines the user supplied stay as written.
## When to use / when not
Use when the user wants presence, not progression: a character who is simply *there*, draggable and quietly responsive. This skill makes one web Work.
Not for an ongoing chat roleplay (`create-roleplay`), a branching story (`create-avg`), a task/quest game, or a character poster. For those, say what this skill makes and stop.
## Inputs
| Item | Required | Counts as given when |
|---|---|---|
| Character | yes | A character material exists in this world, or the user names a character and gives at least three lines they would say. "A girl" alone does not count. |
| Look | no — default from material | A reference image, a described outfit, or the character's cover. |
| Voice | no — default from material | Six to twelve short lines, each ≤ 20 characters, in the character's own register. |
| Presentation | no — default `cutout` | `cutout` for a transparent standing sprite; `medallion` for a framed circular portrait when no clean cutout is possible. |
If the character is missing, ask once for the character or three lines, then stop. If everything is given, build without another question.
## What makes it feel alive
- **One line per tap.** No menu, no "what do you want to talk about". Pick a line that has not been used in the last `min(pool-1, 5)` taps. Repeating the same line twice in a row reads as a broken toy.
- **Drag is not click.** A pointer that moves more than 6 px is a drag; below that it is a tap. Without this threshold every drag fires a line.
- **Sleep is slow.** After 90 s untouched, the sprite dims to 35% and the bubble stops; after 240 s it sleeps. The first tap while asleep uses the `sleepy` pool and does not open a normal line. Any pointer movement wakes it.
- **The character has weight.** While dragging, the sprite lifts 4% and tilts up to 6° toward the drag direction; on release it settles with a 240 ms ease and snaps to the nearer horizontal edge, 18 px from it.
- **Nothing accumulates.** Do not add an affinity number, a day counter, or a "mood" that changes permanently. The only state is position and whether it is asleep.
## Steps
1. **Read the character.** `neta atom list` → `neta atom get <id>`, or use the lines the user gave. Extract appearance (silhouette, outfit, one signature accessory) and voice (address form, sentence length, what they would never say). Write `$RUN/character.md`.
2. **Make the sprite.** One image, full body, plain pure-white background. Through the bundled script, never a raw `neta generate`:
```bash
node scripts/gen.mjs --kind image --state $RUN/gen-sprite.json \
--prompt "<identity + full-body + white background prompt from references/plan-schema.md>" \
--work-title "<Work title>" --param aspect_ratio=3:4 --param image_size=1K \
--models "<image fallback>,<second fallback>"
```
Rerun the same command while it prints `generating` or `busy`; it resumes the accepted task and never pays twice. Then `node scripts/cutout.mjs --in <mediaPath> --out $RUN/character.webp` — it removes a near-white background with ImageMagick and falls back to `medallion` if the tool is missing or the result is mostly transparent.
3. **Write the plan.** `$RUN/plan.json` per `references/plan-schema.md`: name, lines, sleepy lines, size, presentation, one-time hint. Keep 6–12 awake lines and 3–5 sleepy lines.
4. **Validate and build.**
```bash
node scripts/build.mjs --plan $RUN/plan.json --sprite $RUN/character.webp --out $RUN/site --lang <locale> --check
node /mods/neta/neta work init web works/webs/<slug> --title "<title>"
node scripts/build.mjs --plan $RUN/plan.json --sprite $RUN/character.webp --out works/webs/<slug> --lang <locale>
```
5. **Check it as a pet, not a page.** Serve it, then: drag to all four corners and reload (position restored), tap without moving (one line), drag without releasing (no line), wait 95 s (dim), wait 245 s (sleep), tap while asleep (sleepy line), resize to 375 px width. Write what you saw to `$RUN/qa.md`.
6. **Publish and hand over.** See Deliver.
`$RUN` = `_runs/floating-companion/<timestamp>/`.
## Deliver
One browser web Work.
1. Publish: `node /mods/neta/neta work publish web works/webs/<slug> --title "<same title>"`.
2. Open the published entry and confirm the sprite loads and one tap gives one line.
3. In the user's language, name the character, the number of lines, and that there is no task or ending by design.
4. **Hand over with a card — the run is not delivered until this step is done.** 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 path, or a `world-file` link to `index.html`.
## Out of scope
- Do not change world settings, delete files that existed before the run, or edit memory, character cards, installed scripts or existing Works.
- Do not add chat, an LLM call, tasks, achievements, affection, daily check-ins or an ending. Those turn a companion into a game.
- Do not make the page opaque or full-bleed; it is meant to sit over whatever the user is doing.
- Make only the requested Work; do not act on your own next-step suggestions.
## When to stop
- No character and no sample lines: ask once, then stop.
- No usable image model and no character image: offer `medallion` with the existing cover; if there is no cover either, say what is missing and stop.
- Asked for a chat companion or a dating sim: say this skill makes a silent, draggable presence and stop.
## Gotchas
- A generated PNG with a "white background" is not transparent. Run `cutout.mjs`; if the sprite has white clothing or white fur, the cutout eats it — switch to `medallion` instead of shipping holes.
- `position: fixed` plus a transformed parent breaks dragging. Keep the pet a direct child of `body`.
- Saving position in `localStorage` on every pointermove writes hundreds of times per drag; save on release only.
- On mobile, `touch-action: none` on the pet is required or the page scrolls instead of dragging; put it on the pet, not on `body`.
- A click on the bubble should not re-trigger the line. Make the bubble `pointer-events: none`.