Desktop app that turns a local Zotero library into a navigable idea graph. Extracts typed claims, evidence and relations from your readings, then lets you browse contradictions, detect research gaps, map coverage of a thesis question, and generate structured academic drafts — all grounded in verbatim citations from your sources.
Everything runs locally. The only external calls are to the AI provider you configure. Your data, API keys and embeddings stay on your machine.
See it first — the Nodus website has a cinematic tour and a live in-browser demo of every view, no install needed.
New here? Start with Your first day with Nodus — a step-by-step walkthrough from install to your first cited report, plus a map of every sidebar section.
New in v1.7 — the Word writing copilot graduates to an official beta, installable straight from the app (Settings → Integrations): while you write, a side panel shows how the current paragraph relates to your library, backed by an auto-renewing local certificate and a Spanish/English pane. Local models via Ollama and LM Studio are now first-class providers everywhere a cloud model is, with prompts sized to each model's real context window.
A tour of the main sections, shown with the built-in demo corpus (a small science-of-learning sample — no real library required).
| Phase | What Nodus provides |
|---|---|
| Read | Two-level scanning: light (title + abstract, cheap) and deep (full text, ideas + evidence + relations). Automatic or manual, your choice. |
| Understand | Idea graph (Cytoscape.js), author graph, debate view (contradictions as two-sided face-offs), Tutor mode (AI-guided step-by-step walkthrough). |
| Orient | Research gap mining, reading path planner, research coverage map (decompose a thesis question, map which sub-questions your corpus covers). |
| Write | Writing workshop (outline + draft + support matrix + bibliography from selected graph nodes), Deep Research mode (an orchestrated, coverage-guided 5–20 page academic report over the whole corpus with every source cited), notes workspace with folders, Markdown editor, and clickable nodus:// citations. A Word add-in (beta) shows, live while you type, how the current paragraph relates to your library — installable from Settings → Integrations (see word-addin/README.md). |
| Converse | Research assistant chat grounded in your corpus (ideas, passages, contradictions, gaps, author graph — you pick the context). |
On a fresh install with an empty database, Nodus offers to load a curated sample corpus: six works on the science of learning, nine ideas, six relations, four research gaps, and notes. The sample text follows the interface language (English or Spanish). You can explore every static view without Zotero or an API key. Exit demo mode from the banner or Settings > Data to clear the sample and start with your own library.
| Layer | Technology |
|---|---|
| Shell | Electron + electron-builder (DMG / NSIS), contextIsolation: true, nodeIntegration: false |
| Renderer | React 18 + TypeScript + Vite |
| UI | Tailwind CSS, Framer Motion (respects prefers-reduced-motion) |
| Graph | Cytoscape.js |
| Database | SQLite via better-sqlite3 (main process, transactional, versioned migrations) |
| Embeddings | Per-idea Float32 vectors; in-memory cosine similarity for fusion (sqlite-vec ready) |
| AI | Anthropic, OpenAI, OpenRouter, DeepSeek, Gemini clients in main process; keys stored with Electron safeStorage |
| Text extraction | pdfjs-dist (text), mammoth (docx), Tesseract OCR (opt-in, local) |
electron/ Main process (Node)
db/ better-sqlite3, migrations, repository pattern
zotero/ Read-only Zotero 7 local API client (pagination + diff)
ai/ Providers, prompts, light/deep scan, fusion, tutor,
debate, research map, writing workshop, embedding pipeline
extraction/ PDF/MD/docx text extraction + chunking + Unpaywall fallback
pipeline/ Priority queue, retries with backoff, resume-after-restart
sync/ Full + realtime incremental sync with Zotero
graph/ Idea graph, author graph, contradictions, reading path
export/ .nodus encrypted backup, notes export, research coverage export
secrets/ safeStorage-backed API key encryption (never crosses IPC)
mcp/ Local Model Context Protocol server for external AI clients
ipc.ts, preload.ts, main.ts
shared/types.ts Domain types + typed window.nodus IPC contract
src/ React renderer (views, components, i18n)
The renderer never touches Node, the filesystem, or the network. Every
sensitive operation goes through the typed window.nodus bridge exposed by the
preload script.
- Zotero 7+ running with the local API enabled (
http://localhost:23119/api/). Nodus is read-only and never writes to Zotero. - An AI API key for at least one provider (Anthropic, OpenAI, OpenRouter, DeepSeek, or Gemini). Embeddings currently require OpenAI, OpenRouter, or Gemini; with Anthropic only, fusion falls back to a conservative "new idea" policy.
- Optional decorative images require a Google/Gemini, OpenAI, or OpenRouter key. They reuse the provider keys stored in Settings; no new environment variable is required.
- Node.js 20+.
Or skip all of the above: launch the app, click Load demo, and explore.
npm install
npm run dev # Vite + Electron in developmentnpm run dist:mac # .dmg + .zip (arm64)
npm run dist:win # NSIS installer
npm run dist # current platformLight scan — title + abstract only, for every monitored work. Assigns coarse-grained parent themes. Cheap, incremental, and what keeps unread works visible on the map so gaps stay visible.
Deep scan — full clean text. Triggered per-work by a configurable read tag or by manual selection. Extracts typed ideas (claim, finding, construct, method, framework), verbatim evidence anchored to exact passages, then fuses each idea against the global graph. The author layer is derived post-process — the model is never asked to infer global author relations.
Interactive Cytoscape.js graph with multiple lenses (ideas, authors), presets (contradictions, gaps, reading focus, unread works), theme-based filtering, search, and history playback. Every node opens a detail sidebar with occurrences, evidence and relations.
AI-guided, step-by-step walkthrough of your idea graph. A long-context model analyses all ideas, themes and connections and proposes weighted routes:
- Full tour — full coverage, ordered by weight.
- From a goal — routes traced from a specific research interest.
No artificial stop cap. Narration streams as one continuous discourse grounded in the node's evidence. The graph spotlights and frames each stop live.
Contradiction and refutation edges rendered as two-sided face-offs with authors, evidence, and a chronology. Optional AI synthesis (streamed) to understand the tension and decide how your work fits.
Write a thesis question; Nodus decomposes it into sub-questions and maps each against your corpus: covered, partially covered, uncovered, or internally disputed. Tracks corpus growth and flags stale mappings. Exports to Markdown.
Describe your research priorities; Nodus orders what to read and in what phase, justifying each choice with gap, foundational, recency, and connectivity scores.
Choose the target form (literature review, theoretical framework, debate
synthesis, gap justification, chapter section, research question), describe the
objective, select from the suggested materials (ideas, themes, gaps,
contradictions, works, passages, saved Tutor routes), and generate a structured
result: outline, Markdown draft, support matrix, bibliography, next steps and
limitations. All citations use nodus:// links that resolve to the real
source/evidence inside Nodus. Exports to Markdown. Drafts can be saved locally
and re-opened.
The Deep Research toggle turns the same panel into an orchestrated report
builder: write a research idea and Nodus plans an outline, writes it section by
section guided by how much of the corpus each pass has covered, and assembles a
professional 5–20 page academic report with an inline (Author, year) citation
for every substantive claim and a full reference list. The loop is bounded
(page-budget and section caps), never fabricates a source (hallucinated
citations are stripped and every reference traces to a really-cited work), and
degrades gracefully if the model fails on a section. Length is adaptive by
default or pinned (concise / standard / exhaustive). The report reuses the
workshop's viewer, export, local-save and clickable-citation stack.
Inmersión and Deep Research can optionally request one landscape illustration. The text model first produces a compact visual scene; Nodus combines it with a centralized style template that forbids visible text, letters, logos, and watermarks. The default is a powerful, richly colored antique-book illustration, with hand-colored engraving, classic scientific plate, watercolor, historical collage, modernist poster, and contemporary editorial alternatives.
Image generation starts only after the immersion or report is stored. It has a separate status and a two-minute provider timeout: failure never rolls back, blocks, or hides the main content. There are no automatic retries. Users can retry a failed image, delete it, or confirm a potentially billable regeneration. The optimized full image and a small list thumbnail are stored once in SQLite and included in encrypted full backups.
Provider/model selection lives in Settings → AI providers and models → Image generation. The model browser shows published input, output, and direct per-image prices where the provider exposes them, explicitly marks unavailable metrics, supports live search, and keeps price sorting within each provider when published units or sizes are not comparable. See image provider details and limitations.
Folders and subfolders with a Markdown editor. Capture content from the research
assistant, writing workshop, debate view, and individual ideas with one click.
nodus:// citations stay clickable inside the editor. Manual ideas created from
notes are integrated into the graph. Supports export (structured Markdown or
JSON), AI-assisted reordering, and folder-level idea suggestions.
Trace the logical structure around any idea. Two modes: AI (model-driven hierarchical outline) or auto (structural, using real graph edges — no model needed). Surfaces debate hubs and connectivity-ranked seed candidates.
Keyword and semantic search across notes, ideas, works, passages, gaps, themes, and authors. Selecting any result opens the same type-adaptive detail modal with all locally available metadata and content. Opening/locating the item in the graph or its owning view is an explicit secondary action, never automatic.
Conversational AI grounded in your corpus. Pick the context: ideas, themes,
contradictions, gaps, reading path, authors, documents, passages, and the full
graph. Answers render as Markdown with nodus:// citations. Streamed with
optional reasoning trace. Conversation history is persisted.
Manual (button) or realtime (polls the Zotero library version every ~25s and
diffs with ?since=). Each sync writes a log entry.
Deep-scan text resolution escalates only as far as needed:
- Zotero indexed full text — reuse if substantial (≥90% of pages).
- PDF analyzer — samples pages, classifies as digital / hybrid / scanned.
- Streaming extraction — page-by-page,
[[p. N]]markers for model grounding. - OCR (opt-in) — only image pages of scanned/hybrid PDFs, locally via Tesseract.
- Fallbacks — Unpaywall (by DOI) → abstract-only → none.
All phases report live progress through the queue bar.
Optional local Model Context Protocol server (Streamable HTTP) for external AI clients (Claude Desktop, ChatGPT, generic MCP clients). Bearer-token auth, localhost only. It exposes the derived graph read-only (ideas, debates, gaps, authors, coverage) plus write access to your own notes, folders and saved drafts.
The writing copilot is part of this surface, mirroring the Word add-in so any MCP client can situate a draft passage in your corpus:
nodus_analyze_passage— takes an arbitrary passage and returns its typed relations with the whole corpus (supports, contradicts, refines, extends …), each with similarity, confidence, a rationale and the Zotero item to cite.nodus_get_copilot_idea— one idea shaped for writing: statement, evidence, connections and the ready-to-cite Zotero bridge (key + author-year).nodus_compose_insertion— drafts a short, academic sentence that integrates a chosen idea into your paragraph with the parenthetical citation in place.
Settings > Data > Export produces a self-contained *.nodus archive encrypted
with a generated password: transactionally consistent SQLite snapshot, selected
model settings, API keys, embeddings, chat history, extracted text, summaries
and passages. Import restores the complete state without rescanning.
See electron/db/migrations.ts for the authoritative schema. Core tables:
works— central registry; stablenodus_id(UUID), trackslight_status/deep_status, hashes.themes/work_themes— light-scan theme clusters.ideas— canonical idea nodes with embeddings.idea_occurrences— how each work develops an idea.evidence— anchored quotes with location and kind (explicit / paraphrased).edges— typed, directed relations (solid = explicit, dashed = inferred).authors/author_relations/work_authors— derived author layer.gaps— future work, limitation, open question, unresolved contradiction.notes/note_folders— user-structured workspace.research_questions/rq_sub_questions— thesis decomposition + coverage map.chat_conversations/chat_messages— research assistant history.
- API keys are encrypted with Electron
safeStorageand stored inuserData(outside the repo). They never cross the IPC boundary; the renderer only sees a booleanproviderKeysmap. - The
.gitignoreexcludes*.sqlite,*.nodus,.env, and key material. - Backups strip
providerKeysfrom settings; the encrypted archive carries the keys separately. - The MCP server binds to localhost only and requires a bearer token.
The verbatim system prompts live in electron/ai/prompts.ts:
- Prompt 0 — light scan (themes).
- Prompt 1 — deep extraction (ideas, evidence, relations, gaps, authors).
- Prompt 2 — fusion / idea resolution against the global graph.
All free-text fields are produced in the configured prompt language (Spanish or
English); quote fields stay verbatim in the source language. JSON output is
validated and retried at temperature 0 on parse failure.
MIT