Start

First run in VS Code

Where the panel lives, what a launch with nothing configured asks you, and how approvals and commands work inside it.

The panel opens from five places

DoorWhat it is
Activity barThe Shoal container, the Shoal mark in the bar. It holds one docked view, and the view drags to either side bar or into the bottom panel.
Editor titleThe Shoal button at the right of the editor title bar.
KeyboardCtrl+Alt+S, and Cmd+Alt+S on macOS.
Command paletteShoal: Open and Shoal: Ask About Selection.
Status barThe Shoal anchor at the right end, one click.

Every door but the docked view and Shoal: Ask About Selection opens another Shoal rather than revealing the one already on screen. Each editor tab carries its own engine and its own session, so two tabs are two conversations. The docked view is a single slot, because a view container holds one view. Both frames run the same client over the same seam, and only the frame differs, since VS Code will not put an editor in a side bar or a view in the editor area.

The panel hosts the same client as the desktop window

Opening a Shoal spawns shoal proto as a child process, with your first workspace folder as its working directory, and renders the event stream in a webview. That webview is the shared web client, the one shoal desktop opens in its own window, driving the same engine over the same protocol. The transcript, the tool cards, the streamed answer, the approvals, the mooring form: all of it belongs to the engine, and the extension is the pipe.

The engine narrates its own startup on stderr, and the panel prints those lines as status. A model can take real time to load, and silence reads as broken.

The mooring form opens when nothing is configured

A launch that resolves no model from a flag, from the project config, or from the user-wide config starts anyway. The engine comes up unmoored: the session is real and the seam works, and the provider refuses every model call by name until something is tied up.

After the boot animation the mooring form opens itself with a first-run frame, headed Moor a model. Pick the dock and the model this machine already has, or point at a server elsewhere. Save writes the record. Save and moor writes it and ties it up immediately, which swaps a working provider into the session you are already sitting in. A local or remote record you saved becomes the default every later launch runs on, and /moor changes it. An anthropic record does not: launching straight onto an offshore mooring is not built, so a session with only that record comes up unmoored again and /moor ties it up.

Approvals arrive with a diff

A tool call that needs permission raises the approval above the composer, beside the controls rather than in the transcript, because it is something being asked of you now instead of something that happened. It names the tool, describes the call, and for edit, write, and patch it carries the change as a diff the engine computed. A control on the question line swaps that diff between one column and side by side.

Three buttons answer it. approve allows this call. always allows that tool for the rest of the session. deny refuses it, and the call ends denied.

A slash in an empty composer opens the command menu

Type / into the composer and the command menu opens above it, grouped by command type and three columns wide: the command, what it does, and its keyboard shortcut where it has one. Most rows leave that last column empty, which is the honest answer. Every keystroke after the slash narrows the list, and text that stops looking like a lone command word closes it again.

Ask About Selection prefills the composer

Select code in an editor, right-click, and choose Shoal: Ask About Selection. It goes to the Shoal you were last working in, brings it to the front, and prefills the composer with the file path, the line range, and the selected text in a fence. Nothing is sent yet, so you finish the question and press Enter. With no Shoal open anywhere, it opens one first.