Features
Canvas
Infinite Canvas
Pan and zoom freely across an infinite workspace. Semantic zooming adjusts detail level:
- Zoomed in: Full content, edit handles, detailed view
- Zoomed out: Titles only, collapsed cards for performance
Edge labels have their own zoom threshold (Settings > Appearance): below it, labels are hidden to reduce clutter in the zoomed-out view.
Node Types
| Type | Description |
|---|---|
| Note | General purpose markdown notes |
| Citation | Academic references with DOI support |
| Comment | Annotations and commentary |
| Character | Entity node for people/characters |
| Location | Entity node for places |
| Term | Entity node for definitions/concepts |
| Item | Entity node for objects/artifacts |
| Tag | Created automatically for a #hashtag when tag nodes are enabled |
| Citation stub | Placeholder created while a citation's metadata is still being fetched |
Tags
Hashtags in node content become node tags:
#tagtokens are extracted whenever content is set: on node creation and on every content edit, from any interface (canvas editor, MCP tools, LLM agent)- Extracted tags merge with the node's existing tags
- A node's tags appear as chips at the bottom of its card; on a selected node, chips gain a remove button and a "+ #" chip adds tags directly
- Tag nodes and their edges are a toggleable canvas layer: the edge-filter cluster on the canvas (bottom left, beside the content it filters) switches manual, storyline, wikilink, and tag layers
- With tag nodes enabled in settings, each tag becomes a tag node connected to the notes that use it
YAML frontmatter at the top of a note (Open Knowledge Format metadata) is treated as structured node metadata, never as text:
- The block is hidden from rendered cards, and all editors (inline, fullscreen, preview panel) show only the body — the metadata header survives every edit untouched
- Its fields surface as chips on the node card: tags, the date (or date range), and the OKF lifecycle
statuswhen it isdraftordeprecated(stableis the silent default) - Click the date chip (or the "+ Set date" chip on a selected node) to set or change the node's
dateanddate_endin place — no YAML editing needed - Title and tags from frontmatter also feed the node record during vault sync
Frames
Group related nodes visually. Frames act as containers that can be moved together with all contained nodes.
Selection & Multi-Select
- Click to select single node
- Shift+Click to add to selection
- Lasso selection for multiple nodes
- Bulk operations on selection
Fullscreen Editor
Open any node in a fullscreen split-view editor for focused writing:
- Trigger: Cmd+Click (Mac) or Ctrl+Click (Windows/Linux) on any node
- Split view: Markdown editor on left, live preview on right
- Auto-save: Changes save automatically with 500ms debounce
- Keyboard shortcuts:
Escape- Save and closeCmd/Ctrl+S- Save immediately- Features:
- Title editing in header
- Wikilink autocomplete (type
[[to trigger) - Mermaid diagram preview
- "Zoom to Node" button to locate node on canvas
Connections
Edge Types
| Type | Color | Use Case |
|---|---|---|
| Related | Gray | General association |
| Cites | Blue | Academic citation |
| Supports | Green | Supporting evidence |
| Contradicts | Orange | Opposing viewpoint |
| Blocks | Red | Dependency or blocker |
Wikilink Edges
Writing [[link]] in a node's content creates a wikilink edge to the referenced node:
- Edges are created whenever content is set: on node creation and on every content edit, from any interface (canvas editor, MCP tools, LLM agent, vault import)
- Links resolve by note title, by relative path (
[[folder/note]]), and with section anchors ([[note#section]]) - A pair already connected by a manual edge does not receive a parallel wikilink edge
- Removing the link removes the wikilink edge; manual edges are kept
Edge Routing
Multiple routing styles for visual clarity:
- Orthogonal - 90-degree angles, clean diagrams
- Curved - Bezier curves, organic flow
- Straight - Direct lines
- Hyperbolic - Smooth curves avoiding nodes
Neighbor Highlighting
When selecting a node, connected neighbors are highlighted for context.
Neighborhood View
Focus on a specific node and its connections: - Toggle neighborhood mode to hide unrelated nodes - Adjust depth (1-5 hops) to control how far connections extend - Useful for exploring dense graphs
Storylines
Create linear narratives through your knowledge graph:
- Order nodes into a sequence
- Navigate through storyline in reader mode
- Export storylines as documents
- Color-code storyline edges
Anchored notes and comments
A note about a passage sits at that passage. Write a [[wikilink]] where it belongs, and while reading that node at full width the linked node opens as a callout at exactly that point. Narrower reader widths keep links inline, because a callout needs the room.
- Expansion goes one level deep: links inside an expanded note stay links.
- A link to a node that does not exist stays an inline link, marked as missing.
- Creating a comment writes such a link into the text it comments on, so the comment travels with the passage rather than with a position in the sequence.
To read one node on its own, right-click it on the canvas and choose Read node. It opens in the same reader the storylines use, at full width, with its anchored notes expanded.
Agent log
The chat panel shows the conversation; the log shows what the agent did and anything that failed. Open it with the Log button in the status bar at the bottom of the canvas, next to the node and edge counts. The button is present whenever the AI is enabled, so errors have a known place to be even before anything goes wrong.
Watching a PDF import work
Dropping a PDF creates its node immediately, and the AI cleanup that follows is visible rather than opaque:
- The cleaned text streams into the node as it is generated. With the Ollama provider each token appears as the model produces it (updates are throttled to keep the canvas smooth); providers without streaming support fall back to updating the node as each section completes.
- The node currently being written carries a pulsing outline so it is findable on a busy canvas. The pulse stops and the outline disappears the moment processing ends, whether it finished or was aborted.
- The status line still names the section being cleaned, which remains the only progress signal for multi-section documents on non-streaming providers.
Reading a long node
A node card shows the beginning of its content and marks where the text continues. Cards are a few hundred pixels tall, and a node holding an imported paper can carry tens of kilobytes, so rendering all of it into the card would cost several dropped frames on every click.
To read the whole document, open the node: Cmd/Ctrl+click for the fullscreen view, or right-click and choose Read node for the reader. Both render the full text.
Bringing a vault to OKF
Nodus stores notes in Open Knowledge Format (OKF v0.2): Markdown with YAML frontmatter, readable by Obsidian. Files Nodus creates carry that frontmatter already; files that predate Nodus usually do not.
To add it to an existing vault, open Settings > Workspaces, select the workspace, and choose Check files under OKF frontmatter. Nodus reports how many files would gain frontmatter, how many already have it, and how many nodes have no file, and writes nothing until you confirm.
The backfill only adds a frontmatter block above the existing text. Bodies, [[wikilinks]] and #tags are untouched, and a file that already has frontmatter is left alone rather than merged into, so fields you set by hand cannot be lost.
Expanding a PDF into a graph
When a dropped PDF has structure - several sections or a bibliography - Nodus offers to expand it after the document imports. The single node stays either way; the dialog chooses what is added:
- Sections as nodes. One node per heading, connected along the document outline, grouped in a frame named after the paper.
- References as citation nodes. Each bibliography entry becomes a citation node, cited by the paper.
- Verify against Semantic Scholar. Each reference is marked
verified,not_found, ornot_checkedin its frontmatter. A reference is only marked not found when the service answered; if the service is unreachable, the state is not checked - an outage never invalidates your bibliography. - Add references to Zotero. Shown when the Zotero integration is configured; nothing is written to Zotero without this choice.
- Extract claims with the AI. One model pass per section; claims become nodes linked to their section as supporting or contradicting. Sections the model fails on are skipped and counted, and the structural graph is never held up by the model.
Importing PDF highlights
Drop a PDF that you have already annotated and Nodus offers its highlights for import.
- Drop the PDF onto the canvas. The document is imported as a node as usual.
- If the file carries highlights, a picker lists them with their page number, colour and any comment you wrote.
- Choose the ones worth keeping and confirm. Each becomes a node holding the passage and your comment, linked back to the document node.
Highlights already imported from that file are marked as such and are not imported again, so re-dropping an updated PDF brings in only what is new.
A highlight can only be imported when the PDF stores the highlighted text alongside the annotation. Zotero and Adobe Acrobat do this; macOS Preview records only the marked region, so highlights made there appear in the picker as unavailable. This is a limitation of what the file contains, not of the file being unreadable.
Exporting a document
Turn work on the canvas into a document in two formats:
- PDF - compiled in the application, ready to send
- Typst source - to keep editing outside Nodus
Two ways in:
- In the storyline reader, choose Export. The document follows the storyline order, so the sequence you arranged is the sequence in the document.
- Select nodes on the canvas, right-click, and choose Export selection. Nodes are ordered top to bottom, left to right.
The dialog collects a title, an optional author, the paper size, and whether to append a list of the connections between the exported nodes. Choose where to save with the system dialog. If a PDF fails to compile, the dialog says so and writes nothing, so a broken file never lands on disk.
Nodes with Typst math export as math, not as source text, since the same engine renders both on the canvas and in the document.
Learning the edge gestures
The edge gestures are not visible on screen, so a short coach runs once after onboarding. It teaches three of them in turn - the right edge for storylines, a dwell at the bottom edge for timelines, the left edge for the agent - and moves on only when you actually perform the gesture it is asking for. Skip it at any time; it does not come back.
To see it again, open Settings > General and choose "Replay gesture tour".
Storyline Panel
Moving between graph and storylines works in steps along the screen edges: each push of the pointer against the right edge goes one step deeper into storylines, each push against the left edge steps back toward the graph.
Each edge is active only at a handle in the middle of that edge, marked on screen. Pushing the border anywhere else - reaching for another window, the dock or the desktop - does nothing, so panels open when you aim for them and not while you work.
- Push right once: the storyline overview slides open on the right
- Push right again: the reader opens at half the window, keeping the graph visible, with the last-read storyline (the first storyline initially)
- Push right a third time: the reader expands to the full window
- Push left: each push steps back down — full reader to half, half to the overview (or the timelines view, if the reader was opened from there), overview to the plain graph
- Open layers stay open while you work in them; only a left-edge push or the toolbar book button steps back
- While a layer is open, stepping deeper requires pressing the pointer against the very edge of the window, so using the panel near the border does not skip ahead
- The reader's left handle still resizes it freely between steps
In the overview:
- Clicking a storyline row opens it in reader mode; the chevron on the row expands its ordered nodes inline instead
- Drag a storyline row to reorder storylines — the same drag used for reordering nodes within a storyline; the order persists and the timelines lanes follow it
- Several storylines can have their item lists expanded at once
- The overview shortens above an open timelines sheet instead of overlapping it
- Storyline titles wrap to at most two lines instead of being truncated
- Drag the separator between panel and canvas to set the panel width; the width persists across sessions
- Drag nodes from the canvas onto a storyline section to add them to that storyline
Timelines
Timelines live along the bottom of the window: dwelling the pointer at the bottom edge for a second (or the timelines button in the storyline overview) slides up a sheet showing all storylines; the graph stays visible above it, and it can be open alongside the overview and beneath a shortened reader:
- Every storyline is a horizontal lane in its color; its nodes are beads in order
- A node states its point in time with a
date:frontmatter field —date: 20 BC,date: 1969-07-20,date: 1969-07-20 14:30,date: 1500. Only dated nodes are placed (BC dates and minute-precision timestamps supported); nodes without a date do not appear on the axis - Large empty stretches between clusters of events are abbreviated: the axis breaks (marked with a double slash) instead of wasting space, and each segment labels itself at its own level of detail
- A node spanning time (an era, a long work) adds
date_end:and is drawn as a bar from start to end instead of a bead - The from/to fields in the sheet's header fix the axis range (same date formats); either side left empty fits automatically, and the chosen range persists. Axis labels adapt to the span: years, months, days, or clock times for narratives playing out within hours
- Nodes shared between storylines are joined by dashed connectors, and graph edges between timeline nodes are drawn as arcs
- Dated nodes outside every storyline appear in a gray "Unassigned" lane, so the timeline covers every dated node in the workspace
- Marks carry the node's own color when set, falling back to the lane's storyline color
- Hovering a bead or bar shows the same hover preview as the canvas
- The sheet stays open alongside the storyline overview and the reader (the reader sits above it)
- Clicking a lane or bead opens that storyline in the reader; a left-edge push or the close button slides the sheet away
Math with Typst
Native Typst integration for fast mathematical typesetting:
- Sub-second rendering - No LaTeX compile times
- Modern syntax - Cleaner than LaTeX
- Inline and block - Both supported
Examples
Inline math: $x^2 + y^2 = z^2$
Block math:
See Typst Math Reference for complete syntax.
Obsidian Integration
Vault Import
Import existing Obsidian vaults:
- Markdown content preserved
- Wiki-links
[[link]]converted to edges - Folder structure respected
- Automatic force-directed layout
Bi-directional Sync
Changes sync between Nodus and your vault folder:
- Edit in Nodus → updates Obsidian vault
- Edit in Obsidian → updates Nodus canvas
- File watcher detects external changes
- With sync disabled, edits change only the Nodus database; vault files are never written
Workspace Separation
Each imported vault becomes a separate workspace, keeping projects organized.
Citation Management
Zotero Integration
Connect to your local Zotero database:
- Browse and import collections
- DOI extraction and linking
- Create citation nodes with metadata
Semantic Scholar Integration
Fetch citations for papers with DOIs:
- Right-click citation nodes and select "Fetch Citations"
- Automatically creates nodes for referenced papers
- Builds citation network on your canvas
BibTeX Import
Import .bib files directly to create citation nodes with:
- Author, title, year
- DOI links
- Journal/conference info
LLM Integration
Connect AI assistants for research help:
Supported Providers
| Provider | Type | Notes |
|---|---|---|
| Ollama | Local | Privacy-first, no data leaves device |
| OpenAI | Cloud | GPT-4, GPT-3.5 |
| Anthropic | Cloud | Claude models |
| OpenAI-compatible | Cloud | Any compatible API |
Agent Features
- Research assistance
- Content summarization
- Smart node connections
- Task automation
Ask AI on the canvas vs. on a node
Two scopes keep AI actions predictable:
- Agent panel on the canvas's left edge runs the graph agent, which can create and edit nodes, add edges, and lay out the graph. It is a chat: prompts and full answers stay in a transcript, each answer listing the tools it used, and a line above the input names the nodes going into the context (the current selection, or the whole graph when nothing is selected). Fold it away with the toggle in the canvas's top-left corner, or reveal it with a left-edge push; drag its inner edge to resize it.
- Node "Ask" bar (in the node preview) runs the node agent, which only edits the current note. It never creates new nodes.
Plan-first approval
The graph agent always works in two phases:
- Plan. It researches and reads the graph only; it cannot create, edit, delete, or connect nodes in this phase. It then proposes a plan.
- Execute. The plan opens in an approval dialog that states, up front, what it will create versus edit (for example, "create 7 new nodes, edit 2"). Each step is labeled with its action and lists the affected node titles. Nothing is written to the graph until you approve.
This makes node creation predictable: the agent never adds a node you did not see listed and approve.
Layout Algorithms
Automatic arrangement of nodes:
| Algorithm | Best For |
|---|---|
| Force-directed | General graphs, organic layout |
| Grid | Structured content |
| Hierarchical | Trees and DAGs |
Export Options
Typst Export
Export canvas as Typst document for further editing.
PDF Generation
Generate PDFs directly using Typst compilation.
Markdown Export
Export nodes as standard Markdown files.
Open Knowledge Format Export
Export a workspace as an Open Knowledge Format (OKF v0.2) bundle so AI agents and other OKF consumers can read it without Nodus:
- Every node with content becomes a Markdown concept document with YAML frontmatter:
type(from the node type),title,tags, andgeneratedprovenance - Documents are grouped into subdirectories by node type (
notes/,citations/, ...) - A root
index.mddeclaresokf_version: "0.2"and lists all documents by section with descriptions - Wikilinks are rewritten to bundle-relative Markdown links in the exported copy; unresolvable links are left unchanged
- The export writes to a folder you choose; the workspace and its vault files are not modified
Files that Nodus itself creates in a vault (via "create file for node" or the export-to-files action) also carry OKF frontmatter, unless the content already starts with its own frontmatter block. Existing vault files are never rewritten to add frontmatter.
Data Storage
Local-First Architecture
All data stored on your device:
- SQLite - Metadata, positions, connections
- Markdown files - Content (Obsidian-compatible)
- No cloud required - Works fully offline
Privacy
- No telemetry
- No data collection
- Your data stays yours
Keyboard Shortcuts
| Action | macOS | Windows/Linux |
|---|---|---|
| New node | Double-click | Double-click |
| Delete | Backspace |
Delete |
| Select all | Cmd+A |
Ctrl+A |
| Undo | Cmd+Z |
Ctrl+Z |
| Redo | Cmd+Shift+Z |
Ctrl+Shift+Z |
| Zoom in | Cmd+= |
Ctrl+= |
| Zoom out | Cmd+- |
Ctrl+- |
| Fit view | F |
F |
| Layout | L |
L |
| Neighborhood view | N |
N |
| Reset node sizes | Shift+R |
Shift+R |
| Help | ? |
? |
| Fullscreen edit | Cmd+Click |
Ctrl+Click |
| Find in node | Cmd+F |
Ctrl+F |
| Settings | Cmd+, |
Ctrl+, |
Press ? on the canvas for the full list.
Themes
| Theme | Description |
|---|---|
| Light | Clean, bright interface |
| Dark | Easy on the eyes |
| Pitch Black | OLED-optimized, true black background |
| Cyber | Neon cyan/magenta aesthetic |
Node colors can be customized individually.