PgDeck

Features

Everything PgDeck does, and every key that does it.

The complete list — 237 features across connections, the data grid, staged editing, SQL, schema tools, search, import and export, plus a full 60-shortcut keyboard reference. Search it, filter it by plan or engine, and jump straight to what you need.

Features
237

across nine areas of the app

Shortcuts
60

mouse and keyboard, fully mapped

Engines
3

PostgreSQL, MySQL, MongoDB

Platforms
3

Windows, macOS, Linux

Nothing writes until you commit

Cell edits, inserts and deletes stage locally. Review a before/after diff, then commit the whole batch in one transaction — or discard it.

Built to stay responsive

Result sets cap what they paint, searches run four workers with a statement timeout and a hard deadline, and every long operation shows progress.

Keyboard-first where it counts

60 bindings for the operations you repeat all day — run a selection, commit a batch, duplicate a row, refresh without reloading.

Connections & credentials

Save, group and colour-code every database you touch — with secrets held in the OS keychain, never in a plaintext file.

29 features

  • PostgreSQL, MySQL and MongoDB

    Free

    One app for three engines. PostgreSQL is the stable, fully-featured target; MySQL and MongoDB ship in beta. The engine is fixed per saved connection and drives the default port (5432 / 3306 / 27017), the avatar badge and which tools the rest of the app shows.

  • Driver picker gallery

    Free

    The + button opens a searchable tile gallery instead of dropping you into a blank form. Each driver shows a coloured badge; double-clicking a tile jumps straight to the new-connection form.

  • Import from a connection string

    Free

    Paste a postgres://, postgresql://, mysql://, mongodb:// or mongodb+srv:// URL and the form fills itself in — engine detected from the scheme, plus host, port, database, user, password, SSL and leftover query params, named database@host automatically.

  • Live URL validation preview

    Free

    As you paste, the dialog shows a green check with the parsed user@host:port/database (and · SSL), or a red "Not a recognised URL" message. Import stays disabled until the string actually parses.

  • Test connection before saving

    Free

    A Test button validates the typed credentials without saving anything — a throwaway client that runs SELECT 1 on PostgreSQL/MySQL or an admin ping on MongoDB, opening and tearing down a temporary SSH tunnel first when one is configured.

  • Passwords encrypted with the OS keychain

    Free

    Database passwords and every SSH secret are encrypted through Electron safeStorage — DPAPI on Windows, Keychain on macOS, libsecret on Linux. If OS encryption is unavailable the save is refused outright rather than writing a plaintext secret to disk.

  • Secrets never reach the UI process

    Free

    The connection profile handed to the interface is rebuilt field by field with no password and only the non-secret half of the SSH config. Decryption happens in the main process at connect time and nowhere else.

  • Automatic SSL, with a prefer-style fallback

    Free

    SSL is switched on automatically for non-local PostgreSQL hosts, and a pasted URL's sslmode is honoured. If a server refuses SSL outright PgDeck reconnects without it instead of failing, and remembers that for the session.

  • Self-signed certificates accepted

    Free

    Dev servers and self-signed managed instances connect without extra configuration or hand-written certificate flags.

  • SSH tunnels with key or password auth

    Pro

    Reach a database that only listens on a private network. SSH host, port, user, and either a password or an OpenSSH/PEM private key with an optional passphrase — PgDeck forwards an ephemeral local port and points the driver at it.

  • Private key upload (.pem)

    Pro

    Paste a key into the textarea or load one from disk (.pem, .key, .txt, .cer, .crt, .openssh); picking a file also switches the auth type to key.

  • SSH host-key pinning (trust on first use)

    Pro

    The SHA-256 fingerprint of the SSH server's host key is learned on first connect and stored with the connection. Later connects refuse to proceed if it changes — the signature of a machine-in-the-middle.

  • Tunnel keepalive and self-healing

    Pro

    Tunnels send keepalives every 10s with 3 misses tolerated, so a tunnel dropped by sleep, VPN or a Wi-Fi change is detected in about 30 seconds instead of hanging. A dead tunnel and its pool are discarded so the next connect rebuilds them cleanly.

  • MongoDB URI options field

    Free

    An extra Options field carries raw URI query params — authSource=admin&replicaSet=rs0 — that host, port and database cannot express, appended verbatim to the generated URI.

    MongoDB
  • Server-level browsing for MySQL and MongoDB

    Free

    The database field is required for PostgreSQL but optional for MySQL and MongoDB, where you can connect to the server itself and browse every database from one connection.

    MySQLMongoDB
  • Groups (folders) with colour and collapse

    Free

    File connections into named folders with an accent colour, an open/closed folder icon and a member count. Collapsed state is persisted to disk, so it survives restarts and auto-updates.

  • Create, rename, recolour, duplicate and delete groups

    Free

    Renaming a group moves every connection in it. Duplicating one clones the folder and every connection inside it, secrets included. Deleting a group keeps its connections — they move back to the top level, and the confirm dialog says so.

  • Inline group creation from the connection form

    Free

    The Group field is a combobox that suggests every known group, filters as you type, offers Ungrouped, and shows a Create "name" row for a group that does not exist yet.

  • Drag connections between groups

    Free

    Drag a connection onto a group block to file it there, or onto the root area to pull it out. The drop target rings, a collapsed group auto-expands, and stray text dragged in from elsewhere is rejected.

  • Pin connections and groups to the top

    Free

    Pinned rows float to the top of their group while everything else keeps its saved order; pinned groups sort above unpinned ones. A small filled pin marks them.

  • Colour coding and environment tags

    Free

    Six status colours paint a stripe on the row edge, the engine avatar and the tag chip. A separate tag picker offers local / testing / staging / development / production as an uppercase chip — so production never looks like local.

  • Engine-badged connection avatar

    Free

    Each connection shows a solid colour circle badged with its driver code (Pg / My / Mg) rather than a generic cylinder, so engines are told apart at a glance and the active one is ringed in the rail.

  • Search the connection list

    Free

    Filter by name, host, database or group name. Empty groups hide while searching, and the empty state distinguishes "no connections yet" from "nothing matches your search".

  • Duplicate-target warning on save

    Free

    Saving a connection whose user@host:port/database already exists shows the existing one on a card and offers Open existing or Save anyway — so you do not quietly end up with two labels for the same database.

  • Duplicate a saved connection

    Free

    Clone a connection with its secrets as "X (copy)". The clone is made in the main process by copying the encrypted blobs verbatim, so it authenticates correctly even where OS encryption is unavailable, and a learned SSH host key carries over.

  • Edit without retyping the password

    Free

    Editing pre-fills everything except secrets — the password placeholder reads "•••••• (unchanged)" and leaving it blank keeps the stored one. Saving an edit closes the open pool so the next connect picks up new credentials.

  • Delete with confirmation

    Free

    Deleting asks first, and closes the connection's open pool before removing it.

  • Several connections open at once

    Free

    Connecting to a second database keeps the first open. A rail of engine avatars appears once two or more are live, and each connection's schemas, tabs and pins are cached so switching back is instant.

  • Sensible pool and connect timeouts

    Free

    PostgreSQL: 10s connect, 30s idle, 4 pooled clients. MySQL: 10s connect, 4-connection pool. MongoDB: 10s server selection and connect. SSH: 15s ready timeout — tuned so a dead host fails fast instead of hanging the UI.

Schema browsing & data grid

A fast, type-aware grid over your tables — sort, filter, search, pin columns and page through millions of rows without waiting on the UI.

31 features

  • Lazy schema tree

    Free

    The sidebar lists every non-system schema (MySQL and MongoDB databases surface at the same level) and fetches a schema's relations once, on expand, then caches them. Views get an eye icon, tables a grid icon.

  • Table search with match ranking

    Free

    Filter tables by name across every schema — it force-loads unexpanded schemas so nothing hides — ranking exact matches above prefix matches above mid-string ones and hiding schemas with no hits.

  • Pin tables to the top of the tree

    Free

    Any table can be pinned into a sticky section that stays visible while the tree scrolls. Pins are saved per connection and reappear as quick-open chips on the empty workspace screen.

  • Table context menu

    Free

    Right-click a table for Open, Open Structure, Copy Name, Pin/Unpin, Import, Export, Truncate and Delete — clamped so the menu never opens off the edge of the window.

  • Value-type colour coding

    Free

    Cells are syntax-coloured by inferred type: strings, numbers, booleans, dates, JSON and NULLs each get their own colour, with numeric-looking strings coloured as numbers.

  • NULL versus empty string, always distinguishable

    Free

    NULLs render as a dimmed italic NULL token, visually distinct from a blank cell, so a missing value is never confused with an empty one.

  • JSON and JSONB cell rendering

    Free

    Objects and arrays render as compact, colour-coded JSON in the grid, with the full value one right-click away in a monospace editor.

  • Binary column summary

    Free

    Byte-array columns render as a [N bytes] summary instead of dumping unreadable binary into the grid.

    PostgreSQLMySQL
  • Click-header sorting

    Free

    Clicking a column header cycles ascending, descending, then back to no sort, refetching from the first page. An arrow shows the current direction.

  • Sort from the column menu

    Free

    The header right-click menu offers Sort Ascending, Sort Descending and — when that column is the active sort — Remove sort.

  • Stable default row order

    Free

    With no user sort, rows are ordered by primary key (or by ctid on PK-less tables) so pagination stays consistent and rows do not jump around after an update.

    PostgreSQL
  • Type-aware filter bar

    Free

    Only the operators that make sense for the column type are offered — booleans get =/≠/is null with a true/false picker, numbers and dates get comparisons, text gets contains / not contains / starts with / ends with.

  • Multiple filter conditions

    Pro

    Stack as many conditions as you need; they combine with AND in the generated WHERE clause. Free is limited to a single condition.

  • Quick Filter from a cell value

    Free

    Right-click a cell to filter that column by its own value in one click: =, <>, <, >, <=, >=, Contains, Not contains, Has prefix, Has suffix, IS NULL and IS NOT NULL.

  • Filter with column from the header menu

    Free

    Right-click a column header and choose Filter with column to append a pre-seeded contains condition and open the filter bar.

  • Active-filter badge

    Free

    The footer Filter button lights up with the number of active conditions, so a filtered view is never mistaken for the whole table.

  • Search within the open table

    Free

    The top-bar search box runs a free-text search across every column of the open table — each column cast to text and matched case-insensitively — combining with any active filters.

  • Search-term highlighting in cells

    Free

    Every case-insensitive occurrence of the term is wrapped in an amber highlight inside the grid, so you can see exactly why each row matched.

  • Per-tab search state

    Free

    Search draft text is re-synced per table tab, so a half-typed term never bleeds across tabs.

  • Column resize by dragging

    Free

    Drag the divider on a header to resize a column, with a 60px floor, a blue guide on hover, and no accidental sort click.

  • Hide and show columns

    Free

    Drop a noisy column out of the grid from the header menu, then bring them all back with a single Show all columns entry.

  • Pin (freeze) columns to the left

    Free

    Pinned columns move to the front and stick to the left edge while the rest scroll horizontally, with sticky offsets computed from their measured widths.

  • Reset column widths and pins

    Free

    One menu item clears every manual width, pin and hidden column. The layout also resets automatically when you switch tables.

  • Copy column name

    Free

    The header menu copies the column's name to the clipboard — the fastest path from grid to query.

  • Page-size selector

    Free

    Choose 50, 100, 250, 500 or 1000 rows per page from the footer; changing it resets to page one. The backend clamps to 1000 rows regardless.

  • Record paging

    Free

    Footer arrows page through records with LIMIT/OFFSET. Previous is disabled on page one, Next is disabled once a short page proves you have reached the end, and both disable while a fetch is in flight.

  • Row range and total row count

    Free

    The footer shows the current row range plus a total — an exact COUNT(*) when filters or a search are active, and the fast planner estimate when browsing unfiltered, so opening a huge table stays instant.

  • Previous / next table navigation

    Free

    Footer chevrons step to the previous or next table in the current schema without going back to the sidebar.

  • Foreign-key navigation

    Free

    Right-click a cell in a single-column foreign key and choose "Go to <table> →" to open the referenced table filtered to the matching row.

    PostgreSQLMySQL
  • Table-shaped loading skeletons

    Free

    First load shows a shimmering header-plus-cells skeleton sized to the real column count with varied cell widths, so it reads like data. Refetches keep the previous page visible instead of blanking the grid.

  • Screen-aware context menus

    Free

    Cell menus are clamped so they never spill off the right or bottom edge, and flyout submenus flip to the left when there is no room on the right.

Staged editing & row tools

Nothing is written until you say so. Stage edits, inserts and deletes, review a before/after diff, then commit the whole batch in one transaction.

25 features

  • Nothing writes until you commit

    Pro

    Every cell edit, new row and delete is staged locally rather than sent to the database. Edited cells turn green, deleted rows turn red edge to edge, and new rows render green at the bottom of the grid.

  • Atomic commit in one transaction

    Pro

    Commit sends every staged delete, update and insert inside a single BEGIN/COMMIT. Any failure rolls the whole batch back, so a half-applied change is impossible.

    PostgreSQLMySQL
  • Pending-changes bar

    Pro

    A bar appears above the footer the moment anything is staged, showing the change count with View, Discard and Commit.

  • Before / after review modal

    Pro

    View groups every staged change into New rows, Edited rows and Deleted rows. Edits show old value → new value per column, deletes preview the doomed row, and empty new rows are labelled "empty row (column defaults)".

  • Per-change discard

    Pro

    Each staged item has its own Discard (or Keep, for deletes) button, so one change can be dropped without throwing away the batch. The modal closes itself once nothing is left staged.

  • Discard everything at once

    Pro

    Discard all — from the bar, the modal, or Ctrl/Cmd+Z — throws away every staged edit, insert and delete and confirms with a toast.

  • Inline cell editing

    Pro

    Double-click any cell in an editable base table to edit it in place, pre-filled with its current value and honouring any edit already staged on that cell.

    PostgreSQLMySQL
  • Keyboard cell editing

    Pro

    Click a cell to focus it, then press Enter or F2 to open the editor without reaching for the mouse.

    PostgreSQLMySQL
  • Type-aware cell editors

    Pro

    The editor adapts to the column: boolean columns get a true/false dropdown, enum columns get a picker of the type's real labels read from the catalog in sort order, everything else gets a text input.

    PostgreSQLMySQL
  • Editing a value back un-stages it

    Free

    Change a cell and change it back, and the staged edit is dropped automatically — if it was the row's last edit, the row leaves the pending list entirely. No phantom no-op UPDATEs.

  • Typing NULL stores a real SQL NULL

    Free

    Typing NULL in any casing stores an actual SQL NULL rather than the literal four-character string, so timestamp and numeric columns do not fail to cast.

  • Set Value → EMPTY / NULL / DEFAULT

    Pro

    Stage an empty string, a real NULL, or the column's DEFAULT straight from the cell menu without opening an editor. Works on existing rows and drafts alike.

    PostgreSQLMySQL
  • DEFAULT, generated and identity columns handled correctly

    Free

    A cell set to DEFAULT commits as col = DEFAULT on an UPDATE, and is simply omitted from an INSERT so the database applies its own default, sequence or identity value. A draft row with no values at all commits as INSERT ... DEFAULT VALUES.

    PostgreSQLMySQL
  • Quick Look editor for large values

    Pro

    Open a full-height monospace editor holding the entire value — the practical way to read or edit long text and JSON that will never fit in a grid cell. Ctrl/Cmd+Enter saves, and a one-click Set NULL button is right there.

    PostgreSQLMySQL
  • Insert draft rows

    Pro

    Add a blank row from the footer button, the cell menu, or Ctrl/Cmd+I. The grid auto-scrolls to the new row so you actually see it, and each draft carries an inline × to drop it again.

    PostgreSQLMySQL
  • Duplicate row

    Pro

    Duplicate Row (or Ctrl/Cmd+D) creates a draft pre-filled with every non-key column of the source row, so the primary key or identity value is regenerated by the database instead of colliding.

    PostgreSQLMySQL
  • Toggleable staged deletes

    Pro

    Delete stages the selected rows — or the focused row — and renders them red until commit. Pressing Delete again toggles it off, and staging a delete drops any pending edits on that row.

    PostgreSQLMySQL
  • Cascade delete with a blast-radius preview

    Pro

    Delete with dependents… walks the foreign-key graph and previews every table and row count that would be removed transitively, shows the total, then deletes the row and all dependents in one transaction.

    PostgreSQL
  • Cascade truncation warnings

    Free

    The dependency walk stops at 5,000 rows. If it hit that cap the dialog says so outright — the real cascade is larger than the number shown — and surfaces any plan warnings as amber callouts before the destructive confirm.

    PostgreSQL
  • A blocked delete offers the cascade instead

    Free

    If a staged delete fails because the row is referenced by a foreign key, PgDeck discards the staged delete and opens the delete-with-dependents preview rather than leaving you at a dead-end error.

    PostgreSQL
  • Row selection: click, Ctrl-click, Shift-range

    Free

    Click to select, Ctrl/Cmd-click to toggle rows in and out, Shift-click for a contiguous range from the anchor. Ctrl/Cmd+A takes every loaded row; Esc clears the selection.

  • Tables without a primary key are still editable

    Pro

    Editable tables fetch a hidden ctid alongside the row so PK-less tables can still be targeted for UPDATE and DELETE. The review modal identifies such rows by ctid, and the helper column never shows in the grid.

    PostgreSQL
  • Dirty-state visuals

    Free

    The clicked cell gets a bright outline, edited-but-uncommitted cells fill solid green, deleted rows fill red and draft rows fill green edge to edge — the state of every change readable at a glance.

  • Editing gated by table type as well as plan

    Free

    Editing affordances appear only on base tables — never on a view — and only in the shape each engine actually supports: per-cell staged editing on PostgreSQL and MySQL, whole-document editing on MongoDB. No surface sprouts buttons that cannot work.

  • MongoDB documents edited as JSON

    Free

    For document stores a row's menu offers View document…, Edit document… and Delete document, editing the whole document as JSON rather than per cell so BSON types round-trip intact.

    MongoDB

SQL editor

Multi-tab SQL with live highlighting, run-selection, explain, cancel, history and saved queries — plus a guard that reads your SQL before it runs.

22 features

  • Multi-tab SQL console

    Free

    Independent query tabs, each with its own text, results and error state. Switch by clicking, close with the ×, add with +. Closing the active tab falls through to its neighbour.

    PostgreSQLMySQL
  • Live syntax highlighting

    Free

    SQL is coloured as you type — comments, single-quoted strings, double-quoted identifiers, numbers and 120+ keywords, types and functions each get their own colour.

    PostgreSQLMySQL
  • Run the whole tab, or just the selection

    Free

    Ctrl/Cmd+Enter runs the tab. Highlight some text first and it runs only that selection — the difference between testing one CTE and running the whole script.

    PostgreSQLMySQL
  • Multi-statement execution

    Free

    Several semicolon-separated statements run in one go. PostgreSQL uses the simple query protocol so the whole batch runs, and the grid shows the last statement's result set.

    PostgreSQLMySQL
  • Explain without executing

    Free

    The Explain button prefixes the tab (or the selection) with EXPLAIN and runs it. Deliberately plain EXPLAIN with no ANALYZE, so it only plans and never executes — safe on a write.

    PostgreSQLMySQL
  • Cancel a running query

    Free

    A red Stop button appears while a query is in flight. PgDeck captures the backend PID and issues pg_cancel_backend() from a separate pooled connection, so a runaway query is actually cancelled server-side, not just abandoned.

    PostgreSQL
  • Command tag, row count and duration

    Free

    The status line shows Running…, then the SQL command tag, the row count with correct singular/plural, and the wall-clock duration measured around the real driver call.

    PostgreSQLMySQL
  • Typed result grid

    Free

    Results render with real column names and the same type colouring as the data grid — NULLs, booleans, numbers, ISO dates, byte arrays as [n bytes], objects as JSON — each cell carrying its full text as a tooltip.

    PostgreSQLMySQL
  • Large results stay responsive

    Free

    Only the first 2,000 rows are painted to the DOM so a huge SELECT cannot freeze the app, with a footer line saying so. The complete result stays in memory, and export still writes every row.

    PostgreSQLMySQL
  • Plain-language summary for non-SELECT statements

    Free

    A statement that returns no columns reports itself in the results pane — "UPDATE — 3 rows affected · 12 ms" — instead of showing an empty grid.

    PostgreSQLMySQL
  • Errors shown compact and in full

    Free

    A failed query shows the driver's message compactly in the status line and in full, with line breaks preserved, where the grid would be. The error clears on the next run.

    PostgreSQLMySQL
  • Destructive-statement guard

    Free

    Every statement is classified in the main process before it runs. INSERT, UPDATE, DELETE, MERGE, TRUNCATE, COPY, CALL and REFRESH count as data writes; CREATE, ALTER, DROP, GRANT, REVOKE, REINDEX and friends count as DDL — each checked against your plan before a single byte is sent.

    PostgreSQLMySQL
  • A guard that cannot be fooled by comments or strings

    Free

    Line comments, block comments, quoted strings, quoted identifiers and $tag$ dollar-quoted blocks are stripped to inert placeholders before keywords are scanned — so SELECT 'DELETE FROM t' is correctly read as a read.

    PostgreSQLMySQL
  • Data-modifying CTEs and batches caught too

    Free

    The classifier checks every statement in a batch, scans a leading WITH for INSERT/UPDATE/DELETE inside the CTE, and treats EXPLAIN ANALYZE (which really does execute) as what it is — while plain EXPLAIN of a write stays read-only.

    PostgreSQLMySQL
  • Automatic cache invalidation after a write

    Free

    When the console runs anything that is not a SELECT, SHOW or EXPLAIN, open table tabs, row counts and structure views refresh themselves instead of showing stale data.

    PostgreSQLMySQL
  • Query history

    Free

    A History panel lists recent queries newest first with a green or red dot, the SQL on one line and either the row count or "error". Click one to load it back into the tab. Free sees the last 25 entries; Pro sees them all.

    PostgreSQLMySQL
  • History records failures too

    Free

    Every execution is recorded — successes with their row count, failures with their error message — so the query that just blew up is still recoverable. The last 1,000 entries are kept on disk regardless of plan, so upgrading reveals history already recorded.

  • Saved (named) queries

    Pro

    Name a query and it lands in the Saved panel with a bookmark icon, a one-line preview and a hover delete. Click to load it back into the current tab.

    PostgreSQLMySQL
  • Export or copy query results

    Free

    The results toolbar offers Copy as JSON, Export CSV and Export JSON. Unlike table exports, SQL result exports are not row-capped — every row of the result is written.

    PostgreSQLMySQL
  • Resizable editor / results split

    Free

    Drag the divider between the editor and the results grid to grow either side, clamped so neither can collapse to nothing.

    PostgreSQLMySQL
  • SQL tabs survive switching to a table

    Free

    Opening a table leaves the SQL editor but keeps every tab and its results, and each connection gets its own set of tabs — so switching back returns you to exactly the queries you left.

  • Blocked statements open the paywall, not a cryptic error

    Free

    When a statement is blocked by the plan, the reason is shown as a clean message on the tab and the upgrade dialog opens — no internal sentinel leaks into the UI.

Structure, DDL & diagrams

Read and change schema from a grid, not a wall of DDL — with the exact SQL previewed before anything runs, and a real ERD of your foreign keys.

31 features

  • Columns, indexes and constraints at a glance

    Free

    Per table, the Structure tab lists columns with ordinal, type, nullability and default; indexes with access method, unique flag and ordered columns; and constraints with a colour-coded PK / FK / UNIQUE / CHECK badge and the server's full definition text.

  • Types shown with their modifiers

    Free

    Columns render as varchar(255) and numeric(18,2), not a bare type name — the detail you actually need when deciding whether a value will fit.

    PostgreSQLMySQL
  • Visual create-table builder

    Pro

    Table name, schema picker, and a grid of column rows with name, type, nullable, default and a key button that marks a column PRIMARY KEY. It opens pre-seeded with an id serial primary key plus a blank row.

    PostgreSQLMySQL
  • Inline rename column

    Pro

    Double-click a column's Name cell, type, press Enter. An unchanged value fires no DDL at all.

    PostgreSQLMySQL
  • Inline set or drop default

    Pro

    Double-click the Default cell: typing a value runs SET DEFAULT, clearing it runs DROP DEFAULT.

    PostgreSQLMySQL
  • Inline nullability toggle

    Pro

    The Nullable column is a live YES/NO dropdown in every row; switching it runs SET NOT NULL or DROP NOT NULL immediately.

    PostgreSQLMySQL
  • Type change with an explicit cast warning

    Pro

    Picking a new type raises a confirm that spells out exactly what an assignment cast does to existing rows — numeric→integer rounds, varchar(n) truncates — and that it cannot be undone. Cancel and the cell snaps back to the real type.

    PostgreSQLMySQL
  • Change type with a USING expression

    Pro

    For casts PostgreSQL will not do implicitly, a dialog pairs a type combo with a free-text USING expression and a live SQL preview.

    PostgreSQL
  • Add column from a draft row

    Pro

    + Column opens an inline draft in the Columns grid with name, type combo, nullable and default. Enter runs the ADD COLUMN, Escape discards it, and switching tables clears any half-typed draft.

    PostgreSQLMySQL
  • Drop column, with the column named in the confirm

    Pro

    Drop Column… asks for confirmation naming the column and warning that the data loss cannot be undone before running the ALTER.

    PostgreSQLMySQL
  • Create and drop indexes inline

    Pro

    + Index opens a draft row with an optional name, an access-method dropdown, unique flag and a column list. Methods are engine-aware — btree, hash, gin, gist, brin and spgist on PostgreSQL; btree, hash, fulltext and spatial on MySQL. Hovering an index reveals a drop button.

    PostgreSQLMySQL
  • Add a foreign key from a form

    Pro

    Pick local columns as toggle chips, choose the referenced table, type the referenced columns, and pick ON DELETE / ON UPDATE from NO ACTION, RESTRICT, CASCADE, SET NULL and SET DEFAULT — with an optional constraint name and a live SQL preview.

    PostgreSQLMySQL
  • Add a check constraint

    Pro

    A form for a CHECK expression with an optional constraint name and a preview of the exact statement before it runs.

    PostgreSQLMySQL
  • Drop constraints

    Pro

    Hovering a constraint row reveals a drop button, gated behind a confirmation. Primary-key constraints are deliberately not droppable from that row.

    PostgreSQLMySQL
  • SQL preview before every DDL apply

    Free

    Create table, add column, change type, set default, add index, add FK, add check and create trigger all render the exact syntax-highlighted statement they will run — and the Run button stays disabled until the form produces valid SQL.

  • Safe identifier quoting

    Free

    All generated DDL quotes identifiers and escapes embedded quotes, per engine — double quotes for PostgreSQL, backticks for MySQL — so names with spaces, mixed case or quotes are handled correctly.

  • Confirmation for destructive structure changes

    Free

    Drops and type changes route through a confirm dialog that names the object, appends "This cannot be undone" and uses a red action button. Non-destructive edits apply straight from the grid.

  • Data type picker with 45 common types

    Free

    A free-text field with a dropdown of serial, integer, bigint, numeric, real, double precision, boolean, text, varchar, char, citext, uuid, json, jsonb, date, time, timestamptz, interval, bytea, inet, cidr, macaddr, xml, tsvector and array types — and any unlisted value, like a custom enum, is kept exactly as typed.

    PostgreSQLMySQL
  • Triggers viewer

    Free

    Lists each user trigger's name, timing, events, level and function, badges disabled triggers, and shows the full definition as a tooltip. Internal foreign-key enforcement triggers are hidden.

    PostgreSQL
  • Create and drop triggers

    Pro

    Build a trigger from a form: name, BEFORE / AFTER / INSTEAD OF, any combination of INSERT / UPDATE / DELETE / TRUNCATE, row or statement level, and a function autocompleted from those that return trigger. Level is forced to STATEMENT when TRUNCATE is selected, because PostgreSQL rejects FOR EACH ROW there.

    PostgreSQL
  • Truncate and drop, with the consequences spelled out

    Pro

    Truncate confirms with an explicit "delete all rows" warning. Drop confirms with "permanently drop and all its data", then issues DROP deliberately without CASCADE so a dependent object makes it fail loudly rather than quietly taking more with it.

  • CREATE TABLE viewer with copy

    Free

    An Info panel rebuilds the table's CREATE TABLE — columns with NOT NULL and DEFAULT, constraints as CONSTRAINT clauses, plus an -- Indices section — syntax-highlighted with a Copy button, rebuilt from already-loaded structure so it needs no round trip.

    PostgreSQLMySQL
  • ERD relationship diagram

    Pro

    A full-screen diagram of every base table across all schemas, with foreign keys drawn as curved crow's-foot to bar connectors anchored on the real referencing and referenced column rows, and primary keys highlighted in gold.

    PostgreSQLMySQL
  • ERD zoom, pan and layout

    Pro

    Zoom buttons with a live percentage from 20% to 250%, pinch or Ctrl-wheel zoom anchored at the cursor, drag to pan, drag a table header to move it, and a Reset view that re-runs the auto-layout and recentres.

    PostgreSQLMySQL
  • ERD expand and collapse tables

    Pro

    Each box shows its first 10 columns with a "+N more — show all" link that expands it into a scrollable list painted above its neighbours.

    PostgreSQLMySQL
  • ERD export to SVG

    Pro

    Export the whole diagram as a standalone SVG with a fresh full-height layout showing every column of every table — not just what is on screen — the FK connectors, and a PgDeck footer.

    PostgreSQLMySQL
  • Open a table straight from the diagram

    Pro

    Double-click a table's header in the ERD to close the diagram and open that table in the workspace.

    PostgreSQLMySQL
  • MongoDB inferred collection schema

    Free

    For a collection, Structure becomes Schema: an inferred picture from a 50-document sample showing each top-level field, every BSON type seen (joined when a field is polymorphic) and how often it is present, with _id always listed first.

    MongoDB
  • MongoDB index list

    Free

    The collection's real indexes with name, unique flag and key list, badging Mongo's default _id_ index.

    MongoDB
  • Structure refreshes itself after every change

    Free

    Applying any structure change clears sorts and filters that might reference a dropped or renamed column, then re-fetches both rows and structure — so the grid never shows columns that no longer exist.

  • Read-only structure for views and Free users

    Free

    Editing controls appear only for base tables. On Free the full structure is visible, but every edit control routes to the upgrade prompt with a (Pro) tooltip rather than silently disappearing.

MongoDB support

Document-native tooling instead of a SQL client with a Mongo skin — an aggregation console, an Extended JSON editor, and search that understands collections.

12 features

  • Aggregation and find console

    Free

    MongoDB has no SQL editor; an Aggregate button opens a full-height console scoped to the selected collection. Type Extended JSON — an object runs as a find filter, an array runs as an aggregation pipeline.

    MongoDB
  • Extended JSON parsing

    Free

    The console parses relaxed Extended JSON, so plain JSON and $oid, $date, $numberDecimal tags all work in filters and stages, and 24-hex _id strings are rebuilt into ObjectIds.

    MongoDB
  • Console is read-only by design

    Free

    Pipelines are scanned stage by stage and any $out or $merge is rejected before anything runs — a console for exploring, not for silently rewriting a collection.

    MongoDB
  • Union-of-keys result grid

    Free

    Returned documents render in a read-only grid whose columns are the union of all keys across the result, with _id forced first and nested values shown as Extended JSON.

    MongoDB
  • Visible result cap

    Free

    The console caps results at 200 documents and says so on the count line, rather than quietly truncating.

    MongoDB
  • Document viewer and editor

    Free

    One panel reads and writes: view mode is a syntax-coloured render of pretty Extended JSON, and Edit flips it in place to a coloured editable canvas.

    MongoDB
  • Live JSON validation

    Free

    While editing, the buffer is parsed on every keystroke and the parser's own message appears in a red strip. Save stays disabled until the JSON is valid.

    MongoDB
  • _id preserved on save

    Free

    On save the _id is stripped from the body and taken from the target document, so a stray edit to _id cannot error out or silently retarget a different document.

    MongoDB
  • Insert a document as JSON

    Pro

    The same panel opens in insert mode with a blank {} buffer; saving inserts the document, and Mongo generates the ObjectId when _id is omitted.

    MongoDB
  • Global search across collections

    Pro

    The database-wide search enumerates every collection in every non-system database, samples each to learn its field names, then matches with a case-insensitive escaped regex.

    MongoDB
  • Create and drop collections

    Pro

    The + button creates an empty collection (column definitions are ignored — a collection is schemaless), and the tree's Truncate deletes every document in one.

    MongoDB
  • CSV and JSON import into a collection

    Pro

    JSON documents are inserted as-is with insertMany; a headerless CSV is synthesized into col1…colN documents.

    MongoDB

Workspace & window

Tabs, split panes and per-connection sessions that survive a restart — an editor-shaped workspace rather than a single-table window.

27 features

  • Table tabs

    Free

    Every table you open becomes a tab in a horizontally scrolling strip. Click to switch, click the × or middle-click to close; tables and views carry distinct icons.

  • Tab context menu

    Free

    Right-click a tab for Pin/Unpin tab, Close, Close Others, Close to the Right and Close All. Entries that would be no-ops are hidden rather than greyed.

  • Pinned tabs

    Free

    Pinning moves a tab to the front of the strip in pin order and swaps its icon for a pin, while unpinned tabs keep their open order behind it.

  • Per-tab view state

    Free

    Each tab privately owns its search term, filters, sort, page, fetched rows, structure and uncommitted edits. Switching away parks that state and returning restores it exactly — a second tab can never reset the first one's view or drop its staged changes.

  • Close lands on the neighbour

    Free

    Closing the active tab focuses the tab to its right, or to its left if it was last; closing the final tab returns to the empty state. Closed tabs release their parked rows.

  • Split editor panes

    Free

    Split the active tab into a second pane to read two tables — or a table and a query — side by side, and split repeatedly into N vertical groups.

  • Active pane highlight

    Free

    Only the focused pane is live and editable and gets an inset ring; the others render as frozen read-only snapshots labelled "Click to focus & edit this pane". Clicking one swaps it in.

  • Panes get fresh edit buffers

    Free

    A newly split pane inherits the visible rows but starts with empty pending update, delete and insert buffers, so staged edits never leak between panes.

  • Session restore per connection

    Free

    Open tabs, the selected table, pinned tabs and the split layout are saved and restored the next time you connect to that database — including re-fetching each pane's rows so every pane shows data immediately.

  • Sessions reset when you retarget a connection

    Free

    The saved session is keyed by connection id plus its user@host:port/database identity, so pointing a connection at a different database starts clean instead of restoring tabs for tables that no longer exist — and pointing it back restores the old session.

  • Instant connection switching

    Free

    Switching back to a connection you already opened this session restores its schemas, expanded tree, tabs, rows, structure and search results from memory — no re-fetch, no reconnect wait.

  • Open-connections rail

    Free

    A left icon rail lists every connection open this session for one-click switching. It appears only once two or more are open, since with one there is nothing to switch between.

  • Searchable connection switcher

    Free

    A Switch button opens a modal listing saved connections filtered across name, host, database and group, in collapsible folders with counts, Active and Open badges, colour tags and pin markers.

  • Open a connection in its own window

    Free

    Move to New Window spawns a second app window that auto-connects to that database and lands straight in the workspace.

  • Sidebar collapse and drag-resize

    Free

    Hide the schema sidebar entirely, or drag the grab strip between it and the grid to resize it between 160 and 640px.

  • Empty workspace screen

    Free

    With no table open the editor area offers three quick actions — SQL query, Search all, Diagram — chips for your pinned tables, and a count of connected schemas.

  • Top progress loader

    Free

    An NProgress-style bar appears whenever anything is in flight — rows, schemas, structure, a running query or a connect — trickling toward 90% and snapping to 100% when work finishes.

  • Toast notifications

    Free

    Stacked success, error, info and warning toasts with a manual dismiss. They clear after 3 seconds, except errors, which linger for 6 so they can actually be read.

  • VS Code Dark+ theme

    Free

    A single hand-tuned dark theme — VS Code Dark+ crossed with TablePlus — with semantic colours for strings, numbers, keywords, NULLs, dates and PK/FK/index badges, plus thin themed scrollbars throughout.

  • Capability-aware toolbar

    Free

    The action row adapts to the engine: a SQL editor where SQL exists, an Aggregate console for document stores, and Search all, Diagram and Backup only where they are actually supported.

  • Responsive chrome

    Free

    Toolbar and footer buttons drop to icons on narrow windows, the search field absorbs leftover space, and the row-range readout truncates first.

  • Window close disconnects first

    Free

    Clicking the window's × while connected drops the connection and returns to the connections screen instead of quitting. The next close exits — so a stray ⌘W never kills a live session.

  • Single-instance lock

    Free

    A second launch — the installer's run-app, a desktop double-click, the post-update relaunch — focuses and un-minimizes the existing window instead of starting a rival process fighting over the same resources.

  • Drag the window from anywhere

    Free

    The whole page chrome is a drag region, so the window moves by dragging empty UI rather than hunting for a title bar.

  • Stale-connect protection

    Free

    Each connect takes a ticket re-checked after every await, so switching connections during a slow handshake makes the older attempt abandon quietly instead of writing its schemas and tabs into the connection you switched to.

  • Late results discarded

    Free

    A row fetch that lands after you have already switched tabs is dropped rather than overwriting the newly active tab's data.

  • Clean shutdown

    Free

    On quit every database pool is closed and the browser bridge is shut down so its port is free for the next launch. On macOS the app stays alive with all windows closed and re-creates one from the dock.

Plans, licensing & updates

A 30-day trial with no card, one licence across three hosts, and an updater that downloads in the background instead of blocking your work.

30 features

  • 30-day Pro trial, no credit card

    Free

    A first-run offer grants 30 days of full Pro against nothing but an email address. Skip it and you drop to Free with the gate never reappearing — the trial can still be started later from Account & License.

  • Free plan: 2 connections, 2 SQL tabs, read-only

    Free

    Free allows 2 saved connections and 2 concurrent SQL tabs, one filter condition, 100-row exports and the last 25 query-history entries, and browses without writing. Every blocked action explains itself and offers the upgrade rather than failing silently.

  • Pro: unlimited connections, tabs and history

    Free

    Pro removes the connection and SQL-tab caps entirely, unlocks multi-condition filters, raises exports to 10,000 rows and shows the whole query history.

  • SSL is free by design

    Free

    SSL connections are deliberately never gated. Managed PostgreSQL — Supabase, Neon, RDS — requires SSL, and gating it would stop Free users connecting to any cloud database at all.

  • Limits enforced in the main process, not the UI

    Free

    Every sensitive operation re-checks entitlement outside the interface layer, so a limit is a real limit rather than a hidden button — and raw SQL typed into the console is classified and gated the same way as the grid.

  • Licence key activation

    Free

    Paste a key in the Account or Upgrade dialog; the device is registered against your licence and the plan applies immediately. Activation errors surface the payment platform's own message rather than a generic failure.

  • Background re-validation every 6 hours

    Free

    Paid licences are re-checked shortly after launch and then every 6 hours, so a key refunded or disabled is picked up while the app is still open. Opening the Account dialog forces an immediate check.

  • 14-day offline grace period

    Free

    If the licence server is unreachable, the last-good state is kept for 14 days from the last successful check — so a flight, a VPN or an outage never locks you out of your own database client.

  • Move your seat between machines

    Free

    Deactivate on this device releases the seat and clears every local licence field. The Account dialog shows how many of your devices are active.

  • Licence key encrypted at rest and masked in the UI

    Free

    The key is stored encrypted with the OS keychain and the interface only ever shows a mask. The Copy button copies the decrypted key from the main process, so it never crosses into the UI layer.

  • Warning before activating during your free trial

    Free

    Entering a licence key while still on the 30-day trial does not silently burn it — the dialog shows the days remaining and offers Keep my trial or Activate anyway.

  • Region-aware pricing

    Free

    India sees native rupee pricing (₹99/month, ₹990/year) rather than a converted dollar price; everyone else sees $4/month or $39/year. Keys from either store activate — validation is store-agnostic.

  • Customer portal with a cross-store fallback

    Free

    Manage subscription opens your billing portal for payment method, invoices and cancellation, with a "view all orders" escape hatch that resolves orders from your sign-in email across every store.

  • Plan badge in the toolbar

    Free

    A pill shows exactly where you stand — a countdown while on trial, a crown when subscribed, and an Upgrade button on Free that opens the paywall directly.

  • Contextual paywall

    Free

    A blocked action opens the upgrade dialog carrying the reason for that specific block, next to the Pro feature list, both pricing cards and an inline activate-a-key box.

  • Background updates with cancel

    Free

    Updates download as a small progress pill while the app stays fully usable, with an × that cancels the transfer — not a blocking modal that leaves Task Manager as the only escape.

  • Optional and mandatory updates

    Free

    A release manifest marks an update mandatory by flag or by minimum version. Mandatory ones start downloading immediately; optional ones wait for an explicit Update now, and Later simply dismisses.

  • Silent install on restart, or on next quit

    Free

    Restart & install runs the installer in the background with no second wizard and relaunches the app. Choosing Later applies the already-downloaded update the next time you close it, rather than re-downloading.

  • Warning about uncommitted edits before an update restart

    Free

    If staged inserts, updates or deletes are pending when an update is ready, the dialog counts them and warns that restarting discards them.

  • Manual check for updates

    Free

    A button in the Account dialog forces a check and reports the outcome plainly — you are on the latest version, an update is available, or the feed could not be reached.

  • Local-first privacy

    Free

    The app connects directly from your machine to your databases; database contents never reach PgDeck servers. Credentials live in the OS keychain. The only outbound calls are the update feed, licence validation and a small anonymous usage ping.

  • Anonymous telemetry with a real opt-out

    Free

    Four events only — app opened, connection created, database connected and your first successful query — carrying an install id, app version and OS. No SQL text, connection details, host or database names, row data, emails or licence keys. Set PGDECK_TELEMETRY=0 to disable it entirely.

  • Windows, macOS and Linux builds

    Free

    A Windows x64 NSIS installer that installs per-user, lets you choose the directory and never deletes app data on uninstall; a macOS .dmg with hardened runtime; and a Linux AppImage.

  • Engineered download size

    Free

    Maximum-compression packaging plus a build step that strips roughly 37 MB of unused Chromium locale files, because every update is a full download for most users.

  • VS Code extension

    Free

    PgDeck Database Client runs the same app inside VS Code — an Activity Bar view and an Open Database Manager command — wiring credentials to VS Code Secret Storage and honouring the same licence.

  • Browser extension for Chrome, Edge and Firefox

    Free

    The same interface in the browser, with queries executing in the desktop app over a local-only bridge — because a browser page cannot open a TCP socket, and your passwords should not leave your machine to work around that.

  • Hardened loopback bridge

    Free

    Four non-optional gates on every bridge request: bind to 127.0.0.1 only, require a browser-extension origin so no website can reach it, require a loopback Host header to defeat DNS rebinding, and require a pairing token compared in constant time.

  • Pairing code with one-click rotation

    Free

    The desktop app shows the browser pairing code masked, with reveal and copy buttons and the loopback address it is listening on. New code unpairs every browser at once.

  • One licence across all three hosts

    Free

    Desktop, VS Code and browser share the same entitlement table and the same key — a Pro feature is Pro everywhere, and a Free user is gated identically everywhere.

  • Terms acceptance that survives updates

    Free

    The EULA gate is recorded outside browser storage precisely because the Windows updater force-kills the app — so accepting once means accepting once, not once per update.

Keyboard reference

All 60 shortcuts

Keys render for your platform automatically — ⌘ on macOS, Ctrl on Windows and Linux. PgDeck has no native menu bar, so every binding below is wired by the app itself, including the ones that deliberately override the browser defaults.

60 shortcuts

Global

Work anywhere in the workspace window.

Ctrl+W

Close the active tab

The active SQL tab if one is open, otherwise the current table tab.

Ctrl+R

Refresh the open table's rows

Deliberately overrides the browser reload, so it can never wipe your workspace.

Ctrl+Shift+R

Reload everything — schemas, tables, rows and structure

For DDL made in the SQL console or from another client.

Ctrl+Shift+F

Focus and select the Search in table box

Ctrl+F

Toggle the filter bar

Data tab only.

Ctrl++

Zoom the whole UI in

Also =, and numpad +. Clamped at +5.

Ctrl+-

Zoom the whole UI out

Also numpad −. Clamped at −5.

Ctrl+0

Reset zoom to 100%

Also numpad 0.

Data grid — selection & navigation

Click

Select a row and focus the clicked cell

Ctrl+Click

Toggle a row in or out of the selection

Shift+Click

Select a contiguous range from the anchor row

Ctrl+A

Select every row loaded in the open table

Esc

Clear the row selection

Right-click

Open the cell menu — copy, quick filter, set value, row actions

Drag

Resize a column by its header divider

60px minimum width.

Data grid — editing

Base tables only, on a plan with editing enabled.

Double-click

Open the inline editor on a cellPro

F2

Edit the focused cellPro

Enter

Edit the focused cellPro

Identical to F2.

Ctrl+I

Add a blank draft rowPro

Insert does the same.

Insert

Add a blank draft rowPro

Ctrl+D

Duplicate the focused row into a new draftPro

Key and identity columns are left blank so the database regenerates them.

Del

Stage-delete the selected rows, or the focused rowPro

Press again on the same rows to un-stage.

Ctrl+S

Commit every staged change in one transactionPro

Ctrl+Z

Discard every uncommitted staged edit, insert and deletePro

Only fires when something is staged; inside a cell editor the input keeps its own native undo.

Cell & value editors

Enter

Commit the open cell editor and stage the change

Esc

Cancel the edit without staging anything

Tab

Commit and leave the editor

Clicking away commits too — Escape is the only way to abandon an edit.

Ctrl+Enter

Save and close the Quick Look value editorPro

SQL editor

Ctrl+Enter

Run the query

Runs only the highlighted text if there is a selection, otherwise the whole tab.

Ctrl+W

Close the active SQL tab

Enter

Save the query under the typed namePro

In the Save query dialog; a no-op while the name is blank.

Ctrl+Enter

Run the MongoDB find filter or aggregation pipeline

In the Aggregate console — the Run button is labelled ⌘⏎.

Search & filter

Ctrl+Shift+F

Focus and select the in-table search box

Enter

Run the in-table search

With the search box focused.

Esc

Clear the search box, and the applied search term with it

With the search box focused.

Ctrl+F

Toggle the filter bar

Data tab only.

Enter

Apply the filter conditions

From a condition's value input; refetches from the first page.

Enter

Run the database-wide searchPro

In the global search field, which autofocuses on open.

Double-click

Open a search hit in its table, filtered to that one recordPro

Structure tab

Base tables only; the edit actions themselves need a plan with schema editing.

Double-click

Edit a column's Name or Default cell inlinePro

Enter

Commit the inline column editPro

An unchanged value fires no DDL at all.

Esc

Cancel the inline edit without running anything

Enter

Add the drafted column, or create the drafted indexPro

Esc

Discard the add-column or add-index draft row

Right-click

Open the column menu — set default, change type, drop column

Tabs, tree & panes

Middle-click

Close a table tab

Right-click

Open the tab menu — pin, close, close others, close to the right, close all

Right-click

Open the sidebar table menu — open, structure, copy name, pin, import, export, truncate, delete

Esc

Dismiss any open context menu

Click

Focus an inactive split pane and make it the editable one

ERD diagram

Requires a plan with the relationship diagram.

Ctrl+Scroll

Zoom the diagram around the cursorPro

Trackpad pinch does the same.

Scroll

Pan the diagram canvasPro

Drag

Move a table box by its headerPro

Double-click

Close the diagram and open that tablePro

On a table's header.

Connections & dialogs

Right-click

Open the connection or group menu — connect, edit, duplicate, pin, delete

Double-click

Open the new-connection form for a driver tile

Ctrl+V

Paste a connection string into the URL import box

The explicit fallback when clipboard access is blocked.

Enter

Submit from a dialog text input

Start the trial, activate a licence, save a group name, save a query name.

Esc

Close the open dialog

Not the terms gate, the pending-changes review, or an update prompt — those need a deliberate choice.

Tab

Cycle focus inside the open dialog

Shift+Tab goes backwards; focus is trapped in the dialog.

Plans

What Free includes, and what Pro adds

Free is a real client, not a countdown — browse, search, filter, sort and export without an account. Pro unlocks writing, schema tools and the heavier workflows. Every new install starts with 30 days of Pro, no card required.

CapabilityFreePro
Saved connections2Unlimited
Concurrent SQL tabs2Unlimited
Browse, search, sort and filter dataIncludedIncluded
SSL / TLS connectionsIncludedIncluded
Filter conditions per view1Unlimited
Export rows per file10010,000
Query history entries shown25Unlimited
Edit, insert and delete rowsNot includedIncluded
Schema editing — columns, indexes, constraints, triggersNot includedIncluded
Saved queriesNot includedIncluded
CSV / JSON / SQL importNot includedIncluded
SSH tunnelsNot includedIncluded
Database-wide search and replaceNot includedIncluded
ERD relationship diagramNot includedIncluded
Backup and restoreNot includedIncluded

Limits are enforced by the app process, not just the interface — so raw SQL typed into the console is checked against your plan the same way the grid is.

Try the whole list for 30 days

Every feature on this page, unlocked for 30 days on a fresh install. No credit card, no account — just an email address, and you can skip that too and stay on Free.