feat(n8n): add obsidian automation workflows

This commit is contained in:
William Valentin
2026-05-14 14:39:10 -07:00
parent c774030341
commit 13ab43de6c
6 changed files with 6 additions and 0 deletions
@@ -0,0 +1 @@
[{"updatedAt":"2026-05-14T21:36:33.163Z","createdAt":"2026-05-14T21:36:33.163Z","id":"6SKSZWZwuJNwuO2P","name":"Obsidian Inbox Triage","description":null,"active":true,"isArchived":false,"nodes":[{"parameters":{},"id":"a244fdef-bf36-4903-bc52-d37bbc501f64","name":"Manual Trigger","type":"n8n-nodes-base.manualTrigger","typeVersion":1,"position":[0,0]},{"parameters":{"rule":{"interval":[{"field":"cronExpression","expression":"0 18 * * *"}]}},"id":"f7ccf023-35a2-4011-9f35-82b7d9eb804d","name":"Daily 18:00 PT","type":"n8n-nodes-base.scheduleTrigger","typeVersion":1.2,"position":[0,180]},{"parameters":{"url":"http://172.19.0.1:27123/vault/Inbox/","options":{"timeout":30000},"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"id":"21e3b6ca-f129-4884-82a4-80c9217cb0f4","name":"List Inbox","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[280,80],"credentials":{"httpHeaderAuth":{"id":"465Swz2b71O2KRAK","name":"Obsidian Local REST API"}},"continueOnFail":true},{"parameters":{"jsCode":"\nconst now = new Date(); const date = now.toISOString().slice(0,10);\nconst input = $input.first().json;\nconst files = (Array.isArray(input.files) ? input.files : []).filter(f => f.endsWith('.md') && !f.includes('Triage'));\nconst lines = files.length ? files.map(f => `- [ ] [[${f.replace(/^Inbox\\//,'').replace(/\\.md$/,'')}]] — classify as Project / Resource / Decision / Runbook / Archive`).join('\\n') : '- No untriaged Inbox markdown files found.';\nconst body = `# Inbox Triage ${date}\n\nGenerated: ${now.toISOString()}\n\n## Inbox items\n\n${lines}\n\n## Promote to Projects\n\n- [ ] \n\n## Promote to Resources\n\n- [ ] \n\n## Promote to Decisions\n\n- [ ] \n\n## Promote to Runbooks\n\n- [ ] \n\n## Archive / Delete / Defer\n\n- [ ] \n`;\nreturn [{json:{path:`Inbox/Triage/${date}.md`, body}}];\n"},"id":"0b4e13c6-47ac-4d89-89b9-65d5da966c07","name":"Build Triage Note","type":"n8n-nodes-base.code","typeVersion":2,"position":[560,80]},{"parameters":{"method":"PUT","url":"={{'http://172.19.0.1:27123/vault/' + encodeURIComponent($json.path).replace(/%2F/g, '/')}}","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Content-Type","value":"text/markdown"}]},"sendBody":true,"contentType":"raw","rawContentType":"text/markdown","body":"={{$json.body}}","options":{"timeout":30000},"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"id":"dde63028-700e-4abd-af07-cb7af7119c99","name":"Write Triage Note","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[840,80],"credentials":{"httpHeaderAuth":{"id":"465Swz2b71O2KRAK","name":"Obsidian Local REST API"}}}],"connections":{"Manual Trigger":{"main":[[{"node":"List Inbox","type":"main","index":0}]]},"Daily 18:00 PT":{"main":[[{"node":"List Inbox","type":"main","index":0}]]},"List Inbox":{"main":[[{"node":"Build Triage Note","type":"main","index":0}]]},"Build Triage Note":{"main":[[{"node":"Write Triage Note","type":"main","index":0}]]}},"settings":{"executionOrder":"v1","callerPolicy":"workflowsFromSameOwner","availableInMCP":false},"staticData":{"node:Daily 18:00 PT":{"recurrenceRules":[]}},"meta":null,"pinData":null,"versionId":"aa7b9bb1-7e61-410a-ae86-594e2325c52b","activeVersionId":"aa7b9bb1-7e61-410a-ae86-594e2325c52b","versionCounter":4,"triggerCount":1,"tags":[],"shared":[{"updatedAt":"2026-05-14T21:36:33.167Z","createdAt":"2026-05-14T21:36:33.167Z","role":"workflow:owner","workflowId":"6SKSZWZwuJNwuO2P","projectId":"WGdp8QunI1tHpjXa","project":{"updatedAt":"2026-03-11T21:08:10.005Z","createdAt":"2026-03-11T21:05:11.541Z","id":"WGdp8QunI1tHpjXa","name":"will will <will@wills-portal.com>","type":"personal","icon":null,"description":null,"creatorId":"5ad50ead-6e6a-4d12-ab5b-e5db15835bb5"}}],"versionMetadata":{"name":null,"description":null}}]
@@ -0,0 +1 @@
[{"updatedAt":"2026-05-14T21:36:33.215Z","createdAt":"2026-05-14T21:36:33.215Z","id":"LF3i86l3NkxpayxL","name":"Obsidian Chat Summary Capture","description":null,"active":true,"isArchived":false,"nodes":[{"parameters":{"httpMethod":"POST","path":"obsidian-chat-summary","responseMode":"responseNode","options":{}},"id":"90069c7c-b6c9-4434-93f4-3b97061e590a","name":"Webhook - Chat Summary","type":"n8n-nodes-base.webhook","typeVersion":2,"position":[0,0],"webhookId":"obsidian-chat-summary"},{"parameters":{"jsCode":"\nconst input = $json.body ?? $json;\nconst now = new Date(); const iso = now.toISOString(); const date = iso.slice(0,10);\nconst type = String(input.type || 'chat').toLowerCase();\nconst folderMap = {meeting:'Meetings', call:'Meetings', zoom:'Meetings', teams:'Meetings', decision:'Decisions', runbook:'Runbooks', project:'Projects', resource:'Resources', daily:'Daily'};\nconst folder = folderMap[type] || 'Inbox/Chat Summaries';\nfunction clean(s){ return String(s||'Untitled Summary').replace(/[\\\\/:*?\"<>|#\\[\\]]/g,'').replace(/\\s+/g,' ').trim().slice(0,120) || 'Untitled Summary'; }\nconst title = clean(input.title || input.subject || `${type} summary`);\nconst summary = input.summary || input.text || input.content || '';\nconst content = input.markdown || input.content || summary;\nconst tags = Array.isArray(input.tags) ? input.tags : String(input.tags || '').split(',').map(s=>s.trim()).filter(Boolean);\nconst body = `---\ntitle: ${JSON.stringify(title)}\ntype: ${JSON.stringify(type)}\nsource: ${JSON.stringify(input.source || input.platform || 'webhook')}\ncreated: ${JSON.stringify(iso)}\ntags: ${JSON.stringify(['automation/n8n','chat-summary',...tags])}\n---\n\n# ${title}\n\n## Summary\n\n${summary || '_No summary provided._'}\n\n## Notes\n\n${content || '_No content provided._'}\n\n## Metadata\n\n\\`\\`\\`json\n${JSON.stringify(input.metadata || {}, null, 2)}\n\\`\\`\\`\n`;\nreturn [{json:{path:`${folder}/${date} - ${title}.md`, body, title, folder, type}}];\n"},"id":"e80e092c-4fc4-4159-ac7c-fc570ef1c761","name":"Prepare Chat Note","type":"n8n-nodes-base.code","typeVersion":2,"position":[280,0]},{"parameters":{"method":"PUT","url":"={{'http://172.19.0.1:27123/vault/' + encodeURIComponent($json.path).replace(/%2F/g, '/')}}","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Content-Type","value":"text/markdown"}]},"sendBody":true,"contentType":"raw","rawContentType":"text/markdown","body":"={{$json.body}}","options":{"timeout":30000},"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"id":"a616c85b-9898-42bc-866f-077037c07a41","name":"Write Chat Note","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[560,0],"credentials":{"httpHeaderAuth":{"id":"465Swz2b71O2KRAK","name":"Obsidian Local REST API"}}},{"parameters":{"respondWith":"json","responseBody":"={{JSON.stringify({ok:true, path:$('Prepare Chat Note').first().json.path, title:$('Prepare Chat Note').first().json.title, folder:$('Prepare Chat Note').first().json.folder})}}","options":{}},"id":"6944cd52-8614-4658-8907-b54a44fc01fa","name":"Respond","type":"n8n-nodes-base.respondToWebhook","typeVersion":1.1,"position":[840,0]}],"connections":{"Webhook - Chat Summary":{"main":[[{"node":"Prepare Chat Note","type":"main","index":0}]]},"Prepare Chat Note":{"main":[[{"node":"Write Chat Note","type":"main","index":0}]]},"Write Chat Note":{"main":[[{"node":"Respond","type":"main","index":0}]]}},"settings":{"executionOrder":"v1","callerPolicy":"workflowsFromSameOwner","availableInMCP":false},"staticData":null,"meta":null,"pinData":null,"versionId":"49e05c18-c8d6-4eac-b507-1833840d57fe","activeVersionId":"49e05c18-c8d6-4eac-b507-1833840d57fe","versionCounter":3,"triggerCount":1,"tags":[],"shared":[{"updatedAt":"2026-05-14T21:36:33.223Z","createdAt":"2026-05-14T21:36:33.223Z","role":"workflow:owner","workflowId":"LF3i86l3NkxpayxL","projectId":"WGdp8QunI1tHpjXa","project":{"updatedAt":"2026-03-11T21:08:10.005Z","createdAt":"2026-03-11T21:05:11.541Z","id":"WGdp8QunI1tHpjXa","name":"will will <will@wills-portal.com>","type":"personal","icon":null,"description":null,"creatorId":"5ad50ead-6e6a-4d12-ab5b-e5db15835bb5"}}],"versionMetadata":{"name":null,"description":null}}]
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
[{"updatedAt":"2026-05-14T21:36:33.045Z","createdAt":"2026-05-14T21:36:33.045Z","id":"PCtD3PuQjzKLyEEE","name":"Obsidian Health + Reindex","description":null,"active":true,"isArchived":false,"nodes":[{"parameters":{},"id":"f9152036-4ee6-48cf-9f71-fd59ce617c52","name":"Manual Trigger","type":"n8n-nodes-base.manualTrigger","typeVersion":1,"position":[0,0]},{"parameters":{"rule":{"interval":[{"field":"hours","hoursInterval":1}]}},"id":"7845e784-c35b-4912-9d72-2463a06d95d2","name":"Hourly Health Schedule","type":"n8n-nodes-base.scheduleTrigger","typeVersion":1.2,"position":[0,180]},{"parameters":{"url":"http://172.19.0.1:27123/","options":{"timeout":10000}},"id":"4976f00c-3539-4d3a-a87d-f7f3ac1adf19","name":"Check Obsidian REST","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[280,80],"continueOnFail":true},{"parameters":{"method":"POST","url":"http://172.19.0.1:18810/reindex","options":{"timeout":300000}},"id":"8abf0596-3af6-4d56-b4d0-5284f13998ae","name":"Trigger Obsidian Reindex","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[560,80],"continueOnFail":true},{"parameters":{"method":"POST","url":"http://172.19.0.1:18814/check","options":{"timeout":240000}},"id":"248b4109-2d60-43bc-b598-cb766edde11f","name":"Run RAG Embedding Check","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[840,80],"continueOnFail":true},{"parameters":{"jsCode":"\nconst now = new Date().toISOString();\nconst reindex = $('Trigger Obsidian Reindex').first().json;\nconst rag = $('Run RAG Embedding Check').first().json;\nconst rest = $('Check Obsidian REST').first().json;\nconst ok = Boolean(rest.status === 'OK' || rest.manifest || rest.statusCode) && Boolean(rag.ok !== false) && Boolean(reindex.ok !== false);\nconst body = `# Obsidian Automation Health\n\nUpdated: ${now}\n\n## Status\n\n- Overall: ${ok ? 'OK' : 'Needs attention'}\n- Obsidian REST: ${rest.status || rest.statusCode || 'responded'}\n- Reindex trigger: ${JSON.stringify(reindex).slice(0, 500)}\n- RAG/embedding check: ${JSON.stringify(rag).slice(0, 1000)}\n\nThis note is automatically overwritten by n8n.\n`;\nreturn [{ json: { ok, path: 'Resources/Obsidian Automation Health.md', body } }];\n"},"id":"e67008ad-0d9e-4546-a180-3d4223b8d05c","name":"Build Health Note","type":"n8n-nodes-base.code","typeVersion":2,"position":[1120,80]},{"parameters":{"method":"PUT","url":"={{'http://172.19.0.1:27123/vault/' + encodeURIComponent($json.path).replace(/%2F/g, '/')}}","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Content-Type","value":"text/markdown"}]},"sendBody":true,"contentType":"raw","rawContentType":"text/markdown","body":"={{$json.body}}","options":{"timeout":30000},"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"id":"d86d8942-966a-48fd-ad99-cf23408f2ae4","name":"Write Health Note","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[1400,80],"credentials":{"httpHeaderAuth":{"id":"465Swz2b71O2KRAK","name":"Obsidian Local REST API"}}}],"connections":{"Manual Trigger":{"main":[[{"node":"Check Obsidian REST","type":"main","index":0}]]},"Hourly Health Schedule":{"main":[[{"node":"Check Obsidian REST","type":"main","index":0}]]},"Check Obsidian REST":{"main":[[{"node":"Trigger Obsidian Reindex","type":"main","index":0}]]},"Trigger Obsidian Reindex":{"main":[[{"node":"Run RAG Embedding Check","type":"main","index":0}]]},"Run RAG Embedding Check":{"main":[[{"node":"Build Health Note","type":"main","index":0}]]},"Build Health Note":{"main":[[{"node":"Write Health Note","type":"main","index":0}]]}},"settings":{"executionOrder":"v1","callerPolicy":"workflowsFromSameOwner","availableInMCP":false},"staticData":{"node:Hourly Health Schedule":{"recurrenceRules":[]}},"meta":null,"pinData":null,"versionId":"2de2a0d3-ab17-47b5-b2ee-a9c5c20969cd","activeVersionId":"2de2a0d3-ab17-47b5-b2ee-a9c5c20969cd","versionCounter":4,"triggerCount":1,"tags":[],"shared":[{"updatedAt":"2026-05-14T21:36:33.056Z","createdAt":"2026-05-14T21:36:33.056Z","role":"workflow:owner","workflowId":"PCtD3PuQjzKLyEEE","projectId":"WGdp8QunI1tHpjXa","project":{"updatedAt":"2026-03-11T21:08:10.005Z","createdAt":"2026-03-11T21:05:11.541Z","id":"WGdp8QunI1tHpjXa","name":"will will <will@wills-portal.com>","type":"personal","icon":null,"description":null,"creatorId":"5ad50ead-6e6a-4d12-ab5b-e5db15835bb5"}}],"versionMetadata":{"name":null,"description":null}}]
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
[{"updatedAt":"2026-05-14T21:36:33.117Z","createdAt":"2026-05-14T21:36:33.117Z","id":"YZyJ5G0Ur8D6TlM8","name":"Obsidian Daily Review","description":null,"active":true,"isArchived":false,"nodes":[{"parameters":{},"id":"01121020-b53b-4f27-8ad2-f6e1ddb656c4","name":"Manual Trigger","type":"n8n-nodes-base.manualTrigger","typeVersion":1,"position":[0,0]},{"parameters":{"rule":{"interval":[{"field":"cronExpression","expression":"30 7 * * *"}]}},"id":"4d6ec3bb-2953-43a8-bbed-e9a54199622d","name":"Daily 07:30 PT","type":"n8n-nodes-base.scheduleTrigger","typeVersion":1.2,"position":[0,180]},{"parameters":{"jsCode":"\nconst now = new Date();\nconst date = now.toISOString().slice(0,10);\nconst body = `---\ntype: daily-review\ndate: ${date}\ntags: [type/daily-review, automation/n8n]\n---\n\n# Daily Review ${date}\n\n## Top priorities\n\n- [ ] \n- [ ] \n- [ ] \n\n## Inbox sweep\n\n- [ ] Review [[Inbox]]\n- [ ] Promote useful captures into [[Projects Home]], [[Resources Home]], [[Decisions Home]], or [[Runbooks Home]]\n\n## Open loops\n\n- [ ] Check [[Projects Home]]\n- [ ] Check [[Meetings Home]] action items\n- [ ] Check [[Runbooks Home]] for procedures that need updates\n\n## Notes / log\n\n- \n\n## End-of-day reflection\n\n- What moved forward?\n- What is blocked?\n- What should start tomorrow?\n`;\nreturn [{ json: { path: `Daily/Reviews/${date} Daily Review.md`, body } }];\n"},"id":"8ffb36c5-de40-4811-8f92-61d9dde9982c","name":"Build Daily Review","type":"n8n-nodes-base.code","typeVersion":2,"position":[280,80]},{"parameters":{"method":"PUT","url":"={{'http://172.19.0.1:27123/vault/' + encodeURIComponent($json.path).replace(/%2F/g, '/')}}","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Content-Type","value":"text/markdown"}]},"sendBody":true,"contentType":"raw","rawContentType":"text/markdown","body":"={{$json.body}}","options":{"timeout":30000},"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"id":"5e2226bb-3c34-4f17-b968-039ddc1dfe35","name":"Write Daily Review","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[560,80],"credentials":{"httpHeaderAuth":{"id":"465Swz2b71O2KRAK","name":"Obsidian Local REST API"}}}],"connections":{"Manual Trigger":{"main":[[{"node":"Build Daily Review","type":"main","index":0}]]},"Daily 07:30 PT":{"main":[[{"node":"Build Daily Review","type":"main","index":0}]]},"Build Daily Review":{"main":[[{"node":"Write Daily Review","type":"main","index":0}]]}},"settings":{"executionOrder":"v1","callerPolicy":"workflowsFromSameOwner","availableInMCP":false},"staticData":{"node:Daily 07:30 PT":{"recurrenceRules":[]}},"meta":null,"pinData":null,"versionId":"2d2a2217-4772-42eb-80ce-622ed419d209","activeVersionId":"2d2a2217-4772-42eb-80ce-622ed419d209","versionCounter":4,"triggerCount":1,"tags":[],"shared":[{"updatedAt":"2026-05-14T21:36:33.120Z","createdAt":"2026-05-14T21:36:33.120Z","role":"workflow:owner","workflowId":"YZyJ5G0Ur8D6TlM8","projectId":"WGdp8QunI1tHpjXa","project":{"updatedAt":"2026-03-11T21:08:10.005Z","createdAt":"2026-03-11T21:05:11.541Z","id":"WGdp8QunI1tHpjXa","name":"will will <will@wills-portal.com>","type":"personal","icon":null,"description":null,"creatorId":"5ad50ead-6e6a-4d12-ab5b-e5db15835bb5"}}],"versionMetadata":{"name":null,"description":null}}]