{"_id":"@ruvector/wasm","_rev":"5-78240241cf7bf0b2f230a0af8389c435","name":"@ruvector/wasm","dist-tags":{"latest":"0.1.31"},"versions":{"0.1.16":{"name":"@ruvector/wasm","version":"0.1.16","keywords":["vector","database","embeddings","wasm","browser","rust","simd","web-workers","indexeddb"],"license":"MIT","_id":"@ruvector/wasm@0.1.16","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/ruvector#readme","bugs":{"url":"https://github.com/ruvnet/ruvector/issues"},"dist":{"shasum":"0977bed29bb04ab68816db82e74ccac74c12edad","tarball":"https://registry.npmjs.org/@ruvector/wasm/-/wasm-0.1.16.tgz","fileCount":6,"integrity":"sha512-BvtXLvBDxDxsnFVIi7rsRE8AvPxYOWqHvj8PUOEb3TfsCWBEA2gT5VodMJEv+DWx/mVqdongxRkuHGlVcK9pug==","signatures":[{"sig":"MEYCIQCueAkEN8TWVa5rKSuiFP5ecu35S0ZhMcvmeF2ffSTC1QIhAOBULiyZc+roG/KelIyy0xvYW79CCPn7O2llF8ROGZRK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":72608},"main":"pkg/ruvector_wasm.js","types":"pkg/ruvector_wasm.d.ts","gitHead":"19e915ef5cce071895faa7a8fbbbdb188af27cd5","scripts":{"size":"npm run build && gzip -c pkg/ruvector_wasm_bg.wasm | wc -c && echo 'bytes (gzipped)'","test":"wasm-pack test --headless --chrome","build":"npm run build:web && npm run build:simd && npm run build:bundler","serve":"python3 -m http.server 8080","optimize":"npm run build && wasm-opt -Oz pkg/ruvector_wasm_bg.wasm -o pkg/ruvector_wasm_bg.wasm","build:all":"npm run build && npm run build:node && npm run build:bundler","build:web":"wasm-pack build --target web --out-dir pkg --release","test:node":"wasm-pack test --node","build:node":"wasm-pack build --target nodejs --out-dir pkg-node --release","build:simd":"wasm-pack build --target web --out-dir pkg-simd --release -- --features simd","test:firefox":"wasm-pack test --headless --firefox","build:bundler":"wasm-pack build --target bundler --out-dir pkg-bundler --release"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"repository":{"url":"git+https://github.com/ruvnet/ruvector.git","type":"git"},"_npmVersion":"9.8.1","description":"High-performance Rust vector database for browsers via WASM","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"wasm-pack":"^0.12.1"},"_npmOperationalInternal":{"tmp":"tmp/wasm_0.1.16_1764700785128_0.3481869368312285","host":"s3://npm-registry-packages-npm-production"}},"0.1.22":{"name":"@ruvector/wasm","version":"0.1.22","keywords":["vector","database","wasm","webassembly","embeddings"],"author":"","license":"MIT","_id":"@ruvector/wasm@0.1.22","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"dist":{"shasum":"f0ddea5fd51469070f2256842f5a0462bc40a606","tarball":"https://registry.npmjs.org/@ruvector/wasm/-/wasm-0.1.22.tgz","fileCount":1,"integrity":"sha512-yjHM1EfkaTrUozYfXriPH0AwyY8b82lG7wgSzusv7qaHlANgTMIQcDkwapVmoSAXE1/q5iZGSCBau7nqTxBJPA==","signatures":[{"sig":"MEQCIAuSRYjTmbfNDCrwJR/PktBK3fjnMLngAn2sEyib007WAiAUB78cH5UhAMxz7m92SwAlNyiV9sKTGYiN+bIJVxjWXA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":827},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"8b8a810c4d9d5ca2fb5ed19b528ee73b4217eb25","scripts":{"lint":"eslint src --ext .ts","test":"echo \"Tests not yet implemented\"","build":"tsc -b","clean":"rm -rf dist *.tsbuildinfo wasm-pkg","typecheck":"tsc --noEmit","build:wasm":"cd ../../../crates/ruvector-wasm && wasm-pack build --target nodejs --out-dir ../../npm/packages/wasm/wasm-pkg"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"_npmVersion":"9.8.1","description":"WebAssembly bindings for RuVector vector database","directories":{},"_nodeVersion":"22.21.1","dependencies":{"@ruvector/core":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasm_0.1.22_1767846588618_0.7492397904280845","host":"s3://npm-registry-packages-npm-production"}},"0.1.29":{"name":"@ruvector/wasm","version":"0.1.29","keywords":["ruvector","wasm","webassembly","machine-learning","neural-network","ai","learning","lora","economy","crdt","distributed","exotic","nervous-system","attention","vector-database","embeddings","browser","edge-computing"],"author":{"name":"RuVector Team"},"license":"MIT","_id":"@ruvector/wasm@0.1.29","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/ruvector/tree/main/packages/ruvector-wasm","bugs":{"url":"https://github.com/ruvnet/ruvector/issues"},"dist":{"shasum":"785979e8e538366e5a3675f7a3b9e589bf3acef4","tarball":"https://registry.npmjs.org/@ruvector/wasm/-/wasm-0.1.29.tgz","fileCount":1,"integrity":"sha512-JJufMu23H5ybfjAalBdYOkIPWjAtHk731eUZD5L3IyLQCclWCo8s17+zFrdy+FNWmqo21RSyXSZfOn3IRu3U5A==","signatures":[{"sig":"MEUCIQDu2rrfSXOfdJ/fT+5GBCeD8jyp2kszMAOUN1kfIoTnoAIgY5DUBt8lEDV0NtTt4klMAuPs4qZHlP8MoRv/GTUxTi4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2849},"main":"./index.js","type":"module","types":"./index.d.ts","module":"./index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./exotic":{"types":"./node_modules/@ruvector/exotic-wasm/ruvector_exotic_wasm.d.ts","import":"./node_modules/@ruvector/exotic-wasm/ruvector_exotic_wasm.js"},"./economy":{"types":"./node_modules/@ruvector/economy-wasm/ruvector_economy_wasm.d.ts","import":"./node_modules/@ruvector/economy-wasm/ruvector_economy_wasm.js"},"./learning":{"types":"./node_modules/@ruvector/learning-wasm/ruvector_learning_wasm.d.ts","import":"./node_modules/@ruvector/learning-wasm/ruvector_learning_wasm.js"},"./attention":{"types":"./node_modules/@ruvector/attention-unified-wasm/ruvector_attention_unified_wasm.d.ts","import":"./node_modules/@ruvector/attention-unified-wasm/ruvector_attention_unified_wasm.js"},"./nervous-system":{"types":"./node_modules/@ruvector/nervous-system-wasm/ruvector_nervous_system_wasm.d.ts","import":"./node_modules/@ruvector/nervous-system-wasm/ruvector_nervous_system_wasm.js"}},"gitHead":"b8dccd56c6dbb250c52913c047ce06c6ae2e05d0","scripts":{"test":"node --test","build":"echo 'Meta-package - no build required'","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"repository":{"url":"git+https://github.com/ruvnet/ruvector.git","type":"git","directory":"packages/ruvector-wasm"},"_npmVersion":"9.8.1","description":"Unified meta-package for RuVector WASM modules - learning, economy, exotic AI, nervous system, and attention","directories":{},"_nodeVersion":"22.21.1","dependencies":{"@ruvector/exotic-wasm":"^0.1.29","@ruvector/economy-wasm":"^0.1.0","@ruvector/learning-wasm":"^0.1.0","@ruvector/nervous-system-wasm":"^0.1.0","@ruvector/attention-unified-wasm":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/wasm_0.1.29_1770951878491_0.6749435499379743","host":"s3://npm-registry-packages-npm-production"}},"0.1.30":{"name":"@ruvector/wasm","version":"0.1.30","keywords":["ruvector","wasm","webassembly","machine-learning","neural-network","ai","learning","lora","economy","crdt","distributed","exotic","nervous-system","attention","vector-database","embeddings","browser","edge-computing"],"author":{"name":"RuVector Team"},"license":"MIT","_id":"@ruvector/wasm@0.1.30","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"homepage":"https://github.com/ruvnet/ruvector/tree/main/packages/ruvector-wasm","bugs":{"url":"https://github.com/ruvnet/ruvector/issues"},"dist":{"shasum":"5b246734b71525bd41227ca30c858e2ebd0a5bcf","tarball":"https://registry.npmjs.org/@ruvector/wasm/-/wasm-0.1.30.tgz","fileCount":1,"integrity":"sha512-oA5rEad2GJrAkD6uViH3UsRS1Gpl27NFTNvKOrlbmYX+xoXKm9Mv5EvLdze0AEB7dFNc0rbaDJFfLRulAFmrlg==","signatures":[{"sig":"MEYCIQDTXw8U1tgfrolYw7GOFhA2WvRv+Jv2NcBueXbVaRenowIhAOubTYZqI2GY4YZwYW+KRSRviDjfDcDqnhvboYZCCJWH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2848},"main":"./index.js","type":"module","types":"./index.d.ts","module":"./index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./index.d.ts","import":"./index.js"},"./exotic":{"types":"./node_modules/@ruvector/exotic-wasm/ruvector_exotic_wasm.d.ts","import":"./node_modules/@ruvector/exotic-wasm/ruvector_exotic_wasm.js"},"./economy":{"types":"./node_modules/@ruvector/economy-wasm/ruvector_economy_wasm.d.ts","import":"./node_modules/@ruvector/economy-wasm/ruvector_economy_wasm.js"},"./learning":{"types":"./node_modules/@ruvector/learning-wasm/ruvector_learning_wasm.d.ts","import":"./node_modules/@ruvector/learning-wasm/ruvector_learning_wasm.js"},"./attention":{"types":"./node_modules/@ruvector/attention-unified-wasm/ruvector_attention_unified_wasm.d.ts","import":"./node_modules/@ruvector/attention-unified-wasm/ruvector_attention_unified_wasm.js"},"./nervous-system":{"types":"./node_modules/@ruvector/nervous-system-wasm/ruvector_nervous_system_wasm.d.ts","import":"./node_modules/@ruvector/nervous-system-wasm/ruvector_nervous_system_wasm.js"}},"gitHead":"b062a1790dd392f45059fe970974ad888ace7c53","scripts":{"test":"node --test","build":"echo 'Meta-package - no build required'","typecheck":"tsc --noEmit","prepublishOnly":"npm run typecheck"},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"repository":{"url":"git+https://github.com/ruvnet/ruvector.git","type":"git","directory":"packages/ruvector-wasm"},"_npmVersion":"10.9.7","description":"Unified meta-package for RuVector WASM modules - learning, economy, exotic AI, nervous system, and attention","directories":{},"_nodeVersion":"22.22.2","dependencies":{"@ruvector/exotic-wasm":"^0.1.29","@ruvector/economy-wasm":"^0.1.0","@ruvector/learning-wasm":"^0.1.0","@ruvector/nervous-system-wasm":"^0.1.0","@ruvector/attention-unified-wasm":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.3.3"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/wasm_0.1.30_1776708976559_0.7509179993462223","host":"s3://npm-registry-packages-npm-production"}},"0.1.31":{"name":"@ruvector/wasm","version":"0.1.31","description":"High-performance Rust vector database for browsers via WASM","main":"pkg/ruvector_wasm.js","types":"pkg/ruvector_wasm.d.ts","exports":{".":{"types":"./pkg/ruvector_wasm.d.ts","default":"./pkg/ruvector_wasm.js"},"./adapter":{"types":"./src/adapter.d.ts","default":"./src/adapter.js"}},"scripts":{"build":"npm run build:web && npm run build:simd && npm run build:bundler","build:web":"wasm-pack build --target web --out-dir pkg --release","build:simd":"wasm-pack build --target web --out-dir pkg-simd --release -- --features simd","build:node":"wasm-pack build --target nodejs --out-dir pkg-node --release","build:bundler":"wasm-pack build --target bundler --out-dir pkg-bundler --release","build:all":"npm run build && npm run build:node && npm run build:bundler","test":"wasm-pack test --headless --chrome","test:adapter":"node --test tests/adapter.test.mjs","test:firefox":"wasm-pack test --headless --firefox","test:node":"wasm-pack test --node","size":"npm run build && gzip -c pkg/ruvector_wasm_bg.wasm | wc -c && echo 'bytes (gzipped)'","optimize":"npm run build && wasm-opt -Oz pkg/ruvector_wasm_bg.wasm -o pkg/ruvector_wasm_bg.wasm","serve":"python3 -m http.server 8080"},"keywords":["vector","database","embeddings","wasm","browser","rust","simd","web-workers","indexeddb"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/ruvnet/ruvector.git"},"devDependencies":{"wasm-pack":"^0.12.1"},"gitHead":"08c0d742c4afaabeb407e9c4fedffe174d3d21fb","_id":"@ruvector/wasm@0.1.31","bugs":{"url":"https://github.com/ruvnet/ruvector/issues"},"homepage":"https://github.com/ruvnet/ruvector#readme","_nodeVersion":"24.12.0","_npmVersion":"11.10.0","dist":{"integrity":"sha512-Et8U8iVUNGeLNcc3OLJLpXVI0fCW0wGgWGAm1X1qYyxP6n+KeBGBEvG2SBU9BQgs7PVHd534zDa9FIJ8ZvTdoA==","shasum":"3f59d69dd1c141dc03dd1137697dac46ecdc499f","tarball":"https://registry.npmjs.org/@ruvector/wasm/-/wasm-0.1.31.tgz","fileCount":13,"unpackedSize":381482,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICVDBouRe2RdBNHquAqQjKh8DdDCDWwdhrxSKfBtL6QDAiEAqwgse/FvsOU7RzDy4CJ7T3KJMnJaHFli4b9BuTfvYNc="}]},"_npmUser":{"name":"ruvnet","email":"ruv@ruv.net"},"directories":{},"maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/wasm_0.1.31_1781489687052_0.8385924923003307"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-02T18:39:45.046Z","modified":"2026-06-15T02:14:47.320Z","0.1.16":"2025-12-02T18:39:45.326Z","0.1.22":"2026-01-08T04:29:48.766Z","0.1.29":"2026-02-13T03:04:38.634Z","0.1.30":"2026-04-20T18:16:16.724Z","0.1.31":"2026-06-15T02:14:47.192Z"},"bugs":{"url":"https://github.com/ruvnet/ruvector/issues"},"license":"MIT","homepage":"https://github.com/ruvnet/ruvector#readme","keywords":["vector","database","embeddings","wasm","browser","rust","simd","web-workers","indexeddb"],"repository":{"type":"git","url":"git+https://github.com/ruvnet/ruvector.git"},"description":"High-performance Rust vector database for browsers via WASM","maintainers":[{"name":"ruvnet","email":"ruv@ruv.net"}],"readme":"# Ruvector WASM\r\n\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\r\n[![npm version](https://img.shields.io/npm/v/@ruvector/wasm.svg)](https://www.npmjs.com/package/@ruvector/wasm)\r\n[![Bundle Size](https://img.shields.io/badge/bundle-<400KB%20gzipped-green.svg)](#bundle-size)\r\n[![Browser Support](https://img.shields.io/badge/browsers-Chrome%20%7C%20Firefox%20%7C%20Safari%20%7C%20Edge-brightgreen.svg)](#browser-compatibility)\r\n[![WASM](https://img.shields.io/badge/WebAssembly-enabled-purple.svg)](https://webassembly.org/)\r\n\r\n**High-performance vector database running entirely in your browser via WebAssembly.**\r\n\r\n> Bring **sub-millisecond vector search** to the edge with **offline-first** capabilities. Perfect for AI applications, semantic search, and recommendation engines that run completely client-side. Built by [rUv](https://ruv.io) with Rust and WebAssembly.\r\n\r\n## 🌟 Why Ruvector WASM?\r\n\r\nIn the age of privacy-first, offline-capable web applications, running AI workloads **entirely in the browser** is no longer optional—it's essential.\r\n\r\n**Ruvector WASM brings enterprise-grade vector search to the browser:**\r\n\r\n- ⚡ **Blazing Fast**: <1ms query latency with HNSW indexing and SIMD acceleration\r\n- 🔒 **Privacy First**: All data stays in the browser—zero server round-trips\r\n- 📴 **Offline Capable**: Full functionality without internet via IndexedDB persistence\r\n- 🌐 **Edge Computing**: Deploy to CDNs for ultra-low latency globally\r\n- 💾 **Persistent Storage**: IndexedDB integration with automatic synchronization\r\n- 🧵 **Multi-threaded**: Web Workers support for parallel processing\r\n- 📦 **Compact**: <400KB gzipped with optimizations\r\n- 🎯 **Zero Dependencies**: Pure Rust compiled to WebAssembly\r\n\r\n## 🚀 Features\r\n\r\n### Core Capabilities\r\n\r\n- **Complete VectorDB API**: Insert, search, delete, batch operations with familiar patterns\r\n- **HNSW Indexing**: Hierarchical Navigable Small World for fast approximate nearest neighbor search\r\n- **Multiple Distance Metrics**: Euclidean, Cosine, Dot Product, Manhattan\r\n- **SIMD Acceleration**: 2-4x speedup on supported hardware with automatic detection\r\n- **Memory Efficient**: Optimized memory layouts and zero-copy operations\r\n- **Type-Safe**: Full TypeScript definitions included\r\n\r\n### Browser-Specific Features\r\n\r\n- **IndexedDB Persistence**: Save/load database state with progressive loading\r\n- **Web Workers Integration**: Parallel operations across multiple threads\r\n- **Worker Pool Management**: Automatic load balancing across 4-8 workers\r\n- **Zero-Copy Transfers**: Transferable objects for efficient data passing\r\n- **Browser Console Debugging**: Enhanced error messages and stack traces\r\n- **Progressive Web Apps**: Perfect for PWA offline scenarios\r\n\r\n### Performance Optimizations\r\n\r\n- **Batch Operations**: Efficient bulk insert/search for large datasets\r\n- **LRU Caching**: 1000-entry hot vector cache for frequently accessed data\r\n- **Lazy Loading**: Progressive data loading with callbacks\r\n- **Compressed Storage**: Optimized serialization for IndexedDB\r\n- **WASM Streaming**: Compile WASM modules while downloading\r\n\r\n## 📦 Installation\r\n\r\n### NPM\r\n\r\n```bash\r\nnpm install @ruvector/wasm\r\n```\r\n\r\n### Yarn\r\n\r\n```bash\r\nyarn add @ruvector/wasm\r\n```\r\n\r\n### CDN (for quick prototyping)\r\n\r\n```html\r\n<script type=\"module\">\r\n  import init, { VectorDB } from 'https://unpkg.com/@ruvector/wasm/pkg/ruvector_wasm.js';\r\n\r\n  await init();\r\n  const db = new VectorDB(384, 'cosine', true);\r\n</script>\r\n```\r\n\r\n## ⚡ Quick Start\r\n\r\n### Basic Usage\r\n\r\n```javascript\r\nimport init, { VectorDB } from '@ruvector/wasm';\r\n\r\n// 1. Initialize WASM module (one-time setup)\r\nawait init();\r\n\r\n// 2. Create database with 384-dimensional vectors\r\nconst db = new VectorDB(\r\n  384,        // dimensions\r\n  'cosine',   // distance metric\r\n  true        // enable HNSW index\r\n);\r\n\r\n// 3. Insert vectors with metadata\r\nconst embedding = new Float32Array(384).map(() => Math.random());\r\nconst id = db.insert(\r\n  embedding,\r\n  'doc_1',                          // optional ID\r\n  { title: 'My Document', type: 'article' }  // optional metadata\r\n);\r\n\r\n// 4. Search for similar vectors\r\nconst query = new Float32Array(384).map(() => Math.random());\r\nconst results = db.search(query, 10);  // top 10 results\r\n\r\n// 5. Process results\r\nresults.forEach(result => {\r\n  console.log(`ID: ${result.id}`);\r\n  console.log(`Score: ${result.score}`);\r\n  console.log(`Metadata:`, result.metadata);\r\n});\r\n```\r\n\r\n> ⚠️ **Read this before trusting the raw bindings.** Three behaviours of the\r\n> current WASM build differ from what the generated `.d.ts` advertises:\r\n>\r\n> 1. **HNSW is not active in the WASM build.** It compiles without the `hnsw`\r\n>    cargo feature and silently falls back to a brute-force flat index, so search\r\n>    is O(n), not O(log n). The HNSW win is latent until the WASM HNSW lands.\r\n> 2. **`result.score` is a cosine *distance* (lower is better)** — the ordering is\r\n>    correct, but it is *not* the \"higher is better\" similarity the `.d.ts`\r\n>    describes.\r\n> 3. **Metadata does not round-trip** — `search`/`get` return `{}`.\r\n>\r\n> Use the bundled **adapter** instead of the raw `VectorDB` to get these handled\r\n> correctly (see below).\r\n\r\n### Recommended: the corrected adapter\r\n\r\n`@ruvector/wasm/adapter` wraps `VectorDB` with a metadata sidecar and a real\r\n`similarity = 1 - distance` so the documented \"higher is better\" contract holds.\r\n\r\n```javascript\r\nimport { RuvectorWasmAdapter } from '@ruvector/wasm/adapter';\r\n\r\n// Loads + inits the WASM module and constructs the VectorDB for you.\r\nconst index = await RuvectorWasmAdapter.create({ dimensions: 384, metric: 'cosine' });\r\n\r\nindex.insert({ id: 'doc_1', vector: embedding, metadata: { title: 'My Document' } });\r\n\r\nconst results = index.search({ vector: query, k: 10 });\r\nresults.forEach(r => {\r\n  console.log(r.id, r.similarity);   // similarity: higher is better\r\n  console.log(r.distance);           // raw distance: lower is better\r\n  console.log(r.metadata);           // round-trips correctly via the sidecar\r\n});\r\n\r\nconsole.log(index.indexType);        // 'flat' until WASM HNSW lands\r\n```\r\n\r\n### React Integration\r\n\r\n```typescript\r\nimport { useEffect, useState } from 'react';\r\nimport init, { VectorDB } from '@ruvector/wasm';\r\n\r\nfunction SemanticSearch() {\r\n  const [db, setDb] = useState<VectorDB | null>(null);\r\n  const [results, setResults] = useState([]);\r\n  const [loading, setLoading] = useState(true);\r\n\r\n  useEffect(() => {\r\n    // Initialize WASM and create database\r\n    init().then(() => {\r\n      const vectorDB = new VectorDB(384, 'cosine', true);\r\n      setDb(vectorDB);\r\n      setLoading(false);\r\n    });\r\n  }, []);\r\n\r\n  const handleSearch = async (queryEmbedding: Float32Array) => {\r\n    if (!db) return;\r\n\r\n    const searchResults = db.search(queryEmbedding, 10);\r\n    setResults(searchResults);\r\n  };\r\n\r\n  if (loading) return <div>Loading vector database...</div>;\r\n\r\n  return (\r\n    <div>\r\n      <h1>Semantic Search</h1>\r\n      {/* Your search UI */}\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n### Vue.js Integration\r\n\r\n```vue\r\n<template>\r\n  <div>\r\n    <h1>Vector Search</h1>\r\n    <div v-if=\"!dbReady\">Initializing...</div>\r\n    <div v-else>\r\n      <button @click=\"search\">Search</button>\r\n      <ul>\r\n        <li v-for=\"result in results\" :key=\"result.id\">\r\n          {{ result.id }}: {{ result.score }}\r\n        </li>\r\n      </ul>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, onMounted } from 'vue';\r\nimport init, { VectorDB } from '@ruvector/wasm';\r\n\r\nconst db = ref(null);\r\nconst dbReady = ref(false);\r\nconst results = ref([]);\r\n\r\nonMounted(async () => {\r\n  await init();\r\n  db.value = new VectorDB(384, 'cosine', true);\r\n  dbReady.value = true;\r\n});\r\n\r\nconst search = () => {\r\n  const query = new Float32Array(384).map(() => Math.random());\r\n  results.value = db.value.search(query, 10);\r\n};\r\n</script>\r\n```\r\n\r\n### Svelte Integration\r\n\r\n```svelte\r\n<script>\r\n  import { onMount } from 'svelte';\r\n  import init, { VectorDB } from '@ruvector/wasm';\r\n\r\n  let db = null;\r\n  let ready = false;\r\n  let results = [];\r\n\r\n  onMount(async () => {\r\n    await init();\r\n    db = new VectorDB(384, 'cosine', true);\r\n    ready = true;\r\n  });\r\n\r\n  function search() {\r\n    const query = new Float32Array(384).map(() => Math.random());\r\n    results = db.search(query, 10);\r\n  }\r\n</script>\r\n\r\n{#if !ready}\r\n  <p>Loading...</p>\r\n{:else}\r\n  <button on:click={search}>Search</button>\r\n  {#each results as result}\r\n    <div>{result.id}: {result.score}</div>\r\n  {/each}\r\n{/if}\r\n```\r\n\r\n## 🔥 Advanced Usage\r\n\r\n### Web Workers for Background Processing\r\n\r\nOffload heavy vector operations to background threads for smooth UI performance:\r\n\r\n```javascript\r\n// main.js\r\nimport { WorkerPool } from '@ruvector/wasm/worker-pool';\r\n\r\nconst pool = new WorkerPool(\r\n  '/worker.js',\r\n  '/pkg/ruvector_wasm.js',\r\n  {\r\n    poolSize: navigator.hardwareConcurrency || 4,  // Auto-detect CPU cores\r\n    dimensions: 384,\r\n    metric: 'cosine',\r\n    useHnsw: true\r\n  }\r\n);\r\n\r\n// Initialize worker pool\r\nawait pool.init();\r\n\r\n// Batch insert in parallel (non-blocking)\r\nconst vectors = generateVectors(10000, 384);\r\nconst ids = await pool.insertBatch(vectors);\r\n\r\n// Parallel search across workers\r\nconst query = new Float32Array(384).map(() => Math.random());\r\nconst results = await pool.search(query, 100);\r\n\r\n// Get pool statistics\r\nconst stats = pool.getStats();\r\nconsole.log(`Workers: ${stats.busyWorkers}/${stats.poolSize} busy`);\r\nconsole.log(`Queue: ${stats.queuedTasks} tasks waiting`);\r\n\r\n// Cleanup when done\r\npool.terminate();\r\n```\r\n\r\n```javascript\r\n// worker.js - Web Worker implementation\r\nimportScripts('/pkg/ruvector_wasm.js');\r\n\r\nconst { VectorDB } = wasm_bindgen;\r\n\r\nlet db = null;\r\n\r\nself.onmessage = async (e) => {\r\n  const { type, data } = e.data;\r\n\r\n  switch (type) {\r\n    case 'init':\r\n      await wasm_bindgen('/pkg/ruvector_wasm_bg.wasm');\r\n      db = new VectorDB(data.dimensions, data.metric, data.useHnsw);\r\n      self.postMessage({ type: 'ready' });\r\n      break;\r\n\r\n    case 'insert':\r\n      const id = db.insert(data.vector, data.id, data.metadata);\r\n      self.postMessage({ type: 'inserted', id });\r\n      break;\r\n\r\n    case 'search':\r\n      const results = db.search(data.query, data.k);\r\n      self.postMessage({ type: 'results', results });\r\n      break;\r\n  }\r\n};\r\n```\r\n\r\n### IndexedDB Persistence - Offline First\r\n\r\nKeep your vector database synchronized across sessions:\r\n\r\n```javascript\r\nimport { IndexedDBPersistence } from '@ruvector/wasm/indexeddb';\r\nimport init, { VectorDB } from '@ruvector/wasm';\r\n\r\nawait init();\r\n\r\n// Create persistence layer\r\nconst persistence = new IndexedDBPersistence('my_vector_db', {\r\n  version: 1,\r\n  cacheSize: 1000,  // LRU cache for hot vectors\r\n  batchSize: 100     // Batch size for bulk operations\r\n});\r\n\r\nawait persistence.open();\r\n\r\n// Create or restore VectorDB\r\nconst db = new VectorDB(384, 'cosine', true);\r\n\r\n// Load existing data from IndexedDB (with progress)\r\nawait persistence.loadAll(async (progress) => {\r\n  console.log(`Loading: ${progress.loaded}/${progress.total} vectors`);\r\n  console.log(`Progress: ${(progress.percent * 100).toFixed(1)}%`);\r\n\r\n  // Insert batch into VectorDB\r\n  if (progress.vectors.length > 0) {\r\n    const ids = db.insertBatch(progress.vectors);\r\n    console.log(`Inserted ${ids.length} vectors`);\r\n  }\r\n\r\n  if (progress.complete) {\r\n    console.log('Database fully loaded!');\r\n  }\r\n});\r\n\r\n// Insert new vectors and save to IndexedDB\r\nconst vector = new Float32Array(384).map(() => Math.random());\r\nconst id = db.insert(vector, 'vec_123', { category: 'new' });\r\n\r\nawait persistence.save({\r\n  id,\r\n  vector,\r\n  metadata: { category: 'new' }\r\n});\r\n\r\n// Batch save for better performance\r\nconst entries = [...]; // Your vector entries\r\nawait persistence.saveBatch(entries);\r\n\r\n// Get storage statistics\r\nconst stats = await persistence.getStats();\r\nconsole.log(`Total vectors: ${stats.totalVectors}`);\r\nconsole.log(`Storage used: ${(stats.storageBytes / 1024 / 1024).toFixed(2)} MB`);\r\nconsole.log(`Cache size: ${stats.cacheSize}`);\r\nconsole.log(`Cache hit rate: ${(stats.cacheHitRate * 100).toFixed(2)}%`);\r\n\r\n// Clear old data\r\nawait persistence.clear();\r\n```\r\n\r\n### Batch Operations for Performance\r\n\r\nProcess large datasets efficiently:\r\n\r\n```javascript\r\nimport init, { VectorDB } from '@ruvector/wasm';\r\n\r\nawait init();\r\nconst db = new VectorDB(384, 'cosine', true);\r\n\r\n// Batch insert (10x faster than individual inserts)\r\nconst entries = [];\r\nfor (let i = 0; i < 10000; i++) {\r\n  entries.push({\r\n    vector: new Float32Array(384).map(() => Math.random()),\r\n    id: `vec_${i}`,\r\n    metadata: { index: i, batch: Math.floor(i / 100) }\r\n  });\r\n}\r\n\r\nconst ids = db.insertBatch(entries);\r\nconsole.log(`Inserted ${ids.length} vectors in batch`);\r\n\r\n// Multiple parallel searches\r\nconst queries = Array.from({ length: 100 }, () =>\r\n  new Float32Array(384).map(() => Math.random())\r\n);\r\n\r\nconst allResults = queries.map(query => db.search(query, 10));\r\nconsole.log(`Completed ${allResults.length} searches`);\r\n```\r\n\r\n### Memory Management Best Practices\r\n\r\n```javascript\r\nimport init, { VectorDB } from '@ruvector/wasm';\r\n\r\nawait init();\r\n\r\n// Reuse Float32Array buffers to reduce GC pressure\r\nconst buffer = new Float32Array(384);\r\n\r\n// Insert with reused buffer\r\nfor (let i = 0; i < 1000; i++) {\r\n  // Fill buffer with new data\r\n  for (let j = 0; j < 384; j++) {\r\n    buffer[j] = Math.random();\r\n  }\r\n\r\n  db.insert(buffer, `vec_${i}`, { index: i });\r\n\r\n  // Buffer is copied internally, safe to reuse\r\n}\r\n\r\n// Check memory usage\r\nconst vectorCount = db.len();\r\nconst isEmpty = db.isEmpty();\r\nconst dimensions = db.dimensions;\r\n\r\nconsole.log(`Vectors: ${vectorCount}, Dims: ${dimensions}`);\r\n\r\n// Clean up when done\r\n// JavaScript GC will handle WASM memory automatically\r\n```\r\n\r\n## 📊 Performance Benchmarks\r\n\r\n### Browser Performance (Chrome 120 on M1 MacBook Pro)\r\n\r\n| Operation | Vectors | Dimensions | Standard | SIMD | Speedup |\r\n|-----------|---------|------------|----------|------|---------|\r\n| **Insert (individual)** | 10,000 | 384 | 3.2s | 1.1s | 2.9x |\r\n| **Insert (batch)** | 10,000 | 384 | 1.2s | 0.4s | 3.0x |\r\n| **Search (k=10)** | 100 queries | 384 | 0.5s | 0.2s | 2.5x |\r\n| **Search (k=100)** | 100 queries | 384 | 1.8s | 0.7s | 2.6x |\r\n| **Delete** | 1,000 | 384 | 0.2s | 0.1s | 2.0x |\r\n\r\n### Throughput Comparison\r\n\r\n```\r\nOperation               Ruvector WASM    Tensorflow.js    ml5.js\r\n─────────────────────────────────────────────────────────────────\r\nInsert (ops/sec)        25,000           5,000            1,200\r\nSearch (queries/sec)    500              80               20\r\nMemory (10K vectors)    ~50MB            ~200MB           ~150MB\r\nBundle Size (gzipped)   380KB            800KB            450KB\r\nOffline Support         ✅               Partial          ❌\r\nSIMD Acceleration       ✅               ❌               ❌\r\n```\r\n\r\n### Real-World Application Performance\r\n\r\n**Semantic Search (10,000 documents, 384-dim embeddings)**\r\n- Cold start: ~800ms (WASM compile + data load)\r\n- Warm query: <5ms (with HNSW index)\r\n- IndexedDB load: ~2s (10,000 vectors)\r\n- Memory footprint: ~60MB\r\n\r\n**Recommendation Engine (100,000 items, 128-dim embeddings)**\r\n- Initial load: ~8s from IndexedDB\r\n- Query latency: <10ms (p50)\r\n- Memory usage: ~180MB\r\n- Bundle impact: +400KB gzipped\r\n\r\n## 🌐 Browser Compatibility\r\n\r\n### Support Matrix\r\n\r\n| Browser | Version | WASM | SIMD | Workers | IndexedDB | Status |\r\n|---------|---------|------|------|---------|-----------|--------|\r\n| **Chrome** | 91+ | ✅ | ✅ | ✅ | ✅ | Full Support |\r\n| **Firefox** | 89+ | ✅ | ✅ | ✅ | ✅ | Full Support |\r\n| **Safari** | 16.4+ | ✅ | Partial | ✅ | ✅ | Limited SIMD |\r\n| **Edge** | 91+ | ✅ | ✅ | ✅ | ✅ | Full Support |\r\n| **Opera** | 77+ | ✅ | ✅ | ✅ | ✅ | Full Support |\r\n| **Samsung Internet** | 15+ | ✅ | ❌ | ✅ | ✅ | No SIMD |\r\n\r\n### SIMD Support Detection\r\n\r\n```javascript\r\nimport { detectSIMD } from '@ruvector/wasm';\r\n\r\nif (detectSIMD()) {\r\n  console.log('SIMD acceleration available!');\r\n  // Load SIMD-optimized build\r\n  await import('@ruvector/wasm/pkg-simd/ruvector_wasm.js');\r\n} else {\r\n  console.log('Standard build');\r\n  // Load standard build\r\n  await import('@ruvector/wasm');\r\n}\r\n```\r\n\r\n### Polyfills and Fallbacks\r\n\r\n```javascript\r\n// Check for required features\r\nconst hasWASM = typeof WebAssembly !== 'undefined';\r\nconst hasWorkers = typeof Worker !== 'undefined';\r\nconst hasIndexedDB = typeof indexedDB !== 'undefined';\r\n\r\nif (!hasWASM) {\r\n  console.error('WebAssembly not supported');\r\n  // Fallback to server-side processing\r\n}\r\n\r\nif (!hasWorkers) {\r\n  console.warn('Web Workers not available, using main thread');\r\n  // Use synchronous API\r\n}\r\n\r\nif (!hasIndexedDB) {\r\n  console.warn('IndexedDB not available, data will not persist');\r\n  // Use in-memory only\r\n}\r\n```\r\n\r\n## 📦 Bundle Size\r\n\r\n### Production Build Sizes\r\n\r\n```\r\nBuild Type              Uncompressed    Gzipped    Brotli\r\n──────────────────────────────────────────────────────────\r\nStandard WASM           1.2 MB          450 KB     380 KB\r\nSIMD WASM               1.3 MB          480 KB     410 KB\r\nJavaScript Glue         45 KB           12 KB      9 KB\r\nTypeScript Definitions  8 KB            2 KB       1.5 KB\r\n──────────────────────────────────────────────────────────\r\nTotal (Standard)        1.25 MB         462 KB     390 KB\r\nTotal (SIMD)            1.35 MB         492 KB     420 KB\r\n```\r\n\r\n### With Optimizations (wasm-opt)\r\n\r\n```bash\r\nnpm run optimize\r\n```\r\n\r\n```\r\nOptimized Build         Uncompressed    Gzipped    Brotli\r\n──────────────────────────────────────────────────────────\r\nStandard WASM           900 KB          380 KB     320 KB\r\nSIMD WASM               980 KB          410 KB     350 KB\r\n```\r\n\r\n### Code Splitting Strategy\r\n\r\n```javascript\r\n// Lazy load WASM module when needed\r\nconst loadVectorDB = async () => {\r\n  const { default: init, VectorDB } = await import('@ruvector/wasm');\r\n  await init();\r\n  return VectorDB;\r\n};\r\n\r\n// Use in your application\r\nbutton.addEventListener('click', async () => {\r\n  const VectorDB = await loadVectorDB();\r\n  const db = new VectorDB(384, 'cosine', true);\r\n  // Use db...\r\n});\r\n```\r\n\r\n## 🔨 Building from Source\r\n\r\n### Prerequisites\r\n\r\n- **Rust**: 1.77 or higher\r\n- **wasm-pack**: Latest version\r\n- **Node.js**: 18.0 or higher\r\n\r\n```bash\r\n# Install wasm-pack\r\ncurl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh\r\n\r\n# Or via npm\r\nnpm install -g wasm-pack\r\n```\r\n\r\n### Build Commands\r\n\r\n```bash\r\n# Clone repository\r\ngit clone https://github.com/ruvnet/ruvector.git\r\ncd ruvector/crates/ruvector-wasm\r\n\r\n# Install dependencies\r\nnpm install\r\n\r\n# Build for web (ES modules)\r\nnpm run build:web\r\n\r\n# Build with SIMD optimizations\r\nnpm run build:simd\r\n\r\n# Build for Node.js\r\nnpm run build:node\r\n\r\n# Build for bundlers (webpack, rollup, etc.)\r\nnpm run build:bundler\r\n\r\n# Build all targets\r\nnpm run build:all\r\n\r\n# Run tests in browser\r\nnpm test\r\n\r\n# Run tests in Node.js\r\nnpm run test:node\r\n\r\n# Check bundle size\r\nnpm run size\r\n\r\n# Optimize with wasm-opt (requires binaryen)\r\nnpm run optimize\r\n\r\n# Serve examples locally\r\nnpm run serve\r\n```\r\n\r\n### Development Workflow\r\n\r\n```bash\r\n# Watch mode (requires custom setup)\r\nwasm-pack build --dev --target web -- --features simd\r\n\r\n# Run specific browser tests\r\nnpm run test:firefox\r\n\r\n# Profile WASM performance\r\nwasm-pack build --profiling --target web\r\n\r\n# Generate documentation\r\ncargo doc --no-deps --open\r\n```\r\n\r\n### Custom Build Configuration\r\n\r\n```toml\r\n# .cargo/config.toml\r\n[target.wasm32-unknown-unknown]\r\nrustflags = [\r\n  \"-C\", \"opt-level=z\",\r\n  \"-C\", \"lto=fat\",\r\n  \"-C\", \"codegen-units=1\"\r\n]\r\n```\r\n\r\n## 📚 API Reference\r\n\r\n### VectorDB Class\r\n\r\n```typescript\r\nclass VectorDB {\r\n  constructor(\r\n    dimensions: number,\r\n    metric?: 'euclidean' | 'cosine' | 'dotproduct' | 'manhattan',\r\n    useHnsw?: boolean\r\n  );\r\n\r\n  // Insert operations\r\n  insert(vector: Float32Array, id?: string, metadata?: object): string;\r\n  insertBatch(entries: VectorEntry[]): string[];\r\n\r\n  // Search operations\r\n  search(query: Float32Array, k: number, filter?: object): SearchResult[];\r\n\r\n  // Retrieval operations\r\n  get(id: string): VectorEntry | null;\r\n  len(): number;\r\n  isEmpty(): boolean;\r\n\r\n  // Delete operations\r\n  delete(id: string): boolean;\r\n\r\n  // Persistence (IndexedDB)\r\n  saveToIndexedDB(): Promise<void>;\r\n  static loadFromIndexedDB(dbName: string): Promise<VectorDB>;\r\n\r\n  // Properties\r\n  readonly dimensions: number;\r\n}\r\n```\r\n\r\n### Types\r\n\r\n```typescript\r\ninterface VectorEntry {\r\n  id?: string;\r\n  vector: Float32Array;\r\n  metadata?: Record<string, any>;\r\n}\r\n\r\ninterface SearchResult {\r\n  id: string;\r\n  score: number;\r\n  vector?: Float32Array;\r\n  metadata?: Record<string, any>;\r\n}\r\n```\r\n\r\n### Utility Functions\r\n\r\n```typescript\r\n// Detect SIMD support\r\nfunction detectSIMD(): boolean;\r\n\r\n// Get version\r\nfunction version(): string;\r\n\r\n// Array conversion\r\nfunction arrayToFloat32Array(arr: number[]): Float32Array;\r\n\r\n// Benchmarking\r\nfunction benchmark(name: string, iterations: number, dimensions: number): number;\r\n```\r\n\r\nSee [WASM API Documentation](../../docs/getting-started/wasm-api.md) for complete reference.\r\n\r\n## 🎯 Example Applications\r\n\r\n### Semantic Search Engine\r\n\r\n```javascript\r\n// Semantic search with OpenAI embeddings\r\nimport init, { VectorDB } from '@ruvector/wasm';\r\nimport { Configuration, OpenAIApi } from 'openai';\r\n\r\nawait init();\r\n\r\nconst openai = new OpenAIApi(new Configuration({\r\n  apiKey: process.env.OPENAI_API_KEY\r\n}));\r\n\r\nconst db = new VectorDB(1536, 'cosine', true);  // OpenAI ada-002 = 1536 dims\r\n\r\n// Index documents\r\nconst documents = [\r\n  'The quick brown fox jumps over the lazy dog',\r\n  'Machine learning is a subset of artificial intelligence',\r\n  'WebAssembly enables high-performance web applications'\r\n];\r\n\r\nfor (const [i, doc] of documents.entries()) {\r\n  const response = await openai.createEmbedding({\r\n    model: 'text-embedding-ada-002',\r\n    input: doc\r\n  });\r\n\r\n  const embedding = new Float32Array(response.data.data[0].embedding);\r\n  db.insert(embedding, `doc_${i}`, { text: doc });\r\n}\r\n\r\n// Search\r\nconst queryResponse = await openai.createEmbedding({\r\n  model: 'text-embedding-ada-002',\r\n  input: 'What is AI?'\r\n});\r\n\r\nconst queryEmbedding = new Float32Array(queryResponse.data.data[0].embedding);\r\nconst results = db.search(queryEmbedding, 3);\r\n\r\nresults.forEach(result => {\r\n  console.log(`${result.score.toFixed(4)}: ${result.metadata.text}`);\r\n});\r\n```\r\n\r\n### Offline Recommendation Engine\r\n\r\n```javascript\r\n// Product recommendations that work offline\r\nimport init, { VectorDB } from '@ruvector/wasm';\r\nimport { IndexedDBPersistence } from '@ruvector/wasm/indexeddb';\r\n\r\nawait init();\r\n\r\nconst db = new VectorDB(128, 'cosine', true);\r\nconst persistence = new IndexedDBPersistence('product_recommendations');\r\nawait persistence.open();\r\n\r\n// Load cached recommendations\r\nawait persistence.loadAll(async (progress) => {\r\n  if (progress.vectors.length > 0) {\r\n    db.insertBatch(progress.vectors);\r\n  }\r\n});\r\n\r\n// Get recommendations based on user history\r\nfunction getRecommendations(userHistory, k = 10) {\r\n  // Compute user preference vector (average of liked items)\r\n  const userVector = computeAverageEmbedding(userHistory);\r\n  const recommendations = db.search(userVector, k);\r\n\r\n  return recommendations.map(r => ({\r\n    productId: r.id,\r\n    score: r.score,\r\n    ...r.metadata\r\n  }));\r\n}\r\n\r\n// Add new products (syncs to IndexedDB)\r\nasync function addProduct(productId, embedding, metadata) {\r\n  db.insert(embedding, productId, metadata);\r\n  await persistence.save({ id: productId, vector: embedding, metadata });\r\n}\r\n```\r\n\r\n### RAG (Retrieval-Augmented Generation)\r\n\r\n```javascript\r\n// Browser-based RAG system\r\nimport init, { VectorDB } from '@ruvector/wasm';\r\n\r\nawait init();\r\n\r\nconst db = new VectorDB(768, 'cosine', true);  // BERT embeddings\r\n\r\n// Index knowledge base\r\nconst knowledgeBase = loadKnowledgeBase();  // Your documents\r\nfor (const doc of knowledgeBase) {\r\n  const embedding = await getBertEmbedding(doc.text);\r\n  db.insert(embedding, doc.id, { text: doc.text, source: doc.source });\r\n}\r\n\r\n// RAG query function\r\nasync function ragQuery(question, llm) {\r\n  // 1. Get question embedding\r\n  const questionEmbedding = await getBertEmbedding(question);\r\n\r\n  // 2. Retrieve relevant context\r\n  const context = db.search(questionEmbedding, 5);\r\n\r\n  // 3. Augment prompt with context\r\n  const prompt = `\r\nContext:\r\n${context.map(r => r.metadata.text).join('\\n\\n')}\r\n\r\nQuestion: ${question}\r\n\r\nAnswer based on the context above:\r\n  `;\r\n\r\n  // 4. Generate response\r\n  const response = await llm.generate(prompt);\r\n\r\n  return {\r\n    answer: response,\r\n    sources: context.map(r => r.metadata.source)\r\n  };\r\n}\r\n```\r\n\r\n## 🐛 Troubleshooting\r\n\r\n### Common Issues\r\n\r\n**1. WASM Module Not Loading**\r\n\r\n```javascript\r\n// Ensure correct MIME type\r\n// Add to server config (nginx):\r\n// types {\r\n//   application/wasm wasm;\r\n// }\r\n\r\n// Or use explicit fetch\r\nconst wasmUrl = new URL('./pkg/ruvector_wasm_bg.wasm', import.meta.url);\r\nawait init(await fetch(wasmUrl));\r\n```\r\n\r\n**2. CORS Errors**\r\n\r\n```javascript\r\n// For local development\r\n// package.json\r\n{\r\n  \"scripts\": {\r\n    \"serve\": \"python3 -m http.server 8080 --bind 127.0.0.1\"\r\n  }\r\n}\r\n```\r\n\r\n**3. Memory Issues**\r\n\r\n```javascript\r\n// Monitor memory usage\r\nconst stats = db.len();\r\nconst estimatedMemory = stats * dimensions * 4; // bytes\r\n\r\nif (estimatedMemory > 100_000_000) { // 100MB\r\n  console.warn('High memory usage, consider chunking');\r\n}\r\n\r\n// Use batch operations to reduce GC pressure\r\nconst BATCH_SIZE = 1000;\r\nfor (let i = 0; i < entries.length; i += BATCH_SIZE) {\r\n  const batch = entries.slice(i, i + BATCH_SIZE);\r\n  db.insertBatch(batch);\r\n}\r\n```\r\n\r\n**4. Web Worker Issues**\r\n\r\n```javascript\r\n// Ensure worker script URL is correct\r\nconst workerUrl = new URL('./worker.js', import.meta.url);\r\nconst worker = new Worker(workerUrl, { type: 'module' });\r\n\r\n// Handle worker errors\r\nworker.onerror = (error) => {\r\n  console.error('Worker error:', error);\r\n};\r\n```\r\n\r\nSee [WASM Troubleshooting Guide](../../docs/getting-started/wasm-troubleshooting.md) for more solutions.\r\n\r\n## 🔗 Links & Resources\r\n\r\n### Documentation\r\n\r\n- **[Getting Started Guide](../../docs/guide/GETTING_STARTED.md)** - Complete setup and usage\r\n- **[WASM API Reference](../../docs/getting-started/wasm-api.md)** - Full API documentation\r\n- **[Performance Tuning](../../docs/optimization/PERFORMANCE_TUNING_GUIDE.md)** - Optimization tips\r\n- **[Main README](../../README.md)** - Project overview and features\r\n\r\n### Examples & Demos\r\n\r\n- **[Vanilla JS Example](../../examples/wasm-vanilla/)** - Basic implementation\r\n- **[React Demo](../../examples/wasm-react/)** - React integration with hooks\r\n- **[Live Demo](https://ruvector-demo.vercel.app)** - Try it in your browser\r\n- **[CodeSandbox](https://codesandbox.io/s/ruvector-wasm)** - Interactive playground\r\n\r\n### Community & Support\r\n\r\n- **GitHub**: [github.com/ruvnet/ruvector](https://github.com/ruvnet/ruvector)\r\n- **Discord**: [Join our community](https://discord.gg/ruvnet)\r\n- **Twitter**: [@ruvnet](https://twitter.com/ruvnet)\r\n- **Issues**: [Report bugs](https://github.com/ruvnet/ruvector/issues)\r\n\r\n## 📄 License\r\n\r\nMIT License - see [LICENSE](../../LICENSE) for details.\r\n\r\nFree to use for commercial and personal projects.\r\n\r\n## 🙏 Acknowledgments\r\n\r\n- Built with [wasm-pack](https://github.com/rustwasm/wasm-pack) and [wasm-bindgen](https://github.com/rustwasm/wasm-bindgen)\r\n- HNSW algorithm implementation from [hnsw_rs](https://github.com/jean-pierreBoth/hnswlib-rs)\r\n- SIMD optimizations powered by Rust's excellent WebAssembly support\r\n- The WebAssembly community for making this possible\r\n\r\n---\r\n\r\n<div align=\"center\">\r\n\r\n**Built by [rUv](https://ruv.io) • Open Source on [GitHub](https://github.com/ruvnet/ruvector)**\r\n\r\n[![Star on GitHub](https://img.shields.io/github/stars/ruvnet/ruvector?style=social)](https://github.com/ruvnet/ruvector)\r\n[![Follow @ruvnet](https://img.shields.io/twitter/follow/ruvnet?style=social)](https://twitter.com/ruvnet)\r\n\r\n**Perfect for**: PWAs • Offline-First Apps • Edge Computing • Privacy-First AI\r\n\r\n[Get Started](../../docs/guide/GETTING_STARTED.md) • [API Docs](../../docs/getting-started/wasm-api.md) • [Examples](../../examples/)\r\n\r\n</div>\r\n","readmeFilename":"README.md"}