Repository navigation
Releases: Baaaki/PureSend
Release list
v2.0.7
PureSend v2.0.7
End-to-end encrypted, direct peer-to-peer (P2P) file and folder transfer system built with Go.
Fixed
- Linter and format compliance. Fixed
gofmttab alignment in client constants
and split disk space checking across OS-specific files (disk_linux.go,disk_darwin.go,
disk_windows.go) to satisfyunconvertandnilerr.
⚡ Quick Install (One-Line)
- 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 Download (Assets)
- 🪟 Windows (
x86_64): Extract the.ziparchive and runpuresend.exe. - 📦 Debian / Ubuntu (
amd64): Download the.debpackage and install by double-clicking or runningsudo dpkg -i puresend_*.deb. - 🐧 Linux (
x86_64): Extract the.tar.gzarchive and run directly from the terminal (./puresend). - 🍏 macOS (Apple Silicon - M1/M2/M3/M4): Extract the
.tar.gzarchive and run directly from the terminal (./puresend).
💡 macOS Note: If macOS Gatekeeper displays an "unverified developer" warning on first launch, you can remove the quarantine attribute by running:
xattr -d com.apple.quarantine puresend
v2.0.6
PureSend v2.0.6
End-to-end encrypted, direct peer-to-peer (P2P) file and folder transfer system built with Go.
Added
- Structured CLI error handling and actionable suggestions. CLI and
headless modes now run errors throughi18n.Explain. Rather than
leaking raw libp2p or system stack traces, errors present clear localized
summaries with bulleted suggestions ("What you can do" / "Ne yapabilirsin"). - Typed sentinel errors across all packages. Exported distinct error
sentinels (rendezvous.ErrRoomNotFound,transfer.ErrChecksumMismatch,
transfer.ErrTransferDeclined,transfer.ErrFileModified,
transfer.ErrInsufficientDiskSpace,transfer.ErrConnectionLost,
p2p.ErrRoomExpired,p2p.ErrRendezvousUnreachable,
p2p.ErrPeerUnreachable,p2p.ErrRelayLimitExceeded), allowing robust
programmatic checks witherrors.Is/errors.As. - Early file and destination validation. Sender now verifies that files
exist and are readable before bringing up the P2P network stack. Receiver
eagerly validates that the target destination directory is writable and safe. - Disk space pre-check. Receiver verifies available disk capacity
(transfer.CheckAvailableSpace) before initiating incoming payload writes. - Multilingual headless experience. CLI flags
-lang trand-lang en
now fully translate terminal transfer prompts, acceptance queries, and
progress output. - Structured exit codes. Client returns standard exit codes (0 for success,
2 for bad syntax or flags, 3 for network unreachable, 4 for wrong code or
expired room, 5 for declined transfer, 6 for I/O and checksum errors, 130
for interrupt). - CLI flag validation and guidance. Detects and warns about positional
arguments (e.g.puresend send fileinstead of-send) and conflicting
flags (-yesor-outused with-send). - Server diagnostics. Server checks socket availability before listening,
provides clear port collision guidance (e.g. port 4001 in use), validates
announcement multiaddresses, and checks private key file permissions.
⚡ Quick Install (One-Line)
- 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 Download (Assets)
- 🪟 Windows (
x86_64): Extract the.ziparchive and runpuresend.exe. - 📦 Debian / Ubuntu (
amd64): Download the.debpackage and install by double-clicking or runningsudo dpkg -i puresend_*.deb. - 🐧 Linux (
x86_64): Extract the.tar.gzarchive and run directly from the terminal (./puresend). - 🍏 macOS (Apple Silicon - M1/M2/M3/M4): Extract the
.tar.gzarchive and run directly from the terminal (./puresend).
💡 macOS Note: If macOS Gatekeeper displays an "unverified developer" warning on first launch, you can remove the quarantine attribute by running:
xattr -d com.apple.quarantine puresend
v2.0.5
PureSend v2.0.5
End-to-end encrypted, direct peer-to-peer (P2P) file and folder transfer system built with Go.
Fixed
- Hole punching works behind routers that do not keep ports. Many
home routers give an outgoing socket a port of their own — local port
60982 goes out as 2332 — and keep it for every destination, which hole
punching can work with. But a peer told the other side its public IP
with its local port, since STUN was asked from a throwaway socket and
only its IP was used. The other side punched towards a port nobody was
on, every attempt failed, and transfers went through the relay. STUN is
now asked from the QUIC socket itself, and the port the router gave it
is what goes out for QUIC. The query is repeated every 15 seconds, which
keeps the router from forgetting the mapping while a sender waits, and
catches it if the port moves anyway. Each peer offers its own address,
so every peer behind such a router needs this version. - Dependabot's Go module runs failed: the Go proxy lists an old
go-libp2p tag asv6.0.23+incompatible, Dependabot took it for the
newest release, and it cannot be resolved. Versions of go-libp2p from 2
up are now ignored; all of them are those pre-module tags.
Added
make test-holepunch(test/holepunch/netns-holepunch-test.sh), run by
CI: two peers behind routers that move ports, built from network
namespaces, with the meeting point behind a proxy as it is behind
Cloudflare in production. The receiver must connect directly and the
relay must not carry the files. 2.0.4 fails it; with routers that keep
ports, both versions pass.
⚡ Quick Install (One-Line)
- 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 Download (Assets)
- 🪟 Windows (
x86_64): Extract the.ziparchive and runpuresend.exe. - 📦 Debian / Ubuntu (
amd64): Download the.debpackage and install by double-clicking or runningsudo dpkg -i puresend_*.deb. - 🐧 Linux (
x86_64): Extract the.tar.gzarchive and run directly from the terminal (./puresend). - 🍏 macOS (Apple Silicon - M1/M2/M3/M4): Extract the
.tar.gzarchive and run directly from the terminal (./puresend).
💡 macOS Note: If macOS Gatekeeper displays an "unverified developer" warning on first launch, you can remove the quarantine attribute by running:
xattr -d com.apple.quarantine puresend
v2.0.4
PureSend v2.0.4
End-to-end encrypted, direct peer-to-peer (P2P) file and folder transfer system built with Go.
Security
golang.org/x/crypto0.54.0 → 0.57.0, which fixes GO-2026-6303,
GO-2026-6354 and GO-2026-6355.govulncheckfound none of them
reachable from PureSend's code; the update takes them out of the build.
Changed
go-libp2p0.49.0 → 0.50.0 (quic-go 0.62.0). It carries a hole-punching
fix: the attempt's timeout is set before the connection notifications
that can start it.- The terminal interface runs on Bubble Tea v2, Lip Gloss v2 and
Bubbles v2. The screens and keys are the same. Colours now follow the
background the terminal reports when asked, and the code box keeps the
terminal's own text colour for its prompt and cursor, which the new
defaults would have drawn in a grey that is hard to see on a light
background. A pasted code still lands in the code box: v2 delivers a
paste as one message rather than as keys, and it is routed there. pion/stun3.1.7 → 4.0.1.- Go 1.27.1: go.mod names it as the toolchain, so a machine with an older
1.27 fetches it, and the server image builds ongolang:1.27.1-alpine3.24
rather than whatever1.27-alpinea builder has cached. The server
image runs on Alpine 3.24 instead of 3.22. - The rest of the dependency tree is current as of September 2026, except
libp2p's own network stack (quic-go, webtransport-go, the pion WebRTC
packages), which stays at the versions go-libp2p 0.50.0 is built and
tested against; newer pion releases do not even compile together. - CI and the release job run on
ubuntu-26.04. - The release page's install notes and the
.debpackage description are
in English. - Dependabot groups the
charm.landmodules with the rest of Charm.
Fixed
- Something a library logged — quic-go's warning about UDP buffer sizes,
on most Linux machines — was written over the terminal interface, and
the new renderer, which redraws only the cells it changed, would have
left it there. Log output is now kept off the screen while the
interface runs. make debstamped every package it built as 2.0.1, whatever the code
was. It now takes the version from the latest release tag, and builds
in the release signing key, so a locally built package checks update
signatures the way the released one does.
⚡ Quick Install (One-Line)
- 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 Download (Assets)
- 🪟 Windows (
x86_64): Extract the.ziparchive and runpuresend.exe. - 📦 Debian / Ubuntu (
amd64): Download the.debpackage and install by double-clicking or runningsudo dpkg -i puresend_*.deb. - 🐧 Linux (
x86_64): Extract the.tar.gzarchive and run directly from the terminal (./puresend). - 🍏 macOS (Apple Silicon - M1/M2/M3/M4): Extract the
.tar.gzarchive and run directly from the terminal (./puresend).
💡 macOS Note: If macOS Gatekeeper displays an "unverified developer" warning on first launch, you can remove the quarantine attribute by running:
xattr -d com.apple.quarantine puresend
v2.0.3
PureSend v2.0.3
An end-to-end encrypted, direct peer-to-peer (P2P) file and directory transfer system built with Go.
Nothing in the program changed; the binaries differ from 2.0.2 only in
their version stamp. This release is the first one built by the updated
release workflow below.
Fixed
- The AUR
PKGBUILDwas still at 2.0.0 after 2.0.1 went out; it now
follows each release, with that release's archive digest.
Changed
- CI and the release workflow run on the Node 24 versions of their
actions (checkout, setup-go, upload-artifact, goreleaser-action)
instead of the Node 20 ones GitHub has deprecated, and on
ubuntu-24.04rather thanubuntu-latest, which is about to move to
a new Ubuntu under every job at once.
⚡ 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
v2.0.2
PureSend v2.0.2
An end-to-end encrypted, direct peer-to-peer (P2P) file and directory transfer system built with Go.
Security
- A room allows 3 guesses at its code, however they are timed. Wrong
codes were counted when a handshake ended, so a guesser who held several
handshakes open at once, each waiting only on its verdict, had every one
of them judged before the count caught up: 4 guesses instead of 3, and
the fourth, if right, got the files. Each proof is now counted as it is
judged, and once a room has had its 3 wrong codes, no further proof is
judged at all. Only guesses that are judged count; a handshake that
breaks off before its proof, or sends a malformed message, tells the
guesser nothing and uses up nothing. - Releases are signed.
checksums.txtnow comes with a minisign
signature. Clients built from this release on refuse an update whose
checksum list is not signed with the project's key, and the install
scripts carry the same key. The public key is inSECURITY.md.
Added
docs/DEPLOYMENT.mdlists every secret the project holds — where each
one lives, what losing or leaking it costs, how to store it and how to
replace it — and the order a release goes out in: the tag first,main
once the signed release is live, and the website's downloads taken from
the release itself rather than built again.
⚡ 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
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
v2.0.0
PureSend v2.0.0 🚀
An end-to-end encrypted, direct peer-to-peer (P2P) file and directory transfer system built with Go.
⚠️ Breaking Changes (Why v2.0.0?)
This is a major release resulting from a comprehensive security audit of version 1.0.0. The rendezvous protocol has been upgraded to /puresend/rendezvous/2.0.0 and is not backward-compatible with v1.0.0 clients/servers.
🛡️ Security and Architectural Updates:
- Server No Longer Sees the Password (Magic-Wormhole Model): Codes are now split; the server only sees the public room number (
nameplate: 42), while the secret words (kiraz-liman) are never transmitted to the server and are strictly used in the peer-to-peer PAKE handshake. The risk of server-side MITM is completely eliminated. - Dynamic Room Scaling: Room numbers start at a minimum of 2 digits (
10..99) and dynamically expand to 3, 4, 5+ digits as server occupancy increases to preserve sparsity rules. The concurrent room limit has been removed. - Brute-Force Protection: After 3 incorrect code attempts, the room deletes itself from the server and self-destructs. The confirmation tag is not presented until the remote peer verifies their key.
- DoS and Resource Protection: The server-wide global minute registration budget (
-register-budget) has been removed; when the table is full, disconnected rooms are evicted. - Integrity and Signature Verification:
puresend -update,install.sh, andinstall.ps1now perform SHA-256 integrity checks viachecksums.txtand digital signature verification viaminisign. - Filesystem Security: Prevented downloading directly to the home directory (
CheckDestination), blocked file exfiltration through symlinks (checkNoLinks), and mitigated TOCTOU race conditions via atomic hard links (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
v1.0.0
PureSend 🚀
Go ile geliştirilmiş, uçtan uca şifreli (Zero-Trust) ve doğrudan eşler arası (P2P) dosya ve klasör transfer sistemi.
⚡ Hızlı Kurulum (Tek Satır)
- 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
📦 Manuel Kurulum & Doğrudan İndirme (Assets)
- 🪟 Windows (
x86_64):.ziparşivini indirip çıkartın vepuresend.exeyi çalıştırın. - 📦 Debian / Ubuntu (
amd64):.debpaketini indirip çift tıklayarak veyasudo dpkg -i puresend_*.debkomutu ile kurun. - 🐧 Linux (
x86_64):.tar.gzarşivini çıkartıp doğrudan terminalden çalıştırın (./puresend). - 🍏 macOS (Apple Silicon - M1/M2/M3/M4):
.tar.gzarşivini çıkartıp terminalden çalıştırın (./puresend).
💡 macOS Notu: macOS Gatekeeper ilk açılışta "geliştirici doğrulanamadı" uyarısı verirse, terminalde şu komutu çalıştırarak karantina bayrağını kaldırabilirsiniz:
xattr -d com.apple.quarantine puresend