Summary
Add a first lightweight persona pack surface so users can personalize OpenHuman as one coherent identity: persona text, mascot avatar, and voice selection.
Motivation
OpenHuman already has most of the ingredients separately:
- workspace prompt files such as
SOUL.md for personality and tone
- user-selected ElevenLabs voice IDs
- mascot rendering with state/viseme support and backend mascot manifests
What is missing is a simple user-facing bundle that makes these feel like one setup flow.
Persona Pack v1 scope
- Let users configure a persona display name / description in the product surface.
- Let users edit or reset
SOUL.md from the app.
- Let users keep using an existing ElevenLabs voice ID for speech.
- Let users set a custom mascot avatar from a GIF URL or local file path.
- Treat GIF avatars as a simple fallback renderer: animated image only, no lip-sync or state-specific visemes.
- Persist the selected persona/avatar/voice preferences locally.
Follow-up scope
- Optional state-specific avatar assets: idle, thinking, listening, speaking, sleeping.
- Import/export folder manifest for a full persona pack.
- Provider-backed voice clone flow with explicit consent, upload validation, deletion controls, and status UI.
- Local voice cloning research if a safe on-device model becomes viable.
Non-goals for v1
- No voice cloning from uploaded audio files.
- No remote hotlinking without validation/caching strategy.
- No guarantee that arbitrary GIFs support lip-sync or speaking/listening states.
Acceptance criteria
- Users can provide a GIF URL/local path as a mascot override.
- Invalid or unsafe avatar values are rejected or reset to default.
- Existing mascot color, backend mascot, and voice ID preferences continue to work.
- PR includes focused tests for persistence/validation/render selection.
Summary
Add a first lightweight persona pack surface so users can personalize OpenHuman as one coherent identity: persona text, mascot avatar, and voice selection.
Motivation
OpenHuman already has most of the ingredients separately:
SOUL.mdfor personality and toneWhat is missing is a simple user-facing bundle that makes these feel like one setup flow.
Persona Pack v1 scope
SOUL.mdfrom the app.Follow-up scope
Non-goals for v1
Acceptance criteria