Repository navigation
v2.0.1
PureSend v2.0.1
An end-to-end encrypted, direct peer-to-peer (P2P) file and directory transfer system built with Go.
Security
- A refused transfer no longer tells the sender where the receiver saves
files. A failure to write to disk was passed on word for word, local
path included — and with it, on most machines, the account name. The
sender now hears the reason ("no space left on device"), not the path. - The server never replaces an identity key it cannot read. Any read
error other than a missing file used to mean "generate a new key", which
on a file that could still be written changed the peer ID and stranded
every client already released. It is now a reason to stop, and a new key
is only ever written to a file that does not exist yet. install.ps1checks the release signature when minisign is installed,
asinstall.shalready did. Neither does until signing is set up
(docs/DEPLOYMENT.md).
Fixed
- The security policy no longer says the relay hides IP addresses. A
waiting sender's public and local addresses go to anyone who looks up its
nameplate, and libp2p's identify protocol shares them over a relayed
connection too.SECURITY.mdnow says so. - Release notes come from this changelog.
.goreleaser.yamlcarried
the 2.0.0 notes as a fixed header that every later release would have
repeated, with claims the code does not bear out: that the server's
ability to impersonate a peer was gone entirely (it is down to 3 guesses
in 65,536 per room), that the room table has no cap (it has,
-max-rooms), and thatinstall.ps1checks signatures. The release
workflow now publishes the version's section of this file and refuses a
tag that has none. - The release workflow checks the server address it bakes in. The step
named "Check the server address is configured" only printed it. It now
refuses to build when the address is missing from the published
server.txt, which is how a default left behind after a key change
would show. The tests in that job no longer see the production address. - The installers no longer fall back to a hard-coded
v2.0.0when the
GitHub API does not answer — the next release would have quietly
installed an old one. They ask the/releases/latestredirect instead,
and stop if that fails too. puresend -updatespeaks the user's language instead of always Turkish,
and leaves a copy installed by the.debor the AUR package to that
package manager instead of replacing a file it owns.- The AUR
PKGBUILDdownloads the versioned release archive from GitHub,
checked against the same digest aschecksums.txt, instead of an
unversioned binary on the website that was still 1.0.0. - A sender connected through the relay is no longer told the relay's limit
is "0 B"; only the receiver learns the limit. - The 2.0.0 notes below said room scaling removed the cap on concurrent
rooms; it did not. - Notices follow the language switch. The wrong-code warning, the
"attempt was interrupted" notice and the update banner were stored as
finished sentences, so a sender who pressed[L]kept reading them in the
old language. They are now kept as facts and put into words when drawn;
the code entry placeholder follows the switch from any screen too. - Performance documentation now reports measurements only. The README
claimed "100% bandwidth", a 2.5G line rate that was never measured, and
called the handshake "zero-knowledge";BENCHMARK.mdlisted a 0-allocation
result forsafetext.Cleanthat the code has never had (it is ~650 ns and
4 allocations). Both now carry measured numbers with the command behind
each, and say what has not been measured. - The handshake is described as what it is — a SPAKE2-style exchange from
schollz/pake, not RFC 9382 SPAKE2 — everywhere, asauth.goalready did. - The AUR package no longer describes PureSend as WebRTC.
Added
make bench-e2e(scripts/bench-e2e.sh): throughput and peak memory of
the real binaries end to end on loopback. On a Ryzen 7 5700X: 360–390 MB/s,
35–41 MB of RAM from 256 MiB up to 8 GiB.BenchmarkHandshake: the room-code handshake takes ~0.6 ms of CPU.make covercounts the client binary the integration tests start, so
flag handling and headless mode show up in coverage (72% → 77% overall).
CI reports the same number.- A test that every message exists in both languages.
- The folder picker warns immediately on screen when [s] is pressed on a forbidden destination (such as the home folder itself or drive root), instead of waiting for a transfer to fail.
Changed
- The terminal interface is split by concern (
tui.go,update.go,
view.go,format.go), and its key handling into one function per screen. - Receiver status steps are shared constants of
p2p, not strings the
interface had to spell the same way.
Removed
- The room code screen and its messages, unused since the sender's waiting
screen took its place.
⚡ Quick Install (One-Liner)
- Linux & macOS (Arch, Ubuntu, Fedora, Debian, macOS):
curl -fsSL https://raw.githubusercontent.com/Baaaki/PureSend/main/install.sh | sh
- Windows (PowerShell):
irm https://raw.githubusercontent.com/Baaaki/PureSend/main/install.ps1 | iex
📦 Manual Installation & Direct Downloads (Assets)
- 🪟 Windows (
x86_64): Download the.ziparchive, extract it, and runpuresend.exe. - 📦 Debian / Ubuntu (
amd64): Download the.debpackage and install it via double-click or runsudo dpkg -i puresend_*.deb. - 🐧 Linux (
x86_64): Extract the.tar.gzarchive and run it directly from the terminal (./puresend). - 🍏 macOS (Apple Silicon - M1/M2/M3/M4): Extract the
.tar.gzarchive and run it from the terminal (./puresend).
💡 macOS Note: If macOS Gatekeeper shows an "unverified developer" warning on first launch, remove the quarantine flag by running the following command in your terminal:
xattr -d com.apple.quarantine puresend