Skip to content
Agentmart
Submit a tool

tailnet-transfer

Skill by VariableThe

IndexedMIT
Write a review

Chalk Labs

Need help deploying tailnet-transfer?

Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.

Book a call

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/variablethe-tailnet-transfer

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

The publisher has not written a description yet.

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions: not checked yet.

What's inside

Skill name
tailnet-transfer
Description
None
License
MIT
Instructions
177 lines in SKILL.md · view on GitHub

Before installing

  • Ships executable scripts
  • Instructions call the network
  • Instructions read files in your home folder (~/.ssh, ~/.aws…)

Agent Skills spec issues

  • invalid YAML frontmatter: Nested mappings are not allowed in compact mappings at line 2, column 14:
  • name: missing
  • description: missing

Files (2)

  • SKILL.md
  • tailnet_transfer.py · scripts/

SKILL.md (first lines)

# Tailnet Transfer

One entry point for moving files between this host and the other devices on
the tailnet: `scripts/tailnet_transfer.py`. It resolves peers from
`tailscale status --json`, picks the mechanism that fits the payload, and
never invents a URL.

## Purpose

Three ways to move a file across the tailnet, one CLI:

- `send` picks Taildrop, rsync, or scp from peer state, payload size, and
  what each end actually supports.
- `recv` drains the Taildrop inbox on this host into a directory.
- `serve` exposes one directory over HTTPS on the tailnet for the duration
  of the command, then removes its own mapping.

Scripts are stdlib-only: `python3 scripts/tailnet_transfer.py --help` works
with zero setup.

## Device inventory

The tailnet's peers are resolved at runtime from `tailscale status --json`;
this skill ships no fixed device list. Run:

```sh
python3 scripts/tailnet_transfer.py peers
```

to print your own inventory (hostname, OS, online state, IP, SSH
reachability, and receive path). Re-check before promising a transfer —
`peers` is cheap.

## Mechanisms

| Mechanism | Needs | Best for | Limits |
| --- | --- | --- | --- |
| Taildrop (`tailscale file cp`) | tailscale on both ends, file sharing enabled by ACL | single files or directories to any peer, including phones, macOS, and offline peers | queued by tailscaled, no delivery confirmation; permissions and timestamps are not preserved |
| rsync over SSH | online peer, your SSH key accepted, rsync on both ends | bulk, resumable, directories, `--bwlimit`, sha256 verification | needs a key on the peer; not available for macOS or phones |
| scp over SSH | online peer, your SSH key accepted | same as rsync when local rsync is missing | no resume, no partial files; `--bwlimit` is converted to scp's Kbit/s |
| tailshare HTTP | `tailshare` on PATH plus a foreground server on this host | pulling a file with curl/wget from another machine | this host must stay up; tailnet only, never funnel; access is tailnet membership |

The helper targets Taildrop by peer IP, not hostname: MagicDNS resolution is
unreliable on this host. SSH paths use the peer's short DNS name so any
`~/.ssh/config` alias (user, options) applies.

What the helper actually runs, so a failure can be reproduced by hand:

```sh
# send --via taildrop (IP target; queued, not delivered)
tailscale file cp FILE... <peer-ip>:

# send --via rsync (--partial keeps a resumable fragment; --bwlimit KB/s)
rsync -a --partial [--bwlimit=20000] SRC... <peer>:/tmp/incoming/

# send --via scp (--bwlimit is converted to scp's Kbit/s)
scp -r [-l KBPS*8] SRC... <peer>:/tmp/incoming/

# verification after rsync/scp: sha256 on both ends, then `Checksums: OK`
ssh <peer> -- 'cd /tmp/incoming && sha256sum -- FILE'

# recv: drain the inbox, however long it takes
tailscale file get --conflict=skip [--wait] [--loop] DEST

# serve: loopback HTTP server plus one tailshare mapping, removed on exit
python3 -m http.server 8765 --bind 127.0.0.1 --directory DIR
tailshare share 8765 --path /tt     # prints https://host.<tailnet>.ts.net/tt
```

## Auto-selection

`send` chooses in this order:

1. Peer not in `tailscale status --json`, or matches more than one node:
   `Error:` and exit 1.
2. Peer offline → Taildrop (queued until it returns).
3. Bulk payload — a directory, more than one source, `--resume`, or more
   than 50 MiB total — plus a passing SSH probe plus rsync locally → rsync.
4. Bulk plus SSH but no local rsync → scp (skipped if scp is missing too).
5. Anything else → Taildrop; a single small file needs no SSH key.

`--via {auto,taildrop,rsync,scp}` overrides the decision and validates it:
offline peer plus `--via rsync` fails with a pointer back to Taildrop, and a
failed SSH probe fails instead of silently degrading. Add `--dry-run` to see
the choice and its reason without moving anything.

## Usage

```sh
S=scripts/tailnet_transfer.py

# Inventory: peer, OS, online state, IP, SSH reachability, receive path
python3 $S peers
python3 $S peers --online-only --json | python3 -m json.tool

# Small file to a peer with no SSH key (phone, a Mac) or any offline peer
python3 $S send photo.jpg --to an-android-phone

# Bulk or resumable: directory over rsync with sha256 on both ends
python3 $S send ~/Videos/clip.mp4 --to <peer> --dest /tmp/incoming/ --resume
python3 $S send ./dataset --to <peer> --via rsync --bwlimit 20000

# Drain the inbox on a headless Linux box (no daemon is installed there)
ssh <peer> -- 'timeout 20 tailscale file get --wait /tmp/inbox'

# This host: receive as files arrive, overwrite name conflicts
python3 $S recv ~/Downloads --loop --conflict=overwrite

# Share a directory over HTTPS until Ctrl-C
python3 $S serve /tmp/release --port 8765 --path /tt
```

`send` prints one summary line (`Checksums: OK` after rsync/scp verification)
or `Error:` on stderr with exit 1. Taildrop lines say queued, never delivered.

Every subcommand fails with a single `Error: <reason>` line on stderr and
exit 1 — subprocess failures quote the first stderr line of the tool that
failed, and a missing binary reads `Error: <bin> not found on PATH.` Invalid
flags exit 2 (argparse). `recv --loop` and `serve` leave 130 and 0 on SIGINT,

From VariableThe/agent-kit-public, MIT.

Signals

Stars
0
Forks
0
Open issues
0
Last commit (this folder)
Oct 23, 2026 (7 days ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

Done for you

Rather not set it up yourself?

Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.

See how we build AI agents →Read the case studies

Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.

launches shipped
50+
launches shipped
media placements
500+
media placements
founders on every account
2
founders on every account

Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block

Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.

Get tailnet-transfer running in your business

Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying tailnet-transfer?

CallGet help
Cite this page

tailnet-transfer skill. Agent Mart. https://agentmart.dev/skills/variablethe-tailnet-transfer (last updated 2026-10-24)