974 lines
17 KiB
Markdown
974 lines
17 KiB
Markdown
---
|
||
created: 2026-09-15 14:38
|
||
modified: 2026-09-15 14:38
|
||
type: note
|
||
tags: []
|
||
aliases: []
|
||
---
|
||
# [[Obsidian Vault Corodination System]]
|
||
|
||
You’re describing a **vault coordination system**: a structured layer that understands the vault, applies organization rules, and exposes the same capabilities to a UI, APIs, and AI agents.
|
||
|
||
The key design decision is:
|
||
|
||
> A note should have one canonical identity, but it may belong to many areas, projects, subjects, and indexes.
|
||
|
||
That avoids duplicating notes merely because they appear in multiple parts of your system.
|
||
|
||
---
|
||
|
||
# 1. Recommended conceptual model
|
||
|
||
Treat the vault as having three layers:
|
||
|
||
## A. Canonical content
|
||
|
||
These are the actual notes:
|
||
|
||
- `Vorta.md`
|
||
- `Network Topology.md`
|
||
- `Garage Backup.md`
|
||
- `AI Resume.md`
|
||
- `Offsite S3 Backup.md`
|
||
|
||
Each note has:
|
||
|
||
- A stable ID
|
||
- A title
|
||
- A type
|
||
- Content
|
||
- Frontmatter/properties
|
||
- Links to other notes
|
||
- Optional files and attachments
|
||
|
||
The canonical note should normally exist only once.
|
||
|
||
## B. Classification and relationships
|
||
|
||
A note can have multiple relationships.
|
||
|
||
For example:
|
||
|
||
```text
|
||
Vorta
|
||
├── belongs to: Tools / Software / Backup
|
||
├── supports: Garage Backup
|
||
├── supports: Offsite S3 Backup
|
||
├── related to: Backup Strategy
|
||
├── used by: Home Lab
|
||
└── documented in: System Tools
|
||
```
|
||
|
||
This is more flexible than forcing every note into one folder.
|
||
|
||
Useful relationship types include:
|
||
|
||
- `member_of`
|
||
- `supports`
|
||
- `depends_on`
|
||
- `related_to`
|
||
- `part_of`
|
||
- `used_by`
|
||
- `documents`
|
||
- `replaces`
|
||
- `stored_on`
|
||
- `backup_of`
|
||
|
||
## C. Navigation notes
|
||
|
||
These are Obsidian notes that provide human-friendly organization:
|
||
|
||
- `TABLE OF CONTENTS.md`
|
||
- `PROJECTS.md`
|
||
- `AREAS.md`
|
||
- `PERSONAL FAMILY.md`
|
||
- `TOOLS SOFTWARE WEBUI.md`
|
||
- `DEV OPS.md`
|
||
|
||
They can contain links to canonical notes.
|
||
|
||
For example:
|
||
|
||
```markdown
|
||
# Tools / Software / Web UI
|
||
|
||
- [[Obsidian]]
|
||
- [[Grafana]]
|
||
- [[Vorta]]
|
||
- [[Backup Dashboard]]
|
||
```
|
||
|
||
This means a note can appear in several navigation notes without being copied.
|
||
|
||
---
|
||
|
||
# 2. Hierarchy versus classification
|
||
|
||
Your example exposes an important distinction.
|
||
|
||
You may want:
|
||
|
||
```text
|
||
PROJECTS
|
||
└── Tools / Software / Web UI
|
||
```
|
||
|
||
But you may also want:
|
||
|
||
```text
|
||
AREAS
|
||
└── Dev Ops
|
||
└── Vorta
|
||
```
|
||
|
||
This is not really a single hierarchy. It is a **multi-dimensional classification system**.
|
||
|
||
A better model would allow:
|
||
|
||
```yaml
|
||
---
|
||
type: tool
|
||
title: Vorta
|
||
status: active
|
||
classifications:
|
||
- tools/software/backup
|
||
- tools/software/web-ui
|
||
- areas/dev-ops
|
||
related_projects:
|
||
- garage-backup
|
||
- offsite-s3-backup
|
||
---
|
||
```
|
||
|
||
You could represent this using:
|
||
|
||
1. Frontmatter properties
|
||
2. Wiki links
|
||
3. Database relationships
|
||
4. Generated index notes
|
||
|
||
The database can store these relationships in a normalized form, while Obsidian displays them as links.
|
||
|
||
---
|
||
|
||
# 3. Suggested object types
|
||
|
||
You do not need to start with dozens of types. A small set should cover most of your needs.
|
||
|
||
## Core types
|
||
|
||
### Area
|
||
|
||
An ongoing responsibility or domain.
|
||
|
||
Examples:
|
||
|
||
- Dev Ops
|
||
- Home Lab
|
||
- Personal Family
|
||
- Finance
|
||
- Health
|
||
- Household
|
||
|
||
Areas do not have a defined completion date.
|
||
|
||
### Project
|
||
|
||
A result with a desired outcome.
|
||
|
||
Examples:
|
||
|
||
- AI Resume
|
||
- Garage Backup
|
||
- Migrate Home Lab
|
||
- Build Backup Dashboard
|
||
|
||
Projects can have:
|
||
|
||
- Status
|
||
- Owner
|
||
- Start date
|
||
- Target date
|
||
- Tasks
|
||
- Related areas
|
||
- Related tools
|
||
|
||
### Tool
|
||
|
||
A piece of software, hardware, service, or utility.
|
||
|
||
Examples:
|
||
|
||
- Vorta
|
||
- Obsidian
|
||
- Grafana
|
||
- S3
|
||
- Proxmox
|
||
- Backup scripts
|
||
|
||
### System
|
||
|
||
A larger operational system.
|
||
|
||
Examples:
|
||
|
||
- Home Lab
|
||
- Backup System
|
||
- Network Infrastructure
|
||
- Media System
|
||
|
||
### Resource or Subject
|
||
|
||
A topic, concept, or collection of reference information.
|
||
|
||
Examples:
|
||
|
||
- Network Topology
|
||
- Hard Drives
|
||
- Linux
|
||
- Obsidian
|
||
- S3 Storage
|
||
|
||
### Asset
|
||
|
||
A physical or logical thing that needs tracking.
|
||
|
||
Examples:
|
||
|
||
- NAS
|
||
- Server
|
||
- Hard drive
|
||
- Router
|
||
- Garage storage device
|
||
- Cloud bucket
|
||
|
||
### Index or Collection
|
||
|
||
A navigation or overview note.
|
||
|
||
Examples:
|
||
|
||
- Table of Contents
|
||
- Projects
|
||
- Areas
|
||
- System Tools
|
||
- Web UI Tools
|
||
|
||
These are not necessarily “content” themselves. They are curated views over other objects.
|
||
|
||
---
|
||
|
||
# 4. The database should be an index, not necessarily the source of truth
|
||
|
||
For an Obsidian-centered system, I would recommend:
|
||
|
||
> Markdown files remain the source of truth. The database is a searchable, relational index and coordination layer.
|
||
|
||
That gives you the benefits of a database without making the vault dependent on it.
|
||
|
||
The database can store:
|
||
|
||
- File paths
|
||
- Note IDs
|
||
- Titles
|
||
- Types
|
||
- Frontmatter
|
||
- Tags
|
||
- Headings
|
||
- Outgoing links
|
||
- Backlinks
|
||
- Relationships
|
||
- Tasks
|
||
- Modification times
|
||
- Content hashes
|
||
- Extracted summaries
|
||
- Embeddings, if later needed
|
||
- Audit history
|
||
- Rule results
|
||
- Validation warnings
|
||
|
||
The tool can rescan or rebuild the database from the vault if necessary.
|
||
|
||
## Example conceptual schema
|
||
|
||
```text
|
||
notes
|
||
-----
|
||
id
|
||
path
|
||
title
|
||
type
|
||
status
|
||
created_at
|
||
modified_at
|
||
content_hash
|
||
|
||
properties
|
||
----------
|
||
note_id
|
||
key
|
||
value
|
||
|
||
relationships
|
||
-------------
|
||
source_note_id
|
||
relationship_type
|
||
target_note_id
|
||
|
||
tags
|
||
----
|
||
note_id
|
||
tag
|
||
|
||
headings
|
||
--------
|
||
note_id
|
||
heading
|
||
level
|
||
|
||
links
|
||
-----
|
||
source_note_id
|
||
target_note_id
|
||
link_text
|
||
|
||
tasks
|
||
-----
|
||
note_id
|
||
task_text
|
||
status
|
||
due_date
|
||
```
|
||
|
||
This structure gives the tool a broad understanding of the vault without reading every full document on every request.
|
||
|
||
---
|
||
|
||
# 5. SQLite, DuckDB, or PostgreSQL?
|
||
|
||
## SQLite — best initial choice
|
||
|
||
SQLite is probably the best fit for your first version.
|
||
|
||
Advantages:
|
||
|
||
- Local and simple
|
||
- No database server to operate
|
||
- Excellent for CRUD
|
||
- Good indexing and full-text search
|
||
- Supports transactions
|
||
- Easy to back up
|
||
- Works well with a single local application
|
||
- Suitable for thousands or tens of thousands of notes
|
||
- Easy to embed in a desktop or local web application
|
||
|
||
SQLite can handle:
|
||
|
||
- Note metadata
|
||
- Relationships
|
||
- Search indexes
|
||
- Rules
|
||
- Audit records
|
||
- Tasks
|
||
- Graph data
|
||
- Full-text search using FTS5
|
||
|
||
For your use case, the database is likely not going to be too large. The vault content may be large, but the metadata and indexes are still very manageable.
|
||
|
||
## DuckDB — excellent for analysis, less ideal as the main application database
|
||
|
||
DuckDB is particularly good for:
|
||
|
||
- Reporting
|
||
- Large analytical queries
|
||
- Activity analysis
|
||
- Statistics
|
||
- Historical data
|
||
- Exporting data to Parquet
|
||
- Exploring vault structure
|
||
|
||
Examples:
|
||
|
||
- Which areas have not been updated recently?
|
||
- Which projects have the most linked notes?
|
||
- Which tools have no documentation?
|
||
- Which systems have no backup relationship?
|
||
- How many notes changed each month?
|
||
|
||
However, DuckDB is not my first choice for the primary CRUD coordination database. SQLite has a more natural role as an application database.
|
||
|
||
You could eventually use both:
|
||
|
||
```text
|
||
SQLite: operational application database
|
||
DuckDB: optional analytics/reporting database
|
||
```
|
||
|
||
But do not begin with both unless you already need analytical reporting.
|
||
|
||
## PostgreSQL — useful if the system grows into a shared service
|
||
|
||
PostgreSQL becomes attractive when you need:
|
||
|
||
- Multiple concurrent users
|
||
- Multiple application services
|
||
- Remote access
|
||
- More complex permissions
|
||
- Many external integrations
|
||
- Large-scale event history
|
||
- Vector search extensions
|
||
- Background workers and queues
|
||
|
||
For a local, single-user home-lab system, it may add operational overhead without giving you much benefit initially.
|
||
|
||
## Recommendation
|
||
|
||
Start with:
|
||
|
||
```text
|
||
Markdown vault: source of truth
|
||
SQLite: metadata, relationships, search, rules, audit
|
||
Optional later:
|
||
DuckDB: analytics
|
||
PostgreSQL: only if the system becomes a multi-service platform
|
||
```
|
||
|
||
---
|
||
|
||
# 6. How Graphify fits
|
||
|
||
Graphify should be treated primarily as a **visual exploration and discovery layer**, not as the system’s main database.
|
||
|
||
Its likely strengths are:
|
||
|
||
- Showing connections between notes
|
||
- Making clusters visible
|
||
- Revealing isolated notes
|
||
- Showing heavily connected notes
|
||
- Helping discover unexpected relationships
|
||
- Providing a visual way to navigate the vault
|
||
|
||
Your coordination tool can complement Graphify by maintaining explicit relationships such as:
|
||
|
||
```text
|
||
Vorta --supports--> Garage Backup
|
||
Vorta --supports--> Offsite S3 Backup
|
||
Garage Backup --uses--> S3
|
||
Garage Backup --protects--> Home Lab
|
||
```
|
||
|
||
Graphify can then visualize the links already present in the vault.
|
||
|
||
## Make relationships visible in Obsidian
|
||
|
||
The tool should write relationships into standard Obsidian-compatible formats:
|
||
|
||
### Wiki links
|
||
|
||
```markdown
|
||
## Related Systems
|
||
|
||
- Supports: [[Garage Backup]]
|
||
- Supports: [[Offsite S3 Backup]]
|
||
- Used by: [[Home Lab]]
|
||
```
|
||
|
||
### Frontmatter
|
||
|
||
```yaml
|
||
---
|
||
type: tool
|
||
supports:
|
||
- "[[Garage Backup]]"
|
||
- "[[Offsite S3 Backup]]"
|
||
used_by:
|
||
- "[[Home Lab]]"
|
||
---
|
||
```
|
||
|
||
### Dataview-style fields, if you use Dataview
|
||
|
||
```yaml
|
||
---
|
||
type: tool
|
||
area:
|
||
- "[[Dev Ops]]"
|
||
category:
|
||
- "[[Tools Software WebUI]]"
|
||
---
|
||
```
|
||
|
||
The exact format depends on the Obsidian plugins you use, but the principle is important:
|
||
|
||
> The relationships should remain understandable in ordinary Markdown, even if your custom tool is unavailable.
|
||
|
||
## Graphify should not be the only representation
|
||
|
||
A visual graph is useful, but it is not ideal for:
|
||
|
||
- Enforcing required fields
|
||
- Finding stale notes
|
||
- Applying classification rules
|
||
- Maintaining canonical identities
|
||
- Managing projects
|
||
- Generating indexes
|
||
- Auditing changes
|
||
|
||
Your tool can provide the structured intelligence, while Graphify provides visual exploration.
|
||
|
||
---
|
||
|
||
# 7. Rules and automatic placement
|
||
|
||
You want rules such as:
|
||
|
||
> If something is a software tool with a web interface, include it under Tools / Software / Web UI.
|
||
|
||
And:
|
||
|
||
> If it relates to operational maintenance, include it under Areas / Dev Ops.
|
||
|
||
These should be modeled as **classification rules**, not hardcoded folder logic.
|
||
|
||
## Example rule
|
||
|
||
```yaml
|
||
name: classify-web-tools
|
||
when:
|
||
type: tool
|
||
properties:
|
||
interface: web
|
||
then:
|
||
add_membership:
|
||
- tools/software/web-ui
|
||
```
|
||
|
||
Another:
|
||
|
||
```yaml
|
||
name: classify-devops-tools
|
||
when:
|
||
type: tool
|
||
tags:
|
||
includes: devops
|
||
OR:
|
||
relationships:
|
||
includes: operational-system
|
||
then:
|
||
add_membership:
|
||
- areas/dev-ops
|
||
```
|
||
|
||
A note can match multiple rules.
|
||
|
||
## Rule results should be explainable
|
||
|
||
The system should be able to say:
|
||
|
||
```text
|
||
Vorta appears under:
|
||
- Tools / Software / Backup
|
||
Reason: type = tool, category = backup
|
||
- Tools / Software / Web UI
|
||
Reason: interface = web
|
||
- Areas / Dev Ops
|
||
Reason: supports operational backup systems
|
||
```
|
||
|
||
This is particularly important when AI agents are creating or modifying notes.
|
||
|
||
## Manual overrides
|
||
|
||
Automatic rules should not remove a deliberate human classification without confirmation.
|
||
|
||
Use three categories:
|
||
|
||
- `automatic`
|
||
- `manual`
|
||
- `excluded`
|
||
|
||
For example:
|
||
|
||
```text
|
||
Vorta → Areas / Dev Ops
|
||
source: manual
|
||
```
|
||
|
||
or:
|
||
|
||
```text
|
||
Vorta → Personal / Miscellaneous
|
||
source: excluded
|
||
```
|
||
|
||
This lets the system learn your preferences without becoming unpredictable.
|
||
|
||
---
|
||
|
||
# 8. Generated indexes versus hand-maintained indexes
|
||
|
||
You have two reasonable options.
|
||
|
||
## Option A: Fully generated indexes
|
||
|
||
The tool regenerates:
|
||
|
||
```text
|
||
TOOLS SOFTWARE WEBUI.md
|
||
```
|
||
|
||
from database memberships.
|
||
|
||
Advantages:
|
||
|
||
- Always consistent
|
||
- No stale links
|
||
- Easy for agents
|
||
- Minimal manual work
|
||
|
||
Disadvantages:
|
||
|
||
- Manual additions may be overwritten
|
||
- Less room for commentary
|
||
- Generated files can feel rigid
|
||
|
||
## Option B: Hybrid indexes
|
||
|
||
The tool manages a marked section:
|
||
|
||
```markdown
|
||
# Tools / Software / Web UI
|
||
|
||
This collection contains tools with a browser-based interface.
|
||
|
||
<!-- BEGIN GENERATED CONTENT -->
|
||
|
||
- [[Obsidian]]
|
||
- [[Grafana]]
|
||
- [[Vorta]]
|
||
|
||
<!-- END GENERATED CONTENT -->
|
||
|
||
## Notes
|
||
|
||
Personal commentary goes here.
|
||
```
|
||
|
||
This is probably the best option.
|
||
|
||
The system controls the generated portion while preserving your explanation and notes.
|
||
|
||
---
|
||
|
||
# 9. CRUD design
|
||
|
||
The tool should expose CRUD at the level of meaningful vault objects, not just raw files.
|
||
|
||
## Create
|
||
|
||
Examples:
|
||
|
||
- Create a project from a template
|
||
- Add a new tool
|
||
- Add a machine
|
||
- Add a backup target
|
||
- Add a relationship
|
||
- Add an area
|
||
- Add a subject
|
||
|
||
The tool should ask or infer:
|
||
|
||
- Type
|
||
- Name
|
||
- Location
|
||
- Required properties
|
||
- Related objects
|
||
- Applicable rules
|
||
- Template
|
||
|
||
## Read
|
||
|
||
Useful read operations include:
|
||
|
||
- Get a note
|
||
- Search the vault
|
||
- Search by type
|
||
- Find all notes in an area
|
||
- Find all projects using a tool
|
||
- Find systems without backups
|
||
- Get a dependency tree
|
||
- Get a graph neighborhood
|
||
- Get recently changed notes
|
||
- Get stale or incomplete notes
|
||
|
||
## Update
|
||
|
||
Updates should be property-aware where possible.
|
||
|
||
For example:
|
||
|
||
```text
|
||
Update Vorta:
|
||
- Add membership: Areas / Dev Ops
|
||
- Add relationship: supports → Garage Backup
|
||
- Set status: active
|
||
- Add official URL
|
||
```
|
||
|
||
This is safer than asking an agent to rewrite the entire Markdown document.
|
||
|
||
## Delete
|
||
|
||
Deletion should be treated carefully:
|
||
|
||
1. Identify the note
|
||
2. Show inbound links
|
||
3. Check dependent relationships
|
||
4. Move to a trash/archive location
|
||
5. Record the operation
|
||
6. Optionally clean or preserve links
|
||
|
||
For important notes, “archive” is often safer than immediate deletion.
|
||
|
||
---
|
||
|
||
# 10. Broad vault understanding
|
||
|
||
The tool should maintain several levels of understanding.
|
||
|
||
## Level 1: Structural understanding
|
||
|
||
Fast and reliable:
|
||
|
||
- Files
|
||
- Paths
|
||
- Titles
|
||
- Types
|
||
- Properties
|
||
- Tags
|
||
- Links
|
||
- Headings
|
||
- Tasks
|
||
- Modification dates
|
||
|
||
## Level 2: Relational understanding
|
||
|
||
Derived from explicit links and rules:
|
||
|
||
- What supports what
|
||
- What belongs to which area
|
||
- What projects use a tool
|
||
- Which machines store which backups
|
||
- Which systems have dependencies
|
||
|
||
## Level 3: Semantic understanding
|
||
|
||
Optional AI-generated information:
|
||
|
||
- Short summary
|
||
- Key topics
|
||
- Important entities
|
||
- Suggested relationships
|
||
- Possible duplicate notes
|
||
- Missing documentation
|
||
- Confidence score
|
||
|
||
Do not rely only on Level 3. AI summaries can become stale or incorrect. Store them as derived metadata, and allow regeneration.
|
||
|
||
## Context retrieval for agents
|
||
|
||
Rather than giving an AI the whole vault, provide context in layers:
|
||
|
||
1. The requested note
|
||
2. Direct relationships
|
||
3. Parent areas and projects
|
||
4. Relevant index notes
|
||
5. Related notes selected by search
|
||
6. Optional semantic matches
|
||
|
||
For example, an agent asking about Vorta might receive:
|
||
|
||
```text
|
||
Canonical note: Vorta
|
||
Type: Tool
|
||
Memberships:
|
||
- Tools / Software / Backup
|
||
- Tools / Software / Web UI
|
||
- Areas / Dev Ops
|
||
|
||
Related:
|
||
- Garage Backup
|
||
- Offsite S3 Backup
|
||
- Home Lab
|
||
- Backup Strategy
|
||
```
|
||
|
||
This gives the agent a useful overview without loading the entire vault.
|
||
|
||
---
|
||
|
||
# 11. Suggested user interface
|
||
|
||
The interface could have the following sections.
|
||
|
||
## Dashboard
|
||
|
||
- Recently changed notes
|
||
- Unclassified notes
|
||
- Broken links
|
||
- Duplicate candidates
|
||
- Projects needing updates
|
||
- Systems without backups
|
||
- Notes with missing required fields
|
||
|
||
## Objects
|
||
|
||
Browse by type:
|
||
|
||
- Areas
|
||
- Projects
|
||
- Tools
|
||
- Systems
|
||
- Assets
|
||
- Subjects
|
||
- Indexes
|
||
|
||
## Classification editor
|
||
|
||
For each note:
|
||
|
||
```text
|
||
Vorta
|
||
|
||
Type:
|
||
[Tool]
|
||
|
||
Members:
|
||
[x] Tools / Software / Backup
|
||
[x] Tools / Software / Web UI
|
||
[x] Areas / Dev Ops
|
||
|
||
Relationships:
|
||
Supports:
|
||
[x] Garage Backup
|
||
[x] Offsite S3 Backup
|
||
|
||
Rules matched:
|
||
- Web interface tool
|
||
- Backup software
|
||
- Dev Ops operational tool
|
||
```
|
||
|
||
## Rule editor
|
||
|
||
Allow rules such as:
|
||
|
||
- If type is `tool`, require `status`
|
||
- If type is `asset`, require `location`
|
||
- If a project is active, require `next_action`
|
||
- If a backup system exists, require a retention policy
|
||
- If a tool is in Dev Ops, require an operational note
|
||
|
||
## Vault health
|
||
|
||
- Orphaned notes
|
||
- Missing metadata
|
||
- Invalid links
|
||
- Duplicate titles
|
||
- Empty project notes
|
||
- Unused tags
|
||
- Notes not classified into any area
|
||
- Notes classified into too many unrelated categories
|
||
|
||
---
|
||
|
||
# 12. Proposed initial architecture
|
||
|
||
A practical first version could be:
|
||
|
||
```text
|
||
Obsidian vault
|
||
↓
|
||
Vault scanner/parser
|
||
↓
|
||
SQLite index
|
||
↓
|
||
Classification and relationship engine
|
||
↓
|
||
UI + CRUD service
|
||
↓
|
||
Generated navigation notes
|
||
```
|
||
|
||
Later:
|
||
|
||
```text
|
||
AI agents / n8n / LangGraph / coding agents
|
||
↓
|
||
API or MCP layer
|
||
↓
|
||
Coordination service
|
||
```
|
||
|
||
The API and MCP should expose domain operations such as:
|
||
|
||
```text
|
||
create_project()
|
||
create_tool()
|
||
find_notes()
|
||
get_context()
|
||
add_relationship()
|
||
classify_note()
|
||
update_properties()
|
||
generate_index()
|
||
validate_vault()
|
||
archive_note()
|
||
```
|
||
|
||
This is preferable to exposing only low-level operations like:
|
||
|
||
```text
|
||
read_file()
|
||
write_file()
|
||
delete_file()
|
||
```
|
||
|
||
Low-level file operations can still exist, but domain-level operations make the system much safer and easier for AI agents to use.
|
||
|
||
---
|
||
|
||
# 13. Recommended first release
|
||
|
||
Keep the first version focused:
|
||
|
||
1. Scan the vault
|
||
2. Build a SQLite index
|
||
3. Parse frontmatter, tags, headings, and links
|
||
4. Define note types
|
||
5. Create and edit notes through templates
|
||
6. Store memberships and relationships
|
||
7. Generate or update index notes
|
||
8. Add full-text search
|
||
9. Add rule-based classification
|
||
10. Provide a basic UI
|
||
11. Add API/MCP after the domain model is stable
|
||
|
||
Do not begin with embeddings, complex graph databases, or a full autonomous AI organizer. First make the structured model reliable.
|
||
|
||
## Overall recommendation
|
||
|
||
Use:
|
||
|
||
- **Markdown and Obsidian links** for durable human-readable content
|
||
- **SQLite** for the operational index and relationship model
|
||
- **Rules** for repeatable classification
|
||
- **Generated/hybrid index notes** for navigation
|
||
- **Graphify** for visual exploration of the resulting links
|
||
- **API/MCP** as a domain-level interface for agents
|
||
- **Optional DuckDB later** for analytics and vault reporting
|
||
|
||
The central principle should be:
|
||
|
||
> One canonical note, many meaningful relationships, multiple generated views.copy
|
||
|