1# Working with threads
2
3Use a new thread for a separate task. Choose **New worktree** when its code changes
4need a separate branch and working directory.
5
6## Start a thread
7
8On web and desktop, a new thread keeps the current project and carries your model
9and mode selections, unless the destination project has its own model default.
10Its branch and workspace mode come from your configured defaults. To continue in
11an existing worktree, use **New thread in this worktree** from the branch toolbar.
12
13When you change a new thread's project, T3 Code stays in the current environment
14if that project exists there. Otherwise it selects an environment that has it.
15
16### Start without a project
17
18A thread does not need a project. To start one without a project, click **or
19start without a project** under a new thread's heading, pick **No project** from
20the project menu in that heading or from **New thread in...** in the command
21palette, or press `mod+alt+n`. On mobile, pick **No project** from the project
22list. It starts on your current machine; before sending, pick another machine
23from the machine menu to move it there. To move a draft into a project, pick the
24project in the heading.
25
26Each thread without a project works in its own folder under `~/.t3/scratch` (the
27`scratch` folder of your T3 data directory), named after its date, the first words
28of its first message, and a short id, like
29`2026-09-25-convert-these-pngs-to-webp-a1b2c3d4`. Deleting a thread keeps its
30folder, so the files the agent wrote stay until you delete them. Branch, worktree, and diff controls stay hidden because
31these folders are not Git repositories. This is unavailable when the data
32directory itself sits inside a Git checkout.
33
34### Start in the background
35
36In a desktop browser or the desktop app, press `Cmd+Enter` on macOS or `Ctrl+Enter`
37on Windows and Linux to start a new thread and immediately open another draft. The
38next draft keeps the workspace mode and base branch you selected. With **New
39worktree**, each background submission creates its own worktree.
40
41To send the same prompt to several models on web or desktop, **Shift-click** models
42in a new thread's model picker to add or remove them. A regular click returns to a
43single model. Choose a base branch and send. Each selection starts a separate thread
44and worktree while you stay in the new thread composer. This requires a Git project.
45
46## Pin and reorder threads
47
48Pin a thread from its menu to keep it above your active work.
49
50On web and desktop, unpinning, settling, snoozing, and archiving a thread each show
51a notification with **Undo** for five seconds. Undo restores the thread's previous
52state, including its pinned position, and reopens an archived thread you were
53viewing. Discarding an unsent draft from the sidebar works the same way: Undo brings
54back its text and attachments. `mod+z` triggers the most recent Undo when no text field is focused; see
55[Keybindings](./keybindings.md#commands-with-special-behavior).
56
57On web and desktop, you can also drag files from your computer onto any thread row:
58the thread opens and the files are attached in its composer, ready for
59your next message. The same per-message file limits apply as when attaching
60files directly; see [Attach files](./composer.md#attach-files).
61
62On web and desktop, pinning or unpinning a thread keeps the sidebar at your current
63scroll position instead of following the thread to its new place in the list.
64
65Pinning does not prevent automatic settlement. Settling a thread removes its pin.
66
67On web and desktop, drag a thread between sections to change its state. Drag a thread up into
68the pinned section to pin it at the spot you drop it; drag a pinned thread down into the active
69list to unpin it. Dragging a thread onto the **Settled** header settles it, and dragging a settled
70thread into the active list un-settles it. A snoozed thread can be dragged out of the snoozed
71shelf, which wakes it, but threads cannot be dragged into the shelf because snoozing needs a wake
72time. Dragging a pinned thread out of the pinned section does not ask for unpin confirmation.
73Pinned and active boundary labels appear only while dragging, without moving the rows. The
74other rows slide aside to show where the thread will land. When you cross into another section,
75the dragged thread shows the action the drop performs, with its icon: **Pin**, **Unpin**,
76**Settle**, **Un-settle**, or **Wake**. Its status and hover actions hide during the drag. A pinned
77thread keeps its pin only while it stays in the pinned section; once it leaves, the badge takes
78over. Reordering within the same section shows no badge. When there are no pins, drag to the top
79edge to pin a thread. Section labels stay readable for the whole drag, and the section the
80thread is over takes the accent color. Section labels also
81identify empty sections and a collapsed settled shelf.
82
83Drag within the pinned or active section to change its order. Other rows slide aside to show the
84spot where the thread will land. Drops into either section keep the position you choose. On
85mobile, open a thread's menu and choose **Arrange threads**. Drag a handle within or between
86**Pinned** and **Active** to reorder, pin, or unpin. Drop onto the **Settled** divider to
87settle a thread. The dragged card shows the action before you release it. Expand **Snoozed**
88or **Settled** to drag a parked thread back into either live section. Each drop saves; **Done** returns to the thread list.
89**Move up** and **Move down** are also available in the thread menu. The server
90saves the order, so it survives a refresh and appears on your other connected devices.
91
92On web and desktop, the list also animates section changes made with thread actions such as
93**Pin**, **Settle**, and **Snooze**. These transitions respect your system's reduced-motion
94preference. While dragging, rows follow the insertion gap without replaying a second transition
95after the drop.
96
97New threads appear above the active threads you have arranged. Settling clears a thread's active
98position, so using **Un-settle** returns it to the top. Pinning and snoozing preserve its active
99position until you move it again. Thread activity does not change the order. The settled shelf
100continues to use settlement time.
101
102If dragging is unavailable for one environment, update the T3 Code server running in that
103environment. Pinned and active reordering require server support. Threads from older servers keep
104their default order until the server is updated.
105
106To generate a fresh title from the conversation, open a thread's menu and choose
107**Regenerate title**. The action is unavailable while title generation is in progress
108or when the connected environment needs a server update.
109
110Agents connected through T3 Code can use the same server-owned metadata workflow to
111rename a thread, regenerate its title, or link and unlink a pull request. These changes
112appear on web, desktop, and mobile without requiring the originating browser to remain
113open.
114
115### Fold working threads (beta)
116
117Turn on **Settings → General → Working section (beta)** on web and desktop, or **Settings →
118Thread behavior → Working section** on iOS and Android, to move threads that are working or
119monitoring into a collapsed **Working** section below the active list. A thread returns to the top
120of the active list when it finishes, fails, or needs an approval or answer. The Working section
121lists the thread you last sent work to first. Pinned threads stay in the pinned section. Each
122device keeps its own choice.
123
124While this is on, the active list is ordered by when each thread last came back to you, so you
125cannot drag or move threads within it. Your saved order returns when you turn it off.
126
127## Settle finished work
128
129Choose **Settle thread** from its menu to move finished work out of the active list
130without deleting the conversation. **Un-settle thread** restores it to active work
131and prevents automatic settlement until new activity resumes the usual rules.
132Manually settling an idle thread dismisses unanswered async questions without
133sending an answer or restarting the agent. Manual settlement closes all of the
134thread's terminals and browser tabs, including running commands and playing media.
135Running programs or open browser tabs ask for confirmation; empty chats and idle
136shells settle directly. Terminal output stays in the conversation. Undo or
137unsettling restores the chat, but cannot restart those commands or restore its tabs.
138Other chats keep their own terminals and tabs, including in a shared workspace.
139The workspace's detached dev server stops once no
140active chat or pending work needs it; shared workspaces keep their server while
141another chat is active.
142
143To reclaim disk space from settled work, turn on **Run in the thread's worktree when the
144thread settles** for one of the project's actions, or set `"runOnSettle": true` on a
145`t3.json` script, for example `cargo clean`. It runs each time a thread in its own
146worktree settles, manually or automatically. Threads in the project's main checkout skip it. Its terminal
147closes when the command succeeds and stays open when it fails.
148
149Settled threads archive on Saturday at 9:00 AM in the server's local time. If the
150server was offline, it catches up when it starts. Threads with running work or
151pending requests wait until that work finishes.
152
153On web and desktop, right-click **Settled** and choose **Archive all** to archive
154the settled chats in the current project filter, including hidden chats. To archive
155a selection, choose **Archive** from its context menu. Undo restores each archived
156group together. Chats that resume work during Archive all stay available.
157
158Workspaces for my work stay available while their chats are settled; settlement
159does not run a cleanup script there. A settled work chat archives once all its
160linked pull requests merge, including when you settle it after the merge.
161Workspace cleanup waits for archival and for other chats or external tools
162to release the folder. Mergebot supplies live PR and check updates. A new CI failure returns the chat to Active and adds a
163Mergebot link to the transcript without starting an agent. Settling it again
164acknowledges that failure; a failed rerun can wake it again.
165
166On web and desktop, press a thread's **Settle** button and drag up or down to
167settle every thread in that section between it and the one you release on.
168The **Un-settle** and **Wake** buttons work the same way in their sections.
169Press `Escape` while dragging to cancel.
170
171By default, environments settle inactive threads after three days and settle
172threads whose pull request merged. A closed pull request can also settle an idle
173thread. Work in progress, pending questions or approvals, live background work,
174and open terminals or browser tabs prevent automatic settlement. An open pull
175request does not prevent inactivity settlement unless you turn on **Keep threads
176with a PR** in **Settings → General**, but an old closed or merged pull request
177does not settle work you
178resumed after it closed. Only your own messages count as resuming. A turn that
179finished background work or a pull request watch starts on its own does not.
180Disconnected or unverified Mergebot data cannot trigger merge archival, PR-based
181settlement, or a CI wakeup. Scheduled archival and inactivity rules still apply.
182
183To keep one thread out of the settled shelf no matter how long it sits idle, open its menu,
184choose **Auto-settle behavior**, and pick **Disabled**. The current option is checked. Pick
185**Enabled** to return to the usual rules. Manual settle, snooze, and archive still work while it
186is disabled.
187
188Change these rules in **Settings → General** on web and desktop, or **Settings → Thread behavior** on mobile.
189They continue to run when your apps are closed. On web and desktop, choose an environment at the
190top to change only its rules, or **All environments** to update connected environments together.
191Mixed values show where the selected environments disagree. Mobile applies these
192rules to connected environments that support shared settings. Offline environments
193and older servers keep their previous values. Changing a rule does not reopen
194already settled threads.
195
196## Link a pull request
197
198The server finds the PR for each unsettled thread's saved branch, even when your
199apps are closed. Settled threads keep their saved links. Update the server if
200automatic branch links do not appear.
201
202On web and desktop, right-click a pull request link in a thread and choose
203**Link to thread** to select a different PR. Use **Unlink from thread** on the
204same link to return to the branch PR, if one exists.
205The linked pull request participates in automatic settlement.
206
207## Find and reference work
208
209On web and desktop, open the command palette with `Cmd/Ctrl+K` to search threads
210across connected environments. Message search starts after two characters and
211includes your messages and final agent responses.
212
213Use **Settings → Keybindings** to find or customize shortcuts for searching files
214and copying a thread reference. A copied reference uses the thread's pull request
215link when available, otherwise its thread ID. See [keybindings](./keybindings.md)
216for custom configuration.
217
218## Inspect agent work
219
220**Limited** means the provider stopped on a usage or rate limit. The conversation
221keeps the provider's explanation. Retry after the limit resets, or switch to
222another provider instance.
223On web and desktop, press **Resume** in an empty composer to continue a limited
224or interrupted turn manually.
225Queued messages stay saved while the limit blocks the thread. They run after
226the continuation finishes. If the queue was held by a restart, resume it then.
227
228When the provider reports a reset time, choose **Resume at reset** to schedule a
229continuation. You can cancel it from the thread. Enable **Auto-resume limited
230threads** in **Settings → General** on web and desktop, or **Settings → Thread
231behavior** on mobile, to schedule limit stops by default.
232The environment must be running when the reset arrives; it resumes overdue
233continuations after a restart. Sending a new message, archiving, or settling the
234thread prevents a pending continuation from starting.
235
236Choose **Snooze until reset** to hide the thread until its allowance returns.
237Snooze and auto-resume are independent: snooze alone wakes the thread without
238sending a message; enabling both wakes and continues it. **Wake now** cancels
239the snooze. Enable **Snooze limited threads** in thread behavior settings to
240snooze limit stops by default. Providers without a reset time offer manual
241retry and the normal snooze choices.
242
243On web and desktop, use **Agents** to follow work delegated to subagents.
244Stop on a thread also stops the subagents it delegated to.
245
246Subagent threads started by the agent can't take messages; message the parent
247thread instead. When such a subagent needs an approval or an answer, the parent
248thread asks for it.
249
250Expand a tool call in the conversation to see its full command and output.
251Summaries shorten shell wrappers and can still describe the latest call after it
252finishes; the call's own result shows its status.
253
254## Snooze until later
255
256Choose **Snooze → Custom…** from a thread's menu to pick a date and time in your
257local time zone, or a duration in minutes, hours, or days. Durations start when
258you confirm; one day means 24 hours. On web and desktop, you can also snooze
259several selected threads together. Choose **Wake thread** to bring a thread back early.