CLI Tool

SpinDB

20 engines · 5 platforms · 0 dependencies

One CLI for all your local databases. Create, manage, backup, and connect to PostgreSQL, MySQL, MongoDB, Redis, and 16 more engines. No Docker required.

Up and running in seconds

Install SpinDB globally, create a database, and start working. That's it.

install
# Use without installing$ pnpx spindb# or$ npx spindb
# Install for offline use$ pnpm add -g spindb# or$ npm i -g spindb
create & connect
$ spindb create myapp --start --connectCreated PostgreSQL instance "myapp" on port 5432psql (18.1)Type "help" for help.
myapp=#

Data persists when stopped unless you explicitly run spindb delete.

Native binaries, not containers

SpinDB downloads database binaries and runs them as native processes with isolated data directories. No Docker daemon, no VM overhead.

Direct execution

Native process execution. No containers, no VMs, no daemon running in the background.

Isolated storage

Each database gets its own data directory. No version conflicts, no shared state.

Cross-platform

Same commands on macOS, Linux, and Windows. ARM and x64 supported.

data storage
~/.spindb/containers/├── postgresql/│   └── myapp/│       ├── container.json│       ├── data/│       ├── credentials/│       └── postgres.log├── mysql/└── mongodb/

20 databases, one interface

Every engine works the same way. Learn one command set, use them all.

EngineTypeFlag
PostgreSQLRelational SQL-e postgresql
MySQLRelational SQL-e mysql
MariaDBRelational SQL-e mariadb
SQLiteEmbedded SQL-e sqlite
DuckDBEmbedded OLAP-e duckdb
MongoDBDocument Store-e mongodb
FerretDBDocument Store-e ferretdb
RedisKey-Value-e redis
ValkeyKey-Value-e valkey
ClickHouseColumnar OLAP-e clickhouse
QdrantVector Search-e qdrant
MeilisearchFull-Text Search-e meilisearch
CouchDBDocument Store-e couchdb
CockroachDBDistributed SQL-e cockroachdb
SurrealDBMulti-Model-e surrealdb
QuestDBTime-Series-e questdb
TypeDBKnowledge Graph-e typedb
InfluxDBTime-Series-e influxdb
WeaviateVector Database-e weaviate
TigerBeetleFinancial Ledger-e tigerbeetle

Basic commands

Create, start, connect, query, backup, and restore. Consistent across every engine.

postgresql
$ spindb create myapp$ spindb start myapp$ spindb connect myapp$ spindb run myapp -c "SELECT version()"$ spindb run myapp ./schema.sql$ spindb backup myapp --format sql$ spindb url myapp --copy
mongodb
$ spindb create logs -e mongodb --start$ spindb run logs -c "db.users.insertOne({name: 'Alice'})"$ spindb run logs -c "db.users.find().pretty()"$ spindb connect logs$ spindb backup logs --format archive
redis
$ spindb create cache -e redis --start$ spindb run cache -c "SET mykey myvalue"$ spindb run cache -c "GET mykey"$ spindb connect cache$ spindb connect cache --iredis
any engine
$ spindb create mydb -e [engine] --start$ spindb connect mydb$ spindb backup mydb$ spindb restore mydb backup.dump$ spindb clone mydb mydb-copy$ spindb delete mydb -f

Container management

Full lifecycle control for every database instance.

create & control
$ spindb create mydb -e postgres$ spindb create mydb -e mysql --db-version 8$ spindb create mydb --start$ spindb create mydb --from backup.sql$ spindb start mydb$ spindb stop mydb$ spindb stop --all$ spindb delete mydb -f
inspect
$ spindb list$ spindb list --json$ spindb info mydb$ spindb ports$ spindb ports --running$ spindb logs mydb$ spindb logs mydb -f$ spindb logs mydb --editor

Interactive shells and queries

Native database shells, enhanced TUI clients, and structured query output.

connect
# Native shells$ spindb connect mydb$ spindb connect mydb -d analytics
# Enhanced shells$ spindb connect mydb --pgcli$ spindb connect mydb --mycli$ spindb connect mydb --litecli$ spindb connect mydb --iredis$ spindb connect mydb --dblab$ spindb connect mydb --ui
query
# Run inline commands$ spindb run mydb -c "SELECT 1"$ spindb run mydb ./schema.sql$ spindb run mydb -d analytics ./init.sql
# Structured output$ spindb query mydb "SELECT * FROM users"$ spindb query mydb "SELECT * FROM users" --json

Backup, restore, clone, and pull

Full data lifecycle management with automatic backups and remote sync.

backup & restore
$ spindb backup mydb$ spindb backup mydb --format sql$ spindb backup mydb --format custom$ spindb backup mydb -o ~/backups$ spindb backup mydb -d analytics
$ spindb restore mydb ./backup.sql$ spindb restore mydb --from-url "postgresql://user:pass@host/db"
clone & pull
# Clone locally$ spindb stop mydb$ spindb clone mydb mydb-copy$ spindb start mydb-copy
# Pull from remote (auto-backup before replace)$ spindb pull mydb --from "postgresql://user:pass@prod/db"$ spindb pull mydb --from-env PROD_DB_URL$ spindb pull mydb --from-env PROD_DB_URL --as mydb_prod$ spindb pull mydb --from-env PROD_DB_URL --dry-run

Link remote databases

Manage cloud-hosted or external databases through SpinDB. Auto-detects Neon, Supabase, PlanetScale, Upstash, Railway, Aiven, and more.

terminal
$ spindb link "postgresql://user:pass@ep-cool-123.neon.tech/mydb"$ spindb link "mongodb+srv://user:pass@cluster.mongodb.net/mydb"$ spindb link "redis://default:pass@us1-cat.upstash.io:6379"
# Custom name$ spindb link "postgresql://user:pass@host/db" production-pg
# Use linked database$ spindb connect production-pg$ spindb url production-pg$ spindb url production-pg --password

Auto-generated URLs

Every engine provides a connection string. Copy to clipboard or pipe to your app.

commands
$ spindb url mydb$ spindb url mydb --copy$ spindb url mydb -d analytics$ spindb url mydb --json
# Use in your app$ export DATABASE_URL=$(spindb url mydb)$ psql $(spindb url mydb)
EngineURL Format
PostgreSQLpostgresql://postgres@127.0.0.1:5432/mydb
MySQLmysql://root@127.0.0.1:3306/mydb
MariaDBmysql://root@127.0.0.1:3307/mydb
MongoDBmongodb://127.0.0.1:27017/mydb
Redisredis://127.0.0.1:6379/0
ClickHouseclickhouse://default@127.0.0.1:9000/default
CockroachDBpostgresql://root@127.0.0.1:26257/defaultdb
SurrealDBws://root:root@127.0.0.1:8000/test/test
QuestDBpostgresql://admin:quest@127.0.0.1:8812/qdb
SQLitesqlite:///path/to/file.sqlite
DuckDBduckdb:///path/to/file.duckdb

Manage databases within containers

Create, rename, and drop databases inside a running container. Manage users and credentials.

databases
$ spindb databases create mydb analytics$ spindb databases rename mydb old_name new_name$ spindb databases drop mydb analytics --force$ spindb databases list mydb$ spindb databases set-default mydb prod$ spindb databases refresh mydb
users
$ spindb users create mydb$ spindb users create mydb devuser$ spindb users create mydb --password p$ spindb users create mydb --copy$ spindb users create mydb --json$ spindb users list mydb

Export to Docker

SpinDB doesn't need Docker, but it can package your database as a Docker image for deployment.

terminal
$ spindb export docker mydb -o ./deploy$ cd ./deploy$ docker compose build --no-cache$ docker compose up -d
# Connect from host$ source .env$ psql "postgresql://$SPINDB_USER:$SPINDB_PASSWORD@localhost:$PORT/$DATABASE"

Generates a Dockerfile, docker-compose.yml, entrypoint script, TLS certificates, and credentials. Ready to deploy to any container platform.

Default ports

SpinDB auto-assigns ports from these ranges. Override with --port on create.

EngineDefaultRange
PostgreSQL54325432-5500
MySQL33063306-3400
MariaDB33073307-3400
MongoDB2701727017-27100
FerretDB2701727017-27100
Redis63796379-6400
Valkey63796379-6479
ClickHouse90009000-9100
Qdrant63336333-6400
Meilisearch77007700-7800
CouchDB59845984-6084
CockroachDB2625726257-26357
SurrealDB80008000-8100
QuestDB88128812-8912
TypeDB17291729-1829
InfluxDB80868086-8186
Weaviate80808080-8180
TigerBeetle30003000-3100
SQLiteN/AFile-based
DuckDBN/AFile-based

Automation & CI/CD

JSON output for every command. Pipe to jq, use in scripts, or integrate into CI pipelines.

scripting patterns
# Export connection string$ export DATABASE_URL=$(spindb url mydb)
# Backup all PostgreSQL containers$ for c in $(spindb list --json | jq -r \    '.[] | select(.engine=="postgresql") | .name'); do    spindb backup "$c" -o ./backups/  done
# Check if running$ if spindb info mydb --json | \    jq -e '.status == "running"' > /dev/null; then    echo "Container is running"  fi
CI/CD (GitHub Actions)
# .github/workflows/test.yml$ - name: Install SpinDB    run: pnpm add -g spindb
$ - name: Install database tools    run: spindb deps install --engine postgresql
$ - name: Create test database    run: spindb create testdb --start
$ - name: Run migrations    run: spindb run testdb ./schema.sql
$ - name: Run tests    run: npm test
package.json scripts
$ # Example scripts section$ "db:create": "spindb create myapp --start"$ "db:reset": "spindb delete myapp -f && spindb create myapp --start"$ "db:migrate": "spindb run myapp ./migrations/*.sql"$ "db:seed": "spindb run myapp ./seeds/dev-data.sql"$ "db:backup": "spindb backup myapp --format sql -o ./backups"

Configuration and diagnostics

Manage tool paths, run health checks, and resolve common issues.

configuration
$ spindb config show$ spindb config detect$ spindb config set psql /opt/pg/bin/psql$ spindb config unset psql$ spindb config update-check on$ spindb engines$ spindb engines download postgresql 18$ spindb deps check$ spindb deps install
troubleshooting
# Port conflict$ spindb create mydb --port 5433
# Container won't start$ spindb logs mydb
# Health check$ spindb doctor$ spindb doctor --fix$ spindb doctor --dry-run
# Reset everything$ rm -rf ~/.spindb

Get started with SpinDB

One command to install. One command to create a database. Works on macOS, Linux, and Windows.