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

# Installation

> Install @ekanos/sdk and declare its required peer dependencies.

## Install the SDK

```bash theme={null}
npm install @ekanos/sdk
```

The SDK depends on `@ekanos/integration-schema` and `@ekanos/ui`, which come along automatically. You must also install six peer dependencies, plus two that `@ekanos/ui` needs:

## Required peers

All six peers are declared as **required** — none is marked optional — so your package manager expects every one even if your integration only uses some of them:

| Peer | Version | Used by |
| - | - | - |
| `react` | `^19.2.8` | all client-side code |
| `zod` | `^3.25.76 \|\| ^4.0.0` | storage schemas, webhook payload schemas, definition parsing — zod 3 and zod 4 both work |
| `@tanstack/react-query` | `^5.101.4` | widget data hooks, `useActivateIntegration` / `useOAuthConnectionStatus` |
| `react-hook-form` | `^7.68.0` | activation forms |
| `@hookform/resolvers` | `^5.2.2` | zod validation in forms |
| `next` | `^16.0.0` | routing primitives that components reach for |

Install all six:

```bash theme={null}
npm install react zod @tanstack/react-query react-hook-form @hookform/resolvers next
```

### Also required by `@ekanos/ui`

`@ekanos/ui` comes along with the SDK, and it declares two peers of its own that your project must provide:

| Peer | Version | Used by |
| - | - | - |
| `react-dom` | `^19.2.8` | UI components |
| `next-intl` | `^4.14.7` | `<Trans>` from `@ekanos/ui/trans`, which resolves messages through next-intl (new in 0.4.0, replacing i18next) |

```bash theme={null}
npm install react-dom next-intl
```

A project from `ekanos init` already has both. Outside Ekanos and the harness (a Storybook, a bare unit test), `<Trans>` needs a `NextIntlClientProvider` above it, or it throws; see [Runtime notes](/ui/runtime-notes). Importing `i18next` or `react-i18next` in an integration is now an error under the `@ekanos/sdk/eslint` preset.

## Why peers?

Each of these creates React context. If two copies exist, one in your code and one in the host, a provider renders against instance A while a consumer reads instance B, finds nothing, and silently falls back to a default. Context bugs do not announce themselves.

As peers, your package manager ensures one copy. As dependencies, npm is free to bundle two, and bundlers can inline multiple copies without telling you. This is not hypothetical — it happened to `@ekanos/ui` when five built entries each inlined their own copy of the icon module, so each got its own React context. A provider set one instance, components in other entries read another, found no provider, and fell back to a default Font Awesome weight the loaded font had no glyph for.

**If you bundle `@ekanos/*` into your own output, keep these singletons by treating them as externals in your build.**

## Next steps

* Read [What is published](/sdk/what-is-published) to understand which packages are installable today
* Check out [Integration shape](/sdk/integration-shape) to write your first `defineIntegration()` call


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.