An app for building typed knowledge graphs for active learning.
Website · Try it · Docs · Discussions · Releases
Warning
Only the macOS desktop app has been tested so far. Bugs are expected, especially on other platforms.
Nesso is an interactive concept map where nodes are ideas and edges are typed semantic relations (52 types across 8 categories, e.g. causes, requires, subtype-of). Each concept carries spaced-repetition state scheduled by FSRS. Available as a web app at app.nesso.how and as native desktop builds for macOS, Windows x64, and Linux x86_64 (AppImage).
Note
An experimental AI mentor (Socrates) is also available: opt-in under Settings → AI, requires an OpenAI-compatible endpoint (local Ollama or a cloud provider).
Prerequisites: Node 22+, pnpm 10+ (via corepack enable), and a Rust toolchain for the desktop build.
pnpm install
pnpm dev # web app at http://localhost:5173
pnpm dev:desktop # Tauri v2 desktop shellpnpm install builds the workspace packages automatically (via prepare). To build for production:
pnpm build # web bundle
pnpm build:desktop # desktop binarysrc/
components/ UI components (read state via useGraphStore)
store/ Zustand store (index.ts + slices/: graph-editing, graph-management, settings, ui)
llm/ mentor transport (OpenAI-compatible fetch)
data/ relation type registry, seed graphs
types/graph.ts facade re-exporting vocab-learning + graph display + app settings
src-tauri/ Tauri v2 Rust shell (conf, capabilities, icons)
packages/
schema/ @nesso-how/schema: vocabulary-agnostic graph JSON serialize/deserialize
vocab-learning/ @nesso-how/vocab-learning: graph vocabulary (relations, node params, palettes)
theme/ @nesso-how/theme: design tokens (colours, fonts, spacing, radii)
graph/ @nesso-how/graph: embeddable graph React component (read-only by default)
mcp/ @nesso-how/mcp: MCP server for LLM clients
docs/ Starlight docs site, published at nesso.how/docs
Nesso is a React 18 + Vite + TypeScript single-page app, optionally wrapped by Tauri v2 for a native desktop shell. Graph data, selection, settings, and store-owned UI state live in a single Zustand store, with components subscribing via selectors and no prop drilling; transient mentor state and panel-width persistence remain outside the store.
The canvas is built on React Flow with a custom edge renderer that encodes each relation as a category colour with an arrow and a label. On the web, graph content persists to IndexedDB. On desktop, the shared graph document is written as plain .json files in the active project folder, while IndexedDB mirrors the graph locally; a file watcher picks up external edits. FSRS review progress remains in a separate IndexedDB store on both platforms and is never mixed into the shared graph files.
The AI mentor talks to any OpenAI-compatible chat/completions endpoint. It inspects the live graph through bounded, read-only tools, keeps tool activity transient, and requires a tool-capable endpoint (for example qwen3.5:9b); tool-incompatible endpoints fail without a snapshot fallback.
The repo is a pnpm workspace monorepo. The graph vocabulary lives in packages/vocab-learning and is consumed by both the app and an MCP server in packages/mcp that lets LLM clients query relation types, read the bundled docs, build valid graph documents, and validate graph JSON.
Nesso is built as a monorepo of focused packages so that its graph vocabulary, visual components, and tooling can be used independently of the full app. The MCP server, embeddable graph component, and schema layer are all separate entry points into the same underlying model.
| Package | Purpose |
|---|---|
@nesso-how/schema |
Vocabulary-agnostic graph document: concepts/relations, serialize/deserialize |
@nesso-how/vocab-learning |
Graph vocabulary: relation types, FSRS node params, category palettes, NessoGraphDocument |
@nesso-how/theme |
Shared design tokens for the app, graph embeds, and docs site |
@nesso-how/graph |
Embeddable <NessoGraph /> React component for docs and external apps |
@nesso-how/mcp |
MCP server: query relation types, read docs, build and validate graph documents |
Ideas and Q&A are welcome in GitHub Discussions; bug reports and PRs belong on GitHub Issues. Start with CONTRIBUTING.md.
Questions, feedback, or support: nesso-how@proton.me.
Copyright © 2026 Omar Desogus, Paolo Manfredotti. Licensed under the MIT License. See LICENSE.