Reorder tabs by dragging, and pop the browser view into its own window
Build App / compute-version (pull_request) Successful in 3s
Build App / build-macos (pull_request) Successful in 2m31s
Build App / build-linux (pull_request) Successful in 5m35s
Build App / build-windows (pull_request) Successful in 6m9s
Build App / create-tag (pull_request) Skipped
Build App / sync-to-github (pull_request) Skipped
Build App / compute-version (pull_request) Successful in 3s
Build App / build-macos (pull_request) Successful in 2m31s
Build App / build-linux (pull_request) Successful in 5m35s
Build App / build-windows (pull_request) Successful in 6m9s
Build App / create-tag (pull_request) Skipped
Build App / sync-to-github (pull_request) Skipped
Two things the UI couldn't do: rearrange the tab strip, and watch the browser while working somewhere else. **Drag to reorder.** `moveTab`/`moveActiveTab` on the store, HTML5 drag on the strip with a marker showing where the drop lands, `Ctrl+Shift+←/→` for the same thing without a mouse. Reordering deliberately does not select what it moves, so a drag aimed at a background tab doesn't yank the main area away from a terminal mid-run. A tab being renamed is not draggable — a draggable ancestor swallows the mouse-drag that selects text in its input. **Pop the browser view out.** `browser_view/popout.rs` opens the view's existing token-bearing loopback URL as a second OS window, with a "Keep on top" toggle so it can float above the app. Window-only: the viewer, the proxy and the container are untouched, so popping out and back interrupts nothing. Three things it rests on: - No capability lists that window, so it has no IPC surface — right for a page served out of a container, and it must stay that way. - The app CSP is irrelevant to it: `frame-src` constrains what the app's document may *embed*, and this is a top-level document. The port range and the token gate are what actually protect it, unchanged. - The window is owned by the session, so the supervisor's teardown closes it. A window onto a viewer that no longer exists is worse than none. The pane drops its iframe while popped out — two viewers can both *drive* the browser, and two cursors on one page is not a feature. `lib.rs`'s `on_window_event` is now guarded on `label() == "main"`. It fires for every window and its body stops every container and exits, so without the guard closing a pop-out would quit the app. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+39
-1
@@ -191,6 +191,11 @@ Anthropic-backend project uses that token without its own login. See
|
||||
terminal tab to rename it, jump to its project home, or close it; double-click to rename inline.
|
||||
There is no separate terminal tab bar and no "+" button — tabs appear when you open a project or
|
||||
a terminal.
|
||||
|
||||
**Drag a tab to reorder it.** A line shows where it will land, and dropping it does not change
|
||||
which tab you are looking at — so you can rearrange the strip without pulling focus away from a
|
||||
terminal that is mid-run. `Ctrl+Shift+←` and `Ctrl+Shift+→` move the *active* tab the same way
|
||||
without the mouse. The order is per-session: it is not saved when you quit.
|
||||
- **Status indicators (top right)** — Docker connection and container image availability. Each pairs
|
||||
a coloured dot with a word, so status is never conveyed by colour alone. The **?** button opens
|
||||
the built-in help.
|
||||
@@ -211,7 +216,7 @@ for selecting a project and for two quick controls that appear on hover — star
|
||||
Claude terminal. Everything else about a project lives in Project Home.
|
||||
|
||||
The header shows the project name, its status, how long the container has been up, and the action
|
||||
buttons. Below that are five tabs:
|
||||
buttons. Below that are six tabs:
|
||||
|
||||
| Tab | What it's for |
|
||||
|---|---|
|
||||
@@ -220,6 +225,7 @@ buttons. Below that are five tabs:
|
||||
| **Automation** | The scheduled tasks running inside this container — see [Automation & Scheduled Tasks](#automation--scheduled-tasks) |
|
||||
| **Config** | All per-project configuration — see [Project Configuration](#project-configuration) |
|
||||
| **Files** | Browse, download and upload files inside the container |
|
||||
| **Browser** | Watch — and take over — the browser Claude is driving with Playwright, see [The Browser Tab](#the-browser-tab) |
|
||||
|
||||
### Sessions
|
||||
|
||||
@@ -257,6 +263,37 @@ included, and each tile opens a list of what it found.
|
||||
|
||||
The counts are only available while the container is running.
|
||||
|
||||
### The Browser Tab
|
||||
|
||||
When Claude drives a browser with Playwright inside the container, the **Browser** tab shows you
|
||||
that browser live — and lets you take it over with your own mouse and keyboard.
|
||||
|
||||
It is **off by default and opted into per project**, and it never installs anything on its own.
|
||||
Opening the tab only *probes* the container, so it can tell you what is missing before you ask for
|
||||
a view; installing Playwright and downloading a browser are separate, labelled buttons that state
|
||||
what they cost before you press them. See
|
||||
[What's Inside the Container](#whats-inside-the-container) for why the browser itself is not
|
||||
pre-installed.
|
||||
|
||||
Press **Start browser view** and the pane fills with Playwright's own dashboard, running inside the
|
||||
container and reached over a token-gated listener on your machine's loopback address. Nothing is
|
||||
exposed off the machine.
|
||||
|
||||
#### Watching it while you work
|
||||
|
||||
Press **Open in own window** and the view moves out of the tab into a window of its own — put it on
|
||||
a second monitor, or turn on **Keep on top** and let it float above the app while you work in a
|
||||
terminal. This is a window change only: the browser and the view keep running throughout, so
|
||||
popping out and back costs nothing and interrupts nothing.
|
||||
|
||||
While the view is in its own window the tab shows a placeholder rather than a second copy of it —
|
||||
two viewers would both be able to *drive* the browser, and two cursors on one page is not useful.
|
||||
**Put back in tab**, or just closing the window, brings it back.
|
||||
|
||||
The window belongs to the view, not to the tab: closing the project's home tab leaves it open, and
|
||||
stopping the view — by pressing **Stop**, stopping the container, or removing the project — closes
|
||||
it, because a window showing a viewer that no longer exists is worse than no window.
|
||||
|
||||
---
|
||||
|
||||
## Project Management
|
||||
@@ -1119,6 +1156,7 @@ triple-c-scheduler add --name "test" --schedule "0 */6 * * *" --prompt "Run test
|
||||
| **Ctrl+Tab** | Switch to the next tab |
|
||||
| **Ctrl+Shift+Tab** | Switch to the previous tab |
|
||||
| **Ctrl+1** … **Ctrl+9** | Jump to the first through ninth tab |
|
||||
| **Ctrl+Shift+←** / **Ctrl+Shift+→** | Move the active tab one place along the strip (the mouse equivalent is dragging it) |
|
||||
|
||||
> **Why Ctrl+Shift+W and not Ctrl+W?** `Ctrl+W` is readline's `kill-word` — it deletes the word
|
||||
> before the cursor, and it is used constantly in the terminal this app is built around. Binding it
|
||||
|
||||
Reference in New Issue
Block a user