# Installation (/getting-started/installation)



butr targets React 18+ and uses [Zustand](https://github.com/pmndrs/zustand) as
a peer dependency. Pick the install that matches your app.

## Batteries-included (recommended) [#batteries-included-recommended]

`@usebutr/wallets` provides `autoDiscovery()`, a `WalletSource` that composes
EVM + SVM discovery in one call. Use it with `WalletManagerProvider` from
`@usebutr/react`. It depends on `@usebutr/react`, `@usebutr/evm`, `@usebutr/svm`, and
`@usebutr/core`, so this single line covers most apps.

<CodeBlockTabs defaultValue="npm" groupId="package-manager">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npm install @usebutr/wallets zustand
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm add @usebutr/wallets zustand
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn add @usebutr/wallets zustand
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bun add @usebutr/wallets zustand
    ```
  </CodeBlockTab>
</CodeBlockTabs>

## EVM-only [#evm-only]

Skip the Solana bundle entirely. Use `@usebutr/react` for the provider/hooks and
`@usebutr/evm` for EIP-6963 discovery, wired with \~30 lines of your own discovery
code (see [Provider setup](/guides/provider-setup) and the
[Next.js framework guide](/getting-started/frameworks/nextjs)).

<CodeBlockTabs defaultValue="npm" groupId="package-manager">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npm install @usebutr/react @usebutr/evm @usebutr/core zustand
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm add @usebutr/react @usebutr/evm @usebutr/core zustand
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn add @usebutr/react @usebutr/evm @usebutr/core zustand
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bun add @usebutr/react @usebutr/evm @usebutr/core zustand
    ```
  </CodeBlockTab>
</CodeBlockTabs>

## Optional connectors [#optional-connectors]

These are independent adapters you register alongside discovered wallets. Each
needs its own optional peer dependency.

WalletConnect v2 (EVM mobile wallets):

<CodeBlockTabs defaultValue="npm" groupId="package-manager">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npm install @usebutr/walletconnect @walletconnect/universal-provider
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm add @usebutr/walletconnect @walletconnect/universal-provider
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn add @usebutr/walletconnect @walletconnect/universal-provider
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bun add @usebutr/walletconnect @walletconnect/universal-provider
    ```
  </CodeBlockTab>
</CodeBlockTabs>

Ledger hardware wallet (WebUSB, Chromium only):

<CodeBlockTabs defaultValue="npm" groupId="package-manager">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npm install @usebutr/ledger @ledgerhq/hw-app-eth @ledgerhq/hw-transport-webusb
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm add @usebutr/ledger @ledgerhq/hw-app-eth @ledgerhq/hw-transport-webusb
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn add @usebutr/ledger @ledgerhq/hw-app-eth @ledgerhq/hw-transport-webusb
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bun add @usebutr/ledger @ledgerhq/hw-app-eth @ledgerhq/hw-transport-webusb
    ```
  </CodeBlockTab>
</CodeBlockTabs>

## Testing helpers [#testing-helpers]

<CodeBlockTabs defaultValue="npm" groupId="package-manager">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npm install --save-dev @usebutr/testing
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm add --save-dev @usebutr/testing
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn add --dev @usebutr/testing
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bun add --dev @usebutr/testing
    ```
  </CodeBlockTab>
</CodeBlockTabs>

`@usebutr/testing` provides `createFakeAdapter` and `createFakePersistence` so unit
tests never touch a real wallet or `localStorage`. See the
[Testing guide](/testing).

## Peer dependencies [#peer-dependencies]

| Package                  | Peer dependency                                         | Notes                            |
| ------------------------ | ------------------------------------------------------- | -------------------------------- |
| `@usebutr/core`          | `zustand >= 4`                                          | The store is Zustand-backed.     |
| `@usebutr/react`         | `react >= 18`, `zustand >= 4`                           |                                  |
| `@usebutr/wallets`       | `react >= 18`, `zustand >= 4`                           |                                  |
| `@usebutr/svm`           | `@wallet-standard/app ^1.1.0`                           | Optional — lazily imported.      |
| `@usebutr/walletconnect` | `@walletconnect/universal-provider ^2`                  | Optional — dynamically imported. |
| `@usebutr/ledger`        | `@ledgerhq/hw-app-eth`, `@ledgerhq/hw-transport-webusb` | Optional.                        |

<Callout type="info">
  No environment variables are required to use butr. WalletConnect needs a project ID, but that is
  passed in code — see the [WalletConnect connector](/connectors/walletconnect).
</Callout>
