fuzzy symantic search , hashtags, tags, keywords, content, points, naming, obsidian show grphraph knowledge based like foam on vscode.
Knowledge Graph — All Files & Code
Core Files
| File | Purpose |
|---|---|
farshid-ai-cv-llm-graph.md |
Main graph page (/graph/) — D3.js force-directed knowledge graph |
farshid-ai-cv-llm-graph-tags.md |
Hashtag graph page (/graph-tags/) — tag co-occurrence graph |
assets/js/graph-view.js |
D3.js graph engine — force simulation, zoom, drag, rendering |
assets/css/graph.css |
Graph page styles — filters, tooltips, minimap, mobile |
assets/graph.json |
Main graph data — 79 nodes, 144 edges, 12 categories |
assets/graph-hashtags.json |
Hashtag graph data — tags and co-occurrence edges |
Layout References
| File | Line | Purpose |
|---|---|---|
_layouts/farshid_default.html |
124 | Bottom toolbar “Graph” link |
_layouts/farshid_page.html |
90 | Bottom toolbar “Graph” link |
_layouts/farshid_base.html |
40 | Bottom toolbar “Graph” link |
_layouts/farshid_atlas.html |
41 | “Knowledge Graph” nav link |
Related Pages
| File | Purpose |
|---|---|
contents/pkm/graph.html |
Standalone mini graph (6 nodes, hardcoded) |
contents/pkm/graph.json |
PKM graph data |
Architecture
farshid-ai-cv-llm-graph.md
├── loads: d3.v7.min.js (CDN)
├── loads: fuse.js (CDN)
├── loads: assets/js/graph-view.js
├── loads: assets/css/graph.css
├── loads: assets/graph.json
└── inline: CONTENT_INDEX (search), graphSearch(), filter buttons
graph-view.js
├── d3.forceSimulation (center, charge, link, collide, x, y)
├── d3.zoom (pan/zoom with extent)
├── d3.drag (node repositioning)
├── Canvas rendering (curved edges, glow, labels)
├── Category filtering
├── Search highlighting
└── Mini-map
Node Categories & Colors
| Category | Color | Count |
|---|---|---|
| hub | #0a84ff (blue) | 6 |
| cv | #30d158 (green) | 5 |
| ai | #bf5af2 (purple) | 4 |
| cuda | #ff9f0a (orange) | 4 |
| paper | #5ac8fa (light blue) | 10 |
| journal | #64d2ff (cyan) | 6 |
| book | #ffd60a (yellow) | 7 |
| patent | #ff375f (red) | 3 |
| keynote | #ff6482 (pink) | 1 |
| course | #00c7be (teal) | 17 |
| pkm | #ac8e68 (brown) | 3 |
| business | #8e8e93 (gray) | 12 |
Edge Types
| Strength | Meaning |
|---|---|
| 1.0 | Direct parent-child (Hub → Category) |
| 0.8 | Strong topic match |
| 0.5 | Related content |
| 0.3 | Weak but notable connection |
Interaction Features
- Zoom: Mouse wheel (0.1x – 6x)
- Pan: Click+drag on background
- Select node: Click/tap (shows glow + full label)
- Open page: Double-click/tap
- Drag node: Click+drag on node
- Filter: Category toggle buttons
- Search: Fuse.js fuzzy search, highlights nodes
- Minimap: Bottom-right corner, shows viewport
- Labels: Zoom-dependent (none → 3 chars → 8 → 15 → full) Good. I have enough data now. Let me compile and write the full research output.
How can I add fuzzy/semantic search and a knowledge graph (like Obsidian/Foam) to my Jekyll GitHub Pages site without any build step, plugin, or installation? / Wie kann ich Fuzzy/Semantic-Suche und einen Wissensgraphen (wie Obsidian/Foam) in meine Jekyll-GitHub-Pages-Site einbauen — ohne Build-Schritt, Plugin oder Installation?
Here is the full research. I organized it by problem area, then specific patterns and tools.
The core constraint
You are on standard GitHub Pages. That means:
- No custom Ruby gems
- No GitHub Actions (if you want zero-config)
- No npm, no build pipeline
- Only native Jekyll + Liquid +
_data/+ CDN JavaScript
Everything must either be generated by Jekyll’s own Liquid at build time (via .json files with frontmatter layout: none) or loaded client-side from CDN.
Your current setup (assets/graph.json, graph-view.js, Fuse.js from CDN) is already the right architecture. The question is how to make each layer better.
1 — Generating graph.json automatically from frontmatter (no manual editing)
Right now you maintain assets/graph.json by hand. This is the first thing worth fixing.
The pattern: Create a .json file with layout: none (or layout: null) and use Liquid to loop site.pages or a collection. Jekyll lets you output each page as a JSON file using frontmatter for data — with layout: none you get a pure JSON page without any HTML styling, and the jsonify filter converts data straight to JSON without worrying about for loops or JSON syntax.
A minimal assets/graph.json generator:
---
layout: none
---
{
"nodes": [
{
"id": "/contents/publications/10Years/",
"label": "10 Years of CV Debugging Lessons",
"url": "/contents/publications/10Years/",
"tags": ["computer-vision","debugging","lessons-learned","opencv"],
"category": null
},
{
"id": "/contents/publications/Journals/3d-slam-humanoid-robots/",
"label": "3D SLAM and Humanoid Robot Linkages",
"url": "/contents/publications/Journals/3d-slam-humanoid-robots/",
"tags": ["slam","humanoid-robots","3d-mapping","robotics"],
"category": null
},
{
"id": "/contents/public/cv/3d/",
"label": "3D Vision & Real-Time Multi-Camera Systems",
"url": "/contents/public/cv/3d/",
"tags": ["computer-vision","3d-vision","depth-sensing","multi-camera"],
"category": null
},
{
"id": "/contents/publications/CV/",
"label": "CV — Dr. Farshid Pirahansiah",
"url": "/contents/publications/CV/",
"tags": ["computer-vision","resume","publications","patents"],
"category": null
},
{
"id": "/contents/public/Resources/",
"label": "Portfolio & Publications",
"url": "/contents/public/Resources/",
"tags": ["portfolio","publications","patents","research"],
"category": null
},
{
"id": "/contents/pkm/TOC/",
"label": "PKM Methods & Website Structure",
"url": "/contents/pkm/TOC/",
"tags": ["pkm","knowledge-management","productivity"],
"category": null
},
{
"id": "/contents/publications/Papers/adaptive-image-segmentation-psnr/",
"label": "PSNR-Based Segmentation for LPR",
"url": "/contents/publications/Papers/adaptive-image-segmentation-psnr/",
"tags": ["image-segmentation","psnr","thresholding","license-plate-recognition"],
"category": null
},
{
"id": "/contents/publications/Journals/adaptive-thresholding-psnr/",
"label": "Adaptive Thresholding Based on PSNR",
"url": "/contents/publications/Journals/adaptive-thresholding-psnr/",
"tags": ["thresholding","psnr","adaptive-thresholding","image-segmentation"],
"category": null
},
{
"id": "/contents/public/ai-llm/advanced-llm-concepts/",
"label": "Advanced LLM Concepts",
"url": "/contents/public/ai-llm/advanced-llm-concepts/",
"tags": ["ai","llm","rag","multimodal"],
"category": null
},
{
"id": "/contents/ai2026/ai-hardware/",
"label": "AI Hardware Accelerators",
"url": "/contents/ai2026/ai-hardware/",
"tags": ["AI-hardware","accelerators","NPU","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/publications/Journals/ant-colony-optimization/",
"label": "Ant Colony Optimization for Image Processing",
"url": "/contents/publications/Journals/ant-colony-optimization/",
"tags": ["ant-colony-optimization","image-processing","thresholding","optimization"],
"category": null
},
{
"id": "/contents/public/ai-llm/avatar-generator/",
"label": "Local Video Avatar Generator with Ollama",
"url": "/contents/public/ai-llm/avatar-generator/",
"tags": ["ai","llm","video-generation","ollama"],
"category": null
},
{
"id": "/contents/public/ai-llm/blog/",
"label": "Blog: AI, LLMs, and Computer Vision",
"url": "/contents/public/ai-llm/blog/",
"tags": ["ai","llm","rag","multi-agent"],
"category": null
},
{
"id": "/contents/ai2026/book-summary/",
"label": "Book Summaries",
"url": "/contents/ai2026/book-summary/",
"tags": ["books","summaries","PKM","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/publications/Papers/camera-calibration-multi-modal/",
"label": "Camera Calibration for Multi-Modal Vision",
"url": "/contents/publications/Papers/camera-calibration-multi-modal/",
"tags": ["camera-calibration","multi-modal","robotics","image-quality"],
"category": null
},
{
"id": "/contents/publications/Journals/character-object-recognition/",
"label": "Character & Object Recognition via Features",
"url": "/contents/publications/Journals/character-object-recognition/",
"tags": ["character-recognition","object-recognition","feature-extraction","glcm"],
"category": null
},
{
"id": "/contents/publications/Papers/character-recognition-global-feature/",
"label": "Character Recognition via Global Features",
"url": "/contents/publications/Papers/character-recognition-global-feature/",
"tags": ["character-recognition","feature-extraction","glcm","ocr"],
"category": null
},
{
"id": "/contents/publications/Papers/classification-geometrical-topological/",
"label": "Classification with Geometrical Features",
"url": "/contents/publications/Papers/classification-geometrical-topological/",
"tags": ["classification","geometrical-features","pattern-recognition","machine-learning"],
"category": null
},
{
"id": "/contents/ai2026/cloud-native/",
"label": "Cloud-Native with Kubernetes",
"url": "/contents/ai2026/cloud-native/",
"tags": ["Docker","Kubernetes","cloud-native","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/public/coaching/",
"label": "CV Coaching & Teaching Roadmap",
"url": "/contents/public/coaching/",
"tags": ["computer-vision","coaching","teaching","curriculum"],
"category": null
},
{
"id": "/contents/public/cpp/",
"label": "C++ Quick Reference",
"url": "/contents/public/cpp/",
"tags": ["cpp","programming","debugging","memory-management"],
"category": null
},
{
"id": "/contents/ai2026/edge-ai-summit/",
"label": "Edge AI Summit 2020",
"url": "/contents/ai2026/edge-ai-summit/",
"tags": ["edge-AI","summit","tinyML","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/ai2026/embedded-iot/",
"label": "Embedded IoT",
"url": "/contents/ai2026/embedded-iot/",
"tags": ["IoT","embedded","edge-AI","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/public/enter/",
"label": "Dr. Farshid Pirahansiah — CV & AI",
"url": "/contents/public/enter/",
"tags": ["computer-vision","ai","portfolio","about"],
"category": null
},
{
"id": "/contents/publications/Patents/face-image-augmentation/",
"label": "Face Image Augmentation WO2021060971A1",
"url": "/contents/publications/Patents/face-image-augmentation/",
"tags": ["patent","face-augmentation","gan","data-augmentation"],
"category": null
},
{
"id": "/contents/ppt/farshid-ai-cv-llm-presentation/",
"label": "Reducing Token Usage in AI-Assisted Development",
"url": "/contents/ppt/farshid-ai-cv-llm-presentation/",
"tags": ["presentation","ai","llm","token-optimization"],
"category": null
},
{
"id": "/contents/ai2026/fsdl-2022/",
"label": "FSDL 2022 Notes",
"url": "/contents/ai2026/fsdl-2022/",
"tags": ["FSDL","deep-learning","MLOps","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/ai2026/full-stack-deep-learning/",
"label": "Full Stack Deep Learning",
"url": "/contents/ai2026/full-stack-deep-learning/",
"tags": ["FSDL","full-stack-deep-learning","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/publications/Journals/gsft-psnr-fuzzy-threshold/",
"label": "GSFT-PSNR: Fuzzy Threshold Method",
"url": "/contents/publications/Journals/gsft-psnr-fuzzy-threshold/",
"tags": ["fuzzy-logic","thresholding","psnr","image-segmentation"],
"category": null
},
{
"id": "/contents/public/optimization/",
"label": "CV, DL & ML Optimization Guide",
"url": "/contents/public/optimization/",
"tags": ["optimization","deep-learning","machine-learning","computer-vision"],
"category": null
},
{
"id": "/contents/public/seo/",
"label": "SEO for LLM-Powered Search",
"url": "/contents/public/seo/",
"tags": ["seo","llm","ai","web-optimization"],
"category": null
},
{
"id": "/contents/public/python/",
"label": "Python Configuration & C++ Integration",
"url": "/contents/public/python/",
"tags": ["python","cpp","configuration","development"],
"category": null
},
{
"id": "/contents/public/projects/Solutions/",
"label": "Solutions",
"url": "/contents/public/projects/Solutions/",
"tags": ["portfolio","computer-vision","ai","projects"],
"category": null
},
{
"id": "/contents/public/prompts/",
"label": "Prompt Engineering Templates",
"url": "/contents/public/prompts/",
"tags": ["prompt-engineering","llm","ai","nlp"],
"category": null
},
{
"id": "/contents/public/",
"label": "Content Hub",
"url": "/contents/public/",
"tags": ["computer-vision","ai","llm","edge-ai"],
"category": null
},
{
"id": "/contents/publications/Books/",
"label": "Books & Book Chapters",
"url": "/contents/publications/Books/",
"tags": ["book","opencv","computer-vision","ai"],
"category": null
},
{
"id": "/contents/publications/Journals/",
"label": "Journal Publications",
"url": "/contents/publications/Journals/",
"tags": ["journal","image-processing","thresholding","pattern-recognition"],
"category": null
},
{
"id": "/contents/publications/Keynotes/",
"label": "Keynotes",
"url": "/contents/publications/Keynotes/",
"tags": ["keynote","ai","computer-vision","multimodal"],
"category": null
},
{
"id": "/contents/publications/Patents/",
"label": "Patents",
"url": "/contents/publications/Patents/",
"tags": ["patent","face-detection","vehicle-detection","augmented-reality"],
"category": null
},
{
"id": "/contents/publications/Papers/",
"label": "Conference Papers",
"url": "/contents/publications/Papers/",
"tags": ["research","paper","image-processing","computer-vision"],
"category": null
},
{
"id": "/contents/ai2026/iot-scholarship/",
"label": "IoT Scholarship: Edge AI with OpenVINO",
"url": "/contents/ai2026/iot-scholarship/",
"tags": ["IoT","OpenVINO","edge-AI","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/publications/Papers/license-plate-recognition-entropy/",
"label": "Entropy-Based Multi-Threshold LPR",
"url": "/contents/publications/Papers/license-plate-recognition-entropy/",
"tags": ["license-plate-recognition","entropy","thresholding","image-segmentation"],
"category": null
},
{
"id": "/contents/public/linkedin-top-posts/",
"label": "Top LinkedIn Posts 2024",
"url": "/contents/public/linkedin-top-posts/",
"tags": ["linkedin","camera-calibration","cpp","robotics"],
"category": null
},
{
"id": "/contents/public/links/",
"label": "Curated Links & Resources",
"url": "/contents/public/links/",
"tags": ["resources","tools","tutorials","references"],
"category": null
},
{
"id": "/contents/pkm/links/",
"label": "Curated Links & Resources",
"url": "/contents/pkm/links/",
"tags": ["curated-links","ai-tools","resources"],
"category": null
},
{
"id": "/contents/ai2026/machine-learning-specialization/",
"label": "Machine Learning Specialization",
"url": "/contents/ai2026/machine-learning-specialization/",
"tags": ["ML","Coursera","machine-learning-specialization","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/ai2026/metaverse/",
"label": "Metaverse & XR",
"url": "/contents/ai2026/metaverse/",
"tags": ["metaverse","XR","spatial-computing","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/ai2026/mlops/",
"label": "MLOps",
"url": "/contents/ai2026/mlops/",
"tags": ["MLOps","machine-learning-engineering","Coursera","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/public/cuda-gpu/mlx-coreml-metal/",
"label": "MLX, CoreML, and Metal for Apple Silicon",
"url": "/contents/public/cuda-gpu/mlx-coreml-metal/",
"tags": ["apple-silicon","coreml","metal","mlx"],
"category": null
},
{
"id": "/contents/ai2026/modern-cpp/",
"label": "Modern C++ for Image Processing",
"url": "/contents/ai2026/modern-cpp/",
"tags": ["C++","C++23","image-processing","design-patterns","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/public/cv/multi-camera-systems/",
"label": "Real-Time Multi-Camera Vision Systems",
"url": "/contents/public/cv/multi-camera-systems/",
"tags": ["computer-vision","multi-camera","real-time","edge-ai"],
"category": null
},
{
"id": "/contents/public/cuda-gpu/numba-jit/",
"label": "Accelerate Python with Numba's @jit(nopython=True)",
"url": "/contents/public/cuda-gpu/numba-jit/",
"tags": ["python","numba","jit","performance"],
"category": null
},
{
"id": "/contents/publications/Books/AI/opencv5-chapter3-advanced/",
"label": "OpenCV 5 — Chapter 3: Advanced Topics",
"url": "/contents/publications/Books/AI/opencv5-chapter3-advanced/",
"tags": ["opencv","computer-vision","image-processing","filtering"],
"category": null
},
{
"id": "/contents/ai2026/openvino/",
"label": "OpenVINO Deep Learning",
"url": "/contents/ai2026/openvino/",
"tags": ["OpenVINO","Intel","inference","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/public/cv/optical-flow/",
"label": "Optical Flow: Challenges and Solutions",
"url": "/contents/public/cv/optical-flow/",
"tags": ["computer-vision","optical-flow","motion-analysis","opencv"],
"category": null
},
{
"id": "/contents/public/ai-llm/orchestrating-agents/",
"label": "Mind Map: Orchestrating AI Agents",
"url": "/contents/public/ai-llm/orchestrating-agents/",
"tags": ["ai","llm","agents","multi-agent"],
"category": null
},
{
"id": "/contents/ai2026/parallel-programming/",
"label": "Parallel Programming for Computer Vision",
"url": "/contents/ai2026/parallel-programming/",
"tags": ["parallel-programming","Python","computer-vision","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/publications/Papers/pattern-image-calibration/",
"label": "Pattern Image for Camera Calibration",
"url": "/contents/publications/Papers/pattern-image-calibration/",
"tags": ["camera-calibration","pattern-recognition","robotics"],
"category": null
},
{
"id": "/contents/public/product/",
"label": "Product — Embedded CV & Edge AI",
"url": "/contents/public/product/",
"tags": ["computer-vision","edge-ai","embedded-systems","product"],
"category": null
},
{
"id": "/contents/pkm/proof/",
"label": "Site Link Index",
"url": "/contents/pkm/proof/",
"tags": ["site-index","links","documentation"],
"category": null
},
{
"id": "/contents/publications/Journals/psnr-threshold-segmentation/",
"label": "PSNR Threshold for Image Segmentation",
"url": "/contents/publications/Journals/psnr-threshold-segmentation/",
"tags": ["psnr","thresholding","image-segmentation","image-processing"],
"category": null
},
{
"id": "/contents/public/cuda-gpu/pycuda-kernels/",
"label": "How PyCUDA Reads and Runs C Kernels",
"url": "/contents/public/cuda-gpu/pycuda-kernels/",
"tags": ["cuda","gpu","python","parallel-computing"],
"category": null
},
{
"id": "/contents/public/research/",
"label": "Research — Publications & Patents",
"url": "/contents/public/research/",
"tags": ["research","publications","patents","computer-vision"],
"category": null
},
{
"id": "/contents/ai2026/risc-v/",
"label": "RISC-V for AI",
"url": "/contents/ai2026/risc-v/",
"tags": ["RISC-V","edge-AI","processor","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/ai2026/ros/",
"label": "ROS: Robot Operating System",
"url": "/contents/ai2026/ros/",
"tags": ["ROS","robotics","ETH-Zurich","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/public/setup/",
"label": "Developer Tools & Setup Guide",
"url": "/contents/public/setup/",
"tags": ["developer-tools","docker","github","productivity"],
"category": null
},
{
"id": "/contents/public/shell-vim-quickref/",
"label": "Shell & Vim Quick Reference",
"url": "/contents/public/shell-vim-quickref/",
"tags": ["shell","vim","cli","developer-tools"],
"category": null
},
{
"id": "/assets/site-map/",
"label": "Sitemap",
"url": "/assets/site-map/",
"tags": "indexing, sitemap",
"category": null
},
{
"id": "/contents/public/solutions/",
"label": "Solutions — AI Courses & Workshops",
"url": "/contents/public/solutions/",
"tags": ["ai","courses","workshops","deep-learning"],
"category": null
},
{
"id": "/contents/public/startup/",
"label": "Startup Guide: Edge AI Business",
"url": "/contents/public/startup/",
"tags": ["startup","business","fundraising","ai"],
"category": null
},
{
"id": "/contents/publications/Papers/tafreshgrid-grid-computing/",
"label": "TafreshGrid: Grid Computing",
"url": "/contents/publications/Papers/tafreshgrid-grid-computing/",
"tags": ["grid-computing","distributed-systems","high-performance-computing"],
"category": null
},
{
"id": "/contents/ai2026/tensorflow-deployment/",
"label": "TensorFlow Deployment Specialization",
"url": "/contents/ai2026/tensorflow-deployment/",
"tags": ["TensorFlow","TF.js","TF-Lite","mobile-ML","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/ai2026/tesla/",
"label": "Tesla AI",
"url": "/contents/ai2026/tesla/",
"tags": ["Tesla","autonomous-driving","AI","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/ai2026/topics/",
"label": "Topics & Projects",
"url": "/contents/ai2026/topics/",
"tags": ["AI","OpenCV","camera-calibration","DRL","FarshidPirahansiah"],
"category": null
},
{
"id": "/contents/pkm/use-cases/",
"label": "Complete Portfolio",
"url": "/contents/pkm/use-cases/",
"tags": ["portfolio","computer-vision","edge-ai","github-projects"],
"category": null
},
{
"id": "/contents/publications/Patents/vehicle-detection/",
"label": "Moving Vehicle Detection WO2021107761A1",
"url": "/contents/publications/Patents/vehicle-detection/",
"tags": ["patent","vehicle-detection","image-processing","traffic-surveillance"],
"category": null
},
{
"id": "/contents/public/cuda-gpu/vscode-cuda-windows/",
"label": "CUDA Development Environment in VS Code on Windows",
"url": "/contents/public/cuda-gpu/vscode-cuda-windows/",
"tags": ["cuda","gpu","development","visual-studio-code"],
"category": null
},
]
}
The approach works by decoupling the data source — storing data in YAML/frontmatter and generating JSON with Liquid — making it easy to swap in different visualizations while keeping data management in one place.
For tag co-occurrence edges (your graph-hashtags.json), loop all pairs of pages that share a tag:
This approach works on GitHub Pages because it uses only Liquid to do the counting and build the JSON string — no additional plugins needed.
2 — Fuzzy search: what you have vs. what you can add
You already use Fuse.js from CDN. That is the right call.
Fuse.js is a JavaScript library focused on “fuzzy” searching — approximate string matching — finding strings that are approximately equal to a given pattern rather than exactly. It initializes with index data and a configuration object, then the search() method returns an array of results each containing a reference to the original item.
The gap in your current setup is probably the CONTENT_INDEX. Right now it likely has title + tags. You can improve it by including:
tagsarray (weight: 0.6)title(weight: 0.4)category(weight: 0.2)- Optionally a
keywordsorpointsfield from frontmatter
Fuse.js config for multi-field weighted search:
const fuse = new Fuse(CONTENT_INDEX, {
keys: [
{ name: 'title', weight: 0.4 },
{ name: 'tags', weight: 0.4 },
{ name: 'category', weight: 0.2 }
],
threshold: 0.35, // 0 = exact, 1 = anything
includeScore: true,
useExtendedSearch: true // enables prefix/suffix/exact operators
})
Fuse.js provides a weighting system, allowing developers to assign different importance levels to fields. In real-world applications, searching across multiple fields with varying relevance is a common requirement, and Fuse.js handles this with per-field weights.
True semantic search (meaning-based, not character-based) requires an embedding model and vector DB. Semantic search converts text into high-dimensional vectors using a language model, then finds items whose vectors are close together in that space — it runs server-side, while Fuse.js runs entirely in the browser. You cannot do real semantic search on static GitHub Pages without a backend. Fuse.js is the correct answer for your constraint.
For hashtag search, extend Fuse’s index with a hashtags field populated from frontmatter:
---
tags: [computer-vision, edge-ai, onnx]
hashtags: "#cv #edge #hailo #mlops"
---
Then include hashtags as a Fuse.js key with moderate weight.
3 — Obsidian/Foam-style graph: what those actually do
Foam uses shortcuts and autocompletions to link thoughts together with [[wikilinks]], and provides a Graph Visualisation to get an overview of the workspace and discover relationships between thoughts using backlinking. The actual graph rendering in Foam is done in VS Code — it is not a static site feature.
For a published static version, what you want is exactly what you already built: D3 force-directed graph + JSON data. The key missing pieces vs. Obsidian are:
a) Backlink-based edges, not manually defined edges. Obsidian links pages by [[wikilink]]. You can mimic this with Jekyll by scanning page content for links (harder) or by adding a links: array to each page’s frontmatter and generating edges from that.
b) Node size = connectivity. Obsidian makes frequently-linked nodes bigger. In D3:
node.attr('r', d => 4 + Math.sqrt(d.linkCount || 1) * 2)
c) Hover preview. This is pure CSS + JS, no backend needed.
4 — D3 canvas rendering: what you already have is correct
For massive data sets, canvas rendering should be used instead of SVG — while SVG is great for small to moderate visualizations, canvas can handle thousands of elements with better performance. Your graph-view.js uses canvas, which is the right choice for 79+ nodes.
The D3 force simulation can be loaded purely from CDN:
<script src="https://cdn.jsdelivr.net/npm/d3@7/+esm" type="module"></script>
D3’s d3-force module: create a simulation for an array of nodes, apply the desired forces, then listen for tick events to render the nodes in your preferred graphics system, such as Canvas or SVG.
5 — What jekyll-graph (wikibonsai) does — and why you should NOT use it
jekyll-graph generates data and renders a graph that allows visitors to navigate a Jekyll site by clicking nodes. Nodes come from the site’s markdown files. Links for the web graph come from jekyll-wikilinks. It requires a Ruby plugin, so it does not work on standard GitHub Pages without GitHub Actions. Skip it.
6 — Specific architecture recommendations for your setup
Your current file split is good. Here is what to change or add:
Auto-generate assets/graph.json with Liquid (no more manual maintenance):
assets/graph.json ← Liquid template, layout: none
assets/graph-hashtags.json ← Liquid template, layout: none
Add a search-index.json file for Fuse.js (separate from graph data, optimized for search):
---
layout: none
---
[
{
"id": "/contents/publications/10Years/",
"title": "10 Years of CV Debugging Lessons",
"tags": ["computer-vision","debugging","lessons-learned","opencv"],
"hashtags": "#cv #debugging #lessonslearned #opencv",
"category": null,
"url": "/contents/publications/10Years/"
},
{
"id": "/contents/publications/Papers/2d-3d-map-movement/",
"title": "2D vs 3D Mapping for Moving Objects",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/publications/Papers/2d-3d-map-movement/"
},
{
"id": "/contents/publications/Journals/3d-slam-humanoid-robots/",
"title": "3D SLAM and Humanoid Robot Linkages",
"tags": ["slam","humanoid-robots","3d-mapping","robotics"],
"hashtags": "#slam #humanoidrobots #3dmapping #robotics",
"category": null,
"url": "/contents/publications/Journals/3d-slam-humanoid-robots/"
},
{
"id": "/contents/public/cv/3d/",
"title": "3D Vision & Real-Time Multi-Camera Systems",
"tags": ["computer-vision","3d-vision","depth-sensing","multi-camera"],
"hashtags": "#cv #3dvision #depthsensing #multicamera",
"category": null,
"url": "/contents/public/cv/3d/"
},
{
"id": "/404.html",
"title": "Page Not Found",
"tags": null,
"hashtags": null,
"category": null,
"url": "/404.html"
},
{
"id": "/contents/pkm/AboutMe/",
"title": "Dr. Farshid Pirahansiah — AI & Computer Vision Engineer",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/pkm/AboutMe/"
},
{
"id": "/contents/publications/CV/",
"title": "CV — Dr. Farshid Pirahansiah",
"tags": ["computer-vision","resume","publications","patents"],
"hashtags": "#cv #resume #publications #patents",
"category": null,
"url": "/contents/publications/CV/"
},
{
"id": "/contents/publications/Papers/My_Conference_Paper/",
"title": "Conference Paper on Computer Vision",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/publications/Papers/My_Conference_Paper/"
},
{
"id": "/contents/public/Resources/",
"title": "Portfolio & Publications",
"tags": ["portfolio","publications","patents","research"],
"hashtags": "#portfolio #publications #patents #research",
"category": null,
"url": "/contents/public/Resources/"
},
{
"id": "/contents/pkm/TOC/",
"title": "PKM Methods & Website Structure",
"tags": ["pkm","knowledge-management","productivity"],
"hashtags": "#pkm #knowledgemanagement #productivity",
"category": null,
"url": "/contents/pkm/TOC/"
},
{
"id": "/contents/publications/Papers/adaptive-image-segmentation-psnr/",
"title": "PSNR-Based Segmentation for LPR",
"tags": ["image-segmentation","psnr","thresholding","license-plate-recognition"],
"hashtags": "#imagesegmentation #psnr #thresholding #lpr",
"category": null,
"url": "/contents/publications/Papers/adaptive-image-segmentation-psnr/"
},
{
"id": "/contents/publications/Journals/adaptive-thresholding-psnr/",
"title": "Adaptive Thresholding Based on PSNR",
"tags": ["thresholding","psnr","adaptive-thresholding","image-segmentation"],
"hashtags": "#thresholding #psnr #adaptivethresholding #imagesegmentation",
"category": null,
"url": "/contents/publications/Journals/adaptive-thresholding-psnr/"
},
{
"id": "/contents/public/ai-llm/advanced-llm-concepts/",
"title": "Advanced LLM Concepts",
"tags": ["ai","llm","rag","multimodal"],
"hashtags": "#ai #llm #rag #multimodal",
"category": null,
"url": "/contents/public/ai-llm/advanced-llm-concepts/"
},
{
"id": "/contents/ai2026/ai-hardware/",
"title": "AI Hardware Accelerators",
"tags": ["AI-hardware","accelerators","NPU","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/ai-hardware/"
},
{
"id": "/contents/publications/Journals/ant-colony-optimization/",
"title": "Ant Colony Optimization for Image Processing",
"tags": ["ant-colony-optimization","image-processing","thresholding","optimization"],
"hashtags": "#aco #imageprocessing #thresholding #optimization",
"category": null,
"url": "/contents/publications/Journals/ant-colony-optimization/"
},
{
"id": "/contents/public/ai-llm/avatar-generator/",
"title": "Local Video Avatar Generator with Ollama",
"tags": ["ai","llm","video-generation","ollama"],
"hashtags": "#ai #llm #videogeneration #ollama",
"category": null,
"url": "/contents/public/ai-llm/avatar-generator/"
},
{
"id": "/contents/public/ai-llm/blog/",
"title": "Blog: AI, LLMs, and Computer Vision",
"tags": ["ai","llm","rag","multi-agent"],
"hashtags": "#ai #llm #rag #multiagent",
"category": null,
"url": "/contents/public/ai-llm/blog/"
},
{
"id": "/contents/ai2026/book-summary/",
"title": "Book Summaries",
"tags": ["books","summaries","PKM","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/book-summary/"
},
{
"id": "/contents/publications/Papers/camera-calibration-multi-modal/",
"title": "Camera Calibration for Multi-Modal Vision",
"tags": ["camera-calibration","multi-modal","robotics","image-quality"],
"hashtags": "#cameracalibration #multimodal #robotics #iqa",
"category": null,
"url": "/contents/publications/Papers/camera-calibration-multi-modal/"
},
{
"id": "/contents/publications/Journals/character-object-recognition/",
"title": "Character & Object Recognition via Features",
"tags": ["character-recognition","object-recognition","feature-extraction","glcm"],
"hashtags": "#characterrecognition #objectrecognition #featureextraction #glcm",
"category": null,
"url": "/contents/publications/Journals/character-object-recognition/"
},
{
"id": "/contents/publications/Papers/character-recognition-global-feature/",
"title": "Character Recognition via Global Features",
"tags": ["character-recognition","feature-extraction","glcm","ocr"],
"hashtags": "#characterrecognition #featureextraction #glcm #ocr",
"category": null,
"url": "/contents/publications/Papers/character-recognition-global-feature/"
},
{
"id": "/contents/publications/Papers/classification-geometrical-topological/",
"title": "Classification with Geometrical Features",
"tags": ["classification","geometrical-features","pattern-recognition","machine-learning"],
"hashtags": "#classification #geometricalfeatures #patternrecognition #ml",
"category": null,
"url": "/contents/publications/Papers/classification-geometrical-topological/"
},
{
"id": "/contents/ai2026/cloud-native/",
"title": "Cloud-Native with Kubernetes",
"tags": ["Docker","Kubernetes","cloud-native","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/cloud-native/"
},
{
"id": "/contents/public/coaching/",
"title": "CV Coaching & Teaching Roadmap",
"tags": ["computer-vision","coaching","teaching","curriculum"],
"hashtags": "#cv #coaching #teaching #curriculum",
"category": null,
"url": "/contents/public/coaching/"
},
{
"id": "/contents/publications/Books/AI/computer-vision-meets-llm/",
"title": "Computer Vision Meets LLM",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/publications/Books/AI/computer-vision-meets-llm/"
},
{
"id": "/contents/public/cpp/",
"title": "C++ Quick Reference",
"tags": ["cpp","programming","debugging","memory-management"],
"hashtags": "#cpp #programming #debugging #memorymanagement",
"category": null,
"url": "/contents/public/cpp/"
},
{
"id": "/contents/ai2026/edge-ai-summit/",
"title": "Edge AI Summit 2020",
"tags": ["edge-AI","summit","tinyML","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/edge-ai-summit/"
},
{
"id": "/contents/ai2026/embedded-iot/",
"title": "Embedded IoT",
"tags": ["IoT","embedded","edge-AI","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/embedded-iot/"
},
{
"id": "/contents/public/enter/",
"title": "Dr. Farshid Pirahansiah — CV & AI",
"tags": ["computer-vision","ai","portfolio","about"],
"hashtags": "#cv #ai #portfolio #about",
"category": null,
"url": "/contents/public/enter/"
},
{
"id": "/contents/publications/Patents/face-image-augmentation/",
"title": "Face Image Augmentation WO2021060971A1",
"tags": ["patent","face-augmentation","gan","data-augmentation"],
"hashtags": "#patent #faceaugmentation #gan #dataaugmentation",
"category": null,
"url": "/contents/publications/Patents/face-image-augmentation/"
},
{
"id": "/contents/publications/Patents/facial-analysis-advertisement/",
"title": "Facial Analysis Advertisement WO2020141969A2",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/publications/Patents/facial-analysis-advertisement/"
},
{
"id": "/graph-tags/",
"title": "Hashtag Graph",
"tags": null,
"hashtags": null,
"category": null,
"url": "/graph-tags/"
},
{
"id": "/graph/",
"title": "Knowledge Graph",
"tags": null,
"hashtags": null,
"category": null,
"url": "/graph/"
},
{
"id": "/contents/ppt/farshid-ai-cv-llm-presentation/",
"title": "Reducing Token Usage in AI-Assisted Development",
"tags": ["presentation","ai","llm","token-optimization"],
"hashtags": "#presentation #ai #llm #token-optimization",
"category": null,
"url": "/contents/ppt/farshid-ai-cv-llm-presentation/"
},
{
"id": "/view/",
"title": "View",
"tags": null,
"hashtags": null,
"category": null,
"url": "/view/"
},
{
"id": "/contents/ai2026/fsdl-2022/",
"title": "FSDL 2022 Notes",
"tags": ["FSDL","deep-learning","MLOps","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/fsdl-2022/"
},
{
"id": "/contents/ai2026/full-stack-deep-learning/",
"title": "Full Stack Deep Learning",
"tags": ["FSDL","full-stack-deep-learning","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/full-stack-deep-learning/"
},
{
"id": "/graphnowledge/",
"title": "Knowledge Graph — Files & Architecture",
"tags": null,
"hashtags": null,
"category": null,
"url": "/graphnowledge/"
},
{
"id": "/contents/publications/Journals/gsft-psnr-fuzzy-threshold/",
"title": "GSFT-PSNR: Fuzzy Threshold Method",
"tags": ["fuzzy-logic","thresholding","psnr","image-segmentation"],
"hashtags": "#fuzzylogic #thresholding #psnr #imagesegmentation",
"category": null,
"url": "/contents/publications/Journals/gsft-psnr-fuzzy-threshold/"
},
{
"id": "/contents/projects/imageinMD/",
"title": "test mindmap",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/projects/imageinMD/"
},
{
"id": "/contents/public/optimization/",
"title": "CV, DL & ML Optimization Guide",
"tags": ["optimization","deep-learning","machine-learning","computer-vision"],
"hashtags": "#optimization #deeplearning #machinelearning #cv",
"category": null,
"url": "/contents/public/optimization/"
},
{
"id": "/contents/public/seo/",
"title": "SEO for LLM-Powered Search",
"tags": ["seo","llm","ai","web-optimization"],
"hashtags": "#seo #llm #ai #weboptimization",
"category": null,
"url": "/contents/public/seo/"
},
{
"id": "/contents/public/python/",
"title": "Python Configuration & C++ Integration",
"tags": ["python","cpp","configuration","development"],
"hashtags": "#python #cpp #configuration #devtools",
"category": null,
"url": "/contents/public/python/"
},
{
"id": "/contents/public/projects/Solutions/",
"title": "Solutions",
"tags": ["portfolio","computer-vision","ai","projects"],
"hashtags": "#portfolio #cv #ai #projects",
"category": null,
"url": "/contents/public/projects/Solutions/"
},
{
"id": "/contents/public/prompts/",
"title": "Prompt Engineering Templates",
"tags": ["prompt-engineering","llm","ai","nlp"],
"hashtags": "#promptengineering #llm #ai #nlp",
"category": null,
"url": "/contents/public/prompts/"
},
{
"id": "/contents/public/",
"title": "Content Hub",
"tags": ["computer-vision","ai","llm","edge-ai"],
"hashtags": "#cv #ai #llm #edgeai",
"category": null,
"url": "/contents/public/"
},
{
"id": "/contents/publications/Books/",
"title": "Books & Book Chapters",
"tags": ["book","opencv","computer-vision","ai"],
"hashtags": "#book #opencv #computervision #ai",
"category": null,
"url": "/contents/publications/Books/"
},
{
"id": "/contents/publications/Journals/",
"title": "Journal Publications",
"tags": ["journal","image-processing","thresholding","pattern-recognition"],
"hashtags": "#research #cv #journals #thresholding",
"category": null,
"url": "/contents/publications/Journals/"
},
{
"id": "/contents/publications/Keynotes/",
"title": "Keynotes",
"tags": ["keynote","ai","computer-vision","multimodal"],
"hashtags": "#keynote #ai #computervision #multimodal",
"category": null,
"url": "/contents/publications/Keynotes/"
},
{
"id": "/contents/publications/Patents/",
"title": "Patents",
"tags": ["patent","face-detection","vehicle-detection","augmented-reality"],
"hashtags": "#patent #facedetection #vehicledetection #augmentedreality",
"category": null,
"url": "/contents/publications/Patents/"
},
{
"id": "/contents/publications/Papers/",
"title": "Conference Papers",
"tags": ["research","paper","image-processing","computer-vision"],
"hashtags": "#research #cv #papers #imageprocessing",
"category": null,
"url": "/contents/publications/Papers/"
},
{
"id": "/",
"title": "Dr. Farshid Pirahansiah ; Embedded Computer Vision & Edge AI",
"tags": null,
"hashtags": null,
"category": null,
"url": "/"
},
{
"id": "/contents/ai2026/iot-scholarship/",
"title": "IoT Scholarship: Edge AI with OpenVINO",
"tags": ["IoT","OpenVINO","edge-AI","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/iot-scholarship/"
},
{
"id": "/contents/publications/Papers/license-plate-recognition-entropy/",
"title": "Entropy-Based Multi-Threshold LPR",
"tags": ["license-plate-recognition","entropy","thresholding","image-segmentation"],
"hashtags": "#lpr #entropy #thresholding #imagesegmentation",
"category": null,
"url": "/contents/publications/Papers/license-plate-recognition-entropy/"
},
{
"id": "/contents/public/linkedin-top-posts/",
"title": "Top LinkedIn Posts 2024",
"tags": ["linkedin","camera-calibration","cpp","robotics"],
"hashtags": "#linkedin #cameracalibration #cpp #robotics",
"category": null,
"url": "/contents/public/linkedin-top-posts/"
},
{
"id": "/contents/public/links/",
"title": "Curated Links & Resources",
"tags": ["resources","tools","tutorials","references"],
"hashtags": "#resources #tools #tutorials #references",
"category": null,
"url": "/contents/public/links/"
},
{
"id": "/contents/pkm/links/",
"title": "Curated Links & Resources",
"tags": ["curated-links","ai-tools","resources"],
"hashtags": "#curatedlinks #aitools #resources",
"category": null,
"url": "/contents/pkm/links/"
},
{
"id": "/contents/ai2026/machine-learning-specialization/",
"title": "Machine Learning Specialization",
"tags": ["ML","Coursera","machine-learning-specialization","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/machine-learning-specialization/"
},
{
"id": "/contents/menus/",
"title": "Sitemap & Page Summaries",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/menus/"
},
{
"id": "/contents/ai2026/metaverse/",
"title": "Metaverse & XR",
"tags": ["metaverse","XR","spatial-computing","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/metaverse/"
},
{
"id": "/contents/ai2026/mlops/",
"title": "MLOps",
"tags": ["MLOps","machine-learning-engineering","Coursera","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/mlops/"
},
{
"id": "/contents/public/cuda-gpu/mlx-coreml-metal/",
"title": "MLX, CoreML, and Metal for Apple Silicon",
"tags": ["apple-silicon","coreml","metal","mlx"],
"hashtags": "#applesilicon #coreml #metal #mlx",
"category": null,
"url": "/contents/public/cuda-gpu/mlx-coreml-metal/"
},
{
"id": "/contents/ai2026/modern-cpp/",
"title": "Modern C++ for Image Processing",
"tags": ["C++","C++23","image-processing","design-patterns","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/modern-cpp/"
},
{
"id": "/contents/public/cv/multi-camera-systems/",
"title": "Real-Time Multi-Camera Vision Systems",
"tags": ["computer-vision","multi-camera","real-time","edge-ai"],
"hashtags": "#cv #multicamera #realtime #edgeai",
"category": null,
"url": "/contents/public/cv/multi-camera-systems/"
},
{
"id": "/contents/public/cuda-gpu/numba-jit/",
"title": "Accelerate Python with Numba's @jit(nopython=True)",
"tags": ["python","numba","jit","performance"],
"hashtags": "#python #numba #jit #performance",
"category": null,
"url": "/contents/public/cuda-gpu/numba-jit/"
},
{
"id": "/contents/publications/Books/AI/opencv5-chapter0-introduction/",
"title": "OpenCV 5 — Chapter 0: Introduction",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/publications/Books/AI/opencv5-chapter0-introduction/"
},
{
"id": "/contents/publications/Books/AI/opencv5-chapter1-image-basics/",
"title": "OpenCV 5 — Chapter 1: Image Basics",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/publications/Books/AI/opencv5-chapter1-image-basics/"
},
{
"id": "/contents/publications/Books/AI/opencv5-chapter2-feature-detection/",
"title": "OpenCV 5 — Chapter 2: Feature Detection",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/publications/Books/AI/opencv5-chapter2-feature-detection/"
},
{
"id": "/contents/publications/Books/AI/opencv5-chapter3-advanced/",
"title": "OpenCV 5 — Chapter 3: Advanced Topics",
"tags": ["opencv","computer-vision","image-processing","filtering"],
"hashtags": "#opencv #cv #imageprocessing #filtering",
"category": null,
"url": "/contents/publications/Books/AI/opencv5-chapter3-advanced/"
},
{
"id": "/contents/ai2026/openvino/",
"title": "OpenVINO Deep Learning",
"tags": ["OpenVINO","Intel","inference","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/openvino/"
},
{
"id": "/contents/public/cv/optical-flow/",
"title": "Optical Flow: Challenges and Solutions",
"tags": ["computer-vision","optical-flow","motion-analysis","opencv"],
"hashtags": "#cv #opticalflow #motionanalysis #opencv",
"category": null,
"url": "/contents/public/cv/optical-flow/"
},
{
"id": "/contents/public/ai-llm/orchestrating-agents/",
"title": "Mind Map: Orchestrating AI Agents",
"tags": ["ai","llm","agents","multi-agent"],
"hashtags": "#ai #llm #agents #multiagent",
"category": null,
"url": "/contents/public/ai-llm/orchestrating-agents/"
},
{
"id": "/contents/ai2026/parallel-programming/",
"title": "Parallel Programming for Computer Vision",
"tags": ["parallel-programming","Python","computer-vision","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/parallel-programming/"
},
{
"id": "/contents/publications/Papers/pattern-image-calibration/",
"title": "Pattern Image for Camera Calibration",
"tags": ["camera-calibration","pattern-recognition","robotics"],
"hashtags": "#cameracalibration #patternrecognition #robotics",
"category": null,
"url": "/contents/publications/Papers/pattern-image-calibration/"
},
{
"id": "/privacy/",
"title": "Privacy Policy",
"tags": null,
"hashtags": null,
"category": null,
"url": "/privacy/"
},
{
"id": "/contents/public/product/",
"title": "Product — Embedded CV & Edge AI",
"tags": ["computer-vision","edge-ai","embedded-systems","product"],
"hashtags": "#cv #edgeai #embeddedsystems #product",
"category": null,
"url": "/contents/public/product/"
},
{
"id": "/contents/pkm/proof/",
"title": "Site Link Index",
"tags": ["site-index","links","documentation"],
"hashtags": "#siteindex #links #documentation",
"category": null,
"url": "/contents/pkm/proof/"
},
{
"id": "/contents/publications/Journals/psnr-threshold-segmentation/",
"title": "PSNR Threshold for Image Segmentation",
"tags": ["psnr","thresholding","image-segmentation","image-processing"],
"hashtags": "#psnr #thresholding #imagesegmentation #imageprocessing",
"category": null,
"url": "/contents/publications/Journals/psnr-threshold-segmentation/"
},
{
"id": "/contents/public/cuda-gpu/pycuda-kernels/",
"title": "How PyCUDA Reads and Runs C Kernels",
"tags": ["cuda","gpu","python","parallel-computing"],
"hashtags": "#cuda #gpu #python #parallelcomputing",
"category": null,
"url": "/contents/public/cuda-gpu/pycuda-kernels/"
},
{
"id": "/contents/public/research/",
"title": "Research — Publications & Patents",
"tags": ["research","publications","patents","computer-vision"],
"hashtags": "#research #publications #patents #cv",
"category": null,
"url": "/contents/public/research/"
},
{
"id": "/contents/ai2026/risc-v/",
"title": "RISC-V for AI",
"tags": ["RISC-V","edge-AI","processor","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/risc-v/"
},
{
"id": "/contents/ai2026/ros/",
"title": "ROS: Robot Operating System",
"tags": ["ROS","robotics","ETH-Zurich","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/ros/"
},
{
"id": "/search/",
"title": "Search",
"tags": null,
"hashtags": null,
"category": null,
"url": "/search/"
},
{
"id": "/contents/public/setup/",
"title": "Developer Tools & Setup Guide",
"tags": ["developer-tools","docker","github","productivity"],
"hashtags": "#devtools #docker #github #productivity",
"category": null,
"url": "/contents/public/setup/"
},
{
"id": "/contents/public/shell-vim-quickref/",
"title": "Shell & Vim Quick Reference",
"tags": ["shell","vim","cli","developer-tools"],
"hashtags": "#shell #vim #cli #devtools",
"category": null,
"url": "/contents/public/shell-vim-quickref/"
},
{
"id": "/assets/site-map/",
"title": "Sitemap",
"tags": "indexing, sitemap",
"hashtags": null,
"category": null,
"url": "/assets/site-map/"
},
{
"id": "/contents/sitemap/",
"title": "Sitemap — All Pages",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/sitemap/"
},
{
"id": "/contents/public/solutions/",
"title": "Solutions — AI Courses & Workshops",
"tags": ["ai","courses","workshops","deep-learning"],
"hashtags": "#ai #courses #workshops #deeplearning",
"category": null,
"url": "/contents/public/solutions/"
},
{
"id": "/contents/public/startup/",
"title": "Startup Guide: Edge AI Business",
"tags": ["startup","business","fundraising","ai"],
"hashtags": "#startup #business #fundraising #ai",
"category": null,
"url": "/contents/public/startup/"
},
{
"id": "/contents/publications/Papers/tafreshgrid-grid-computing/",
"title": "TafreshGrid: Grid Computing",
"tags": ["grid-computing","distributed-systems","high-performance-computing"],
"hashtags": "#gridcomputing #distributedsystems #hpc",
"category": null,
"url": "/contents/publications/Papers/tafreshgrid-grid-computing/"
},
{
"id": "/contents/ai2026/tensorflow-deployment/",
"title": "TensorFlow Deployment Specialization",
"tags": ["TensorFlow","TF.js","TF-Lite","mobile-ML","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/tensorflow-deployment/"
},
{
"id": "/terms/",
"title": "Terms of Service",
"tags": null,
"hashtags": null,
"category": null,
"url": "/terms/"
},
{
"id": "/contents/ai2026/tesla/",
"title": "Tesla AI",
"tags": ["Tesla","autonomous-driving","AI","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/tesla/"
},
{
"id": "/contents/ai2026/topics/",
"title": "Topics & Projects",
"tags": ["AI","OpenCV","camera-calibration","DRL","FarshidPirahansiah"],
"hashtags": null,
"category": null,
"url": "/contents/ai2026/topics/"
},
{
"id": "/contents/pkm/use-cases/",
"title": "Complete Portfolio",
"tags": ["portfolio","computer-vision","edge-ai","github-projects"],
"hashtags": "#portfolio #computervision #edgeai #github",
"category": null,
"url": "/contents/pkm/use-cases/"
},
{
"id": "/contents/publications/Patents/vehicle-detection/",
"title": "Moving Vehicle Detection WO2021107761A1",
"tags": ["patent","vehicle-detection","image-processing","traffic-surveillance"],
"hashtags": "#patent #vehicledetection #imageprocessing #trafficsurveillance",
"category": null,
"url": "/contents/publications/Patents/vehicle-detection/"
},
{
"id": "/contents/public/cuda-gpu/vscode-cuda-windows/",
"title": "CUDA Development Environment in VS Code on Windows",
"tags": ["cuda","gpu","development","visual-studio-code"],
"hashtags": "#cuda #gpu #devtools #vscode",
"category": null,
"url": "/contents/public/cuda-gpu/vscode-cuda-windows/"
},
{
"id": "/contents/wiki/",
"title": "All Pages — pirahansiah.com",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/wiki/"
},
{
"id": "/contents/README/",
"title": "PKM",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/README/"
},
{
"id": "/contents/",
"title": "PKM",
"tags": null,
"hashtags": null,
"category": null,
"url": "/contents/"
}
]
Then in your graph page, load both:
const [graphData, searchIndex] = await Promise.all([
fetch('/assets/graph.json').then(r => r.json()),
fetch('/assets/search-index.json').then(r => r.json())
])
const fuse = new Fuse(searchIndex, { keys: ['title','tags','hashtags','category'], threshold: 0.35 })
Hashtag co-occurrence edges: The most practical approach for your 79-node graph is to define co_tags: arrays in frontmatter for each hub node, then let Liquid generate edges from those. Direct content scanning for [[links]] is not feasible in plain Liquid.
Summary table
| Feature | Tool | Where it runs | Works on GH Pages? |
|---|---|---|---|
| Fuzzy search (title/tags) | Fuse.js from CDN | Browser | ✅ |
| Force graph | D3 v7 from CDN | Browser | ✅ |
| Auto-generate graph.json | Liquid template | Jekyll build | ✅ |
| Tag co-occurrence edges | Liquid loop | Jekyll build | ✅ |
| True semantic (vector) search | needs embedding API | Server | ❌ |
| Wikilink backlink scanning | jekyll-wikilinks | Ruby plugin | ❌ (needs Actions) |
| Obsidian publish | Obsidian product | SaaS | ❌ (costs money) |
The bottom line: your architecture is already correct. The main upgrade is replacing the hand-edited graph.json with a Liquid-generated one, and adding a dedicated Fuse.js search index JSON with hashtags as a separate weighted field.