npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@samoramachel/netuniverse

v1.3.1

Published

Immersive, high-performance 3D graph visualization library for React. It transforms standard relational data into a cinematic "network universe" experience using Three.js and React Three Fiber.

Downloads

296

Readme

NetUniverse Explorer

A beautiful 3D graph visualization library for React built with Three.js and React Three Fiber.

Network Universe

Features

  • 🌌 3D Network Visualization: Immersive particle-based graph rendering with 4000+ background nodes
  • Physics Simulation: Cosmos force-directed layout for main nodes
  • 🎨 Interactive Animations:
    • Grab interaction (hover to connect)
    • Color shift on click (customizable)
    • Smooth camera transitions
  • ⚙️ Fully Configurable: Control colors, distances, animations, and camera behavior via config.json
  • 📦 TypeScript Support: Full type definitions included
  • 🎯 Zero Dependencies Bundled: Peer dependencies for minimal bundle size

Installation

npm install netuniverse
# or
yarn add netuniverse

Peer Dependencies

You must install these alongside the library:

npm install react react-dom three

Usage

Basic Example

import { GraphScene, generateGraphData } from 'netuniverse';
import type { GraphData } from 'netuniverse';

// Option 1: Use your own data
const myData: GraphData = {
  nodes: [
    { id: '1', label: 'Node 1', cluster: 'CORE', x: 0, y: 0, z: 0 },
    { id: '2', label: 'Node 2', cluster: 'FINANCE', x: 100, y: 0, z: 0 },
  ],
  links: [
    { source: '1', target: '2' }
  ]
};

// Option 2: Prototype with default random data
const defaultData = generateGraphData();

function App() {
  const [selectedNode, setSelectedNode] = useState(null);

  // Use myData or defaultData
  return (
    <div style={{ width: '100vw', height: '100vh' }}>
      <GraphScene
        data={defaultData}
        onNodeSelect={setSelectedNode}
        selectedNodeId={selectedNode?.id || null}
      />
    </div>
  );
}

Next.js Usage

'use client';
import dynamic from 'next/dynamic';

const GraphScene = dynamic(
  () => import('NetUniverse-explorer').then(mod => ({ default: mod.GraphScene })),
  { ssr: false }
);

export default function Page() {
  // ... same as above
}

Spatial API (Background Mode)

You can turn the graph into an interactive spatial background by injecting your own 3D content and controlling the camera programmatically.

import { useRef } from 'react';
import { GraphScene, GraphRef } from 'netuniverse';

function MySpatialPage() {
  const graphRef = useRef<GraphRef>(null);

  const handleScrollToFeature = () => {
    // Fly to coordinates [x, y, z] to show a specific 3D feature
    graphRef.current?.flyTo([50, 50, 50], 2);
  };

  return (
    <div style={{ position: 'relative', width: '100vw', height: '100vh' }}>
      {/* 1. Spatial Background */}
      <GraphScene ref={graphRef} data={data}>
        {/* 2. Inject Custom 3D Content */}
        <mesh position={[50, 50, 50]}>
          <boxGeometry args={[10, 10, 10]} />
          <meshStandardMaterial color="orange" wireframe />
        </mesh>
      </GraphScene>

      {/* 3. HTML Overlay */}
      <div style={{ position: 'absolute', zIndex: 10 }}>
        <button onClick={handleScrollToFeature}>Go to Feature</button>
      </div>
    </div>
  );
}

GraphRef API

The ref passed to GraphScene exposes the following methods for programmatic control:

interface GraphRef {
  /** The underlying Three.js camera instance */
  camera: THREE.PerspectiveCamera;
  
  /**
   * Smoothly fly the camera to a specific 3D position.
   * @param position [x, y, z] coordinates
   * @param duration Animation duration in seconds (default: 1.5)
   */
  flyTo: (position: [number, number, number], duration?: number) => void;

  /**
   * Smoothly rotate the camera to look at a specific target point.
   * @param target [x, y, z] coordinates to look at
   * @param duration Animation duration in seconds (default: 1.5)
   */
  lookAt: (target: [number, number, number], duration?: number) => void;
}

Types

export enum ClusterId {
  Core = 'CORE',
  Finance = 'FINANCE',
  Social = 'SOCIAL',
  Infrastructure = 'INFRA',
  Network = 'NETWORK'
}

interface NodeData {
  id: string;
  label: string;
  cluster: ClusterId | string;
  x?: number;
  y?: number;
  z?: number;
  size?: number;
  description?: string;
  connections?: string[];
}

interface LinkData {
  source: string | NodeData;
  target: string | NodeData;
}

interface GraphData {
  nodes: NodeData[];
  links: LinkData[];
}

Advanced Usage

Injecting 3D Content (Spatial Background)

GraphScene acts as a 3D container. specific 3D objects can be injected directly as children, allowing you to mix the graph visualization with other Three.js elements.

<GraphScene data={data}>
  <mesh position={[50, 50, 50]}>
    <boxGeometry args={[10, 10, 10]} />
    <meshStandardMaterial color="orange" wireframe />
  </mesh>
</GraphScene>

Custom Physics Hook

If you need access to the underlying d3-force simulation, you can use the exported useGraphPhysics hook, though standard usage handles this automatically within GalaxyGraph.

import { useGraphPhysics } from 'netuniverse';

// Inside a component within the <Canvas> context
useGraphPhysics({ nodes, links });

Configuration

You can customize the graph behavior by importing and modifying the default config.

Full Options Reference

| Section | Key | Type | Default | Description | | :--- | :--- | :--- | :--- | :--- | | Graph | network_node_count | Int | 4000 | Number of background star particles. | | | network_spread | Int | 1500 | Spatial spread of the background cloud. | | | connection_distance | Int | 300 | Max distance for background lines. | | | grab_distance | Int | 300 | Radius for mouse interaction grab effect. | | Colors | background | Hex | #FFFBF4 | Scene background & fog color. | | | network_node | Hex | #BDC3C7 | Color of background nodes. | | | click_active | Hex | #E47600 | Flash color on interaction. | | Controls | enableZoom | Bool | true | Allow zooming. | | | enableRotate | Bool | true | Allow rotation. | | | maxPolarAngle | Float | 3.14159 | Vertical rotation limit. | | Animation | bounce.enabled | Bool | true | Enable boundary bounce effect. | | | highlight.scale_hover | Float | 1.5 | Scale factor on hover. |


### Overriding Config via Props (New in v1.3.0)

You can override any specific configuration value by passing a `config` prop to `GraphScene`. This will be merged with the default configuration.

```tsx
const customConfig = {
  graph: {
    colors: {
      background: '#000000', // Override background color
    }
  },
  controls: {
    enableZoom: false // Disable zoom
  }
};

<GraphScene data={data} config={customConfig} />

Development

# Install dependencies
npm install

# Run dev server
npm run dev

# Build library
npm run build

License

MIT

Credits

Built with: