Moonkale unifies code editing and knowledge editing around one idea: everything you open becomes a graph, and every editor is a view on that graph.
flowchart LR subgraph Sources FS[Folder] SQL[(SQLite / DuckDB / Turso · Postgres planned)] GDB[(Ladybug / Helix · TypeDB, Falkor planned)] KV[(redb / RocksDB · Redis planned)] end subgraph Core["moonkale-core: graph model"] G[(Nodes + Edges)] Q[Query IR] end subgraph Derived IDX[Index: tree-sitter, links, embeddings] LSP[LSP client] end subgraph Editors CODE[Code] MD[Markdown / Typst] TBL[Table / SQL] GRAPH[Graph 2D/3D wgpu] FLOW[Flow / no-code] TERM[Terminal] end subgraph Agents LLM[LLM gateway + policy] end FS & SQL & GDB & KV -->|Source trait| G G --> IDX --> G LSP --> IDX G -->|GraphView| CODE & MD & TBL & GRAPH & FLOW TERM -->|links| IDX LLM <-->|tools| G EXT[Extensions: static + WASM] -.contribute.-> Editors & Sources & LLM
As built (2026-10-01)
The picture holds, with three differences: the index’s store is memory (rebuilt on open; no tantivy/usearch), extension contributions are panels, commands, settings and flow libraries (no declarative manifest yet — Extension System), and every database source is read-only. Area by area: Status.
The three bets
- Graph-native model (Graph-Native Model). A folder, a Postgres schema and an Obsidian vault are all nodes and edges. This is what lets one graph view show a Rust crate next to a database next to a wiki, and what gives LLM agents a single traversal surface.
- Extension-driven (Extension System). The built-in editors are extensions with no privileged access. If the API can’t express the code editor, the API is wrong.
- Rust everywhere, GPU where it matters (ADR-0002 Rust first, TypeScript behind traits, ADR-0003 wgpu for graph rendering). One language across desktop/web/mobile via Dioxus; the graph view is
wgpuso it stays fluid where DOM-based tools (Obsidian, Cytoscape) fall over.
Layers
flowchart TB A[web / desktop / mobile entrypoints] --> B[ui — workbench shell] B --> C[editors/*] C --> D[ext-api] D --> E[core] B --> F[ext-host] --> D G[sources, sources-sql/graph/kv, project-fs] --> E H[index, lsp, terminal, llm] --> E I[api — server: fullstack functions] --> G & H
Dependency direction is meant to be strictly downward, and core depends on nothing. Today four edges point the wrong way (ui → editors and drivers, ext-api → llm/ext-host, llm → sources-sql, api → ext-git) — listed in Where reality differs from the rules below and removed by Milestone 18 - Library Refactor.
What this replaces
The earlier plan (rough goal) was Deno + Vite + Lumino on the frontend and Tauri + Rust on the backend. ADR-0001 Dioxus instead of Lumino and Tauri explains the move to a single Rust codebase with Dioxus 0.7 and why the TypeScript pieces that survive (CodeMirror, Milkdown, xterm) are quarantined behind traits (JS Interop Boundary).