Repository files navigation

ScriptDB

A high-performance in-memory database with JavaScript-based querying and real-time synchronization.

Features

  • 🚀 High Performance - In-memory database with sub-millisecond query response
  • 🔌 WebSocket Support - Real-time synchronization with browser clients
  • 💾 Persistent Storage - Save databases to disk with automatic snapshots
  • 🔐 Authentication - Built-in username/password authentication
  • 🔒 HMAC Signing - Message signing for enhanced security
  • 📝 JavaScript Querying - Use JavaScript to query and manipulate data
  • 🔧 Cross-Platform - Works on Windows, Linux, and macOS
  • 🌐 Browser & Node.js - Client libraries for both environments
  • 📊 Multiple Databases - Manage multiple isolated databases
  • 🔄 Auto-Reconnect - Automatic reconnection with exponential backoff

Quick Start

Install ScriptDB Server

Windows

# Using PowerShell
irm https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.ps1 | iex

Linux/macOS

# Using curl
curl -fsSL https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.sh | bash

Start the Server

# Start ScriptDB server (default port: 1234)
scriptdb start
# Start with custom port
scriptdb start --port 8080
# Start in foreground
scriptdb start --foreground

Using the Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234',{secure: false// Use wss:// for production});awaitclient.connect();// Create a databaseawaitclient.createDatabase('mydb');// Insert dataawaitclient.run('db.users.insert({ name: "John", age: 30 })','mydb');// Query dataconstusers=awaitclient.run('db.users.find({ age: { $gt: 25 } })','mydb');console.log(users);

Using the Node.js Client

importScriptDBClientfrom'@scriptdb/client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// List databasesconstdatabases=awaitclient.listDatabases();// Run queriesconstresult=awaitclient.run('db.users.find()','mydb');

Documentation

Visit our documentation website for complete guides and API reference.

Client Libraries

Installation

# Browser Client
npm install @scriptdb/browser-client
# Node.js Client
npm install @scriptdb/client

Monorepo Structure

This repository uses a monorepo structure with multiple packages:

scriptdb/
├── packages/
│ ├── browser-client/ # WebSocket browser client
│ ├── client/ # TCP Node.js client
│ ├── cli/ # Command-line interface
│ ├── server/ # ScriptDB server
│ ├── storage/ # Storage layer
│ └── system-modules/ # System modules
├── apps/ # Application examples
├── scripts/ # Installation & utility scripts
└── package.json # Root package configuration

Available Packages

  • @scriptdb/browser-client - Browser WebSocket client
  • @scriptdb/client - Node.js TCP client
  • @scriptdb/server - ScriptDB server
  • @scriptdb/cli - Command-line tool
  • @scriptdb/storage - Storage abstraction layer
  • @scriptdb/system-modules - System modules

CLI Usage

Starting the Server

# Start server (default port: 1234)
scriptdb start
# Start with custom options
scriptdb start --port 8080
# Start in foreground mode
scriptdb start --foreground
# Stop server
scriptdb stop
# Check server status
scriptdb status

Environment Variables

  • SCRIPTDB_PORT - Server port (default: 1234)
  • SCRIPTDB_HOST - Server host (default: 0.0.0.0)
  • SCRIPTDB_DATA_DIR - Data directory path
  • SCRIPTDB_LOG_LEVEL - Logging level (debug, info, warn, error)

Client API Examples

Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Create client with optionsconstclient=newScriptDBClient('scriptdb://localhost:1234/mydb',{secure: false,requestTimeout: 30000,retries: 5,retryDelay: 2000,username: 'admin',password: 'secret'});// Connect to serverawaitclient.connect();// Database operationsawaitclient.createDatabase('mydb');awaitclient.saveDatabase('mydb');constdatabases=awaitclient.listDatabases();// Run JavaScript queriesconstresult=awaitclient.run(` db.users.find({  status: 'active', age: { $gt: 18 } }).sort({ name: 1 })`,'mydb');// Execute shell commands (if enabled)constoutput=awaitclient.executeShell('ls -la');// Disconnectawaitclient.disconnect();

Node.js Client

importScriptDBClientfrom'@scriptdb/client';constclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// All operations same as browser clientconstresult=awaitclient.run('db.users.find()','mydb');// Advanced: Auto-reconnect with queue managementconstclient=newScriptDBClient('scriptdb://localhost:1234',{timeout: 30000,retries: 5,retryDelay: 1000,maxPending: 100,maxQueue: 1000});

Query Examples

// Insertawaitclient.run(` db.users.insert({ name: 'John Doe', email: 'john@example.com', age: 30, status: 'active' })`,'mydb');// Findconstactive=awaitclient.run(` db.users.find({ status: 'active' })`,'mydb');// Updateawaitclient.run(` db.users.update( { name: 'John' }, { $set: { age: 31, verified: true } } )`,'mydb');// Deleteawaitclient.run(` db.users.remove({ status: 'inactive' })`,'mydb');// Aggregationconststats=awaitclient.run(` db.users.aggregate([ { $group: { _id: '$status', count: { $sum: 1 } } } ])`,'mydb');

Website Development

The documentation website is built with Elit@3.0.9 - a lightweight reactive UI framework - and deployed to GitHub Pages.

Local Development

# Install dependencies
npm install
# Start dev server (http://localhost:3000)
npm run dev
# Build for production
npm run build
# Preview production build
npm run preview

Advanced Features

Authentication

constclient=newScriptDBClient('scriptdb://localhost:1234',{username: 'admin',password: 'secret'});awaitclient.connect();// Or authenticate manuallyawaitclient.login('admin','secret');

HMAC Message Signing

constclient=newScriptDBClient('scriptdb://localhost:1234',{signing: {secret: 'your-secret-key',algorithm: 'sha256'// or 'sha384', 'sha512'}});

Token Refresh

constclient=newScriptDBClient('scriptdb://localhost:1234',{tokenRefresh: async()=>{constresponse=awaitfetch('/api/refresh-token');constdata=awaitresponse.json();return{token: data.token,expiresAt: data.expiresAt};}});

Custom Logger

constclient=newScriptDBClient('scriptdb://localhost:1234',{logger: {debug: (...args)=>console.log('[DEBUG]', ...args),info: (...args)=>console.info('[INFO]', ...args),warn: (...args)=>console.warn('[WARN]', ...args),error: (...args)=>console.error('[ERROR]', ...args)}});

Request Queue & Concurrency

constclient=newScriptDBClient('scriptdb://localhost:1234',{maxPending: 100,// Max concurrent requestsmaxQueue: 1000// Max queued requests});

Architecture

Protocol

ScriptDB uses a custom protocol over TCP (Node.js) and WebSocket (browser):

  • Connection URI: scriptdb://host:port/database
  • WebSocket Port: TCP port + 1 (e.g., if TCP is 1234, WebSocket is 1235)
  • Message Format: JSON with optional HMAC signing
  • Authentication: Username/password with token-based session

Data Model

  • In-Memory Storage: Fast access with sub-millisecond response times
  • JavaScript Queries: Use JavaScript for querying and manipulating data
  • Multiple Databases: Isolated database contexts
  • Persistent Snapshots: Save databases to disk at any time

Security

  • Authentication: Username/password with session tokens
  • HMAC Signing: Optional message signing for integrity verification
  • Secure WebSocket: Support for wss:// encrypted connections
  • Auto-Reconnect: Exponential backoff for reliable connections

Technology Stack (Documentation Website)

  • Framework: Elit 3.0.9 (Reactive UI library)
  • Styling: Elit CSS-in-JS (elit/css)
  • Development: elit dev - Elit dev server with HMR
  • Build Tool: esbuild (custom build script)
  • Preview: elit preview - Preview production build
  • Module System: ES Modules with importmap (Elit via CDN)
  • Deployment: GitHub Pages
  • Architecture: Single-page application (SPA) with client-side routing

Project Structure (Website)

script-db/
├── .github/
│ └── workflows/
│ └── deploy.yml # GitHub Pages deployment
├── public/
│ └── index.html # HTML template
├── src/
│ ├── main.ts # App entry point
│ ├── router.ts # Client-side router
│ ├── styles.ts # Elit CSS-in-JS styles
│ ├── components/
│ │ ├── Header.ts # Header component
│ │ └── Footer.ts # Footer component
│ └── pages/
│ ├── HomePage.ts
│ ├── InstallationPage.ts
│ ├── QuickStartPage.ts
│ ├── DocsPage.ts
│ ├── UsagePage.ts
│ ├── ScriptsPage.ts
│ └── ApiPage.ts # API documentation
├── scripts/
│ ├── install.ps1 # Windows installer
│ ├── install.sh # Unix installer
│ ├── uninstall.ps1 # Windows uninstaller
│ └── uninstall.sh # Unix uninstaller
├── elit.config.mjs # Elit configuration
├── package.json # Dependencies
└── README.md # This file

How It Works

  1. Development: npm run develit dev server with HMR
  2. Build: npm run build → Custom esbuild script (marks elit as external)
  3. Preview: npm run previewelit preview server
  4. Deployment: GitHub Actions automatically builds and deploys on push to main

Build Process

The custom build script (build.js) uses esbuild to:

  • ✅ Bundle all application code from src/main.js
  • ✅ Minify JavaScript for production
  • ✅ Mark elit as external (loaded from CDN via importmap)
  • ✅ Copy static assets (styles, scripts)
  • ✅ Generate index.html with proper paths for GitHub Pages

Why custom build? Elit's built-in elit build tries to bundle Node.js modules, so we use esbuild directly with external: ['elit'] to load Elit from CDN.

Features

  • ✨ Reactive UI with Elit 3.0.6
  • 🎨 CSS-in-JS with Elit styles (css from elit)
  • 🔄 Client-side routing (no page reloads)
  • 📦 Code bundling with esbuild
  • 📱 Responsive design
  • ⚡ Fast loading (Elit via CDN + bundled app code)
  • 🔥 HMR in development mode
  • 💅 Scoped styles, no CSS files needed

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Development Setup

# Clone the repository
git clone https://github.com/d-osc/script-db.git
# Install dependencies
npm install
# Run tests
npm test# Build packages
npm run build
# Start documentation website
npm run dev

Support

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

ScriptDB

A high-performance in-memory database with JavaScript-based querying and real-time synchronization.

Features

  • 🚀 High Performance - In-memory database with sub-millisecond query response
  • 🔌 WebSocket Support - Real-time synchronization with browser clients
  • 💾 Persistent Storage - Save databases to disk with automatic snapshots
  • 🔐 Authentication - Built-in username/password authentication
  • 🔒 HMAC Signing - Message signing for enhanced security
  • 📝 JavaScript Querying - Use JavaScript to query and manipulate data
  • 🔧 Cross-Platform - Works on Windows, Linux, and macOS
  • 🌐 Browser & Node.js - Client libraries for both environments
  • 📊 Multiple Databases - Manage multiple isolated databases
  • 🔄 Auto-Reconnect - Automatic reconnection with exponential backoff

Quick Start

Install ScriptDB Server

Windows

# Using PowerShell
irm https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.ps1 | iex

Linux/macOS

# Using curl
curl -fsSL https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.sh | bash

Start the Server

# Start ScriptDB server (default port: 1234)
scriptdb start
# Start with custom port
scriptdb start --port 8080
# Start in foreground
scriptdb start --foreground

Using the Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234',{secure: false// Use wss:// for production});awaitclient.connect();// Create a databaseawaitclient.createDatabase('mydb');// Insert dataawaitclient.run('db.users.insert({ name: "John", age: 30 })','mydb');// Query dataconstusers=awaitclient.run('db.users.find({ age: { $gt: 25 } })','mydb');console.log(users);

Using the Node.js Client

importScriptDBClientfrom'@scriptdb/client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// List databasesconstdatabases=awaitclient.listDatabases();// Run queriesconstresult=awaitclient.run('db.users.find()','mydb');

Documentation

Visit our documentation website for complete guides and API reference.

Client Libraries

Installation

# Browser Client
npm install @scriptdb/browser-client
# Node.js Client
npm install @scriptdb/client

Monorepo Structure

This repository uses a monorepo structure with multiple packages:

scriptdb/
├── packages/
│ ├── browser-client/ # WebSocket browser client
│ ├── client/ # TCP Node.js client
│ ├── cli/ # Command-line interface
│ ├── server/ # ScriptDB server
│ ├── storage/ # Storage layer
│ └── system-modules/ # System modules
├── apps/ # Application examples
├── scripts/ # Installation & utility scripts
└── package.json # Root package configuration

Available Packages

  • @scriptdb/browser-client - Browser WebSocket client
  • @scriptdb/client - Node.js TCP client
  • @scriptdb/server - ScriptDB server
  • @scriptdb/cli - Command-line tool
  • @scriptdb/storage - Storage abstraction layer
  • @scriptdb/system-modules - System modules

CLI Usage

Starting the Server

# Start server (default port: 1234)
scriptdb start
# Start with custom options
scriptdb start --port 8080
# Start in foreground mode
scriptdb start --foreground
# Stop server
scriptdb stop
# Check server status
scriptdb status

Environment Variables

  • SCRIPTDB_PORT - Server port (default: 1234)
  • SCRIPTDB_HOST - Server host (default: 0.0.0.0)
  • SCRIPTDB_DATA_DIR - Data directory path
  • SCRIPTDB_LOG_LEVEL - Logging level (debug, info, warn, error)

Client API Examples

Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Create client with optionsconstclient=newScriptDBClient('scriptdb://localhost:1234/mydb',{secure: false,requestTimeout: 30000,retries: 5,retryDelay: 2000,username: 'admin',password: 'secret'});// Connect to serverawaitclient.connect();// Database operationsawaitclient.createDatabase('mydb');awaitclient.saveDatabase('mydb');constdatabases=awaitclient.listDatabases();// Run JavaScript queriesconstresult=awaitclient.run(` db.users.find({  status: 'active', age: { $gt: 18 } }).sort({ name: 1 })`,'mydb');// Execute shell commands (if enabled)constoutput=awaitclient.executeShell('ls -la');// Disconnectawaitclient.disconnect();

Node.js Client

importScriptDBClientfrom'@scriptdb/client';constclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// All operations same as browser clientconstresult=awaitclient.run('db.users.find()','mydb');// Advanced: Auto-reconnect with queue managementconstclient=newScriptDBClient('scriptdb://localhost:1234',{timeout: 30000,retries: 5,retryDelay: 1000,maxPending: 100,maxQueue: 1000});

Query Examples

// Insertawaitclient.run(` db.users.insert({ name: 'John Doe', email: 'john@example.com', age: 30, status: 'active' })`,'mydb');// Findconstactive=awaitclient.run(` db.users.find({ status: 'active' })`,'mydb');// Updateawaitclient.run(` db.users.update( { name: 'John' }, { $set: { age: 31, verified: true } } )`,'mydb');// Deleteawaitclient.run(` db.users.remove({ status: 'inactive' })`,'mydb');// Aggregationconststats=awaitclient.run(` db.users.aggregate([ { $group: { _id: '$status', count: { $sum: 1 } } } ])`,'mydb');

Website Development

The documentation website is built with Elit@3.0.9 - a lightweight reactive UI framework - and deployed to GitHub Pages.

Local Development

# Install dependencies
npm install
# Start dev server (http://localhost:3000)
npm run dev
# Build for production
npm run build
# Preview production build
npm run preview

Advanced Features

Authentication

constclient=newScriptDBClient('scriptdb://localhost:1234',{username: 'admin',password: 'secret'});awaitclient.connect();// Or authenticate manuallyawaitclient.login('admin','secret');

HMAC Message Signing

constclient=newScriptDBClient('scriptdb://localhost:1234',{signing: {secret: 'your-secret-key',algorithm: 'sha256'// or 'sha384', 'sha512'}});

Token Refresh

constclient=newScriptDBClient('scriptdb://localhost:1234',{tokenRefresh: async()=>{constresponse=awaitfetch('/api/refresh-token');constdata=awaitresponse.json();return{token: data.token,expiresAt: data.expiresAt};}});

Custom Logger

constclient=newScriptDBClient('scriptdb://localhost:1234',{logger: {debug: (...args)=>console.log('[DEBUG]', ...args),info: (...args)=>console.info('[INFO]', ...args),warn: (...args)=>console.warn('[WARN]', ...args),error: (...args)=>console.error('[ERROR]', ...args)}});

Request Queue & Concurrency

constclient=newScriptDBClient('scriptdb://localhost:1234',{maxPending: 100,// Max concurrent requestsmaxQueue: 1000// Max queued requests});

Architecture

Protocol

ScriptDB uses a custom protocol over TCP (Node.js) and WebSocket (browser):

  • Connection URI: scriptdb://host:port/database
  • WebSocket Port: TCP port + 1 (e.g., if TCP is 1234, WebSocket is 1235)
  • Message Format: JSON with optional HMAC signing
  • Authentication: Username/password with token-based session

Data Model

  • In-Memory Storage: Fast access with sub-millisecond response times
  • JavaScript Queries: Use JavaScript for querying and manipulating data
  • Multiple Databases: Isolated database contexts
  • Persistent Snapshots: Save databases to disk at any time

Security

  • Authentication: Username/password with session tokens
  • HMAC Signing: Optional message signing for integrity verification
  • Secure WebSocket: Support for wss:// encrypted connections
  • Auto-Reconnect: Exponential backoff for reliable connections

Technology Stack (Documentation Website)

  • Framework: Elit 3.0.9 (Reactive UI library)
  • Styling: Elit CSS-in-JS (elit/css)
  • Development: elit dev - Elit dev server with HMR
  • Build Tool: esbuild (custom build script)
  • Preview: elit preview - Preview production build
  • Module System: ES Modules with importmap (Elit via CDN)
  • Deployment: GitHub Pages
  • Architecture: Single-page application (SPA) with client-side routing

Project Structure (Website)

script-db/
├── .github/
│ └── workflows/
│ └── deploy.yml # GitHub Pages deployment
├── public/
│ └── index.html # HTML template
├── src/
│ ├── main.ts # App entry point
│ ├── router.ts # Client-side router
│ ├── styles.ts # Elit CSS-in-JS styles
│ ├── components/
│ │ ├── Header.ts # Header component
│ │ └── Footer.ts # Footer component
│ └── pages/
│ ├── HomePage.ts
│ ├── InstallationPage.ts
│ ├── QuickStartPage.ts
│ ├── DocsPage.ts
│ ├── UsagePage.ts
│ ├── ScriptsPage.ts
│ └── ApiPage.ts # API documentation
├── scripts/
│ ├── install.ps1 # Windows installer
│ ├── install.sh # Unix installer
│ ├── uninstall.ps1 # Windows uninstaller
│ └── uninstall.sh # Unix uninstaller
├── elit.config.mjs # Elit configuration
├── package.json # Dependencies
└── README.md # This file

How It Works

  1. Development: npm run develit dev server with HMR
  2. Build: npm run build → Custom esbuild script (marks elit as external)
  3. Preview: npm run previewelit preview server
  4. Deployment: GitHub Actions automatically builds and deploys on push to main

Build Process

The custom build script (build.js) uses esbuild to:

  • ✅ Bundle all application code from src/main.js
  • ✅ Minify JavaScript for production
  • ✅ Mark elit as external (loaded from CDN via importmap)
  • ✅ Copy static assets (styles, scripts)
  • ✅ Generate index.html with proper paths for GitHub Pages

Why custom build? Elit's built-in elit build tries to bundle Node.js modules, so we use esbuild directly with external: ['elit'] to load Elit from CDN.

Features

  • ✨ Reactive UI with Elit 3.0.6
  • 🎨 CSS-in-JS with Elit styles (css from elit)
  • 🔄 Client-side routing (no page reloads)
  • 📦 Code bundling with esbuild
  • 📱 Responsive design
  • ⚡ Fast loading (Elit via CDN + bundled app code)
  • 🔥 HMR in development mode
  • 💅 Scoped styles, no CSS files needed

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Development Setup

# Clone the repository
git clone https://github.com/d-osc/script-db.git
# Install dependencies
npm install
# Run tests
npm test# Build packages
npm run build
# Start documentation website
npm run dev

Support

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ScriptDB

A high-performance in-memory database with JavaScript-based querying and real-time synchronization.

Features

  • 🚀 High Performance - In-memory database with sub-millisecond query response
  • 🔌 WebSocket Support - Real-time synchronization with browser clients
  • 💾 Persistent Storage - Save databases to disk with automatic snapshots
  • 🔐 Authentication - Built-in username/password authentication
  • 🔒 HMAC Signing - Message signing for enhanced security
  • 📝 JavaScript Querying - Use JavaScript to query and manipulate data
  • 🔧 Cross-Platform - Works on Windows, Linux, and macOS
  • 🌐 Browser & Node.js - Client libraries for both environments
  • 📊 Multiple Databases - Manage multiple isolated databases
  • 🔄 Auto-Reconnect - Automatic reconnection with exponential backoff

Quick Start

Install ScriptDB Server

Windows

# Using PowerShell
irm https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.ps1 | iex

Linux/macOS

# Using curl
curl -fsSL https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.sh | bash

Start the Server

# Start ScriptDB server (default port: 1234)
scriptdb start
# Start with custom port
scriptdb start --port 8080
# Start in foreground
scriptdb start --foreground

Using the Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234',{secure: false// Use wss:// for production});awaitclient.connect();// Create a databaseawaitclient.createDatabase('mydb');// Insert dataawaitclient.run('db.users.insert({ name: "John", age: 30 })','mydb');// Query dataconstusers=awaitclient.run('db.users.find({ age: { $gt: 25 } })','mydb');console.log(users);

Using the Node.js Client

importScriptDBClientfrom'@scriptdb/client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// List databasesconstdatabases=awaitclient.listDatabases();// Run queriesconstresult=awaitclient.run('db.users.find()','mydb');

Documentation

Visit our documentation website for complete guides and API reference.

Client Libraries

Installation

# Browser Client
npm install @scriptdb/browser-client
# Node.js Client
npm install @scriptdb/client

Monorepo Structure

This repository uses a monorepo structure with multiple packages:

scriptdb/
├── packages/
│ ├── browser-client/ # WebSocket browser client
│ ├── client/ # TCP Node.js client
│ ├── cli/ # Command-line interface
│ ├── server/ # ScriptDB server
│ ├── storage/ # Storage layer
│ └── system-modules/ # System modules
├── apps/ # Application examples
├── scripts/ # Installation & utility scripts
└── package.json # Root package configuration

Available Packages

  • @scriptdb/browser-client - Browser WebSocket client
  • @scriptdb/client - Node.js TCP client
  • @scriptdb/server - ScriptDB server
  • @scriptdb/cli - Command-line tool
  • @scriptdb/storage - Storage abstraction layer
  • @scriptdb/system-modules - System modules

CLI Usage

Starting the Server

# Start server (default port: 1234)
scriptdb start
# Start with custom options
scriptdb start --port 8080
# Start in foreground mode
scriptdb start --foreground
# Stop server
scriptdb stop
# Check server status
scriptdb status

Environment Variables

  • SCRIPTDB_PORT - Server port (default: 1234)
  • SCRIPTDB_HOST - Server host (default: 0.0.0.0)
  • SCRIPTDB_DATA_DIR - Data directory path
  • SCRIPTDB_LOG_LEVEL - Logging level (debug, info, warn, error)

Client API Examples

Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Create client with optionsconstclient=newScriptDBClient('scriptdb://localhost:1234/mydb',{secure: false,requestTimeout: 30000,retries: 5,retryDelay: 2000,username: 'admin',password: 'secret'});// Connect to serverawaitclient.connect();// Database operationsawaitclient.createDatabase('mydb');awaitclient.saveDatabase('mydb');constdatabases=awaitclient.listDatabases();// Run JavaScript queriesconstresult=awaitclient.run(` db.users.find({  status: 'active', age: { $gt: 18 } }).sort({ name: 1 })`,'mydb');// Execute shell commands (if enabled)constoutput=awaitclient.executeShell('ls -la');// Disconnectawaitclient.disconnect();

Node.js Client

importScriptDBClientfrom'@scriptdb/client';constclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// All operations same as browser clientconstresult=awaitclient.run('db.users.find()','mydb');// Advanced: Auto-reconnect with queue managementconstclient=newScriptDBClient('scriptdb://localhost:1234',{timeout: 30000,retries: 5,retryDelay: 1000,maxPending: 100,maxQueue: 1000});

Query Examples

// Insertawaitclient.run(` db.users.insert({ name: 'John Doe', email: 'john@example.com', age: 30, status: 'active' })`,'mydb');// Findconstactive=awaitclient.run(` db.users.find({ status: 'active' })`,'mydb');// Updateawaitclient.run(` db.users.update( { name: 'John' }, { $set: { age: 31, verified: true } } )`,'mydb');// Deleteawaitclient.run(` db.users.remove({ status: 'inactive' })`,'mydb');// Aggregationconststats=awaitclient.run(` db.users.aggregate([ { $group: { _id: '$status', count: { $sum: 1 } } } ])`,'mydb');

Website Development

The documentation website is built with Elit@3.0.9 - a lightweight reactive UI framework - and deployed to GitHub Pages.

Local Development

# Install dependencies
npm install
# Start dev server (http://localhost:3000)
npm run dev
# Build for production
npm run build
# Preview production build
npm run preview

Advanced Features

Authentication

constclient=newScriptDBClient('scriptdb://localhost:1234',{username: 'admin',password: 'secret'});awaitclient.connect();// Or authenticate manuallyawaitclient.login('admin','secret');

HMAC Message Signing

constclient=newScriptDBClient('scriptdb://localhost:1234',{signing: {secret: 'your-secret-key',algorithm: 'sha256'// or 'sha384', 'sha512'}});

Token Refresh

constclient=newScriptDBClient('scriptdb://localhost:1234',{tokenRefresh: async()=>{constresponse=awaitfetch('/api/refresh-token');constdata=awaitresponse.json();return{token: data.token,expiresAt: data.expiresAt};}});

Custom Logger

constclient=newScriptDBClient('scriptdb://localhost:1234',{logger: {debug: (...args)=>console.log('[DEBUG]', ...args),info: (...args)=>console.info('[INFO]', ...args),warn: (...args)=>console.warn('[WARN]', ...args),error: (...args)=>console.error('[ERROR]', ...args)}});

Request Queue & Concurrency

constclient=newScriptDBClient('scriptdb://localhost:1234',{maxPending: 100,// Max concurrent requestsmaxQueue: 1000// Max queued requests});

Architecture

Protocol

ScriptDB uses a custom protocol over TCP (Node.js) and WebSocket (browser):

  • Connection URI: scriptdb://host:port/database
  • WebSocket Port: TCP port + 1 (e.g., if TCP is 1234, WebSocket is 1235)
  • Message Format: JSON with optional HMAC signing
  • Authentication: Username/password with token-based session

Data Model

  • In-Memory Storage: Fast access with sub-millisecond response times
  • JavaScript Queries: Use JavaScript for querying and manipulating data
  • Multiple Databases: Isolated database contexts
  • Persistent Snapshots: Save databases to disk at any time

Security

  • Authentication: Username/password with session tokens
  • HMAC Signing: Optional message signing for integrity verification
  • Secure WebSocket: Support for wss:// encrypted connections
  • Auto-Reconnect: Exponential backoff for reliable connections

Technology Stack (Documentation Website)

  • Framework: Elit 3.0.9 (Reactive UI library)
  • Styling: Elit CSS-in-JS (elit/css)
  • Development: elit dev - Elit dev server with HMR
  • Build Tool: esbuild (custom build script)
  • Preview: elit preview - Preview production build
  • Module System: ES Modules with importmap (Elit via CDN)
  • Deployment: GitHub Pages
  • Architecture: Single-page application (SPA) with client-side routing

Project Structure (Website)

script-db/
├── .github/
│ └── workflows/
│ └── deploy.yml # GitHub Pages deployment
├── public/
│ └── index.html # HTML template
├── src/
│ ├── main.ts # App entry point
│ ├── router.ts # Client-side router
│ ├── styles.ts # Elit CSS-in-JS styles
│ ├── components/
│ │ ├── Header.ts # Header component
│ │ └── Footer.ts # Footer component
│ └── pages/
│ ├── HomePage.ts
│ ├── InstallationPage.ts
│ ├── QuickStartPage.ts
│ ├── DocsPage.ts
│ ├── UsagePage.ts
│ ├── ScriptsPage.ts
│ └── ApiPage.ts # API documentation
├── scripts/
│ ├── install.ps1 # Windows installer
│ ├── install.sh # Unix installer
│ ├── uninstall.ps1 # Windows uninstaller
│ └── uninstall.sh # Unix uninstaller
├── elit.config.mjs # Elit configuration
├── package.json # Dependencies
└── README.md # This file

How It Works

  1. Development: npm run develit dev server with HMR
  2. Build: npm run build → Custom esbuild script (marks elit as external)
  3. Preview: npm run previewelit preview server
  4. Deployment: GitHub Actions automatically builds and deploys on push to main

Build Process

The custom build script (build.js) uses esbuild to:

  • ✅ Bundle all application code from src/main.js
  • ✅ Minify JavaScript for production
  • ✅ Mark elit as external (loaded from CDN via importmap)
  • ✅ Copy static assets (styles, scripts)
  • ✅ Generate index.html with proper paths for GitHub Pages

Why custom build? Elit's built-in elit build tries to bundle Node.js modules, so we use esbuild directly with external: ['elit'] to load Elit from CDN.

Features

  • ✨ Reactive UI with Elit 3.0.6
  • 🎨 CSS-in-JS with Elit styles (css from elit)
  • 🔄 Client-side routing (no page reloads)
  • 📦 Code bundling with esbuild
  • 📱 Responsive design
  • ⚡ Fast loading (Elit via CDN + bundled app code)
  • 🔥 HMR in development mode
  • 💅 Scoped styles, no CSS files needed

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Development Setup

# Clone the repository
git clone https://github.com/d-osc/script-db.git
# Install dependencies
npm install
# Run tests
npm test# Build packages
npm run build
# Start documentation website
npm run dev

Support

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ScriptDB

A high-performance in-memory database with JavaScript-based querying and real-time synchronization.

Features

  • 🚀 High Performance - In-memory database with sub-millisecond query response
  • 🔌 WebSocket Support - Real-time synchronization with browser clients
  • 💾 Persistent Storage - Save databases to disk with automatic snapshots
  • 🔐 Authentication - Built-in username/password authentication
  • 🔒 HMAC Signing - Message signing for enhanced security
  • 📝 JavaScript Querying - Use JavaScript to query and manipulate data
  • 🔧 Cross-Platform - Works on Windows, Linux, and macOS
  • 🌐 Browser & Node.js - Client libraries for both environments
  • 📊 Multiple Databases - Manage multiple isolated databases
  • 🔄 Auto-Reconnect - Automatic reconnection with exponential backoff

Quick Start

Install ScriptDB Server

Windows

# Using PowerShell
irm https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.ps1 | iex

Linux/macOS

# Using curl
curl -fsSL https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.sh | bash

Start the Server

# Start ScriptDB server (default port: 1234)
scriptdb start
# Start with custom port
scriptdb start --port 8080
# Start in foreground
scriptdb start --foreground

Using the Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234',{secure: false// Use wss:// for production});awaitclient.connect();// Create a databaseawaitclient.createDatabase('mydb');// Insert dataawaitclient.run('db.users.insert({ name: "John", age: 30 })','mydb');// Query dataconstusers=awaitclient.run('db.users.find({ age: { $gt: 25 } })','mydb');console.log(users);

Using the Node.js Client

importScriptDBClientfrom'@scriptdb/client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// List databasesconstdatabases=awaitclient.listDatabases();// Run queriesconstresult=awaitclient.run('db.users.find()','mydb');

Documentation

Visit our documentation website for complete guides and API reference.

Client Libraries

Installation

# Browser Client
npm install @scriptdb/browser-client
# Node.js Client
npm install @scriptdb/client

Monorepo Structure

This repository uses a monorepo structure with multiple packages:

scriptdb/
├── packages/
│ ├── browser-client/ # WebSocket browser client
│ ├── client/ # TCP Node.js client
│ ├── cli/ # Command-line interface
│ ├── server/ # ScriptDB server
│ ├── storage/ # Storage layer
│ └── system-modules/ # System modules
├── apps/ # Application examples
├── scripts/ # Installation & utility scripts
└── package.json # Root package configuration

Available Packages

  • @scriptdb/browser-client - Browser WebSocket client
  • @scriptdb/client - Node.js TCP client
  • @scriptdb/server - ScriptDB server
  • @scriptdb/cli - Command-line tool
  • @scriptdb/storage - Storage abstraction layer
  • @scriptdb/system-modules - System modules

CLI Usage

Starting the Server

# Start server (default port: 1234)
scriptdb start
# Start with custom options
scriptdb start --port 8080
# Start in foreground mode
scriptdb start --foreground
# Stop server
scriptdb stop
# Check server status
scriptdb status

Environment Variables

  • SCRIPTDB_PORT - Server port (default: 1234)
  • SCRIPTDB_HOST - Server host (default: 0.0.0.0)
  • SCRIPTDB_DATA_DIR - Data directory path
  • SCRIPTDB_LOG_LEVEL - Logging level (debug, info, warn, error)

Client API Examples

Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Create client with optionsconstclient=newScriptDBClient('scriptdb://localhost:1234/mydb',{secure: false,requestTimeout: 30000,retries: 5,retryDelay: 2000,username: 'admin',password: 'secret'});// Connect to serverawaitclient.connect();// Database operationsawaitclient.createDatabase('mydb');awaitclient.saveDatabase('mydb');constdatabases=awaitclient.listDatabases();// Run JavaScript queriesconstresult=awaitclient.run(` db.users.find({  status: 'active', age: { $gt: 18 } }).sort({ name: 1 })`,'mydb');// Execute shell commands (if enabled)constoutput=awaitclient.executeShell('ls -la');// Disconnectawaitclient.disconnect();

Node.js Client

importScriptDBClientfrom'@scriptdb/client';constclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// All operations same as browser clientconstresult=awaitclient.run('db.users.find()','mydb');// Advanced: Auto-reconnect with queue managementconstclient=newScriptDBClient('scriptdb://localhost:1234',{timeout: 30000,retries: 5,retryDelay: 1000,maxPending: 100,maxQueue: 1000});

Query Examples

// Insertawaitclient.run(` db.users.insert({ name: 'John Doe', email: 'john@example.com', age: 30, status: 'active' })`,'mydb');// Findconstactive=awaitclient.run(` db.users.find({ status: 'active' })`,'mydb');// Updateawaitclient.run(` db.users.update( { name: 'John' }, { $set: { age: 31, verified: true } } )`,'mydb');// Deleteawaitclient.run(` db.users.remove({ status: 'inactive' })`,'mydb');// Aggregationconststats=awaitclient.run(` db.users.aggregate([ { $group: { _id: '$status', count: { $sum: 1 } } } ])`,'mydb');

Website Development

The documentation website is built with Elit@3.0.9 - a lightweight reactive UI framework - and deployed to GitHub Pages.

Local Development

# Install dependencies
npm install
# Start dev server (http://localhost:3000)
npm run dev
# Build for production
npm run build
# Preview production build
npm run preview

Advanced Features

Authentication

constclient=newScriptDBClient('scriptdb://localhost:1234',{username: 'admin',password: 'secret'});awaitclient.connect();// Or authenticate manuallyawaitclient.login('admin','secret');

HMAC Message Signing

constclient=newScriptDBClient('scriptdb://localhost:1234',{signing: {secret: 'your-secret-key',algorithm: 'sha256'// or 'sha384', 'sha512'}});

Token Refresh

constclient=newScriptDBClient('scriptdb://localhost:1234',{tokenRefresh: async()=>{constresponse=awaitfetch('/api/refresh-token');constdata=awaitresponse.json();return{token: data.token,expiresAt: data.expiresAt};}});

Custom Logger

constclient=newScriptDBClient('scriptdb://localhost:1234',{logger: {debug: (...args)=>console.log('[DEBUG]', ...args),info: (...args)=>console.info('[INFO]', ...args),warn: (...args)=>console.warn('[WARN]', ...args),error: (...args)=>console.error('[ERROR]', ...args)}});

Request Queue & Concurrency

constclient=newScriptDBClient('scriptdb://localhost:1234',{maxPending: 100,// Max concurrent requestsmaxQueue: 1000// Max queued requests});

Architecture

Protocol

ScriptDB uses a custom protocol over TCP (Node.js) and WebSocket (browser):

  • Connection URI: scriptdb://host:port/database
  • WebSocket Port: TCP port + 1 (e.g., if TCP is 1234, WebSocket is 1235)
  • Message Format: JSON with optional HMAC signing
  • Authentication: Username/password with token-based session

Data Model

  • In-Memory Storage: Fast access with sub-millisecond response times
  • JavaScript Queries: Use JavaScript for querying and manipulating data
  • Multiple Databases: Isolated database contexts
  • Persistent Snapshots: Save databases to disk at any time

Security

  • Authentication: Username/password with session tokens
  • HMAC Signing: Optional message signing for integrity verification
  • Secure WebSocket: Support for wss:// encrypted connections
  • Auto-Reconnect: Exponential backoff for reliable connections

Technology Stack (Documentation Website)

  • Framework: Elit 3.0.9 (Reactive UI library)
  • Styling: Elit CSS-in-JS (elit/css)
  • Development: elit dev - Elit dev server with HMR
  • Build Tool: esbuild (custom build script)
  • Preview: elit preview - Preview production build
  • Module System: ES Modules with importmap (Elit via CDN)
  • Deployment: GitHub Pages
  • Architecture: Single-page application (SPA) with client-side routing

Project Structure (Website)

script-db/
├── .github/
│ └── workflows/
│ └── deploy.yml # GitHub Pages deployment
├── public/
│ └── index.html # HTML template
├── src/
│ ├── main.ts # App entry point
│ ├── router.ts # Client-side router
│ ├── styles.ts # Elit CSS-in-JS styles
│ ├── components/
│ │ ├── Header.ts # Header component
│ │ └── Footer.ts # Footer component
│ └── pages/
│ ├── HomePage.ts
│ ├── InstallationPage.ts
│ ├── QuickStartPage.ts
│ ├── DocsPage.ts
│ ├── UsagePage.ts
│ ├── ScriptsPage.ts
│ └── ApiPage.ts # API documentation
├── scripts/
│ ├── install.ps1 # Windows installer
│ ├── install.sh # Unix installer
│ ├── uninstall.ps1 # Windows uninstaller
│ └── uninstall.sh # Unix uninstaller
├── elit.config.mjs # Elit configuration
├── package.json # Dependencies
└── README.md # This file

How It Works

  1. Development: npm run develit dev server with HMR
  2. Build: npm run build → Custom esbuild script (marks elit as external)
  3. Preview: npm run previewelit preview server
  4. Deployment: GitHub Actions automatically builds and deploys on push to main

Build Process

The custom build script (build.js) uses esbuild to:

  • ✅ Bundle all application code from src/main.js
  • ✅ Minify JavaScript for production
  • ✅ Mark elit as external (loaded from CDN via importmap)
  • ✅ Copy static assets (styles, scripts)
  • ✅ Generate index.html with proper paths for GitHub Pages

Why custom build? Elit's built-in elit build tries to bundle Node.js modules, so we use esbuild directly with external: ['elit'] to load Elit from CDN.

Features

  • ✨ Reactive UI with Elit 3.0.6
  • 🎨 CSS-in-JS with Elit styles (css from elit)
  • 🔄 Client-side routing (no page reloads)
  • 📦 Code bundling with esbuild
  • 📱 Responsive design
  • ⚡ Fast loading (Elit via CDN + bundled app code)
  • 🔥 HMR in development mode
  • 💅 Scoped styles, no CSS files needed

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Development Setup

# Clone the repository
git clone https://github.com/d-osc/script-db.git
# Install dependencies
npm install
# Run tests
npm test# Build packages
npm run build
# Start documentation website
npm run dev

Support

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

ScriptDB

A high-performance in-memory database with JavaScript-based querying and real-time synchronization.

Features

  • 🚀 High Performance - In-memory database with sub-millisecond query response
  • 🔌 WebSocket Support - Real-time synchronization with browser clients
  • 💾 Persistent Storage - Save databases to disk with automatic snapshots
  • 🔐 Authentication - Built-in username/password authentication
  • 🔒 HMAC Signing - Message signing for enhanced security
  • 📝 JavaScript Querying - Use JavaScript to query and manipulate data
  • 🔧 Cross-Platform - Works on Windows, Linux, and macOS
  • 🌐 Browser & Node.js - Client libraries for both environments
  • 📊 Multiple Databases - Manage multiple isolated databases
  • 🔄 Auto-Reconnect - Automatic reconnection with exponential backoff

Quick Start

Install ScriptDB Server

Windows

# Using PowerShell
irm https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.ps1 | iex

Linux/macOS

# Using curl
curl -fsSL https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.sh | bash

Start the Server

# Start ScriptDB server (default port: 1234)
scriptdb start
# Start with custom port
scriptdb start --port 8080
# Start in foreground
scriptdb start --foreground

Using the Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234',{secure: false// Use wss:// for production});awaitclient.connect();// Create a databaseawaitclient.createDatabase('mydb');// Insert dataawaitclient.run('db.users.insert({ name: "John", age: 30 })','mydb');// Query dataconstusers=awaitclient.run('db.users.find({ age: { $gt: 25 } })','mydb');console.log(users);

Using the Node.js Client

importScriptDBClientfrom'@scriptdb/client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// List databasesconstdatabases=awaitclient.listDatabases();// Run queriesconstresult=awaitclient.run('db.users.find()','mydb');

Documentation

Visit our documentation website for complete guides and API reference.

Client Libraries

Installation

# Browser Client
npm install @scriptdb/browser-client
# Node.js Client
npm install @scriptdb/client

Monorepo Structure

This repository uses a monorepo structure with multiple packages:

scriptdb/
├── packages/
│ ├── browser-client/ # WebSocket browser client
│ ├── client/ # TCP Node.js client
│ ├── cli/ # Command-line interface
│ ├── server/ # ScriptDB server
│ ├── storage/ # Storage layer
│ └── system-modules/ # System modules
├── apps/ # Application examples
├── scripts/ # Installation & utility scripts
└── package.json # Root package configuration

Available Packages

  • @scriptdb/browser-client - Browser WebSocket client
  • @scriptdb/client - Node.js TCP client
  • @scriptdb/server - ScriptDB server
  • @scriptdb/cli - Command-line tool
  • @scriptdb/storage - Storage abstraction layer
  • @scriptdb/system-modules - System modules

CLI Usage

Starting the Server

# Start server (default port: 1234)
scriptdb start
# Start with custom options
scriptdb start --port 8080
# Start in foreground mode
scriptdb start --foreground
# Stop server
scriptdb stop
# Check server status
scriptdb status

Environment Variables

  • SCRIPTDB_PORT - Server port (default: 1234)
  • SCRIPTDB_HOST - Server host (default: 0.0.0.0)
  • SCRIPTDB_DATA_DIR - Data directory path
  • SCRIPTDB_LOG_LEVEL - Logging level (debug, info, warn, error)

Client API Examples

Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Create client with optionsconstclient=newScriptDBClient('scriptdb://localhost:1234/mydb',{secure: false,requestTimeout: 30000,retries: 5,retryDelay: 2000,username: 'admin',password: 'secret'});// Connect to serverawaitclient.connect();// Database operationsawaitclient.createDatabase('mydb');awaitclient.saveDatabase('mydb');constdatabases=awaitclient.listDatabases();// Run JavaScript queriesconstresult=awaitclient.run(` db.users.find({  status: 'active', age: { $gt: 18 } }).sort({ name: 1 })`,'mydb');// Execute shell commands (if enabled)constoutput=awaitclient.executeShell('ls -la');// Disconnectawaitclient.disconnect();

Node.js Client

importScriptDBClientfrom'@scriptdb/client';constclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// All operations same as browser clientconstresult=awaitclient.run('db.users.find()','mydb');// Advanced: Auto-reconnect with queue managementconstclient=newScriptDBClient('scriptdb://localhost:1234',{timeout: 30000,retries: 5,retryDelay: 1000,maxPending: 100,maxQueue: 1000});

Query Examples

// Insertawaitclient.run(` db.users.insert({ name: 'John Doe', email: 'john@example.com', age: 30, status: 'active' })`,'mydb');// Findconstactive=awaitclient.run(` db.users.find({ status: 'active' })`,'mydb');// Updateawaitclient.run(` db.users.update( { name: 'John' }, { $set: { age: 31, verified: true } } )`,'mydb');// Deleteawaitclient.run(` db.users.remove({ status: 'inactive' })`,'mydb');// Aggregationconststats=awaitclient.run(` db.users.aggregate([ { $group: { _id: '$status', count: { $sum: 1 } } } ])`,'mydb');

Website Development

The documentation website is built with Elit@3.0.9 - a lightweight reactive UI framework - and deployed to GitHub Pages.

Local Development

# Install dependencies
npm install
# Start dev server (http://localhost:3000)
npm run dev
# Build for production
npm run build
# Preview production build
npm run preview

Advanced Features

Authentication

constclient=newScriptDBClient('scriptdb://localhost:1234',{username: 'admin',password: 'secret'});awaitclient.connect();// Or authenticate manuallyawaitclient.login('admin','secret');

HMAC Message Signing

constclient=newScriptDBClient('scriptdb://localhost:1234',{signing: {secret: 'your-secret-key',algorithm: 'sha256'// or 'sha384', 'sha512'}});

Token Refresh

constclient=newScriptDBClient('scriptdb://localhost:1234',{tokenRefresh: async()=>{constresponse=awaitfetch('/api/refresh-token');constdata=awaitresponse.json();return{token: data.token,expiresAt: data.expiresAt};}});

Custom Logger

constclient=newScriptDBClient('scriptdb://localhost:1234',{logger: {debug: (...args)=>console.log('[DEBUG]', ...args),info: (...args)=>console.info('[INFO]', ...args),warn: (...args)=>console.warn('[WARN]', ...args),error: (...args)=>console.error('[ERROR]', ...args)}});

Request Queue & Concurrency

constclient=newScriptDBClient('scriptdb://localhost:1234',{maxPending: 100,// Max concurrent requestsmaxQueue: 1000// Max queued requests});

Architecture

Protocol

ScriptDB uses a custom protocol over TCP (Node.js) and WebSocket (browser):

  • Connection URI: scriptdb://host:port/database
  • WebSocket Port: TCP port + 1 (e.g., if TCP is 1234, WebSocket is 1235)
  • Message Format: JSON with optional HMAC signing
  • Authentication: Username/password with token-based session

Data Model

  • In-Memory Storage: Fast access with sub-millisecond response times
  • JavaScript Queries: Use JavaScript for querying and manipulating data
  • Multiple Databases: Isolated database contexts
  • Persistent Snapshots: Save databases to disk at any time

Security

  • Authentication: Username/password with session tokens
  • HMAC Signing: Optional message signing for integrity verification
  • Secure WebSocket: Support for wss:// encrypted connections
  • Auto-Reconnect: Exponential backoff for reliable connections

Technology Stack (Documentation Website)

  • Framework: Elit 3.0.9 (Reactive UI library)
  • Styling: Elit CSS-in-JS (elit/css)
  • Development: elit dev - Elit dev server with HMR
  • Build Tool: esbuild (custom build script)
  • Preview: elit preview - Preview production build
  • Module System: ES Modules with importmap (Elit via CDN)
  • Deployment: GitHub Pages
  • Architecture: Single-page application (SPA) with client-side routing

Project Structure (Website)

script-db/
├── .github/
│ └── workflows/
│ └── deploy.yml # GitHub Pages deployment
├── public/
│ └── index.html # HTML template
├── src/
│ ├── main.ts # App entry point
│ ├── router.ts # Client-side router
│ ├── styles.ts # Elit CSS-in-JS styles
│ ├── components/
│ │ ├── Header.ts # Header component
│ │ └── Footer.ts # Footer component
│ └── pages/
│ ├── HomePage.ts
│ ├── InstallationPage.ts
│ ├── QuickStartPage.ts
│ ├── DocsPage.ts
│ ├── UsagePage.ts
│ ├── ScriptsPage.ts
│ └── ApiPage.ts # API documentation
├── scripts/
│ ├── install.ps1 # Windows installer
│ ├── install.sh # Unix installer
│ ├── uninstall.ps1 # Windows uninstaller
│ └── uninstall.sh # Unix uninstaller
├── elit.config.mjs # Elit configuration
├── package.json # Dependencies
└── README.md # This file

How It Works

  1. Development: npm run develit dev server with HMR
  2. Build: npm run build → Custom esbuild script (marks elit as external)
  3. Preview: npm run previewelit preview server
  4. Deployment: GitHub Actions automatically builds and deploys on push to main

Build Process

The custom build script (build.js) uses esbuild to:

  • ✅ Bundle all application code from src/main.js
  • ✅ Minify JavaScript for production
  • ✅ Mark elit as external (loaded from CDN via importmap)
  • ✅ Copy static assets (styles, scripts)
  • ✅ Generate index.html with proper paths for GitHub Pages

Why custom build? Elit's built-in elit build tries to bundle Node.js modules, so we use esbuild directly with external: ['elit'] to load Elit from CDN.

Features

  • ✨ Reactive UI with Elit 3.0.6
  • 🎨 CSS-in-JS with Elit styles (css from elit)
  • 🔄 Client-side routing (no page reloads)
  • 📦 Code bundling with esbuild
  • 📱 Responsive design
  • ⚡ Fast loading (Elit via CDN + bundled app code)
  • 🔥 HMR in development mode
  • 💅 Scoped styles, no CSS files needed

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Development Setup

# Clone the repository
git clone https://github.com/d-osc/script-db.git
# Install dependencies
npm install
# Run tests
npm test# Build packages
npm run build
# Start documentation website
npm run dev

Support

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ScriptDB

A high-performance in-memory database with JavaScript-based querying and real-time synchronization.

Features

  • 🚀 High Performance - In-memory database with sub-millisecond query response
  • 🔌 WebSocket Support - Real-time synchronization with browser clients
  • 💾 Persistent Storage - Save databases to disk with automatic snapshots
  • 🔐 Authentication - Built-in username/password authentication
  • 🔒 HMAC Signing - Message signing for enhanced security
  • 📝 JavaScript Querying - Use JavaScript to query and manipulate data
  • 🔧 Cross-Platform - Works on Windows, Linux, and macOS
  • 🌐 Browser & Node.js - Client libraries for both environments
  • 📊 Multiple Databases - Manage multiple isolated databases
  • 🔄 Auto-Reconnect - Automatic reconnection with exponential backoff

Quick Start

Install ScriptDB Server

Windows

# Using PowerShell
irm https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.ps1 | iex

Linux/macOS

# Using curl
curl -fsSL https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.sh | bash

Start the Server

# Start ScriptDB server (default port: 1234)
scriptdb start
# Start with custom port
scriptdb start --port 8080
# Start in foreground
scriptdb start --foreground

Using the Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234',{secure: false// Use wss:// for production});awaitclient.connect();// Create a databaseawaitclient.createDatabase('mydb');// Insert dataawaitclient.run('db.users.insert({ name: "John", age: 30 })','mydb');// Query dataconstusers=awaitclient.run('db.users.find({ age: { $gt: 25 } })','mydb');console.log(users);

Using the Node.js Client

importScriptDBClientfrom'@scriptdb/client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// List databasesconstdatabases=awaitclient.listDatabases();// Run queriesconstresult=awaitclient.run('db.users.find()','mydb');

Documentation

Visit our documentation website for complete guides and API reference.

Client Libraries

Installation

# Browser Client
npm install @scriptdb/browser-client
# Node.js Client
npm install @scriptdb/client

Monorepo Structure

This repository uses a monorepo structure with multiple packages:

scriptdb/
├── packages/
│ ├── browser-client/ # WebSocket browser client
│ ├── client/ # TCP Node.js client
│ ├── cli/ # Command-line interface
│ ├── server/ # ScriptDB server
│ ├── storage/ # Storage layer
│ └── system-modules/ # System modules
├── apps/ # Application examples
├── scripts/ # Installation & utility scripts
└── package.json # Root package configuration

Available Packages

  • @scriptdb/browser-client - Browser WebSocket client
  • @scriptdb/client - Node.js TCP client
  • @scriptdb/server - ScriptDB server
  • @scriptdb/cli - Command-line tool
  • @scriptdb/storage - Storage abstraction layer
  • @scriptdb/system-modules - System modules

CLI Usage

Starting the Server

# Start server (default port: 1234)
scriptdb start
# Start with custom options
scriptdb start --port 8080
# Start in foreground mode
scriptdb start --foreground
# Stop server
scriptdb stop
# Check server status
scriptdb status

Environment Variables

  • SCRIPTDB_PORT - Server port (default: 1234)
  • SCRIPTDB_HOST - Server host (default: 0.0.0.0)
  • SCRIPTDB_DATA_DIR - Data directory path
  • SCRIPTDB_LOG_LEVEL - Logging level (debug, info, warn, error)

Client API Examples

Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Create client with optionsconstclient=newScriptDBClient('scriptdb://localhost:1234/mydb',{secure: false,requestTimeout: 30000,retries: 5,retryDelay: 2000,username: 'admin',password: 'secret'});// Connect to serverawaitclient.connect();// Database operationsawaitclient.createDatabase('mydb');awaitclient.saveDatabase('mydb');constdatabases=awaitclient.listDatabases();// Run JavaScript queriesconstresult=awaitclient.run(` db.users.find({  status: 'active', age: { $gt: 18 } }).sort({ name: 1 })`,'mydb');// Execute shell commands (if enabled)constoutput=awaitclient.executeShell('ls -la');// Disconnectawaitclient.disconnect();

Node.js Client

importScriptDBClientfrom'@scriptdb/client';constclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// All operations same as browser clientconstresult=awaitclient.run('db.users.find()','mydb');// Advanced: Auto-reconnect with queue managementconstclient=newScriptDBClient('scriptdb://localhost:1234',{timeout: 30000,retries: 5,retryDelay: 1000,maxPending: 100,maxQueue: 1000});

Query Examples

// Insertawaitclient.run(` db.users.insert({ name: 'John Doe', email: 'john@example.com', age: 30, status: 'active' })`,'mydb');// Findconstactive=awaitclient.run(` db.users.find({ status: 'active' })`,'mydb');// Updateawaitclient.run(` db.users.update( { name: 'John' }, { $set: { age: 31, verified: true } } )`,'mydb');// Deleteawaitclient.run(` db.users.remove({ status: 'inactive' })`,'mydb');// Aggregationconststats=awaitclient.run(` db.users.aggregate([ { $group: { _id: '$status', count: { $sum: 1 } } } ])`,'mydb');

Website Development

The documentation website is built with Elit@3.0.9 - a lightweight reactive UI framework - and deployed to GitHub Pages.

Local Development

# Install dependencies
npm install
# Start dev server (http://localhost:3000)
npm run dev
# Build for production
npm run build
# Preview production build
npm run preview

Advanced Features

Authentication

constclient=newScriptDBClient('scriptdb://localhost:1234',{username: 'admin',password: 'secret'});awaitclient.connect();// Or authenticate manuallyawaitclient.login('admin','secret');

HMAC Message Signing

constclient=newScriptDBClient('scriptdb://localhost:1234',{signing: {secret: 'your-secret-key',algorithm: 'sha256'// or 'sha384', 'sha512'}});

Token Refresh

constclient=newScriptDBClient('scriptdb://localhost:1234',{tokenRefresh: async()=>{constresponse=awaitfetch('/api/refresh-token');constdata=awaitresponse.json();return{token: data.token,expiresAt: data.expiresAt};}});

Custom Logger

constclient=newScriptDBClient('scriptdb://localhost:1234',{logger: {debug: (...args)=>console.log('[DEBUG]', ...args),info: (...args)=>console.info('[INFO]', ...args),warn: (...args)=>console.warn('[WARN]', ...args),error: (...args)=>console.error('[ERROR]', ...args)}});

Request Queue & Concurrency

constclient=newScriptDBClient('scriptdb://localhost:1234',{maxPending: 100,// Max concurrent requestsmaxQueue: 1000// Max queued requests});

Architecture

Protocol

ScriptDB uses a custom protocol over TCP (Node.js) and WebSocket (browser):

  • Connection URI: scriptdb://host:port/database
  • WebSocket Port: TCP port + 1 (e.g., if TCP is 1234, WebSocket is 1235)
  • Message Format: JSON with optional HMAC signing
  • Authentication: Username/password with token-based session

Data Model

  • In-Memory Storage: Fast access with sub-millisecond response times
  • JavaScript Queries: Use JavaScript for querying and manipulating data
  • Multiple Databases: Isolated database contexts
  • Persistent Snapshots: Save databases to disk at any time

Security

  • Authentication: Username/password with session tokens
  • HMAC Signing: Optional message signing for integrity verification
  • Secure WebSocket: Support for wss:// encrypted connections
  • Auto-Reconnect: Exponential backoff for reliable connections

Technology Stack (Documentation Website)

  • Framework: Elit 3.0.9 (Reactive UI library)
  • Styling: Elit CSS-in-JS (elit/css)
  • Development: elit dev - Elit dev server with HMR
  • Build Tool: esbuild (custom build script)
  • Preview: elit preview - Preview production build
  • Module System: ES Modules with importmap (Elit via CDN)
  • Deployment: GitHub Pages
  • Architecture: Single-page application (SPA) with client-side routing

Project Structure (Website)

script-db/
├── .github/
│ └── workflows/
│ └── deploy.yml # GitHub Pages deployment
├── public/
│ └── index.html # HTML template
├── src/
│ ├── main.ts # App entry point
│ ├── router.ts # Client-side router
│ ├── styles.ts # Elit CSS-in-JS styles
│ ├── components/
│ │ ├── Header.ts # Header component
│ │ └── Footer.ts # Footer component
│ └── pages/
│ ├── HomePage.ts
│ ├── InstallationPage.ts
│ ├── QuickStartPage.ts
│ ├── DocsPage.ts
│ ├── UsagePage.ts
│ ├── ScriptsPage.ts
│ └── ApiPage.ts # API documentation
├── scripts/
│ ├── install.ps1 # Windows installer
│ ├── install.sh # Unix installer
│ ├── uninstall.ps1 # Windows uninstaller
│ └── uninstall.sh # Unix uninstaller
├── elit.config.mjs # Elit configuration
├── package.json # Dependencies
└── README.md # This file

How It Works

  1. Development: npm run develit dev server with HMR
  2. Build: npm run build → Custom esbuild script (marks elit as external)
  3. Preview: npm run previewelit preview server
  4. Deployment: GitHub Actions automatically builds and deploys on push to main

Build Process

The custom build script (build.js) uses esbuild to:

  • ✅ Bundle all application code from src/main.js
  • ✅ Minify JavaScript for production
  • ✅ Mark elit as external (loaded from CDN via importmap)
  • ✅ Copy static assets (styles, scripts)
  • ✅ Generate index.html with proper paths for GitHub Pages

Why custom build? Elit's built-in elit build tries to bundle Node.js modules, so we use esbuild directly with external: ['elit'] to load Elit from CDN.

Features

  • ✨ Reactive UI with Elit 3.0.6
  • 🎨 CSS-in-JS with Elit styles (css from elit)
  • 🔄 Client-side routing (no page reloads)
  • 📦 Code bundling with esbuild
  • 📱 Responsive design
  • ⚡ Fast loading (Elit via CDN + bundled app code)
  • 🔥 HMR in development mode
  • 💅 Scoped styles, no CSS files needed

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Development Setup

# Clone the repository
git clone https://github.com/d-osc/script-db.git
# Install dependencies
npm install
# Run tests
npm test# Build packages
npm run build
# Start documentation website
npm run dev

Support

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ScriptDB

A high-performance in-memory database with JavaScript-based querying and real-time synchronization.

Features

  • 🚀 High Performance - In-memory database with sub-millisecond query response
  • 🔌 WebSocket Support - Real-time synchronization with browser clients
  • 💾 Persistent Storage - Save databases to disk with automatic snapshots
  • 🔐 Authentication - Built-in username/password authentication
  • 🔒 HMAC Signing - Message signing for enhanced security
  • 📝 JavaScript Querying - Use JavaScript to query and manipulate data
  • 🔧 Cross-Platform - Works on Windows, Linux, and macOS
  • 🌐 Browser & Node.js - Client libraries for both environments
  • 📊 Multiple Databases - Manage multiple isolated databases
  • 🔄 Auto-Reconnect - Automatic reconnection with exponential backoff

Quick Start

Install ScriptDB Server

Windows

# Using PowerShell
irm https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.ps1 | iex

Linux/macOS

# Using curl
curl -fsSL https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.sh | bash

Start the Server

# Start ScriptDB server (default port: 1234)
scriptdb start
# Start with custom port
scriptdb start --port 8080
# Start in foreground
scriptdb start --foreground

Using the Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234',{secure: false// Use wss:// for production});awaitclient.connect();// Create a databaseawaitclient.createDatabase('mydb');// Insert dataawaitclient.run('db.users.insert({ name: "John", age: 30 })','mydb');// Query dataconstusers=awaitclient.run('db.users.find({ age: { $gt: 25 } })','mydb');console.log(users);

Using the Node.js Client

importScriptDBClientfrom'@scriptdb/client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// List databasesconstdatabases=awaitclient.listDatabases();// Run queriesconstresult=awaitclient.run('db.users.find()','mydb');

Documentation

Visit our documentation website for complete guides and API reference.

Client Libraries

Installation

# Browser Client
npm install @scriptdb/browser-client
# Node.js Client
npm install @scriptdb/client

Monorepo Structure

This repository uses a monorepo structure with multiple packages:

scriptdb/
├── packages/
│ ├── browser-client/ # WebSocket browser client
│ ├── client/ # TCP Node.js client
│ ├── cli/ # Command-line interface
│ ├── server/ # ScriptDB server
│ ├── storage/ # Storage layer
│ └── system-modules/ # System modules
├── apps/ # Application examples
├── scripts/ # Installation & utility scripts
└── package.json # Root package configuration

Available Packages

  • @scriptdb/browser-client - Browser WebSocket client
  • @scriptdb/client - Node.js TCP client
  • @scriptdb/server - ScriptDB server
  • @scriptdb/cli - Command-line tool
  • @scriptdb/storage - Storage abstraction layer
  • @scriptdb/system-modules - System modules

CLI Usage

Starting the Server

# Start server (default port: 1234)
scriptdb start
# Start with custom options
scriptdb start --port 8080
# Start in foreground mode
scriptdb start --foreground
# Stop server
scriptdb stop
# Check server status
scriptdb status

Environment Variables

  • SCRIPTDB_PORT - Server port (default: 1234)
  • SCRIPTDB_HOST - Server host (default: 0.0.0.0)
  • SCRIPTDB_DATA_DIR - Data directory path
  • SCRIPTDB_LOG_LEVEL - Logging level (debug, info, warn, error)

Client API Examples

Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Create client with optionsconstclient=newScriptDBClient('scriptdb://localhost:1234/mydb',{secure: false,requestTimeout: 30000,retries: 5,retryDelay: 2000,username: 'admin',password: 'secret'});// Connect to serverawaitclient.connect();// Database operationsawaitclient.createDatabase('mydb');awaitclient.saveDatabase('mydb');constdatabases=awaitclient.listDatabases();// Run JavaScript queriesconstresult=awaitclient.run(` db.users.find({  status: 'active', age: { $gt: 18 } }).sort({ name: 1 })`,'mydb');// Execute shell commands (if enabled)constoutput=awaitclient.executeShell('ls -la');// Disconnectawaitclient.disconnect();

Node.js Client

importScriptDBClientfrom'@scriptdb/client';constclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// All operations same as browser clientconstresult=awaitclient.run('db.users.find()','mydb');// Advanced: Auto-reconnect with queue managementconstclient=newScriptDBClient('scriptdb://localhost:1234',{timeout: 30000,retries: 5,retryDelay: 1000,maxPending: 100,maxQueue: 1000});

Query Examples

// Insertawaitclient.run(` db.users.insert({ name: 'John Doe', email: 'john@example.com', age: 30, status: 'active' })`,'mydb');// Findconstactive=awaitclient.run(` db.users.find({ status: 'active' })`,'mydb');// Updateawaitclient.run(` db.users.update( { name: 'John' }, { $set: { age: 31, verified: true } } )`,'mydb');// Deleteawaitclient.run(` db.users.remove({ status: 'inactive' })`,'mydb');// Aggregationconststats=awaitclient.run(` db.users.aggregate([ { $group: { _id: '$status', count: { $sum: 1 } } } ])`,'mydb');

Website Development

The documentation website is built with Elit@3.0.9 - a lightweight reactive UI framework - and deployed to GitHub Pages.

Local Development

# Install dependencies
npm install
# Start dev server (http://localhost:3000)
npm run dev
# Build for production
npm run build
# Preview production build
npm run preview

Advanced Features

Authentication

constclient=newScriptDBClient('scriptdb://localhost:1234',{username: 'admin',password: 'secret'});awaitclient.connect();// Or authenticate manuallyawaitclient.login('admin','secret');

HMAC Message Signing

constclient=newScriptDBClient('scriptdb://localhost:1234',{signing: {secret: 'your-secret-key',algorithm: 'sha256'// or 'sha384', 'sha512'}});

Token Refresh

constclient=newScriptDBClient('scriptdb://localhost:1234',{tokenRefresh: async()=>{constresponse=awaitfetch('/api/refresh-token');constdata=awaitresponse.json();return{token: data.token,expiresAt: data.expiresAt};}});

Custom Logger

constclient=newScriptDBClient('scriptdb://localhost:1234',{logger: {debug: (...args)=>console.log('[DEBUG]', ...args),info: (...args)=>console.info('[INFO]', ...args),warn: (...args)=>console.warn('[WARN]', ...args),error: (...args)=>console.error('[ERROR]', ...args)}});

Request Queue & Concurrency

constclient=newScriptDBClient('scriptdb://localhost:1234',{maxPending: 100,// Max concurrent requestsmaxQueue: 1000// Max queued requests});

Architecture

Protocol

ScriptDB uses a custom protocol over TCP (Node.js) and WebSocket (browser):

  • Connection URI: scriptdb://host:port/database
  • WebSocket Port: TCP port + 1 (e.g., if TCP is 1234, WebSocket is 1235)
  • Message Format: JSON with optional HMAC signing
  • Authentication: Username/password with token-based session

Data Model

  • In-Memory Storage: Fast access with sub-millisecond response times
  • JavaScript Queries: Use JavaScript for querying and manipulating data
  • Multiple Databases: Isolated database contexts
  • Persistent Snapshots: Save databases to disk at any time

Security

  • Authentication: Username/password with session tokens
  • HMAC Signing: Optional message signing for integrity verification
  • Secure WebSocket: Support for wss:// encrypted connections
  • Auto-Reconnect: Exponential backoff for reliable connections

Technology Stack (Documentation Website)

  • Framework: Elit 3.0.9 (Reactive UI library)
  • Styling: Elit CSS-in-JS (elit/css)
  • Development: elit dev - Elit dev server with HMR
  • Build Tool: esbuild (custom build script)
  • Preview: elit preview - Preview production build
  • Module System: ES Modules with importmap (Elit via CDN)
  • Deployment: GitHub Pages
  • Architecture: Single-page application (SPA) with client-side routing

Project Structure (Website)

script-db/
├── .github/
│ └── workflows/
│ └── deploy.yml # GitHub Pages deployment
├── public/
│ └── index.html # HTML template
├── src/
│ ├── main.ts # App entry point
│ ├── router.ts # Client-side router
│ ├── styles.ts # Elit CSS-in-JS styles
│ ├── components/
│ │ ├── Header.ts # Header component
│ │ └── Footer.ts # Footer component
│ └── pages/
│ ├── HomePage.ts
│ ├── InstallationPage.ts
│ ├── QuickStartPage.ts
│ ├── DocsPage.ts
│ ├── UsagePage.ts
│ ├── ScriptsPage.ts
│ └── ApiPage.ts # API documentation
├── scripts/
│ ├── install.ps1 # Windows installer
│ ├── install.sh # Unix installer
│ ├── uninstall.ps1 # Windows uninstaller
│ └── uninstall.sh # Unix uninstaller
├── elit.config.mjs # Elit configuration
├── package.json # Dependencies
└── README.md # This file

How It Works

  1. Development: npm run develit dev server with HMR
  2. Build: npm run build → Custom esbuild script (marks elit as external)
  3. Preview: npm run previewelit preview server
  4. Deployment: GitHub Actions automatically builds and deploys on push to main

Build Process

The custom build script (build.js) uses esbuild to:

  • ✅ Bundle all application code from src/main.js
  • ✅ Minify JavaScript for production
  • ✅ Mark elit as external (loaded from CDN via importmap)
  • ✅ Copy static assets (styles, scripts)
  • ✅ Generate index.html with proper paths for GitHub Pages

Why custom build? Elit's built-in elit build tries to bundle Node.js modules, so we use esbuild directly with external: ['elit'] to load Elit from CDN.

Features

  • ✨ Reactive UI with Elit 3.0.6
  • 🎨 CSS-in-JS with Elit styles (css from elit)
  • 🔄 Client-side routing (no page reloads)
  • 📦 Code bundling with esbuild
  • 📱 Responsive design
  • ⚡ Fast loading (Elit via CDN + bundled app code)
  • 🔥 HMR in development mode
  • 💅 Scoped styles, no CSS files needed

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Development Setup

# Clone the repository
git clone https://github.com/d-osc/script-db.git
# Install dependencies
npm install
# Run tests
npm test# Build packages
npm run build
# Start documentation website
npm run dev

Support

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

ScriptDB

A high-performance in-memory database with JavaScript-based querying and real-time synchronization.

Features

  • 🚀 High Performance - In-memory database with sub-millisecond query response
  • 🔌 WebSocket Support - Real-time synchronization with browser clients
  • 💾 Persistent Storage - Save databases to disk with automatic snapshots
  • 🔐 Authentication - Built-in username/password authentication
  • 🔒 HMAC Signing - Message signing for enhanced security
  • 📝 JavaScript Querying - Use JavaScript to query and manipulate data
  • 🔧 Cross-Platform - Works on Windows, Linux, and macOS
  • 🌐 Browser & Node.js - Client libraries for both environments
  • 📊 Multiple Databases - Manage multiple isolated databases
  • 🔄 Auto-Reconnect - Automatic reconnection with exponential backoff

Quick Start

Install ScriptDB Server

Windows

# Using PowerShell
irm https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.ps1 | iex

Linux/macOS

# Using curl
curl -fsSL https://raw.githubusercontent.com/d-osc/script-db/refs/heads/main/scripts/install.sh | bash

Start the Server

# Start ScriptDB server (default port: 1234)
scriptdb start
# Start with custom port
scriptdb start --port 8080
# Start in foreground
scriptdb start --foreground

Using the Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234',{secure: false// Use wss:// for production});awaitclient.connect();// Create a databaseawaitclient.createDatabase('mydb');// Insert dataawaitclient.run('db.users.insert({ name: "John", age: 30 })','mydb');// Query dataconstusers=awaitclient.run('db.users.find({ age: { $gt: 25 } })','mydb');console.log(users);

Using the Node.js Client

importScriptDBClientfrom'@scriptdb/client';// Connect to serverconstclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// List databasesconstdatabases=awaitclient.listDatabases();// Run queriesconstresult=awaitclient.run('db.users.find()','mydb');

Documentation

Visit our documentation website for complete guides and API reference.

Client Libraries

Installation

# Browser Client
npm install @scriptdb/browser-client
# Node.js Client
npm install @scriptdb/client

Monorepo Structure

This repository uses a monorepo structure with multiple packages:

scriptdb/
├── packages/
│ ├── browser-client/ # WebSocket browser client
│ ├── client/ # TCP Node.js client
│ ├── cli/ # Command-line interface
│ ├── server/ # ScriptDB server
│ ├── storage/ # Storage layer
│ └── system-modules/ # System modules
├── apps/ # Application examples
├── scripts/ # Installation & utility scripts
└── package.json # Root package configuration

Available Packages

  • @scriptdb/browser-client - Browser WebSocket client
  • @scriptdb/client - Node.js TCP client
  • @scriptdb/server - ScriptDB server
  • @scriptdb/cli - Command-line tool
  • @scriptdb/storage - Storage abstraction layer
  • @scriptdb/system-modules - System modules

CLI Usage

Starting the Server

# Start server (default port: 1234)
scriptdb start
# Start with custom options
scriptdb start --port 8080
# Start in foreground mode
scriptdb start --foreground
# Stop server
scriptdb stop
# Check server status
scriptdb status

Environment Variables

  • SCRIPTDB_PORT - Server port (default: 1234)
  • SCRIPTDB_HOST - Server host (default: 0.0.0.0)
  • SCRIPTDB_DATA_DIR - Data directory path
  • SCRIPTDB_LOG_LEVEL - Logging level (debug, info, warn, error)

Client API Examples

Browser Client

importScriptDBClientfrom'@scriptdb/browser-client';// Create client with optionsconstclient=newScriptDBClient('scriptdb://localhost:1234/mydb',{secure: false,requestTimeout: 30000,retries: 5,retryDelay: 2000,username: 'admin',password: 'secret'});// Connect to serverawaitclient.connect();// Database operationsawaitclient.createDatabase('mydb');awaitclient.saveDatabase('mydb');constdatabases=awaitclient.listDatabases();// Run JavaScript queriesconstresult=awaitclient.run(` db.users.find({  status: 'active', age: { $gt: 18 } }).sort({ name: 1 })`,'mydb');// Execute shell commands (if enabled)constoutput=awaitclient.executeShell('ls -la');// Disconnectawaitclient.disconnect();

Node.js Client

importScriptDBClientfrom'@scriptdb/client';constclient=newScriptDBClient('scriptdb://localhost:1234');awaitclient.connect();// All operations same as browser clientconstresult=awaitclient.run('db.users.find()','mydb');// Advanced: Auto-reconnect with queue managementconstclient=newScriptDBClient('scriptdb://localhost:1234',{timeout: 30000,retries: 5,retryDelay: 1000,maxPending: 100,maxQueue: 1000});

Query Examples

// Insertawaitclient.run(` db.users.insert({ name: 'John Doe', email: 'john@example.com', age: 30, status: 'active' })`,'mydb');// Findconstactive=awaitclient.run(` db.users.find({ status: 'active' })`,'mydb');// Updateawaitclient.run(` db.users.update( { name: 'John' }, { $set: { age: 31, verified: true } } )`,'mydb');// Deleteawaitclient.run(` db.users.remove({ status: 'inactive' })`,'mydb');// Aggregationconststats=awaitclient.run(` db.users.aggregate([ { $group: { _id: '$status', count: { $sum: 1 } } } ])`,'mydb');

Website Development

The documentation website is built with Elit@3.0.9 - a lightweight reactive UI framework - and deployed to GitHub Pages.

Local Development

# Install dependencies
npm install
# Start dev server (http://localhost:3000)
npm run dev
# Build for production
npm run build
# Preview production build
npm run preview

Advanced Features

Authentication

constclient=newScriptDBClient('scriptdb://localhost:1234',{username: 'admin',password: 'secret'});awaitclient.connect();// Or authenticate manuallyawaitclient.login('admin','secret');

HMAC Message Signing

constclient=newScriptDBClient('scriptdb://localhost:1234',{signing: {secret: 'your-secret-key',algorithm: 'sha256'// or 'sha384', 'sha512'}});

Token Refresh

constclient=newScriptDBClient('scriptdb://localhost:1234',{tokenRefresh: async()=>{constresponse=awaitfetch('/api/refresh-token');constdata=awaitresponse.json();return{token: data.token,expiresAt: data.expiresAt};}});

Custom Logger

constclient=newScriptDBClient('scriptdb://localhost:1234',{logger: {debug: (...args)=>console.log('[DEBUG]', ...args),info: (...args)=>console.info('[INFO]', ...args),warn: (...args)=>console.warn('[WARN]', ...args),error: (...args)=>console.error('[ERROR]', ...args)}});

Request Queue & Concurrency

constclient=newScriptDBClient('scriptdb://localhost:1234',{maxPending: 100,// Max concurrent requestsmaxQueue: 1000// Max queued requests});

Architecture

Protocol

ScriptDB uses a custom protocol over TCP (Node.js) and WebSocket (browser):

  • Connection URI: scriptdb://host:port/database
  • WebSocket Port: TCP port + 1 (e.g., if TCP is 1234, WebSocket is 1235)
  • Message Format: JSON with optional HMAC signing
  • Authentication: Username/password with token-based session

Data Model

  • In-Memory Storage: Fast access with sub-millisecond response times
  • JavaScript Queries: Use JavaScript for querying and manipulating data
  • Multiple Databases: Isolated database contexts
  • Persistent Snapshots: Save databases to disk at any time

Security

  • Authentication: Username/password with session tokens
  • HMAC Signing: Optional message signing for integrity verification
  • Secure WebSocket: Support for wss:// encrypted connections
  • Auto-Reconnect: Exponential backoff for reliable connections

Technology Stack (Documentation Website)

  • Framework: Elit 3.0.9 (Reactive UI library)
  • Styling: Elit CSS-in-JS (elit/css)
  • Development: elit dev - Elit dev server with HMR
  • Build Tool: esbuild (custom build script)
  • Preview: elit preview - Preview production build
  • Module System: ES Modules with importmap (Elit via CDN)
  • Deployment: GitHub Pages
  • Architecture: Single-page application (SPA) with client-side routing

Project Structure (Website)

script-db/
├── .github/
│ └── workflows/
│ └── deploy.yml # GitHub Pages deployment
├── public/
│ └── index.html # HTML template
├── src/
│ ├── main.ts # App entry point
│ ├── router.ts # Client-side router
│ ├── styles.ts # Elit CSS-in-JS styles
│ ├── components/
│ │ ├── Header.ts # Header component
│ │ └── Footer.ts # Footer component
│ └── pages/
│ ├── HomePage.ts
│ ├── InstallationPage.ts
│ ├── QuickStartPage.ts
│ ├── DocsPage.ts
│ ├── UsagePage.ts
│ ├── ScriptsPage.ts
│ └── ApiPage.ts # API documentation
├── scripts/
│ ├── install.ps1 # Windows installer
│ ├── install.sh # Unix installer
│ ├── uninstall.ps1 # Windows uninstaller
│ └── uninstall.sh # Unix uninstaller
├── elit.config.mjs # Elit configuration
├── package.json # Dependencies
└── README.md # This file

How It Works

  1. Development: npm run develit dev server with HMR
  2. Build: npm run build → Custom esbuild script (marks elit as external)
  3. Preview: npm run previewelit preview server
  4. Deployment: GitHub Actions automatically builds and deploys on push to main

Build Process

The custom build script (build.js) uses esbuild to:

  • ✅ Bundle all application code from src/main.js
  • ✅ Minify JavaScript for production
  • ✅ Mark elit as external (loaded from CDN via importmap)
  • ✅ Copy static assets (styles, scripts)
  • ✅ Generate index.html with proper paths for GitHub Pages

Why custom build? Elit's built-in elit build tries to bundle Node.js modules, so we use esbuild directly with external: ['elit'] to load Elit from CDN.

Features

  • ✨ Reactive UI with Elit 3.0.6
  • 🎨 CSS-in-JS with Elit styles (css from elit)
  • 🔄 Client-side routing (no page reloads)
  • 📦 Code bundling with esbuild
  • 📱 Responsive design
  • ⚡ Fast loading (Elit via CDN + bundled app code)
  • 🔥 HMR in development mode
  • 💅 Scoped styles, no CSS files needed

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Development Setup

# Clone the repository
git clone https://github.com/d-osc/script-db.git
# Install dependencies
npm install
# Run tests
npm test# Build packages
npm run build
# Start documentation website
npm run dev

Support

Releases

Packages

Contributors

Languages