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
  1. 1Connect

    A "Connect SHADOW" button at the top right. People unlock on SHADOW and tick the private wallets to share.

  2. 2Verify

    One call checks the signatures and reads what those wallets hold from the chain. You get a stable id per person.

  3. 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.

A browser tab with the Connect SHADOW button at the top right and the SHADOW wallet open beneath it: balance, send, receive, shield, card, and assets with values
  • 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.

your-app.js
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.

Shadow CatsLive exampleShadow Cats · Nine LivesHolders play as the cats in their private wallets.shadowcats.club

Building with SHADOW?

Tell us what you build: we feature it here.