{
  "schemaVersion": "1.0",
  "item": {
    "slug": "meshtastic-skill",
    "name": "Off-grid radio for sovereign AI. LoRa mesh comms via Meshtastic — no internet required.",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/lukevr/meshtastic-skill",
    "canonicalUrl": "https://clawhub.ai/lukevr/meshtastic-skill",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/meshtastic-skill",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=meshtastic-skill",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "CONFIG.md",
      "README.md",
      "SKILL.md",
      "references/SETUP.md",
      "references/claude_desktop_config.json",
      "scripts/mcp_server.py"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/meshtastic-skill"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/meshtastic-skill",
    "agentPageUrl": "https://openagent3.xyz/skills/meshtastic-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/meshtastic-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/meshtastic-skill/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Meshtastic Skill",
        "body": "Control a Meshtastic node via USB for off-grid LoRa mesh communication."
      },
      {
        "title": "Prerequisites",
        "body": "Meshtastic-compatible hardware (RAK4631, T-Beam, Heltec, LilyGo, etc.)\nUSB connection to host machine\nPython 3.9+ with meshtastic and paho-mqtt packages\nSee references/SETUP.md for full installation guide"
      },
      {
        "title": "Configuration",
        "body": "Edit CONFIG.md with your node details, MQTT settings, and alert destinations."
      },
      {
        "title": "Architecture",
        "body": "┌─────────────────────────────────────────────────────────────┐\n│                    MQTT Bridge                               │\n├─────────────────────────────────────────────────────────────┤\n│  RECEIVE: mqtt.meshtastic.org (global JSON traffic)         │\n│  PUBLISH: optional map broker (protobuf)                    │\n│  SOCKET:  localhost:7331 (commands: send, status, toggle)   │\n├─────────────────────────────────────────────────────────────┤\n│  Files:                                                      │\n│  • /tmp/mesh_messages.txt - received messages log           │\n│  • /tmp/mesh_nodes.json   - cached node positions           │\n└─────────────────────────────────────────────────────────────┘\n\n┌─────────────┐     USB      ┌─────────────┐\n│  LoRa Node  │◄────────────►│ Bridge.py   │\n│  (Radio)    │              │  - Serial   │\n└─────────────┘              │  - Socket   │\n                             │  - MQTT     │\n                             └──────┬──────┘\n                                    │\n           ┌────────────────────────┼────────────────────────┐\n           │                        │                        │\n           ▼                        ▼                        ▼\n    localhost:7331           /tmp/mesh_*            MQTT Broker\n    (send commands)          (message logs)         (mesh traffic)"
      },
      {
        "title": "Send Messages",
        "body": "# Via socket (preferred - works while bridge running)\necho '{\"cmd\":\"send\",\"text\":\"Hello mesh!\"}' | nc -w 2 127.0.0.1 7331\n\n# Direct message to specific node\necho '{\"cmd\":\"send\",\"text\":\"Hey!\",\"to\":\"!abcd1234\"}' | nc -w 2 127.0.0.1 7331\n\n# Check status\necho '{\"cmd\":\"status\"}' | nc -w 2 127.0.0.1 7331\n\n# List RF nodes (seen via radio)\necho '{\"cmd\":\"nodes\"}' | nc -w 2 127.0.0.1 7331"
      },
      {
        "title": "Map Visibility (if configured)",
        "body": "# Toggle map publishing on/off\necho '{\"cmd\":\"map\"}' | nc -w 2 127.0.0.1 7331\n\n# Explicitly enable/disable\necho '{\"cmd\":\"map\",\"enable\":true}' | nc -w 2 127.0.0.1 7331\necho '{\"cmd\":\"map\",\"enable\":false}' | nc -w 2 127.0.0.1 7331\n\n# Force immediate position report\necho '{\"cmd\":\"map_now\"}' | nc -w 2 127.0.0.1 7331"
      },
      {
        "title": "Read Messages",
        "body": "# Recent messages (last 20)\ntail -20 /tmp/mesh_messages.txt\n\n# Filter common noise\ntail -50 /tmp/mesh_messages.txt | grep -v -E \"(Hello!|hey|mqtt-test)\""
      },
      {
        "title": "Message Log Format",
        "body": "TIMESTAMP|CHANNEL|SENDER|DISTANCE|TEXT\n2026-02-02T12:43:59|LongFast|!433bf114|1572km|Moin moin!"
      },
      {
        "title": "Bridge Service",
        "body": "# Status\nsudo systemctl status meshtastic-bridge\n\n# Restart\nsudo systemctl restart meshtastic-bridge\n\n# View logs\nsudo journalctl -u meshtastic-bridge -f\n\n# Stop (needed for direct CLI access)\nsudo systemctl stop meshtastic-bridge"
      },
      {
        "title": "Option 1: Cron Job (Recommended)",
        "body": "cron.add({\n  name: \"mesh-monitor\",\n  schedule: { kind: \"every\", everyMs: 300000 },  // 5 min\n  sessionTarget: \"isolated\",\n  payload: {\n    kind: \"agentTurn\",\n    message: \"Check /tmp/mesh_messages.txt for new messages. Filter out noise (test messages, 'Hello!', 'hey'). Alert me of interesting ones with translations if non-English.\",\n    timeoutSeconds: 60,\n    deliver: true,\n    channel: \"telegram\"  // or your channel\n  }\n})"
      },
      {
        "title": "Option 2: Digest Summary",
        "body": "cron.add({\n  name: \"mesh-digest\",\n  schedule: { kind: \"cron\", expr: \"0 8,14,20 * * *\", tz: \"Europe/Madrid\" },\n  sessionTarget: \"isolated\",\n  payload: {\n    kind: \"agentTurn\",\n    message: \"Read /tmp/mesh_messages.txt. Create a digest of interesting messages from the last 6 hours. Translate non-English, guess country from distance. Post summary.\",\n    timeoutSeconds: 120,\n    deliver: true,\n    channel: \"telegram\"\n  }\n})"
      },
      {
        "title": "Option 3: Spawned Monitor Agent",
        "body": "sessions_spawn({\n  task: \"Monitor /tmp/mesh_messages.txt every 30 seconds. Alert me for interesting messages (not noise). Run for 1 hour.\",\n  label: \"mesh-monitor\",\n  runTimeoutSeconds: 3600\n})"
      },
      {
        "title": "Distance Reference",
        "body": "Approximate distances for country guessing (adjust for your location):\n\nDistanceTypical Regions<500kmNeighboring countries/regions500-1000kmMedium range1000-1500kmLong range1500-2000kmVery long range (likely MQTT relay)>2000kmMQTT-bridged traffic"
      },
      {
        "title": "Privacy Notes",
        "body": "Map reports can use fuzzy positioning (~2km precision)\nPosition publishing can be toggled off entirely\nLocal RF messages are logged but not shared externally by default\nNever broadcast precise location in messages"
      },
      {
        "title": "Supported Hardware",
        "body": "DeviceNotesRAK4631Recommended, reliable USBT-BeamPopular, has GPSHeltec V3Budget optionLilyGo T-EchoE-paper display\n\nSee references/SETUP.md for hardware-specific setup."
      },
      {
        "title": "Regional Frequencies",
        "body": "RegionFrequencyTopic RootEurope868 MHzmsh/EU_868/2/jsonAmericas915 MHzmsh/US/2/jsonAustralia/NZ915 MHzmsh/ANZ/2/json"
      },
      {
        "title": "Files",
        "body": "~/.openclaw/skills/meshtastic/\n├── SKILL.md           # This file\n├── CONFIG.md          # Your configuration\n├── scripts/\n│   └── mesh.py        # CLI wrapper\n└── references/\n    └── SETUP.md       # Installation guide"
      },
      {
        "title": "Troubleshooting",
        "body": "\"Resource temporarily unavailable\"\n\nOnly one process can use serial port at a time\nStop bridge before direct CLI: sudo systemctl stop meshtastic-bridge\n\nNo messages appearing\n\nCheck MQTT subscription topic matches your region\nVerify firewall allows outbound port 1883\nCheck journalctl -u meshtastic-bridge for errors\n\nCan't send messages\n\nEnsure bridge is running (socket server)\nCheck serial port path in config\nTry: echo '{\"cmd\":\"status\"}' | nc -w 2 127.0.0.1 7331\n\nConsidering BLE instead of USB?\n\nDon't. USB is far more reliable on Linux.\nBLE on Linux (BlueZ/bleak) has notification bugs, pairing inconsistencies, and random disconnects.\nSee references/SETUP.md for detailed findings."
      },
      {
        "title": "Further Reading",
        "body": "Meshtastic Docs\nMQTT Integration\nHardware Options"
      }
    ],
    "body": "Meshtastic Skill\n\nControl a Meshtastic node via USB for off-grid LoRa mesh communication.\n\nPrerequisites\nMeshtastic-compatible hardware (RAK4631, T-Beam, Heltec, LilyGo, etc.)\nUSB connection to host machine\nPython 3.9+ with meshtastic and paho-mqtt packages\nSee references/SETUP.md for full installation guide\nConfiguration\n\nEdit CONFIG.md with your node details, MQTT settings, and alert destinations.\n\nArchitecture\n┌─────────────────────────────────────────────────────────────┐\n│                    MQTT Bridge                               │\n├─────────────────────────────────────────────────────────────┤\n│  RECEIVE: mqtt.meshtastic.org (global JSON traffic)         │\n│  PUBLISH: optional map broker (protobuf)                    │\n│  SOCKET:  localhost:7331 (commands: send, status, toggle)   │\n├─────────────────────────────────────────────────────────────┤\n│  Files:                                                      │\n│  • /tmp/mesh_messages.txt - received messages log           │\n│  • /tmp/mesh_nodes.json   - cached node positions           │\n└─────────────────────────────────────────────────────────────┘\n\n┌─────────────┐     USB      ┌─────────────┐\n│  LoRa Node  │◄────────────►│ Bridge.py   │\n│  (Radio)    │              │  - Serial   │\n└─────────────┘              │  - Socket   │\n                             │  - MQTT     │\n                             └──────┬──────┘\n                                    │\n           ┌────────────────────────┼────────────────────────┐\n           │                        │                        │\n           ▼                        ▼                        ▼\n    localhost:7331           /tmp/mesh_*            MQTT Broker\n    (send commands)          (message logs)         (mesh traffic)\n\nQuick Reference\nSend Messages\n# Via socket (preferred - works while bridge running)\necho '{\"cmd\":\"send\",\"text\":\"Hello mesh!\"}' | nc -w 2 127.0.0.1 7331\n\n# Direct message to specific node\necho '{\"cmd\":\"send\",\"text\":\"Hey!\",\"to\":\"!abcd1234\"}' | nc -w 2 127.0.0.1 7331\n\n# Check status\necho '{\"cmd\":\"status\"}' | nc -w 2 127.0.0.1 7331\n\n# List RF nodes (seen via radio)\necho '{\"cmd\":\"nodes\"}' | nc -w 2 127.0.0.1 7331\n\nMap Visibility (if configured)\n# Toggle map publishing on/off\necho '{\"cmd\":\"map\"}' | nc -w 2 127.0.0.1 7331\n\n# Explicitly enable/disable\necho '{\"cmd\":\"map\",\"enable\":true}' | nc -w 2 127.0.0.1 7331\necho '{\"cmd\":\"map\",\"enable\":false}' | nc -w 2 127.0.0.1 7331\n\n# Force immediate position report\necho '{\"cmd\":\"map_now\"}' | nc -w 2 127.0.0.1 7331\n\nRead Messages\n# Recent messages (last 20)\ntail -20 /tmp/mesh_messages.txt\n\n# Filter common noise\ntail -50 /tmp/mesh_messages.txt | grep -v -E \"(Hello!|hey|mqtt-test)\"\n\nMessage Log Format\nTIMESTAMP|CHANNEL|SENDER|DISTANCE|TEXT\n2026-02-02T12:43:59|LongFast|!433bf114|1572km|Moin moin!\n\nBridge Service\n# Status\nsudo systemctl status meshtastic-bridge\n\n# Restart\nsudo systemctl restart meshtastic-bridge\n\n# View logs\nsudo journalctl -u meshtastic-bridge -f\n\n# Stop (needed for direct CLI access)\nsudo systemctl stop meshtastic-bridge\n\nMonitoring & Alerts\nOption 1: Cron Job (Recommended)\ncron.add({\n  name: \"mesh-monitor\",\n  schedule: { kind: \"every\", everyMs: 300000 },  // 5 min\n  sessionTarget: \"isolated\",\n  payload: {\n    kind: \"agentTurn\",\n    message: \"Check /tmp/mesh_messages.txt for new messages. Filter out noise (test messages, 'Hello!', 'hey'). Alert me of interesting ones with translations if non-English.\",\n    timeoutSeconds: 60,\n    deliver: true,\n    channel: \"telegram\"  // or your channel\n  }\n})\n\nOption 2: Digest Summary\ncron.add({\n  name: \"mesh-digest\",\n  schedule: { kind: \"cron\", expr: \"0 8,14,20 * * *\", tz: \"Europe/Madrid\" },\n  sessionTarget: \"isolated\",\n  payload: {\n    kind: \"agentTurn\",\n    message: \"Read /tmp/mesh_messages.txt. Create a digest of interesting messages from the last 6 hours. Translate non-English, guess country from distance. Post summary.\",\n    timeoutSeconds: 120,\n    deliver: true,\n    channel: \"telegram\"\n  }\n})\n\nOption 3: Spawned Monitor Agent\nsessions_spawn({\n  task: \"Monitor /tmp/mesh_messages.txt every 30 seconds. Alert me for interesting messages (not noise). Run for 1 hour.\",\n  label: \"mesh-monitor\",\n  runTimeoutSeconds: 3600\n})\n\nDistance Reference\n\nApproximate distances for country guessing (adjust for your location):\n\nDistance\tTypical Regions\n<500km\tNeighboring countries/regions\n500-1000km\tMedium range\n1000-1500km\tLong range\n1500-2000km\tVery long range (likely MQTT relay)\n>2000km\tMQTT-bridged traffic\nPrivacy Notes\nMap reports can use fuzzy positioning (~2km precision)\nPosition publishing can be toggled off entirely\nLocal RF messages are logged but not shared externally by default\nNever broadcast precise location in messages\nSupported Hardware\nDevice\tNotes\nRAK4631\tRecommended, reliable USB\nT-Beam\tPopular, has GPS\nHeltec V3\tBudget option\nLilyGo T-Echo\tE-paper display\n\nSee references/SETUP.md for hardware-specific setup.\n\nRegional Frequencies\nRegion\tFrequency\tTopic Root\nEurope\t868 MHz\tmsh/EU_868/2/json\nAmericas\t915 MHz\tmsh/US/2/json\nAustralia/NZ\t915 MHz\tmsh/ANZ/2/json\nFiles\n~/.openclaw/skills/meshtastic/\n├── SKILL.md           # This file\n├── CONFIG.md          # Your configuration\n├── scripts/\n│   └── mesh.py        # CLI wrapper\n└── references/\n    └── SETUP.md       # Installation guide\n\nTroubleshooting\n\n\"Resource temporarily unavailable\"\n\nOnly one process can use serial port at a time\nStop bridge before direct CLI: sudo systemctl stop meshtastic-bridge\n\nNo messages appearing\n\nCheck MQTT subscription topic matches your region\nVerify firewall allows outbound port 1883\nCheck journalctl -u meshtastic-bridge for errors\n\nCan't send messages\n\nEnsure bridge is running (socket server)\nCheck serial port path in config\nTry: echo '{\"cmd\":\"status\"}' | nc -w 2 127.0.0.1 7331\n\nConsidering BLE instead of USB?\n\nDon't. USB is far more reliable on Linux.\nBLE on Linux (BlueZ/bleak) has notification bugs, pairing inconsistencies, and random disconnects.\nSee references/SETUP.md for detailed findings.\nFurther Reading\nMeshtastic Docs\nMQTT Integration\nHardware Options"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/lukevr/meshtastic-skill",
    "publisherUrl": "https://clawhub.ai/lukevr/meshtastic-skill",
    "owner": "lukevr",
    "version": "0.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/meshtastic-skill",
    "downloadUrl": "https://openagent3.xyz/downloads/meshtastic-skill",
    "agentUrl": "https://openagent3.xyz/skills/meshtastic-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/meshtastic-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/meshtastic-skill/agent.md"
  }
}