# Realtime

## Multiplayer

Example AI-generated app code that shares realtime state between clients.
[View the complete multiplayer example](https://github.com/rivet-dev/agentos/tree/main/examples/apps-multiplayer).

Server:

```ts
import { actor, event, setup } from "rivetkit";

type Position = { x: number; y: number };

const room = actor({
	state: {
		players: {} as Record<string, Position>,
	},
	events: {
		changed: event(),
	},
	actions: {
		join(c, player: string) {
			c.state.players[player] ??= { x: 0, y: 0 };
			c.broadcast("changed", c.state.players);
			return c.state.players;
		},
		move(c, player: string, x: number, y: number) {
			c.state.players[player] = { x, y };
			c.broadcast("changed", c.state.players);
			return c.state.players;
		},
		inspect(c) {
			return c.state.players;
		},
	},
});

export const registry = setup({
	use: { room },
});

registry.start();

export default function fetch() {
	return Response.json({
		app: "multiplayer-room",
		message: "Use the RivetKit client to join and move in a room.",
	});
}
```

Client:

```ts
import type { Deployment } from "@rivet-dev/agentos-apps";
import { createClient } from "rivetkit/client";
import type { registry as appRegistry } from "../fixtures/app/src/index.js";

const response = await fetch("http://localhost:3000/deploy/multiplayer-room", {
	method: "POST",
});
if (!response.ok) {
	throw new Error(`deployment failed: ${response.status} ${await response.text()}`);
}
const deployment = (await response.json()) as Deployment;

const client = createClient<typeof appRegistry>({
	namespace: deployment.namespace,
	poolName: deployment.pool,
});

try {
	const room = client.room.getOrCreate(["lobby"]);
	await room.join("alice");
	console.log(await room.move("alice", 4, 8));
} finally {
	await client.dispose();
}
```
