Community-driven Rive mascots for the OpenHuman app.
Each mascot lives in its own folder under mascots/<id>/ and must include:
mascot.jsonmetadata- one compiled runtime
.riv - one Rive Studio source
.rev
dist/mascots.json is generated from those folders and can be read by OpenHuman in production:
https://raw.githubusercontent.com/tinyhumansai/mascots/main/dist/mascots.json
The manifest exposes a small typed state engine. OpenHuman can keep its Rive view model and renderer wiring internal; mascot entries only need to describe the states and viseme values the runtime should drive.
Each mascot.json defines:
stateEngine.visemeCodes: mouth shape codes supported by the assetstateEngine.states.idle: the resting statestateEngine.states.thinking: the thinking statestateEngine.idlePoseCycle: idle poses OpenHuman can cycle through before returning to idle
Required viseme codes:
sil
PP
FF
TH
DD
kk
CH
SS
nn
RR
aa
E
ih
oh
ou
The default idle pose cycle is:
idle
bookreading
coffeedrink
writing
bobbateadrink
hand_wave
dancing
Mascots with "status": "ready" are production candidates and must pass the state-engine test. Mascots with "status": "draft" are kept in the manifest for review but should not be shown as production-ready in OpenHuman.
Rive asset filenames must use lower camelCase, for example tinyMascot.riv and tinyMascot.rev. Do not use snake_case filenames like tiny_mascot.riv.
- Create
mascots/<kebab-case-id>/. - Add lower camelCase
.rivand.revfiles with the same stem. - Add
mascot.jsonusingmascots/tiny-mascot/mascot.jsonas the reference. - Run the checks.
npm run build
npm testTo check draft mascots against the OpenHuman Rive state engine too:
npm run test:state-engine:allThis repo includes a small Next.js tester for local visual QA:
npm run previewThe tester reads dist/mascots.json, lists available runtime .riv files, serves local assets from mascots/**, and renders the selected mascot with controls for:
- idle state
- thinking state
- viseme code
- idle pose cycling
Draft mascots remain selectable for debugging, but npm test only requires ready mascots to pass the state-engine check.
The manifest contains one entry per mascot, including:
- metadata (
id,name,description,status,tags) - OpenHuman state-engine metadata
- file entries with
role, repository path, raw GitHub URL, SHA-256 hash, and byte size
GitHub Actions rebuilds dist/mascots.json on changes to mascots/** and commits the generated file back to main.
npm run build: regeneratedist/mascots.jsonnpm run check: verify the generated manifest is currentnpm run test:schema: validate the manifest againstschemas/mascots.schema.jsonnpm run test:pairs: verify.riv/.revpairs and lower camelCase asset namesnpm run test:state-engine: verify ready mascots expose the required state-engine stringsnpm run test:state-engine:all: run the state-engine check against drafts toonpm run preview: start the local Next.js Rive tester