For developers
Build with the SHADOW wallet. No keys, ever.
Let people bring their SHADOW private wallets to your app: what they hold, one account per person, and their whole wallet in a click. They unlock on SHADOW; your app only gets signatures made for it.
Using an AI agent? Give it this line.
Claude Code, Cursor, Codex: it reads the instructions at the link and sets everything up.
Add the SHADOW wallet to this app. Follow https://shadowprivacy.tech/agents/shadow-wallet.md- 1Connect
A "Connect SHADOW" button at the top right. People unlock on SHADOW and tick the private wallets to share.
- 2Verify
One call checks the signatures and reads what those wallets hold from the chain. You get a stable id per person.
- 3Open the wallet
From the connected button, openWallet() shows their whole SHADOW wallet in a small window, like an extension.
What your users see.
The button connected at the top right, and their SHADOW wallet open over your app: every asset, NFT and private wallet.

- Your page gets no handle on the wallet window: it cannot read, script or redirect it.
- SHADOW never loads inside another site's frame.
- You see only the wallets people tick. Never the main wallet, other wallets or keys.
The code. One file, no dependencies.
import { connect, finishRedirect, verify, openWallet } from "https://shadowprivacy.tech/connect.js";
// 1. From a click: a SHADOW window opens (on phones, a trip to SHADOW and back).
button.onclick = async () => use(await connect({ app: "My app", nfts: "<collection address>" }));
// 2. Phones come back with the answer in the address: pick it up on load.
const back = finishRedirect();
if (back && back !== "cancelled") use(back);
// 3. Check the signatures, then read what the shared wallets hold, live from the chain.
async function use(session) {
const r = await verify(session, { holdings: true });
if (!r.ok) return console.warn(r.error);
r.account; // this person's id on your app, the same every time
r.wallets; // [{ address, nfts: [{ asset, collection, number, name, image }] }]
}
// Later, from the connected button's menu: their SHADOW wallet in a small window.
walletItem.onclick = () => openWallet();Never ask people to sign the SHADOW unlock message on your site: it is the key to their private balance.
Live exampleShadow Cats · Nine LivesHolders play as the cats in their private wallets.shadowcats.club