Digital Twin / how the answers work
How a question becomes a reply
Select a box to see what it does. You can then show that part in the animated example.
Inspect a component
1 · Your question
Type a question about my work. You can also use the microphone when your browser supports it.
Browser speech recognition and recorded-audio transcription depend on capability and permission.
Source: mascot.js ↗ · pinned revision cc7771f2 · My work profile
The app uses a maintained profile of my work to guide the reply. AI can still be wrong.
The Netlify chat function prepares the request. Provider credentials belong on the server, not in browser code.
Source: netlify/functions/chat.js ↗ · pinned revision cc7771f3 · AI provider
An external AI service receives your question and relevant profile information, then generates a reply.
The source documents Gemini through a server-side function. Profile guidance cannot guarantee factual answers.
Source: README.md ↗ · pinned revision cc7771f4 · Text reply
The answer appears as text you can read, whether or not you use voice or the character.
The browser keeps a chat transcript alongside optional audio playback.
Source: mascot.js ↗ · pinned revision cc7771f5 · Voice
The reply can be read aloud. The mouth moves with the audio and text timing; the lip sync is approximate.
Audio energy and transcript timing drive smoothed facial targets. The result is not phoneme-perfect lip sync.
Source: README.md ↗ · pinned revision cc7771f6 · Text fallback
Keep typing and reading when the microphone or 3D character is unavailable.
Microphone permission, browser support, WebGL and model loading can affect the optional experience.
Source: README.md ↗ · pinned revision cc7771f7 · 3D character
The optional 3D character moves while the reply is spoken. Its gestures blend as the conversation changes.
Authored gesture clips and facial targets are blended and smoothed. This original SVG puppet does not reuse the production identity model.
Source: movement.mjs ↗ · pinned revision cc7771f