TL;DR: ChatKeeper turns your official ChatGPT export into Obsidian-friendly local Markdown and image files, then lets you update them over time as you continue to use ChatGPT. You can move, rename, and reorganize the files along with the rest of your notes, and ChatKeeper will still update them on future exports.
This article shows how I take that a step farther by linking each day’s ChatGPT conversations from my Obsidian Daily Notes.
Want to try it? Download ChatKeeper and get started for free.
I use Obsidian daily to manage all sorts of information, from high-level project plans to individual software tickets for personal projects. My most-used feature is Daily Notes to manage my tasks, log events at the office, etc. It’s become my work hub during the day.
I’m also a frequent user of ChatGPT. Whenever my ChatGPT conversations involve projects or info I track in Obsidian, I want to be able to search them along with any other information in my vault, link to them from my project documentation, and generally treat them like everything else I track.
I’ve been doing all of this for a while now with ChatKeeper, a tool I created to synchronize my entire chat history with my Obsidian documents. It’s come a long way since its initial release in September 2024: It can find and update my conversations and images in-place in my vault, even if I move or rename them. It also supports deep linking to individual conversation “turns” which is incredibly useful within Obsidian. It’s been incredibly helpful to me and to a nicely growing list of other folks who spend time at the intersection of Obsidian and ChatGPT.
ChatKeeper already creates an index of conversations both by last update and by conversation start date. But because I spend so much time in my Daily Notes, I figured it would be helpful to have each day list the conversations I participated in.
Below I provide a Dataview script that does exactly this. You can copy and paste the same script into your Daily Note template and be up and running immediately. Depending upon your Obsidian theme, it will end up looking something like this:

How The Dataview Script Works
When ChatKeeper brings your conversations into your vault, it includes properties at the top of each note. Among other things, this includes:
- a
tagsproperty containing the tagchatGPT_conversation - a
chatGPT_datesproperty containing a list of each date in which you participated in that conversation
The Dataview script works by finding all notes with both the chatGPT_conversation tag and a chatGPT_dates property containing the given day.
What You Need
- Michael Brenan’s Dataview Plugin for Obsidian
- A copy of ChatKeeper (available for Windows, Mac, and Linux)
- Daily Notes that contain the date somewhere in the name of the note, in the format
YYYY-MM-DD. The note name may contain other information, too.
The last requirement about the note name is there so that you can go back to earlier, existing daily notes and paste the script into them in order to produce a conversation list. This would not be possible if the daily note plugin simply inserts the date into the script because your template has already been evaluated for your existing daily notes.
Setup (one time)
- If you don’t already have Dataview installed and configured, follow these instructions to:
- Enable and install “community plugins” in Obsidian.
- Find and install Dataview.
- Make sure that DataView is enabled.
- In your DataView settings, make sure that “Enable JavaScript queries” is enabled.
- Download and install ChatKeeper. It includes a desktop UI for normal use and a command-line interface if you want to automate your workflow. The free trial lets you try it out with your first 30 conversations.
- Add the following Dataview script to your Daily Note template (copy and paste the entire script, and make sure it ends up in a “dataviewjs-annotated codeblock” surrounded in triple-backticks as described here.
// Extract a date in the format YYYY-MM-DD from the current file name
// Note: if your daily notes don't contain that anywhere, you'll need to tweak this
const fileName = dv.current().file.name;
const fileDatePattern = /\d{4}-\d{2}-\d{2}/;
const matchResult = fileName.match(fileDatePattern);
if (matchResult) {
// if we get this far, then matchResult[0] contains this note's date in YYYY-MM-DD format
const extractedDateString = matchResult[0];
// Get all pages that include the "chatGPT_conversation" tag.
const conversationPages = dv.pages("")
.filter(page => {
// Ensure page.tags is treated as an array.
let pageTags = page.tags;
if (typeof pageTags === "string") {
pageTags = [pageTags];
}
return pageTags && pageTags.includes("chatGPT_conversation");
})
.filter(page =>
page.chatGPT_dates &&
// Check that at least one date in chatGPT_dates matches after normalization.
page.chatGPT_dates.some(dateValue => {
// Convert the dateValue to a string (if it's not already) and extract the "YYYY-MM-DD" portion
const dateStr = dateValue.toString();
const normalized = (dateStr.match(/^(\d{4}-\d{2}-\d{2})/) || [])[1];
return normalized === extractedDateString;
})
);
if (conversationPages.length > 0) {
dv.header(3, `Today's Conversations`);
dv.table(
["Conversation Title", "Conversation Started"],
conversationPages.map(page => [
// Explicit Markdown link using Obsidian internal link syntax
`[[${page.file.path}|${page.chatGPT_conversation_title}]]`,
page.chatGPT_create_time
]) );
} else {
dv.paragraph("No conversation pages found for this date.");
}
} else {
dv.span("No valid date found in the file name.");
}
Bringing Your Conversations Into Your Vault
- Export your conversations from ChatGPT.
- Use ChatKeeper to import them into your vault, choosing the options that fit your setup, such as which conversations to import and where to store images.
- Repeat step 1 whenever you want to update your local archive. I usually do this about once a week.
Feedback
This works great for me, but I am not a Dataview or Javascript expert. I’m sure there are plenty of potential improvements possible, and I’d love to hear about them. If you come up with some, please let me know!
