From claude-skills
Generates immersive 3D cyberspace point-cloud visualizations from structured data. Renders an interactive cyberpunk cityscape with explorable data vaults, WASD movement, and orbit controls. Use when the user asks to visualize data as an immersive 3D scene, wants a cyberspace or cyberpunk datascape, asks for an interactive 3D dashboard, wants to explore data in a Blackwall-style environment, or wants to visualize an Obsidian vault as a 3D knowledge graph.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-skills:visualization-datascapeThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
1. [Architecture](#architecture)
Script = data pipe. generate.py reads a JSON config from stdin, produces a self-contained HTML file to stdout. It handles templating, vault positioning, color assignment, and JS code generation.
LLM = brain. The LLM analyzes the user's data, decides how to partition it into vaults (up to 32,768; 3–8 recommended for readability), writes HTML content for each vault's info panel, picks stats/glyphs, and structures the JSON config.
1. User provides data (text, table, report, URL content, etc.)
2. LLM analyzes → decides vault structure (3–8 recommended)
3. LLM builds JSON config with title, stats, vaults, glyphs
4. LLM writes JSON to a temp file
5. Run: uv run --no-config skills/visualization-datascape/scripts/generate.py -i /tmp/config.json -o ~/Downloads/Datascape.html
6. Open the HTML file in a browser
When the user asks to visualize an Obsidian vault, use obsidian_to_datascape.py instead of manually building JSON:
# Step 1: Parse vault → JSON config
uv run --no-config skills/visualization-datascape/scripts/obsidian_to_datascape.py \
"/path/to/obsidian/vault" \
-o /tmp/obsidian-config.json
# Step 2: Generate HTML from config
uv run --no-config skills/visualization-datascape/scripts/generate.py \
-i /tmp/obsidian-config.json \
-o ~/Downloads/Obsidian-Knowledge-Graph.html
The parser automatically:
.md note (excludes .obsidian/ directory)[[wikilinks]] as connections between vaults![[image.png]] and  as base64 data URIs (up to 512KB each)YYYY-MM-DD in the filename automatically get:
{
"title": "MAIN TITLE",
"subtitle": "optional subtitle line",
"stats": [
{"label": "data vaults", "value": "5"},
{"label": "total items", "value": "1,200"}
],
"vaults": [
{
"id": "unique-id",
"name": "DISPLAY NAME",
"html": "<div class=\"pt\">Title</div><div class=\"pd\">Content</div>",
"color": "0x00ff66"
}
],
"glyphs": ["TERM_1", "code::ref", "data_key"],
"connections": [
{"from": "vault-id-1", "to": "vault-id-2"}
]
}
| Field | Type | Constraint |
|---|---|---|
title | string | Non-empty |
vaults | array | 1–32,768 entries (3–8 recommended) |
vaults[].id | string | Unique, non-empty |
vaults[].name | string | Non-empty, shown as label |
vaults[].html | string | HTML for the side panel |
| Field | Default |
|---|---|
subtitle | empty |
stats | none shown |
vaults[].color | auto-assigned from green palette |
glyphs | auto-generated from vault names |
connections | auto nearest-neighbor; array of {from, to} vault IDs for animated particle exchange |
Use these classes in vault html for consistent styling:
| Class | Purpose |
|---|---|
pt | Panel title (large, green, uppercase) |
ps | Panel subtitle (small, dim) |
ph | Section heading (bordered) |
pd | Data/paragraph line |
pv | Highlighted value (bold green) |
pw | Source/footnote (tiny, dim) |
table, th, td | Data tables |
td.h | Highlighted table cell |
Images and videos in vault html get automatic click-to-lightbox behavior:
| Class / Pattern | Purpose |
|---|---|
img.pi | Inline image (full panel width, click opens lightbox) |
video.pi | Inline video (plays in panel, double-click opens lightbox) |
div.pi-deck | Horizontal thumbnail strip (scrollable, each img inside is clickable) |
div.pv-wrap | Side-by-side layout: image + text (image left, text right) |
data-full="url" | Optional attribute on any img/video — lightbox shows this URL instead of the thumbnail src |
Example vault HTML with media:
<div class="pt">Person Profile</div>
<div class="pv-wrap">
<img class="pi" src="https://example.com/photo-thumb.jpg" data-full="https://example.com/photo-hires.jpg">
<div><div class="pd">Name: <span class="pv">Jane Doe</span></div><div class="pd">Role: Engineer</div></div>
</div>
<div class="ph">Gallery</div>
<div class="pi-deck">
<img src="https://example.com/img1-thumb.jpg" data-full="https://example.com/img1.jpg">
<img src="https://example.com/img2-thumb.jpg" data-full="https://example.com/img2.jpg">
<img src="https://example.com/img3-thumb.jpg">
</div>
From workspace root:
# From file
uv run --no-config skills/visualization-datascape/scripts/generate.py \
-i /tmp/datascape_config.json \
-o ~/Downloads/My_Datascape.html
# From stdin
cat config.json | uv run --no-config skills/visualization-datascape/scripts/generate.py \
-o ~/Downloads/My_Datascape.html
Script has zero external dependencies — pure Python stdlib.
pv spans for key metricsThe output is a cyberpunk point-cloud cityscape with 3D hexagonal crystal lattice vault placement:
These apply to the Three.js template and must NEVER be reintroduced:
Object3D.position is readonly. Use position.set() or position.copy()npx claudepluginhub dmitrykrivaltsevich/claude-skills --plugin claude-skillsGuides custom D3.js visualizations: bar/line/scatter charts, network diagrams, geographic maps, hierarchies, and real-time data updates with zoom/pan/brush interactions.
Designs clear, accessible data visualizations with chart selection for comparisons/trends/distributions, styling principles, color palettes, responsiveness, and best practices.
Builds animated, professional web pages that visualize software architecture, system design, data models, or product ideas using Three.js 3D scenes, GSAP scroll-driven animations, and SVG interactive diagrams.