Troubleshooting Guide
September 2, 2026 · View on GitHub
Common issues and solutions for mc-webui.
Table of Contents
- Common Issues
- Device Not Responding
- Recording a Diagnostic Capture
- Docker Commands
- Backup and Restore
- Next Steps
- Getting Help
Common Issues
Container won't start
Check logs:
docker compose logs -f mc-webui
Common causes:
- Serial port not found → Verify
MC_SERIAL_PORTin.env - Permission denied → Add user to dialout group
- Port 5000 already in use → Change
FLASK_PORTin.env
Cannot access web interface
Check if port is open:
sudo netstat -tulpn | grep 5000
Check firewall:
# Allow port 5000 (if using UFW)
sudo ufw allow 5000/tcp
Check container is running:
docker compose ps
No messages appearing
Check device connection:
# Check container logs for device communication
docker compose logs -f mc-webui
Check database:
# Verify the database file exists
ls -la data/meshcore/*.db
Check System Log in the web UI (Menu → System Log) for real-time device event information.
Device not found
# Check if device is connected
ls -l /dev/serial/by-id/
# Verify device permissions
sudo chmod 666 /dev/serial/by-id/usb-Espressif*
USB device errors
Check device connection:
ls -l /dev/serial/by-id/
Restart container:
docker compose restart mc-webui
Check device permissions:
ls -l /dev/serial/by-id/usb-Espressif*
Should show crw-rw---- with group dialout.
Device not responding
Symptoms:
- Container logs show repeated
no_event_receivederrors and restarts:ERROR:meshcore:Error while querying device: Event(type=<EventType.ERROR: 'command_error'>, payload={'reason': 'no_event_received'}) - Device name not detected (auto-detection fails)
- All commands timeout in the Console
What this means:
The serial connection to the USB adapter (e.g. CP2102) is working, but the MeshCore device firmware is not responding to protocol commands. The device boots (serial port connects), but the application code is not running properly.
What does NOT help:
- Restarting Docker containers
- Restarting the host machine
- USB reset or USB power cycle (only resets the USB-to-UART adapter, not the MeshCore radio module)
Fix: Re-flash the firmware
The MeshCore device firmware is likely corrupted. Re-flash the latest firmware using the MeshCore Flasher:
- Download the latest firmware from MeshCore releases
- Flash using MeshCore Flasher or esptool
- Restart mc-webui:
docker compose up -d
This can happen after a power failure during OTA update, flash memory corruption, or other hardware anomalies.
BLE Connection Issues
If using Bluetooth Low Energy (BLE) transport, see the dedicated Bluetooth Pairing Guide for setup and troubleshooting, including:
- Host preparation (BlueZ configuration,
ControllerMode = le) - Pairing with fixed PIN
- Trusting the device for automatic reconnection
- Diagnosing connection loops and stale BlueZ connections
Map is empty, or a route is drawn across the whole world
If the contacts map comes up blank once Cache is switched on, while the same map with Cache off looks fine — or if the Path Analyzer draws a route as one long line stretching across the globe — the cause is a contact whose advert was corrupted in flight and now claims an impossible position, such as a latitude of 1642 degrees.
The map fits itself around everything it is given, so a single such entry zooms it out until that point is on screen and pushes every real contact outside the window. Nothing is wrong with the contacts you cannot see.
Fixed in 2.13.0: impossible positions are discarded on the way into the cache and again on the way out to the browser, so updating is enough — the cache heals itself and nothing needs to be deleted. The affected contacts stay in your contact list; they simply no longer appear on any map.
If you want to find them anyway, the System Log (Menu → System Log) records each one as it arrives:
Dropping out-of-range advert coordinates for <name> (<pubkey>...): lat=... lon=...
Corrupted advert type for <name> (<pubkey>...): type=...
They can be removed under Contacts → Manage like any other cached contact, but there is no need to.
Contact Management Issues
Check logs:
# mc-webui container logs
docker compose logs -f mc-webui
You can also check the System Log in the web UI (Menu → System Log) for real-time information about contact events and settings changes.
Update asks for a GitHub username
mcupdate (or a plain git pull) stops and waits at:
Username for 'https://github.com':
even though mc-webui is a public repository that needs no credentials.
This is not an authentication problem, and nothing is wrong with your install.
GitHub's HTTP/2 front end rejects the anonymous git-upload-pack request sent
by older git builds — notably the git 2.39 / libcurl 7.88 combination that
ships with Debian 12 — and git reports that 401 as a credential prompt.
Press Ctrl+C; typing a username or a token will not help.
Fix — tell git to speak HTTP/1.1 to GitHub:
git config --global http.version HTTP/1.1
If it still asks for a username after that, you are updating with sudo.
--global writes to the config of the user who runs it, and root has its own —
so set it for root as well:
sudo git config --global http.version HTTP/1.1
Setting it on the repository itself works too, and does not care who runs the
update: cd ~/mc-webui && git config http.version HTTP/1.1.
Then run mcupdate again. From 2.14.0 on, update.sh sets this for its own
pull, so the manual command is only needed to update to that version — or for
git pull commands you run yourself.
Recording a Diagnostic Capture
Some problems cannot be diagnosed from a screenshot or a log excerpt — most often "my message got no repeater badge". A capture records what the app actually received from the radio, so whoever is helping you can tell the difference between nobody repeated it and the repeat never reached the app.
Recording one
- Open Settings → Diagnostics.
- Pick how long to record (5–60 minutes) and optionally add a note describing what you are trying to catch.
- Press Start recording. A red Recording marker appears in the status bar under the chat.
- Reproduce the problem — if it is about a message that gets no badge, send that message now and wait a minute or two for repeats to come back.
- Press Stop and save. The capture appears in the list below.
Recording stops on its own after the chosen time, or once the file reaches 25 MB. At most 10 captures are kept; the oldest is dropped when a new one is saved.
What is in it, and who should get it
A capture contains the text of every message received while it was running, plus contact names and public keys. It does not contain channel encryption keys or any password you have stored. Treat it as you would a chat export: only send it to someone you trust.
Each saved capture can be:
- Downloaded — send it on however you like.
- Sent directly — only if the maintainer gave you an upload token. Paste it under Sending, then use the upload button on the capture; you get back a link to pass on. With no token nothing is ever sent anywhere.
Reading one (for maintainers)
python scripts/diag_report.py mc-webui-diag-20260808T124505Z.zip
The report opens with the measurement that matters: the device's own
packets.recv counter delta over the capture window against the number of
RX-log frames the app actually logged in that same window.
- Numbers close together — the companion link is fine. A missing badge means nothing in earshot repeated that packet, or the repeat collided with another transmission.
- Device counted far more — frames are being dropped between the device and the app. The firmware buffers four frames and discards the rest silently. This is most likely on BLE (one frame per 60 ms), possible on WiFi/TCP under load, and effectively absent on USB. Suggest a different transport before looking for an app-side cause.
The rest of the report covers frame arrival gaps (bursts are what overrun that
buffer), a per-sent-message verdict, and any warnings from the log. Add
--frames for a full frame listing, --verbose for payload details.
Docker Commands
View logs
docker compose logs -f mc-webui
Restart
docker compose restart mc-webui
Start / Stop
# Start the application
docker compose up -d
# Stop the application
docker compose down
# Rebuild after code changes
docker compose up -d --build
Check status
docker compose ps
Access container shell
docker compose exec mc-webui sh
Backup and Restore
All important data is in the data/ directory.
UI Backup (recommended)
You can create and download database backups directly from the web UI:
- Click the menu icon (☰) → "Backup"
- Click "Create Backup" to create a timestamped backup
- Click "Download" to save a backup to your local machine
Manual backup (CLI)
cd ~/mc-webui
tar -czf ../mc-webui-backup-$(date +%Y%m%d).tar.gz data/
# Verify backup
ls -lh ../mc-webui-backup-*.tar.gz
Recommended backup schedule
- Weekly backups of
data/directory - Before major updates
- After significant configuration changes
Restore from backup
# Stop application
cd ~/mc-webui
docker compose down
# Restore data
tar -xzf ../mc-webui-backup-YYYYMMDD.tar.gz
# Restart
docker compose up -d
Next Steps
After successful installation:
- Join channels - Create or join encrypted channels with other users
- Configure contacts - Enable manual approval if desired
- Test Direct Messages - Send DM to other COM contacts
- Set up backups - Schedule regular backups of
data/directory - Read full documentation - See User Guide for all features
Getting Help
Documentation:
- User Guide - How to use all features
- Architecture - Technical documentation
- README - Installation guide
- MeshCore docs: https://meshcore.org
Issues:
- GitHub Issues: https://github.com/MarekWo/mc-webui/issues
- Check existing issues before creating new ones
- Include logs when reporting problems (use Menu → System Log for easy access)