From 970bb75faa3b2f974134caa38f1a0adff75ee17a Mon Sep 17 00:00:00 2001 From: Arjun <6592213+arkml@users.noreply.github.com> Date: Mon, 16 Mar 2026 23:02:17 +0530 Subject: [PATCH] better meeting organization and sidebar display - Meeting notes saved as YYYY/MM/DD/{Title}.md under each source folder - Sidebar flattens date hierarchy to show "2026-03-15 Title.md" (newest first) - Empty source folders (granola/fireflies) and empty Meetings folder hidden from sidebar Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/x/apps/renderer/src/App.tsx | 45 +++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/apps/x/apps/renderer/src/App.tsx b/apps/x/apps/renderer/src/App.tsx index ff6d8dc1..f82a4899 100644 --- a/apps/x/apps/renderer/src/App.tsx +++ b/apps/x/apps/renderer/src/App.tsx @@ -271,6 +271,49 @@ function sortNodes(nodes: TreeNode[]): TreeNode[] { }) } +/** + * Flatten date-based folder hierarchy under Meetings/ source folders. + * Turns Meetings/granola/2026/03/15/Title.md into a flat list under + * Meetings/granola/ with display name "2026-03-15 Title". + */ +function flattenMeetingsTree(nodes: TreeNode[]): TreeNode[] { + return nodes.flatMap(node => { + if (node.kind !== 'dir' || node.name !== 'Meetings') return [node] + + const flattenedSourceChildren = (node.children ?? []).flatMap(sourceNode => { + if (sourceNode.kind !== 'dir') return [sourceNode] + + // Collect all files recursively from the date hierarchy + const files: TreeNode[] = [] + function collectFiles(n: TreeNode, dateParts: string[]) { + for (const child of n.children ?? []) { + if (child.kind === 'file') { + const dateStr = dateParts.join('-') + const displayName = dateStr ? `${dateStr} ${child.name}` : child.name + files.push({ ...child, name: displayName }) + } else if (child.kind === 'dir') { + collectFiles(child, [...dateParts, child.name]) + } + } + } + collectFiles(sourceNode, []) + + // Hide empty source folders + if (files.length === 0) return [] + + // Sort files reverse chronologically (newest first) + files.sort((a, b) => b.name.localeCompare(a.name)) + + return [{ ...sourceNode, children: files }] + }) + + // Hide Meetings folder entirely if no source folders have files + if (flattenedSourceChildren.length === 0) return [] + + return [{ ...node, children: flattenedSourceChildren }] + }) +} + // Build tree structure from flat entries function buildTree(entries: DirEntry[]): TreeNode[] { const treeMap = new Map() @@ -928,7 +971,7 @@ function App() { opts: { recursive: false, includeHidden: false, includeStats: true } }).catch(() => [] as DirEntry[]), ]) - const knowledgeTree = buildTree(knowledgeResult) + const knowledgeTree = flattenMeetingsTree(buildTree(knowledgeResult)) const basesChildren: TreeNode[] = (basesResult as DirEntry[]) .filter((e) => e.name.endsWith('.base')) .map((e) => ({ ...e, kind: 'file' as const }))