Security model
What Sweeper can do, what it can't do, and how you can verify both yourself.
Threat model
Sweeper is designed to protect against two classes of risk:
- Server compromise. If our servers were breached, an attacker should gain nothing of value — no keys, no funds, no ability to sign.
- Malicious operator. Even if we wanted to steal funds, the architecture should make it impossible without detection.
Sweeper does not protect against: a compromised browser extension, malware on your machine, a screen recorder, or a compromised RPC endpoint that returns false data. Those are outside our control.
Key handling
Your mnemonic is entered into an HTML <textarea>. It is processed
entirely in JavaScript, in the browser tab. It is never serialized, never stored in
localStorage, never sent to a server, and cleared from memory when you click "Clear"
or close the tab.
Derived private keys exist only in the JavaScript heap for the duration of a signing operation. They are not written to disk, not logged, and not included in any telemetry.
Verification: open DevTools → Network. Paste a mnemonic. Run a full preview. Search every request and response for any word from your phrase, any derived address, or any hex string longer than 32 characters. None appear.
Signing
All transaction signing happens locally:
- Mnemonic mode: keys are derived in-browser from the pasted phrase using
ethers,@solana/web3.js, andbitcoinjs-lib. Signing happens in the same tab. - Wallet extension mode: signing happens in your wallet (MetaMask, Rabby, etc.), which the browser mediates. Sweeper never sees the key.
- WalletConnect mode: signing happens on your mobile wallet. Sweeper only relays the unsigned transaction payload.
- Ledger / Trezor: signing happens on the hardware device. You see every transaction on the device screen before approving.
No server-side component has the ability to construct, sign, or broadcast a transaction on your behalf.
What the servers do
Sweeper runs two Cloudflare Workers:
- RPC proxy — forwards JSON-RPC calls to Alchemy and Helius so we can hide our API keys. Logs only timestamp, IP, route, and status code. No payload content, ever.
- Payment worker — handles credit purchases (Square, crypto), tracks balances keyed by a pseudonymous client ID, and records sweep receipts for our own accounting. Does not receive mnemonic data, private keys, or signed transaction payloads.
Neither worker can spend funds, sign transactions, or access your keys.
Release integrity
Every build publishes a SHA-256 hash and an SRI hash. The HTML pins the SRI hash on the
<script> tag, so the browser refuses to execute app.js
if the file's contents have changed since we published it.
To verify the bundle yourself:
curl -s https://sweeper.cloud/app.js | openssl dgst -sha256
Compare against sha256_hex in
/releases/latest.txt. If they match,
the bundle is unmodified.
Why the source isn't public
Sweeper's source is proprietary. This is a trade-off we discuss in detail at /private-source.html. Security researchers can request NDA access to the private repository by emailing security@sweeper.cloud.
Reporting a vulnerability
If you believe you've found a security issue, email security@sweeper.cloud. Include:
- A description of the issue
- Steps to reproduce
- Any proof-of-concept you can share safely
We aim to acknowledge within 72 hours. We do not currently run a paid bounty program, but we credit reporters (with permission) and grant NDA repo access to anyone who reports a valid issue.
What we will never do
- Transmit your mnemonic, seed, or private keys
- Sign transactions on your behalf
- Take custody of your funds
- Add telemetry that includes wallet contents or addresses
- Ship a release without publishing its hash