skalex
AI-first, zero-dependency JavaScript database. Vector search, agent memory, MCP server, and encryption built in. Node.js, Bun, Deno, browsers, and edge runtimes.
Skalex
AI-first · Isomorphic · Zero-dependency · Local-first
Skalexships vector search, agent memory, natural language queries, an MCP server, and AES-256-GCM encryption in a single zero-dependency package — no server, no config, no external services. Onenpm install skalexon Node.js, Bun, Deno, browsers, and edge runtimes. All AI capabilities — cosine similarity search, semantic agent memory with compression,db.ask()NLP queries via any LLM, and a one-line MCP server for Claude Desktop and Cursor — are built into the core with zero additional dependencies.
Architecture + fit: all data lives in your process's heap —
db.connect()loads the full dataset for instant, zero-overhead access. Storage adapters control where data persists, not how much fits. Designed for single-process, local-first workloads where the dataset fits in RAM: AI agents, CLI tools, desktop apps, edge workers, offline-first apps. Not a replacement for PostgreSQL or MongoDB for large-scale, multi-process, or distributed systems.
Features
Zero overhead. Maximum reach.
- Zero dependencies: install the package, nothing else. No driver, no ORM, no server process.
- Full build matrix: ESM, ESM minified, CJS, CJS minified, browser ESM (
dist/skalex.browser.js, nonode:*imports), UMD/IIFE (dist/skalex.umd.min.js, CDN default) - Runs everywhere: Node.js ≥18, Bun, Deno 2.x, browser (Chrome/Firefox/Safari), edge runtimes; verified by a 787-test cross-runtime suite
- Pluggable storage:
FsAdapter(Node),LocalStorageAdapter(browser),EncryptedAdapter(AES-256-GCM), or bring your own
Queries that scale with your data.
- Full operator set:
$eq$ne$gt$gte$lt$lte$in$nin$regex$fn - Dot-notation nested field queries
- Secondary field indexes: O(1) lookups via
IndexEngine - Unique constraints, filter pre-sorter for performance
Your data stays clean.
- Zero-dependency schema validation:
type,required,unique,enum - Strict mode:
createCollection(name, { strict: true })rejects unknown fields;onSchemaError: "warn" | "strip"for softer handling - Versioned migrations:
addMigration({ version, up }), auto-run onconnect() - TTL documents:
insertOne(doc, { ttl: "30m" }), swept on connect;defaultTtlper collection;ttlSweepIntervalfor live processes - Transactions: snapshot + commit / rollback
- Change log:
createCollection(name, { changelog: true }), point-in-time restore - Soft deletes:
createCollection(name, { softDelete: true }),col.restore(),{ includeDeleted } - Document versioning:
createCollection(name, { versioning: true }), auto-increments_version - Capped collections:
createCollection(name, { maxDocs: N }), FIFO eviction
Semantic search, built in.
insertOne / insertManywith{ embed: "field" }: auto-embed on insertcollection.search(query, { filter, limit, minScore }): cosine similarity + hybridcollection.similar(id): nearest-neighbour lookupdb.embed(text): direct embedding access- Built-in adapters: OpenAI (
text-embedding-3-small) and Ollama (local, zero cost)
Your database speaks English.
db.ask(collection, nlQuery): translate natural language to a filter via LLM; results cacheddb.useMemory(sessionId): episodic agent memory withremember,recall,context,compress- Built-in language model adapters: OpenAI, Anthropic, Ollama
db.schema(collection): infer or return declared schema as a plain object
Know exactly what's happening.
collection.count / sum / avg / groupBy: aggregation with optional filter and dot-notationdb.stats(collection?): count, estimated size, average doc sizeslowQueryLogoption +db.slowQueries(): capture slowfindandsearchcalls
React to every change.
collection.watch(filter?, callback?): observe mutations; callback orAsyncIterableIteratordb.watch(callback): cross-collection global observer; fires for every mutation across all collections- Events:
{ op, collection, doc, prev? }emitted after every insert, update, delete, restore
AI agents, natively wired.
db.mcp(opts): expose the database as MCP tools for AI agents- Compatible with Claude Desktop, Cursor, and any MCP client
stdiotransport (default) andhttp + SSEtransport- Tools:
find,insert,update,delete,search,ask,schema,collections - Access control:
scopesmap per collection;read/write/admin
Extend anything.
db.use(plugin): register pre/post hooks on all operations- Hooks:
beforeInsert,afterInsert,beforeUpdate,afterUpdate,beforeDelete,afterDelete,beforeFind,afterFind,beforeSearch,afterSearch - All hooks awaited in order; errors propagate to the caller
Full visibility per session.
db.sessionStats(sessionId?): reads, writes, lastActive per sessionsessionoption on all reads and writes: automatic accumulation
Deploy anywhere.
D1Adapter: Cloudflare D1 / Workers edge SQLiteBunSQLiteAdapter: Bun-nativebun:sqlite;:memory:or file pathLibSQLAdapter: LibSQL / Turso client adapter
Built for developers who value their time.
db.transaction(fn): atomic multi-collection writesdb.seed(fixtures): idempotent fixture seedingdb.dump()/db.inspect(): snapshot and metadatadb.namespace(id): isolated sub-instances per tenant / userdb.import(path): JSON import; collection name derived from filenamedb.renameCollection(from, to): in-memory + on-disk renamecollection.upsert(),collection.upsertMany(docs, matchKey),insertOne({ ifNotExists }): safe idempotent writesautoSave: true: persist after every write without{ save: true }on every callencrypt: { key }: AES-256-GCM at-rest encryption, transparent to all callerssessionoption on all reads and writes: audit trail + session statsdebug: true: connect/disconnect logging
Installation
npm install skalex@alpha
v4.0.0-alpha is the current release.
npm install skalexinstalls the last stable v3 — use@alphato get v4.
Requires Node.js ≥ 18.
Or via CDN (no bundler, no npm — browser direct):
ESM — recommended for real browser apps; connectors import alongside Skalex:
<script type="module">
import Skalex from "https://cdn.jsdelivr.net/npm/[email protected]/dist/skalex.browser.js";
import { LocalStorageAdapter } from "https://cdn.jsdelivr.net/npm/[email protected]/src/connectors/storage/browser.js";
// browser.js also exports EncryptedAdapter for AES-256-GCM at-rest encryption
const db = new Skalex({ adapter: new LocalStorageAdapter({ namespace: "myapp" }) });
await db.connect();
</script>
With npm + bundler, use the connectors subpackage:
import Skalex from 'skalex';
// Scoped barrels (tree-shakeable, recommended)
import { FsAdapter, LocalStorageAdapter, EncryptedAdapter,
BunSQLiteAdapter, D1Adapter, LibSQLAdapter } from 'skalex/connectors/storage';
import { OpenAIEmbeddingAdapter, OllamaEmbeddingAdapter } from 'skalex/connectors/embedding';
import { OpenAILLMAdapter, AnthropicLLMAdapter,
OllamaLLMAdapter } from 'skalex/connectors/llm';
// Or pull everything from the root barrel
import { FsAdapter, OpenAIEmbeddingAdapter, OpenAILLMAdapter } from 'skalex/connectors';
IIFE — exposes window.Skalex, for quick demos or environments that can't use ESM:
<!-- jsDelivr (recommended) -->
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
<!-- unpkg -->
<script src="https://unpkg.com/[email protected]"></script>
Quick Start — 30 seconds to a working database
import Skalex from "skalex";
const db = new Skalex({ path: "./data", format: "json" });
await db.connect();
const users = db.useCollection("users");
const alice = await users.insertOne({ name: "Alice", role: "admin" });
const { docs } = await users.find({ role: "admin" });
await users.updateOne({ name: "Alice" }, { score: { $inc: 10 } });
await users.deleteOne({ name: "Alice" });
await db.disconnect();
With Vector Search
import Skalex from "skalex";
const db = new Skalex({
path: "./data",
ai: { provider: "openai", apiKey: process.env.OPENAI_KEY },
});
await db.connect();
const articles = db.useCollection("articles");
await articles.insertMany([
{ title: "Intro to Skalex", content: "A zero-dependency JS database..." },
{ title: "Vector search 101", content: "Cosine similarity measures angle between vectors..." },
], { embed: "content" });
const { docs, scores } = await articles.search("how do I set up a JS database?", { limit: 2 });
console.log(docs[0].title); // most relevant result
await db.disconnect();
Documentation
Everything you need to go from zero to production:
tarekraafat.github.io/skalex :notebook_with_decorative_cover:
See what's shipping next: Roadmap
Support
- Stack Overflow: stackoverflow.com/questions/tagged/skalex
- GitHub Discussions: github.com/TarekRaafat/skalex/discussions
Author
Tarek Raafat
- Email: [email protected]
- Github: github.com/TarekRaafat
License
Released under the Apache 2.0 license.
© 2026 Tarek Raafat
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi