---
title: Frontend with framework-kit
description: Build React and Next.js Solana apps with a single client instance, Wallet Standard-first connection, and minimal client-side footprint.
---
# Frontend with framework-kit (Next.js / React)
## 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`:
```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 {children};
}
```
Then wrap `app/layout.tsx` with ``.
## Hook usage patterns (high-level)
Prefer framework-kit hooks before writing your own store/subscription logic:
* `useWalletConnection()` for connect/disconnect and wallet discovery
* `useBalance(...)` for lamports balance
* `useSolTransfer(...)` for SOL transfers
* `useSplToken(...)` / token helpers for token balances/transfers
* `useTransactionPool(...)` 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