Docs
How HANDLE verifies who you are, where funds sit, what it charges, and what it deliberately doesn't do yet.
What HANDLE is
HANDLE is a way to pay a person on X in SOL without them having an account here and without you ever asking for a wallet address. You type their @username. The funds sit in an on-chain escrow account that only the matching X identity can drain, and they come back to you automatically if nobody claims them.
It is not a wallet, an exchange, a custodian, or a bank. HANDLE never holds funds in a database or in a keypair the team controls.
Sending SOL to an X username
- You type a @username. The app resolves it through X's official API to that account's permanent numeric user ID and shows you the profile it matched.
- You choose an amount in SOL and optionally a note. You see the fee breakdown before anything is signed.
- You connect a Solana wallet and approve a deposit into a per-payment escrow account.
- You get a transaction signature and a shareable payment link. Anyone with the link can see the status; the sender's wallet is hidden unless the sender chose to show it.
If the username can't be resolved to a real, live X account, the send stops there. A handle alone is never treated as authority over funds.
Claiming SOL
- Sign in with X using OAuth 2.0 with PKCE. The app reads your profile from X's official /2/users/me endpoint and keeps your numeric user ID.
- Connect the wallet you want paid into, then sign a one-time challenge. It binds your wallet, your X session, this domain, a random nonce and a five-minute expiry, and it moves no funds.
- Request a claim. You see the escrowed amount, the 1% claim fee and the net amount before you sign.
- The claim instruction is submitted to the escrow program, which verifies the attestation and the wallet signature and releases the funds in one transaction.
The browser never decides whether a claim is allowed. The server issues a short-lived, single-use attestation, and the on-chain program checks it.
Identity: X user IDs, not handles
X usernames can be changed, released and taken by someone else. X numeric user IDs never change. Every payment is written against the recipient's numeric ID at the moment it is created, so a payment made to you stays yours even if you rename your account, and a payment can't be re-pointed at whoever grabs your old handle.
The app asks X for the least access it can: users.read and tweet.read. It never posts, follows, reads messages, or keeps your X access token after reading your profile.
Escrow, fees and refunds
- Claim fee
- 1% of the payment, charged only when a claim completes.
- Refund fee
- None. An expired, unclaimed payment returns in full.
- Network fees
- Solana transaction fees are paid by whoever signs, and are shown separately from the claim fee.
- Refund window
- A payment is refundable by the sender 30 days after it was created, and only if it is still unclaimed.
Funds live in a program-controlled escrow account created for that one payment. Nothing is held in the app's database, and no operator key can move a payment.
Wallets and security holds
You can link more than one wallet to your X account. A wallet only becomes usable for payouts after you sign the ownership challenge. If you switch to a different payout wallet, the new one sits on a 48-hour security hold before it can receive funds, and you're notified — that delay exists so a hijacked X account can't instantly redirect your money.
Signing a challenge is safe: it is a signature on a text message, not a transaction. HANDLE never sees your private key, and nothing in the app can ask your wallet to sign a transfer you didn't start.
The launches directory
The Launches page lists projects with two things that are never optional and always visible: the project's X account and its on-chain contract address. Every card links the X profile, lets you copy the contract address, and opens it on the block explorer.
Cover images are added by dragging a file onto the upload box (or clicking it to choose one): PNG, JPEG, WebP or GIF, up to 1 MB. Images are stored privately and shown through short-lived signed links.
A listing is a directory entry, not an endorsement. Verify the contract address on-chain before interacting with it.
What isn't live yet
- The escrow program itself. Until it is written, tested and reviewed, real deposits and claims stay switched off — the app will tell you so rather than pretend.
- Mainnet. This build is pinned to the test network regardless of configuration.
- Automated on-chain reconciliation and alerting for stale deposits.
The How it works page shows the full setup checklist and exactly which pieces are missing.
Errors you may see
- That username doesn't exist on X
- The account was never there, or was deleted. Nothing was sent and nothing was charged.
- X lookup isn't available right now
- X's API rejected the request (rate limit or no credits). Try again later — the app won't guess who you meant.
- Sign in with X again to confirm this claim
- Your session is older than the safety window. Re-authenticate and try once more.
- Verify ownership of this wallet first
- You connected a wallet but haven't signed the challenge yet.
- New payout wallet is on security hold
- You changed payout wallet recently. Claims resume automatically when the 48-hour hold ends.
- Real sends are disabled
- The escrow program isn't deployed on this deployment, so no funds can be moved safely.
