-
Notifications
You must be signed in to change notification settings - Fork 0
FAQ
Nemosyne is a data-native VR visualization framework that transforms data into immersive 3D experiences. Unlike traditional tools that force data into charts, Nemosyne lets data shape the scene, enabling you to walk through your data in VR.
Traditional visualization tools require you to reshape data to fit charts (pivot tables, aggregations, etc.). Nemosyne reads your data's intrinsic structure and automatically creates the optimal visualization. You provide data, Nemosyne handles the rest.
No. Nemosyne works in any modern web browser with mouse/keyboard controls. However, a VR headset (Quest, Vive, etc.) provides the full immersive experience.
- Chrome/Edge 90+
- Firefox 88+
- Safari 15+ (WebGL 2.0)
WebXR (VR mode) requires Chrome/Edge or Firefox with compatible hardware.
CDN (easiest):
<script src="https://cdn.jsdelivr.net/npm/nemosyne@latest/dist/nemosyne.min.js"></script>NPM:
npm install nemosyne<a-entity nemosyne-artefact-v2="
spec: { id: 'demo', geometry: { type: 'sphere', radius: 0.5 } };
dataset: { records: [{ value: 1 }, { value: 2 }] };
layout: grid
"></a-entity>This creates two spheres in a basic grid layout.
Check the /examples/ directory in the repository. Key demos:
-
hello-world.html- Basic setup -
nemorooms-demo.html- Multi-room navigation -
memory-palace-vr.html- Full VR experience -
physics-explosion-demo.html- Physics simulation
- JSON - Primary format
- CSV - Via loader
- WebSocket - Real-time streaming
- Direct arrays - JavaScript objects
| Metric | Performance |
|---|---|
| Nodes | 10,000+ @ 60fps |
| Memory | ~300MB for 10k nodes |
| Load Time | ~2s for 5k nodes |
| Physics | 1,000+ dynamic bodies |
Yes. Use scene.updateData(id, newData) or WebSocket streaming:
const stream = new NemosyneDataStream('ws://localhost:8766');
stream.on('data', (packet) => {
scene.updateData('live-viz', packet.data);
});| Data Type | Recommended Layout |
|---|---|
| Categories |
grid or radial
|
| Time series |
timeline or spiral
|
| Networks |
force or graph-force
|
| Hierarchies | tree |
| Geographic | geo-globe |
| Scatter | scatter |
See Layout Algorithms for details.
Yes:
Nemosyne.registerLayout('my-layout', {
calculate: (records, options) => {
return records.map((r, i) => ({
x: i * options.spacing,
y: r.value * options.scale,
z: 0
}));
}
});{
transforms: [{
property: 'color',
$data: 'category',
$map: 'category10' // D3 color scale
}]
}Or for continuous values:
{
transforms: [{
property: 'color',
$data: 'value',
$range: ['#00d4aa', '#ff6b6b'] // Gradient
}]
}Common causes:
- Too many data points (>10,000)
- Complex geometries (use spheres instead of detailed meshes)
- No sleep/wake optimization (physics)
- Memory leaks (not disposing objects)
Solutions:
// Reduce geometry complexity
{ geometry: { type: 'sphere', segments: 16 } } // Instead of 64
// Enable physics sleep
body.setSleepingThresholds(0.1, 0.1);
// Dispose properly
artefact.destroy();- Use instanced meshes for repeated geometries
- Reduce texture sizes
- Simplify collision shapes
- Disable shadows
- Use LOD (Level of Detail)
- Nodes: < 5,000 for smooth performance
- Draw calls: < 50
- Textures: < 10MB total
- Physics: < 500 bodies
Only if you want:
- Collision detection
- Realistic dynamics
- Force-directed layouts at scale (10k+ nodes)
- Interactive dragging with momentum
<script src="https://cdn.jsdelivr.net/npm/ammo.js@0.0.10/ammo.js"></script>
<script src="src/physics/AmmoPhysicsEngine.js"></script>Then use the physics-enabled component:
<a-entity nemosyne-graph-force="
nodes: [...];
edges: [...];
chargeStrength: -50;
"></a-entity>Nemosyne includes a simplified force-directed layout without physics:
{ layout: 'force' } // Pure JavaScript, no WASMBut for collisions and realistic dynamics, Ammo.js is required.
class MyArtefact extends Nemosyne.Artefact {
createMesh() {
const geometry = new THREE.IcosahedronGeometry(1, 2);
const material = new THREE.MeshStandardMaterial({ color: 0x00d4aa });
return new THREE.Mesh(geometry, material);
}
}
Nemosyne.registerArtefact('my-custom', MyArtefact);See Contributing Guidelines. Quick steps:
- Fork the repository
- Create a feature branch
- Make changes with tests
- Submit a pull request
- Linting: ESLint with custom config
- Formatting: Prettier
- Testing: All features need tests
- Documentation: Update docs with API changes
Cause: Ammo.js not loaded before Nemosyne.
Fix:
<!-- Load Ammo FIRST -->
<script src="ammo.js"></script>
<script>
// Wait for WASM
Ammo().then(() => {
// Now load Nemosyne
});
</script>Cause: Body is asleep or kinematic.
Fix:
body.activate(); // Wake up
// Or check if kinematic:
const isKinematic = body.getCollisionFlags() & Ammo.btCollisionObject.CF_KINEMATIC_OBJECT;Causes:
- HTTPS required for WebXR
- Camera positioned incorrectly
- Scene background/sky not set
Fix:
<a-scene background="color: #000" renderer="antialias: true">
<a-camera position="0 1.6 0"></a-camera>
</a-scene>Proper cleanup:
// Remove artefact
scene.removeArtefact(id);
// Destroy physics
physics.destroy();
// Clear containers
container.innerHTML = '';- Discord - Community chat
- GitHub Issues - Bug reports
- GitHub Discussions - Q&A
-
Stack Overflow - Tag with
nemosyne
Coming in v1.0. For now:
- Enterprise consulting via Discord
- Sponsored development available
- Training workshops (request via email)
Include:
- Nemosyne version
- Browser & version
- VR hardware (if applicable)
- Minimal reproduction case
- Error messages from console
Have a question not answered here? Add it to the GitHub Discussions and we'll update this FAQ.