{"id":48112128,"url":"https://github.com/valentinvieriu/mqtt-meshtastic","last_synced_at":"2026-04-04T16:09:28.719Z","repository":{"id":337100282,"uuid":"1152347729","full_name":"valentinvieriu/mqtt-meshtastic","owner":"valentinvieriu","description":null,"archived":false,"fork":false,"pushed_at":"2026-02-07T19:06:56.000Z","size":141,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-08T03:14:05.050Z","etag":null,"topics":["aes-encryption","iot","lora","mesh-networking","meshtastic","mqtt","nodejs","protobuf","websocket"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/valentinvieriu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-07T18:34:32.000Z","updated_at":"2026-02-07T19:06:59.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/valentinvieriu/mqtt-meshtastic","commit_stats":null,"previous_names":["valentinvieriu/mqtt-meshtastic"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/valentinvieriu/mqtt-meshtastic","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/valentinvieriu%2Fmqtt-meshtastic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/valentinvieriu%2Fmqtt-meshtastic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/valentinvieriu%2Fmqtt-meshtastic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/valentinvieriu%2Fmqtt-meshtastic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/valentinvieriu","download_url":"https://codeload.github.com/valentinvieriu/mqtt-meshtastic/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/valentinvieriu%2Fmqtt-meshtastic/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31405592,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["aes-encryption","iot","lora","mesh-networking","meshtastic","mqtt","nodejs","protobuf","websocket"],"created_at":"2026-04-04T16:09:28.648Z","updated_at":"2026-04-04T16:09:28.711Z","avatar_url":"https://github.com/valentinvieriu.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Meshtastic MQTT Web Client\n\nA web client for sending and receiving encrypted messages to Meshtastic devices via MQTT. Connects to the public broker at `mqtt.meshtastic.org` using proper Meshtastic protobuf encoding with AES-CTR encryption — no external protobuf dependency required.\n\n## Features\n\n- **Send \u0026 receive** encrypted Meshtastic messages over MQTT\n- **Protobuf \u0026 JSON** mode support (binary `2/e` and plaintext `2/json`)\n- **AES-128/256-CTR** encryption with PSK shorthand expansion\n- **Multi-channel** monitoring with per-channel decryption keys\n- **Live activity log** with filtering by message type (text, position, telemetry, nodeinfo, routing, neighbors)\n- **Node filtering** — click on sender/receiver in the activity log to filter\n- **Payload preview** — inspect the exact MQTT topic and protobuf structure before sending\n- **Settings management** — configure networks, keys, channels, and nodes\n- **Zero external protobuf dependency** — custom encoder/decoder for Meshtastic wire format\n\n## Quick Start\n\n```bash\ngit clone https://github.com/valentinvieriu/mqtt-meshtastic.git\ncd mqtt-meshtastic\nnpm install\nnpm run dev\n```\n\nOpen `http://localhost:3000` in your browser.\n\n## Docker\n\nPull the pre-built image from GitHub Container Registry:\n\n```bash\ndocker pull ghcr.io/valentinvieriu/mqtt-meshtastic:latest\n```\n\nRun with default settings:\n\n```bash\ndocker run --rm -p 3000:3000 -p 8080:8080 ghcr.io/valentinvieriu/mqtt-meshtastic:latest\n```\n\nOr with a `.env` file for custom configuration:\n\n```bash\ndocker run --rm -p 3000:3000 -p 8080:8080 --env-file .env ghcr.io/valentinvieriu/mqtt-meshtastic:latest\n```\n\nUsing Docker Compose:\n\n```bash\ncp .env.example .env   # edit as needed\ndocker compose up -d\n```\n\nThe image supports `linux/amd64` and `linux/arm64`.\n\n## Configuration\n\nCopy `.env.example` to `.env` and adjust values:\n\n```\nPORT=3000\nWS_PORT=8080\nMQTT_HOST=mqtt.meshtastic.org\nMQTT_PORT=1883\nMQTT_USERNAME=meshdev\nMQTT_PASSWORD=large4cats\nMQTT_ROOT=msh\nMQTT_REGION=EU_868\nMQTT_PATH=2/e\nDEFAULT_CHANNEL=LongFast\nDEFAULT_KEY=AQ==\nGATEWAY_ID=!d844b556\n```\n\nSee `.env.example` for full documentation of all options including `CHANNEL_KEYS` for multi-key decryption.\n\n## Architecture\n\n```\nBrowser (HTML/CSS/JS)\n    │ WebSocket\nNode.js Server\n    │  ├─ Protobuf encode/decode\n    │  ├─ AES-CTR encryption\n    │  └─ HTTP static files + /api/config\n    │ MQTT\nmqtt.meshtastic.org\n```\n\nThe server bridges WebSocket connections from the browser to the MQTT broker, handling protobuf encoding/decoding and encryption/decryption. The browser provides the UI for composing messages, managing subscriptions, and viewing the activity log.\n\n## Tech Stack\n\n- **Node.js** (ES Modules) — server runtime\n- **mqtt.js** — MQTT client\n- **ws** — WebSocket server for browser communication\n- **Native crypto** — AES-CTR encryption, no external crypto libs\n- **Tailwind CSS** — frontend styling\n\n## How It Works\n\n**Sending:** The browser composes a message and sends it over WebSocket. The server encodes it as a Meshtastic `ServiceEnvelope` → `MeshPacket` → `Data` protobuf, encrypts the payload with AES-CTR using the channel's PSK, and publishes to the MQTT broker.\n\n**Receiving:** The server subscribes to MQTT topics, decodes incoming protobuf `ServiceEnvelope` messages, attempts decryption with known channel keys, and forwards decoded messages to all connected browsers via WebSocket.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvalentinvieriu%2Fmqtt-meshtastic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvalentinvieriu%2Fmqtt-meshtastic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvalentinvieriu%2Fmqtt-meshtastic/lists"}