0011: Keyword search only (remove QMD semantic indexing)
0012: Underscore convention for system properties
0013: BlockNote as the rich text editor
0014: Wikilink-based relationship model
0015: Note type system (types as files)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
0006: Flat vault structure (title = filename)
0007: Opt-in telemetry via Sentry and PostHog
0008: Canary release channel for early testing
0009: Local feature flags (no remote dependency)
0010: CodeScene code health gates in CI and git hooks
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- docs/adr/README.md: format spec, rules, index
- 0001: Tauri v2 + React stack
- 0002: filesystem as source of truth
- 0003: single note model (no tabs)
- 0004: vault vs app settings storage
- 0005: Tauri iOS for iPad (vs SwiftUI)
- CLAUDE.md: ADR process — when to read, when to create, when to supersede
BUILD SUCCEEDED on aarch64-sim. App installs and launches on iPad Pro 13"
simulator (iOS 18.3.1). React UI renders correctly in WKWebView — telemetry
consent dialog confirmed with proper styling, fonts, and button layout.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Initialize Tauri iOS support with conditional compilation:
- Desktop-only features (git CLI, menu, MCP, Claude CLI) gated behind #[cfg(desktop)]
- Mobile stubs return graceful errors so frontend degrades smoothly
- Vault read/write, AI chat, search, settings work unchanged on both platforms
- Xcode project generated, Rust cross-compiles cleanly to aarch64-apple-ios-sim
- All 581 Rust tests and 2201 frontend tests still pass
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Reverts commits 47b5e45, 5c76939, 1eecae0, 660208a, 86a9f65, 259d5b6.
Removes PinnedPropertiesBar, usePinnedProperties hook, Rust backend
for _pinned_properties, and all related tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add update_channel setting (stable/canary) to Settings with UI toggle.
Stable channel uses Tauri updater plugin; canary fetches latest-canary.json
and opens GitHub release page for manual download. Add useFeatureFlag()
hook with localStorage overrides and compile-time defaults (no remote
dependencies). Add release-canary.yml CI workflow for canary branch builds.
Update stable workflow to preserve latest-canary.json on GH Pages.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Also adds Playwright smoke test for consent dialog and mock handler
for reinit_telemetry command.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Document the "key:icon" string format used for _pinned_properties
in the system properties section and add it to the Type document
properties table.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove the entire QMD search engine (semantic indexing, hybrid search,
vector embeddings) and replace with a simple walkdir-based keyword
search. QMD never worked reliably in production, added bundle bloat,
and showed "Index failed" in the status bar.
What changed:
- Rust: deleted indexing.rs, rewrote search.rs as pure keyword search
- Frontend: removed useIndexing hook, IndexingBadge, hybrid search
- Menu: removed "Reindex Vault" command from palette and menu bar
- Config: removed qmd from bundle resources and build script
- Deleted tools/qmd/ (QMD CLI tool, MCP server, tests)
- Updated docs (ARCHITECTURE, ABSTRACTIONS, GETTING-STARTED)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Repair Vault was creating config/ui.config.md inside a config/ subdirectory.
All vault config files should live at vault root (flat structure). Changed
config_path() to point to vault root, added migrate_ui_config_to_root() for
legacy migration, and wired it into both startup and repair_vault flows.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When push is rejected due to remote having newer commits, the bottom bar
now shows "Pull required" (orange). Clicking it pulls then auto-pushes.
Conflicted notes show an inline banner with "Keep mine" / "Keep theirs"
buttons. A new "Pull from Remote" command is available in Cmd+K and the
Vault menu. Clicking the sync badge opens a popup showing branch name,
ahead/behind counts, and a Pull button.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add multi-window support: notes can be opened in dedicated secondary
Tauri windows with editor-only layout (no sidebar, no note list).
Triggers: Cmd+Shift+Click on notes, Cmd+K → "Open in New Window",
Cmd+Shift+O shortcut, Note → "Open in New Window" menu bar item.
Secondary windows have their own auto-save, theme, and wikilink
navigation. Closing a secondary window does not affect the main window.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Repair Vault command now runs flatten_vault() and migrate_is_a_to_type()
before restoring themes and config, ensuring vaults adopt flat structure.
Also fixes config.md type definition to use `type: Type` instead of
legacy `Is A: Type`.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Editor mode is now stored as a global preference in VaultConfig instead of
being tracked per-tab. Toggling raw mode persists across tab switches and
app restarts via the editor_mode field in config/ui.config.md.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Covers note creation via Cmd+N, unique naming, note selection, and
inspector rendering. Also documents frontmatterOps in ARCHITECTURE.md.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extract note creation (CRUD, daily notes, types, optimistic persistence) into
useNoteCreation and rename operations into useNoteRename. useNoteActions now
composes both hooks plus frontmatter/navigation logic.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- scan_vault now scans root + protected folders only (no deep recursion)
- vault_health_check command detects stray files and title mismatches
- Wikilink resolution: multi-pass with filename stem priority
- TitleField: dedicated title UI above editor, H1 hidden via CSS
- Migration banner: detects subfolders on vault open, offers flatten
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Simplify flatten_vault API to return usize instead of MigrationResult struct
- Add KEEP_FOLDERS: attachments/ and _themes/ alongside type/, config/, theme/
- Use HashSet for collision tracking in unique_filename
- Update wikilinks from path-based [[folder/slug]] to title-based [[slug]]
- Clean up empty directories after flattening
- Flatten demo-vault-v2: move all notes from type-based subfolders to root
- Update smoke tests for flat vault structure
- Remove migrate_to_flat_vault from repair_vault (one-time migration only)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Refactor useClosedTabHistory to store full VaultEntry (not stub) for reliable reopening
- Add data-tab-path attribute to TabItem for precise Playwright selectors
- Add 2 Playwright smoke tests: single close/reopen and empty-history no-op
- Update ARCHITECTURE.md and ABSTRACTIONS.md with closed tab history docs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add batch_delete_notes and empty_trash to Tauri IPC commands table
(62 → 64 total). Create placeholder design file for the feature.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reload Vault (Cmd+K) now calls the new `reload_vault` Tauri command which
deletes the cache file before scanning, guaranteeing a full filesystem
rescan. Previously it called `list_vault` which used incremental git-based
cache updates that could miss recent changes (e.g. trashing a note then
reloading showed stale data).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move updateEntry() calls after handleUpdateFrontmatter/handleDeleteProperty
in handleCustomizeType, handleRenameSection, and handleToggleTypeVisibility
so React state only updates after the disk write succeeds. This prevents
state-disk divergence when writes fail.
Expand ARCHITECTURE.md "Three representations, one authority" section with
ownership rules, invariants table, and recovery mechanisms. Add
reload_vault_entry to the commands table (62 total).
Add Playwright smoke test for Reload Vault in Cmd+K palette.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Any frontmatter field whose value contains [[wikilinks]] now renders as a
relationship chip automatically. Fields with plain-text values always render
as editable properties, even if they were formerly hardcoded relationship keys.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cache files are now stored outside the vault directory at
~/.laputa/cache/<vault-hash>.json, preventing them from polluting
the user's git repo. Writes use atomic tmp+rename to avoid corruption.
Legacy .laputa-cache.json files are auto-migrated and cleaned up on
first run.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Laputa as proof-of-work for Refactoring's credibility:
- Building publicly validates the author's authority to write about
building software with AI (not theory — demonstrated practice)
- Open source makes the work visible: GitHub commits are public evidence
- Success converts to reputation/acquisition for Refactoring via
sponsorships, paid subs, and brand authority
- Strategy: build the tool you describe, make the work visible
Strongest possible answer to 'why are you the right person to build this':
- Generalist CTO who can build end-to-end
- 300+ articles = battle-tested PKM system at scale
- Refactoring distribution (~200K subscribers) = built-in audience
- Not theorized — the method is proven by the output that exists
The capture→organize→express framework is output-agnostic:
- Writers: evergreen notes as building blocks for articles
- Builders: project knowledge graph and shipped work
- Operators: procedures and responsibility systems
What varies is the expression layer; the discipline is universal.
Two additions from Luca's published essays on note-taking:
- 'Knowledge has a purpose' section: notes exist to get things done,
not for abstract future use. Without purpose, the system collapses.
- Evergreen notes concept: atomic, timeless, reusable units of thought.
The most valuable layer of a mature vault.
- Organize phase clarified: weekly cadence, deleting >50% of captures
is normal and healthy, not a failure.
Complete rewrite structured around three pillars:
1. The problem (architectural + methodological)
2. The method (ontology, capture/organize, convention over configuration)
3. The foundation (local files, Git, AI-native architecture)
Key improvement: the document now explains *why* tool and method together
is the differentiating insight — not just a list of features and principles.
Includes the three-stage product trajectory and updated design principles.
Current state section condensed; full roadmap moved to ROADMAP.md.
VISION.md:
- New section 'The two-phase knowledge workflow: capture and organize'
- Explains capture (fast, frictionless, everywhere) vs organize (deliberate,
periodic) as fundamentally different activities
- Defines Inbox: a smart filter showing notes with no outgoing relationships
- Inbox Zero as the goal; connecting a note removes it automatically
- Replaces 'All Notes' as the primary navigation section
ROADMAP.md:
- New strategic direction #4: Inbox and capture pipeline
- Covers inbox UI, capture integrations (Chrome ext, iPhone, Readwise, voice)
- Add 'Product trajectory' section: 3 stages from personal PKM → indie
knowledge workers → small teams, with rationale for why the same
foundational model (local files + Git) enables all three stages
- Note that the knowledge ontology (Projects/Responsibilities/Procedures/
Notes/People/Events) maps equally well to personal and organizational use
- Describe workspace feature as the seed for future team access control
- Update design principles: add convention over configuration, semantic
properties, filesystem as source of truth; expand AI-native principle
to include AI-readability via shared conventions
- ARCHITECTURE.md: new Design Principles section covering filesystem as
source of truth, convention over configuration, no hardcoded exceptions,
AI-first knowledge graph, and three-representation model
- ABSTRACTIONS.md: design philosophy intro + semantic field names table
documenting all conventional frontmatter fields and their UI behavior
Convention over configuration principle explicitly noted as serving
AI-readability: shared conventions make vaults navigable by AI agents
without bespoke per-vault instructions.
When viewing a Type note (e.g. "Project"), the Properties panel now shows
an Instances section listing all notes of that type, sorted by modified_at
descending. Trashed instances are excluded, archived instances are dimmed.
Display capped at 50 with count badge for large collections.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The frontmatter field for entity type is now 'type:' (not 'Is A:').
The Rust parser accepts both via serde alias, but all documentation,
examples, and new code should use 'type:'.
Updated: ABSTRACTIONS.md, ARCHITECTURE.md, PROJECT-SPEC.md, GETTING-STARTED.md
Updated all three docs to reflect significant features added since they were last written:
- AI agent panel (Claude CLI subprocess with tool execution + NDJSON streaming)
- Vault cache system (git-based incremental caching in cache.rs)
- Theme system (vault-based themes, useThemeManager, ThemePropertyEditor)
- Search & indexing (qmd integration, keyword/semantic/hybrid modes)
- Pulse view (git activity feed with pagination)
- GitHub OAuth (device flow, vault clone/create)
- Vault management (multi-vault, vault config, onboarding, WelcomeScreen)
- Raw editor mode (CodeMirror 6 alternative)
- Command palette (Cmd+K registry)
- Auto-sync & conflict resolution
Also added mandatory docs-update rule to CLAUDE.md: docs/ files must be
updated in the same commit as significant feature changes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>