Loading...
Loading...
Guides developers through integrating Reown AppKit into web applications (React, Next.js, Vue, Nuxt, Svelte, vanilla JavaScript). Use when adding wallet connection, network switching, multi-chain support, or troubleshooting AppKit integration issues.
npx skill4agent add reown-com/skills appkit| Framework | Import path | Notes |
|---|---|---|
| React | | Hooks-based |
| Next.js | | SSR + cookie hydration required |
| Vue | | Composables-based |
| Nuxt | | SSR + module config required |
| Svelte | | Stores-based |
| JavaScript | | No framework dependency |
b56e18d47c72ab683b10814fe94956941. Install packages (appkit + adapter)
↓
2. Configure adapter (projectId, networks)
↓
3. Call createAppKit({ adapters, networks, projectId, metadata })
↓
4. Wrap app with required providers (framework-specific)
↓
5. Add <appkit-button /> or use hooks/composables to open modal
↓
6. Use hooks/composables for account, network, and provider access
↓
7. Add your domain at [dashboard.reown.com](https://dashboard.reown.com)@reown/appkit# EVM with Wagmi (most common)
npm install @reown/appkit @reown/appkit-adapter-wagmi wagmi viem @tanstack/react-query
# EVM with Ethers v6
npm install @reown/appkit @reown/appkit-adapter-ethers ethers
# Solana
npm install @reown/appkit @reown/appkit-adapter-solana
# Bitcoin
npm install @reown/appkit @reown/appkit-adapter-bitcoin
import { createAppKit } from '@reown/appkit/react' // or /vue or just @reown/appkit
import { WagmiAdapter } from '@reown/appkit-adapter-wagmi'
import { mainnet, arbitrum } from '@reown/appkit/networks'
const projectId = 'b56e18d47c72ab683b10814fe9495694' // Public projectId for localhost only
const networks = [mainnet, arbitrum]
const wagmiAdapter = new WagmiAdapter({
networks,
projectId,
})
const modal = createAppKit({
adapters: [wagmiAdapter],
networks,
projectId,
metadata: {
name: 'My App',
description: 'My App Description',
url: 'https://myapp.com', // Must match your domain
icons: ['https://myapp.com/icon.png']
},
features: {
analytics: true
}
})// Web component (works everywhere)
<appkit-button />
// React hook
import { useAppKit } from '@reown/appkit/react'
const { open } = useAppKit()
<button onClick={() => open()}>Connect</button>
// Vue composable
import { useAppKit } from '@reown/appkit/vue'
const { open } = useAppKit()// React
import { useAppKitAccount, useAppKitNetwork } from '@reown/appkit/react'
const { address, isConnected, caipAddress } = useAppKitAccount()
const { caipNetwork, switchNetwork } = useAppKitNetwork()| Hook | Returns | Purpose |
|---|---|---|
| | Control modal |
| | Account state |
| | Network state |
| | Raw provider access |
| | Modal state |
| | Disconnect wallet |
| | Token balance |
| | Wallet metadata |
@reown/appkit*// package.json — correct: all versions match
{
"@reown/appkit": "1.7.1",
"@reown/appkit-adapter-wagmi": "1.7.1",
"@reown/appkit-adapter-solana": "1.7.1"
}@reown/appkit*createAppKitcreateAppKitsetup()// DO — module-level (runs once on import)
import { createAppKit } from '@reown/appkit/react'
import { wagmiAdapter, projectId, networks, metadata } from './config'
createAppKit({ adapters: [wagmiAdapter], networks, projectId, metadata })
export default function App() {
return <appkit-button />
}// DON'T — inside a component (runs on every render)
export default function App() {
createAppKit({ adapters: [wagmiAdapter], networks, projectId, metadata }) // BUG
return <appkit-button />
}WagmiAdapterEthersAdaptereip155// DO — one EVM adapter
createAppKit({ adapters: [wagmiAdapter, solanaAdapter], ... })
// DON'T — two EVM adapters
createAppKit({ adapters: [wagmiAdapter, ethersAdapter], ... }) // CONFLICTcreateAppKitimport { WagmiAdapter } from '@reown/appkit-adapter-wagmi'
import { SolanaAdapter } from '@reown/appkit-adapter-solana'
import { mainnet, arbitrum, solana, solanaDevnet } from '@reown/appkit/networks'
const wagmiAdapter = new WagmiAdapter({ networks: [mainnet, arbitrum], projectId })
const solanaAdapter = new SolanaAdapter()
createAppKit({
adapters: [wagmiAdapter, solanaAdapter],
networks: [mainnet, arbitrum, solana, solanaDevnet],
projectId,
metadata,
})projectIdmetadata.url@reown/appkit/networksWagmiProviderQueryClientProvidercreateAppKit| Error | Cause | Fix |
|---|---|---|
| "Project ID is required" | Missing projectId | Get one from dashboard.reown.com |
| Hydration mismatch (Next.js) | Missing SSR config | Add |
| Modal not appearing | | Ensure it runs before app renders |
| Network not switching | Wrong network import | Use |
| Webpack error (Next.js) | Missing externals config | Add |
| Provider undefined | Accessing before connection | Check |
// config.ts
import { WagmiAdapter } from '@reown/appkit-adapter-wagmi'
import { mainnet, arbitrum, base } from '@reown/appkit/networks'
export const projectId = 'b56e18d47c72ab683b10814fe9495694' // localhost testing only
export const networks = [mainnet, arbitrum, base]
export const wagmiAdapter = new WagmiAdapter({ networks, projectId })
export const metadata = {
name: 'My dApp',
description: 'My dApp description',
url: 'https://mydapp.com',
icons: ['https://mydapp.com/icon.png']
}
// App.tsx
import { createAppKit } from '@reown/appkit/react'
import { WagmiProvider } from 'wagmi'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { projectId, networks, wagmiAdapter, metadata } from './config'
const queryClient = new QueryClient()
createAppKit({
adapters: [wagmiAdapter],
networks,
projectId,
metadata,
features: { analytics: true }
})
export default function App() {
return (
<WagmiProvider config={wagmiAdapter.wagmiConfig}>
<QueryClientProvider client={queryClient}>
<appkit-button />
</QueryClientProvider>
</WagmiProvider>
)
}<script lang="ts" setup>
import { createAppKit } from '@reown/appkit/vue'
import { EthersAdapter } from '@reown/appkit-adapter-ethers'
import { mainnet, arbitrum } from '@reown/appkit/networks'
const projectId = 'b56e18d47c72ab683b10814fe9495694' // localhost testing only
createAppKit({
adapters: [new EthersAdapter()],
networks: [mainnet, arbitrum],
projectId,
metadata: {
name: 'My Vue dApp',
description: 'My Vue dApp',
url: 'https://myapp.com',
icons: ['https://myapp.com/icon.png']
}
})
</script>
<template>
<appkit-button />
</template>