clusters — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited clusters (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Group nodes into visual clusters by a shared attribute. Clusters render as rings around grouped nodes with optional labels and custom rendering.
Set clusterAttribute on GraphCanvas to enable clustering. The value should match a property on your GraphNode objects.
| Prop | Type | Default | Description |
|---|---|---|---|
clusterAttribute | string | — | Node property to cluster by |
constrainDragging | boolean | false | Constrain node dragging to cluster bounds |
onRenderCluster | ClusterRenderer | — | Custom cluster render function |
onClusterClick | (cluster, event) => void | — | Cluster click handler |
onClusterPointerOver | (cluster, event) => void | — | Pointer enters cluster |
onClusterPointerOut | (cluster, event) => void | — | Pointer leaves cluster |
onClusterDragged | (cluster) => void | — | Cluster drag completed |
interface ClusterRendererProps {
outerRadius: number;
innerRadius: number;
padding: number;
opacity: number;
label: ClusterLabel;
theme: Theme;
}const nodes = [
{ id: '1', label: 'Web Server', cluster: 'frontend' },
{ id: '2', label: 'API Server', cluster: 'backend' },
{ id: '3', label: 'Database', cluster: 'backend' },
{ id: '4', label: 'CDN', cluster: 'frontend' },
];
<GraphCanvas
nodes={nodes}
edges={edges}
clusterAttribute="cluster"
/><GraphCanvas
nodes={nodes}
edges={edges}
clusterAttribute="cluster"
onClusterClick={(cluster, event) => console.log(cluster)}
/>import { GraphCanvas, ClusterRendererProps } from 'reagraph';
const renderCluster = ({ outerRadius, label, theme }: ClusterRendererProps) => (
<mesh>
<ringGeometry args={[outerRadius - 2, outerRadius, 32]} />
<meshBasicMaterial color="#4CAF50" opacity={0.3} transparent />
</mesh>
);
<GraphCanvas
nodes={nodes}
edges={edges}
clusterAttribute="cluster"
onRenderCluster={renderCluster}
/>const customTheme = {
...lightTheme,
cluster: {
stroke: '#D8E6EA',
fill: '#f0f0f0',
opacity: 1,
selectedOpacity: 1,
inactiveOpacity: 0.1,
label: {
color: '#2A6475',
stroke: '#fff',
},
},
};clusterAttribute value on each nodeforceDirected2d) group nodes spatiallyconstrainDragging keeps dragged nodes within their cluster boundaryonRenderCluster to customize~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.