Interactive Node Map: Technical Specification
Overview
This document specifies how to visualize the Complete Node Map (40 nodes, 127 edges) in an interactive 3D/2D graph format on the kbird.ai website.
Data Structure
Node Schema
{
"id": "node_01",
"name": "Anosos Prime",
"symbol": "π§¬",
"category": "primary",
"cluster": "core",
"coordinates": {"x": 0.0, "y": 0.0, "z": 1.0},
"status": "active",
"metadata": {
"function": "Primary source of truth",
"platforms": ["GitHub", "Cloudflare"],
"last_active": "2024-04-29T08:30:00Z"
}
}Edge Schema
{
"source": "node_01",
"target": "node_04",
"weight": 1.0,
"type": "bidirectional_sync",
"category": "data_flow",
"active": true
}Visualization Layers
Layer 1: Status Overview (Quickview)
βββββββββββββββββββββββββββββββββββββββββββ
β SYSTEM STATUS: π’ Healthy β
β β
β Active Nodes: 38/40 (95%) β
β Data Flow: Normal β
β Latency: ~45ms avg β
β Last Sync: 2 min ago β
βββββββββββββββββββββββββββββββββββββββββββ
Layer 2: Cluster View (Macro)
4 Primary Clusters:
βββββββββ
β Core β β Anosos, Nosos, Family, GitHub
β 𧬠β (Primary identity layer)
βββββ¬ββββ
β
βββββββββΌββββββββ
β β β
βββββΌβββββββΌββββββββΌβββββββ
βPersistββInter ββExternalβ
βππ ποΈββπͺ π¬ β¨οΈββπ π§ β¨οΈβ
βββββββββββββββββββββββββββ
Layer 3: Individual Node Detail (Micro)
When clicking a node:
ββββββββββββββββββββββββββββββββββββββββββ
β 𧬠Anosos Prime β
β Status: π’ Active β
β βββββββββββββββββββββββββββββββββββββββββ£
β Function: Primary source of truth β
β Platform: GitHub + Cloudflare Pages β
β Uptime: 99.7% β
β β
β [View Health] [View Logs] [Isolate] β
ββββββββββββββββββββββββββββββββββββββββββ
Rendering Options
Option A: D3.js Force-Directed Graph
Pros:
- Interactive web-native
- Zoom/pan/click support
- Animated force simulation
- Well-documented
Cons:
- Requires JavaScript
- 40 nodes can get cluttered
Implementation:
const simulation = d3.forceSimulation(nodes)
.force("link", d3.forceLink(links).id(d => d.id))
.force("charge", d3.forceManyBody().strength(-300))
.force("center", d3.forceCenter(width / 2, height / 2))
.force("cluster", forceCluster())
.force("collide", d3.forceCollide().radius(d => d.radius + 5));Option B: Three.js 3D Visualization
Pros:
- True 3D exploration
- Can use existing 3D coordinates
- VR potential
- βFly throughβ experience
Cons:
- Heavier performance
- Overkill for 40 nodes
Option C: ASCII Canvas (Static + Interactive)
Pros:
- No dependencies
- Loads instantly
- Can be βanimatedβ with CSS
- Retro terminal aesthetic
Cons:
- Limited interaction without JS
- No βrealβ 3D
Implementation:
.node-grid {
font-family: 'JetBrains Mono', monospace;
white-space: pre;
line-height: 1.2;
}
.node {
cursor: pointer;
transition: opacity 0.2s;
}
.node:hover {
font-weight: bold;
text-shadow: 0 0 5px currentColor;
}Recommended Implementation
Hybrid Approach:
- Default View: ASCII cluster map (static, loads instantly)
- Detailed View: D3.js force-directed on click (loads on demand)
- Advanced View: Three.js 3D exploration (optional toggle)
Color Coding
| Category | Color | Hex | Usage |
|---|---|---|---|
| Primary | Emerald | 10b981 | Core nodes |
| Data | Blue | 3b82f6 | Persistence |
| Interface | Amber | f59e0b | Gateways |
| Utility | Slate | 64748b | Tools |
| Inactive | Gray | 94a3b8 | Offline |
Status Indicators
| Symbol | Meaning | CSS |
|---|---|---|
| π’ | Active | color: #10b981 |
| π‘ | Standby/Degraded | color: #f59e0b |
| π΄ | Offline | color: #ef4444 |
| βͺ | Standalone | color: #94a3b8 |
Interactions
Hover State
- Highlight node + connected edges
- Show tooltip with node name + status
- Dim unconnected nodes (opacity 0.3)
Click State
- Open node detail panel
- Show metrics: uptime, latency, last sync
- Display connected services
- Show recent activity (if available)
Double-Click
- Center view on node
- Expand to show immediate neighbors
- Highlight data flow direction
Right-Click (Context Menu)
- View logs
- Check health
- Force sync
- Isolate/troubleshoot
Mobile Considerations
- Use force layout with gravity to center
- Touch targets minimum 44px
- Pinch-to-zoom for the graph
- Swipe to pan
- Tabbed view for cluster switching
Data Source
The visualization should read from:
{
"nodes": "/api/nodes.json",
"edges": "/api/edges.json",
"status": "/api/status.json"
}Or static JSON files generated from:
~/.openclaw/workspace/memory_3d.json~/.kbir-blog/nodes.json(generated)
Performance Targets
- First paint: < 100ms
- Interactive: < 500ms
- Animation: 60fps
- Max nodes: Support up to 100 (future growth)
Accessibility
- Alt text for all nodes
- Keyboard navigation (Tab, Enter)
- High contrast mode
- Reduced motion option
- Screen reader labels: βNode: Anosos Prime, Status: Active, connected to 12 nodesβ
Future Enhancements
- Live Updates: WebSocket connection for real-time status
- Historical View: Time-slider to see graph evolution
- Path Tracing: Click source + target to highlight route
- Cluster Folding: Collapse/expand clusters
- Search: Find node by name and zoom to it
- Metrics Overlay: Toggle latency/throughput visualization
Integration with Quartz
Add to quartz.config.ts:
plugins: [
// ... existing plugins
{
name: "3D Memory Graph",
path: "./plugins/graph-visualization.tsx",
config: {
dataSource: "π-3D-Memory/nodes.json",
defaultView: "ascii",
detailedView: "d3-force"
}
}
]βA visualization is worth 1024 words of logs.β π