โ† All skills
Tencent SkillHub ยท Communication & Collaboration

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 butt...

skill openclawclawhub Free
0 Downloads
0 Stars
0 Installs
0 Score
High Signal

Send and receive files to/from nearby devices using the LocalSend protocol. Trigger with /localsend to get an interactive Telegram menu with real inline butt...

โฌ‡ 0 downloads โ˜… 0 stars Unverified but indexed

Install for OpenClaw

Quick setup
  1. Download the package from Yavira.
  2. Extract the archive and review SKILL.md first.
  3. Import or place the package into your OpenClaw setup.

Requirements

Target platform
OpenClaw
Install method
Manual import
Extraction
Extract archive
Prerequisites
OpenClaw
Primary doc
SKILL.md

Package facts

Download mode
Yavira redirect
Package format
ZIP package
Source platform
Tencent SkillHub
What's included
SKILL.md, references/protocol.md

Validation

  • Use the Yavira download entry.
  • Review SKILL.md after the package is downloaded.
  • Confirm the extracted package contains the expected setup assets.

Install with your agent

Agent handoff

Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.

  1. Download the package from Yavira.
  2. Extract it into a folder your agent can access.
  3. Paste one of the prompts below and point your agent at the extracted folder.
New install

I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.

Upgrade existing

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. Summarize what changed and any follow-up checks I should run.

Trust & source

Release facts

Source
Tencent SkillHub
Verification
Indexed source record
Version
3.4.0

Documentation

ClawHub primary doc Primary doc: SKILL.md 24 sections Open source page

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 normallyawaiting_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 itawaiting_confirmWaiting for send confirmationExpect ls:confirm-send or ls:menureceivingReceiver 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" Run: localsend-cli discover --json -t 2 Devices found โ€” create one button per device, plus Refresh and Back: Message: ๐Ÿ“ก Found 3 devices: Buttons (one device per row): buttons: [ [{ "text": "๐Ÿ“ฑ Fast Potato โ€” 192.168.0.148", "callback_data": "ls:dev:Fast Potato" }], [{ "text": "๐Ÿ’ป Rami-Desktop โ€” 192.168.0.100", "callback_data": "ls:dev:Rami-Desktop" }], [{ "text": "๐Ÿ–ฅ๏ธ Living Room PC โ€” 192.168.0.105", "callback_data": "ls:dev:Living Room PC" }], [ { "text": "๐Ÿ”„ Refresh", "callback_data": "ls:devices" }, { "text": "โฌ…๏ธ Back", "callback_data": "ls:menu" } ] ] No devices found: Message: ๐Ÿ“ก No devices found. Make sure LocalSend is open on the other device and both are on the same WiFi. Buttons: buttons: [ [ { "text": "๐Ÿ”„ Try Again", "callback_data": "ls:devices" }, { "text": "โฌ…๏ธ Back", "callback_data": "ls:menu" } ] ] User taps a device (callback_data: ls:dev:DEVICENAME) โ€” store it as the selected target. Show action menu: Message: โœ… Selected: Fast Potato (192.168.0.148) What do you want to do? Buttons: buttons: [ [ { "text": "๐Ÿ“„ Send File", "callback_data": "ls:sendfile" }, { "text": "๐Ÿ“ Send Text", "callback_data": "ls:sendtext" } ], [ { "text": "๐Ÿ“ฆ Send Multiple", "callback_data": "ls:sendmulti" }, { "text": "โฌ…๏ธ Back", "callback_data": "ls:devices" } ] ]

Flow: Send

Trigger: callback_data: ls:send

Step 1 โ€” Pick target device (if not already selected)

Run discover and show device picker (see Scan Devices flow above).

Step 2 โ€” Choose what to send

Message: Send to Fast Potato: Buttons: buttons: [ [ { "text": "๐Ÿ“„ Send File", "callback_data": "ls:sendfile" }, { "text": "๐Ÿ“ Send Text", "callback_data": "ls:sendtext" } ], [ { "text": "๐Ÿ“ฆ Send Multiple", "callback_data": "ls:sendmulti" }, { "text": "โฌ…๏ธ Back", "callback_data": "ls:menu" } ] ]

Send File (callback_data: ls:sendfile)

Ask: "Send me the file, drop a path, or tell me which file to send" User provides file path or sends a file via chat Get file size with stat or ls -lh Confirm with buttons: Message: ๐Ÿ“ค Send to Fast Potato? ๐Ÿ“„ project.zip โ€” 4.2 MB Buttons: buttons: [ [ { "text": "โœ… Send", "callback_data": "ls:confirm-send" }, { "text": "โŒ Cancel", "callback_data": "ls:menu" } ] ] On confirm, run: localsend-cli send --to "Fast Potato" /path/to/project.zip Report result: Message: โœ… Sent project.zip (4.2 MB) to Fast Potato Buttons: buttons: [ [ { "text": "๐Ÿ“ค Send Another", "callback_data": "ls:send" }, { "text": "โฌ…๏ธ Menu", "callback_data": "ls:menu" } ] ]

Send Text (callback_data: ls:sendtext)

Ask: "Type the text you want to send:" User types their message Write text to temp file, send: echo "user's text" > /tmp/localsend-text.txt localsend-cli send --to "Fast Potato" /tmp/localsend-text.txt rm /tmp/localsend-text.txt Confirm: Message: โœ… Text sent to Fast Potato Buttons: buttons: [ [ { "text": "๐Ÿ“ Send More Text", "callback_data": "ls:sendtext" }, { "text": "๐Ÿ“ค Send File", "callback_data": "ls:sendfile" } ], [{ "text": "โฌ…๏ธ Menu", "callback_data": "ls:menu" }] ]

Send Multiple (callback_data: ls:sendmulti)

Ask: "List the files or give me a glob pattern (e.g. ~/Screenshots/*.png)" User provides paths or pattern Expand glob, list files with sizes: Message: ๐Ÿ“ฆ Send 5 files to Fast Potato? ๐Ÿ“„ photo1.jpg โ€” 2.1 MB ๐Ÿ“„ photo2.jpg โ€” 1.8 MB ๐Ÿ“„ photo3.jpg โ€” 3.2 MB ๐Ÿ“„ photo4.jpg โ€” 2.5 MB ๐Ÿ“„ photo5.jpg โ€” 1.9 MB ๐Ÿ“Š Total: 11.5 MB Buttons: buttons: [ [ { "text": "โœ… Send All", "callback_data": "ls:confirm-send" }, { "text": "โŒ Cancel", "callback_data": "ls:menu" } ] ] On confirm, run: localsend-cli send --to "Fast Potato" photo1.jpg photo2.jpg photo3.jpg photo4.jpg photo5.jpg Report: Message: โœ… Sent 5 files (11.5 MB) to Fast Potato Buttons: buttons: [ [ { "text": "๐Ÿ“ค Send More", "callback_data": "ls:send" }, { "text": "โฌ…๏ธ Menu", "callback_data": "ls:menu" } ] ]

Flow: Receive

Trigger: callback_data: ls:receive or user says "receive", "start receiving", "listen"

Step 1 โ€” Snapshot current files

ls -1 /home/rami/.openclaw/workspace/_incoming/ > /tmp/localsend-before.txt

Step 2 โ€” Start receiver in background

localsend-cli --alias openclaw-workspace receive --save-dir /home/rami/.openclaw/workspace/_incoming/ -y Run with run_in_background: true. Store the task ID. CRITICAL: --alias MUST come BEFORE receive (global flag).

Step 3 โ€” Confirm ready with buttons

Message: ๐Ÿ“ก Receiver active โ€” "openclaw-workspace" ๐Ÿ“ Saving to: ~/incoming/ โœ… Auto-accept: ON Send files from your device whenever ready. Buttons: buttons: [ [ { "text": "๐Ÿ›‘ Stop", "callback_data": "ls:stop" }, { "text": "๐Ÿ”„ Status", "callback_data": "ls:status" } ] ]

Step 4 โ€” Monitor for incoming files

Poll every 3 seconds for new files: ls -1 /home/rami/.openclaw/workspace/_incoming/ > /tmp/localsend-after.txt diff /tmp/localsend-before.txt /tmp/localsend-after.txt

Step 5 โ€” Post-receive confirmation (MANDATORY)

When file(s) arrive, immediately present in chat with inline buttons. Single file: Message: โœ… Received from Fast Potato: ๐Ÿ“„ portfolio.zip โ€” 240 MB ๐Ÿ“ Saved to: ~/incoming/portfolio.zip Buttons (contextual by file type): buttons: [ [ { "text": "๐Ÿ“‚ Extract", "callback_data": "ls:extract" }, { "text": "๐Ÿš€ Deploy", "callback_data": "ls:deploy" } ], [ { "text": "๐Ÿ“ฅ Receive More", "callback_data": "ls:receive" }, { "text": "๐Ÿ›‘ Stop", "callback_data": "ls:stop" } ] ] Image file โ€” show inline preview: Message: โœ… Received from Fast Potato: ๐Ÿ–ผ๏ธ screenshot.png โ€” 2.1 MB Include MEDIA:~/incoming/screenshot.png for inline preview. Buttons: buttons: [ [ { "text": "๐Ÿ“‚ Open Folder", "callback_data": "ls:openfolder" }, { "text": "๐Ÿ“ฅ Receive More", "callback_data": "ls:receive" } ], [{ "text": "๐Ÿ›‘ Stop", "callback_data": "ls:stop" }] ] Multiple files: Message: โœ… Received 3 files from Fast Potato: ๐Ÿ“„ app.apk โ€” 45 MB ๐Ÿ“„ README.md โ€” 2 KB ๐Ÿ–ผ๏ธ icon.png โ€” 128 KB ๐Ÿ“Š Total: 45.1 MB Buttons: buttons: [ [ { "text": "๐Ÿ“‚ Show All", "callback_data": "ls:showall" }, { "text": "๐Ÿ“ฅ Receive More", "callback_data": "ls:receive" } ], [{ "text": "๐Ÿ›‘ Stop", "callback_data": "ls:stop" }] ] Contextual button rules by file type: .zip, .tar.gz โ†’ add ๐Ÿ“‚ Extract button .png, .jpg, .gif, .webp โ†’ show MEDIA: inline + ๐Ÿ“‚ Open Folder .apk โ†’ add ๐Ÿ“ฑ Install button .html, .js, .py โ†’ add ๐Ÿ‘๏ธ Preview button website archives โ†’ add ๐Ÿš€ Deploy button

Step 6 โ€” Stop receiver

Trigger: callback_data: ls:stop Kill the background task using stored task ID Confirm: Message: ๐Ÿ›‘ Receiver stopped. Buttons: buttons: [ [ { "text": "๐Ÿ“ก Restart", "callback_data": "ls:receive" }, { "text": "โฌ…๏ธ Menu", "callback_data": "ls:menu" } ] ]

Flow: Status Check

Trigger: callback_data: ls:status Check if receiver is running and count new files: ls -1 /home/rami/.openclaw/workspace/_incoming/ > /tmp/localsend-after.txt diff /tmp/localsend-before.txt /tmp/localsend-after.txt | grep "^>" | wc -l Message: ๐Ÿ“ก Receiver: Running (12 min) ๐Ÿ“ Files received: 2 ๐Ÿ“Š Total: 242 MB Buttons: buttons: [ [ { "text": "๐Ÿ›‘ Stop", "callback_data": "ls:stop" }, { "text": "๐Ÿ“‚ Show Files", "callback_data": "ls:showall" } ] ]

Callback Data Reference

callback_dataActionls:menuShow main menuls:sendStart send flowls:receiveStart receive flowls:devicesDiscover devicesls:dev:DEVICENAMESelect a specific devicels:sendfileSend single filels:sendtextSend text messagels:sendmultiSend multiple filesls:confirm-sendConfirm and execute sendls:stopStop receiverls:statusCheck receiver statusls:extractExtract received archivels:deployDeploy received websitels:openfolderOpen save directoryls:showallList all received files

CLI Reference

CommandUsageDiscoverlocalsend-cli discover --json -t 2Sendlocalsend-cli send --to "DEVICE" file1 file2 ...Receivelocalsend-cli --alias NAME receive --save-dir DIR -y FlagScopeDescription--alias NAMEGlobal (before subcommand)Device name to advertise--to NAMEsendTarget device (case-insensitive substring)-t NdiscoverScan duration in seconds (use 2 for speed)--jsondiscoverMachine-readable output--save-dir DIRreceiveSave location (default: ~/Downloads)-yreceiveAuto-accept transfers

Troubleshooting

ProblemFixunrecognized arguments: --aliasMove --alias BEFORE the subcommandNo devices foundOpen LocalSend on target, same WiFi, screen onPort 53317 in useNormal โ€” CLI auto-falls back to 53318/53319Transfer declined (403)Use -y on receiver sideTransfer hangsLarge file on slow WiFi โ€” be patient

Reference

CLI repo & docs: https://github.com/Chordlini/localsend-cli LocalSend protocol: references/protocol.md or https://github.com/localsend/protocol

Category context

Messaging, meetings, inboxes, CRM, and teammate communication surfaces.

Source: Tencent SkillHub

Largest current source with strong distribution and engagement signals.

Package contents

Included in package
2 Docs
  • SKILL.md Primary doc
  • references/protocol.md Docs