Built for Postgres, on a Mac, by someone who uses it daily. Here's the whole tool, feature by feature.
14-day free trial · no account · no credit card
Not a generic tree. TuskDB reads what Postgres actually tells it, and shows you the parts other clients flatten away.
Tables, partitioned tables, views, materialized views, foreign tables, and sequences each carry their own icon. Tables with row-level security get a lock badge you can hover for the policy count.
Columns with keys, types, nullability, defaults, and identity or generated markers. Then sub-tabs for constraints, indexes (HNSW and IVFFlat highlighted), triggers with their enabled state, RLS policies with USING and WITH CHECK, and the definition of a view.
Owner, estimated rows, total size, RLS status with policy count, partition flag, sequence details, and the row-identity summary that tells you whether the table is editable and why.
An extensions list read from the catalog with pgvector called out, and a database switcher that opens a fresh session without losing your place.
Completion built from a live snapshot, files that behave like files, and Postgres talking back to you in its own words.
Completes tables, columns, and enum labels, suggests the JOIN condition from your foreign keys, and inserts quote-correct identifiers. It reads an in-memory snapshot, so nothing on the keystroke path ever hits the server.
Open and save with ⌘O and ⌘S. TuskDB watches the file: an external edit reloads a clean buffer silently and offers Reload or Keep Mine on a dirty one. A renamed or deleted file degrades to an untitled buffer with your text intact.
Run the selection, or just the statement under your cursor. Failures highlight the exact position in the editor and show Postgres' own message, hint, and SQLSTATE.
RAISE NOTICE and WARNING output appears inline, with Detail and Hint lines, listed against the statement that raised it. Most clients throw this away.
Multiple query tabs with dirty markers, plus the last 500 statements with duration and connection, filterable, one double-click from being back in your editor.
Native depesz-style analysis with a computed verdict, so you see the problem node instead of a wall of JSON.
Every plan opens with a headline and one finding per line, severity-tinted. Click a finding to jump to the node it is about.
Nodes in plan order with a proportional exclusive-time bar, loop-multiplied actual rows, and an estimate-versus-actual factor with a direction arrow when the planner guessed wrong.
Plain EXPLAIN never touches your data. EXPLAIN ANALYZE on a writing statement runs inside a BEGIN and ROLLBACK, and the confirmation names exactly what survives it. Statements with no plan are refused before they reach the server.
Copy the plan as indented text or as the server's raw JSON.
The one thing no other Mac Postgres client has. Inspect embeddings, search by meaning, and tune your index to a number.
Right-click any row for its nearest neighbours with distances, using your index's operator class. Right-click a neighbour to hop to its neighbours; a trail in the header shows the path you took.
Search by meaning with a local Ollama model or any OpenAI-compatible API. Your text goes to the endpoint you chose, and your key lives in the Keychain.
Sweep hnsw.ef_search or ivfflat.probes against an exact baseline and chart recall@k against latency, cancellable mid-sweep. Stop guessing at index settings.
Distances from a random anchor row across a sample, binned, so you can pick a similarity threshold from the shape of your own data.
Per-column stats (rows, NULL rate, zero-norm count, dimensions), which operators each index serves and which fall back to a scan, and findings that appear only when the published formulas disagree with your index by more than 2x. Numbers, never prescriptions.
A builder sheet that writes the parameterised similarity query for you, and a badge on every vector query telling you whether it walked the index or fell back to a sequential scan.
Keyed to the primary key, previewed as exact SQL, and written to a log you can read.
Before any grid edit runs, a sheet shows the exact statement, with parameter values shown for reading but bound as $n at execution.
Edits and deletes are keyed to the primary key or a suitable unique index and touch exactly one row. A table with no stable key opens read-only and tells you why instead of silently refusing.
Numbers, UUIDs, dates, and timestamps validate on each keystroke and again on commit. Boolean and enum columns open a picker with the catalog's own labels instead of a free-text field.
An insert sheet with per-column DEFAULT, NULL, or Value modes, and a delete confirmation that states the row count and that it runs in a transaction.
Every mutation this session, including inserts and deletes and anything an agent ran, with its SQL, bound values, row count, and any server error.
A native NSTableView grid with type-aware filtering and export that streams.
Comparisons and IN for numbers, contains and regex for text, @> containment for JSON, array-contains for arrays, full-text for tsvector, NULL checks for everything. Values are always bound as parameters. A raw WHERE mode exists and is clearly marked as running exactly what you type.
JSON pretty-printed and validated on save, vectors validated against their declared dimensions, binary shown as hex with a byte count, and copy-as-PG-literal or JSON-array for vector values.
CSV, TSV, JSON, or SQL. A full-table export streams through a cursor in one repeatable-read transaction, and cancelling rolls the read back and removes the partial file. CSV import maps columns by name with a preview first.
Page sizes from 100 to 5000, visible row ranges, and count-on-demand, so TuskDB never runs SELECT count(*) behind your back.
Start from one table and expand foreign key by foreign key. Never the whole schema dumped at once.
The canvas starts from one table and grows FK-by-FK, so it stays readable at dozens of nodes instead of drowning at hundreds. Crow's-foot ends carry real cardinality, derived from whether the FK is unique-covered and nullable.
Focus collapses every table not adjacent to the one you care about down to its header. Expand All lays out the entire schema in FK-depth columns, and asks first past forty tables.
A schema refresh diffs the diagram without moving a node you placed. Vanished tables grey out rather than disappearing, and new foreign keys appear as fresh expand affordances.
Save and switch per-connection layouts. Export as vector PDF or 2x PNG, or copy the diagram as DBML or mermaid, which is the artifact a README actually embeds.
Bring your own key or a local model. It drafts SQL and never runs it, and it does not exist until you configure it.
Describe what you want and it drafts SQL from your schema. After a failure it can fix the statement from the actual Postgres error. After an EXPLAIN it can explain the plan and the verdict. It writes into the editor; it never executes.
Anthropic, OpenAI, any OpenAI-compatible endpoint, or a local Ollama model, with the model list discovered for you. Keys live in the macOS Keychain.
The first send on a connection names exactly what leaves the machine: schema names and types, the statement, the error or plan. Never rows, never credentials. A local model notes that nothing leaves your Mac at all, and Show Exact Prompt renders the request verbatim.
TuskDB runs a read-only MCP server in-app, so Claude Code or Cursor can query your schema through a connection you already trust. Off until you turn it on, twice.
A master switch in Settings, then a per-connection toggle. Both must be on before a server starts, and turning the master off tears down the running server immediately.
The server binds 127.0.0.1 on an ephemeral port behind a bearer token, and runs on its own dedicated session. There is no write tool, deliberately.
Pick your client and TuskDB gives you the exact JSON config, token included, to drop into Claude Code, Cursor, or anything MCP-speaking.
A live indicator shows tool calls served and when, and every agent query is tagged in the session log with the backend pid that ran it.
A live activity panel that resolves lock chains into plain sentences, on its own connection so a runaway query cannot lock you out.
pg_stat_activity in the grid with wait events, durations, and blocking pids, plus a plain sentence: "pid 4211 (alice) has waited 42s on a lock held by pid 3990 (bob)", and the blocker's query.
Cancel a query or terminate a connection, with the pid snapshotted when the dialog opens so a refresh cannot redirect the kill. The server's answer is reported honestly, including permission errors, verbatim.
The panel runs on its own connection, so you can always inspect and kill the query that is hanging your main one.
SSH tunnels, full TLS, and secrets that only ever touch the Keychain.
SSH tunnels with key or password auth and passphrases, reading ~/.ssh/config. All six Postgres sslmodes, client certificates, and root-cert verification. Host-key and certificate checks are enforced and cannot be silently turned off.
Connection and SSH passwords and any AI key live in the macOS Keychain. Never a plist, a JSON file, a log, or query history. Paste a postgres:// URL and TuskDB splits it into fields with the password routed straight to the Keychain.
Drop your VPN and TuskDB retries quietly with backoff, then reloads the exact view you left: same tab, table, page, filters, and sort. A bad credential stops the loop instead of pretending to make progress.
TuskDB connects straight from your Mac to your database. There is no middle tier, and there is nothing to opt out of that is on by default.
Queries, rows, and credentials never leave your machine except to the database you pointed at. The app contacts us for exactly two things: checking for updates and activating a license.
Off by default. If you turn them on, they carry which features you opened and connection shape, never host, database, table names, query text, row values, or error text.
Crash reports are call stacks only and are never uploaded silently. Save Diagnostic Logs exports this session's logs to a file, after a redaction pass, for you to attach to an email if you want to.
14 days, every feature, no account.