yeet   yeet the bytes ~sgriggs
 

Yeet the bytes. A stupid-fast, fully-threaded, drop-in cp that takes "slow" as a personal insult; and hauls ass across WANs with parallel raw TCP.

Current line: yeet 0.8.0-m8 (compression landed). Source tarball and portable packages are under Download. Portable packages on this page are still cut from 0.7.0-m7 until those builders are re-run; the source release tracks HEAD.

Jump: Features | Memory-go-round | vs rsync | Screenshots | GUI plans | Download | Checksums

 

Meet Yeety

Yeety the network chameleon; original line art

Yeety, the network chameleon: original line art used to edge-trace the ASCII portrait in README.txt. Yeety susses the link and changes to fit it. When there is a real way to go faster next time, Yeety says so. (Artwork checked into the tree at art/yeety.jpg.)

 

The pitch

cp never heard of a network. rsync is still writing the checksum thesis (and it is excellent at that job; see fair comparison). yeet copies. Locally it is a drop-in cp. Across a wire it opens many raw TCP streams and fills them, with consideration of the Bandwidth-Delay Product (BDP).

No encryption on that path. You name both ends. Trusted network. Speed first. Move the bytes. Now.

 

What it does

From the README, in plain English:

 

The memory-go-round

A network send does not hand bytes from the disk to the socket. They ride a memory-go-round: one userspace reservoir, shared by the streams. Onboard streams fill the buffer and iron out latency from metadata crawls, compression, or any other alteration of the data. The goal is to stay ahead of the network streams, which are breaking the buffer up as they feed threads waiting on the far side. Fancy water wheel; multiple buckets filling and dumping the same reservoir.

Size comes from the path: bandwidth times delay, with a two-second cap and a ceiling of 3.8 GiB so a 32-bit process still has a chance. If that allocation will not fit, yeet balks. Tune it with --send-buffer / --trap.

 

Fair comparison: yeet vs rsync

rsync is a mature, widely installed synchronizer. yeet is a hauler. They overlap on "get these files over there," and diverge on almost everything else. Use the tool that matches the job.

Topic yeet rsync
Job it was built for Bulk copy: local cp replacement + fill a fat trusted pipe Sync / mirror / backup; update a tree that already mostly matches
Algorithm Full copy. No rolling checksum. No delta. Rolling-checksum delta: send only what changed (when that wins)
Local copy First-class: never slower than cp (bench-guarded) Works, but not the sweet spot; more machinery than a plain copy needs
Network transport Many parallel raw TCP streams; auto stream count from RTT ("sussing"); host cache in ~/.yeet/hosts Typically one SSH (or rsync daemon) channel; one TCP window
Encryption None on the data path. Trusted network. Tunnel it yourself if you must. Auth is a shared --token. Usually SSH: encrypts and authenticates. Right default on the open Internet.
When it wins Big trees / big files over a fat LAN or trusted WAN where the whole payload must move; CoW reflink locally; sparse VM images Nightly backups, mirrors, intermittent links, untrusted networks, "only send what changed"
When it loses Untrusted networks without a tunnel; "sync this tree that is 99% identical" Cold first copy of a huge tree over a high-BDP link (one stream leaves bandwidth on the table); local CoW clone jobs
Resume --partial: skip files the dest already has; resume a partial file at the byte it stopped Mature partial / resume / --append story
Filters / includes -X / --diss (path or glob) Deep include/exclude rules; decades of operator muscle memory
Install base Young; portable packages for several Unices on this page Everywhere. Your grandmother's NAS has it.

Honest one-liner: rsync for sync; yeet for haul. If the destination is empty or wildly different and the pipe is fat and trusted, yeet is the tool that fills it. If you are updating a backup that mostly matches, rsync's delta still earns its keep; and yeet will not pretend otherwise. (Thanks, Tridge.)

 

Simulated screenshots

Terminal sessions (simulated). Receiver first, then sender; that is the required order. Progress lines are representative of a mid-transfer run.

1. Catcher (server / receiver)

priori$ yeet --catch-this /incoming --gen-token --one-shot --progress

yeet 0.8.0-m8; catcher
listening on 0.0.0.0:9338  (YEET on a phone keypad)
token: 7f3c9a2e1b0d4e68   <- give this to the sender

waiting for a peer...
peer 10.0.0.42 connected; token ok
receiving tree -> /incoming/
  [########------------]  42%   1.1G / 2.6G   8 streams   118 MB/s
  workers: vacation.mov  IMG_2041.jpg  IMG_2042.jpg  ...
done. 2041 files, 2.6G in 22s. one-shot; catcher exiting.
priori$
Host priori: yeet --catch-this /incoming --gen-token --one-shot. Prints a token, listens on 9338, receives one shot, exits.

2. Flinger (client / sender)

moria$ yeet --yeet-to priori:9338 ./photos \
        --token '7f3c9a2e1b0d4e68' --suss --progress --verify

yeet 0.8.0-m8; flinging ./photos -> priori:9338
Yeety clocked the link at 12.4 ms RTT; opening 8 streams to fill it.

  [########------------]  42%   1.1G / 2.6G   8 streams   118 MB/s
  ETA about 13s   verify: on   compress: auto-off

done. 2041 files, 2.6G in 22s (avg 118 MB/s). verify ok (CRC-32C).

Yeety the network chameleon says:
  next time, peep game: this link still had headroom with --rush-it.
moria$
Host moria: yeet --yeet-to priori:9338 ./photos --token ... --suss --verify. Susses the link, opens parallel streams, verifies with CRC-32C.

3. Local drop-in cp

moria$ yeet -rp --send-it ./mordor /vault/mordor
moria$ yeet --who-dis
yeet 0.8.0-m8
moria$
Same flags as cp -rp, plus --send-it when you mean it. On a CoW volume this path can reflink instead of reading every byte.
 

GUI / TUI plans (public summary)

A graphical front end is planned as Phase 2, not shipped with the current line. Core yeet will never link a UI toolkit. The UI is a separate process that consumes the same --json event stream and talks back on the --control channel (pause / resume / cancel / set-bwlimit) that already exists. One seam, three consumers: TUI, GUI, and scripts.

What we are aiming at:

Hard no on Qt. Phase 2 GUI is libcyui first; Motif only as required. Details: FUTURE-GUI.TXT section 6, docs/GUI-SPEC.md.

In-tree notes (workshop, not the release tarball): FUTURE-GUI.TXT, docs/GUI-SPEC.md, docs/GUI-MILESTONES.md. Prerequisite still open: extend --json/--control to local-copy mode (GUI M0) before GUI M1 starts.

 

Quick start

# local; drop-in cp
yeet bigfile.iso /vault/
yeet -r ./mordor /backup/
yeet --send-it -r ./mordor /backup/     # -f -r, with feeling

# build (portable /bin/sh configure, no autoconf circus)
./configure
make
make test
make bench

# network; receiver, then sender
yeet --catch-this /incoming --gen-token --one-shot
yeet --yeet-to host:9338 ./tree --token 'the-shared-secret'

Default receiver port is 9338. Every serious flag also answers to a cheeky alias. See yeet --help or man yeet.

 

Status

Current release line: yeet 0.8.0-m8. C99 + POSIX + pthreads. Portable packages on this page for Linux, Solaris, AIX, NetBSD, FreeBSD, IRIX, and Tru64 (packages below are still 0.7.0-m7 until re-cut). Dual license: BSD 2-clause or MIT (see LICENSE).

Milestone What State
M0skeleton, configure, testsdone
M1local copy: adaptive dispatch, reflink, sparse, segmentsdone
M2trees, metadata, specials, safe walkdone
M3pack/unpack (aggregated small-file engine)done
M4sussing (measure + tune)done
M5raw-TCP network, striping, token, bwlimitdone
M6verify, partial resume, durable flushdone
M7json events, control channel, progress stylesdone
M8compression (lz4/zstd); suss auto-on; memory-go-rounddone
M9+glitz / security audit / more perf (see ROADMAP)planned
Phase 2TUI / libcyui (+ Motif) GUI on the json+control seamplanned (not started)
 

Flags worth knowing

Subset of yeet --help (every flag has a cheeky twin):

  -f / --force / --send-it
  -i / --interactive / --you-sure
  -n / --no-clobber / --hands-off
  -p / --preserve / --keep-it-real
  -r / --recursive / --all-in
  -X / --exclude / --diss PATH
  -v / --verbose / --yap
      --pack / --box-it-up
      --unpack / --unbox-it
      --streams / --how-many-hands N
      --bwlimit / --chill RATE
      --send-buffer / --trap SIZE
      --verify / --for-real
      --compress / --squish
      --partial / --carry-on
      --durable / --for-keeps
      --keep-going / --plow-on
      --rush-it
      --json / --beep-boop
      --control / --take-requests
      --progress / --slack[=dots|meter|spinner]
      --suss / --street-knowledge
      --catch-this / --rawdog-server DEST
      --yeet-to / --fling-at HOST:PORT SRC
      --token / --secret-handshake S
      --gen-token / --surprise-me
      --help / --halp
      --version / --who-dis
 

Download

Every tarball on this page has a SHA-256 and an MD5 sidecar. Master lists (all artifacts): SHA256SUMS, MD5SUMS. Verify before you install. MD5 is for old boxes that still ship md5 / md5sum; prefer SHA-256 when you have it.

Source release (build it yourself). Tracks the current line:

Binary packages (EPM portable, install prefix /usr/local). These are still cut from 0.7.0-m7. Extract the tarball and run ./yeet.install as root:

Checksums

Values below match the sidecar files and the master SHA256SUMS / MD5SUMS lists. Sidecar format is hash  filename (two spaces), same as sha256sum / md5sum / NetBSD sha256 -q + filename.

File SHA-256 MD5
yeet-0.8.0-m8.tar.gz e7b16822c169bf9836cf2407788881839980982602f98163887dff357effcd60 072c95ef341464d99802e009d0b05c05
yeet-0.7.0-m7.tar.gz f0d56de0ea91ea2b4a5359b06fa73af22dd8aa70ae5b8abeef5feed845c3aae6 69c687e21574be6d9a27405a69704db6
yeet-0.7.0-m7-x86_64-linux-6.12.tar.gz f46d1d1c941875d415327a247628303db8def822c546e842b871aa9ae2ac95d8 b750d2da8c3a0bf88e3d15ff0642f70a
yeet-0.7.0-m7-sparc-solaris-8.tar.gz 13a6b7a750bca7d3e984569c3a9d7deac54525539ab0d5db0521747dc8ab31c3 81a849ec8aae666a24f2c5fd287b8f9a
yeet-0.7.0-m7-ppc-aix-6.1.tar.gz 8edede4a3425284cdffe24eb093ceff1047070e0b43535d0001c4f44d5cda777 00fdb002d475cdb3b2095005e0f81c23
yeet-0.7.0-m7-amd64-netbsd-10.1.tar.gz fa8f49f72dcfddc4673c903282c0d1f181e9b0318ec62ad6c4f5dc62865be118 de0c18e33ec293c2180a8665f364c285
yeet-0.7.0-m7-amd64-netbsd-10.0.tar.gz 8871e94f124222aab7d05ca82911bb6e8314ff4336e9959600e619b559b9d5e9 06cc7048efbd7194fbe9cf061a99724b
yeet-0.7.0-m7-amd64-freebsd-14.1.tar.gz 954dcd00345b34a1394e2c9a5f6de32af43afe65336db951fe9d9fd57847fff4 f84828384afef0088b5040ee9adefd97
yeet-0.7.0-m7-mips-irix-6.5.tar.gz beada0ec34a6173fafd414e0dd7cdb10d8eda72bacabf295ed2188fef3eb893d ae86b3141c32244dc512bd79efcc4f9f
yeet-0.7.0-m7-alpha-tru64-5.1.tar.gz f51c269726b7c136f8884a3fb1406904712fc60f72408238579c9aabeabaf987 5a79f13f915258870fb8a5aa51cefc81

How to verify (pick what your box has):

# GNU / Linux
sha256sum -c yeet-0.8.0-m8.tar.gz.sha256
md5sum -c yeet-0.8.0-m8.tar.gz.md5
# or check the whole set:
sha256sum -c SHA256SUMS
md5sum -c MD5SUMS

# NetBSD / OpenBSD-style
sha256 -c SHA256SUMS
md5 -c MD5SUMS
curl -O https://niten.irix.expert/~sgriggs/yeet/yeet-0.8.0-m8.tar.gz
curl -O https://niten.irix.expert/~sgriggs/yeet/yeet-0.8.0-m8.tar.gz.sha256
sha256sum -c yeet-0.8.0-m8.tar.gz.sha256
tar xzf yeet-0.8.0-m8.tar.gz
cd yeet-0.8.0-m8
./configure && make && make test
# optional: make install   (PREFIX=/usr/local by default)

What you get: C sources under src/, headers, portable configure, Makefile.in, man/yeet.1, README.txt, and LICENSE. No workshop notes, no tests tree, no agent files; just what you need to build. Private git remote on niten: testguy@niten:git/yeet.git (ask Swift if you need a clone). EPM list file lives in-tree at packaging/yeet.list. Yeety line art: art/yeety.jpg (also yeety.jpg on this page).

 

Hard lines (from the spec)

 

Back to Swift Griggs

Updated 29 September 2026. Line: yeet-0.8.0-m8. Same teal/indigo chrome as the home page. Sources: README.txt, LICENSE, docs/SPEC.md, docs/ROADMAP.md, FUTURE-GUI.TXT, docs/GUI-SPEC.md, art/yeety.jpg, yeet --help, git tags v0.1.0-m1 .. v0.8.0-m8. Contact: swift at irix dot expert.