Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Type `quil` after a reboot — every tab, pane, working directory, layout split,
| Focus mode + a dozen project tabs. | Per-type setup: dir browser, resume strategy, permission toggles. |
| **Resize with the mouse** | **Right-click pane menu** |
| <img src="https://cdn.stukans.com/quil/screenshots/pane-resize-800.webp" alt="Dragging a split border with the mouse to resize neighboring panes" width="420"> | <img src="https://cdn.stukans.com/quil/screenshots/mouse-right-click-menu-800.webp" alt="Right-click context menu with per-pane actions and the target pane highlighted" width="420"> |
| Drag any split border — nested panes clamp to minimums, PTYs see one resize on release. | Per-pane actions under the cursor: history, notes, lazygit, attention pin, restart, close. |
| Drag any split border — nested panes clamp to minimums, PTYs see one resize on release. | Per-pane actions under the cursor: history, notes, lazygit, attention pin, move to another tab, restart, close. |
| **Command palette: jump anywhere** | **…and run anything** |
| <img src="https://cdn.stukans.com/quil/screenshots/command-palette-1-800.webp" alt="Command palette showing Go to pane and Tabs sections for cross-workspace navigation" width="420"> | <img src="https://cdn.stukans.com/quil/screenshots/command-palette-2-800.webp" alt="Command palette Pane section listing actions with their keybindings" width="420"> |
| `Alt+Shift+P` fuzzy-finds every pane and tab — navigation grouped at the top. | Every action grouped below, each showing its keybinding; type to filter instantly. |
Expand Down Expand Up @@ -101,6 +101,11 @@ Under the active project each pane also shows the checkout it sits in — branch
ten panes in one repository cost one `git` invocation, and a probe that does not
answer keeps its last value marked stale rather than guessing.

Too many projects? Right-click one → **Move to group…** and collapse the groups
you are not using; a collapsed group still shows its agents' badges. Right-click
a tab to rename it, recolour it, re-lay-out its panes or move it to another
project, and hold `Alt` to drag a pane beside another, swap them, or onto another tab.

| Key | Action |
|---|---|
| `Alt+Shift+S` | Toggle the sidebar |
Expand Down
4 changes: 2 additions & 2 deletions docs/competitive-analysis.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ Legend: ✅ full · 🟡 partial/different · ❌ absent · ❓ not re-verified
| Repo config + lifecycle hooks | 🟡 | ✅ | ❌ |
| Profiles (per-project workspaces) | 🟡 | ✅ | 🟡 (projects, v1.47 — a project scopes tabs and a root directory, not a saved profile) |
| Auto-stop idle sessions | 🟡 | ✅ | ❌ |
| Groups / favorites / snooze / archive / trash | 🟡 | ✅ | ❌ |
| Groups / favorites / snooze / archive / trash | 🟡 | ✅ | 🟡 (project groups in the sidebar, v1.79 — named, collapsible, reorderable; no favorites, snooze, archive or trash) |
| Self-update (in-app) | ✅ | ✅ | ✅ (check + stage in the background, prompt in the TUI, rename-aside swap with rollback applied at next launch) |
| Self-update as a *CLI subcommand* | ✅ | ✅ | ❌ (there is no `quil update`; the CLI switch is daemon/mcp/notify/sandbox/version/remote/restart/status) |
| Pane notes (per-pane editor) | ❌ | ❌ | ✅ |
Expand Down Expand Up @@ -220,7 +220,7 @@ current to-do list.
| 17 | Themes + light/dark auto-switch | herdr, aoe | 8–18 presets, follows host OSC 10/11. Quil's theming is minimal. | S–M | ★★ | new |
| 18 | Session fork | aoe | Branch a conversation into a new independent session, parent untouched. | M | ★★ | new |
| 19 | Repo config + lifecycle hooks (`on_create`/`on_launch`/`on_destroy`) | aoe | Per-project `.quil.toml` hooks. Natural extension of workspace files. | M | ★★ | workspace-files |
| 20 | Session lifecycle management (auto-stop idle, groups/favorites/snooze/archive) | aoe | Keep a large fleet tidy: reap idle sessions, organize + archive them. | M | ★★ | new |
| 20 | Session lifecycle management (auto-stop idle, groups/favorites/snooze/archive) | aoe | Keep a large fleet tidy: reap idle sessions, organize + archive them. The grouping half is partly covered since v1.79: projects (not single sessions) go into named, collapsible sidebar groups. Auto-stop, favorites, snooze and archive are still open. | M | ★★ | new |

Runners-up considered but cut from the top 20: named sessions, live server
handoff, ACP structured view (novel but very large), `agent explain` detection
Expand Down
4 changes: 4 additions & 0 deletions docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,10 @@ When a pane plugin asks for a working directory (`prompts_cwd`, e.g. Claude Code

Quil records the last project list seen on each remote destination in `~/.quil/remote-projects-<host>.json` (plus a bare `remote-projects.json` for the local daemon), so a host that is unreachable at launch can still be shown by name in the sidebar instead of vanishing. This file is managed by Quil — no hand-editing. A stale copy is harmless: it self-heals on the next successful broadcast from that host, and is removed automatically when the host is disconnected.

## Project groups

The sidebar's project groups (see [Features → Project groups](features.md#project-groups)) are stored in `~/.quil/project-groups.json`: each group's name, whether it is collapsed, and its projects. The file belongs to this machine, not to a daemon — no daemon reads it, which is what lets one group hold local and remote projects. It is managed by Quil — no hand-editing. Two Quil windows on one machine share it and the last change wins. A file Quil cannot read or parse is moved aside to `project-groups.json.bak` (or the next free `.bak.N`) and the sidebar starts with no groups, so nothing overwrites it.

## How edits get persisted

- **Edits via the F1 → Settings dialog** auto-save on TUI exit. The setter for each row flips `m.configChanged = true`; `main.go` writes the file atomically via temp + rename.
Expand Down
5 changes: 4 additions & 1 deletion docs/features.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,9 @@ The same six are in the command palette (acting on the active tab) and can be bo
| Close tab | `Alt+W` |
| Cycle tab color | `Alt+C` (8 colours) |
| Switch to tab N | `Alt+1` .. `Alt+9` |
| Rename, pick a colour, tidy the layout, move to another project | Right-click the tab — see [Mouse: tab context menu](keybindings.md#mouse-tab-context-menu) |

A rename or colour change is saved at once, so a daemon stopped straight after it comes back with the new name.

### New tab, with the pane you actually want

Expand All @@ -212,7 +215,7 @@ checkout.

### Mouse & keyboard

Full mouse support — click tabs to switch, click panes to focus, scroll wheel for terminal history. Drag panes to select text. Drag a tab (in the tab bar or by its name in the project sidebar) or a project row to reorder it; the item moves once the pointer passes the middle of its neighbour, so the drag never flips back and forth. `Alt+Shift+PgUp`/`PgDn` and `Alt+Shift+Up`/`Down` do the same from the keyboard for tabs and projects. Right-click a tab (in the bar or the sidebar) for a context menu to rename it, pick its color, tidy its layout, or move it to another project on the same machine — see [Mouse: tab context menu](keybindings.md#mouse-tab-context-menu). Hold `Alt` and drag a pane to move it beside another pane, swap the two, or drop it on a tab — see [Rearranging a tab's panes](#rearranging-a-tabs-panes). All keybindings are configurable via `config.toml`.
Full mouse support — click tabs to switch, click panes to focus, scroll wheel for terminal history (over vim, lazygit, Claude Code or another app that takes the mouse, the wheel scrolls the app instead, and a sideways wheel or trackpad swipe does nothing). Drag panes to select text. Drag a tab (in the tab bar or by its name in the project sidebar) or a project row to reorder it; the item moves once the pointer passes the middle of its neighbour, so the drag never flips back and forth. `Alt+Shift+PgUp`/`PgDn` and `Alt+Shift+Up`/`Down` do the same from the keyboard for tabs and projects. Right-click a tab (in the bar or the sidebar) for a context menu to rename it, pick its color, tidy its layout, or move it to another project on the same machine — see [Mouse: tab context menu](keybindings.md#mouse-tab-context-menu). Hold `Alt` and drag a pane to move it beside another pane, swap the two, or drop it on a tab — see [Rearranging a tab's panes](#rearranging-a-tabs-panes). All keybindings are configurable in `bindings.toml`.

When there are more tabs than fit, the mouse wheel over the tab bar scrolls the strip left/right instead of switching tabs or reaching the pane beneath it; markers (`«N` / `N»`) show how many tabs are hidden on each side. Clicking a tab keeps the current scroll position; switching some other way (keyboard, the palette, an MCP tool) snaps the bar back to centering on whichever tab is now active.

Expand Down
3 changes: 3 additions & 0 deletions docs/keybindings.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ actions, command palette).
| Mouse click on tab | Switch to that tab |
| Mouse drag a tab | Reorder — the tab moves once the pointer passes the middle of a neighbour, so a narrow tab dragged over a wide one never flips back and forth; intermediate tabs slide one slot at a time |
| Mouse click / drag a tab name in the project sidebar | Switch to that tab / reorder it — drag the name up or down past the middle of another tab's group of rows |
| Right-click a tab (tab bar or sidebar) | Rename tab, Set color…, Layout…, Move to project… — see [Mouse: tab context menu](#mouse-tab-context-menu) |
| Mouse wheel over the tab bar | Scroll the tab strip when tabs overflow, without switching tabs; `«N` / `N»` count the tabs hidden on each side |

The active tab is prefixed with `* ` in the tab bar so it's visible even when [tab colors](configuration.md#keybindings) override the bold weight.

Expand All @@ -131,6 +133,7 @@ The active tab is prefixed with `* ` in the tab bar so it's visible even when [t
| `Alt+Shift+L` | Force a full screen redraw — clears rendering artifacts (scrambled/misplaced characters) without restarting. Mnemonic: `Ctrl+L` redraws a shell. |
| `Alt+Shift+I` | Open the active pane's input history — one row per prompt you submitted, newest first. `↑/↓` navigate, `PgUp/PgDn/Home/End` jump, `Enter` opens the full text in a soft-wrapped read-only viewer (drag or `Ctrl+A` to select, right-click or `Enter` to copy), `Esc` closes. Only AI panes whose plugin sets `record_history` (Claude Code) capture history; other pane types show an empty state. |
| `Alt+A` | Open the pane context menu for the active pane (`quick_actions`). Same menu as right-click — see [Mouse: pane context menu](#mouse-pane-context-menu) below. |
| Right-click a pane → Move to tab… | Send the pane, still running, to another tab on the same machine |

### Mouse: pane context menu

Expand Down
12 changes: 12 additions & 0 deletions docs/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -543,6 +543,16 @@ default-deny firewall needs `NET_ADMIN`, which Quil does not grant); bind-mount
IO on Docker Desktop is ~20× slower and inotify does not cross it on Windows, so
file watchers need polling; repositories with submodules are unsupported.

### v1.76.0–v1.79.0: Reorganise Tabs, Panes and Projects
> Move work where it belongs without restarting it.

- **Tab bar wheel scroll (v1.76.0)** — the wheel over the tab bar scrolls the strip instead of the pane under it, without switching tabs; `«N` / `N»` count the tabs hidden on each side. A sideways wheel notch over vim, lazygit or Claude Code no longer scrolls it down
- **Tab context menu (v1.77.0)** — right-click a tab in the tab bar or the sidebar: Rename tab, Set color…, Move to project… (another project on the same machine, panes still running). A rename or recolour is now saved at once instead of at the next 30 s snapshot
- **Move a pane to another tab, and tidy a tab's layout (v1.78.0)** — *Move to tab…* on the pane menu; the pane keeps running and spirals into the target's last pane, and a tab left empty closes. The tab menu's *Layout…* offers Even out, Columns, Rows, Grid, Main + stack and Spiral, also in the palette and as unbound `tab.layout_*` actions. `Alt`+drag a pane to place it beside another, swap the two, or drop it on a tab
- **Project groups (v1.79.0)** — named, collapsible groups in the sidebar with rolled-up badges; drag headers to reorder, drag projects in and out, *Move to group…* on the project menu. Kept on this machine in `project-groups.json`, so one group can mix local and remote projects. Rows under the pointer and rows being dragged are highlighted

**Known limit:** another Quil window attached to the same daemon keeps its own arrangement of a tab and can overwrite a new layout with it — multi-client layout sync is a separate item.


---

Expand Down Expand Up @@ -832,6 +842,8 @@ review the diff.
OSC 10/11 colors (herdr ships 18, AoE 8). Quil's theming is minimal today.
16. **Session lifecycle management** — auto-stop idle sessions plus
groups / favorites / snooze / archive to keep a large fleet tidy (AoE).
**Groups partly shipped (v1.79.0):** projects, not single sessions, go into
collapsible sidebar groups. Auto-stop, favorites, snooze and archive are open.

### M18: Remote & Web *(largest builds; deliberate "later")*

Expand Down
22 changes: 13 additions & 9 deletions docs/tmux-comparison.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,15 @@ prefix = "ctrl+a"

## Coverage at a glance

| | Count |
|---|---|
| Same key, same meaning | 27 |
| Close analogue on a different key | 12 |
| No Quil equivalent | 23 |
Counted per table row below, so a row such as `1`–`9` counts once.

| | Status | Rows |
|---|---|---|
| Same key, same meaning | `exact` | 15 |
| Close analogue | `analogue`, `approximate` | 11 |
| Reachable, no default key | `mouse only`, `no key` | 6 |
| Deliberately unbound | `by design` | 1 |
| No Quil equivalent | `absent` | 15 |

The tmux column throughout is the default prefix table for **tmux 3.x as shipped**. If you have a `.tmux.conf`, your bindings differ and this document says nothing about them.

Expand Down Expand Up @@ -96,15 +100,15 @@ The tmux column throughout is the default prefix table for **tmux 3.x as shipped
| `;` | last-pane | Pane history back (`Alt+Backspace`) | analogue |
| `C-←` / `M-←` | resize-pane by 1 / 5 cells | Drag the split border | mouse only |
| `q` | display-panes | — | absent |
| `{` / `}` | swap-pane -U / -D | — | absent |
| `{` / `}` | swap-pane -U / -D | `Alt`+drag a pane onto the middle of another | mouse only |
| `!` | break-pane | — | absent |
| `Space` | next-layout | — | absent |
| `M-1`–`M-5` | select-layout (preset layouts) | — | absent |
| `E` | select-layout -E (spread) | — | absent |
| `M-1`–`M-5` | select-layout (preset layouts) | Tab menu → Layout…, or `tab.layout_*` | no key |
| `E` | select-layout -E (spread) | Tab menu → Layout… → Even out, or `tab.layout_even` | no key |
| `C-o` / `M-o` | rotate-window | — | absent |
| `m` / `M` | mark / unmark pane | — | absent |

**The layout cluster is a concept gap, not a to-do.** tmux treats a window's panes as an arrangeable set with named layouts you cycle through. Quil uses a binary split tree that you shape directly, so there is nothing to cycle *to* — `Space`, `M-1`–`M-5`, `E`, `{`/`}` and the rotate keys have no meaning in that model.
**Layouts are applied, not cycled.** tmux treats a window's panes as an arrangeable set with named layouts you cycle through. Quil keeps a binary split tree that you shape directly, and the tab menu's *Layout…* rebuilds that tree in one of six shapes — Even out, Columns, Rows, Grid, Main + stack, Spiral. The six are keymap actions (`tab.layout_even` … `tab.layout_spiral`) that ship unbound and that the `tmux` preset does not bind, so `M-1`–`M-5` and `E` have an equivalent but no key until you give them one. There is still no layout to cycle *to* (`Space`) and no rotate. Swapping two panes is a mouse gesture: hold `Alt` and drag one onto the middle of the other. `break-pane` has no equivalent — *Move to tab…* on the pane menu moves a pane into an existing tab, not a new one.

## Copy mode and buffers

Expand Down
4 changes: 2 additions & 2 deletions site/src/data/competitors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ export const competitors: Record<CompetitorInfo["slug"], CompetitorInfo> = {
keyGap:
"Zero persistence across host reboots. You can bolt on tmux-resurrect or tmux-continuum, but even those only restore layout and working directories — not AI session state, not running processes, not scrollback.",
migrationNote:
"Coming from tmux? Quil uses familiar keybindings (Ctrl+T new tab, Alt+H / Alt+V to split). Everything's remappable in ~/.quil/config.toml so you can reuse your tmux muscle memory verbatim.",
"Coming from tmux? Put `preset = \"tmux\"` in ~/.quil/bindings.toml for a Ctrl+B prefix keymap (Ctrl+B c for a new tab, Ctrl+B % to split). Any action can be rebound there too, including the six tab layouts that ship unbound.",
faq: [
{
question: "Can I run Quil and tmux side by side?",
Expand Down Expand Up @@ -531,7 +531,7 @@ export const competitors: Record<CompetitorInfo["slug"], CompetitorInfo> = {
{ feature: "Breadth of agents supported", quil: "partial", them: "yes", note: "Quil: 3 deep (Claude Code, OpenCode, Codex) + tools. AoE: ~13 terminal + 7 ACP." },
{ feature: "Session fork / import from disk", quil: "no", them: "yes" },
{ feature: "Sound + push notifications", quil: "partial", them: "yes", note: "Quil raises real Windows toasts when an agent parks on a prompt or finishes a turn, and clicking one routes you to the pane that sent it. Still missing: sound, macOS/Linux, and anything that reaches a phone — AoE's Web Push does, which is the point of its browser surface." },
{ feature: "Session lifecycle mgmt (auto-stop idle, groups, archive)", quil: "no", them: "yes" },
{ feature: "Session lifecycle mgmt (auto-stop idle, groups, archive)", quil: "partial", them: "yes", note: "Quil groups projects, not single sessions: named sidebar groups that collapse to one row and still show their agents' state. It has no auto-stop for idle sessions and no archive." },
],
faq: [
{
Expand Down
Loading
Loading