Using Shelley
Tools
What the agent can do (shell, file edits, a headless browser, subagents, other models, inline HTML) and how to turn each tool on or off.
Tools are what the model calls to act: run commands, edit files, drive a browser. Each conversation gets its own set. The header at the top of a conversation (something like “System Prompt: 8 tools, 11 skills”) expands to show exactly what it has.
At a glance
| Tool | Default | For |
|---|---|---|
bash |
on | Running shell commands, with automatic backgrounding |
patch |
on | Exact text edits to files |
change_dir |
on | Moving the conversation’s working directory |
output_iframe |
on | Showing HTML, charts, and diagrams inline |
subagent |
on | Delegating work to other conversations |
llm_one_shot |
on | A single prompt to a model, no tools or history |
browser |
on | Driving a headless Chrome |
read_image |
on | Showing the model an image file |
compact_in_place |
off | Letting the agent compact its own context (“Auto compaction”) |
message_user |
off | Chat-style replies; by default you see only those |
message_parent |
automatic | How a subagent reports back to its parent |
web_search |
automatic | Provider-side web search |
Some tools depend on the model or the conversation:
subagentexists only in top-level conversations; subagents can’t spawn their own.message_parentis given to subagents and nothing else.message_useris offered only in top-level conversations.read_imageis dropped for models that don’t accept images.web_searchruns on the provider’s side and is added only for genuine Anthropic Claude models and OpenAI models on the Responses API.- With OpenAI models that support it,
patchis replaced byapply_patch, which takes Codex’s patch format.
Turning tools on and off
Open the model picker, then Tools → Edit…. Each tool can be Default,
On, or Off; Apply to this conversation records the change in the
transcript (it waits until the agent isn’t working). To reuse a set of choices, save
it in a profile from the same picker; new conversations start from the
default profile. There is no command-line flag or shelley.json setting for
tools. Over the API,
a new conversation takes tool_overrides ({"browser": "off"}) and
disable_all_tools.
bash
Each call runs bash --login -c in the conversation’s working directory with
no stdin. Nothing carries over between calls: a cd inside a command does
not move the conversation (that’s change_dir’s job).
- Backgrounding. A command still running after 60 seconds moves to the
background, and the model can start one there directly. Output goes to
$TMPDIR/shelley-jobs/<id>.log. When the job exits, its conversation gets a message with the exit code and the log’s tail, which starts a new turn if the agent is idle. Jobs keep running across a Shelley restart and are still reported. Kill one from the UI or withkill -- -<PGID>. - Stop kills a foreground command’s whole process group.
- Big output (over 50 KB) is written to a temp file; the model gets its path and the first and last few lines.
- No interactive programs.
EDITORis/bin/falseand interactive rebases are refused. Long-running servers belong intmux, which the tool description tells the model. - Environment. Commands see
SHELLEY_CONVERSATION_ID,SHELLEY_CONVERSATION_SLUG,SHELLEY_MODEL,SHELLEY_CWD,SHELLEY_GIT_ROOT,SHELLEY_PORT,SHELLEY_URL,SHELLEY_SOCKET, andSHELLEY_USER_EMAILwhere they apply, plusSKETCH=1. - Guardrails, not security.
git add -A/./--all/*andrm -rfon things like.git,~, or/are refused with a message asking for explicit paths. This catches mistakes; it does not contain anything. See Running it safely. - Commit trailer.
git commitgetsCo-authored-by: Shelley <shelley@exe.dev>appended. To turn that off:git config --global shelley.no-trailer true. - Missing commands. When a command isn’t installed, Shelley asks a model
whether it’s a well-known package and, if so, tries to install it with the
system package manager (
sudo apt install -y …,brew install …, and so on). This is always on. Where the package manager needssudoandsudoneeds a password, the install fails quietly.
patch
Edits one file per call: replace (the old text must appear exactly once),
append_eof, prepend_bof, or overwrite (which also creates files). Every
successful edit renders as a diff in the transcript. Files changed through
bash don’t get an inline diff; they show up in the
diff viewer.
change_dir
Sets the working directory for later tool calls. The directory must exist; relative paths resolve from the current one. The change is saved with the conversation, shown in the status line, and the result tells the model whether it’s now in a git repository.
output_iframe
Renders an HTML file from disk in the transcript, in an iframe sandboxed with
allow-scripts allow-downloads (no same-origin access). Scripts, styles, and
CDN resources work. Small local files (JSON, CSV, CSS, JS) can be bundled
along with it, and excalidraw is available as a hosted library, which the
built-in excalidraw skill uses for diagrams. The HTML is stored in the
conversation, so keep it small.
browser
One tool with an action field: navigate, eval, resize, screenshot,
console_logs, plus families for device emulation, network logs,
accessibility queries, profiling, and screencasts. Screenshots are shown to
both you and the model.
- Finding Chrome. Shelley runs Chrome headless through
chromedp. On Linux it looks on
PATHforheadless_shell,headless-shell,chromium,chromium-browser,google-chrome(and its-stable,-beta,-unstablevariants), orchrome, and also checks/usr/local/bin/chromeand/snap/bin/chromium. On macOS it checks only/Applications/Chromium.appand/Applications/Google Chrome.app. There is no setting to point it elsewhere. If nothing is found, the tool fails with “please apt install chromium or equivalent”. - Lifecycle. Each conversation gets its own browser, started on first use
with a 1280×720 viewport and Chrome’s sandbox off (
--no-sandbox). It shuts down after 30 idle minutes. - Timeouts. Actions default to 15 seconds; the model can pass a longer
timeout. - Screencasts record an MP4 and need
ffmpeg. They stop on their own after 30 minutes or 10,000 frames. - Files. Screenshots land in
/tmp/shelley-screenshots, recordings in/tmp/shelley-screencasts, downloads in/tmp/shelley-downloads.
read_image
Reads an image file and sends it to the model, converting HEIC and shrinking anything over the model’s size limits. Relative paths resolve against the directory Shelley was started in, not the conversation’s, so the model should use absolute paths. You can comment on the image afterwards; see Conversations.
subagent
Starts a new conversation (identified by a slug) with a prompt, or sends a
further message to an existing one by reusing its slug. The call returns
immediately; the subagent works in the background and reports with
message_parent, which wakes the parent. A new subagent starts in the
parent’s current directory, with the parent’s model and reasoning level
unless the model picks others, and it does not see the parent’s
conversation. Subagents show up nested under the parent in the conversation
list. Stopping the parent stops its working subagents.
llm_one_shot
Sends one prompt to a model and returns the answer: no history, no tools.
The prompt is read from files, and images among them are attached. By default
it uses the conversation’s model; the tool lists the others, and the model is
told to switch only when you ask (“get a second opinion from …”). Answers
over 4,000 bytes are written to an llm-result-*.txt file in the
working directory instead of being returned inline.
compact_in_place and message_user
compact_in_place is the Auto compaction switch in the Tools dialog. The
agent lists its older context, then collapses ranges into short notes and
trims old tool output; it is nudged to do so once the context passes a
threshold (250k tokens by default, adjustable in the same dialog) and again
every 50k tokens after that. The original messages stay in the database.
message_user makes a conversation chat-style: you see your own messages and
what the agent sends with this tool, which can reply to or react to a
specific message of yours and attach files. The rest of its work is hidden
by default; the overflow menu’s Brevity switch (See All) shows it.
Beyond the built-ins
More capabilities come from skills, which the agent reads on
demand, and MCP servers, which it reaches through the
shelley mcp command rather than as separate tools.