[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:485](https://github.com/evoluhq/evolu/blob/037c390af081e9944d616ff298a729515c5c5ab7/packages/common/src/local-first/Owner.ts#L485)

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,
  assertEqual,
  assertTrue,
  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],
  },
);

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