A browser-based, backend-free narrative engine where AI characters with distinct souls, voices, and emotional memories interact in evolving stories. Three core principles guide every interaction:
- Characters are people, not bots — They remember, hold grudges, fall in love, misunderstand each other. They don't know they're AI.
- Stories drift naturally — No rigid scripts. Controllers drop surprises, overhear private conversations, push characters into unexpected places.
- The user is the director — Every behavior, threshold, model, color, voice, frequency is tunable.
- Stack: Vite + Vanilla TypeScript
- Storage: IndexedDB (swappable adapter pattern for future cloud migration)
- Deployment: Static site (Netlify/Vercel)
- API Flow: Browser → LLM Provider → Browser (no server we control)
| Controller | Purpose | Trigger |
|---|---|---|
| Main Controller | Analyzes chat, updates moods, relationship matrix, long-term summary | Every N messages (default 10, configurable) |
| Scenario Controller | Scene changes, surprises, eavesdropping, location shifts | Scenario creation + Main Controller requests |
| Creative Controller | Auto-generates complete characters from brief descriptions | On demand |
| Media Controller | Image & voice generation with emotional tone | Manual click OR auto-mode |
- Short-term: Last N messages raw (default 30, configurable)
- Long-term summary: Maintained by Main Controller, injected into prompts
- Relationship matrix: N² JSON tracking each character's feelings toward every other
npm install
npm run devApp works instantly with Pollinations defaults (publishable key included). Add your Aqua API key in settings for premium models.
- Provider P (Pollinations): Default, ships with app, OpenAI-compatible
- Provider A (Aqua): User-supplied key for heavy controller models
- Custom Slots: Any OpenAI-compatible endpoint
See docs/ for:
- Architecture decisions
- Data models
- Controller prompt engineering
- Icon system guidelines
MIT — Open source, launch your own instance.