← All posts

Save Claude conversations to Obsidian automatically


Copying a Claude chat into Obsidian works fine once. You paste it, fix the formatting and file it. By the tenth chat most people have stopped, and the ones worth keeping stay in Claude’s sidebar. A post on r/ObsidianMD put it plainly: “Right now the only way I know how to do that is downloading each chat one by one, or copying and pasting, and that is not sustainable long term.”

Long chats add a second problem. With code execution on, Claude summarizes earlier messages when a chat nears its context limit. Anthropic says the full history is kept, but one r/ObsidianMD post describes what people run into anyway: long chats get “compacted” and “lose details. Decisions, file names, where we left off.” Copying by hand doesn’t rescue a long chat either: one user found that select-all in the desktop app only grabbed about two pages.

Two different things

A lot of “Claude Obsidian” searches are about the other direction: letting Claude read and write your notes. That’s done with an MCP server, for example Claude Desktop with the filesystem server pointed at your vault. We cover that side in making your vault work with AI. This post is about saving the chats themselves as notes.

Four ways to get Claude chats into Obsidian

Method What it takes Updates when the chat continues? Good for
Copy and paste Every chat, by hand No One answer you need right now
Obsidian Web Clipper A click per chat, with the chat open No, you clip it again The odd chat, using Obsidian’s own free extension
Claude’s export + an importer plugin Request the export, wait for the email, import Only when you export again Pulling in your history once
A tool that saves on its own, like Carry Set up once Yes Keeping every chat without thinking about it

Claude’s export lives in Settings → Privacy → Export data. The download link arrives by email and expires 24 hours after delivery, and the help page doesn’t mention projects or uploaded files. Nexus AI Chat Importer is a community plugin that turns chat exports, Claude’s included, into notes. Re-import a newer export and it appends only the new messages.

You may also see setups built on the Local REST API plugin. It runs inside Obsidian behind an API key and its own HTTPS certificate, so there’s setup on both ends and Obsidian has to be running when a chat is sent.

The same r/ObsidianMD post asked: “Is this ever going to be truly automatic, or is one click per chat just as good as it gets right now?” It can be automatic. That’s the last row. We make Carry, so read the rest with that in mind. Most of the advice below works whatever tool writes the notes.

How to organize Claude chats in your vault

Once chats arrive, the question changes from getting them in to what to do with them. The setup that holds up keeps two kinds of note apart:

Chat notes
The raw conversation, one file per chat, in a folder of their own. A tool writes them and you leave them alone. They’re the receipt.
Your notes
One note per project: where it stands, decisions and why, the next step. You write these, or ask Claude to draft them. They’re the memory.

Links between the two are what make it work. When you write down a decision, link the chat it came from:

## Decisions

- 2026-06-12: Move Atlas to Postgres before touching search, because the
  new index needs the new schema.
  [[2026-06-12-planning-the-atlas-migration|Planning the Atlas migration]]

You don’t type that filename. Type [[Planning and Obsidian suggests the chat by its title, because Carry puts the title in the note’s aliases. Pick it and Obsidian writes the link for you. Six months later, when nobody remembers why Postgres came first, the answer is one click away, in the words that were actually used.

Three searches help once the folder fills up, no plugin needed:

  • [project:Atlas] finds every saved chat from your Atlas project in Claude.
  • path:carry-backup "connection pool" searches only your chats. If you also save ChatGPT or Grok, they’re in the same folder, so one search covers all of them.
  • -path:carry-backup in the graph view’s search filter hides the transcripts from your graph.
Leave the chat notes alone

Carry rewrites a chat note when the chat continues in Claude. If you edit the note’s body, Carry stops updating it: your edit is safe, but new messages won’t arrive. Tags you add to its frontmatter are replaced on the next update (aliases you add are kept). Renaming is fine, but moving a chat note out of carry-backup/ makes Carry save the chat again. Highlights, tags and summaries belong in your own notes.

Do you even want raw Claude chats in your vault?

Plenty of Obsidian users say no. One reply to the post asking about automatic saving: “I don’t think that a full AI conversation should go into an Obsidian vault.” For them the conversation is the thinking, and the vault gets the conclusion. In the compaction thread, the best advice the poster had heard was “The chat is disposable, the vault is the memory.”

They’re right about what you read day to day. Nobody rereads an 80-message transcript, and the summary is what you’ll use. The case for keeping the chat anyway is that summaries drift. When Claude writes your project note, it’s summarizing its own work, and a dropped detail reads just as confidently as a correct one. The raw chat is how you check, and it does no harm in a folder you rarely open.

So keep both, with different jobs. Carry only handles the receipt. It doesn’t summarize chats or write project notes. That part is yours, or Claude’s if you ask it for one at the end of a session.

Save Claude projects to Obsidian

A project is more than its chats. The instructions you wrote and the files you added are often the part you’d miss most. Carry saves each project as a folder with an index note, instructions.md, a files/ folder and the project’s chats. Here’s a sample, written by Carry, with one chat outside any project:

Your folder7 files

2026-09-07-pomodoro-timer-page.md1 KB

A chat with an artifact

---
conversation_id: "3f6a9c2e-8b14-4d7a-9e05-6c1b2d4f8a13"
source: claude
type: conversation
title: "Pomodoro timer page"
aliases:
  - "Pomodoro timer page"
tags:
  - capture/claude
created: 2026-09-07T13:02:18
updated: "2026-09-07T13:09:44.617Z"
verified_list_token: "2026-09-07T13:09:44.617Z"
conversation_files_fetched: true
synced: 2026-09-07T13:30:05
url: "https://claude.ai/chat/3f6a9c2e-8b14-4d7a-9e05-6c1b2d4f8a13"
documents:
  - "Pomodoro timer"
message_count: 4
capture_version: 2
content_hash: sha256:fe6ae9c9c99d81890177ba2d7dc46718cee5e2ec0a6fb7eb33d14d2b4592ccc8

---
**Human**

Make me a simple pomodoro timer I can open in a browser. 25 minutes of focus, 5 minutes of break, and one start/pause button.

**Assistant**

> [!note]- Thought for 6s
> Planning a single-file page with a countdown and one button

Here is a single-file timer page. It counts down 25 minutes of focus, then a 5-minute break, and the tab title shows the time left so you can see it from another tab.

Open it in any browser. Press Space to start or pause.

**Human**

Can it play a sound when the timer ends?

**Assistant**

Yes. It now plays a short beep from the Web Audio API, so there is no sound file to load.

Browsers only allow sound after a click on the page, so the first beep needs one press of Start, which you do anyway.

### 📄 Pomodoro timer

[Pomodoro timer](files/Pomodoro%20timer.html)

<!doctype html>
<html lang="en">
<head>
title
Pomodoro timer page
tags
capture/claude
created
2026-09-07T13:02:18
url
Open in Claude
+12 more fieldsHide 12 fields
conversation_id
3f6a9c2e-8b14-4d7a-9e05-6c1b2d4f8a13
source
claude
type
conversation
aliases
Pomodoro timer page
updated
2026-09-07T13:09:44.617Z
verified_list_token
2026-09-07T13:09:44.617Z
conversation_files_fetched
true
synced
2026-09-07T13:30:05
documents
Pomodoro timer
message_count
4
capture_version
2
content_hash
sha256:fe6ae9c9c99d81890177ba2d7dc46718cee5e2ec0a6fb7eb33d14d2b4592ccc8

Human

Make me a simple pomodoro timer I can open in a browser. 25 minutes of focus, 5 minutes of break, and one start/pause button.

Assistant

Thought for 6s

Planning a single-file page with a countdown and one button

Here is a single-file timer page. It counts down 25 minutes of focus, then a 5-minute break, and the tab title shows the time left so you can see it from another tab.

Open it in any browser. Press Space to start or pause.

Human

Can it play a sound when the timer ends?

Assistant

Yes. It now plays a short beep from the Web Audio API, so there is no sound file to load.

Browsers only allow sound after a click on the page, so the first beep needs one press of Start, which you do anyway.

📄 Pomodoro timer

Pomodoro timer

<!doctype html> <html lang="en"> <head>

Pomodoro timer.html2 KB

The artifact itself, a page you can open in any browser

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Pomodoro timer</title>
  <style>
    body { margin: 0; min-height: 100vh; display: grid; place-items: center;
      font-family: system-ui, sans-serif; background: #f7f4ee; color: #222; }
    main { text-align: center; }
    .mode { letter-spacing: 0.08em; text-transform: uppercase; color: #777; }
    .time { margin: 0.2em 0; font-size: 5rem; font-variant-numeric: tabular-nums; }
    button { font: inherit; padding: 0.6rem 1.6rem; border-radius: 8px;
      border: 1px solid #ccc; background: #fff; cursor: pointer; }
  </style>
</head>
<body>
  <main>
    <p class="mode" id="mode">Focus</p>
    <p class="time" id="time">25:00</p>
    <button id="toggle">Start</button>
  </main>
  <script>
    const FOCUS = 25 * 60;
    const BREAK = 5 * 60;
    let left = FOCUS;
    let onBreak = false;
    let tick = null;

    const time = document.getElementById('time');
    const mode = document.getElementById('mode');
    const toggle = document.getElementById('toggle');

    function show() {
      const m = String(Math.floor(left / 60)).padStart(2, '0');
      const s = String(left % 60).padStart(2, '0');
      time.textContent = m + ':' + s;
      document.title = m + ':' + s + ' · ' + (onBreak ? 'Break' : 'Focus');
    }

    function beep() {
      const audio = new AudioContext();
      const tone = audio.createOscillator();
      tone.frequency.value = 880;
      tone.connect(audio.destination);
      tone.start();
      tone.stop(audio.currentTime + 0.4);
    }

    function step() {
      left -= 1;
      if (left < 0) {
        beep();
        onBreak = !onBreak;
        left = onBreak ? BREAK : FOCUS;
        mode.textContent = onBreak ? 'Break' : 'Focus';
      }
      show();
    }

    toggle.addEventListener('click', () => {
      if (tick) {
        clearInterval(tick);
        tick = null;
        toggle.textContent = 'Start';
      } else {
        tick = setInterval(step, 1000);
        toggle.textContent = 'Pause';
      }
    });

    document.addEventListener('keydown', (e) => {
      if (e.code === 'Space') { e.preventDefault(); toggle.click(); }
    });

    show();
  </script>
</body>
</html>

2026-10-03-chapter-2-reading-plan.md2 KB

A project chat

---
conversation_id: "b18d4e07-6a3c-4f92-8d15-0e7c9a2b4f61"
source: claude
type: conversation
title: "Chapter 2 reading plan"
aliases:
  - "Chapter 2 reading plan"
tags:
  - capture/claude
created: 2026-10-03T09:12:40
updated: "2026-10-03T09:14:02.905Z"
verified_list_token: "2026-10-03T09:14:02.905Z"
conversation_files_fetched: true
synced: 2026-10-03T09:40:21
url: "https://claude.ai/chat/b18d4e07-6a3c-4f92-8d15-0e7c9a2b4f61"
project: "Thesis research"
documents:
  - "Chapter 2 reading plan"
document_versions:
  - document_index: 0
    artifact_id: "chapter-2-reading-plan"
    version_id: "e4b0c2d1-7f3a-4c86-9b25-1a6d8e0f3c74"
message_count: 2
capture_version: 2
content_hash: sha256:534938903b3ebc1e898b4f4e823f46428e246770a0cf8e6832eb79bd1c452462

---
**Human**

Draft a two-week reading plan for chapter 2. Mostly measurement first, then policy. Use my interview notes.

**Assistant**

> [!note]- Thought for 9s
> Ordering the reading from measurement to policy
> Fitting the interview notes into week 2

Here is a plan that moves from measurement to policy, with your interview notes in week 2. The district heat map from interview 3 makes a good baseline for week 1.

### 📄 Chapter 2 reading plan

# Chapter 2 reading plan

## Week 1: measuring the heat island

- Day 1–2: urban climate basics, then how surface and air temperature differ
- Day 3–4: two satellite studies of land surface temperature
- Day 5: compare their methods with the district heat map

## Week 2: what cities do about it

- Day 1–2: tree canopy and cool-roof programmes
- Day 3: your interview notes, coded by theme
- Day 4–5: write a two-page synthesis for the chapter outline
title
Chapter 2 reading plan
tags
capture/claude
created
2026-10-03T09:12:40
url
Open in Claude
project
Thesis research
+13 more fieldsHide 13 fields
conversation_id
b18d4e07-6a3c-4f92-8d15-0e7c9a2b4f61
source
claude
type
conversation
aliases
Chapter 2 reading plan
updated
2026-10-03T09:14:02.905Z
verified_list_token
2026-10-03T09:14:02.905Z
conversation_files_fetched
true
synced
2026-10-03T09:40:21
documents
Chapter 2 reading plan
document_versions
document_index: 0 artifact_id: "chapter-2-reading-plan" version_id: "e4b0c2d1-7f3a-4c86-9b25-1a6d8e0f3c74"
message_count
2
capture_version
2
content_hash
sha256:534938903b3ebc1e898b4f4e823f46428e246770a0cf8e6832eb79bd1c452462

Human

Draft a two-week reading plan for chapter 2. Mostly measurement first, then policy. Use my interview notes.

Assistant

Thought for 9s

Ordering the reading from measurement to policy

Fitting the interview notes into week 2

Here is a plan that moves from measurement to policy, with your interview notes in week 2. The district heat map from interview 3 makes a good baseline for week 1.

📄 Chapter 2 reading plan

Chapter 2 reading plan

Week 1: measuring the heat island

  • Day 1–2: urban climate basics, then how surface and air temperature differ
  • Day 3–4: two satellite studies of land surface temperature
  • Day 5: compare their methods with the district heat map

Week 2: what cities do about it

  • Day 1–2: tree canopy and cool-roof programmes
  • Day 3: your interview notes, coded by theme
  • Day 4–5: write a two-page synthesis for the chapter outline

district-heat-map.png418 KB

An image uploaded to the project, saved as the original file.

PNG image · 418 KB

interview-notes.md228 bytes

A project document, saved as Markdown

# Interview 3, city planning office

- Tree canopy targets slipped two years.
- Cool-roof rebates: popular, underfunded.
- Wants data on night-time temperatures by district.
- Suggested the 2019 district heat map as a baseline.

Interview 3, city planning office

  • Tree canopy targets slipped two years.
  • Cool-roof rebates: popular, underfunded.
  • Wants data on night-time temperatures by district.
  • Suggested the 2019 district heat map as a baseline.

instructions.md181 bytes

The project’s instructions, as written in Claude

You are helping me write a master's thesis on urban heat islands.

- Cite sources in APA style.
- Keep answers short unless I ask for detail.
- Flag any claim you are unsure about.

You are helping me write a master's thesis on urban heat islands.

  • Cite sources in APA style.
  • Keep answers short unless I ask for detail.
  • Flag any claim you are unsure about.

Thesis research.md504 bytes

The project’s index note

---
source: claude
project_id: "7c2e9a41-3b5d-4f0e-9c1a-2d8e6f4b1a37"
url: "https://claude.ai/project/7c2e9a41-3b5d-4f0e-9c1a-2d8e6f4b1a37"
archived: false

---# Thesis research

- **Provider**: Claude
- **Project ID**: `7c2e9a41-3b5d-4f0e-9c1a-2d8e6f4b1a37`
- **Link**: https://claude.ai/project/7c2e9a41-3b5d-4f0e-9c1a-2d8e6f4b1a37
- **Instructions**: [instructions.md](instructions.md)

## Files

- [district-heat-map.png](files/district-heat-map.png)
- [interview-notes.md](files/interview-notes.md)
url
Open in Claude
+3 more fieldsHide 3 fields
source
claude
project_id
7c2e9a41-3b5d-4f0e-9c1a-2d8e6f4b1a37
archived
false

Thesis research

  • Provider: Claude
  • Project ID: 7c2e9a41-3b5d-4f0e-9c1a-2d8e6f4b1a37
  • Link: https://claude.ai/project/7c2e9a41-3b5d-4f0e-9c1a-2d8e6f4b1a37
  • Instructions: instructions.md

Files

Project files download when you click Save all, and projects in Claude’s newer threads view don’t include their file library yet. Links inside the folder are plain relative links, so it still works if you copy it somewhere else. Carry rewrites instructions.md and the index note, so keep your own project note outside carry-backup/.

Where Carry fits

Carry is the browser extension we make for the “without doing it by hand” part. Pick your vault folder, connect Claude, and it saves each chat as a Markdown note on its own, every couple of hours while your browser is open. Chats from the Claude desktop or phone app are in the same account, so they save too.

It reads chats through Claude’s internal API, the same data the Claude app loads, not by scraping the page. So the middle of a long chat is saved, not only what’s on screen. One chat is one file, matched by its conversation_id and rewritten in place when the chat continues. Files from a chat go in a files/ folder next to it, and any Carry couldn’t save are marked in the note.

It runs in Chrome, Edge and other Chromium browsers on a computer, and saves ChatGPT chats into the same vault (Grok too, when you click Save all), but not Gemini or Perplexity. The 14-day trial starts with your latest 5 chats, saves new ones as you go, and saves instructions and files for a couple of projects. Your full history needs a one-time $59 license.

Pick your folder

Connect providers

Then it’s automatic

Before you trust a tool with your vault

“Wouldn’t generally recommend random 3rd party extensions that can read your whole DOM,” one r/ObsidianMD commenter warned. Fair. Whatever you use, check:

  • Where the chats go. If a tool uploads them, its privacy policy should say so. Your browser’s DevTools Network tab shows you either way.
  • What it asks for. Access to claude.ai makes sense. Your tabs, your history or every site you visit doesn’t.
  • Where it writes. Its own folder, not over your notes. Back up the vault before the first run anyway.

Carry asks for claude.ai access when you connect Claude, and doesn’t ask for your tabs, history or cookies. Chats go from Claude to your folder and are never uploaded. There’s no Carry account or API key. Its notes go in carry-backup/, it leaves your own notes alone, and it doesn’t delete your files. It’s closed source, so the Network tab is the real check. Besides claude.ai, you’ll see compatibility settings and anonymous usage counts (numbers, never titles or text) going to carry.md, and you can switch both off.

Common questions

Do I need an Obsidian plugin or API key?
No. A vault is a folder of Markdown files, and Carry writes Markdown into it. Obsidian doesn’t even need to be open.
Do chats from the Claude desktop or phone app save?
Yes. They’re in the same Claude account, so Carry saves them the next time it checks. Carry itself runs in a Chromium browser on a computer, and that browser needs to be open.
Can I save just part of a chat?
Carry saves whole chats. For one answer, use the copy button under Claude’s reply and paste it into your note. Or quote the part you need in your own note and link the full chat under it.
Will it create duplicates if I run it twice?
No. Each note is matched by the conversation_id in its frontmatter and updated in place, even if you renamed the file.
What happens to my notes if I stop using Carry?
They stay. They’re plain Markdown files in your folder. If you uninstall Carry or your trial ends, only new saves stop.

Carry never uploads your chats. It downloads compatibility settings from carry.md and sends anonymous usage counts, and both can be switched off. See privacy details.

Save every conversation.

Sync your ChatGPT, Claude, and Grok conversations into your own folder — as clean Markdown, processed on your device.