[Launch] LunoKit – Possibly the best way to connect Polkadot wallets 🚀

React library for Polkadot wallet connections.

LunoKit is dedicated to building an open-source, customizable, and developer-friendly Web3 wallet connection infrastructure for Polkadot SDK-based blockchains. We invite all developers to try it out and share your feedback and issues — your input will help us make LunoKit even better.

iShot_2025-08-22_12.36.19

Key Features

  • :high_voltage: Fast Setup – 10-minute integration with a unified TypeScript-first SDK and 20+ React Hooks
  • :rocket: Performance – Built-in TanStack Query for efficient subscriptions and smart caching
  • :card_index_dividers: State Management – Unified account model across all wallets
  • :globe_with_meridians: Multi-Chain – Polkadot SDK-based blockchains, with EVM support coming soon
  • :artist_palette: UI Components – Fully customizable, accessible component suite
  • :unicorn: TypeScript DX – Type hints, IntelliSense, and comprehensive documentation

Quick Demo

:backhand_index_pointing_right: View Live Demo

Installation & Usage

UI Components Only

# pnpm
pnpm add @luno-kit/ui @luno-kit/react @tanstack/react-query

# yarn
yarn add @luno-kit/ui @luno-kit/react @tanstack/react-query

# npm
npm install @luno-kit/ui @luno-kit/react @tanstack/react-query

With React Hooks

# pnpm
pnpm add @luno-kit/react @tanstack/react-query

# yarn
yarn add @luno-kit/react @tanstack/react-query

# npm
npm install @luno-kit/react @tanstack/react-query

:high_voltage: Quick Start

Basic setup

import { LunoKitProvider, ConnectButton } from '@luno-kit/ui'
import { createConfig, defineChain, kusama, polkadot, polkadotjs, subwallet, westend, paseo } from '@luno-kit/react'
import '@luno-kit/ui/styles.css'

const config = createConfig({
  appName: 'My Luno App',
  chains: [polkadot, kusama, westend, paseo],
  connectors: [polkadotjs(), subwallet()],
  autoConnect: true,
})

/* 
// Custom chain example:
const customChain = defineChain({
  genesisHash: '0x1234...', // Your chain's genesis hash
  name: 'My Custom Chain',
  nativeCurrency: { name: 'Custom Token', symbol: 'CUSTOM', decimals: 12 },
  rpcUrls: { webSocket: ['wss://my-chain-rpc.example.com'] },
  ss58Format: 42,
  blockExplorers: { default: { name: 'Explorer', url: 'https://explorer.example.com' } },
  chainIconUrl: 'https://example.com/icon.png',
  testnet: true
})

// Then use: chains: [customChain]
*/

function App() {
  return (
    <LunoKitProvider config={config}>
      <ConnectButton />
    </LunoKitProvider>
  )
}

Using with React Hooks

import { LunoKitProvider } from '@luno-kit/ui'
import { useAccount, useBalance, useConnect, ConnectionStatus } from '@luno-kit/react'

function WalletInfo() {
  const { account } = useAccount()
  const { data: balance } = useBalance({ address });
  const { connect, connectors, status } = useConnect()

  if (status !== ConnectionStatus.Connected) {
    return (
      <button onClick={() => connect({ connectorId: connectors[0].id })}>
        Connect Wallet
      </button>
    )
  }

  return (
    <div>
      <div>Account: {account?.name}</div>
      <div>Address: {account?.address}</div>
      <div>Transferable Balance: {balance?.formattedTransferable}</div>
      <div>Total Balance: {balance?.formattedTotal}</div>
    </div>
  )
}

function App() {
  return (
    <LunoKitProvider config={config}>
      <WalletInfo />
    </LunoKitProvider>
  )
}

:open_book: Documentation & Resources

8 Likes