dubyDB is a self-hosted database workspace for teams that need flexible records, files, saved views, analytics, backups, and API access without building a custom backoffice from scratch.
dubyDB sits in the space between fragile spreadsheets, overly loose documentation tools, and expensive one-off internal tools. It gives you dynamic schemas, attachments, grouped filters, analytics, audit traces, backups, and API keys in one portable product built on SQLite.
Current version: 0.0.3
dubyDB is designed for people who need structure and flexibility at the same time:
- Researchers managing datasets, references, sources, and attached material.
- Operations teams tracking records, statuses, files, and recent activity.
- Archives and collections teams organizing visual assets and metadata.
- Small businesses that need a lightweight CRM, inventory, or project workspace.
- Builders who want a real data product they can self-host and extend through an API.
- Portable by default. Data lives in SQLite plus local files, so backup and restore stay simple.
- More structured than documents. Dynamic properties, views, grouping, relations, and rollups make the data usable.
- Faster than building your own tool. You get records, files, API keys, backups, analytics, and audit history out of the box.
- More ownership than hosted tools. Self-hosting, explicit backups, and local data storage reduce lock-in.
- Built for real workflows. Files, metadata, saved views, and recent activity live in the same product instead of separate tools.
| If you are comparing against... | dubyDB gives you... |
|---|---|
| Spreadsheets | Relations, attachments, saved views, grouped filters, analytics, and better structure for mixed data. |
| Generic note/database apps | A portable self-hosted stack, local ownership of files, explicit backups, and API-level control. |
| Custom internal tools | A working product now, with enough flexibility to model your workflow before writing custom software. |
The short demo above cycles through the main workspace, a database view, and global settings.
| Workspace | Database view | Settings and API |
|---|---|---|
![]() |
![]() |
![]() |
- Photo archive: manage images, authors, albums, capture dates, tags, and file attachments.
- Bibliography: track papers, reading status, DOI/URL, topics, notes, and PDFs.
- Inventory: organize items by category, quantity, location, evidence files, and updates.
- Simple CRM: store contacts, stage, estimated value, next step, notes, and supporting files.
- Project workspace: manage tasks, status, ownership, due dates, labels, and recent activity.
- Research dataset: structure samples, sources, dates, null checks, relations, and exports.
- Dynamic database creation with custom properties.
- Database templates for photo archives, bibliography, inventory, CRM, projects, and research datasets.
- Table, gallery, and analytics views over the same dataset.
- Persistent advanced filters with grouped
AND/OR, date ranges, empty/non-empty checks, relation-aware filtering, multi-sort, and grouping. - File attachments with drag and drop, upload feedback, file-type previews, and recent attachment browsing.
- View favorites, saved view configuration, and per-view column order.
- Basic audit history for records and recent activity at the database level.
- API keys with scopes, optional expiry, and usage traces.
- Database export/restore plus full portfolio backup/restore.
- CSV import for creating new databases from tabular data.
flowchart LR
Browser["Browser UI"] --> App["Node.js + Express app"]
External["External integrations"] -->|API keys| App
App --> SQLite["SQLite database"]
App --> Files["Local file storage<br/>attachments + backups"]
App --> Exports["JSON/ZIP export and restore"]
Simple stack:
- Frontend: vanilla HTML, CSS, and JavaScript.
- Backend: Node.js + Express.
- Persistence: SQLite for schemas, records, views, API keys, audit log, and settings.
- Files: local filesystem for uploads and backup artifacts.
- Testing: Node integration tests covering critical API and data flows.
Run from the project root:
docker compose up -d --buildOpen:
http://localhost:7192
Stop:
docker compose downBuild from app/:
cd app
docker build -t dubydb-app .Run from the project root:
docker run --rm -p 7192:7192 -e DATA_DIR=/data -v "$(pwd)/data:/data" dubydb-appcd app
npm install
npm startThen open:
http://localhost:7192
- With Docker Compose:
./data - In local mode:
app/data
This directory stores the SQLite database, attachments, backup snapshots, and restore temp files.
dubyDB can be used from external tools through API keys created in the app settings.
API key features:
- Optional expiry
- Coarse scopes:
read,write,analytics,settings,backup,* - Usage traces (
lastUsedAt, usage count, active/expired state)
Useful routes:
GET /api/databases/resolve/:codeGET /api/databases/:idGET /api/databases/:id/recordsPOST /api/databases/:id/recordsPOST /api/databases/:id/propertiesPOST /api/databases/:id/analysisGET /api/databases/:id/exportPOST /api/records/:recordId/attachments/:propertyIdGET /api/records/:id/activityGET /api/databases/:id/activity
Auth headers:
x-api-key: duby_xxxAuthorization: Bearer duby_xxx
Attachment uploads use multipart/form-data and the files field name.
Run the test suite from app/:
cd app
npm testCurrent automated coverage includes:
- relations and rollups
- templates, grouped filters, analytics, and multi-attachment uploads
- API key scopes and expiry
- validation for URL/date/time fields
- database export/restore and full portfolio restore
If better-sqlite3 was compiled for a different Node runtime, rebuild it first:
cd app
npm rebuild better-sqlite3It is self-hosted. You run it with Docker or directly with Node.js.
Records, schemas, saved views, settings, API keys, and audit data are stored in SQLite. Attachments and backup artifacts live on the local filesystem.
Yes. The app supports CSV import, per-database export/restore, and full portfolio backup/restore.
Yes. Files, dynamic properties, relations, rollups, saved views, and analytics are part of the same app.
Yes. API keys can be scoped, expired, revoked, and traced at a basic level.
Yes. The backend stores a basic activity log for records, attachments, schema changes, backup/restore actions, and API key lifecycle events.
It is built for real self-hosted workflows and already includes tests, backups, validation, and release notes. Browser-based UI smoke testing is still on the roadmap.
Use the Danger Zone inside the app settings and choose Delete all data.
Near-term priorities:
- browser-based smoke tests for critical UI flows
- richer migration helpers and rollback-friendly dry runs
- more filtering for database-level activity
- narrower API scopes where needed
- stronger release discipline and signed release flow
See the full roadmap in ROADMAP.md.
- Release notes: CHANGELOG.md
- Roadmap: ROADMAP.md
- License: LICENSE
- Make sure the app is running.
- If you use Docker Compose, run
docker compose ps. - If you use local mode, check the server terminal for startup errors.
Stop the conflicting process or change the exposed port.
Rebuild the native SQLite dependency:
cd app
npm rebuild better-sqlite3


