FeatherDB macOS 15+ · Apple Silicon & Intel
Native macOS client · PostgreSQL · MySQL · MariaDB

Give your AI a sandbox, not your production database.

Your AI works on a masked local copy; live stays read-only, enforced by the server.

Version 1.14.0 · 73 MB · signed & notarized · 14-day trial, no account, no telemetry.

Prefer Homebrew?
$ brew install --cask featherdb-app/tap/featherdb
FeatherDB's data grid browsing a live customers table
The data grid on a live connection — real screenshot, seeded demo data.

Enforcement

Live is read-only by construction.

A write to a live database is refused before anything executes.

Every statement an AI sends to a live database is read-only on the server's terms. A write is not talked out of it — the database server refuses it, and the AI gets a message to relay to you. The capability is decided by what kind of database it is, never by how the request was worded. And on a sandbox, where writes are the point, every statement an AI proposes still stops at an in-app approval — you read it, you click, then it runs.

Staged conversation — but the refusal is the gateway's actual message, byte for byte.

  • read-only on the server
  • enforced by the server
  • refused, never cleaned up after

Marks

Hand the AI exactly the schema you mean.

A mark is a named scope — a table plus the related tables you picked — with an id you can say in any chat.

Save a selection as mark-7f3 in FeatherDB, then just say that id to your AI: through the gateway it pulls the same DDL and PII-masked sample rows you previewed — exactly as you saw them, with a picture of how the tables connect. featherdb:// links open the mark straight back in the app, and the AI can open it for you on request.

The map is not limited to declared foreign keys: schemas that never declare any — document stores, FK-less apps — get their joins inferred from naming, drawn dashed and labelled as guesses. One click confirms or corrects a guess, and your verdict is what the AI is taught from then on.

FeatherDB's relationship map one hop around a products table: link table marked, cascade deletes in red, multiplicity on every line
Real screenshot: one hop around products — the link table marked, cascade deletes in red.
  • named schema scopes
  • masked sample rows
  • inferred joins, your verdict
  • featherdb:// deeplink

Sandboxes

The real schema, minus the people.

One click proposes a local clone that matches your server’s version — created only when you approve it.

Emails, names and phone numbers are replaced before they land — fail-closed, so a column FeatherDB cannot vouch for is not copied at all. FeatherDB reads what your production runs — PostgreSQL 16, MySQL 8.4, MariaDB 11.4, whatever it really is — and proposes a matching Docker container on your Mac; nothing exists until you approve it, and discarding the sandbox deletes it. The AI gets full read and write there, the mask report shows exactly what happened to every column, and anything the agent breaks costs nothing. No Docker? Postgres still clones instantly with the built-in engine.

Everything the AI runs there is journaled — statement, time, which AI — so a forty-step coding session always has an answer to "what did it change?". Sandboxes survive quitting the app, and a per-connection switch (off by default) lets your AI start its own sandbox so a coding session never waits on a click.

A running FeatherDB sandbox — PostgreSQL 16 in Docker, matching the production server — with its PII mask report: email, name and phone masked
Real screenshot: a version-true Docker sandbox cloned from a live database, with its PII mask report.
  • matches your server’s version, in Docker
  • PostgreSQL · MySQL · MariaDB
  • PII masked before copy
  • fail-closed
  • created on your consent · disposable
  • AI work journaled
  • survives restarts

Staging

Your dev build gets the sandbox too.

Point a work-in-progress build at a masked, production-shaped database on your Mac — real requests, real data shapes, nobody real in it, production never touched.

A sandbox is already a masked clone at your server's version. Now your own backend can use it: on a connection you reach over SSH, one click opens a path from that server back to the sandbox and hands you the address your deployment should use there. Run v1.2 against it while v1.1 keeps serving production — a webhook fires, an order is written, and it lands in the sandbox, not in front of a customer. The Sandbox tab shows which build is attached to which database, and a live feed of every statement the sandbox runs — your backend's, yours, your AI's — each with how long it took and, when your framework annotates its queries, the request that caused it. Payments still charge for real, so use your test keys; the database is the part that is safely fake.

FeatherDB's Sandbox tab showing the Staging section: a backend named 'shopio 1.2' attached to the sandbox, and a live feed of the statements it just ran with their durations and request routes
Real screenshot: a dev backend attached to the local sandbox, its statements streaming into the live feed.
  • masked, production-shaped data
  • your build reaches it over SSH
  • production never touched
  • see which build is on which database
  • a live feed of every statement
  • use test keys for payments

Proposals

The AI proposes. You confirm once.

A change the AI wants on your live database arrives as a proposal — with its reason, its plan and one button — never as a write.

Your AI rehearses on the sandbox, then calls propose_change: either the SQL it wants run, or "promote the sandbox", where FeatherDB shows you the migration plan from sandbox to live, computed fresh when you open it. A rationale is mandatory — a proposal without a why is refused at the door. The Proposals tab shows the reason, the SQL or the graded plan, and a snapshot toggle that is on by default; dangerous steps wait for your acknowledgement. Confirm applies it; reject sends your reason back to the AI verbatim. Every decision is on the record, and the AI only ever polls the outcome. Whatever your AI files — a change, a question to run, a snapshot, a connection — gathers under "waiting for you" at the foot of the sidebar, from every database at once; the Dock icon shows how many, and macOS tells you when a new one arrives while FeatherDB is in the background.

FeatherDB's Proposals tab: a 'promote the sandbox to live' proposal from claude with its rationale, three graded plan steps (one DANGER), a snapshot-first toggle and a Confirm button that waits for the acknowledgement
Real screenshot: a proposal the AI filed after rehearsing on the sandbox — nothing has run.
  • rationale required
  • SQL or promote-the-sandbox
  • snapshot first, by default
  • reject with a reason the AI reads
  • on the record
  • one list of what waits

Undo

Break it, take it back.

A whole-database snapshot before anything risky — restore it with one deliberate click.

Applying a migration snapshots first, on by default — and if the snapshot fails, the migration does not run. Running a write in the SQL editor offers the same line. Every snapshot carries the reason it was taken; restoring names exactly what will be lost, asks you to type the database's name, and snapshots once more right before — so even the undo can be undone. On MySQL and MariaDB this is the only undo that exists for schema changes: no transaction there can roll back a DROP TABLE. Your AI can request an undo point before handing you a risky change — the request waits for your click, and nothing ever runs by itself.

FeatherDB's Snapshots screen: a snapshot with its reason, size and engine, with Open in sandbox and Restore actions
Real screenshot: snapshots with their reasons — restore, or open one beside today's data.
  • snapshot before every migration, by default
  • works where transactions can't (DDL on MySQL/MariaDB)
  • stays on your Mac
  • restore is typed-confirm · pre-restore snapshot first

Migrations

Diff first, migrate second.

Sandbox changes worth keeping become an ordered, safety-linted plan — the same plan a proposal from your AI shows you.

Each step is graded — DANGER for the ones that rewrite a table, WARN for the ones that lock it — and run in an order that never leaves a table half-changed, with index builds that do not lock it. Dangerous plans require an explicit confirmation, and a drift guard catches production changing underneath you.

A FeatherDB migration plan: an ALTER TABLE graded DANGER and a CONCURRENTLY index graded WARN, behind a confirmation checkbox
Real screenshot: a computed plan with graded steps and the confirmation gate.
  • graded steps
  • never half-changed
  • drift guard
  • explicit confirm

Checkup

The review a database expert would give you, in one tab.

Connect a database and FeatherDB flags what a DBA would — free, on every engine.

It reads the schema you are connected to and names the things that bite: tables with no primary key, foreign keys with no covering index (Postgres does not add those for you; MySQL and MariaDB do), columns that read as personal data, and a connection running as a superuser or root. Every finding says what it means and what to do — the index to add, the least-privilege role to create. It runs on the schema plus one privilege query: no query against your data, nothing installed, nothing changed. Your AI can run the same check through the gateway and gets exactly the findings you see.

FeatherDB's Checkup screen: a superuser warning, a foreign key with no index, and a table holding personal data
Real screenshot: two things to fix, one to be aware of — read from the schema, nothing changed.
  • free · every engine
  • missing primary keys · unindexed foreign keys
  • personal-data columns
  • superuser/root connection
  • read-only — nothing installed

Integrations

One gateway, every AI tool.

The first five install themselves — one click, no token to copy. Codex shares one config across its command line, its IDE extension and the Codex mode inside the ChatGPT desktop app, so that click connects all three; ChatGPT's own cloud connectors are a different door and still need a public URL. Everything else gets the standard MCP config to paste. One gateway serves every database you expose; the AI names which one it wants, and what it may do there is decided by the kind of database it is, not by the request. Claude Code's auto mode asks before any tool it has not been told to trust — including the ones that read nothing of your data, like filing a question for you to run. One click in the app tells it which of those it may skip the question for; reading your rows or changing anything still asks.

Pricing

Buy it once, keep it forever.

$69
once, not per month
  • Perpetual licence — the version you bought keeps working forever, offline.
  • One year of updates included. Renew for $29/year to keep getting them; skip it and nothing stops working.
  • Two machines per licence.
  • 14-day trial, full features, no account and no card.
  • No usage metering. The AI calls are yours and go through your own subscription — FeatherDB never sits in that loop.

Checkout by Polar.sh, the merchant of record — your receipt and any VAT come from them. Activation is immediate: open the app, type your purchase email, enter the 6-digit code it sends you. No key to wait for.

Questions

Everything else, answered.

Does my data ever leave my Mac?

No. FeatherDB connects your Mac directly to your databases — rows, schemas, credentials, and query results never touch our servers. The app contacts a server in exactly three situations: buying, activating, and checking for updates, and the privacy policy lists precisely what each involves.

What can the AI actually do — and not do?

Your AI tools connect to one local MCP gateway. On a live database they can read, and only read — a write is refused by the database server itself, on PostgreSQL, MySQL and MariaDB alike, not by a prompt. On a sandbox they get full read and write, because a sandbox is a disposable local clone with personal data already masked.

Which databases does it work with?

PostgreSQL, MySQL and MariaDB — connected directly over TLS (Supabase, Neon, RDS, PlanetScale, and other managed hosts) or through an SSH tunnel to a box you own. We run the full suite against PostgreSQL 14–18, MySQL 8.0 and 8.4, and MariaDB 10.11–11.8 before every release; versions in between normally just work.

Sandboxes run at your server's version, in a Docker container on your Mac: FeatherDB reads what production runs and proposes the official image for that series — the same PostgreSQL major (16, 17, 18) or MySQL / MariaDB release line (8.4, 11.4) — so schema behaviour matches; the patch level is the image's, and may differ from yours by a point release. It creates the container only when you approve — it is visible in Docker Desktop, and discarding the sandbox deletes it. Without Docker, Postgres clones instantly with the built-in engine, and the migration plan flags any version drift so you review those migrations by hand.

Can I install with Homebrew?

Yes. brew install --cask featherdb-app/tap/featherdb — the tap points at the same signed, notarized release as the direct download, and brew upgrade tracks new versions (the app also updates itself). Removing it is brew uninstall --cask featherdb; add --zap to also delete its local data.

How does activation work? Do I need an account?

No account. Buy, open FeatherDB, type the email from your receipt, and enter the 6-digit code it sends you. One purchase covers two Macs. If both are taken when you activate a new one, FeatherDB lists your Macs and replaces the one you pick in the same step. After activation the licence verifies offline; air-gapped Macs can paste a licence key instead.

What happens when my year of updates ends?

Nothing. The version you have keeps working forever, offline. Renewing ($29/year) is optional and only buys continued updates — skip it and come back whenever a new version is worth it to you.

Is there a Windows or Linux version?

No — FeatherDB is a native macOS app, built for macOS 15 or later on Apple Silicon and Intel. Going deep on one platform is what keeps it fast and native-feeling.

Docs

Connect the database you actually run.

A database in a Docker container, on a platform like Fly or Railway, or in Kubernetes: each has a path that never opens a port to the internet.