Skip to content

Official Smart Plugins site

Smart Plugins are independent third-party plugins for Obsidian. Smart Connections is the flagship plugin.

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

Tools used in this 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

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:

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