Type a message or press the mic to talk
No conversations yet
+ ) : ( + conversations.map(conv => ( ++ {conv.title || 'New conversation'} +
++ Set via active character profile +
+Loading characters...
+Assign characters to voice satellites. Unmapped satellites use the default.
+- Editing: {character.display_name || character.name} + {character.display_name || character.name + ? `Editing: ${character.display_name || character.name}` + : 'New character'}
Fetch character data from Fandom/Wikipedia to auto-populate fields. You can edit everything after.
+Fields populated from wiki data. Review and edit below.
+ )}{character.tts.engine === 'kokoro' ? 'Previews via local Kokoro TTS bridge (port 8081).' - : 'Uses browser TTS for preview. Local TTS available with Kokoro engine.'} + : character.tts.engine === 'elevenlabs' + ? 'Previews via ElevenLabs through bridge.' + : 'Uses browser TTS for preview. Local TTS available with Kokoro engine.'}
Image generation presets with trigger conditions. Default trigger is "self-portrait".
+ + {(!character.gaze_presets || character.gaze_presets.length === 0) ? ( +No GAZE presets configured.
+ ) : ( +Loading...
+ ) : availableGazePresets.length > 0 ? ( +{memory.content}
++ {sortedMemories.length} {tab} memor{sortedMemories.length !== 1 ? 'ies' : 'y'} + {tab === 'personal' && selectedChar && ( + + for {selectedChar.data?.display_name || selectedChar.data?.name || selectedCharId} + + )} +
+Loading memories...
++ {filter ? 'No memories match your search.' : 'No memories yet. Add one to get started.'} +
+