ClawKit Logo
ClawKitReliability Toolkit
Back to Registry
Official Verified

localsend

Send and receive files to/from nearby devices using the LocalSend protocol. Trigger with /localsend to get an interactive Telegram menu with real inline buttons — device discovery, file sending, text sending, and receiving.

skill-install — Terminal

Install via CLI (Recommended)

clawhub install openclaw/skills/skills/chordlini/localsend
Or

LocalSend

Interactive file transfer between devices on the local network using real Telegram inline keyboard buttons. Works with any device running the LocalSend app (Android, iOS, Windows, macOS, Linux).

Install

The localsend-cli is a zero-dependency Python CLI. Install from GitHub:

curl -fsSL https://raw.githubusercontent.com/Chordlini/localsend-cli/master/localsend-cli -o ~/.local/bin/localsend-cli
chmod +x ~/.local/bin/localsend-cli

Full docs: https://github.com/Chordlini/localsend-cli

Requires Python 3.8+ and openssl (for TLS).


Telegram Button Format

All menus MUST use OpenClaw's inline button format. Send buttons alongside your message using this structure:

buttons: [
  [{ "text": "Label", "callback_data": "ls:action" }],
  [{ "text": "Row 2", "callback_data": "ls:other" }]
]
  • Outer array = rows of buttons
  • Inner array = buttons per row (max 3 per row for readability)
  • Prefix all callback_data with ls: to namespace this skill
  • When user taps a button, you receive: callback_data: ls:action

State Awareness (CRITICAL)

This skill uses conversational state. Track where you are in the flow:

StateMeaningNext user input should be treated as...
idleNo active flowNormal message — respond normally
awaiting_fileAsked user to drop/specify a file to sendThe file to send — do NOT comment on it, describe it, or react to it. Immediately use it as the send payload.
awaiting_textAsked user to type text to sendThe text payload — send it, don't discuss it
awaiting_confirmWaiting for send confirmationExpect ls:confirm-send or ls:menu
receivingReceiver is activeMonitor for incoming files

RULES:

  • When in awaiting_file state and user sends an image/file/path → treat it as the file to send. Show confirmation buttons immediately.
  • When in awaiting_text state and user types anything → treat it as the text to send.
  • NEVER comment on, describe, or react to a file/image when you're in awaiting_file state.
  • State resets to idle when user taps ls:menu or the flow completes.

On Trigger: Main Menu

When the user types /localsend or mentions sending/receiving files locally, send this message with real inline buttons:

Message:

📡 LocalSend — File Transfer

Buttons:

buttons: [
  [
    { "text": "📤 Send", "callback_data": "ls:send" },
    { "text": "📥 Receive", "callback_data": "ls:receive" }
  ],
  [
    { "text": "🔍 Scan Devices", "callback_data": "ls:devices" }
  ]
]

Do NOT run any commands yet. Wait for the button tap.


Flow: Scan Devices

Trigger: callback_data: ls:devices or user says "scan", "discover", "find devices"

  1. Run:

    localsend-cli discover --json -t 2
    
  2. Devices found — create one button per device, plus Refresh and Back:

Metadata

Author@chordlini
Stars3683
Views1
Updated2026-04-01
View Author Profile
AI Skill Finder

Not sure this is the right skill?

Describe what you want to build — we'll match you to the best skill from 16,000+ options.

Find the right skill
Add to Configuration

Paste this into your clawhub.json to enable this plugin.

{
  "plugins": {
    "official-chordlini-localsend": {
      "enabled": true,
      "auto_update": true
    }
  }
}
Safety NoteClawKit audits metadata but not runtime behavior. Use with caution.