Back to projects
Beta

LinkGraph

An interactive knowledge graph that maps connections between notes, bookmarks, and ideas. Think of it as a visual second brain — every node is a thought, every edge is a relationship you define.

Role
Solo Developer
Timeline
Ongoing
Stack
D3.js, FastAPI, SQLite
Status
Beta — v0.9
linkgraph.jyra.dev LinkGraph — Knowledge Map
LinkGraph full graph view

Notes are flat. Ideas aren't.

Traditional note-taking apps store information in lists and folders. But knowledge doesn't work that way — concepts connect to each other in non-linear, often surprising ways.

LinkGraph lets you see those connections visually. Add a note, link it to related topics, and watch your knowledge network grow into a navigable constellation of interconnected ideas.

Graph data flow

✏️
Create
Add Node
🔗
Link
Define Edges
🧲
Simulate
Force Layout
🗺️
Explore
Interactive Map
LinkGraph node detail panel with connections
fig.1 — Node detail view: content, tags, and connected neighbors

The frontend renders an SVG-based force simulation using D3.js. Nodes repel each other while edges pull connected concepts closer. The backend stores graph data in SQLite and exposes CRUD operations through a FastAPI REST endpoint.

Tested with real knowledge bases

10K+ Nodes
60 FPS Render
<5ms Search Speed
Zoom Levels

Graph-first note system

🕸️

Force-Directed Layout

Nodes arrange themselves organically based on their connections and weights.

🔍

Fuzzy Search

Find any node instantly. Results highlight matching clusters on the map.

🏷️

Tag Filtering

Color-coded tags let you show or hide entire knowledge domains at once.

🔭

Path Finder

Discover shortest paths between any two concepts in your graph.

📸

Snapshot History

View your graph at any point in time. See how your thinking evolved.

📤

JSON Export

Export your entire graph as JSON for backup, migration, or analysis.

🖱️

Drag & Drop

Rearrange nodes manually. Pinned positions persist across sessions.

🌙

Markdown Notes

Each node contains a rich Markdown editor. Your graph, your docs.

Force simulation setup

graph.js
import * as d3 from 'd3';

export function createGraph(container, { nodes, edges }) {
  const width  = container.clientWidth;
  const height = container.clientHeight;

  const svg = d3.select(container)
    .append('svg')
    .attr('viewBox', [0, 0, width, height]);

  const simulation = d3.forceSimulation(nodes)
    .force('link', d3.forceLink(edges)
      .id(d => d.id).distance(120))
    .force('charge', d3.forceManyBody().strength(-300))
    .force('center', d3.forceCenter(width/2, height/2))
    .force('collision', d3.forceCollide(30));

  const links = svg.append('g')
    .selectAll('line').data(edges).join('line')
    .attr('stroke', '#1e2733');

  const circles = svg.append('g')
    .selectAll('circle').data(nodes).join('circle')
    .attr('r', d => d.weight * 3 + 5)
    .attr('fill', d => d.color || '#00f0ff');

  simulation.on('tick', () => {
    links.attr('x1',d=>d.source.x).attr('y1',d=>d.source.y)
         .attr('x2',d=>d.target.x).attr('y2',d=>d.target.y);
    circles.attr('cx',d=>d.x).attr('cy',d=>d.y);
  });
}
api/routes.py
from fastapi import APIRouter
from .database import db
from .models import Node, Edge

router = APIRouter(prefix="/api/graph")

@router.get("/")
async def get_graph():
    return {
        "nodes": await db.fetch_all("SELECT * FROM nodes"),
        "edges": await db.fetch_all("SELECT * FROM edges"),
    }

@router.post("/nodes")
async def create_node(node: Node):
    nid = await db.execute(
        "INSERT INTO nodes (label,tags,content) VALUES (?,?,?)",
        [node.label, node.tags, node.content])
    return {"id": nid, **node.dict()}

@router.post("/edges")
async def create_edge(edge: Edge):
    await db.execute(
        "INSERT INTO edges (source,target,label) VALUES (?,?,?)",
        [edge.source, edge.target, edge.label])
    return {"status": "linked"}

Technologies used

D3.jsForce LayoutSVG FastAPISQLitePython Fuse.jsMarkdown-itVanilla JS

Interested in this project?

Check out the other experiments or get in touch.

View all projects