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.
-
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.
-
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 rejectspostMessagefrom anything not on this list. -
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.
-
Mint a publishable key
API keys → New key → type publishable. Copy the key. It is safe to commit and ship in your bundle.
-
Install the SDK
Terminal window pnpm add https://developers.sigilkeys.com/sdk/sigilkeys-sdk-0.3.0.tgzWhile 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. -
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 dashboardpublishableKey: '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></>);} -
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.