First step for almost everything: sudo /opt/radio-remote/current/scripts/doctor.sh (or Admin > Diagnostics), then
journalctl -u radio-remote -n 100 --no-pager. Paste the doctor output when asking for help; it contains no passwords.
lsusb: is there a Silicon Labs CP210x entry? No: cable, radio power, try another Pi USB port, avoid unpowered hubs.ls /dev/serial/by-id/: do ports exist? No: kernel did not create them (check dmesg | tail).radio.model must be ft991a, not mock (Admin > Config).sudo fuser -v /dev/ttyUSB*, check ModemManager: systemctl status ModemManager; the installer's udev rule tells it to ignore the radio, re-plug the cable after installing).radio.baud to the radio's menu 031 value.journalctl -u radio-remote | grep -i cat shows reasons ("radio stopped answering", "unexpected radio ID").The FT-991A exposes two serial ports; the app picks the one that answers ID; with 0670. Force one with
radio.serial_port = "/dev/serial/by-id/usb-Silicon_Labs_...-if00-port0" (stable across reboots, unlike ttyUSB0/1).
"unexpected radio ID" means a different radio model answered on that port.
arecord -l / aplay -l must list the radio's codec. If not: cable/power as above; the audio device appears only while
the radio is on. Several codecs present: set audio.input_device and audio.output_device explicitly (the UI says
"several USB audio CODECs found"). Make sure the service user is in group audio (id radio-remote) and that you use
Raspberry Pi OS Lite (a desktop session's PipeWire can hold the device; check with fuser -v /dev/snd/*).
rx_capture, capture_error.arecord -D plughw:CARD=CODEC,DEV=0 -f S16_LE -r 48000 -c 1 -d 5 /tmp/rx.wav && aplay /tmp/rx.wav with a signal on the radio.http:// pages can listen; if audio cannot connect at all, try Audio tab > Connection > WebSocket (TCP); otherwise check browser console for WebRTC errors and that UDP is not blocked between you and the Pi (VPN relays can add delay).allow_ptt is true.audio.tx_gain_db and the radio's out-level until ALC barely moves.allow_ptt = true in /etc/radio-remote/config.toml and restarts.safety.tx_timeout_s.Unplug/replug and radio power-cycle should recover within a few seconds. If the status stays offline: look for
"CAT session ended" in the log; confirm the port name did not change (use by-id); sudo systemctl restart radio-remote.
After a radio power cycle, the radio forgets auto-information; the app re-enables it on reconnect (log: "FT-991A connected").
systemctl status radio-remote, curl -s http://127.0.0.1:8080/api/status on the Pi.systemctl status caddy, journalctl -u caddy -n 30. Does the name resolve (ping radio.local; some Windows/Android setups lack mDNS: use the Pi's IP and --hostname)?server.allowed_origins.sudo /opt/radio-remote/current/scripts/tailscale_setup.sh (tailscale.md).tailscale status on both ends; tailscale ping <pi> shows direct vs relayed (DERP) path.Secure / mic is blocked, the proxy is not forwarding X-Forwarded-Proto: https: use the Caddy variant (tailscale.md).journalctl -u radio-remote -n 100. Common: a typo in config.toml (the error names the key); missing Python packages
after a failed update (sudo /opt/radio-remote/venv/bin/pip install -r /opt/radio-remote/current/requirements.txt);
status=...WATCHDOG means the app hung (please send the log).
sudo scripts/uninstall.sh (keeps data) then sudo ./install.sh; or --purge for a completely clean slate.
The server could not open the radio's sound card for transmit: audio.output_device holds something that is not an ALSA device name
(for example a bare card number 6). Leave Admin > Config > Pi -> radio (playback) empty (auto-detect) or set
plughw:CARD=CODEC,DEV=0 (see aplay -l), save, restart the service. A bare number is now rejected when saving, and the Audio tab shows
"Audio to the radio failed: ..." when the playback device cannot be opened.