new v0.3 · Agents. Let Claude Code and your org’s workers query your databases — read only, on your login, every call listed. release notes ↗
codelions v0.3.0 · betaChangelogGitHubDownload

[ overdb ] · a database client for environments

You don't have a database.
You have environments.

The same schema lives in local, staging and prod, and the interesting questions are comparisons across them. overdb makes that comparison the main gesture — and lets you branch your data like code.

Postgres · MySQL · SQLite · DynamoDB · ask in plain English

[ the basics ] · everything you'd expect

A full database client. Ask it in plain English, too.

Environments and branches are the reason to switch — but the everyday client comes first: an editor, a grid, your history, and answers in prose when you don't want to write the SQL.

query

  • SQL editor with tabs, and a fast virtualized results grid
  • Ask in plain English — the SQL lands in the editor, nothing runs on its own
  • Schema questions, and Plan and explain for any query
  • Paste straight from an ORM log: ?, :name and #{name} placeholders

explore

  • History of every statement, and saved queries
  • Every table’s size, with the table lists sorted by it
  • Charts from any result — line, bar, area, scatter
  • ER diagram from real constraints, exported to SVG or PNG
  • Live health and slow queries, from the server itself

connect

  • Postgres, MySQL, SQLite, DynamoDB — and Redshift, Aurora, CockroachDB, TimescaleDB, MariaDB
  • Import from DataGrip, IntelliJ, DBeaver and ~/.pgpass
  • SSH tunnels and TLS
  • Read-only by default; auto-commit or manual transactions

[ one gesture ] · fan out, compare, act

Run it once. See every environment, and what's drifted.

Every member of an environment set answers on its own — a failure on one never aborts the rest — and each answer is compared with the baseline.

local1,242 rows
stagingdrift · 1 breaking
prod · baseline922,308 rows

[ schema drift ]

Drift ranked by how much it matters.

Compare every member against its baseline, catalog to catalog, without running a statement. Findings are sorted into Breaks, Integrity, Behaviour, Performance and Cosmetic, plus what only one side has — a missing column and a differently-spelled varchar are not the same news.

orders-db · Schema drift against prod (BASE)1BreaksQueries or inserts written for prod fail on staging.2Performancestaging lacks indexes. Slower queries, no data risk.3CosmeticSpelling and position. Changes nothing.Proposed SQL comes back as text — nothing destructive to run

[ branches ]

Branch your data like you branch your code.

Copy a database to this machine as a small base, then branch it — a writable clone per experiment, made in seconds on macOS. Seed it with exactly the data you need, break it, reset it. Nothing you do in a branch touches the server.

BRANCHES · 2 · under orders-db
01Create a baseStart from → Sort tables → Build · only the tenants and logins you pick
02Branch it — pricing-experimentyour own writable copy — instant on macOS, a full copy elsewhere
03Seed it for what you're testingplan in words → INSERTs only → read back → commit
04Reset to base when you're donesame name, port and connection — fresh data

[ the proxy ] · one connection, any branch

Switch the data. Your services don't change a thing.

Point each service at the proxy once. From then on, which data it sees is a click in the title bar — your own server or any branch. The proxy forwards byte for byte, closes its connections on a switch, and every service's pool reconnects to the new one. After that first time, no .env edits and no restarts — a switch drops open connections, and each pool reconnects.

  • ⌥⌘1–9 picks a branch · ⌥⌘0 sends everything back
  • Moves your services only — never what a tab is querying
  • Loopback only, one proxy per base, and refused for production
  • On macOS, can keep running in the background when overdb is closed

[ agents ] · read only, on your login

Let your agents ask the database.

Register overdb once with Claude Code or any MCP client, and an agent can list your connections, read the schema and run the reads it needs — told what overdb already knows: the tenancy rule, your notes and the map of your code. Then ask in prose: “why is shop-prod slow right now?”

Read-only isn’t harmless: a read can still be expensive. Turn agents on for a connection whose database user has only the rights you’d give the agent.

Agentsread onlyWhat agents are toldREGISTER IT ONCEclaude mcp add --scope user overdb -- …/Overdb serve --mcpCopyCONNECTED NOWClaude Code · this MacCONNECTIONSpgshop-local · localpgshop-staging · stagingpgshop-prod · prodname typed
WHAT AGENTS ARE TOLD · shopEvery query filters on client_id — except countries and plans, which every client shares. Leave out client 2 unless asked: it’s a test account. Amounts are in cents.+ the database map’s slice for each question, with path:lineEACH CALL AGENTS MADE · never the rowsdescribe_databaseshop-stagingorders: what “paid” meansok · 40 msqueryshop-stagingselect client_id, count(*) from orders where …ok · 12 rows · 84 mslist_slow_queriesshop-prod—ok · 3 foundqueryshop-produpdate orders set status = …refused · read only
opt in

Nothing is exposed until you turn on a connection’s Agents chip, beside Writes — a prod connection asks you to type its name. A connection that isn’t on doesn’t exist, as far as an agent can tell.

read only

Every session opens in the engine’s read-only mode whatever Writes says, and writes, DDL and batches are refused before they’re sent. 100 rows by default, 1,000 at most, a 30-second timeout.

your login

Passwords, 1Password, IAM and SSH tunnels resolve inside overdb, as when you connect. The agent sees a connection’s name, never a secret.

on a server

The same read-only tools run without the app for hosted agents. Publish to your org’s server… hands a connection — no password — to overgo, where workers query it and every query is logged. See it on overgo →

[ plans ]

The query as a river.

Rows are the water: the stream narrows where the server throws rows away and flares where a nested loop turns one row into thousands. Those two events are why a query is slow — and in a plan table they are invisible.

The work this query does912,447−908,797fail the WHERE — 0.4% survive3,650 × 4 each14,600−14,550rows go no further50select912,447 rowsresult50 · 212 msorderso · ALLreads 912,447Using whereorder_itemsi · via order_id4 × 3,650 runs = 14,600sortUsing filesortsorts 14,600

The stream is the rows. It necks down where the WHERE clause throws them away — those are the flecks falling out of it — and flares where a loop reads many rows for each one arriving. A ≈ marks a count the server estimated rather than measured. Thickness is on a square-root scale; the numbers on the labels are exact.

WORTH LOOKING AT
orders is read in full to keep 50 rows.
Plans across environments: “prod reads all of orders, where staging narrows it with an index.”

[ safety ]

Read-only until you mean it.

Writes are turned on per connection. On prod you type its name first, because the accident worth preventing is doing the right thing to the wrong server.

orders-db · prodPRODUCTIONTurn on writes for this connection? Type its name to confirm.orders-db-prod▍manual transactions roll back after 90 s idle

[ latest ] · from the changelog

Latest release:
v0.3.0, Oct 28.

full changelog →

[ download ] · grab a build

Signed, notarized, and real.

Overdb is in beta, and from v0.1.1 it updates itself from GitHub Releases, so this is the last download you do by hand. The macOS builds are Developer-ID signed and notarized by Apple, with the same Developer ID as overcli and overgit, so they open on a double-click. Windows isn't code-signed yet, so SmartScreen may still flag it. The source is right there if you'd rather build it yourself.

Stable macOS builds open clean — signed with a Developer ID and notarized by Apple, so there's no Gatekeeper prompt. Windows isn't code-signed yet: SmartScreen may say “unrecognized app” → More info → Run anyway. Bases and branches need a local MySQL, MariaDB or Postgres server, which overdb can install with Homebrew, and database maps need the claude CLI.

[ faq ]

Questions people ask.

Is it ready to use?

It's v0.3.0 and in beta: an early public build, so expect rough edges and tell us about them in the issues. Everything on this page is in it, and bases, branches and the background proxy are built for macOS first. Because every connection you add starts read-only, the safest way to try it is exactly how it starts.

What does it cost?

Nothing. Like overcli and overgit, it's Apache 2.0, with no account, no server, and no paid tier. The AI features use a CLI you already have and are already logged in to.

Can it write to prod by accident?

Every connection you add starts read-only; the only ones overdb opens with writes on are the local branches it makes for you. Postgres uses BEGIN READ ONLY, MySQL uses START TRANSACTION READ ONLY, and SQLite opens with its readOnly flag. DynamoDB has no server-side read-only mode, so overdb fails closed on statements it cannot classify; use a read-only IAM policy as the durable boundary. Turning writes on for a prod connection means typing that connection's name. Seeds run only on a connection that is tagged local, has writes on and is really on this machine, and bases, copies and proxies are refused for production and untagged servers. None of those has an override.

Does the AI see our data?

Overdb does not intentionally add result rows or bound parameter values to prompts. Depending on the feature, a prompt can include your question, schema metadata, SQL text, server errors, and plan statistics, so literals or database errors may still contain sensitive values. A ticket you paste into Seed goes too. When you link a repo, the claude CLI reads your code for seeds, bases and database maps with Read, Grep and Glob only — no shell, no MCP servers, and .env and key files denied. The prompt goes to the claude, codex, or gemini CLI already on your machine, and proposed SQL goes into the editor without running. Agents are different, and opt-in: turn on Agents for a connection and an agent you connect can run read-only queries on it and sees what they return — 100 rows by default, 1,000 at most. The Agents sheet lists every call it made.

Which engines are supported?

Ten: PostgreSQL, Amazon Redshift, Aurora PostgreSQL, CockroachDB, and TimescaleDB; MySQL, MariaDB, and Aurora MySQL; SQLite; and Amazon DynamoDB. They run on four drivers, and overdb detects which server it's connected to so it can handle the places they differ, like Redshift having no indexes or MariaDB's performance views. SQL Server, Oracle, and document stores like MongoDB aren't supported.

Where are passwords stored?

In the operating system's encrypted storage, in a separate file from the rest of the app's state. You can also use an environment variable, or a 1Password op:// reference that's resolved when you connect, so the secret is never saved in overdb at all.

[ family ] · over your tools, not instead of them

codelions →