# Server, session, window, pane

Source: https://libtmux.org/en/java/latest/concepts/server-session-window-pane/

> How tmux servers, sessions, windows, panes and attached clients relate to each other.

libtmux models tmux's server, session, window, and pane objects:

```
Server
├── Session
│   └── Window
│       └── Pane
└── Client (attached view)
```

A [`Server`](<https://libtmux.org/en/java/latest/reference/io-github-libtmux-server-server/>) contains sessions. Each [`Session`](<https://libtmux.org/en/java/latest/reference/io-github-libtmux-session-session/>) contains links to windows, and each
[`Window`](<https://libtmux.org/en/java/latest/reference/io-github-libtmux-window-window/>) contains panes. Commands run inside a [`Pane`](<https://libtmux.org/en/java/latest/reference/io-github-libtmux-pane-pane/>), where you send input and
capture output. A window can be linked to more than one session.

## Stable identity, not name or index

tmux assigns a unique ID to each session, window, and pane at creation. The ID
remains stable for that object's lifetime even if its name or index changes:

| Object | ID prefix | Example |
|--------|-----------|---------|
| Session | `$` | `$13` |
| Window | `@` | `@3243` |
| Pane | `%` | `%5433` |
| Server | - | identified by socket name or path instead |

Use stable IDs to identify the same tmux object across reads. Names and indexes
can change while a program is running.

Read the hierarchy:

```java
for (Session session : server.sessions()) {
    System.out.println(session.name());
    for (Window window : session.windows()) {
        System.out.println("  " + window.index() + " " + window.name());
        for (Pane pane : window.panes()) {
            System.out.println("    " + pane.id().value() + " " + pane.currentCommand());
        }
    }
}
```

## Client: a view, not a child

A [`Client`](<https://libtmux.org/en/java/latest/reference/io-github-libtmux-client-client/>) represents a terminal attached to a session. Several clients can view
the same server, and each can switch sessions or windows independently. Client
fields describe the view at the time of the read.

A [control-mode connection](https://libtmux.org/en/java/latest/concepts/transports/) is also a client. It appears in
[`list-clients`](https://libtmux.org/en/tmux/latest/manual/list-clients/), counts toward [`session_attached`](https://libtmux.org/en/tmux/latest/catalog/formats/session_attached/), and affects
attachment-dependent behavior such as [`destroy-unattached`](https://libtmux.org/en/tmux/latest/catalog/options/destroy-unattached/). Closing the last
attached client can therefore destroy a session configured with that option.
