Add internationalization with English and Chinese translations.
Introduce structured logger and window management in the main process.
Switch to WOFF2 fonts for better performance. Update renderer UI
and build configuration to support shared modules and testing.
Previously all download failures showed a generic "Oops, something went
wrong while getting my toys!" message with no indication of which file
failed or why. Users had no way to tell if it was a network timeout,
HTTP error, disk issue, or extraction failure.
Now:
- Error messages include the file name and specific reason (e.g.
"ASR Model Weights: Connection timed out (tried 2 times)")
- DownloadScreen displays the error directly with a red progress bar
- A "Try Again" button is shown for easy retry without leaving the screen
- Kitten shows the "interrupted" state when an error occurs
Restore build/entitlements.mac.plist which declares required macOS
permissions (especially microphone/audio-input access for voice
conversations). Also restore entitlementsInherit in electron-builder.yml
so it is ready when code signing is enabled in the future.
Add a landing page for HiKid including:
- Responsive HTML/CSS/JS with i18n support
- App icon and preview screenshots
- GitHub Actions workflow for automated Pages deploy
- Lead with 'just open the app' as the recommended path
- Move manual steps into a collapsible details block
- Convert troubleshooting to a concise table
- Add Ollama download link in both EN and CN versions
- Add dependency checking for SoX, espeak-ng, Ollama
- Add DepsSetupScreen to guide users through brew installs
- Auto-download binaries and models from GitHub Releases / HuggingFace
- Support resume and cancel for downloads
- Add install-dependencies.sh script for power users
- Increase default window height for better layout
- Follow HTTP redirects during downloads
- Fix progress double-counting on resume
- Extend download timeout to 120s for large files
- Add espeak-ng (TTS dependency) to both English and Chinese install guides
- Fix TTS model extraction path: archive extracts to models/kitten-tts-micro/,
but the app expects models/kitten/kitten-tts-micro/
- Add missing mlx.metallib move step for ASR server setup
- Update troubleshooting references to match new step numbers
- Replace flat TopicSuggestions with tabbed IdeasMenu (Try Saying + Speaking Games)
- Add 11 interactive English games with confirmation cards
- Extend ChatMessage with 'system' role for game rules display
- Add addSystemMessage to useConversation hook
- Style system messages as gray centered cards in ChatBubbles
- Games: Animal Chain, Word Chain, Sentence Builder, Fill Blank,
Simple Math, Number Bomb, Simon Says, Riddles, Describe & Guess,
Quick Q&A, Word Category Battle
When HiKid is launched as a packaged .app on macOS, the PATH
environment variable does not include /opt/homebrew/bin or
/usr/local/bin. This causes the TTS server (kitten-tts-server)
to fail when trying to invoke espeak-ng, which is typically
installed via Homebrew.
This fix prepends the common Homebrew and MacPorts paths to the
child process environment so espeak-ng can be found regardless
of how the app was launched.
- Rename existing INSTALL to INSTALL-cn.md with language toggle
- Rewrite INSTALL.md in English
- Remove "Option 2: Full Package" section (not yet supported)
- Replace outdated env-var LLM config with in-app Settings instructions
- Update storage estimate to ~2GB and simplify section titles
- Rename existing README to README-cn.md and add language toggle
- Rewrite README.md in English with full project info
- Add preview screenshots and cross-link to INSTALL docs
- Replace Electron template README with HiKid project description,
features, architecture, and acknowledgments
- Update INSTALL.md with curl-based binary and model download commands
- Add preview screenshots referenced in README
- Add config service with JSON persistence in ~/.config/hi-kid/config.json
- Add IPC channels: config:get, config:set, config:changed
- Agent now supports dynamic aiName and systemPrompt with {{AI_NAME}} placeholder
- Extend SettingsPanel with gear icon and config form dropdown
- Replace all hardcoded "Kitten" references with dynamic aiName prop
- LLM parameter changes trigger automatic Agent rebuild
- Set app name and configure native macOS menu/About panel
- Update appId, maintainer, version, and homepage for release
- Replace app icon with updated PNG and add SVG source
- Remove unused background assets from public/
- Use qwen3:0.6b as the default Ollama model for faster local inference
- Add explicit rule prohibiting emoji usage in the system prompt to keep
the English-learning experience clean and text-focused
- Wrap agent.prompt() with a configurable timeout (default 15s)
- Show a friendly hint when LLM is unreachable instead of raw errors
- Remove pending assistant bubble when LLM errors out
- Add LLM_TIMEOUT_MS and LLM_UNREACHABLE_HINT env vars
- Add findSoxTool() to search PATH and common Homebrew locations
- Update rec/sox/play calls to use resolved paths
- Show clear error at startup if SoX tools are missing
- Add electron-builder.bundled.yml for all-in-one builds with binaries/models
- Add prepare-bundled.js script to copy local deps into resources/
- Update appId, productName, and mac signing settings
- Add build:mac:bundled npm script
- Remove npmmirror electron mirrors from .npmrc
- Ignore resources/bin and resources/models in .gitignore
Shrink padding/gaps in SettingsPanel and TextToggle, replace
text-heavy labels with inline icons + short labels for a
cleaner, more scannable top-bar layout.
- Add OnboardingScreen for first-time users with guided steps
- Add TopicSuggestions dropdown with conversation starters
- Replace isListening flag with recorderLock for thread-safe recording
- Add fairy-tale error messages for more failure cases
- Fix AudioContext reuse for send sound feedback
- Improve VoiceButton pointer capture and press state handling
- Increase default window size for onboarding layout
Kill the SoX recording process on early stop, discard recordings that
are too short to contain speech, and remove the pending user-message
placeholder when transcription comes back empty.
Set isConversationComplete default to true so the agent isn't flagged busy
on startup. Add resetConversationState() and isAgentBusy() helpers, use
them in agent:reset (clear isListening flag) and in sendMessage/voice
paths to decide between steering an in-flight turn vs. starting fresh.
Expose agent:reset IPC handler to stop TTS and reset the agent,
then wire a small "x" button into the messages badge for one-click
clearing of the chat history.
Replace default pointer and not-allowed cursors with the
animal-island-ui leaf cursor on body, buttons, and interactive
elements. Cursor image placed in renderer public directory
for Vite to serve directly.
Check if existing server processes are still alive before spawning
new ones. Reuse running processes when health endpoints respond
successfully, avoiding 'Address already in use' errors.
- Add `speaking` kitten state emission from TTS queue in agent.ts
- Track `pendingTtsCount` to prevent VAD from capturing AI's own voice
- Kitten mouth switches to conditional O–O toggle animation when speaking
- Listening state gets ear-perk animation on left ear
- Fix `isProcessing` state to clear on any non-listening state transition
- Add VAD auto-restart after conversation turn completes
- Reset state properly when switching between press-and-hold and VAD modes
- Add isProcessing state to bridge idle→thinking gap
- Insert pending user placeholder on release, replace with transcription
- Insert pending assistant placeholder on thinking start
- Replace static bubble icon with extracted component
- Add send chime via Web Audio API
- Add thinking spinner and speaking wave indicators
- Update mic-label to show Listening/Thinking/Speaking/Hold to speak
- Apply home_bg.svg leaf pattern to main background (#7dc395)
- Apply menu_bg.svg to chat sidebar, remove white overlay
- Add glassmorphism (translucent + backdrop-filter) to controls
- Fix HMR duplicate service startup in channels.ts (guard with servicesReady)
- Move static assets to src/renderer/public/assets/ for Vite dev server
- Update .gitignore to exclude .env
- stopServers() now sends SIGKILL after 800ms if SIGTERM is ignored
- SIGKILL cannot be caught/ignored, guaranteeing process termination
- Add cleanup on will-quit, SIGINT, SIGTERM for dev-mode reliability
- Extract shared cleanup() helper in index.ts