[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [local‑first/Owner](https://evolu.dev/docs/api-reference/common/local-first/Owner) › createOwnerWebSocketTransport

```ts
function createOwnerWebSocketTransport(config: {
  ownerId: string & Brand<"Id"> & Brand<"OwnerId">;
  url: string;
}): OwnerWebSocketTransport;
```

Defined in: [packages/common/src/local-first/Owner.ts:396](https://github.com/evoluhq/evolu/blob/a18269a1b822c670b507c6a9b73b23eed32551fe/packages/common/src/local-first/Owner.ts#L396)

Creates an [OwnerWebSocketTransport](https://evolu.dev/docs/api-reference/common/local-first/Owner/interfaces/OwnerWebSocketTransport) for the given relay URL and
[OwnerId](https://evolu.dev/docs/api-reference/common/local-first/Owner/variables/OwnerId).

The URL must be a WebSocket base URL without query parameters or fragments
(e.g., `wss://relay.evolu.dev`, not `wss://relay.evolu.dev?foo=bar`). The
function appends the `ownerId` as a query parameter.

### Example

```ts
import {
  AppName,
  createAppOwner,
  createEvolu,
  createOwnerWebSocketTransport,
  createOwnerSecret,
  createRandomBytes,
  id,
} from "@evolu/common";

// Create once, persist the mnemonic securely, and restore it on later runs.
const appOwner = createAppOwner(
  createOwnerSecret({ randomBytes: createRandomBytes() }),
);
const transport = createOwnerWebSocketTransport({
  url: "wss://relay.evolu.dev",
  ownerId: appOwner.id,
});
const createTodoEvolu = createEvolu(
  { todo: { id: id("Todo") } },
  {
    appName: AppName.orThrow("OwnerTransportExample"),
    appOwner,
    transports: [transport],
  },
);

expect(createTodoEvolu).toBeTypeOf("function");
expect(transport).toEqual({
  type: "WebSocket",
  url: `wss://relay.evolu.dev?ownerId=${appOwner.id}`,
});
```