Desktop app for learning through a navigable 3D graph of connected knowledge nodes.
The app loads a world from a pack, renders it as a 3D map, and lets you read, edit, and navigate structured nodes with note-type-driven detail pages.
- Desktop: Tauri v2
- Frontend: Vue 3 + TypeScript + Pinia + TresJS/Three.js
- Backend: Rust
- Storage: SQLite via
rusqlite - IPC: TauRPC
pnpm i
pnpm tauri devChecks:
cargo check --manifest-path src-tauri/Cargo.toml
pnpm vue-tsc --noEmit
pnpm vite buildsrc/- Vue frontendsrc-tauri/- Rust backenddocs/- design/spec docsdocs/claude/- findings, progress, and planning notesuser-plugins/- drop-in user pluginsOVERRIDES.md- customization/plugin/dataset guideWORLD_PACK.md- source-pack authoring guide
Runtime still loads canonical pack.json v2 packs, but you should author packs in the new source-pack format:
pack.tomltheme.tomlnote-types/*.tomlrelation-kinds/*.tomllayers/*.tomlconnection-layers/*.tomlgroups/*.tomlnodes/*.md
That source pack is then compiled into runtime pack.json.
Use WORLD_PACK.md for the actual authoring workflow.
- app startup creates a starter source pack in app data if needed
- the starter source pack is compiled to
pack.json - pack library sources can be either:
- source packs
- runtime packs
- source packs are compiled before install/sync
- runtime packs still work for compatibility
You can create a local world from the app.
That now generates:
- a source-pack folder on disk
- a compiled runtime
pack.json
So a “blank” or “starter” world is no longer hand-authored as one giant JSON file.
Current editing flow:
- select a node in the 3D world
- press
X - or click the pencil button in the side panel / centered node viewer
You can edit:
- title
- tags
- note type
- fallback content
- structured note fields from the current note type schema
Important:
- these are runtime/editorial edits
- they do not currently round-trip back into source-pack files
User plugins are auto-loaded from:
user-plugins/**/*.tsuser-plugins/**/*.jsuser-plugins/**/*.mjs
Supported exports:
export default definePlugin({...})
export const plugin = definePlugin({...})
export const plugins = [definePlugin({...})]Use plugins to:
- override frontend module slots
- add themes
- add node extension pages
See:
OVERRIDES.mduser-plugins/example.plugin.ts
src/bindings.tsis generated and should be committed after IPC/type changes- stale dev processes can interfere with startup; fully restart when changing seed/data behavior
- some older docs and notes may still mention
domains/*/pack.json; current code should be treated as the source of truth