Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
cab36d5
builder(perf[readiness]) parallelize prompt wait
tony Jun 25, 2026
103f9cf
builder(fix[readiness]) wait before pane split
tony Jun 26, 2026
ce0279d
builder(fix[commands]) isolate synchronize-panes
tony Jun 26, 2026
ee17d41
builder(fix[reclaim]) fail fast without a layout
tony Jun 26, 2026
d985f7c
builder(docs[build]) trim barrier comment narration
tony Jun 26, 2026
60efa18
builder(docs[readiness]) note shared-timeout behavior
tony Jun 26, 2026
8cb0c37
builder(docs[build]) correct phase-one comment
tony Jun 26, 2026
4d86000
builder(docs[readiness]) demo predicate in its doctest
tony Jun 26, 2026
7ec0136
builder(test[plugins]) pin window hook order
tony Jun 26, 2026
f955e6f
builder(fix[readiness]) remove split prompt wait
tony Jun 26, 2026
fb5fd6c
builder(fix[progress]) sync two-phase progress
tony Jun 26, 2026
a4e1806
Load(fix[progress]): Show phased progress
tony Jun 27, 2026
95d0e02
builder(fix[sync]): Skip exited panes
tony Jun 27, 2026
41b5cac
Load(fix[before_script]): Preserve CLI streaming
tony Jun 27, 2026
3de7951
builder(fix[ordering]): Preserve window order
tony Jun 27, 2026
0169849
Load(fix[progress]): Honor panel opt-in
tony Jun 27, 2026
d36ce18
docs(CHANGES) Faster loads and before_script TTY
tony Jun 27, 2026
ffeb907
builder(fix[ordering]): Preserve pane setup
tony Jun 27, 2026
e6ad88d
builder(docs[ordering]): Clarify build order
tony Jun 27, 2026
4b08b16
progress(docs[tokens]): Fix build_progress cell
tony Jun 28, 2026
1b74007
progress(docs[tokens]): Document new format tokens
tony Jun 28, 2026
6cbb97c
util(docs[before_script]): Fix output docstring
tony Jun 28, 2026
5049b0c
docs(CHANGES) Restore 1.67.0 panel wording
tony Jun 28, 2026
3b9e0aa
docs(CHANGES) Mark before_script change breaking
tony Jun 28, 2026
7766aec
builder(docs[readiness]): Note first-split safety
tony Jun 28, 2026
1ea4b68
builder(fix[reclaim]): Narrow no-space retry
tony Jun 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,24 @@ $ tmuxp@next load yoursession
_Notes on the upcoming release will go here._
<!-- END PLACEHOLDER - ADD NEW CHANGELOG ENTRIES BELOW THIS LINE -->

### Breaking changes

#### `before_script` output now goes to the terminal by default (#1056)

A workspace's `before_script` now runs attached to your terminal, so interactive prompts and TTY-aware tools behave normally. Previously its output was captured into the load progress panel (up to three lines) by default. To restore panel capture, pass `--progress-lines` (or set `TMUXP_PROGRESS_LINES`):

```console
$ tmuxp load --progress-lines 3 myworkspace
```

### What's new

#### Faster workspace loads (#1056)

Loading a workspace is faster: {ref}`tmuxp-load` now prepares panes in a window together when config-order dependencies allow it, rather than waiting on every pane one at a time. Workspaces with multiple panes per window — particularly with a slow interactive shell startup — open noticeably quicker, with no changes to your configuration.

See {ref}`loading-workspaces` for an overview of how a load proceeds.

## tmuxp 1.71.0 (2026-06-27)

tmuxp 1.71.0 bumps libtmux to 0.59.0, adding support for tmux 3.7.
Expand Down
18 changes: 12 additions & 6 deletions docs/cli/load.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,13 +157,16 @@ $ tmuxp --log-level [LEVEL] load [filename] --log-file [log_filename]

When loading a workspace, tmuxp shows an animated spinner with build progress. The spinner updates as windows and panes are created, giving real-time feedback during session builds.

See {ref}`loading-workspaces` for how tmuxp creates windows and panes during
load and how to read the default progress line.

### Presets

Five built-in presets control the spinner format:

| Preset | Format |
|--------|--------|
| `default` | `Loading workspace: {session} {bar} {progress} {window}` |
| `default` | `Loading workspace: {session} {bar} {build_progress} {window}` |
| `minimal` | `Loading workspace: {session} [{window_progress}]` |
| `window` | `Loading workspace: {session} {window_bar} {window_progress_rel}` |
| `pane` | `Loading workspace: {session} {pane_bar} {session_pane_progress}` |
Expand Down Expand Up @@ -191,17 +194,20 @@ Use a custom format string with any of the available tokens:
| `{window}` | Current window name |
| `{window_index}` | Current window number (1-based) |
| `{window_total}` | Total number of windows |
| `{windows_created}` | Number of windows created so far |
| `{window_progress}` | Window fraction (e.g. `1/3`) |
| `{window_progress_created}` | Created windows fraction (e.g. `2/3`) |
| `{window_progress_rel}` | Completed windows fraction (e.g. `1/3`) |
| `{windows_done}` | Number of completed windows |
| `{windows_remaining}` | Number of remaining windows |
| `{pane_index}` | Current pane number in the window |
| `{pane_total}` | Total panes in the current window |
| `{pane_progress}` | Pane fraction (e.g. `2/4`) |
| `{progress}` | Combined progress (e.g. `1/3 win · 2/4 pane`) |
| `{build_progress}` | Finished windows over created windows (e.g. `1/3 win · pane 2/4`) |
| `{session_pane_progress}` | Panes completed across the session (e.g. `5/10`) |
| `{overall_percent}` | Pane-based completion percentage (0–100) |
| `{bar}` | Composite progress bar |
| `{bar}` | Build progress bar: finished, created, and empty window segments |
| `{pane_bar}` | Pane-based progress bar |
| `{window_bar}` | Window-based progress bar |
| `{status_icon}` | Status icon (⏸ during before_script) |
Expand All @@ -214,21 +220,21 @@ $ tmuxp load --progress-format "{session} {bar} {overall_percent}%" myproject

### Panel lines

The spinner shows script output in a panel below the spinner line. Control the panel height with `--progress-lines`:
By default, `before_script` runs with its normal terminal output before the spinner appears. Use `--progress-lines` to capture that output in a panel below the spinner line:

Hide the panel entirely (script output goes to stdout):
Keep native script output and hide the panel:

```console
$ tmuxp load --progress-lines 0 myproject
```

Show unlimited lines (capped to terminal height):
Capture unlimited lines (capped to terminal height):

```console
$ tmuxp load --progress-lines -1 myproject
```

Set a custom height (default is 3):
Capture five lines:

```console
$ tmuxp load --progress-lines 5 myproject
Expand Down
6 changes: 3 additions & 3 deletions docs/configuration/environmental-variables.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,15 @@ Equivalent to the `--progress-format` CLI flag.

## `TMUXP_PROGRESS_LINES`

Number of script-output lines shown in the spinner panel. Defaults to `3`.
Capture `before_script` output in the spinner panel with this many lines. By default, scripts keep their normal terminal output.

Set to `0` to hide the panel entirely (script output goes to stdout):
Set to `0` to keep native script output and hide the panel:

```console
$ TMUXP_PROGRESS_LINES=0 tmuxp load myproject
```

Set to `-1` for unlimited lines (capped to terminal height):
Set to `-1` to capture unlimited lines (capped to terminal height):

```console
$ TMUXP_PROGRESS_LINES=-1 tmuxp load myproject
Expand Down
7 changes: 7 additions & 0 deletions docs/topics/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ Conceptual guides and workflow documentation.
::::{grid} 1 1 2 2
:gutter: 2 2 3 3

:::{grid-item-card} Loading workspaces
:link: loading-workspaces
:link-type: doc
How tmuxp creates windows, panes, and progress output.
:::

:::{grid-item-card} Workflows
:link: workflows
:link-type: doc
Expand Down Expand Up @@ -46,6 +52,7 @@ instead of raw shell commands, supports JSON and YAML, and can
:hidden:

workflows
loading-workspaces
plugins
library-vs-cli
troubleshooting
Expand Down
58 changes: 58 additions & 0 deletions docs/topics/loading-workspaces.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
(loading-workspaces)=

# Loading workspaces

When you run `tmuxp load`, tmuxp creates the tmux session described by your
workspace file, waits for panes to be ready, then finishes each window by
applying layouts and sending commands.

## What happens during load

tmuxp builds each window in config order.

For each window, tmuxp creates the window and prepares its panes. When later
pane `start_directory` values already exist, panes can start their shells
together and tmuxp waits for them together.

Once the panes are ready, tmuxp applies layout, sends configured commands,
runs window-level configuration, and fires
{meth}`~tmuxp.plugin.TmuxpPlugin.after_window_finished` plugin hooks.

This means {meth}`~tmuxp.plugin.TmuxpPlugin.on_window_create` runs while the
window is created, while
{meth}`~tmuxp.plugin.TmuxpPlugin.after_window_finished` runs later, after that
window has been laid out and configured.

## Reading the progress line

The default progress line reports the same build in a compact form:

```text
Loading workspace: study ▓░░░░░░░░░ 0/1 win · pane 3/4 learning-asyncio
```

The fraction before `win` is finished windows over windows created so far. In
the example above, one window has been created and has not finished yet.

The `pane` fraction describes the current window's pane creation progress. When
a new window starts, this can briefly show `pane 0/N` before tmuxp creates the
first pane for that window.

The progress bar shows the whole workspace:

- `█` means a window is finished.
- `▓` means a window has been created but is not finished yet.
- `░` means a window has not been created yet.

Once tmuxp enters the finish phase, the finished-window count rises:

```text
Loading workspace: study █░░░░░░░░░ 1/1 win learning-asyncio
```

## Why tmuxp loads this way

Preparing a window's panes before layout lets shell startup happen in parallel
when config-order dependencies allow it. Layout and commands then run after the
panes are ready, which avoids resizing panes while shells are still drawing
their first prompts.
Loading