Summary
Before a transfer starts, fsend now shows you exactly what's about to move — the file list with sizes, on both the sender and the receiver — so you can confirm you're sending (and receiving) the right thing.
See what you're transferring
Run fsend on a folder and you get a preview before anything leaves your machine:
Sending proj/ · 4 files · 1.3 MB
921.6 KB video.mp4
307.2 KB audio.m4a
51.2 KB notes/outline.md
11 B README
The receiver sees the same list before accepting. Largest files come first (trimmed to the top 10, with a … and N more line), and the sizes always add up to the total in the header.
Machine-readable output for scripts
When you're driving fsend from a script rather than watching the terminal, two new flags hand you the file list as plain CSV — one for each side of a transfer:
- On the sending side,
--previewlists every file fsend would send —path,size— then exits. No code, no transfer, nothing leaves your machine:It prints to standard output, so redirect it to a file when you want to keep it, e.g.fsend --preview proj/fsend --preview proj/ > files.csv. - On the receiving side,
--manifestwrites a record after the transfer finishes: each received file aspath,size,status, where status isnew,identical,overwritten,kept, orresumed:fsend abc-defg-jkm --manifest record.csv
Symlinks are followed
fsend now sends what a symlink points to, not the link itself, so the receiver ends up with a real file instead of a link that dangles on their machine. In the preview the file shows where it came from, like latest (→ video.mp4).
A link whose target is missing, unreadable, or loops back on itself stops the send with a clear error (E036) rather than being silently dropped — fix the link or skip it with --exclude.
Fixes
- Large transfers no longer drop. A packet-demultiplexing collision between STUN and QUIC could tear down big transfers mid-flight over the internet path.
- Share codes shrug off stray whitespace and capitalization. A code pasted with a trailing space or newline — a Windows
CRLF, or one a chat app auto-capitalized — is now accepted instead of failing with a confusing "no such file." Only the code argument is normalized; filenames are left exactly as typed.
Changelog
- f95ac50: Replace --dry-run with --preview (send) and --manifest (receive) (#85) (@polius)
- 7dfcfd9: demo: add mp4/gif raster exports of the README animation (Claude Opus 4.8 (1M context) noreply@anthropic.com)
- 1a9660f: demo: replace WebP README animation with reproducible animated SVG (Claude Opus 4.8 (1M context) noreply@anthropic.com)
- fa7a246: feat: annotate every symlink-derived file with its real source (Claude Opus 4.8 (1M context) noreply@anthropic.com)
- 5488f75: feat: follow symlinks to their content when sending (Claude Opus 4.8 (1M context) noreply@anthropic.com)
- 591f9ec: feat: pre-transfer file preview with reconciled sizes (Claude Opus 4.8 (1M context) noreply@anthropic.com)
- 35d6bc1: feat: regroup --help flags by role and show -h/-v shorthands (Claude Opus 4.8 (1M context) noreply@anthropic.com)
- 98a716e: fix: also lowercase a whitespace-wrapped code (Claude Opus 4.8 (1M context) noreply@anthropic.com)
- 2a7a740: fix: check fmt.Fprint return values in renderPreview (errcheck) (Claude Opus 4.8 (1M context) noreply@anthropic.com)
- 5210e59: fix: prevent STUN/QUIC demux collision dropping large transfers (Claude Opus 4.8 (1M context) noreply@anthropic.com)
- af7cf49: fix: tolerate surrounding whitespace on a share code (Claude Opus 4.8 (1M context) noreply@anthropic.com)
- bd34b17: logo: balance the wordmark spacing (Claude Opus 4.8 (1M context) noreply@anthropic.com)
- 964b1f6: logo: lighten and shorten the wordmark chevron (Claude Opus 4.8 (1M context) noreply@anthropic.com)
- 6b0bc6a: refactor: scope code-whitespace fix to the auto-detect path (Claude Opus 4.8 (1M context) noreply@anthropic.com)
How to update
Note
To update, run fsend --update, or re-run the command from the Install section.