AgePony for Desktop.
The same age encryption your phone does, on macOS, Windows and Linux. Post-quantum ML-KEM-768 recipients, classic X25519, OpenSSH keys and passphrases — and a file of any size, because everything streams. No accounts, no analytics, no tracking, and nothing leaves the machine.
6df782e67d8feac285b0ec93fc562ebe13e8fd53c2e8e3ed05bf198cc3e30f37
affccfd5bd490bb18de0c7b19d59e80f30a03f30efd674813a288b1b5dce3339
7460f1ab502eb1cf6edc1382ffc6137d670051ef72428dee71f976c49e7de9ae
| Package | Arch | sha256 |
|---|---|---|
| Debian / Ubuntu (.deb) | ARM64 | c41cb8cba08f37338fa3b51b8bf368e3ccdf4bd4a18bbc8025f922a608659e0f |
| Portable tarball (.tar.gz) | x86_64 | 11c1cac55ca2a49efe4d1630aa75b40ef927581f596c76a1067e8d12c8828baf |
| Portable tarball (.tar.gz) | ARM64 | 0a6d4707e9ba0fc4aa33608df5141f263f4dc034e86bf10bc94ca6ed822b19a4 |
| AppImage | x86_64 | 371181bf56524618d53d0b1fa557d94bad25abc972845dc7bd365be17a3a6c92 |
| AppImage | ARM64 | a8c0c4788b205a49ab6bf3165dff194c6b0d220e8c9af50c0d9d1ae82f1d01eb |
The tarball and the AppImage are self-contained: extract and run bin/agepony,
or make the AppImage executable and run it. Neither registers a desktop entry or file
associations, so double-clicking an .age file still wants the .deb.
All three carry agepony-cli alongside the window.
AgePony Desktop 2.2.2 fixes verifying signatures from the mobile apps and ssh-keygen. Desktop rejected a valid Ed25519 or RSA signature made by AgePony on Android or iOS, or by ssh-keygen, reporting "not a valid SSH signature," while it accepted its own. Those signers wrap the armored signature at a wider line than the desktop parser accepted, so it turned away signatures it should have read. It now accepts any line width. Signatures made on the desktop were never affected.
The same files your phone makes.
AgePony Desktop is not a companion app that speaks its own dialect. It writes ordinary
age files — the ones the age CLI, the iOS app and the Android app all
read — and the post-quantum recipient it uses is the standardised
mlkem768x25519 one, not a private extension.
- Post-quantum recipients that actually interoperate. ML-KEM-768 combined with X25519 under X-Wing, wrapped with HPKE exactly as the age specification describes. Desktop and phone are pinned to the same reference vectors on every build, so a file sealed on one opens on the other — byte for byte, not approximately.
- Every recipient kind the protocol has. Classic
age1…X25519 keys, post-quantumage1pq…keys, OpenSSHed25519and RSA keys, and plain passphrases. Mixing a post-quantum recipient with a classical one is refused rather than silently downgraded. - Any file size, in 64 KiB of memory. Encryption and decryption stream. A 1 GB archive costs the same working set as a text file, and a failed decrypt removes its own partial output instead of leaving an unauthenticated fragment on disk.
- Bring your identity over by QR. Show the code on the phone, point the desktop at it, and the identity and its recipient book land on the machine. Nothing is typed, nothing is emailed to yourself.
- Encrypted identity files. Keys on disk are written
0600, through a sibling temp file and a rename, so a crash cannot leave half a key at the real path. Passphrase-protected identity files are ordinary age files thatage -dand the phone apps can open. - A command line in the box.
agepony-clishares the app's identity store.agepony-cli selftestruns the whole stack — classic, post-quantum, passphrase, the reference vector, Bech32 and the config path — and exits non-zero if any of it is wrong. - Nothing phones home. No accounts, no telemetry, no update pings, no network access at all in normal use. The build asserts it: a test fails if a networking crate ever enters the dependency graph.
- Open source, Apache-2.0.
agepony-coreholds the crypto and the file handling and knows nothing about the interface, which is what makes it worth auditing on its own.
Check what you downloaded.
Every artifact ships with a detached signature, and each release carries a signed
SHA256SUMS covering all eight. An encryption tool ought to be verifiable before you
run it, so the checksums are on this page as well as in the release — compare them and they
should agree.
gpg --import norsehorse-release-key.asc gpg --verify SHA256SUMS.asc SHA256SUMS shasum -a 256 -c SHA256SUMS gpg --verify AgePony-macOS.dmg.asc AgePony-macOS.dmg
A0CB C8F6 5AAC E56F 1C5B 7677 53F9 798E 4919 DE62
Fetch it from this site, or with
gpg --keyserver hkps://keys.pgpony.app --recv-keys A0CBC8F65AACE56F1C5B767753F9798E4919DE62.
Check the fingerprint against the one printed above before you trust anything it signed..asc files and SHA256SUMS sit
alongside the installers,
on GitHub and on this site's Tor and I2P mirrors alike. On SHA256SUMS the signature
is the part that matters: it is what ties a list of hashes to a key rather than to whoever
happens to be serving the page.What it needs, and what your OS will say.
- macOS. macOS 11 or later, Apple silicon or Intel
- Windows. Windows 10 or later, x64
- Linux. Debian 12 or Ubuntu 22.04 and newer, x86-64
- Nothing to install alongside it. No runtime, no framework, no Java. Each package carries the whole application.
- Around 25 MB on disk, and no background service. AgePony runs when you open it and stops when you close it.
sudo apt install ./AgePony-linux-x86_64.deb on Debian or Ubuntu. The package declares
its own dependencies, registers a desktop entry, and puts agepony and
agepony-cli on your PATH. On other distributions, take the tarball or
the AppImage.Read it yourself.
The desktop source is at github.com/norsehorse-dev/AgePonyDesktop under Apache-2.0, alongside the iOS app and the Android app. The three implementations are independent — Rust, Swift and Kotlin — which is exactly why they are held to one shared set of reference vectors instead of to each other.