
Security News
The Hidden Blast Radius of the Axios Compromise
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.
An awesome local database management system with nodejs. Made by Evelocore. With B-tree Operations.
npm i evelodb
const eveloDB = require('evelodb')
const db = new eveloDB();
let db
try {
db = new eveloDB({
directory: './evelodatabase', // ./evelodatabase/users.db
extension: 'db', // users.db
encryption: '<encryption_method>',
encryptionKey: '<encryption_key>',
noRepeat: false,
autoPrimaryKey: true,
encode: 'bson'
})
} catch (err) {
console.error('Init Error:', err.message);
process.exit(1);
}
| Parameter | Type | Description | Example | Default |
|---|---|---|---|---|
directory | string | Where database files are stored | './database' | './evelodatabase' |
extension | string | File extension for DB files | 'db', 'edb' | 'json' |
encode | string | Data encoding system (JSON / BSON) | 'json' 'bson' | json |
objectId | boolean | Primary key type (ObjectId / String) | true | false |
encryption | string | Encryption algorithm | 'aes-256-cbc' | null |
encryptionKey | string | Key (length varies by algorithm) | 64-char hex for AES-256 | null |
noRepeat | boolean | Reject duplicate data | true/false | false |
autoPrimaryKey | string | Auto-create unique IDs (_id) | true/false/'id' | true |
true: Auto-create unique IDs (_id) for each documentfalse: No auto-createstring: Put your own id field name (e.g., 'id', 'key')Used to filter with conditions like greater than, less than, equal, etc.
| Operator | Description | Example |
|---|---|---|
$eq | Equal | { age: { $eq: 25 } } |
$ne | Not equal | { age: { $ne: 25 } } |
$gt | Greater than | { age: { $gt: 25 } } |
$gte | Greater than or equal | { age: { $gte: 25 } } |
$lt | Less than | { age: { $lt: 25 } } |
$lte | Less than or equal | { age: { $lte: 25 } } |
$in | Matches any in an array | { status: { $in: ["active", "pending"] } } |
$nin | Not in array | { status: { $nin: ["inactive"] } } |
// Structure
db.create('collection', {
key: 'value'
})
// Example
db.create('collection', {
username: 'john',
name: {
firstname: 'John',
lastname: 'Doe'
},
email: 'example@gmail.com'
})
Output
{ success: true }
if autoPrimaryKey: true
{ success: true, _id: 'mcbdb90d-ajl393' }
if noRepeat: true and repeating data is detected
{ err: 'Duplicate data - record already exists (noRepeat enabled)', code: 'DUPLICATE_DATA' }
// Structure
db.edit('collection',
{ key: 'value' }, // find condition
{ key: 'new_value' } // new data
)
// Example
db.edit('accounts',
{ username: 'john' },
{
name: 'John Smith',
email: 'updated@gmail.com'
}
)
Output
{ success: true, modifiedCount: 1 }
if find condition not matched
{ err: 'No matching records found', code: 'NO_MATCH' }
if noRepeat: true and repeating data is detected
{ err: 'Edit would create duplicate data (noRepeat enabled)', code: 'DUPLICATE_DATA' }
// Structure
db.delete('collection', {
key: 'value'
})
// Example
db.delete('users', {
name: 'John Doe'
})
// Example with options
console.log(db.delete('users', {
age: { $lt: 18 }
}))
Output
{ success: true, deletedCount: 2 }
// Structure
const result = db.find('collection', {
key: 'value'
}).all()
// Example
const user = db.find('users', {
name: 'john',
age: { $gt: 18 }
}).all()
console.log(user)
Output
[
{
name: 'john',
age: 19,
email: 'example@gmail.com'
},
{
name: 'john',
age: 24,
email: 'example@gmail.com'
}
]
No result found
[]
// Structure
const result = db.findOne('collection', {
key: 'value'
})
// Example
const user = db.findOne('users', {
username: 'banana'
})
console.log(user)
Output
{
username: 'banana',
name: 'Test User',
email: 'example@gmail.com'
}
No result found
null
// Structure
const result = db.search('collection', {
key: 'partial_value'
}).all()
// Example
const user = db.search('users', {
name: 'Joh'
}).all()
// Example with options
const user = db.search('users', {
name: { $regex: '^joh', $options: 'i' } // Matches names starting with "joh", case-insensitive
}).getList(0, 20)
console.log(user)
Output
[
{
name: 'John Doe',
age: 25,
email: 'example@gmail.com'
}
]
// Structure
const exists = db.check('collection', {
key: 'value'
})
// Example
const exists = db.check('accounts', {
username: 'evelocore'
})
console.log(exists)
Output
true
// Structure
const count = db.count('collection')
// Example
const count = db.count('accounts')
console.log(count)
Output
{
success: true,
count: 25
}
// Structure
const result = db.get('collection').all()
// Example
const users = db.get('accounts').getList(10, 20)
console.log(users)
// Structure
db.drop('collection')
// Example
db.drop('accounts')
// Structure
const result = db.writeData('collection', data)
// Example
const users = db.writeData('accounts', [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Blue Bird' },
])
const users = db.writeData('appdata', {
name: 'EveloDB',
description: 'An awesome local DBMS with nodejs',
author: 'Evelocore'
})
// Also can maintain object using writeData() and readData()
// Structure
const result = db.readData('collection')
// Example
const appData = db.readData('appdata')
console.log(appData)
This is a wrapper that provides chainable methods for working with query results in eveloDB. It enables pagination, sorting, and other data manipulation operations on query results.
The Query Result returned by the following eveloDB methods:
when data is an array// Get first 10 users
const firstPage = db.find('users', { status: 'active' }).getList(0, 10);
// Get next 10 users (pagination)
const secondPage = db.find('users', { status: 'active' }).getList(10, 10);
// Get 5 users starting from index 20
const customPage = db.find('users', { status: 'active' }).getList(20, 5);
// Get total count of active users
const totalActiveUsers = db.find('users', { status: 'active' }).count();
// Get count of search results
const searchCount = db.search('products', { name: 'phone' }).count();
// Use for pagination info
const results = db.find('orders', { status: 'pending' });
const total = results.count();
const currentPage = results.getList(0, 20);
console.log(`Showing ${currentPage.length} of ${total} results`);
// Sort by name (ascending)
const sortedByName = db.find('users', { status: 'active' })
.sort((a, b) => a.name.localeCompare(b.name))
// Sort by age (descending)
const sortedByAge = db.find('users', { status: 'active' })
.sort((a, b) => b.age - a.age)
.getList(0, 20);
// Sort by date (newest first)
const sortedByDate = db.find('posts', { published: true })
.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt))
.getList(0, 10);
One of the key features of QueryResult is method chaining, allowing you to combine operations:
const db = new eveloDB();
// Chain multiple operations
const result = db.find('products', { category: 'electronics' })
.sort((a, b) => b.price - a.price) // Sort by price (high to low)
.getList(10, 5); // Get items 11-15
// Complex chaining example
const topExpensiveProducts = db.search('products', { name: 'laptop' })
.sort((a, b) => b.price - a.price) // Sort by price descending
.getList(0, 3); // Get top 3 most expensive
// Get count after sorting (count remains the same)
const sortedResults = db.find('users', { role: 'admin' })
.sort((a, b) => a.name.localeCompare(b.name));
const totalCount = sortedResults.count(); // Total admins
const firstPage = sortedResults.getList(0, 10); // First 10 sorted admins
EveloDB integrates with Google's Generative AI to provide intelligent analysis of your collections.
| Parameter | Type | Required | Description |
|---|---|---|---|
collection | string | No* | Collection name to analyze (*required if data not provided) |
filter | object | No | Filter with comparison operators to apply before analysis |
data | array | No* | Direct data input (*required if collection not provided) |
model | string | Yes | Gemini model to use (e.g., "gemini-pro", "gemini-2.5-flash") |
apiKey | string | Yes | Your Google Generative AI API key |
query | string | Yes | Natural language query for analysis (max 1024 chars) |
const res = await db.analyse({
collection: 'users',
filter: { age: { $gt: 18 } },
//data: data,
model: 'gemini-2.5-flash',
apiKey: 'GEMINI_API_KEY',
query: 'Find users with potentially offensive bios'
})
console.log(res)
Response:
{
success: true,
response: {
indexes: [ 1, 2, 4 ],
reason: "The selected users have bios containing explicit profanity ('F****!'), vulgar expressions ('B****!'), or derogatory/insulting remarks ('This game is trash ****!'), which are all considered potentially offensive.",
message: 'Offensive content was identified by the presence of strong expletives, common vulgarisms, or direct negative attacks/insults aimed at others or products.',
data: [ [Object], [Object], [Object] ]
}
}
Binary Serialized Object Notation with EveloDB
const eveloDB = require('evelodb')
let db
try {
db = new eveloDB({
directory: './evelodatabase',
extension: 'db', // default 'bson'
encode: 'bson',
})
} catch (err) {
console.error('Init Error:', err.message);
process.exit(1);
}
encode: 'bson' for BSON encodingencode: 'json' for JSON encoding (default)EveloDB is a lightweight file storage system for handling any type of file directly in your local storage.
db.writeFile('image.jpg', imageBuffer)
{ success: true }
db.readFile('image.jpg')
{
success: true,
data: <Buffer ff d8 ff e0 00 10 ...>
}
db.deleteFile('profile.pdf')
{ success: true }
EveloDB includes built-in utilities to read and process images with ease.
| Parameter | Type | Default | Description |
|---|---|---|---|
returnBase64 | Boolean | true | If true, returns a Base64 Data URL. Otherwise returns a Buffer. |
quality | Number | 1 | Output quality (0.1 β 1). Lower values reduce size. |
pixels | Number | 0 | Maximum total pixels. 0 = keep original size. Useful for scaling down large images. |
maxWidth | Number | null | Maximum width in pixels. |
maxHeight | Number | null | Maximum height in pixels. |
blackAndWhite | Boolean | false | Converts the image to grayscale. |
mirror | Boolean | false | Flips the image horizontally. |
upToDown | Boolean | false | Flips the image vertically. |
invert | Boolean | false | Inverts image colors. |
brightness | Number | 1 | Brightness multiplier (0.1 β 5). 1 = original. |
contrast | Number | 1 | Contrast multiplier (0.1 β 5). 1 = original. |
(async () => {
const result = await db.readImage("image.jpg", {
returnBase64: true,
quality: 0.8,
pixels: 500000,
blackAndWhite: false,
mirror: false,
upToDown: false,
invert: false,
brightness: 1,
contrast: 1
});
console.log(result)
})()
{
success: true,
data: "data:image/jpeg;base64,/9j/4AAQSk...",
metadata: {
filename: "image.jpg",
extension: ".jpg",
originalSize: 254399,
processingApplied: {
resized: true,
qualityReduced: true,
blackAndWhite: true,
mirrored: true,
flippedVertical: false,
inverted: false,
brightnessAdjusted: true,
contrastAdjusted: true
}
}
}
const eveloDB = require('evelodb')
let db
try {
db = new eveloDB({
directory: './evelodatabase',
extension: 'db',
encryption: '<encryption_method>',
encryptionKey: '<encryption_key>',
})
} catch (err) {
console.error('Init Error:', err.message);
process.exit(1);
}
aes-128-cbc (16 bytes) - 32 hex charactersaes-192-cbc (24 bytes) - 48 hex charactersaes-256-cbc (32 bytes) - 64 hex charactersaes-128-gcm (16 bytes) - 32 hex charactersaes-256-gcm (32 bytes) - 64 hex charactersconst eveloDB = require('evelodb')
let db
try {
db = new eveloDB({
extension: 'db',
encryption: 'aes-256-cbc',
encryptionKey: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef' // 64 hex characters
})
} catch (err) {
console.error('Init Error:', err.message);
process.exit(1);
}
Using EveloDB inbuild method
const length = 32 // 32, 48, 64
const key = db.generateKey(length)
console.log(key)
Using Crypto JS
const crypto = require('crypto');
const key = crypto.randomBytes(16).toString('hex'); // 32 hex chars
console.log(key);
changeConfig() method. It can change your current db config to new config and continue normally after initialize again with new config .aes-256-cbc encrypted .json database from './evelodatabase' to aes-128-cbc and .db with new key and './database' directory.const res = db.changeConfig({
from: {
directory: './evelodatabase',
extension: 'json',
encryption: 'aes-256-cbc',
encryptionKey: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'
},
to: {
directory: './database',
extension: 'db',
encryption: 'aes-128-cbc',
encryptionKey: '0123456789abcdef0123456789abcdef' // 32 hex characters
},
collections: ['users', 'accounts'] // if not set collections, convert all collections
})
console.log(res)
// { success: true, converted: 2, failed: 0 }
// Initialize again
try {
db = new eveloDB({
directory: './database',
extension: 'db',
encryption: 'aes-128-cbc',
encryptionKey: '0123456789abcdef0123456789abcdef'
});
} catch (err) {
console.error('Re-init Error:', err.message);
}
If you remove encryption and encryptionKey parameters in to object, it will remove the encryptions in your database and continue with json string.
const res = db.changeConfig({
from: {
encryption: 'aes-256-cbc',
encryptionKey: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'
},
to: {}
})
π Note: EveloDB Server is currently under development and not officially released.
EveloDB Server is a lightweight, powerful, and flexible server built on top of the local BSON-based DBMS eveloDB. It provides an all-in-one solution to manage local databases with a user-friendly UI and secure backend system.
π¦ Standalone Application
π₯οΈ Modern UI Interface
ποΈ Customizable Database Properties
name, username, key, colour, and icon.π Secure Login System
π₯ User Management
βοΈ Code & Template Editor
π CORS Origin Control
π€π₯ Import/Export Collections
π§© eveloDB Integration
eveloDB and accessible via evelodb-global npm package.Follow us for updates, announcements, and support:
Copyright 2025 Β© Evelocore - All rights reserved
Developed by K.Prabhasha
FAQs
An awesome local database management system with nodejs. Made by Evelocore. With B-tree Operations.
The npm package evelodb receives a total of 4 weekly downloads. As such, evelodb popularity was classified as not popular.
We found that evelodb demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.Β It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the projectβs GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.