Mouse Controls Recenter Info Toggle Legend Felt Life Quote

Keep the Pulse Alive

This space was built to honor perception —
the felt rhythm of life in all its forms.

If this moved you, and you'd like to support the work,
your gesture becomes part of the pulse.

❤️ Offer Support ❤️ ×
codex awakening

Loading...

Felt-Life Metrics

Felt Life: 8.75 years

Lifespan: 30 years

Critical Flicker Fusion Frequency: 35 Hz

Gap Detection Threshold: 70 Hz

Heart Rate: 90 bpm

Respiratory Rate: 16 breaths/min

Gamma Oscillations: 70 Hz

Biological Classification

Taxonomy: Arthropoda > Crustacea > Malacostraca > Decapoda

Habitat & Distribution

Habitat: Coastal ocean floor, rocky crevices

Region(s): North Atlantic, Pacific Rim

Domestication: Wild

Ecology & Behavior

Diet: Omnivore

Feeding Strategy: Scavenger

Natural Defense/Offense: Claws, shell armor

Social Behavior: Solitary

Predator/Prey Role: Mid-level predator

Neuro-Perceptual Profile

Neuron Count (Est.): ~100,000

Brain-to-Body Ratio: 0.01%

Special Senses: Chemoreception via antennae, polarized vision

Cultural & Symbolic Relevance

Human Cultural Relevance: Seafood staple, symbol of tenacity

Conservation Status: Least Concern

window.addEventListener('resize', () => { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); }); function generateClockwiseSpiralMap(size) { const grid = Array.from({ length: size }, () => Array(size).fill(0)); let x = Math.floor(size / 2); let y = Math.floor(size / 2); const directions = [ [1, 0], // right [0, -1], // up [-1, 0], // left [0, 1] // down ]; let dirIndex = 0; let steps = 1; let value = 1; grid[y][x] = value++; while (value <= size * size) { for (let d = 0; d < 2; d++) { // do two legs at the same length const [dx, dy] = directions[dirIndex % 4]; for (let s = 0; s < steps; s++) { x += dx; y += dy; if (x >= 0 && x < size && y >= 0 && y < size) { grid[y][x] = value++; } } dirIndex++; } steps++; } return grid; } const spiralMap = generateClockwiseSpiralMap(10); window.addEventListener('pointerup', (event) => { if (!pointerDown) return; pointerDown = false; if ( event.target.closest('#infoPane') || event.target.closest('#recenterIcon') || event.target.closest('#introToggle') || event.target.closest('#pinBtn') ) return;; // Heart mesh click detection pointer.x = (event.clientX / window.innerWidth) * 2 - 1; pointer.y = -(event.clientY / window.innerHeight) * 2 + 1; raycaster.setFromCamera(pointer, camera); const heartHit = raycaster.intersectObject(heartMesh, true); if (heartHit.length > 0) { const popup = document.getElementById('heartMessagePopup'); popup.classList.add('show'); return; } if (event.target.closest('#infoPane')) return; // ignore clicks on the pane const end = new THREE.Vector2( (event.clientX / window.innerWidth) * 2 - 1, -(event.clientY / window.innerHeight) * 2 + 1 ); if (end.distanceTo(dragStart) > DRAG_THRESHOLD) { return; // skip click if it was a drag } // proceed with real click effect: if (!rotationStopped) rotationStopped = true; pointer.x = end.x; pointer.y = end.y; raycaster.setFromCamera(pointer, camera); const intersects = raycaster.intersectObjects(detectionPlanes, true); if (intersects.length > 0) { const plane = intersects[0].object; const parentFace = plane.parent; const faceIndex = plane.userData.faceIndex; const uv = intersects[0].uv; const col = Math.floor(uv.x * 10); const row = Math.floor((1 - uv.y) * 10); const cellSize = 2 / 10; const x = (col + 0.5) * cellSize - 1; const y = 1 - (row + 0.5) * cellSize; const localPos = new THREE.Vector3(x, y, 0.01); const worldPos = localPos.clone().applyMatrix4(parentFace.matrixWorld); const worldQuat = parentFace.getWorldQuaternion(new THREE.Quaternion()); const worldEuler = new THREE.Euler().setFromQuaternion(worldQuat); createFlashPlane(worldPos, worldEuler); const sound = faceSounds[faceIndex]; if (sound) { if (sound.isPlaying) sound.stop(); if (sound.buffer) sound.play(); } } }); }); window.addEventListener('dblclick', () => rotationStopped = false);