OpenPGP encryption, signatures, and key management — entirely inside your browser.
Open PGP · Download the standalone app
PGP is a privacy-focused OpenPGP web application for generating keys and protecting messages or attachments without sending sensitive material to a server. Encryption, decryption, signing, and verification all happen locally on your device.
PGP makes the essential OpenPGP workflows understandable and accessible from a modern browser. It uses the recipient's public key for encryption, the corresponding private key for decryption, the sender's private key for signing, and the sender's public key for verification.
| Operation | Key required | What it accomplishes |
|---|---|---|
| Encrypt | Recipient's public key | Creates data only the matching private key can decrypt |
| Decrypt | Recipient's private key | Recovers the encrypted message or attachment |
| Sign | Sender's private key | Proves control of the signing key and detects alteration |
| Verify | Sender's public key | Checks the signature and displays the signing identity details |
Important
Share public keys freely. Never send anyone your private key or its passphrase.
Key Features:
- 🔑 PGP Key Generation — Create passphrase-protected public/private key pairs with a revocation certificate
- 🧬 Modern or Compatible Keys — Choose Curve25519 (recommended), NIST P-256/P-384/P-521, or RSA 4096 (legacy compatibility)
- 🔐 Message Encryption — Encrypt text with the recipient's public key and optionally sign it
- 🔓 Message Decryption — Decrypt armored PGP messages and optionally require a valid sender signature
- ✍️ Digital Signatures — Create and verify cleartext signatures for messages
- 📎 Attachment Protection — Encrypt, decrypt, sign, and verify files locally
- 📨 Email-Friendly Outputs — Produce portable
.asc,.pgp, and.sig.ascattachments - 📦 Streamed File Processing — No application-imposed size cap; practical limits depend on the browser and available memory
- 💾 Direct-to-Disk Output — Supported Chromium browsers can stream large encrypted or decrypted results directly to disk
- 📴 Standalone Offline Edition — Run the complete application from one self-contained
pgp.htmlfile - 🌐 Local Processing — No accounts, uploads, analytics, telemetry, APIs, or cryptographic backend
- 🎯 Zero Knowledge — There is no server-side component capable of receiving your keys, files, messages, or passphrases
- 📱 Cross-Platform — Works in modern desktop and mobile browsers
- 🆓 Open Source — Fully auditable code released under the CC0 public-domain dedication
- Visit the 🔑 PGP web application
- Open Generate
- Enter the required email address and, optionally, a name to attach to the public key
- Protect the private key with a passphrase of at least 12 characters
- Choose Curve25519 (recommended), a NIST curve, or RSA 4096 (legacy compatibility)
- Click Generate key pair
- Download the public key, private key, and revocation certificate
Keep the private key and its passphrase separate and secret. Share only the public .asc key. Store the revocation certificate somewhere safe so the key can be invalidated if the private key is lost or compromised.
- Open Encrypt
- Paste or load the recipient's public key
- Enter or load the message
- Optionally enable Sign with my private key
- Click Encrypt message
- Copy the armored result or download
encrypted-message.asc
The private signing key is optional. It authenticates the sender; it is not used to encrypt the message.
- Open Decrypt
- Paste the encrypted PGP message or load its
.ascattachment - Add the private key corresponding to the recipient public key
- Enter the private-key passphrase when required
- Optionally require verification with the sender's public key
- Click Decrypt message
- Sign: Add the message, your private key, and its passphrase to create a cleartext signed
.ascmessage. - Verify: Add the signed message and the sender's public key. PGP checks the signature and displays the signing key ID and fingerprint.
A valid signature proves that the message was signed by the corresponding private key and was not subsequently altered. It does not prove the owner's real-world identity unless you independently verify the public-key fingerprint.
- Open Files
- Choose Encrypt or Decrypt
- Select the attachment
- Supply the recipient's public key for encryption or the matching private key for decryption
- Optionally sign during encryption or require signature verification during decryption
- Save the resulting
.pgpfile or restored attachment
File input is processed as a stream. When the browser exposes the File System Access API, output can also be written directly to disk instead of being accumulated in memory.
- Sign: Select the original attachment and your private key to create a detached
.sig.ascsignature. - Verify: Select the unchanged original file, its
.sig.ascsignature, and the sender's public key.
The detached signature does not contain the original file. Send both the unchanged file and its signature.
There is no account, escrow system, recovery email, or “forgot passphrase” option. A lost private key or forgotten passphrase cannot be recovered by this project. This is intentional.
A valid signature confirms possession of a particular private key—not a person's legal identity. Compare the complete public-key fingerprint through a separate trusted channel before relying on it.
PGP sets no application-defined attachment size limit and always streams file input. Chromium browsers with direct-to-disk saving provide the best experience for very large files.
Browsers without the File System Access API buffer downloadable output in memory. Their practical maximum therefore depends on available RAM, browser limits, operating-system limits, and device stability. Mobile browsers and Safari may reach those limits earlier.
Local processing protects data from a remote application server. It cannot protect secrets from a compromised browser, malicious extension, infected operating system, physical attacker, or untrusted device.
The hosted version must download its static HTML, CSS, and JavaScript before it can run. For a workflow with no continuing network dependency, verify and open the standalone edition after disconnecting.
PGP is designed around auditable, browser-side controls:
- OpenPGP.js — OpenPGP implementation used for every cryptographic operation
- OpenPGP — interoperable message, key, encryption, and signature formats
- Public-Key Encryption — encryption requires the recipient's public key; private keys are reserved for decryption and signing
- Protected Private Keys — generated private keys are encrypted with the user-supplied passphrase
- Signature Verification — supports embedded message/file signatures, cleartext signatures, and detached file signatures
- Ephemeral Handling — keys, passphrases, messages, and file data are never intentionally persisted; clearing a form drops the application's references to those values
- No Application Storage — the application code uses no
localStorage, IndexedDB, cookies, accounts, analytics, or telemetry - No Application Network Calls — the deployed Content Security Policy sets
connect-src 'none' - Hardened Standalone Build —
pgp.htmlusesdefault-src 'none'and embeds its required interface, styles, and JavaScript - Release Verification — the build emits a SHA-256 checksum and a source-provenance record alongside the standalone file
Note
“Nothing leaves your device” describes application data and cryptographic operations. The hosted page itself is still downloaded from the web. The standalone edition can be downloaded once, verified, and then used with the network disconnected.
The hosting or CDN layer still receives ordinary HTTP connection metadata and may keep access logs or set operational cookies before the static page reaches the browser. That infrastructure is outside the JavaScript application's control. Use the verified standalone file with the network disconnected when this distinction matters to your threat model.
Caution
JavaScript cannot guarantee forensic erasure of secrets from browser memory. After handling especially sensitive material, clear the fields, close the tab, and fully quit the browser. A compromised browser, extension, operating system, or device can still capture plaintext or key material.
- Node.js 22
- pnpm 11
git clone https://github.com/hopeugetherpes/pgp.git
cd pgp
corepack enable
pnpm install --frozen-lockfile
pnpm devpnpm run build:staticThe production build is a static site written to dist/. It also creates the portable offline release:
dist/index.html— static web application entry pointdist/assets/pgp.css— production stylesheetdist/assets/pgp.js— browser application and bundled OpenPGP implementationdist/pgp.html— complete self-contained offline applicationdist/pgp.html.sha256— SHA-256 checksum for the standalone applicationdist/pgp.html.source.txt— exact source commit and artifact digest
To run the same build and output checks used by Vercel:
pnpm run check
pnpm run build:vercel
pnpm audit --audit-level=lowThe verification step rejects missing deployment files, an invalid standalone checksum, external runtime resources, application network APIs, persistent browser-storage APIs, obsolete platform callbacks, weakened security headers, and an invalid Vercel deploy-button target.
The production application is a static Vite build. The repository intentionally contains no server route, authentication layer, database adapter, analytics SDK, or cloud-runtime binding.
PGP is configured for automatic deployment from GitHub:
- In Vercel, choose Add New → Project
- Import
https://github.com/hopeugetherpes/pgp - Click Deploy without adding environment variables or changing the detected settings
The committed vercel.json selects the locked pnpm installation, verified static build, dist/ output directory, and security headers. No server function, API, database, secret, or external runtime service is required.
With Vercel Git integration enabled, pushes to main deploy to production and pushes to other branches create preview deployments automatically.
Released into the public domain under the CC0 1.0 Universal dedication.