Skip to content
wyllet
  • Docs
  • Features
  • Playground
  • Blog
  • Docs
  • Features
  • Playground
  • Blog
  • Compare
  • Changelog
GitHub @wylletdevnpm Support
esc
  • IntroductionWhat Wyllet is, what it includes, and how it fits into a wagmi + viem dApp.
  • InstallationInstall Wyllet and its peer dependencies, and enable WalletConnect.
  • Quick startAdd a working connect button to a React dApp in a few minutes.
  • Next.jsUse Wyllet with the Next.js App Router, server components and SSR.
  • Build with AI assistantsGive Cursor, Claude Code, Copilot or ChatGPT the Wyllet docs and the rules for a correct integration.
  • ConfigurationCreate a wagmi config with getDefaultConfig: app info, chains, transports and wallets.
  • WylletProviderEvery WylletProvider prop: theme, appearance, tokens, auth, messages and callbacks.
  • WylletButtonThe Island button, its display options, and building your own trigger with useWylletButton.
Overview

Getting started

  • Introduction
  • Installation
  • Quick start
  • Next.js
  • Build with AI assistants

Core concepts

  • Configuration
  • WylletProvider
  • WylletButton
  • Presentations

Customization

  • Theming
  • Class names
  • Translations

Wallets

  • Wallets
  • All wallets
  • WalletConnect

Chains and tokens

  • Chains
  • Tokens

Features

  • Account panel
  • Activity and transactions
  • Toasts
  • Sign-In With Ethereum
  • ConnectGate

Reference

  • Hooks
  • Components
  • Utilities and types

Guides

  • Security
  • Migrate from RainbowKit
  • FAQ
wyllet

The open-source wallet connector for React dApps. Built on wagmi and viem.

MIT licensed. v1.1.0 on npm with provenance.

Product

  • Features
  • Compare
  • Playground
  • Changelog
  • Blog

Docs

  • Quick start
  • Next.js
  • Build with AI
  • Theming
  • Migrate from RainbowKit

Community

  • GitHub
  • X @wylletdev
  • npm
  • Releases
  • Report an issue

Support

  • support@wyllet.dev
  • FAQ
  • Security
  • Report a vulnerability
  • MIT License

For AI agents

  • llms.txt
  • llms-full.txt
  • RSS feed
  • Sitemap

Wallet, network and token names and logos are trademarks of their respective owners and are used only to identify them.

Docs/Wallets

WalletConnect

Project IDs, domain allowlists, QR codes and how mobile app links work.

View .mdReport a problem

WalletConnect lets users connect a mobile wallet by scanning a QR code on desktop, or by opening the wallet app on a phone. It is optional. Without it, Wyllet still connects browser extensions and any dedicated connectors.

Setup

1. Get a project ID

Create a free project at cloud.reown.com and copy its project ID.

2. Install the provider

@walletconnect/ethereum-provider is an optional peer dependency, so you choose and pin its version.

pnpm add @walletconnect/ethereum-provider

3. Pass the project ID

wagmi.ts
import { getDefaultConfig } from 'wyllet'
import { base, mainnet } from 'viem/chains'
 
export const config = getDefaultConfig({
  appName: 'My dApp',
  appDescription: 'Trade on Base',
  appIcon: 'https://mydapp.xyz/icon.png',
  walletConnectProjectId: process.env.NEXT_PUBLIC_WC_PROJECT_ID,
  chains: [mainnet, base],
})

getDefaultConfig adds wagmi's walletConnect connector with Wyllet's own QR screen (showQrModal: false). Wallets see your appName, appDescription (defaults to appName), appUrl (defaults to window.location.origin) and appIcon when they connect.

The connector is only added when at least one wallet in your list supports WalletConnect. defaultWallets() includes walletConnectWallet(), so the default list always does.

4. Allow your domains

In Reown Cloud, add every domain that serves your dApp (production, staging and preview hosts) to the project's allowed domains. Connections from a domain that is not on the list fail, even though the same code works locally.

Hand-written configs

If you create the wagmi config yourself, add the connector and pass the project ID to the provider so Wyllet can open All wallets.

import { createConfig, http, injected } from 'wagmi'
import { walletConnect } from 'wagmi/connectors'
import { mainnet } from 'viem/chains'
 
const projectId = process.env.NEXT_PUBLIC_WC_PROJECT_ID!
 
const config = createConfig({
  chains: [mainnet],
  transports: { [mainnet.id]: http() },
  connectors: [
    injected(),
    walletConnect({
      projectId,
      showQrModal: false,
      metadata: { name: 'My dApp', description: 'My dApp', url: 'https://mydapp.xyz', icons: [] },
    }),
  ],
})
 
// Inside WagmiProvider and QueryClientProvider:
<WylletProvider walletConnectProjectId={projectId} appInfo={{ name: 'My dApp' }}>
  {children}
</WylletProvider>

Keep showQrModal: false, or WalletConnect's own modal opens on top of Wyllet's.

How connections work

QR codes on desktop

On desktop, picking a WalletConnect wallet shows a QR code. When the user picked a specific wallet such as MetaMask, the code carries that wallet's logo and the screen says to open that app and tap its scan button. The footer's Scan with phone button and the generic WalletConnect option show a plain code for any wallet. Every QR screen has a Copy link button.

Mobile links

On a phone there is nothing to scan. Wyllet requests a WalletConnect URI and sends the user to the wallet with the link from that wallet's mobileUri. For example, metaMaskWallet() opens https://metamask.app.link/wc?uri= followed by the encoded URI. The connecting screen also shows an Open button with the same link, in case the browser blocked the redirect.

The plain walletConnectWallet() option has no app of its own, so its mobile link is the bare wc: URI. A bare link opens whichever wallet app the operating system picks, and iOS shows no chooser. That is why, on phones, the plain option is labeled Other wallet app with the note "Opens your default wallet app".

All wallets solves this. With a project ID, the WalletConnect option opens the registry directory, where every wallet has its own universal or native link. Picking a wallet there opens that exact app. Wallets with no mobile link show an install screen instead of a bare link.

Inside a wallet's in-app browser, the wallet injects a provider, so Wyllet connects to it directly without WalletConnect.

Troubleshooting

The WalletConnect option and "Scan with phone" are missing. No WalletConnect connector exists. Check that walletConnectProjectId is set and not undefined at build time, and that at least one wallet in wallets has a walletConnect field.

A module-not-found error for @walletconnect/ethereum-provider. Install the package. wagmi's connector loads it when WalletConnect is configured.

Connecting works locally but fails in production. Add the production domain to the project's allowed domains in Reown Cloud.

On a phone, the wrong wallet opens. The user picked the plain WalletConnect option, which uses a bare wc: link. Keep appearance.walletDirectory enabled so the option opens All wallets, or list presets with their own app links.

All wallets does not appear. With a hand-written config, pass walletConnectProjectId to WylletProvider. Also check that appearance.walletDirectory is not false.

All wallets shows "Couldn't load the wallet list." The request to explorer-api.walletconnect.com failed. Check your Content Security Policy and any network filters, then use Retry.

The QR code keeps loading. Wyllet is waiting for a URI from WalletConnect. Check the browser console for errors from the WalletConnect provider, such as an invalid project ID.

PreviousAll walletsNextChains

On this page

  • Setup
  • 1. Get a project ID
  • 2. Install the provider
  • 3. Pass the project ID
  • 4. Allow your domains
  • Hand-written configs
  • How connections work
  • QR codes on desktop
  • Mobile links
  • Troubleshooting