Skip to content

v2.0.1

Choose a tag to compare

@github-actions github-actions released this 22 Sep 22:35
· 28 commits to main since this release

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.ps1 checks the release signature when minisign is installed,
    as install.sh already 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.md now says so.
  • Release notes come from this changelog. .goreleaser.yaml carried
    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 that install.ps1 checks 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.0 when the
    GitHub API does not answer — the next release would have quietly
    installed an old one. They ask the /releases/latest redirect instead,
    and stop if that fails too.
  • puresend -update speaks the user's language instead of always Turkish,
    and leaves a copy installed by the .deb or the AUR package to that
    package manager instead of replacing a file it owns.
  • The AUR PKGBUILD downloads the versioned release archive from GitHub,
    checked against the same digest as checksums.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.md listed a 0-allocation
    result for safetext.Clean that 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, as auth.go already 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 cover counts 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 .zip archive, extract it, and run puresend.exe.
  • 📦 Debian / Ubuntu (amd64): Download the .deb package and install it via double-click or run sudo dpkg -i puresend_*.deb.
  • 🐧 Linux (x86_64): Extract the .tar.gz archive and run it directly from the terminal (./puresend).
  • 🍏 macOS (Apple Silicon - M1/M2/M3/M4): Extract the .tar.gz archive 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