Added
- MongoDB filters on nested and array-element fields, with any-element and same-element matching and type-aware values. (#2315)
- Back and Forward through a tab's browse history, on
Ctrl+Cmd+[andCtrl+Cmd+]. (#2316) - Drag to reorder editor tabs, with Move Tab Left and Move Tab Right on the tab's menu.
- Result tabs named after the statement that produced them; picking one moves the editor cursor to it. (#2280)
- Statement navigation on
Ctrl+Cmd+Left,Ctrl+Cmd+Right,Ctrl+Cmd+Enter,Option+Shift+UpandOption+Shift+Down. (#2279) - Swipe left on a saved connection in the welcome window for Edit and Delete. (#2310)
- Current-statement highlight and a per-statement run button in the editor gutter. (#2278)
- Notifications when a long-running query, import, export, backup or save finishes in the background. (#2265)
- Code folding in the SQL editor, the DDL and trigger views, the import preview, the AI review sheet, chat code blocks and the JSON viewer.
Cmd+Ffind bar over table results, with Search All Rows for a server-side match.- Native bar, line, area and scatter charts over query results. Starter feature.
- Redis Sentinel and Redis Cluster connection modes. (#1021)
- DuckDB connections can open a Parquet, CSV, TSV, JSON or NDJSON file read-only.
- Korean localization for macOS, iPhone and iPad. (#2219, #2264)
- Help > Acknowledgements, listing the 38 bundled open source libraries with their licenses.
- Plugins signed by a third-party Apple Developer ID install after you trust the developer by name.
- Local hash-chained execution log of every authorized database operation, with statements stored as digests.
- A minimum Safe Mode level enforceable through a macOS configuration profile.
- Execute All Statements in the Execute button's menu. (#2230)
- Double-click or
Returnon a table keeps its tab instead of reusing the preview tab. (#2235) - View > Result View switches the results pane between Data, Structure, JSON and Chart.
- MCP: the 2026-07-28 protocol revision, with the two previous revisions still supported.
- MCP: server discovery in one call, naming protocol versions and capabilities.
- MCP: cache lifetimes on tool, prompt and resource listings.
- MCP: 27 new tools, covering schema metadata, query plans, row counts and statistics, users and grants, sessions, paginated browsing, inserts, transactions and DDL.
- MCP: prompt templates built from the live schema, for explaining a schema, writing SQL, reviewing a query, proposing indexes, writing a migration, auditing data quality and summarizing a period.
- MCP: argument completion from a connection's real tables, databases, schemas and columns.
- MCP: change notifications over a single long-lived stream.
- MCP: destructive statements can be confirmed in the client.
- MCP: progress updates from a long-running tool call reach the client.
Changed
- The results status bar was rebuilt: one fixed height, the row count on the left, controls that keep their place while a table loads, and Add Row moved to the toolbar.
- Row counts and number grouping read correctly in every language.
- The row count reflects what the grid is showing, and stays on screen for an empty result.
- The rows-per-page menu accepts a locale-formatted number and states the range it takes.
- An estimated row total is marked as an estimate, and Last and All rows wait for Count Exactly.
Cmd+Fon a table tab opens the find bar; the filter panel keepsCmd+Option+F.- Find Next and Find Previous work on the data grid.
- The JSON and PHP tree filters ignore accents, so
cafefindscafé. (#2204) - Picking a database in the connections strip returns you to the tab you last used in it. (#2217)
- Tabs showing same-named objects from different databases carry the database in their name. (#2217)
- Save in the unsaved-changes prompt closes what you asked to close once the save lands.
- A column value filter survives switching result mode and switching tabs. (#2251)
- The connection form's Browse button offers only the file kinds the driver opens.
- The iOS Shortcuts documentation states which app build each action needs.
- TablePro is built in the Swift 6 language mode, across the app, both mobile apps, all 31 plugins and the shared packages.
Removed
- MCP remote access. The server binds to this Mac only.
Fixed
- Forward slashes inside a nested object or array value are no longer escaped as
\/in the JSON view and the right sidebar. (#2322) - A MongoDB filter TablePro cannot translate matches nothing instead of the whole collection. (#2315)
- The raw filter row works on MongoDB, and reads Raw Filter on databases that do not speak SQL. (#2315)
- Match Case applies to text fields only, so turning it off no longer breaks a MongoDB number, date or ObjectId filter. (#2315)
- Preview Referenced Row from the Query menu reads the cell you focused instead of counting columns from the left.
- Preview Referenced Row works on SQL Server, and on iPhone and iPad on SQL Server and Oracle.
- Open Quickly no longer draws a rectangular outline around its Liquid Glass surface on macOS 26 and later. (#2321)
- Skip and Continue keeps going after an unreadable line in a JSON import.
- An import no longer counts rows it dropped because they matched no mapped column.
- Retrying an import of a compressed
.sqlfile no longer leaves the expanded copy behind. - Importing into a new table can be retried, reusing and clearing the table the failed attempt created.
- The SQL import dialog no longer offers CSV and JSON in its format picker.
- Import and export result alerts stay on screen instead of closing with the progress sheet. (#2314)
- A failed import reports its line number, statement and server message instead of only the rollback error. (#2314)
- The failed statement list is copyable again, with Copy Details on both alerts.
- TablePro stays out of the Dock and the app switcher when an MCP client starts it.
- A confirmation TablePro cannot attach to a window comes to the front instead of waiting behind other apps.
- Settings > Integrations reports a running MCP server even when Enable MCP Server is off.
- Deleting a connection with saved queries always warns that they go with it. (#2310)
- Deleting a connection you published to the Team Library no longer deletes your local copy instead.
- Connections in a linked folder or the Team Library open on double-click and on
Return. - A connection whose deletion could not be saved no longer vanishes until the next launch.
- Select All,
Ctrl+JandCtrl+Kno longer skip favorited connections outside a group. - A column whose cells carry an action button no longer cuts its value short, and late-arriving enum, set and foreign key metadata widens it. (#2303)
- Size to Fit and double-clicking a column edge measure the loaded page instead of about 30 rows of it. (#2303)
- 235 Turkish strings that were marked as translated but still held English now read in Turkish.
- A transaction that failed on commit says so instead of blaming the last statement that worked. (#2280)
- Opening an Oracle connection for the first time no longer leaves the object list spinning forever. (#2294)
- An object list that cannot load says so and offers Retry instead of retrying silently every 15 seconds. (#2294)
- A metadata connection whose startup commands stall gives up after a minute and reports it.
- Oracle reports a connection that dropped during setup as failed, and closes a connection it gave up on. Needs the updated Oracle plugin.
- iOS: a DuckDB contains filter matches case-insensitively, and offers the case sensitivity control.
- Deleting a connection removes its saved queries and their folders from iCloud too.
- A database type is drawn in the colour its own plugin declares everywhere, instead of two tables that disagreed on 12 of 23 types.
- Save on the unsaved-changes prompt applies staged structure edits from any view, and leaves the tab open when the save is refused, cancelled or rejected.
- Opening one table in two tabs gives each tab its own structure editor, sub-tab, filter and sort.
- Clicking another table in the object browser no longer silently discards staged structure edits.
- Switching between two structure or Create Table tabs no longer leaves the incoming tab's buttons dead.
- Twelve commands spell their trailing ellipsis the way macOS does, in the menu bar and the context menu alike.
- A
BEGIN ... ENDbody runs whole from the editor instead of being split at every semicolon inside it. (#2278) - A semicolon inside a MySQL
#comment is no longer read as a statement boundary. (#2278) - A failed refresh no longer empties the stored procedure and function lists.
- Switching to a PostgreSQL database you cannot open reports the failure and leaves the connection where it was.
- Plugins from the registry are notarized, so Gatekeeper stops blocking them. Every plugin needs to be published again to pick this up.
- Installing a plugin from a ZIP clears the quarantine flag from the whole bundle, not only its top level.
- DuckDB lists its databases, schemas, tables and columns on a Mac that cannot reach the internet. (#2285)
- A DuckDB UUID, ENUM, list, struct, map or time zone aware timestamp column no longer crashes TablePro.
- A DuckDB view opens as
CREATE OR REPLACE VIEWinstead of two statements spliced together. - Switching DuckDB database by a name differing only in capitalisation lists that database's objects.
- A DuckDB connection that fails after opening the file releases it instead of locking it until quit.
- A DuckDB connection that opens a file but reports no catalog fails with that reason.
- A mistyped Parquet or CSV path says the file is missing instead of creating an empty database.
- A new DuckDB connection can be saved; the form no longer requires a database name it offered no field for.
- Opening a table on Dameng, Oracle, BigQuery, Elasticsearch and etcd no longer puts up a Switch Failed alert. (#2262)
- Switching schema on Dameng, Oracle, BigQuery, Snowflake and Trino re-reads only the routines instead of the whole object list. (#2262)
- Open Quickly lists each schema once on Dameng, Oracle and BigQuery.
- The Settings window is titled after the pane you are on, and refuses to be resized smaller than a pane can draw.
- Redis Sentinel and Cluster connections show their nodes in the connection list instead of the word Redis alone.
- Redis Cluster routes
OBJECT,MEMORY,SORT,GEORADIUS,ZUNIONSTOREandZINTERSTOREto the right shard on Redis 6, where the fallback routing table disagreed with the server on 32 counts. - Redis reports what the server actually answered instead of clearing a refused write from the grid.
SET key value KEEPTTLkeeps the expiry, and SET options TablePro does not model are sent to the server untouched.- A Redis command whose reply timed out is re-sent only when it provably never reached the server.
- A Redis
SCANthat returns an error reports it instead of showing an empty keyspace. - Floating point values show the shortest digits that identify the stored number exactly, on MongoDB, Elasticsearch, ClickHouse, Snowflake, DynamoDB, Beancount and JSON import.
- A 32-bit float bound as a query parameter keeps its own precision, and a value that is not a real number binds as null.
- Editing a MongoDB row keeps each field's stored type, decimals and 64-bit integers included, at any nesting depth.
- MQL export writes very large and very small numbers as numbers instead of quoted strings.
- A nested value too long to show in full is no longer written back or exported as a fragment.
- Dameng results are complete instead of stopping at the server's first 32KB batch. (#2262)
- Dameng tables with a
CLOBorBLOBcolumn read the right columns, rows and values. (#2262) - Creating a Dameng table works when it has an index or a column comment, and so does changing a column's name and type at once. (#2262)
- Column comments show up on Dameng tables in a schema not named after its owner. (#2262)
- Dameng connections recover after a query is stopped instead of failing every statement for up to 30 seconds. (#2262)
- Query Insights keeps each aggregate's query text and error inside the selected connection, source and date range. (#2268)
- A plugin's own connection fields reach the connection form, so Redis gets its Key Separator field and its ElastiCache IAM section. (#1021)
- A connection that lists its servers in a host list works over an SSH tunnel, MongoDB replica sets included.
- A rows-per-page value large enough to overflow no longer crashes TablePro.
- Changing rows-per-page on any page but the first no longer strands you on a mislabelled page.
- Rows past a driver's row-count estimate are reachable.
- All rows loads all of them instead of the estimated number.
- Turning a page while Count Exactly is running no longer leaves a spinner that never stops.
- A page number typed for one tab is no longer applied to another.
- A table shows the range it actually loaded rather than its estimate.
- A fresh query tab no longer shows a sliver of a status bar that jumps to full height on the first run.
- VoiceOver reads the applied filter count on the Filters button and skips the status bar's separator dots.
- JSON result mode shows the rows the grid is showing, in the same order, and resolves a selection to that same row. (#2251)
- Rows marked for deletion no longer appear in JSON result mode, and the count line says how many are held back. (#2251)
- Editing a cell in a result you clicked back to writes to that result's own table.
- A result whose table TablePro cannot identify no longer looks editable.
- Running several statements no longer carries the previous run's primary key over to the new table.
- Column details that arrive after a query land on the result that asked for them.
- Editing a field in the row inspector obeys the same rules as the grid.
- Rows loaded by Fetch All stay with the result they were loaded for.
- Switching between results asks before discarding unsaved edits.
- Every restored tab hides the columns you hid for its table, not just the tab that was in front.
- A query tab reopens with the caret where you left it, on every tab rather than the front one.
- Restored tabs keep their sort and page number, not just the tab that was in front.
- A restored tab reopens on the rows it was showing, because the page number is saved with its page size.
- Scrolling a result with hundreds of columns is no longer slow; only the columns near the viewport are built. (#1219)
- A column you hid keeps its place in the column order.
- A row you are inserting shows empty values in JSON mode instead of TablePro's internal marker.
Cmd+Fno longer opens a find bar in JSON result mode, where it could never match. (#2244)- The Filters button and
Cmd+Option+Fopen the filter panel in JSON result mode. (#2244) - Add Row, Duplicate Row, Paste and Delete no longer collapse the JSON view to the row they touched. (#2244)
- The date picker on an empty date or timestamp cell starts at your own clock and writes your own time. (#2241)
- A time value carrying a UTC offset follows your chosen date format instead of showing as raw text. (#2241)
- Open in New Tab opens a second tab for a table that is already open. (#2235)
- Following a foreign key into a new tab no longer overwrites the filters on a tab already showing that table.
- Opening a table from the sidebar while the object list is still loading opens it.
- Opening a table from Favorites gives it a tab of its own.
- A Cloud SQL Auth Proxy or Cloudflare tunnel that fails to start reports the last thing it said.
- The Cloud SQL Auth Proxy and the Copilot language server are checked against their pinned version and digest on every start, and reinstalled when either no longer matches.
- Editing a connection keeps its favorite mark, its place in the list, and its always-allowed AI tools.
- MongoDB, Cassandra and Trino connections can name a database, keyspace or catalog in the connection form. (#2234)
- Sorting a column keeps working after you hide or show columns. (#2234)
- Hide All hides every column of a MongoDB collection, fields that appear only in later documents included. (#2234)
- Opening a
.sqlfile that is already open shows its tab instead of replacing what you typed in it. - A
.sqltab reopened from Recently Closed knows it has unsaved edits. - Table maintenance from the object browser runs against the database the table you picked lives in.
- A table that exists in two databases can be opened in both. (#2217)
- Server Dashboard, Users & Roles, Query Insights, ER Diagram and a linked SQL file select the tab they already opened. (#2217)
- The empty Favorites sidebar fits its width on macOS 15 instead of running past both edges.
- Table favorites and saved queries sync through iCloud; their record types had never been created in the schema.
- An SSH profile that uses a jump host syncs.
- A connection carries its favorite mark, every tag, and its AI rules and always-allowed tools to your other Macs.
- iOS: a connection's query timeout syncs instead of being dropped on upload.
- The inspector button stays at the right end of the toolbar when the inspector is open.
- The Tables and Favorites switch keeps following the sidebar after you open Customize Toolbar.
- Refresh, New Tab, Open Quickly, Export, Database, Results and Dashboard are dimmed in the toolbar's overflow menu when they cannot run.
- iOS: a value containing a backslash, a newline or a carriage return is stored as you typed it on PostgreSQL, Redshift, SQL Server, SQLite, DuckDB and Oracle.
- iOS: PostgreSQL sessions set
standard_conforming_stringson. - iOS: Add Row to Table and Add Rows to Table write to the database or schema you picked in Shortcuts.
- iOS: all three Shortcuts actions are found by searching TablePro, and are grouped under Database.
Cmd+Wcloses the Settings and Integrations windows, the JSON and PHP viewers, the connection form and the column inspector.- The File menu names the close command after what it will close.
- A JSON or PHP tree filter reveals nested matches, searches the whole of a long value, keeps rows expanded, and says when it finds nothing. (#2204)
- Copy Value on a JSON object or array copies that part of the document instead of a summary. (#2204)
- Closing a tab holding unsaved cell edits,
.sqlchanges, staged structure changes or staged user and role changes asks before discarding them. - A tab with unsaved cell edits shows the unsaved dot.
- Closing a tab no longer leaves its unsaved cell edits loaded behind it.
- A
.sqlfile opened from a linked favorite can be opened again after its tab is closed. - Staged structure changes and a table definition in progress survive switching tabs, and switching a table tab between Data and Structure.
- Timestamps written with a space before the offset, or with fractional seconds, follow your chosen date format.
- Switching connection no longer empties the SQL editor or kills its undo, highlighting, shortcuts and Vim mode. (#2236)
Security
- A read-only MCP token can no longer run a statement that writes; an unrecognized statement is treated as a write, and statements that reach the filesystem or run a program are refused.
- Safe Mode confirms MCP writes instead of pre-clearing them.
- A token limited to some connections no longer sees the names, hosts, ports and usernames of the others.
- With authentication off, a local caller is read-only and cannot administer anything.
- The activity log records the calling token, stores statements as digests, is hash chained, and is no longer readable by other accounts on the Mac.
- Repeated bad tokens are rate limited, requests with no credentials included.
- A pairing link is verified and its destination shown before you approve it, a failed exchange burns its code, and approving no longer revokes an unrelated token of the same name.
- A malformed cancellation message no longer crashes the app.
- An MCP session identifier is no longer usable as a credential.
- Secrets belonging to separately distributed drivers are stored in the Keychain and stripped from exported connections. Existing values move to the Keychain on the next save.