From 4d2f96dfabb7c7302f76f619351d7ac1f2559412 Mon Sep 17 00:00:00 2001 From: lucaronin Date: Sat, 21 Feb 2026 16:36:06 +0100 Subject: [PATCH] feat: add archived boolean property to VaultEntry Add archived field to both TypeScript VaultEntry interface and Rust VaultEntry struct. Parse Archived frontmatter field in Rust backend. Add archived mock entries (Website Redesign, Twitter Thread Experiment) for visual testing. Co-Authored-By: Claude Opus 4.6 --- src-tauri/src/vault.rs | 6 ++- src/mock-tauri.ts | 112 +++++++++++++++++++++++++++++++++++++++++ src/types.ts | 3 +- 3 files changed, 119 insertions(+), 2 deletions(-) diff --git a/src-tauri/src/vault.rs b/src-tauri/src/vault.rs index ee37b3f8..7a6dfa06 100644 --- a/src-tauri/src/vault.rs +++ b/src-tauri/src/vault.rs @@ -24,6 +24,7 @@ pub struct VaultEntry { pub status: Option, pub owner: Option, pub cadence: Option, + pub archived: bool, #[serde(rename = "modifiedAt")] pub modified_at: Option, #[serde(rename = "createdAt")] @@ -53,6 +54,8 @@ struct Frontmatter { owner: Option, #[serde(rename = "Cadence")] cadence: Option, + #[serde(rename = "Archived")] + archived: Option, #[serde(rename = "Created at")] created_at: Option, #[serde(rename = "Created time")] @@ -202,7 +205,7 @@ fn parse_frontmatter(data: &HashMap) -> Frontmatter { /// Known non-relationship frontmatter keys to skip (case-insensitive comparison). /// Only skip keys that can never contain wikilinks. const SKIP_KEYS: &[&str] = &[ - "is a", "aliases", "status", "cadence", "created at", "created time", + "is a", "aliases", "status", "cadence", "archived", "created at", "created time", ]; /// Check if a string contains a wikilink pattern `[[...]]`. @@ -351,6 +354,7 @@ pub fn parse_md_file(path: &Path) -> Result { status: frontmatter.status, owner: frontmatter.owner, cadence: frontmatter.cadence, + archived: frontmatter.archived.unwrap_or(false), modified_at, created_at, file_size, }) } diff --git a/src/mock-tauri.ts b/src/mock-tauri.ts index 8df180ad..4470bc76 100644 --- a/src/mock-tauri.ts +++ b/src/mock-tauri.ts @@ -575,6 +575,47 @@ A **book** you're reading or have read. Track reading progress, notes, and key t - **Author**: The book's author - **Status**: Reading, Finished, Abandoned - **Rating**: 1-5 stars +`, + // --- Archived entries --- + '/Users/luca/Laputa/project/25q3-website-redesign.md': `--- +title: Website Redesign +is_a: Project +status: Done +archived: true +owner: Luca Rossi +belongs_to: + - "[[quarter/q3-2025]]" +--- + +# Website Redesign + +Completed redesign of the company website. Migrated from WordPress to Next.js with improved performance and SEO. + +## Results +- Page load time: 4.2s → 1.1s +- Organic traffic: +35% in 3 months +- Bounce rate: 58% → 42% +`, + '/Users/luca/Laputa/experiment/twitter-thread-experiment.md': `--- +title: Twitter Thread Growth Experiment +is_a: Experiment +status: Done +archived: true +owner: Luca Rossi +related_to: + - "[[responsibility/grow-newsletter]]" +--- + +# Twitter Thread Growth Experiment + +## Hypothesis +Publishing 3 Twitter threads per week (instead of 1) will increase newsletter signups by 50%. + +## Result +After 6 weeks, signups increased by only 12%. The additional threads had diminishing returns — quality matters more than quantity. + +## Decision +Reverted to 1 high-quality thread per week. Archived this experiment. `, // --- Instances of custom types --- '/Users/luca/Laputa/recipe/pasta-carbonara.md': `--- @@ -622,6 +663,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: 'Active', owner: 'Luca Rossi', cadence: null, + archived: false, modifiedAt: Date.now() / 1000, createdAt: null, fileSize: 2048, @@ -643,6 +685,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: 'Active', owner: 'Luca Rossi', cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 3600, createdAt: null, fileSize: 1024, @@ -669,6 +712,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: 'Active', owner: 'Matteo Cellini', cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 7200, createdAt: null, fileSize: 890, @@ -689,6 +733,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: 'Active', owner: 'Luca Rossi', cadence: 'Weekly', + archived: false, modifiedAt: Date.now() / 1000 - 86400, createdAt: null, fileSize: 512, @@ -709,6 +754,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: 'Active', owner: 'Matteo Cellini', cadence: 'Weekly', + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 2, createdAt: null, fileSize: 640, @@ -729,6 +775,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: 'Active', owner: 'Luca Rossi', cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400, createdAt: null, fileSize: 3200, @@ -750,6 +797,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 3600 * 5, createdAt: null, fileSize: 847, @@ -771,6 +819,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400, createdAt: null, fileSize: 560, @@ -791,6 +840,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 7, createdAt: null, fileSize: 320, @@ -810,6 +860,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 3600 * 2, createdAt: null, fileSize: 1200, @@ -830,6 +881,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 30, createdAt: null, fileSize: 256, @@ -850,6 +902,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 14, createdAt: null, fileSize: 180, @@ -870,6 +923,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 3, createdAt: null, fileSize: 4200, @@ -890,6 +944,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 7, createdAt: null, fileSize: 3800, @@ -911,6 +966,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 10, createdAt: null, fileSize: 5100, @@ -932,6 +988,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 320, @@ -949,6 +1006,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 280, @@ -966,6 +1024,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 310, @@ -983,6 +1042,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 290, @@ -1000,6 +1060,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 200, @@ -1017,6 +1078,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 180, @@ -1034,6 +1096,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 170, @@ -1051,6 +1114,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 200, @@ -1068,6 +1132,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 90, createdAt: null, fileSize: 190, @@ -1086,6 +1151,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 30, createdAt: null, fileSize: 250, @@ -1103,6 +1169,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 30, createdAt: null, fileSize: 220, @@ -1121,6 +1188,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 5, createdAt: null, fileSize: 420, @@ -1140,6 +1208,7 @@ const MOCK_ENTRIES: VaultEntry[] = [ status: null, owner: null, cadence: null, + archived: false, modifiedAt: Date.now() / 1000 - 86400 * 14, createdAt: null, fileSize: 380, @@ -1148,6 +1217,49 @@ const MOCK_ENTRIES: VaultEntry[] = [ 'Type': ['[[type/book]]'], }, }, + // --- Archived entries --- + { + path: '/Users/luca/Laputa/project/25q3-website-redesign.md', + filename: '25q3-website-redesign.md', + title: 'Website Redesign', + isA: 'Project', + aliases: [], + belongsTo: ['[[quarter/q3-2025]]'], + relatedTo: [], + status: 'Done', + owner: 'Luca Rossi', + cadence: null, + archived: true, + modifiedAt: Date.now() / 1000 - 86400 * 120, + createdAt: null, + fileSize: 680, + snippet: 'Completed redesign of the company website. Migrated from WordPress to Next.js with improved performance and SEO.', + relationships: { + 'Belongs to': ['[[quarter/q3-2025]]'], + 'Type': ['[[type/project]]'], + }, + }, + { + path: '/Users/luca/Laputa/experiment/twitter-thread-experiment.md', + filename: 'twitter-thread-experiment.md', + title: 'Twitter Thread Growth Experiment', + isA: 'Experiment', + aliases: [], + belongsTo: [], + relatedTo: ['[[responsibility/grow-newsletter]]'], + status: 'Done', + owner: 'Luca Rossi', + cadence: null, + archived: true, + modifiedAt: Date.now() / 1000 - 86400 * 90, + createdAt: null, + fileSize: 520, + snippet: 'Publishing 3 Twitter threads per week instead of 1 will increase newsletter signups by 50%. Result: only 12% increase.', + relationships: { + 'Related to': ['[[responsibility/grow-newsletter]]'], + 'Type': ['[[type/experiment]]'], + }, + }, ] function mockFileHistory(path: string): GitCommit[] { diff --git a/src/types.ts b/src/types.ts index 0f15d9eb..b0427e04 100644 --- a/src/types.ts +++ b/src/types.ts @@ -9,6 +9,7 @@ export interface VaultEntry { status: string | null owner: string | null cadence: string | null + archived: boolean modifiedAt: number | null createdAt: number | null fileSize: number @@ -32,7 +33,7 @@ export interface ModifiedFile { } export type SidebarSelection = - | { kind: 'filter'; filter: 'all' | 'favorites' } + | { kind: 'filter'; filter: 'all' | 'favorites' | 'archived' } | { kind: 'sectionGroup'; type: string } | { kind: 'entity'; entry: VaultEntry } | { kind: 'topic'; entry: VaultEntry }