M
MVP DB
Product Docs

Standard Postgres,
explicit tradeoffs.

MVP DB is designed to feel fast and simple for makers, but the docs should still answer the questions you ask when a side project starts becoming a real product. This page documents what exists today, what is self-serve, and what is not yet in the product.

Current scope

Engine

PostgreSQL 17

Restore model

Dashboard-triggered clean-slate restore

Visibility

Storage, schema, backups. Not query analytics.

Access model

Normal PostgreSQL drivers. No proprietary database SDK.

What Exists Today

Capabilities you can rely on.

Available today

Self-serve backups

The dashboard lists daily backups, generates download links, and lets you queue a clean-slate restore yourself. Starter and Builder keep 7 days. Pro keeps 30 days.

Available today

Live storage usage

You can see storage for the current database plus the shared subscription footprint, including how much each database is using inside that subscription.

Available today

Schema visibility

The dashboard exposes a read-only schema browser with tables, columns, indexes, and a downloadable SQL snapshot of your current schema.

Available today

Standard PostgreSQL clients

MVP DB does not require a proprietary database SDK. Use pg, Prisma, Drizzle, Npgsql, Dapper, EF Core, psycopg, psql, or your normal SQL tooling.

Quick Start

From signup to app connection.

  1. 1.

    Provision a database

    Create a database from the dashboard and label it by project or environment.

  2. 2.

    Copy the connection string

    Use the dashboard connection card to copy the full DATABASE_URL.

  3. 3.

    Store it as a secret

    Add it to your app platform's environment-variable or secret-store settings, not to source control.

  4. 4.

    Connect with standard tooling

    Use your normal Postgres driver, ORM, migration framework, and admin client.

~ / bootstrap
# Local shell
$ export DATABASE_URL="postgresql://user:pass@db.mvp-db.com:5432/myapp"
# Connect with psql
$ psql "$DATABASE_URL"
# Run migrations with your normal tooling
$ npx prisma migrate deploy
$ dotnet ef database update
Restore Workflow

Self-serve restore, clearly scoped.

MVP DB supports dashboard-triggered restore from retained daily backups. This is a replace-the-current-data workflow, not point-in-time recovery.

01

Open Backups

In the database detail view, open the Backups tab to see retained daily backups for that database.

02

Download or restore

You can download a backup directly or trigger Restore from a specific retained backup.

03

Restore queues asynchronously

The restore request is queued and processed by the control plane. You do not have to open a support ticket for the standard restore path.

04

Connections are replaced cleanly

Active connections are terminated, current data is replaced with the selected backup, and the database comes back on the same connection endpoint.

Important boundaries

  • - Restoring replaces the current contents of that database.
  • - Active connections are terminated during restore.
  • - Backup retention is 7 days on Starter and Builder, and 30 days on Pro.
  • - If you need independent long-term retention or finer recovery granularity, keep your own exports too.
Operational Visibility

What you can see, and what is not there yet.

In product now

  • + Connection string copy and reveal in the dashboard
  • + Per-database storage usage
  • + Subscription-wide storage breakdown across databases
  • + Schema browser with downloadable SQL
  • + Backup history, download links, and restore actions

Not yet exposed in the dashboard

  • - Slow query tracing and query plans
  • - Connection saturation charts and pool pressure graphs
  • - Latency dashboards or per-query timing history
  • - Custom alert rules and notification routing

That distinction matters if you are evaluating MVP DB as a low-friction PostgreSQL host rather than as a full observability platform.

Migration Playbooks

Start simple. Cut over carefully.

The direct pipe works well for small apps. For anything important, rehearse on staging first and use a deliberate cutover.

~ / small-app-migration
# Fast path for small apps and low-risk moves
$ pg_dump --no-owner --no-privileges "$OLD_DB" | psql "$MVP_DB_URL"
COPY ...
ALTER TABLE ...
Migration complete

Safer production cutover

  1. 1. Freeze writes or place the app into maintenance mode.
  2. 2. pg_dump --format=custom --no-owner --no-privileges "$OLD_DB" > app.dump
  3. 3. pg_restore --clean --if-exists --no-owner --no-privileges --dbname="$MVP_DB_URL" app.dump
  4. 4. Run smoke tests, then switch the app's DATABASE_URL and redeploy.

Test this against staging first. The --clean path intentionally replaces objects in the target database.

Environment Patterns

Treat environments as separate databases.

Development

dev

Use a disposable database for local work and experimental migrations. Label it clearly in the dashboard so it never gets confused with customer data.

Staging

staging

Mirror schema changes, test restores, and rehearse cutovers here first. This is the right place to validate pg_restore behavior before touching production.

Production

prod

Keep production isolated from test traffic. If you want separate billing or storage envelopes, use a separate subscription instead of sharing one big bucket.

Secrets hygiene

  • - Store DATABASE_URL in your platform secret store or environment configuration.
  • - Never commit live connection strings to Git, screenshots, client-side code, or shared docs.
  • - Use different credentials for dev, staging, and production by using different databases.
.env.production
DATABASE_URL=postgresql://user:pass@db.mvp-db.com:5432/app_prod
SHADOW_DATABASE_URL=postgresql://user:pass@db.mvp-db.com:5432/app_staging
# Inject through your deploy platform, not through source control.
Driver Examples

Use your normal PostgreSQL driver.

MVP DB is standard PostgreSQL. Use any client or ORM that speaks Postgres.

JavaScript - node-postgres (pg)
# Install
$ npm install pg
// Connection pool
const { Pool } = require('pg');
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
max: 10,
idleTimeoutMillis: 30000,
});
// Run a query
const { rows } = await pool.query('SELECT * FROM users');

Support

Need help validating a migration or understanding a restore outcome? Reach out at admin@rashtan-soft.com.

Create Database - $3/mo