| 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
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.)
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.
From the README, in plain English:
cp.
Same shape of flags; a cheeky alias for almost every one
(-f/--send-it,
-r/--all-in,
--help/--halp, ...).cp locally.
Tiny files skip the thread pool; big files get segmented parallel
pread/pwrite; same-FS CoW volumes get a
reflink. A make bench guard fails the build if that
invariant breaks.-p keeps mode, owner, times; on the wire it also recreates
hard links and device/fifo/socket nodes (privilege still required).
-x stays on the filesystem it started on.
-X / --diss skips a name; a leading slash means
that child of the walk root.--yeet-to / --catch-this on a trusted network
(no encryption on the data path by design). Default port 9338
("YEET" on a phone keypad). Shared --token for auth.
Catcher stays up for the next tree unless you ask for one shot.--suss / --street-knowledge).
The next send to that host remembers
(~/.yeet/hosts) and skips the probes.
Yeety lectures when the next run could be faster.--rush-it skips the pre-scan when you already know you want that.--compress / --squish sticks compression on for
the whole send; it does not turn off the other measurements.
Without the flag, Yeety turns compression on only when a sample of the
files shrinks and the link is slower than the codec. lz4 or zstd,
whichever this build has. No library: yeet says so and sends the bytes plain.--pack / --unpack).--verify / --for-real checks each file with
CRC-32C.
--partial / --carry-on picks up a transfer that
died: whole files that already match are skipped; a partial file resumes
at the byte it stopped.
--durable asks the destination disk to flush.--keep-going / --plow-on: one name yeet cannot
read is a skip, not the end of the tree. The walk root still has to be
there. A missing operand still fails. A file that shrinks after its
header is on the wire still fails.--control (pause / resume / cancel / set-bwlimit) and
--json event stream; the seam a future TUI/GUI will consume.
--bwlimit / --chill caps the send.configure, no autoconf circus.
Built on Linux, NetBSD, FreeBSD, Solaris, AIX, IRIX, Tru64, ...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.
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.)
Terminal sessions (simulated). Receiver first, then sender; that is the required order. Progress lines are representative of a mid-transfer run.
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. |
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. |
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. |
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.
# 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.
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 |
|---|---|---|
| M0 | skeleton, configure, tests | done |
| M1 | local copy: adaptive dispatch, reflink, sparse, segments | done |
| M2 | trees, metadata, specials, safe walk | done |
| M3 | pack/unpack (aggregated small-file engine) | done |
| M4 | sussing (measure + tune) | done |
| M5 | raw-TCP network, striping, token, bwlimit | done |
| M6 | verify, partial resume, durable flush | done |
| M7 | json events, control channel, progress styles | done |
| M8 | compression (lz4/zstd); suss auto-on; memory-go-round | done |
| M9+ | glitz / security audit / more perf (see ROADMAP) | planned |
| Phase 2 | TUI / libcyui (+ Motif) GUI on the json+control seam | planned (not started) |
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
|
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:
yeet-0.8.0-m8.tar.gz;
source, README.txt, LICENSE, configure, Makefile.in, man page
(sha256,
md5)yeet-0.7.0-m7.tar.gz
(sha256,
md5)
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:
yeet-0.7.0-m7-x86_64-linux-6.12.tar.gz; Devuan/Linux x86_64 portable
(sha256,
md5)yeet-0.7.0-m7-sparc-solaris-8.tar.gz; Solaris 8 SPARC portable
(sha256,
md5)yeet-0.7.0-m7-ppc-aix-6.1.tar.gz; AIX 6.1 PowerPC portable
(sha256,
md5)yeet-0.7.0-m7-amd64-netbsd-10.1.tar.gz; NetBSD 10.1 amd64 portable (oreo)
(sha256,
md5)yeet-0.7.0-m7-amd64-netbsd-10.0.tar.gz; NetBSD 10.0 amd64 portable (m83)
(sha256,
md5)yeet-0.7.0-m7-amd64-freebsd-14.1.tar.gz; FreeBSD 14.1 amd64 portable
(sha256,
md5)yeet-0.7.0-m7-mips-irix-6.5.tar.gz; IRIX 6.5 MIPS n32 portable (toaster)
(sha256,
md5)yeet-0.7.0-m7-alpha-tru64-5.1.tar.gz; Tru64 UNIX 5.1 Alpha portable (granite)
(sha256,
md5)
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).
cp for a local copy.--token, not crypto on the data path.
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.