{"id":50519857,"url":"https://github.com/logocomune/gomeshcom-client","last_synced_at":"2026-06-03T03:07:07.214Z","repository":{"id":358391561,"uuid":"1240647180","full_name":"logocomune/gomeshcom-client","owner":"logocomune","description":"MeshCom web dashboard for radio amateurs. Connects to a MeshCom node via UDP and provides a browser-based interface: real-time map of heard stations, chat with channels and direct   messages, telemetry display. Single binary, no dependencies.","archived":false,"fork":false,"pushed_at":"2026-05-29T12:37:57.000Z","size":1808,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-29T14:14:25.761Z","etag":null,"topics":["amateur-radio","lora","meshcom","radioamateur","udp","web"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/logocomune.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-16T11:47:48.000Z","updated_at":"2026-05-29T12:37:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/logocomune/gomeshcom-client","commit_stats":null,"previous_names":["logocomune/gomeshcom-udp","logocomune/gomeshcom-client"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/logocomune/gomeshcom-client","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/logocomune%2Fgomeshcom-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/logocomune%2Fgomeshcom-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/logocomune%2Fgomeshcom-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/logocomune%2Fgomeshcom-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/logocomune","download_url":"https://codeload.github.com/logocomune/gomeshcom-client/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/logocomune%2Fgomeshcom-client/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33845829,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-03T02:00:06.370Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amateur-radio","lora","meshcom","radioamateur","udp","web"],"created_at":"2026-06-03T03:07:05.647Z","updated_at":"2026-06-03T03:07:07.206Z","avatar_url":"https://github.com/logocomune.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gomeshcom-client\n\nUnofficial Go-based web client for receiving UDP packets from a local [MeshCom](https://icssw.org/en/meshcom/) node.\n\nIt listens for UDP packets from a MeshCom node and provides a browser UI for real-time monitoring, chat, and node tracking.\n\nThe main executable is `gomeshcomd`.\n\n\u003e **Note:** `gomeshcom-client` is an independent, unofficial project.  \n\u003e It is not affiliated with, endorsed by, or maintained by the MeshCom project or its developers.\n\n| Dashboard | Chat | Map |\n|:---------:|:----:|:---:|\n| ![Dashboard](images/dashboard.jpg) | ![Chat](images/messages.jpg) | ![Map](images/map.jpg) |\n\n## Quick Start\n\n**Prerequisites:** a MeshCom node reachable from the `gomeshcomd` host (default UDP port `1799`).\n\nIf this is your first network setup, follow the step-by-step guide first:\n\n- [First Setup](docs/first-setup.md)\n\n### Binary\n\n```bash\n./gomeshcomd --my-call=\"QQ0YY-1\"\n```\n\nOpen:\n\n```text\nhttp://localhost:8080\n```\n\nThe node address is **auto-detected** from the first incoming UDP packet — no further configuration is needed for typical setups.\n\nFor a fresh node, make sure ExtUDP on the device points to the host running `gomeshcomd`, and allow inbound UDP `1799` on that host before starting the service.\n\nIf you want to open the web UI from other machines, start `gomeshcomd` on `0.0.0.0:8080` or on the specific IP you want to expose, then allow inbound TCP `8080` in the firewall. Keep the default loopback bind if access should stay local.\n\n### Docker\n\n```bash\ndocker run -d \\\n  -p 8080:8080 \\\n  -p 1799:1799/udp \\\n  -v gomeshcom-data:/data \\\n  -e GOMESHCOM_MY_CALL=QQ0YY-1 \\\n  -e GOMESHCOM_HTTP_ADDR=0.0.0.0:8080 \\\n  ghcr.io/logocomune/gomeshcom:latest\n```\n\nOpen:\n\n```text\nhttp://\u003chost-ip\u003e:8080\n```\n\nIf the node does not broadcast automatically, or you want to pin the address, set it explicitly — this disables auto-detection:\n\n```bash\n-e GOMESHCOM_NODE_ADDR=192.168.1.100:1799\n```\n\nTo mirror every received UDP packet to other consumers, set one or more forwarding targets:\n\n```bash\n-e GOMESHCOM_FORWARD_TARGETS=192.168.1.60:1799,192.168.1.61:1799\n```\n\nUse this when one MeshCom node should feed multiple tools or additional `gomeshcomd` instances. The forwarder copies incoming UDP datagrams byte-for-byte before parsing them, so downstream services receive the same payloads that this instance received.\n\n### Optional Web UI Authentication\n\nFor shared LAN deployments, protect the UI and API with a username and password:\n\n```bash\ndocker run -d \\\n  -p 8080:8080 \\\n  -p 1799:1799/udp \\\n  -v gomeshcom-data:/data \\\n  -e GOMESHCOM_MY_CALL=QQ0YY-1 \\\n  -e GOMESHCOM_HTTP_ADDR=0.0.0.0:8080 \\\n  -e GOMESHCOM_AUTH_USERNAME=meshcom \\\n  -e GOMESHCOM_AUTH_PASSWORD=change-me \\\n  ghcr.io/logocomune/gomeshcom:latest\n```\n\nWhen authentication is enabled:\n\n- unauthenticated API and SSE requests return `401 Unauthorized`\n- the browser UI opens a sign-in modal\n- successful login creates an HTTP-only session cookie\n\nKeep the browser on the same origin as the Go server, for example:\n\n```text\nhttp://192.168.1.50:8080\n```\n\nThis allows REST and SSE requests to reuse the same session cookie.\n\n## Features\n\n- Responsive UI — works on desktop, tablet, and smartphone browsers\n- Real-time packet stream via Server-Sent Events\n- Chat per conversation: broadcast, channels, and direct messages\n- Node map with OpenLayers: color-coded by freshness, with clustering for dense areas\n- Outgoing messages with duplicate suppression\n- UDP RX forwarding to one or more downstream listeners\n- Local UDP simulator for MeshCom-compatible test packets\n- Single compact binary, with no external runtime required\n- Runs on Linux, Windows, macOS, and Raspberry Pi-class devices\n- Multi-arch Docker image (`linux/amd64`, `linux/arm64`)\n\n## Configuration\n\nAll options are available via environment variable or CLI flag using the `GOMESHCOM_` prefix.\n\n| Variable | Default | Description |\n|---|---|---|\n| `GOMESHCOM_MY_CALL` | `QQ0XX-1` | **Required.** Your station callsign, for example `IU5PMP-1` or `QQ1ABC-1`. Non-`IU5PMP` prefixes are rewritten to `QQ`. |\n| `GOMESHCOM_NODE_ADDR` | *(empty)* | Node UDP address. When empty, it is learned from the first incoming UDP packet. When set, it is used as-is and auto-detect is disabled. |\n| `GOMESHCOM_HTTP_ADDR` | `127.0.0.1:8080` | HTTP listen address |\n| `GOMESHCOM_UDP_LISTEN_ADDR` | `0.0.0.0:1799` | UDP listen address |\n| `GOMESHCOM_FORWARD_TARGETS` | *(empty)* | Comma-separated `host:port` list that receives a byte-for-byte copy of every incoming UDP datagram |\n| `GOMESHCOM_DATA_DIR` | `./data` | Persistent data directory |\n| `GOMESHCOM_SEND_DELAY` | `40s` | Minimum delay between outgoing messages |\n| `GOMESHCOM_MAX_MESSAGE_LENGTH` | `149` | Maximum outgoing message length, in UTF-8 characters |\n| `GOMESHCOM_LOG_LEVEL` | `info` | `debug` \\| `info` \\| `warn` \\| `error` |\n| `GOMESHCOM_RECEIVE_LOG_ENABLED` | `true` | Write received UDP packets to JSONL |\n| `GOMESHCOM_RECEIVE_LOG_RETENTION_DAYS` | `365` | Number of daily log files to keep |\n| `GOMESHCOM_RECEIVE_LOG_REPLAY_WINDOW` | `1h` | Packets replayed on SSE reconnect |\n| `GOMESHCOM_CHAT_LOG_HISTORY_WINDOW` | `24h` | Default chat history window |\n| `GOMESHCOM_CHAT_LOG_MAX_HISTORY_WINDOW` | `720h` | Maximum chat history via API |\n| `GOMESHCOM_SEND_DEDUP_TTL` | `2s` | Duplicate suppression window; `0` disables it |\n| `GOMESHCOM_AUTH_USERNAME` | *(empty)* | Optional HTTP auth username. Must be set together with `GOMESHCOM_AUTH_PASSWORD`. |\n| `GOMESHCOM_AUTH_PASSWORD` | *(empty)* | Optional HTTP auth password. Must be set together with `GOMESHCOM_AUTH_USERNAME`. |\n| `GOMESHCOM_AUTH_SESSION_TTL` | `24h` | Session lifetime after successful login |\n| `GOMESHCOM_AUTH_COOKIE_NAME` | `meshcom_session` | Session cookie name |\n\n## Build from Source\n\n```bash\n# Requires Go 1.26+ and Node.js 22+\n./build.sh\n# Output: bin/\n```\n\n## Local UDP Simulation\n\nUse the UDP simulator to feed changing position packets into a local `gomeshcomd` instance:\n\n```bash\ngo run ./cmd/iot-simulator -my-call QQ5SIM-9\n```\n\nThe simulator can send MeshCom-compatible `pos` packets from `QQ1TST-1` and `QQ1TST-2`, plus scheduled DM, broadcast, and channel-2 messages to `127.0.0.1:1799`, based on enabled flags.\n\nUse any combination of these flags to enable timed sends:\n\n```text\n-enable-pos1\n-enable-pos2\n-enable-dm\n-enable-broadcast\n-enable-chan2\n```\n\nWithout them, the simulator stays in receive-only responder mode.\n\nIt also responds to DMs for `QQ1TST-1` and `QQ1TST-2` with readable TX/RX logs.\n\nSee [UDP Simulator](docs/iot-simulator.md) for flags and examples.\n\n## Disclaimer\n\n\u003e **Provided \"as is\", without warranty of any kind.**\n\u003e\n\u003e Use of this software for radio communications is subject to the regulations of your national telecommunications authority. The user is solely responsible for compliance with applicable laws and licensing requirements.\n\u003e\n\u003e `gomeshcom-client` is an independent, unofficial project.\n\u003e\n\u003e Not affiliated with, endorsed by, or maintained by the MeshCom project or its developers.\n\n## License\n\nSee [LICENSE](LICENSE) for details.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flogocomune%2Fgomeshcom-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flogocomune%2Fgomeshcom-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flogocomune%2Fgomeshcom-client/lists"}