微信扫码
添加专属顾问
我要投稿
用AI打造你的第二大脑:Obsidian+Claude Code的完美组合,让知识管理从被动记录变为主动思考。核心内容:1. 传统笔记工具的痛点与"第二大脑"的创新理念2. Obsidian与Claude Code的协同架构设计3. 从基础搭建到高效工作流的完整实现方案
老实说,我尝试过市面上所有的效率系统。从最终变成“数字坟墓”的Notion数据库,到看起来很酷却从未真正帮助我“做成”任何事的Miro画板,再到混乱不堪的Apple备忘录……我几乎尝试了所有能想到的工具。
直到有一天,我突然茅塞顿开。我不再试图建立一个“更好”的笔记系统,而是开始构建一些完全不同的东西:一个真正能与我协作的“第二大脑”。
秘密是什么?将Obsidian本地优先、纯文本的灵活性,与Claude Code实际“操作”文件的强大能力结合起来。它不仅仅是搜索你的文件,也不仅仅是总结它们,而是能够通过编程方式操纵、生成和增强这些文件。
这就是我构建的系统,以及你如何也能打造一个。
这里的核心在于:Obsidian将所有内容都存储在你本地机器的纯Markdown文件中。没有专有格式,没有云端锁定。只是一堆.md文件,Claude Code可以直接读取、写入和操作它们。
这个三层架构非常简单:你的Obsidian库(你完全拥有的纯Markdown文件),Claude Code(读取、创建和操纵这些文件),以及由此产生的“第二大脑”(自动链接的笔记、生成的摘要、智能任务提取)。
首先,让我们把必需品准备好。我假设你已经安装了Obsidian。如果不是,请从obsidian.md下载(个人使用免费)。
在Obsidian中,前往“设置”→“社区插件”并安装:
就是这样。仅需三个插件。不要陷入插件的“兔子洞”。这三个插件涵盖了你90%的需求。
如果你还没有安装Claude Code,请运行:
npm install -g @anthropic-ai/claude-code
然后,在终端中进入你的Obsidian库目录:
cd ~/Documents/ObsidianVault
运行Claude Code: 运行 Claude Code:
claude
就这样。现在Claude Code就可以访问你的整个知识库了。
接下来是激动人心的地方。这些是我日常使用的实际工作流:
每天早上,我打开终端并输入:
claude "Create today's daily note using my template. Pull in any tasks from yesterday that are still open, and link to any projects I worked on this week."
Claude Code会读取我的Templater模板,生成每日笔记,扫描昨天的文件以查找未完成的任务,并为我构建一个起点。以前需要15分钟复制粘贴的工作,现在只需30秒。
每次会议结束后,我都会将原始笔记倾倒到一个文件中。然后:
claude "Read my meeting note from today's standup and extract all action items. Format them as Obsidian Tasks with due dates based on what was discussed. Put them in my tasks.md file."
它会解析像“John提到我们需要在周五完成API”这样的内容,并创建:
- [ ] Finish API implementation 📅 2026–01–10 #work/api
Tasks插件随后会捕获这些任务,并显示在我的每日笔记查询中。完全无需手动格式化。
周五下午:
claude "Generate my weekly review. Summarize what I worked on based on this week's daily notes, list completed tasks, identify any blocked projects, and suggest priorities for next week."
它会生成一个格式化的Markdown文档,真正帮助我思考这一周。这不是一项苦差事,而是一个真正的反思工具。
以下是我的每日笔记模板的一部分。Templater处理它,Claude Code可以生成符合相同结构的笔记:
# <% tp.date.now("YYYY-MM-DD dddd") %>
## 🎯 今日焦点 (Today's Focus)
-
## 📋 任务 (Tasks)
not done
due before <% tp.date.now("YYYY-MM-DD") %>
小贴士: 保持你的模板简洁。真正的魔力不在于复杂的模板,而在于Claude Code理解上下文并生成内容,使其自然地融入你现有结构的能力。
我曾在Make.com中构建过自动化,也用Python编写过脚本。以下是Obsidian + Claude Code组合脱颖而出的原因:
这是我给你的挑战:从一个工作流开始。
也许是每日笔记。也许是任务提取。选择一项目前需要你花费10分钟以上的工作,然后用Claude Code实现自动化。
然后下周,再增加一个。
一个月内,你就会拥有一个不只是存储信息的系统——它会与你协作,帮你找出重要内容,追踪待办事项,并连接你原本无法独立联想到的想法。
那不再是一个笔记应用。那是一个“第二大脑”。
以下是我目前主页构建的一个DataviewJS示例:
你可以借用这个示例,但你需要更改你的文件夹名称。
我的是——工作、商业、健康和投资。
// ============ CONFIG (配置) ============
const habitEmojis = ["🚶", "🍽️", "😴", "💻", "🪥"]; // 习惯表情符号列表
function isHabit(task) { // 检查任务是否为习惯任务
return habitEmojis.some(emoji => task.text.includes(emoji));
}
// 文件夹标签配置:根据你的库中实际文件夹名称进行设置
const folderLabels = {
"Work": { text: "工作", color: "#3498db", emoji: "💼" }, // "Work" 文件夹对应标签
"Business": { text: "商业", color: "#27ae60", emoji: "💳" }, // "Business" 文件夹对应标签
"Health": { text: "健康", color: "#e74c3c", emoji: "🏃" }, // "Health" 文件夹对应标签
"Investing": { text: "投资", color: "#9b59b6", emoji: "💰" } // "Investing" 文件夹对应标签
};
// ============ HEADER (头部区域) ============
const header = dv.el("div", "");
header.style.cssText = `
display: flex; justify-content: space-between; align-items: center;
margin-bottom: 20px; padding-bottom: 16px;
border-bottom: 1px solid var(--background-modifier-border);
`;
const greeting = header.createDiv();
const hour = new Date().getHours();
const greetText = hour < 12 ? "早上好" : hour < 17 ? "下午好" : "晚上好"; // 根据时间显示问候语
greeting.createEl("h2", {text: `${greetText}, Sonny`}).style.cssText = "margin: 0;";
const dateDiv = header.createDiv();
const today = new Date();
const options = { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' };
dateDiv.textContent = today.toLocaleDateString('zh-CN', options); // 显示当前日期,格式为中文
dateDiv.style.cssText = "font-size: 0.9em; opacity: 0.7;";
// ============ STATS ROW (统计行) ============
const statsRow = dv.el("div", "");
statsRow.style.cssText = `
display: flex; gap: 12px; margin-bottom: 20px; flex-wrap: wrap;
`;
// 获取统计数据
const allTasks = dv.pages().file.tasks; // 获取所有任务
const thisWeekStart = dv.date("today").minus({days: today.getDay()}); // 本周开始日期 (周日)
const completedThisWeek = allTasks.where(t => t.completed && !isHabit(t)).length; // 本周完成的任务数 (非习惯)
const openTasks = allTasks.where(t => !t.completed && !isHabit(t)).length; // 开放任务数 (非习惯)
// 习惯连胜 (Habit streak) 计算
const dailyNotes = dv.pages('"Daily Journal"') // 从 "Daily Journal" 文件夹获取每日笔记
.where(p => p.file.name.match(/^\d{4}-\d{2}-\d{2}$/)) // 筛选符合日期格式的笔记
.sort(p => p.file.name, 'desc') // 按日期降序排序
.limit(7); // 只取最近7天
let habitsDoneToday = 0; // 今日完成习惯数
let habitsTotal = 6; // 习惯总数
const todayStr = dv.date("today").toFormat("yyyy-MM-dd"); // 今日日期字符串
for (const note of dailyNotes) {
if (note.file.name === todayStr) {
const habits = note.file.tasks.where(t => isHabit(t));
habitsDoneToday = habits.where(t => t.completed).length;
habitsTotal = habits.length || 6;
break;
}
}
// 创建统计卡片函数
function createStatCard(emoji, label, value, subtext, color) {
const card = statsRow.createDiv();
card.style.cssText = `
background: var(--background-secondary);
padding: 14px 18px; border-radius: 8px;
min-width: 140px; border-left: 4px solid ${color};
`;
card.createDiv({text: `${emoji} ${label}`}).style.cssText = "font-size: 0.8em; opacity: 0.7; margin-bottom: 4px;";
card.createDiv({text: value}).style.cssText = `font-size: 1.4em; font-weight: bold; color: ${color};`;
if (subtext) card.createDiv({text: subtext}).style.cssText = "font-size: 0.75em; opacity: 0.5;";
}
// 创建具体的统计卡片
createStatCard("✅", "已完成", completedThisWeek.toString(), "本周", "#27ae60"); // 已完成任务卡片
createStatCard("📋", "开放任务", openTasks.toString(), "剩余", "#3498db"); // 开放任务卡片
createStatCard("🏃", "今日习惯", `${habitsDoneToday}/${habitsTotal}`, "", habitsDoneToday >= habitsTotal ? "#27ae60" : "#f39c12"); // 今日习惯卡片
// ============ QUICK ADD (快速添加) ============
const quickSection = dv.el("div", "");
quickSection.style.cssText = `
background: var(--background-secondary);
padding: 12px 16px; border-radius: 8px;
margin-bottom: 20px; display: flex; gap: 8px; align-items: center;
`;
quickSection.createSpan({text: "⚡"}).style.marginRight = "4px";
const quickNote = quickSection.createSpan({text: "快速添加:打开今日每日笔记,记录任务和想法"}); // 快速添加提示
quickNote.style.cssText = "flex: 1; font-size: 0.85em; opacity: 0.7;";
const todayLink = quickSection.createEl("a", {text: "→ 打开今日笔记"}); // 打开今日笔记链接
todayLink.style.cssText = "font-size: 0.85em; cursor: pointer;";
todayLink.onclick = () => app.workspace.openLinkText(`Daily Journal/${todayStr}`, "", false);
// ============ FOLDER SHORTCUTS (文件夹快捷方式) ============
const shortcutsSection = dv.el("div", "");
shortcutsSection.style.cssText = `
display: flex; gap: 12px; margin-bottom: 24px; flex-wrap: wrap;
`;
// 遍历文件夹标签,创建快捷方式卡片
for (const [folder, info] of Object.entries(folderLabels)) {
const card = shortcutsSection.createDiv();
card.style.cssText = `
background: var(--background-secondary);
padding: 16px 20px; border-radius: 8px;
cursor: pointer; transition: transform 0.1s;
border-top: 3px solid ${info.color};
min-width: 120px; text-align: center;
`;
card.onmouseenter = () => card.style.transform = "translateY(-2px)"; // 鼠标进入效果
card.onmouseleave = () => card.style.transform = "translateY(0)"; // 鼠标离开效果
card.onclick = () => app.workspace.openLinkText(folder, "", false); // 点击打开文件夹
card.createDiv({text: info.emoji}).style.cssText = "font-size: 1.5em; margin-bottom: 6px;";
card.createDiv({text: info.text}).style.cssText = "font-size: 0.9em; font-weight: 500;";
}
// ============ TASKS KANBAN (任务看板) ============
const kanbanTitle = dv.el("h3", "📋 任务"); // 任务看板标题
kanbanTitle.style.cssText = "margin: 0 0 12px 0;";
const dvToday = dv.date("today");
// 计算实际日历周边界 (周日 = 一周的开始)
const jsToday = new Date();
const dayOfWeek = jsToday.getDay(); // 0 = 星期日
const thisWeekEnd = dvToday.plus({days: 6 - dayOfWeek}); // 本周末 (星期六)
const nextWeekEnd = thisWeekEnd.plus({days: 7}); // 下周末
const tasks = dv.pages().file.tasks.where(t => !t.completed && !isHabit(t)); // 获取未完成且非习惯任务
// 筛选不同时间段的任务
const todayTasks = tasks.filter(t => {
if (!t.due) return false;
return t.due.ts <= dvToday.ts || t.text.includes("🔁R")
});
const thisWeekTasks = tasks.filter(t => {
if (!t.due) return false;
return t.due.ts > dvToday.ts && t.due.ts <= thisWeekEnd.ts;
});
const nextWeekTasks = tasks.filter(t => {
if (!t.due) return false;
return t.due.ts > thisWeekEnd.ts && t.due.ts <= nextWeekEnd.ts;
});
const laterTasks = tasks.filter(t => {
if (!t.due) return false;
return t.due.ts > nextWeekEnd.ts;
});
const noDueTasks = tasks.filter(t => !t.due); // 没有截止日期的任务
const kanban = dv.el("div", "");
kanban.style.cssText = `
display: flex; gap: 12px; margin-bottom: 24px;
overflow-x: auto; padding-bottom: 8px;
`;
// 获取任务所属文件夹的标签
function getLabel(task) {
for (const [folder, info] of Object.entries(folderLabels)) {
if (task.path.includes(folder)) return info;
}
return null;
}
// 完成任务函数
async function completeTask(task) {
const file = app.vault.getAbstractFileByPath(task.path);
if (!file) return;
const content = await app.vault.read(file);
const lines = content.split("\n");
if (lines[task.line]) {
const todayDate = new Date().toISOString().split('T')[0];
lines[task.line] = lines[task.line].replace("- [ ]", "- [x]").replace(/$/, ` ✅ ${todayDate}`); // 将任务标记为完成
await app.vault.modify(file, lines.join("\n"));
}
}
// 渲染看板列函数
function renderColumn(container, title, color, taskList) {
const col = container.createDiv();
col.style.cssText = `
flex: 1; min-width: 220px; max-width: 300px;
background: var(--background-secondary);
border-radius: 8px; padding: 12px;
border-top: 3px solid ${color};
`;
const colHeader = col.createDiv();
colHeader.style.cssText = "display: flex; justify-content: space-between; margin-bottom: 10px;";
colHeader.createEl("h4", {text: title}).style.cssText = "margin: 0; font-size: 0.9em;"; // 列标题
colHeader.createSpan({text: taskList.length.toString()}).style.cssText = `
background: ${color}33; color: ${color};
padding: 2px 8px; border-radius: 10px; font-size: 0.75em;
`;
const list = col.createDiv();
list.style.cssText = "max-height: 40vh; overflow-y: auto;";
if (taskList.length === 0) {
const empty = list.createDiv({text: "暂无任务"}); // 暂无任务提示
empty.style.cssText = "color: var(--text-muted); font-size: 0.85em; padding: 8px; text-align: center;";
} else {
for (const task of taskList) {
const item = list.createDiv();
item.style.cssText = `
background: var(--background-primary);
padding: 8px 10px; margin-bottom: 6px;
border-radius: 5px; font-size: 0.85em;
border-left: 3px solid var(--interactive-accent);
`;
const topRow = item.createDiv();
topRow.style.cssText = "display: flex; align-items: flex-start; gap: 8px;";
const checkbox = topRow.createEl("input", {type: "checkbox"});
checkbox.style.cssText = "margin-top: 2px; cursor: pointer;";
checkbox.onclick = async (e) => {
e.preventDefault();
item.style.opacity = "0.5";
item.style.textDecoration = "line-through";
await completeTask(task);
};
const text = task.text
.replace(/[📅🛫⏫🔼🔽🔁✅]\s*\d{4}-\d{2}-\d{2}/g, "")
.replace(/[📅🛫⏫🔼🔽🔁]/g, "").trim();
topRow.createSpan({text}).style.cssText = "flex: 1;";
if (task.link) {
const link = topRow.createEl("a", {text: "↗"}); // 任务链接图标
link.style.cssText = "font-size: 0.75em; opacity: 0.5; cursor: pointer;";
link.onclick = (e) => { e.preventDefault(); app.workspace.openLinkText(task.link.path, "", false); };
}
const label = getLabel(task);
if (label) {
const labelSpan = item.createSpan({text: label.text});
labelSpan.style.cssText = `
display: inline-block; margin-top: 6px; margin-left: 22px;
padding: 2px 8px; font-size: 0.65em;
background: ${label.color}; color: white; border-radius: 10px;
`;
}
}
}
}
// 渲染看板列
renderColumn(kanban, "🔴 今日", "#e74c3c", todayTasks.array()); // 今日任务列
renderColumn(kanban, "🟠 本周", "#f39c12", thisWeekTasks.array()); // 本周任务列
renderColumn(kanban, "🔵 下周", "#3498db", nextWeekTasks.array()); // 下周任务列
renderColumn(kanban, "🟣 稍后", "#9b59b6", laterTasks.array()); // 稍后任务列
renderColumn(kanban, "⚪ 无日期", "#95a5a6", noDueTasks.array()); // 无日期任务列
// ============ HABITS STREAK (习惯连胜) ============
const habitsTitle = dv.el("h3", "🏃 习惯 (最近7天)"); // 习惯标题
habitsTitle.style.cssText = "margin: 0 0 12px 0;";
const habits = [
{name: "步行1万步", emoji: "🚶"}, // 习惯名称
{name: "饮食控制在2000卡路里以内", emoji: "🍽️"}, // 习惯名称
{name: "睡眠7小时", emoji: "😴"}, // 习惯名称
{name: "副业工作1小时", emoji: "💻"}, // 习惯名称
{name: "刷牙 (早上)", emoji: "🪥"}, // 习惯名称
{name: "刷牙 (晚上)", emoji: "🪥"} // 习惯名称
];
const habitsContainer = dv.el("div", "");
habitsContainer.style.cssText = `
background: var(--background-secondary);
padding: 16px; border-radius: 8px; margin-bottom: 24px;
`;
// 遍历习惯列表,显示每日完成情况
for (const habit of habits) {
const row = habitsContainer.createDiv();
row.style.cssText = "display: flex; align-items: center; gap: 12px; margin-bottom: 8px;";
const label = row.createSpan({text: `${habit.emoji} ${habit.name}`});
label.style.cssText = "width: 240px; font-size: 0.85em;";
const dots = row.createDiv();
dots.style.cssText = "display: flex; gap: 4px;";
const notesReversed = [...dailyNotes].reverse();
for (const note of notesReversed) {
const dot = dots.createDiv();
dot.style.cssText = `
width: 28px; height: 28px; border-radius: 4px;
display: flex; align-items: center; justify-content: center;
font-size: 0.7em;
`;
const tasks = note.file.tasks.where(t => t.text.includes(habit.name));
if (tasks.length === 0) {
dot.style.background = "var(--background-primary)";
dot.textContent = "—"; // 未记录
dot.style.opacity = "0.3";
} else if (tasks[0].completed) {
dot.style.background = "#27ae60";
dot.textContent = "✓"; // 已完成
dot.style.color = "white";
} else {
dot.style.background = "#e74c3c";
dot.textContent = "✗"; // 未完成
dot.style.color = "white";
}
dot.title = note.file.name;
}
}
// ============ RECENT NOTES (近期笔记) ============
const recentTitle = dv.el("h3", "📝 近期笔记"); // 近期笔记标题
recentTitle.style.cssText = "margin: 0 0 12px 0;";
const recentNotes = dv.pages()
.where(p => !p.file.path.includes(".obsidian") && !p.file.name.match(/^\d{4}-\d{2}-\d{2}$/))
.sort(p => p.file.mtime, 'desc')
.limit(5);
const recentContainer = dv.el("div", "");
recentContainer.style.cssText = `
background: var(--background-secondary);
border-radius: 8px; overflow: hidden;
`;
// 遍历近期笔记,创建显示行
for (const note of recentNotes) {
const row = recentContainer.createDiv();
row.style.cssText = `
padding: 10px 14px; cursor: pointer;
border-bottom: 1px solid var(--background-modifier-border);
display: flex; justify-content: space-between; align-items: center;
`;
row.onmouseenter = () => row.style.background = "var(--background-primary)"; // 鼠标进入效果
row.onmouseleave = () => row.style.background = "transparent"; // 鼠标离开效果
row.onclick = () => app.workspace.openLinkText(note.file.path, "", false); // 点击打开笔记
row.createSpan({text: note.file.name}).style.cssText = "font-size: 0.9em;";
const folder = note.file.folder || "根目录"; // 笔记所在文件夹,如果为空则显示“根目录”
const folderSpan = row.createSpan({text: folder});
folderSpan.style.cssText = "font-size: 0.75em; opacity: 0.5;";
}
关注我会分享更多有趣的知识
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-02-19
开源免费!这个浏览器插件真香!AI重度用户必看,Gemini 用户必用
2026-02-19
比 iTerm2 更好的 Claude Code 终端
2026-02-16
Rust 重写 OpenClaw:内存从 1.5GB 暴降到 5MB,启动速度提升 400 倍!
2026-02-15
用AI把PRD拆解成可执行的技术方案
2026-02-15
微信PC版上线语音输入,AI 时代再造留存神话
2026-02-14
前腾讯员工,造了个AI版微信
2026-02-13
Obsidian + Claude Code:用 AI 搭一套「会生长的思考操作系统」
2026-02-12
2026建议AI从业者都花每天1小时试验AI
2026-01-24
2026-01-30
2026-01-08
2026-01-18
2026-01-29
2026-01-21
2025-12-10
2025-12-04
2026-01-27
2026-01-24
2026-02-04
2026-01-30
2026-01-21
2026-01-18
2025-12-25
2025-12-10
2025-12-09
2025-12-04