How I manage chat threads in my Obsidian notes
I delegate a lot to chat, but I do not want chat to become the place where the work lives.
For me, the outcome note owns the work. The chat thread is where I delegate work. And I want that work to be attached to the note that owns the work.
Smart Chat codeblocks make this simple by saving provider thread URLs and whether the thread is "active" or "done" right inside the note.
What I am trying to avoid
I do not want useful work disappearing in browser tabs.
I do not want to search history to find what I delegated.
I do not want raw AI responses mixed into my trusted notes.
I do not want any AI app to become the system of record for my work.
What I do instead
I keep the chat thread attached to the note that owns the outcome.
The rule I use
A chat thread belongs in the note when it contains delegated work for the outcome owned by that note.
The exact workflow
Smart Chat codeblocks to manage chat threads from inside the note.
Dataview (optional) for dynamic lists of notes with active chat threads.
Readiness check
- Smart Chat is installed and enabled.
1. Open the note that should own the chat thread
My workflow mostly revolves around outcome notes, so it's easy to determine which note should own the chat thread.
I usually start from the outcome note, based on which desired outcome is highest priority. Then I use the content of the outcome note to determine what should be delegated next.
Once I decide what the next action is, I delegate the work directly from the note.
2. Insert the Smart Chat codeblock
This part only has to be done once. All chat threads that are started from the note will be saved inside this codeblock.
Add the codeblock for the provider you want to use.
For ChatGPT:
## Delegated work
```smart-chatgpt
```
Available provider codeblocks:
| Provider | Codeblock |
|---|---|
| ChatGPT | smart-chatgpt |
| Claude | smart-claude |
| Gemini | smart-gemini |
| Grok | smart-grok |
| Perplexity | smart-perplexity |
| DeepSeek | smart-deepseek |
| AI Studio | smart-aistudio |
| Open WebUI | smart-openwebui |
| Kimi | smart-kimi |
A new thread starts unsaved.

Once the chat starts, the provider creates a link for the thread, then Smart Chat automatically saves the link into the codeblock.

3. Add a "Waiting for" section
If I delegate work and move on before reviewing the results, I move the next action that was delegated into a "waiting for" section.
## Waiting for
The waiting for section has a few important benefits:
- It helps me pick up from where I left off, making the review process easier to start
- It makes it easier to delegate multiple next actions and keep track of what was delegated without having to scroll through the chat threads themselves
- It enables use of advanced dynamic views that can prioritize a note based on the number of tasks in the "waiting for" section
4. Review and track progress
After reviewing the work I delegated to the chat thread, I mark a thread "done". If I need to go back to the thread, it is still available in the dropdown menu and can be changed back to "active" if necessary.

5. Track chat threads with Dataview
Because the Smart Chat codeblock saves the threads using inline variables, chat-active:: and chat-done::, Dataview can use the saved threads to produce dynamic views.
I use a simple dataview query to list recent notes with active chat threads.
```dataview
LIST WITHOUT ID file.link
WHERE chat-active
SORT file.mtime DESC
```
The query can be modified to see "done" threads like this:
```dataview
LIST WITHOUT ID file.link
WHERE chat-done
SORT file.mtime DESC
```
Dataview JS can also be used for more advanced queries.
Click to see the Dataview JS for showing totals
````md ```dataviewjs function count_field_value_instances(value) { if (value === null || value === undefined) return 0; return Array.isArray(value) ? value.length : 1; }const pages = dv.pages()
.where(p => p["chat-active"] || p["chat-done"])
.array();
const totals = pages.reduce((acc, page) => {
acc.active_total += count_field_value_instances(page["chat-active"]);
acc.done_total += count_field_value_instances(page["chat-done"]);
return acc;
}, { active_total: 0, done_total: 0 });
dv.paragraph(**Total chat-active instances:** ${totals.active_total});
dv.paragraph(**Total chat-done instances:** ${totals.done_total});
dv.paragraph(**Total tracked threads:** ${totals.active_total + totals.done_total});

I even used this dataview compatibility to generate a nice graph comparing my chat vs cloud-codex usage since I handle threads from both platforms this way.
Common mistakes
Tracking every chat thread
Not every chat deserves management.
I track threads when losing them would create rework. I don't worry about tracking threads when I'm looking for a quick answer.
Unable to sign-in to chat via the codeblock
Enable the Obsidian "Web viewer" core plugin and sign-in using the built-in Obsidian browser. When you re-open the note with the chat codeblock then you should already be signed-in.
For more details, see the Smart Chat FAQs.
Related
| When I need to... | I use... |
|---|---|
| Create the note that owns the outcome | How I use outcome notes to go from idea to outcome in Obsidian |
| Build or attach the context package | How I build context in my Obsidian notes |
| Copy the note and context as an AI assignment | How I use my notes as assignments for delegating work to AI in Obsidian |
| Find useful notes before delegating | How I link notes without spending time organizing or searching in Obsidian |
| Separate trusted notes from raw AI output | How I maintain trust while leveraging AI in my notes |
| Read the Smart Chat codeblock docs | Smart Chat codeblocks |