v3/@claude-flow/memory/docs/CROSS_PLATFORM.md
The @claude-flow/memory module provides universal cross-platform support through intelligent database provider selection. This ensures your application works seamlessly on Windows, macOS, and Linux without code changes.
┌─────────────────────────────────────────┐
│ createDatabase() Factory │
│ Platform-Aware Auto-Selection │
└──────────────┬──────────────────────────┘
│
┌───────┴────────┐
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ Windows │ │ macOS/Linux │
│ Detected │ │ Detected │
└──────┬──────┘ └──────┬──────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ sql.js │ │better-sqlite│
│ (WASM) │ │ (Native) │
└──────┬──────┘ └──────┬──────┘
│ │
└────────┬────────┘
│
▼
┌─────────────┐
│JSON Fallback│
│ (Universal) │
└─────────────┘
Best for: macOS, Linux Performance: Fastest (native C++ bindings) Features:
const db = await createDatabase('./data/memory.db', {
provider: 'better-sqlite3',
walMode: true,
optimize: true
});
Best for: Windows, environments without native compilation Performance: Good (WebAssembly) Features:
const db = await createDatabase('./data/memory.db', {
provider: 'sql.js',
autoPersistInterval: 5000 // Persist every 5 seconds
});
Best for: Maximum compatibility, small datasets Performance: Slower (brute-force search) Features:
const db = await createDatabase('./data/memory.db', {
provider: 'json'
});
// Recommended: sql.js (no native compilation issues)
const db = await createDatabase('./data/memory.db', {
provider: 'sql.js',
autoPersistInterval: 10000, // Auto-save every 10s
verbose: true
});
Why sql.js on Windows?
// Recommended: better-sqlite3 (native performance)
const db = await createDatabase('./data/memory.db', {
provider: 'better-sqlite3',
walMode: true, // Enable WAL mode
optimize: true // Performance optimizations
});
Why better-sqlite3 on macOS?
// Recommended: better-sqlite3 (native performance)
const db = await createDatabase('./data/memory.db', {
provider: 'better-sqlite3',
walMode: true,
optimize: true
});
Why better-sqlite3 on Linux?
The createDatabase() function uses intelligent platform detection:
// Auto-select best provider for current platform
const db = await createDatabase('./data/memory.db');
Selection Algorithm:
// Example: Auto-selection with fallback chain
Windows: sql.js → JSON
macOS: better-sqlite3 → sql.js → JSON
Linux: better-sqlite3 → sql.js → JSON
import { createDatabase, getPlatformInfo } from '@claude-flow/memory';
async function initDatabase() {
const platform = getPlatformInfo();
console.log(`Running on ${platform.os}`);
console.log(`Recommended: ${platform.recommendedProvider}`);
// Auto-select best provider
const db = await createDatabase('./data/app.db', {
verbose: true
});
return db;
}
import { createDatabase } from '@claude-flow/memory';
async function windowsSetup() {
// Force sql.js for Windows reliability
const db = await createDatabase('./data/windows.db', {
provider: 'sql.js',
autoPersistInterval: 5000,
verbose: true
});
// Store data
await db.store({
id: 'config-1',
key: 'app-config',
content: JSON.stringify({ theme: 'dark' }),
// ... other fields
});
// Changes auto-persist every 5 seconds
// Or manually trigger:
await db.persist();
return db;
}
import { createDatabase, getAvailableProviders } from '@claude-flow/memory';
async function unixSetup() {
const available = await getAvailableProviders();
if (available.betterSqlite3) {
// Use native SQLite with optimizations
const db = await createDatabase('./data/unix.db', {
provider: 'better-sqlite3',
walMode: true, // Concurrent reads
optimize: true, // Performance tuning
maxEntries: 1000000 // Large dataset support
});
return db;
} else {
// Fallback to sql.js
const db = await createDatabase('./data/unix.db', {
provider: 'sql.js'
});
return db;
}
}
import { createDatabase } from '@claude-flow/memory';
async function migrateDatabase() {
// Load from JSON
const sourceDb = await createDatabase('./old/data.db', {
provider: 'json'
});
const entries = await sourceDb.query({
type: 'hybrid',
limit: 10000
});
await sourceDb.shutdown();
// Migrate to SQLite
const destDb = await createDatabase('./new/data.db', {
provider: 'auto' // Auto-select best for platform
});
await destDb.bulkInsert(entries);
console.log(`Migrated ${entries.length} entries`);
await destDb.shutdown();
}
async function createDatabase(
path: string,
options?: DatabaseOptions
): Promise<IMemoryBackend>
Parameters:
path - Database file path (:memory: for in-memory)options.provider - Provider type ('auto', 'better-sqlite3', 'sql.js', 'json')options.verbose - Enable loggingoptions.walMode - Enable WAL mode (better-sqlite3 only)options.optimize - Enable optimizationsoptions.autoPersistInterval - Auto-save interval in ms (sql.js only)options.wasmPath - Custom WASM file path (sql.js only)Returns: Initialized IMemoryBackend instance
function getPlatformInfo(): PlatformInfo
Returns:
{
os: string; // 'win32', 'darwin', 'linux'
isWindows: boolean;
isMacOS: boolean;
isLinux: boolean;
recommendedProvider: DatabaseProvider;
}
async function getAvailableProviders(): Promise<{
betterSqlite3: boolean;
sqlJs: boolean;
json: boolean;
}>
Returns: Which providers are available and working
| Provider | Read Speed | Write Speed | Memory | Compilation |
|---|---|---|---|---|
| better-sqlite3 | ⚡⚡⚡⚡⚡ | ⚡⚡⚡⚡⚡ | Low | Required |
| sql.js | ⚡⚡⚡⚡ | ⚡⚡⚡⚡ | Medium | None |
| JSON | ⚡⚡ | ⚡⚡ | Low | None |
npm install @claude-flow/memory
Dependencies are installed automatically:
better-sqlite3 (tries to compile, fails gracefully)sql.js (pure JavaScript, always works)If you encounter compilation errors with better-sqlite3:
# Skip better-sqlite3 compilation
npm install @claude-flow/memory --no-optional
# The module will automatically use sql.js
Install SQLite development headers:
# Debian/Ubuntu
sudo apt-get install libsqlite3-dev
# RHEL/Fedora
sudo yum install sqlite-devel
# Then install
npm install @claude-flow/memory
Problem: node-gyp errors, missing Visual Studio
Solution: Use sql.js provider (automatic fallback)
const db = await createDatabase('./data/memory.db', {
provider: 'sql.js'
});
Problem: "cannot be opened because the developer cannot be verified"
Solution: Allow native module in System Preferences or use sql.js
# Allow native module
xattr -d com.apple.quarantine node_modules/better-sqlite3/build/Release/better_sqlite3.node
Problem: sqlite3.h not found
Solution: Install development headers
sudo apt-get install libsqlite3-dev
// Let the library choose the best provider
const db = await createDatabase('./data/memory.db');
// sql.js is in-memory, persist frequently
const db = await createDatabase('./data/memory.db', {
provider: 'sql.js',
autoPersistInterval: 5000 // 5 seconds
});
// Better concurrency on macOS/Linux
const db = await createDatabase('./data/memory.db', {
provider: 'better-sqlite3',
walMode: true
});
const health = await db.healthCheck();
if (health.status !== 'healthy') {
console.warn('Database issues:', health.issues);
console.log('Recommendations:', health.recommendations);
}
// Always shutdown to persist changes
process.on('SIGINT', async () => {
await db.shutdown();
process.exit(0);
});
# Force specific provider
CLAUDE_FLOW_DB_PROVIDER=sql.js
# Enable verbose logging
CLAUDE_FLOW_DB_VERBOSE=true
# Set auto-persist interval (ms)
CLAUDE_FLOW_DB_PERSIST_INTERVAL=10000
FROM node:20-alpine
# Install SQLite for better-sqlite3 (optional)
RUN apk add --no-cache sqlite-dev python3 make g++
WORKDIR /app
COPY package*.json ./
RUN npm install
# Will use better-sqlite3 if compilation succeeds,
# otherwise falls back to sql.js automatically
Run cross-platform tests:
# Run all tests
npm test
# Test specific provider
npm test -- --grep "sql.js"
npm test -- --grep "better-sqlite3"
# Test on current platform
npm test -- src/database-provider.test.ts
MIT