solana/frontend-framework-kit
Frontend with framework-kit
solanatechnical-doc🏛️ Officialconfidence highhealth 100%
v1.0.0·by solana-foundation·Updated 4/11/2026
Goals
- One Solana client instance for the app (RPC + WS + wallet connectors)
- Wallet Standard-first discovery/connect
- Minimal "use client" footprint in Next.js (hooks only in leaf components)
- Transaction sending that is observable, cancelable, and UX-friendly
Recommended dependencies
- @solana/client
- @solana/react-hooks
- @solana/kit
- @solana-program/system, @solana-program/token, etc. (only what you need)
Bootstrap recommendation
Prefer create-solana-dapp and pick a kit/framework-kit compatible template for new projects.
Provider setup (Next.js App Router)
Create a single client and provide it via SolanaProvider.
Example app/providers.tsx:
'use client';
import React from 'react';
import { SolanaProvider } from '@solana/react-hooks';
import { autoDiscover, createClient } from '@solana/client';
const endpoint =
process.env.NEXT_PUBLIC_SOLANA_RPC_URL ?? 'https://api.devnet.solana.com';
// Some environments prefer an explicit WS endpoint; default to wss derived from https.
const websocketEndpoint =
process.env.NEXT_PUBLIC_SOLANA_WS_URL ??
endpoint.replace('https://', 'wss://').replace('http://', 'ws://');
export const solanaClient = createClient({
endpoint,
websocketEndpoint,
walletConnectors: autoDiscover(),
});
export function Providers({ children }: { children: React.ReactNode }) {
return <SolanaProvider client={solanaClient}>{children}</SolanaProvider>;
}
Then wrap app/layout.tsx with <Providers>.
Hook usage patterns (high-level)
Prefer framework-kit hooks before writing your own store/subscription logic:
useWalletConnection()for connect/disconnect and wallet discoveryuseBalance(...)for lamports balanceuseSolTransfer(...)for SOL transfersuseSplToken(...)/ token helpers for token balances/transfersuseTransactionPool(...)for managing send + status + retry flows
When you need custom instructions, build them using @solana-program/* and send them via the framework-kit transaction helpers.
Data fetching and subscriptions
- Prefer watchers/subscriptions rather than manual polling.
- Clean up subscriptions with abort handles returned by watchers.
- For Next.js: keep server components server-side; only leaf components that call hooks should be client components.
Transaction UX checklist
-
Disable inputs while a transaction is pending
-
Provide a signature immediately after send
-
Track confirmation states (processed/confirmed/finalized) based on UX need
-
Show actionable errors:
- user rejected signing
- insufficient SOL for fees / rent
- blockhash expired / dropped
- account already in use / already initialized
- program error (custom error code)
When to use ConnectorKit (optional)
If you need a headless connector with composable UI elements and explicit state control, use ConnectorKit. Typical reasons:
- You want a headless wallet connection core (useful across frameworks)
- You want more control over wallet/account state than a single provider gives
- You need production diagnostics/health checks for wallet sessions