Skip to content

Quickstart

The fastest path. We’ll create a company in the portal, mint a publishable key, and embed the wallet in a fresh React app.

  1. Sign up at the portal

    Go to platform.sigilkeys.com/register. You’ll get an email with a one-time code. Enter the code, set up a company, pick a slug.

  2. Add the origin where your app will run

    Settings → Allowed origins → add the URL where your app runs (e.g. https://app.yourcompany.com). The iframe rejects postMessage from anything not on this list.

  3. Choose your networks

    Networks → enable the chains your users need (Ethereum is always on; toggle Solana, Bitcoin, and others). Sigil generates one keypair per cryptographic curve and derives addresses per network.

  4. Mint a publishable key

    API keys → New key → type publishable. Copy the key. It is safe to commit and ship in your bundle.

  5. Install the SDK

    Terminal window
    pnpm add https://developers.sigilkeys.com/sdk/sigilkeys-sdk-0.3.0.tgz

    While the SDK is in pre-public release it ships as a versioned tarball from this docs site. See Install for details. Your imports still use the package name @sigilkeys/sdk.

  6. Drop the provider into your app

    app.tsx
    import { SigilProvider, useWallet, useSignMessage } from '@sigilkeys/sdk/react';
    import { Network } from '@sigilkeys/sdk';
    const config = {
    organizationId: 'org_xxx', // shown in the portal dashboard
    publishableKey: 'pk_live_xxx',
    iframeUrl: 'https://wallet.sigilkeys.com',
    authMode: 'sigil' as const,
    };
    export default function App() {
    return (
    <SigilProvider config={config}>
    <Wallet />
    </SigilProvider>
    );
    }
    function Wallet() {
    const { address, wallets, ready, error } = useWallet();
    const { signMessage, isLoading } = useSignMessage();
    if (error) return <p>{error.message}</p>;
    if (!ready) return <p>loading…</p>;
    async function sign() {
    const sig = await signMessage('Hello from Sigil!', {
    network: Network.ETHEREUM,
    });
    console.log(sig); // 0x… (EIP-191 signature)
    }
    return (
    <>
    <p>Ethereum: {address}</p>
    {wallets.map(w => (
    <p key={w.network}>{w.network}: {w.address}</p>
    ))}
    <button disabled={isLoading} onClick={sign}>Sign message</button>
    </>
    );
    }
  7. Run it

    The first time the iframe loads it will ask the user for an email and send a 6-digit code. Verify the code, a self-custodial wallet is created (one keypair per curve needed by your enabled networks), and you get back addresses for every configured network. Signatures are returned in the native format of each network (hex for Ethereum, base64 for Bitcoin, base58 for Solana).

That’s it. The private key was generated, split via Shamir 2-of-3, and will only be reconstructed for milliseconds inside the iframe when the user signs. Your bundle never touched it.

What you write per integration: the network to sign for and the message. What you don’t write: anything related to key management, share splitting, or network-specific signing formats.

Next: How Sigil works for the architecture, or the SDK reference for every option.