internet-court/privy
Use when building wallet infrastructure, authenticating users, managing embedded wallets, configuring access controls and policies, or integrating blockchain transactions into applications. Reach for this skill when working with user onboarding, wallet creation, transaction signing, policy enforcement, or API integration across Ethereum, Solana, and other blockchains.
npx skills add https://github.com/internet-court/internet-court-skill --skill Privy
Privy is a wallet infrastructure and authentication platform that enables developers to embed wallets and user authentication into applications. It provides client-side SDKs (React, React Native, Swift, Android, Flutter, Unity) for user-facing features and server-side SDKs (Node.js, Go, Java, Rust, Ruby) for backend wallet management. Key entry points: REST API at https://api.privy.io/v1/, PrivyProvider component for React apps, PrivyClient for backend operations. Configuration happens in the Privy Dashboard at https://dashboard.privy.io/. The primary documentation is at https://docs.privy.io.
Use Privy when:
| Concept | Purpose | Example |
|---------|---------|---------|
| User | Unified identity across auth methods and wallets | Email + MetaMask linked to same user |
| Embedded wallet | Privy-managed wallet secured by key splitting | User wallet created on login |
| Owner | Entity with full control over a wallet | User, authorization key, or key quorum |
| Signer | Party with scoped permissions to sign transactions | Server automation, delegated access |
| Policy | Rules constraining wallet actions (amounts, recipients, contracts) | Max $1000 per transfer, approved recipients only |
| Intent | Proposed action awaiting approval (manual or quorum) | Transfer request pending team approval |
React/Next.js:
import {PrivyProvider} from '@privy-io/react-auth';
<PrivyProvider appId="your-app-id" clientId="your-client-id" config={{...}}>
{children}
</PrivyProvider>
Node.js:
import {PrivyClient} from '@privy-io/node';
const privy = new PrivyClient({appId: 'your-app-id', appSecret: 'your-app-secret'});
REST API:
curl -X POST https://api.privy.io/v1/wallets \
-H "Authorization: Basic <base64(appId:appSecret)>" \
-H "privy-app-id: your-app-id"
| Item | Location | Purpose |
|------|----------|---------|
| App ID & Secret | Privy Dashboard > Apps | API authentication credentials |
| Webhook signing secret | Dashboard > Configuration > Webhooks | Verify webhook payloads |
| App clients | Dashboard > Apps > App Clients | Environment-specific configuration |
| Login methods | Dashboard > Configuration > Login Methods | Enable email, SMS, OAuth, wallets, etc. |
| Policies | Dashboard or API | Define wallet action constraints |
| Endpoint | Method | Purpose |
|----------|--------|---------|
| /v1/wallets | POST | Create wallet |
| /v1/wallets/{id} | GET | Fetch wallet details |
| /v1/wallets/{id}/ethereum/eth_sendTransaction | POST | Send EVM transaction |
| /v1/wallets/{id}/solana/signAndSendTransaction | POST | Send Solana transaction |
| /v1/users | POST | Create user |
| /v1/users/{id} | GET | Fetch user |
| /v1/policies | POST | Create policy |
| /v1/intents | GET/POST | Fetch or create intents |
| Scenario | Embedded | External |
|----------|----------|----------|
| New users without wallets | ✓ | ✗ |
| Users bringing existing wallets | ✗ | ✓ |
| Full control over UX | ✓ | ✗ |
| User controls keys directly | ✗ | ✓ |
| Seamless onboarding | ✓ | ✗ |
| Leverage existing balances | ✗ | ✓ |
| Scenario | Privy Auth | JWT-based |
|----------|-----------|-----------|
| No existing auth system | ✓ | ✗ |
| Multiple login methods needed | ✓ | ✓ |
| Existing auth provider (Auth0, Firebase) | ✗ | ✓ |
| Want Privy to manage sessions | ✓ | ✗ |
| Custom auth system | ✗ | ✓ |
| Scenario | Client-side | Server-side |
|----------|------------|------------|
| User-controlled wallets | ✓ | ✗ |
| Application-owned wallets | ✗ | ✓ |
| Automated trading/agents | ✗ | ✓ |
| Consumer app | ✓ | ✗ |
| Treasury/business wallets | ✗ | ✓ |
| User signs transactions | ✓ | ✗ |
PrivyProvider at the rootPrivyClient with appId and appSecretready state before consuming Privy hooks/stateuseLoginWithEmail(), useLoginWithWallet(), or other login hooks (React)/v1/users to create users server-sideembeddedWallets.createOnLogin in PrivyProvider configprivy.wallets().create({chain_type: 'ethereum'}) or POST to /v1/walletsuseSendTransaction() hook or sign methodsprivy.wallets().ethereum().sendTransaction() or equivalentid (UUID) for API calls, not the wallet address. Address is for on-chain identification only.eip155:1 for Ethereum mainnet, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp for Solana).privy.webhooks().verify() or manual verification.ready === true in React. State may be stale or undefined.clientId to PrivyProvider.Before submitting work with Privy:
ready state is checked before consuming Privy hooks (React)APIError and PrivyAPIError (backend)> For additional documentation and navigation, see: https://docs.privy.io/llms.txt
Take internet-court/privy from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.