# Clients A client is anything that drives the server. Every client speaks the same gRPC service (see [Architecture](./architecture.md)): it sends **commands** (browse the library, change the queue, control playback) and subscribes to the **update stream** that pushes the current queue, play state, track position, capture progress, and the frequency spectrum as they change. Nothing is polled — each client redraws from the pushed updates, so several clients driving one server always agree on what is playing. Because the contract is one shared service, the clients are the same program wearing different skins. They differ only in how you interact with them, not in what they can do. ```d2 direction: right server: crabidy-server { shape: rectangle } tui: cbd-tui (terminal) web: cbd-web (browser) cbd: cbd (server + TUI) cli: CLI subcommands tui -> server: gRPC web -> server: gRPC-web cli -> server: gRPC (one-shot) cbd -> server: localhost gRPC ``` - [Terminal UI — cbd-tui](./clients/tui.md) — the ratatui/crossterm terminal client, driven by vim-style keys. - [Web client — cbd-web](./clients/web.md) — a Leptos/WASM browser client with the same functionality, served by the server itself. - [The cbd bundle](./clients/cbd.md) — server and terminal client in one process for the single-machine case. - [Command line](./clients/cli.md) — every binary is also a clap CLI; the `library`/`queue`/`global` subcommands are a scriptable remote control. All clients authenticate the same way, using the role name as the basic-auth user (see [Roles and authorization](./auth.md)). Connection defaults live in each client's own config file (see [Configuration](./config.md)).