Troubleshooting

The installer and the app name the problem; this page says what to do. The bridge's log has no tokens, audio or transcripts, only stages, lengths and timings:

PlatformLogService status
Linuxjournalctl -u hermes-car-voice-bridgesystemctl status hermes-car-voice-bridge
macOS~/Library/Application Support/Car Voice Bridge/logs/bridge.log (and launchd.log next to it)launchctl print gui/$(id -u)/app.carvoice.bridge
Windows%LOCALAPPDATA%\Car Voice Bridge\logs\bridge.logschtasks /Query /TN "Car Voice Bridge" /V /FO LIST

To restart the bridge after a change to bridge.env: sudo systemctl restart hermes-car-voice-bridge on Linux, launchctl kickstart -k gui/$(id -u)/app.carvoice.bridge on macOS, and on Windows schtasks /End /TN "Car Voice Bridge" followed by schtasks /Run /TN "Car Voice Bridge". curl is on all three (curl.exe in PowerShell).

The three most likely problems

Hermes is not reachable

The installer says Hermes: not reachable at http://127.0.0.1:8642, the app says "Hermes is not reachable.", and curl -s http://127.0.0.1:8787/readyz shows "hermes":"unreachable".

/readyz only checks that the API server answers, not the key. "Hermes rejected the bridge key." in the app means HERMES_API_KEY in bridge.env differs from API_SERVER_KEY in Hermes; put the same key in both and restart the bridge. A re-run of the installer warns about this too.

The phone cannot reach the bridge

The app says "Your bridge is offline" (the phone reached Car Voice's relay, but the bridge did not answer) or "The bridge is not reachable" (the phone did not get that far).

With your own HTTPS address (advanced): in the phone's browser, on mobile data, open https://<your bridge address>/healthz. It should show {"status":"ok"}.

An unreachable bridge never locks you out: the next question simply tries again.

Speech recognition is still loading

The installer says Speech recognition: still loading the model, first start downloads a few hundred MB, and /readyz shows "stt":"loading". On its first start the bridge downloads the Whisper model; after that it only loads it from disk. A question asked in the meantime waits for the model. Wait a few minutes and check /readyz again. If it stays loading, look for stt: preload failed in the log: the machine may have no internet access or too little memory (Whisper small needs roughly 400 to 700 MB). An OpenAI-compatible transcription service avoids the download; see Answers are slow.

What the installer says

The installer saysWhat to do
Car Voice needs Python 3.11 or newerInstall Python 3.11 or newer and run the installer with it: from your distribution on Linux (e.g. sudo python3.11 car-voice-bridge-0.7.0/backend/install.py), from python.org or Homebrew on macOS (the python3 that comes with macOS is older), from python.org on Windows (then py -3.12 …\install.py).
Run the installer as rootLinux only: run it with sudo, as the user that runs Hermes.
Run the installer without sudo on macOSOn a Mac the bridge runs as you, like Hermes: run python3 …/install.py without sudo.
This is the macOS plan, but this computer is not a Mac (or the Windows or Linux variant)--platform only goes with --dry-run; a real run uses the platform it runs on.
This machine does not run systemdLinux without systemd: if this is the container where your Hermes gateway runs, add --container (container mode); otherwise install the bridge by hand or with Docker. In WSL2, switch systemd on first (setup: WSL2).
No Hermes found in … (HERMES_HOME)Container mode: the installer runs where Hermes' data folder is not, usually a separate sandbox for Hermes' terminal. Run it in the Hermes container itself (docker exec -it <container> sh), or set HERMES_HOME to Hermes' data folder.
This Linux runs systemd, so the normal installation fits--container was given on a machine with systemd: leave it out and run sudo python3 …/install.py.
This container has … GB of memoryContainer mode: local speech recognition would not fit well next to Hermes. Use a speech recognition service with its key in a file you create yourself: (umask 077 && cat > ~/carvoice-stt.key), paste the key, Enter, Ctrl-D, then --stt openai --stt-base https://api.groq.com/openai/v1 --stt-key-file ~/carvoice-stt.key. Without a key: --stt-model base (smaller, a little less accurate). Nothing was changed.
--stt-key-file … does not exist, is empty, or must hold the key aloneCreate the file yourself (never in a chat): in a terminal (umask 077 && cat > ~/carvoice-stt.key), paste only the key, press Enter, then Ctrl-D; on Windows notepad "%USERPROFILE%\carvoice-stt.key", paste only the key, save. Nothing was changed.
--stt-key-file … can be read or changed by other usersLinux and macOS: make it private with chmod 600 <file>, then run the installer again. Nothing was changed. (Windows does not check this: a file in your user folder is private already.)
Python's venv module is missingsudo apt install python3-venv on Debian and Ubuntu, then run the installer again. On macOS and Windows, use a Python from python.org (or Homebrew on macOS), which includes it.
No Hermes Agent foundInstall Hermes Agent first, or run the installer with --hermes-env PATH (Hermes' .env file) or --hermes-url http://127.0.0.1:8642.
Hermes' API server is not switched on yetAnswer yes to let the installer add API_SERVER_ENABLED=true and a new API_SERVER_KEY, or add them yourself (setup step 1). Then restart the gateway (hermes gateway restart, or /restart in a chat with Hermes). Without a terminal the answer is no; add --yes.
Hermes keeps API server settings in …config.yamlRun the installer with --hermes-url http://127.0.0.1:8642 (or your port) and type the API server key when asked.
Hermes listens on … (API_SERVER_HOST)The bridge reaches Hermes only on the same machine or over HTTPS. Keep API_SERVER_HOST at its default 127.0.0.1, or use --hermes-url https://….
These bridge settings would not workThe message names the setting, e.g. an --stt-base that is not https://. Nothing was changed.
The bridge configuration check failedThe message names the setting in bridge.env. Fix it and run the installer again. On Linux the running bridge was not restarted; on macOS and Windows the previous code was put back and started again.
The bridge did not answer on …/healthzThe last log lines are shown above the message (on Windows also the scheduled task's status). More in the log, see the table at the top of this page.
launchctl bootstrap … failedmacOS refused to load the LaunchAgent; its message is shown. Check that you ran the installer as yourself, not with sudo, in a normal login session.
Registering the scheduled task (schtasks /Create) failedWindows refused to create the task; its message is above. A company policy can block scheduled tasks; ask whoever manages the PC.
… is in use and cannot be replacedWindows: a program still uses the bridge's files. Close terminals or editors opened in its folder and run the installer again.
phone link: not reachable through relay.carvoice.app yetPairing still works; the phone connects as soon as the bridge reaches the relay. If it stays like this, see The phone cannot reach the bridge.
tailscale serve did not succeedOnly with --tailscale. Tailscale's own message is shown above it, unchanged. Usually HTTPS certificates are not enabled for the tailnet yet (Enabling HTTPS). Or pair by bridge ID instead: sudo python3 /opt/hermes-car-voice/backend/install.py --pair.
A phone named 'phone' is already pairedAnswer yes to give it a new token (the old one stops working), add --replace, or pair another phone with --name tablet.
HERMES_API_KEY … differs from API_SERVER_KEYSee Hermes is not reachable: put the same key in both.
sha256sum: WARNING: 1 computed checksum did NOT matchThe download is incomplete or damaged. Delete the archive, download it and SHA256SUMS again and check again; do not install a file that fails the check.

Pairing codes

The app saysWhat to do
This pairing code is wrong, expired or already used.A code works once, for 10 minutes, and only the newest code for a phone name works. Ask Hermes for a new one, or run sudo python3 /opt/hermes-car-voice/backend/install.py --pair --code-only --replace. Check the address too: it must be the bridge ID (iroh:…) or HTTPS address printed with the code.
Too many attempts.The bridge allows 10 attempts per address in 10 minutes and, after 20 wrong codes in 10 minutes, cancels every open code. Wait a few minutes, then pair again with a new code.
This bridge is too old for pairing codes.The bridge predates 0.5.0. Update it, or scan the QR code that --pair shows without --code-only.
Your bridge is offline. / The bridge is not reachable.See The phone cannot reach the bridge.
This QR code needs a newer version of Car Voice.A QR code with a bridge ID (bridge 0.7.0) needs app 0.7.0 or newer: update the app from Google Play.

In a container: no bridge after a restart or a new Hermes image

In container mode the Hermes gateway starts the bridge (its gateway hook hooks/car-voice-bridge in Hermes' data folder). Look in car-voice/logs/supervise.log there (/opt/data/car-voice/logs/supervise.log in Hermes' image):

Car Voice works, but not after a while

The computer with Hermes and the bridge went to sleep, or (macOS, Windows) you were logged out. The bridge only answers while the computer is on and awake, and on macOS and Windows it runs in your login session. See Keep the computer awake. In WSL2, WSL itself may have stopped: see setup: WSL2.

"Setup incomplete" on the home screen

You skipped a setup step. Tap Finish setup: it opens the missing step (microphone or connection).

Hermes hears nothing / "The microphone produced no sound"

"The token was rejected"

The bridge no longer accepts the saved token (it was replaced with --replace, removed from the tokens file, or belongs to another bridge). Pair again (sudo python3 /opt/hermes-car-voice/backend/install.py --pair, see setup step 5) and connect in Settings › Connection with Enter pairing code or Scan QR code.

"Your bridge is offline" / "The bridge is not reachable"

See The phone cannot reach the bridge.

"The bridge must first be updated"

The address answers, but without the /voice/v2 API this app needs. Update the bridge (see Updating the bridge). If Settings says "Your bridge ignores this setting until it is updated" under Spoken replies, the bridge works but predates short and full replies.

Hermes errors

The app saysCause
Hermes rejected the bridge key.HERMES_API_KEY in the bridge does not match API_SERVER_KEY in Hermes.
Hermes is not reachable.The Hermes API server is not running, or HERMES_API_BASE_URL is wrong. /readyz then shows "hermes":"unreachable".
Hermes is busy with other tasks; try again in a moment.Hermes answered 429, for example because its limit on concurrent runs was reached.
Hermes took too long; I stopped the task.The run took longer than HERMES_TURN_TIMEOUT_SECONDS (default 600).
Speech recognition …The STT provider failed: check its address and key, or switch to local Whisper.

For anything inside Hermes itself, see the Hermes documentation.

Answers are slow

Local Whisper (small) needs several seconds per question on a small CPU. An OpenAI-compatible transcription service (HERMES_BRIDGE_STT_PROVIDER=openai, or --stt openai for a new installation) is usually well under a second; your recorded questions then go to that service. The rest of the time is Hermes working; the car screen shows what it is doing.

The spoken answer stops early

The voice says "The full text is in the app": the reply was longer than the safety net (HERMES_BRIDGE_SPEECH_MAX_CHARS_SHORT, 700 characters for short replies; HERMES_BRIDGE_SPEECH_MAX_CHARS, 3000 for full replies), or it contained code, which is never read aloud. Choose Full in Settings › Voice › Spoken replies for complete answers, or raise the value on the bridge. Bridges before 0.4.0 cut full replies at 450 characters; a HERMES_BRIDGE_SPEECH_MAX_CHARS line in bridge.env keeps its own value after an update.

Wrong language

Car Voice listens and speaks in the phone's language. If you speak a different language from the one your phone is set to, pick yours in Settings › Voice › Language.

No Car Voice in Android Auto