🏗️ Guía: Reconstrucción Arquitectónica de Obsidian con REA
Objetivo del Documento
Hoja de ruta técnica para descomponer, analizar mediante ingeniería inversa asistida por IA (rea-reverse-engineering) y reconstruir las funciones esenciales de Obsidian en un stack moderno de alto rendimiento (Clean-Room Design).
⚠️ Realidad Técnica vs. Expectativa
La ilusión del "Clonar en un clic"
No existe un comando mágico que diga
clonar obsidiany entregue una aplicación lista para producción.
- Obsidian contiene cientos de miles de líneas de código empaquetadas en
app.asar, fuertemente minificadas y ofuscadas.- Descompilar el código directamente sólo produce un archivo gigante ilegible de 30 MB.
- La solución correcta: Descomponer la aplicación en sus 5 subsistemas esenciales, inspeccionar la lógica de cada uno con REA y escribir código limpio y tipado desde cero.
🧩 Los 5 Pilares de Obsidian y cómo atacarlos con REA
flowchart TD subgraph Obsidian["Obsidian Core Architecture"] V["1. Vault & Storage<br/>(Chokidar + In-Memory Index)"] W["2. Parser de Wikilinks<br/>([[nota#seccion|seccion]] + Backlinks)"] E["3. Editor Markdown<br/>(CodeMirror 6 Extensions)"] G["4. Graph View<br/>(Física de fuerzas + Canvas 2D/WebGL)"] P["5. Sistema de Plugins<br/>(Lifecycle onload/onunload + Workspace API)"] end REA["🔍 REA (analyze-javascript-application)"] -.-> V REA -.-> W REA -.-> E REA -.-> G REA -.-> P Obsidian ==> Clean["✨ Reconstrucción Limpia en Tauri + Rust + TypeScript"]
1. El Vault y la Persistencia Local
- Qué inspeccionar con REA:
- Cómo Obsidian vigila los archivos en el disco duro sin bloquear la interfaz de usuario.
- El mecanismo de debouncing para guardar notas mientras se escribe.
- La estructura de datos del árbol de archivos y la caché de metadatos (títulos, tags, frontmatter).
- Inspección en el ASAR:
rea analyze /opt/obsidian/resources/app.asar --json - Estrategia de Reconstrucción (Clean-Room):
- En lugar de Node
fs, usar la bibliotecanotifyde Rust en el backend para una detección ultrarrápida a nivel de kernel (inotify/kqueue). - Mantener un índice de metadatos ligero en memoria (HashMaps de Rust expuestos a TypeScript mediante comandos IPC de Tauri).
- En lugar de Node
2. Motor de Enlaces Bidireccionales ([[wikilinks]]) y Backlinks
- Qué inspeccionar con REA:
- Expresiones regulares y gramática del lexer que detecta
[[Nombre de Nota]],[[Nota#encabezado|Encabezado]]y[[Nota|Alias]]. - El grafo de referencias cruzadas: cómo sabe una nota quién la está citando (Backlinks) sin escanear el disco cada vez.
- Expresiones regulares y gramática del lexer que detecta
- Prompt para el Agente:
“Rastrea en el bundle descompilado de Obsidian el módulo que gestiona el índice de enlaces bidireccionales. Explica cómo actualiza las referencias cuando un archivo es renombrado y escribe una suite de tests con Vitest para validar esta lógica en TypeScript.”
3. El Editor de Texto y Modo de Vista Previa en Vivo (Live Preview)
- Qué inspeccionar con REA:
- Obsidian no reinventó el editor: utiliza CodeMirror 6.
- Lo especial de Obsidian son sus extensiones de CodeMirror:
StateField,ViewPluginyWidgetTypepara colapsar encabezados, renderizar checkboxes interactivos y fórmulas LaTeX.
- Estrategia de Reconstrucción:
- Integrar
@codemirror/statey@codemirror/view. - Crear extensiones desacopladas que transformen la sintaxis Markdown en widgets interactivos sobre el cursor.
- Integrar
4. La Vista de Grafo (Graph View)
- Qué inspeccionar con REA:
- Algoritmo de fuerzas físicas utilizado (habitualmente similar a D3-force con simulación de Verlet).
- Si el renderizado se realiza mediante Canvas 2D o WebGL (PixiJS / Three.js).
- Parámetros de repulsión entre nodos, gravedad central y longitud de resorte de los enlaces.
- Prompt para el Agente:
“Busca en el código analizado de Obsidian las constantes de física del Graph View (repulsión, centro, enlace). Crea un componente de Canvas HTML5 aislado que replique esa simulación de partículas.”
5. Arquitectura de Plugins y Eventos del Workspace
- Qué inspeccionar con REA:
- La interfaz base
Plugin(onload,onunload,addCommand,addSettingTab). - El sistema de pub/sub interno que despacha eventos cuando cambia la nota activa o se modifica un archivo.
- La interfaz base
- Estrategia de Reconstrucción:
- Crear una API pública tipada con TypeScript que permita cargar módulos dinámicos
.jsdesde una carpetaplugins/en el Vault.
- Crear una API pública tipada con TypeScript que permita cargar módulos dinámicos
🚀 Arquitectura Recomendada para el Clon
| Capa | Elección Tecnológica | Ventaja frente a Obsidian tradicional |
|---|---|---|
| Runtime | Tauri v2 + Rust | 30-50 MB de RAM vs 300-600 MB en Electron. Binario mucho más ligero y seguro. |
| Frontend | Svelte 5 o React + Vite | Interfaz reactiva fluida sin sobrecarga innecesaria. |
| Editor | CodeMirror 6 | El mismo estándar industrial que usa Obsidian, altamente extensible. |
| Vigilancia de Archivos | Rust notify crate | Menor consumo de CPU y latencia cero al registrar cambios en disco. |
| Búsqueda / Indexación | Tantivy o SQLite FTS5 (Rust) | Búsquedas full-text instantáneas incluso en vaults con más de 10,000 notas. |
🔗 Enlaces y Navegación
- index-proyectos: Hub general de proyectos aplicativos en Obsidian.
- obsidian-rust-typescript-tauri: Ficha técnica del proyecto de clon nativo con Tauri.
- rea-reverse-engineering: Manual de herramientas y capacidades del motor REA.