Skip to content
NeuralRepo
Get Support

Building an Idea Graph

NeuralRepo is not just a list of ideas — it is a graph. By connecting ideas with typed relations, you build a navigable network that reveals how your thinking fits together.

You can create five relation types. Every one is directional in storage; only related is symmetric in meaning.

RelationDirectionWhen to Use
relatedSymmetricTwo ideas share a theme or domain but neither depends on the other.
parentSource is a child of targetBreak a large idea into sub-ideas. Link each child to the umbrella idea.
blocksSource blocks targetTarget cannot proceed until source is resolved. Use for dependencies.
inspiresSource inspired the targetOne idea led to another. Use for variants, evolutions, or spin-offs.
supersedesSource replaces targetThe source idea is a newer, better version. The target can be shelved.

A sixth value, duplicate, exists in the database’s type constraint and is rejected everywhere you could type it (Invalid type "duplicate"). Nothing creates it either: when duplicate detection fires it writes a row to duplicate_detections and, separately, a system-created related relation. Treat duplicate as a dead value rather than a relation you might encounter.

Terminal window
# Link two ideas as related
nrepo link 134 138 --type related --note "Both involve browser APIs"
# Make 155 a child of 134 — the source is the child
nrepo link 155 134 --type parent
# Mark a dependency: 160 blocks 134
nrepo link 160 134 --type blocks --note "Need auth system before building extension"

Every argument is the database id, not the #number a listing prints. See Idea identifiers.

You: Link the browser extension idea to the code snippets one as related. Also make the content-script idea a child of the extension.

Claude: (calls link_ideas twice) Done — linked them as related, and set the content-script idea as a child of the extension idea.

link_ideas also takes a links array for up to 50 relations in one call, returning a per-link result so one bad pair does not abort the batch.

Terminal window
curl -X POST https://neuralrepo.com/api/v1/map/relations \
-H "X-API-Key: nrp_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"source_idea_id": 134,
"target_idea_id": 138,
"relation_type": "related",
"note": "Both involve browser APIs"
}'

Two kinds of relation appear without you asking:

  • related, whenever a newly embedded idea scores above your related threshold (default 0.5) against an existing one.
  • parent, when you branch an idea or save one with a parent_id — created by the background queue a few seconds after the idea itself.

Both are stored with created_by: 'system', and the uniqueness constraint covers (source, target, created_by) — so a manual relation and a system one can coexist between the same pair, and a second manual link between them fails with Relation already exists.

The nrepo graph command renders an idea’s neighborhood as an ASCII tree, following relations in both directions and labelling each branch with the relation type that produced it:

Terminal window
nrepo graph 134 --depth 2
#42 Browser extension for idea capture [building]
├── parent → #55 Content script for text selection [exploring]
├── parent → #56 Popup UI for saving highlighted text [captured]
├── related → #38 Chrome plugin for code snippets [exploring]
└── blocks → #60 Authentication system [building]
└── parent → #61 OAuth flow implementation [building]

The default depth is 1. Raise it with --depth, up to 5 — but the text tree only ever draws three levels, so hops beyond the second exist solely in --json. Narrow a wide graph with --type blocks or --type parent,supersedes.

The web dashboard includes an interactive mind map visualization at Organize > Mind Map. It renders your entire idea graph as a force-directed layout where you can:

  • Click any node to view the idea
  • Drag nodes to rearrange the layout (Pro)
  • Filter by tag, status, or relation type
  • Zoom and pan to explore large graphs

Free-tier users get view-only access — everything above except editing interactions like dragging and link creation.

Start with a high-level idea and decompose it into children:

#42 Browser extension
├── #55 Content script
├── #56 Popup UI
├── #57 Service worker
└── #58 Options page

Each child can be worked on independently and tracked with its own status.

Track how ideas evolve over time:

#10 "Simple bookmarking tool"
└── [inspires] #25 "Smart bookmarks with AI tags"
└── [inspires] #42 "Browser extension for idea capture"

Map out what blocks what:

#60 Auth system ──[blocks]──► #42 Browser extension
#62 API rate limiter ──[blocks]──► #42 Browser extension

This tells you that #42 cannot ship until #60 and #62 are complete.

When an idea evolves so much that it replaces an older one:

Terminal window
nrepo link 134 110 --type supersedes --note "Extension approach replaces the simple bookmarking idea"
nrepo move 110 shelved

supersedes is the one type whose cycles are only soft-blocked: nrepo link --force will push a supersedes cycle through. blocks and parent cycles are refused outright, and no flag bypasses them — a refused cycle comes back as a 400, not a 409.

Imagine you are building a suite of developer tools. Here is how the graph might look:

#1 Developer Tools Suite (exploring)
├── [parent] #10 CLI Framework (building)
│ ├── [parent] #11 Plugin system
│ └── [parent] #12 Config file parser
├── [parent] #20 VS Code Extension (captured)
│ └── [related] #10 CLI Framework
├── [parent] #30 GitHub Bot (exploring)
│ ├── [blocks] #10 CLI Framework
│ └── [related] #35 Webhook handler library
└── [inspires] #40 SaaS Dashboard (captured)

This graph tells you:

  • The CLI Framework (#10) is the foundation — it blocks the GitHub Bot and relates to the VS Code Extension.
  • The SaaS Dashboard was inspired by the suite idea but is a separate effort.
  • You should focus on #10 first since other ideas depend on it.

The tree shows the shape you end up with, not the order of arguments that built it: each parent edge above was created from the child, as nrepo link <child-id> <parent-id> --type parent.

Terminal window
# List all relations for an idea
nrepo links 134
# Remove a relation by specifying both idea IDs
nrepo unlink <source-id> <target-id>

nrepo unlink finds the relation between the pair in either direction, so the argument order does not have to match how you created it. Via MCP, ask Claude to unlink the two ideas — the unlink_ideas tool takes a relation_id, which get_idea with include_context: true returns.