Building an Obsidian-Like Graph Visualization for My Blog

Cover Image for Building an Obsidian-Like Graph Visualization for My Blog
Daniel Ashpes
4 min read
110 views
Categories:
Software Engineering
Tags:
Next.js
React
Data Visualization
Web Development
TypeScript

I've always been fascinated by how Obsidian visualizes the connections between notes in their graph view. It transforms a collection of documents into an interactive web of knowledge, making it easy to discover relationships you might have missed. I wanted to bring that same experience to my blog.

The Vision

The idea was simple: create a mind-map style interface where blog posts appear as nodes, connected by shared tags and backlinks. As you hover over nodes, related posts light up. Click a node to read the full post. It's a more organic way to explore content than a traditional chronological list.

Technical Implementation

After evaluating several approaches, I decided to build a custom solution using react-force-graph, a React wrapper around D3's force simulation. Here's why:

  • Performance: Canvas-based rendering handles hundreds of nodes smoothly
  • Interactivity: Built-in zoom, pan, and drag support
  • Flexibility: Full control over node and link styling
  • Cost: Completely free and open source

Key Features

Connection Types

Posts are connected in two ways:

  1. Shared Tags (green lines): When two posts share one or more tags, they're connected. More shared tags = stronger connection.
  2. Backlinks (orange lines): When a post links directly to another post, that creates a directed backlink connection.

Visual Encoding

The graph uses visual cues to convey information at a glance:

  • Node size: Based on view count (more popular posts are larger)
  • Node color: Based on category
  • Link thickness: Based on connection strength

Interactive Controls

The interface includes:

  • Search to find specific posts
  • Filter by category or tag
  • Zoom and pan controls
  • Keyboard shortcuts (ESC to close, +/- to zoom)

Database Schema

To support backlinks, I added a new model to track post-to-post connections:

model BlogPostLink {
  id           String   @id @default(cuid())
  sourcePostId String
  targetPostId String
  linkType     LinkType @default(BACKLINK)

  sourcePost   BlogPost @relation("SourceLinks", ...)
  targetPost   BlogPost @relation("TargetLinks", ...)
}

When a post is saved, the system automatically parses the HTML content for internal links and updates the connection table.

The Result

The graph view is now embedded directly on the blog page. It provides a bird's-eye view of all content and how it's interconnected. For readers, it's a more engaging way to discover related posts. For me, it's a visual reminder of how ideas connect across different topics.

What's Next

Future improvements I'm considering:

  • Semantic connections using AI embeddings to find conceptually related posts
  • Time-based visualization to see how topics evolved
  • Reading path suggestions based on graph structure

If you're interested in implementing something similar, the key libraries are react-force-graph for visualization and any database with relationship support for storing connections. The hardest part is designing a good UX—the graph should enhance discovery, not overwhelm users.