Troubleshooting
Kokoro isn't reachable from NautPin
Check whether Docker bound the port to loopback or a different interface. lsof -nP -iTCP:8880 -sTCP:LISTEN. The local setup should listen on 127.0.0.1; check its port mapping before changing the app URL.
LM Studio API returns nothing
The API server has to be explicitly started in LM Studio's Developer tab. Just having a model loaded for chat isn't enough.
The hook speaks the previous reply, not the current one
This can happen when the hook reads the transcript before the current reply has finished being written. The published speak.sh has a mtime-stable poll to fix this. If you wrote your own, add a 250 ms wait before reading.
Emma reads arrows aloud
Strip Unicode arrows and slashes before sending text to Kokoro. The published hook does this in the markdown-cleanup step.
Long replies skip TTS
The hook skips responses over 2000 characters to avoid long spoken replies. Adjust MAX_CHARS at the top of speak.sh.
Dictation is in the wrong language
Switch the transcription model to Parakeet European multilingual. Whisper's .en variant is English-only.
Kokoro container disappeared after I rebooted
If you used Colima, the Linux VM doesn't auto-start on login by default. Either run colima start manually after reboot, or register a launchd agent to do it for you. Quick version:
Colima auto-start
cat > ~/Library/LaunchAgents/com.user.colima.plist <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>com.user.colima</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/bin/colima</string>
<string>start</string>
</array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><false/>
</dict>
</plist>
EOF
launchctl load ~/Library/LaunchAgents/com.user.colima.plistIf you use Docker Desktop, check that it is running and configured to start when you log in.
Ollama works but NautPin says model not found
Ollama exposes model IDs in a slightly different shape from LM Studio. Make sure the model name in NautPin → Settings → AI Enhancement matches exactly what ollama list returns . For example, use gemma3:4b, not just gemma3.
What you have now
- A dictation app that beats Wispr Flow on speed, privacy, and cost
- AI cleanup that respects your jargon and never leaves your machine
- Speech output indistinguishable from the cloud paid alternatives
- A full voice conversation loop with Claude Code (and easily adaptable to any other text-based AI)
Every component is open-source. The total spend is whatever Docker images cost (nothing) plus model weights (free downloads). No subscriptions, no API keys, no microphone shipping out across the public internet.
That's the whole stack.
The core stack is complete. Agent-specific voice hooks are a separate optional extension.
It’s working if
Docker, Kokoro, and your model server are reachable, and NautPin still completes the dictation and speech checks after restarting them.
