TuskDB TuskDB
TuskDB / Features

Everything TuskDB does.

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

Browse

Your whole schema, read from the catalog.

Not a generic tree. TuskDB reads what Postgres actually tells it, and shows you the parts other clients flatten away.

Every relation kind, labelled

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.

Structure in full

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.

Table info that answers the real question

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.

Extensions and databases

An extensions list read from the catalog with pgvector called out, and a database switcher that opens a fresh session without losing your place.

Query editor

An editor that knows your schema.

Completion built from a live snapshot, files that behave like files, and Postgres talking back to you in its own words.

Schema-aware autocomplete

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.

Real .sql files

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 what you mean

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.

Server notices, shown

RAISE NOTICE and WARNING output appears inline, with Detail and Hint lines, listed against the statement that raised it. Most clients throw this away.

Tabs and history

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.

Visual EXPLAIN

A query plan you can actually read.

Native depesz-style analysis with a computed verdict, so you see the problem node instead of a wall of JSON.

A verdict, not a dump

Every plan opens with a headline and one finding per line, severity-tinted. Click a finding to jump to the node it is about.

Where the time goes

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.

Safe by default

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.

Take it with you

Copy the plan as indented text or as the server's raw JSON.

pgvector

A real pgvector workflow.

The one thing no other Mac Postgres client has. Inspect embeddings, search by meaning, and tune your index to a number.

More on pgvector

Find similar, and keep going

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.

Bring your own endpoint

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.

Recall lab

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.

Distance histogram

Distances from a random anchor row across a sample, binned, so you can pick a similarity threshold from the shape of your own data.

Index health, stated plainly

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.

Query builder and index badge

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.

Safe editing

Edits you see before they run.

Keyed to the primary key, previewed as exact SQL, and written to a log you can read.

Preview before commit

Before any grid edit runs, a sheet shows the exact statement, with parameter values shown for reading but bound as $n at execution.

One row, never more

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.

Typed input, checked twice

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.

Insert and delete, deliberately

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.

A session log

Every mutation this session, including inserts and deletes and anything an agent ran, with its SQL, bound values, row count, and any server error.

Browse & export

Dense grids, honest filters.

A native NSTableView grid with type-aware filtering and export that streams.

Filters that fit the type

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.

A proper cell viewer

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.

Export that cancels cleanly

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.

Pagination that respects the server

Page sizes from 100 to 5000, visible row ranges, and count-on-demand, so TuskDB never runs SELECT count(*) behind your back.

ERD

Diagrams that grow with you.

Start from one table and expand foreign key by foreign key. Never the whole schema dumped at once.

Incremental by design

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, and Expand All

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.

Your arrangement is safe

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.

Named layouts and real exports

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.

AI assistant

AI on your terms, dormant by default.

Bring your own key or a local model. It drafts SQL and never runs it, and it does not exist until you configure it.

Draft, fix, explain

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.

Your key, your model

Anthropic, OpenAI, any OpenAI-compatible endpoint, or a local Ollama model, with the model list discovered for you. Keys live in the macOS Keychain.

Consent you can read

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.

MCP server

Point your coding agent at your database.

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.

Two gates, both yours

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.

Read-only, on loopback

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.

Ready to paste

Pick your client and TuskDB gives you the exact JSON config, token included, to drop into Claude Code, Cursor, or anything MCP-speaking.

You can see what the agent did

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.

Activity & ops

See what the server is doing. Stop it if you must.

A live activity panel that resolves lock chains into plain sentences, on its own connection so a runaway query cannot lock you out.

Who is blocking whom

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 or terminate

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.

On a side session

The panel runs on its own connection, so you can always inspect and kill the query that is hanging your main one.

Connections & security

Connect the way your infrastructure actually works.

SSH tunnels, full TLS, and secrets that only ever touch the Keychain.

SSH and TLS, verified

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.

Secrets in the Keychain, nowhere else

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.

Auto-reconnect that restores your place

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.

Privacy

Your data never touches our servers.

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.

Nothing routes through us

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.

Analytics are opt-in and content-free

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.

Diagnostics you send yourself

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.

See it against your own database.

14 days, every feature, no account.