> ## Documentation Index
> Fetch the complete documentation index at: https://pond.dflow.net/llms.txt
> Use this file to discover all available pages before exploring further.

# Privy

> How to add Privy to a Next.js + React app

Use Privy to add authentication and embedded wallets to a Next.js + React app.

<Info>
  Privy supports multiple authentication methods (email, socials, passkeys, and
  external wallets). This guide uses email OTP as a simple starting point.
</Info>

## Prerequisites

Create a Privy app in the [Privy Dashboard](https://dashboard.privy.io/) and
copy your App ID.

## Step-by-step (Next.js + React)

<Steps>
  <Step title="Install the React SDK">
    Install the [React SDK](https://docs.privy.io/basics/react/quickstart).

    <AccordionGroup>
      <Accordion title="Install dependencies">
        ```bash theme={null}
        npm install @privy-io/react-auth
        ```
      </Accordion>
    </AccordionGroup>
  </Step>

  <Step title="Wrap your app with PrivyProvider">
    Put your App ID in `appId="your-app-id"` and wrap your app root. For Solana
    embedded wallets, set `embeddedWallets.solana.createOnLogin` to create
    wallets on login.

    <Tabs>
      <Tab title="App Router">
        Create a client-side provider component, then wrap it in `app/layout.tsx`.

        <AccordionGroup>
          <Accordion title="app/providers.tsx">
            ```tsx theme={null}
            // app/providers.tsx
            "use client";

            import { PrivyProvider } from "@privy-io/react-auth";

            export function Providers({ children }: { children: React.ReactNode }) {
              return (
                <PrivyProvider
                  appId="your-app-id"
                  config={{
                    embeddedWallets: {
                      solana: {
                        createOnLogin: "users-without-wallets",
                      },
                    },
                  }}
                >
                  {children}
                </PrivyProvider>
              );
            }
            ```
          </Accordion>

          <Accordion title="app/layout.tsx">
            ```tsx theme={null}
            // app/layout.tsx
            import { Providers } from "./providers";

            export default function RootLayout({
              children,
            }: {
              children: React.ReactNode;
            }) {
              return (
                <html lang="en">
                  <body>
                    <Providers>{children}</Providers>
                  </body>
                </html>
              );
            }
            ```
          </Accordion>
        </AccordionGroup>
      </Tab>

      <Tab title="Pages Router">
        Wrap your app in `pages/_app.tsx`.

        <AccordionGroup>
          <Accordion title="pages/_app.tsx">
            ```tsx theme={null}
            // pages/_app.tsx
            import type { AppProps } from "next/app";
            import { PrivyProvider } from "@privy-io/react-auth";

            export default function App({ Component, pageProps }: AppProps) {
              return (
                <PrivyProvider
                  appId="your-app-id"
                  config={{
                    embeddedWallets: {
                      solana: {
                        createOnLogin: "users-without-wallets",
                      },
                    },
                  }}
                >
                  <Component {...pageProps} />
                </PrivyProvider>
              );
            }
            ```
          </Accordion>
        </AccordionGroup>
      </Tab>
    </Tabs>

    <Info>
      To use external Solana wallets, pass `toSolanaWalletConnectors()` to
      `externalWallets`. See
      [configuring connector chains](https://docs.privy.io/wallets/connectors/setup/configuring-external-connector-chains).
    </Info>
  </Step>

  <Step title="Connect a user">
    Use Privy’s modal and show a connected state when login completes.

    <AccordionGroup>
      <Accordion title="Connect button">
        ```tsx theme={null}
        "use client";

        import { usePrivy } from "@privy-io/react-auth";

        export default function ConnectButton() {
          const { ready, authenticated, login, user } = usePrivy();

          if (!ready) return <p>Loading...</p>;
          if (authenticated) return <p>Connected</p>;
          return <button onClick={login}>Connect Wallet</button>;
        }
        ```
      </Accordion>
    </AccordionGroup>
  </Step>
</Steps>

<Info>
  See the
  [Privy Solana wallet docs](https://docs.privy.io/wallets/using-wallets/solana/send-a-transaction)
  for transaction examples.
</Info>
