Added
- VoiceOver navigation of the ER diagram, table by table and column by column, with each table's joins. (#2692)
- Column type, nullability and default changes for SQLite, libSQL and Cloudflare D1, checked against dependent objects.
- Column rename and drop alongside a foreign key change in one save.
- Foreign key add, remove and edit for SQLite, libSQL and Cloudflare D1, applied as a reviewed table rebuild.
- Real constraint names for SQLite foreign keys, in place of a positional placeholder.
- Menus of the connection's own tables and columns for a foreign key's Columns, Ref Table and Ref Columns.
- The reason Create Table is unavailable, next to the button.
- Menu of the engine's own default values on the Structure tab's Default cell, including a Custom editor. (#2688)
- Row-number gutter held at the left edge of the data grid when the table is scrolled sideways. (#2664)
Shift+Spaceto widen the grid selection to every row it touches. (#2664)- Table name proposed from the file name when an import creates the table, with a warning when the name is taken.
- Copy To across database engines, with every type approximation listed before the copy runs. (#1491)
- Per-table
WHEREand row limit in Copy To. (#1491) - Server-side
INSERT … SELECTwhen a copy's two sides are one connection. (#1491) - Tunnel Command transport, with
kubectl port-forwardandaws ssm start-sessionpresets. (#2520) - Bar chart column in the EXPLAIN tree, with a Metric menu for self cost, self time and row counts. (#2633)
- Database type change from inside the connection editor.
- The reason Save is unavailable, next to the Save button in the connection editor.
- Approval setting for MCP connection access, with the list of approved connections and a Forget action. (#2640)
- Typesense driver plugin, with collection browsing, document editing and a REST request console. (#2629)
- Export, Delete and Empty for a Typesense collection. (#2629)
- Typesense API keys in Users & Roles, with the collections and actions each key holds. (#2629)
- Server Dashboard metrics for Typesense, from
/metrics.jsonand/stats.json. (#2629) - Encoding and byte order mark options for CSV export, with a warning naming what the encoding dropped. (#2534)
- Indexes in an SQL export, written after the data. (#2492)
- Image preview beside the source for a cell holding SVG or a raster image. (#2535)
- DuckDB backup and restore, as one
.duckdbfile or a folder of Parquet. (#2485) - Table picker in Backup Dump, everything selected by default. (#2485)
- Backup of several databases into one folder, one file each. (#2485)
- Back Up… on a database selection in the connection tree. (#2485)
- Assistant as its own pane, with View > Show Assistant and
Cmd+Option+A. - Inspector fields with the column name and type on one line and the value at full width below.
- A BLOB too large to edit whole marked read-only in the inspector, in place of an editable first 10 KB.
- Always-visible value menu on every inspector field, with
Ctrl+Option+Nfor NULL andCtrl+Option+Dfor DEFAULT. - Tab and Shift+Tab between inspector fields.
- Field search and an edited-fields-only filter in the inspector.
- Table and row position at the top of the inspector.
- Safe Mode, Session Context and Schema submenus in the Database menu.
- Show Tables and Show Favorites in the View menu.
- Running indicator on the editor tab whose query is executing.
- Sort direction setting for the data grid, applied to the default row sort and the first header click. (#2665)
- Transport activity for an SSH tunnel or SOCKS proxy: throughput in the toolbar, bytes in the connection switcher.
- Release File Lock on the Database menu and the connections strip, for a DuckDB connection. (#2518)
- Per-connection idle release for DuckDB and MySQL, after a set number of idle minutes. (#2518)
- Open the File Read-Only option for DuckDB, letting several processes share one file. (#2518)
Changed
- Zoom ladder for both diagrams, stepping 5, 10, 25, 33, 50, 67, 75, 100, 150, 200 and 300 per cent. (#2692)
- Fit to Window at whatever scale the diagram needs, instead of stopping at 25%. (#2692)
- Connection editor rebuilt around a four-section sidebar, in place of up to eleven panes.
- One Connect via picker for the five transports, in place of five Enable switches.
- Save, Cancel and Test Connection on a bottom action bar instead of the titlebar.
Use ~/.pgpassbelow Username rather than above it.- Tab moves focus out of Startup Commands and Pre-Connect Script instead of inserting a tab.
- SQL export writes a materialized view's indexes once the view exists. (#2492)
- Backup Dump as one sheet with scope, format and destination, in place of a picker with a save panel over it. (#2485)
- Inspector shows the selected row as Fields or JSON, with AI Chat moved out of its tab strip.
- Structured inspector values expand in place instead of replacing the whole pane.
- Object tree context menu regrouped into four groups by intent, with the connection-wide commands off object rows.
- Back available with unsaved edits, asking to discard them, in place of standing down until they were saved.
- View Options as a control in the sidebar's filter row, in place of an entry on every context menu.
- View ER Diagram and New View on the object tree's empty-area menu only.
- Keyboard shortcuts shown on sidebar context menu items that have a menu bar equivalent.
- Toolbar rebuilt around five icon-only groups, with a centred connection and container control.
- Query duration and Stop in the results status bar, in place of the centred toolbar readout.
- Safe Mode as a toolbar menu whose icon follows the level.
- Window subtitle dropped, with the container named in the toolbar instead.
- Toolbar arrangements reset once, to the new default set.
Fixed
- Half the ER diagram left unpainted at its fit-to-window zoom, and the query plan's arrows gone below 50%. (#2692)
- A table's relationship with itself drawn underneath the table, hiding a
manager_idstyle foreign key. (#2692) - Table dragged past the ER diagram's top-left corner disappearing, with the position saved. (#2692)
- ER diagram back at 100% in the top-left corner after leaving its editor tab and returning. (#2692)
- "Unsupported schema operation" when adding a foreign key to a SQLite, libSQL or Cloudflare D1 table.
- Add and Remove offered on the Foreign Keys tab for engines that cannot edit foreign keys.
- Incomplete foreign keys, indexes and columns reaching the database on Save.
- Rows silently renumbered by a SQLite column reorder on a table with no integer primary key.
- A modified index or foreign key re-created before the columns it covers are added.
- Condition dropped from an index added on SQLite, libSQL and Cloudflare D1, turning a partial index into a full one.
- Foreign keys and indexes dropped from a new table when their name was left blank.
- Foreign keys never created with a new table on Snowflake and Teradata.
- Indexes never created with a new table on SQLite, libSQL, Cloudflare D1, ClickHouse, Snowflake, Trino and Teradata.
- Constraint name discarded from a foreign key on SQLite, libSQL and Cloudflare D1.
- Invalid
REFERENCES table ()from a foreign key that named no referenced columns. - Referential actions the engine rejects offered on the Foreign Keys tab.
- Foreign key resolved against the wrong schema on SQL Server.
- Auto-increment column not made the primary key on SQLite.
- Create Table tab closed without a prompt when it held only indexes or foreign keys.
Cmd+Zdoing nothing in the Create Table tab.- Column defaults quoted into string literals, from
gen_random_uuid()toNOW()tonextval(...). (#2688) - A MySQL expression default rewritten as a string on any edit to the same column. (#2688)
- A ClickHouse MATERIALIZED or ALIAS column turned into a plain DEFAULT column by an edit to its comment. (#2688)
- Default and Auto Inc cells on Cassandra and ScyllaDB, which CQL has no way to express. (#2688)
- Default cell on Trino, whose generated DDL never carried one. (#2688)
- Column defaults exported from an ER diagram as quoted strings, including
SYSDATEandX'0102'. (#2688) - MySQL numeric,
BITand binary defaults quoted, which rejectedb'1'and turned0x61into text. (#2688) DEFAULT CURRENT_TIMESTAMPread back from MySQL 8 as(CURRENT_TIMESTAMP). (#2688)- An expression default written without the parentheses MySQL requires, on a copy from MariaDB. (#2688)
- A bare keyword default such as
session_usercarried unquoted into a copy to another engine. (#2688) - Missing default badge in the enum cell menu on MySQL. (#2688)
- SQL Server dropping a column's
DEFAULTconstraint on a type or nullability change and never re-adding it. (#2688) - A ClickHouse MATERIALIZED, EPHEMERAL or ALIAS column converted by setting a default on it. (#2688)
%hand the other~/.ssh/configtokens reaching the connection as literal text. (#2687)- Trailing comments on a
~/.ssh/configline kept as part of the value. (#2687) Hostblocks matched against a substitutedHostNamerather than the host as typed. (#2687)%pand%rleft unexpanded in aMatch execcommand. (#2687)Match !hostand the other negatedMatchcriteria matching every host. (#2687)Includelines naming more than one file reading none of them. (#2687)Includeinside aHostblock applying to every connection. (#2687)- The same file included from a second
Hostblock contributing nothing. (#2687) Match finaloverriding values earlier blocks had already set. (#2687)IdentityFileentries from earlier blocks dropped by a laterMatchblock. (#2687)- Comma-separated
Hostpatterns treated as a list, whichMatch hostalone accepts. (#2687) - A
Match execcommand that ignoresSIGTERMhanging the connection. (#2687) - Whole-result copy after Select All ignoring the 50,000-row clipboard limit. (#2667)
- Row-gutter geometry observer left registered every time a data grid was rebuilt. (#2667)
- A jump host's own
ProxyJumpnot being followed, leaving a chained bastion unreachable. (#2687) - The SSH server and jump hosts missing from the confirmation for a database link. (#2687)
- The SSH username and jump hosts missing from the connection import sheet. (#2687)
- Unsaved cell edits discarded without asking when a column was hidden, shown or reset. (#2667)
- Edited values left on screen with nothing tracking them after discarding to change a value filter. (#2667)
- Discard prompt on applying a value filter that changes nothing. (#2667)
- Unsaved cell edits following the row that took their place after a per-column value filter changed. (#2667)
- Undone cell edits coming back after switching tabs. (#2667)
- Find bar showing another tab's search term, over this tab's match count. (#2667)
- Cell selection cleared by Select All. (#2667)
- Scroll and accessibility observers left registered every time a data grid was rebuilt. (#2667)
- Grid row and cell selection lost on switching editor tabs, result view modes, or moving a tab to a new window. (#2667)
- Connection and database choosers opening between the two toolbar capsules instead of under the one that was pressed.
- Raw DuckDB driver text in place of the name of the app holding a locked database file. (#2518)
- DuckDB instance and its worker threads leaked by every failed remote connection attempt.
- MySQL statement replayed outside the transaction it was run in after the server dropped the connection.
- Query timeout lost after a MySQL reconnect.
- Toolbar commands pushed into the overflow menu at 1200pt by a centred item that could not shrink.
- Container chooser opening over a session the health monitor had given up on.
- No way to change a Snowflake warehouse or role once the window narrowed enough to clip the connection group.
- Blank Connection and Status tiles in Customize Toolbar.
- Stop advertising the old key after Cancel Query was rebound.
- Row count and row inspector reporting one row while Delete and Copy act on every row a cell drag covers.
- Cell selection collapsing to the first column or the first row when a drag left the grid past the last one.
- Cell selection, copy and paste using columns the pointer never crossed once a column had been reordered or hidden.
- Default row sort drawn on a column header as though it had been clicked.
- First click on an already default-sorted column skipping straight to descending.
- Don't Sort undone by the default row sort on the next load of the table.
- Sort fired by a column-header drag the user dropped back where it started.
- Shift-clicked second sort column lost when the tab was reused for another table.
- Saved sort dropped on relaunch when its column was hidden.
- Sort marker moved onto another column after a query returned different columns.
- Sorted column silent to VoiceOver.
- Sort chevron left on a column after Cancel on Discard Unsaved Changes.
- Move Column Up and Down dimmed on the Structure tab after Don't Sort.
- Order lost by an MCP
browse_tablesorting on a column outside itscolumnslist. - Query Live Activity still counting up on the iOS Lock Screen and Dynamic Island after the app was quit mid-query.
- Stop leaving an iOS MySQL or Redis query running, with the spinner and the Live Activity stuck behind it.
- A stopped iOS query recorded in Query History as successful, including a write that streamed no rows.
- Query Live Activity marked interrupted while an iOS query longer than five minutes was still running.
- Connection screen stuck on Connecting for good after a cancelled connect on iPhone and iPad.
- Edited connection host, port or credentials ignored until relaunch on iPhone and iPad.
- SSH tunnel handshake with no timeout on iPhone and iPad, against a server that accepts TCP and then stalls.
- Export and Transfer To preselecting a same-named table from another schema, or nothing at all.
- Delete queuing a table drop from the menu bar with none of the confirmation the sidebar asks for.
- Truncate Table offered from the menu bar for a view, which the server then refuses.
- Truncate offered on a sidebar selection that mixes a table with a view.
- Import sheet clearing a table without confirmation on a connection set to confirm destructive statements.
- Empty destination table picker in the import sheet, with no message and no retry, when the table list failed.
- Connection with two transports enabled reaching the database directly, with neither transport applied.
- Object list unchanged after toggling Show object icons or Show object comments in Settings.
- Delete Connection missing from the connection editor since 0.39.0.
- Continue dimmed after filtering the database chooser down to one driver.
- Down arrow not reaching the list from the database chooser's search field.
- VoiceOver reading a database chooser row's icon before the driver's name.
- Animations that played through the Reduce Motion setting when removing a jump host or copying DDL or a query plan.
- Icon-only controls with no VoiceOver name or tooltip in the date picker, row inspector and slash command settings.
- Inspector picker reading NULL after setting a value on a NULL column, including on every new row.
- Edits typed into a hidden inspector field while the JSON view is showing, committed by a later save.
- Set NULL, Set DEFAULT, Set EMPTY and SQL functions offered on a PHP-serialized field they cannot round-trip.
- Reconnecting or switching connection replacing a connection's remembered Inspector or Assistant choice.
- Assistant staying on screen and usable after AI features are turned off.
- Inspector opening in place of a remembered Assistant when a connection restores its session.
- Auto-show inspector on row select closing the Assistant on every grid click.
- Explain with AI and Optimize with AI enabled, and doing nothing, with AI features off.
- Tab trapped inside the inspector's field list with no way back to the search field.
- Column type missing from inline inspector rows on a read-only result.
- Inspector picker reading NULL for a multi-row selection whose values differ.
- Structure inspector drawing the Name and Type fields in two different fonts.
- Primary key, foreign key and edited markers silent to VoiceOver in the inspector.
- Inspector showing the last table's statistics on a tab with no table.
- Auto-show inspector on row select doing nothing on a query tab.
- Inspector ignoring a column's display format, showing raw where the grid showed JSON or PHP.
- AI conversation history read from disk on every connection window, with the assistant never opened.
is_connectedreported as true over MCP for a connection that had stopped answering.- Cost badge on every plan node of a query ending in
LIMIT, where the share it reads could exceed 100%. (#2633) - Green "low cost" badge on plans that report no cost at all, such as SQLite and ClickHouse. (#2633)
- Empty Cost, Rows and Actual Time columns in the EXPLAIN tree for engines that report none of them. (#2633)
Workers Launched: 0missing from a plan node's details whileWorkers Plannedwas shown. (#2633)- MySQL plans pricing the wrapper query block above every table it contains. (#2633)
- SQL
IN,AND,OR,NOT,BYandONin the editor's plain text colour. (#2634) - SQL built-in type names,
ASC,DESCand function calls unhighlighted in the editor. - SQL numbers,
TRUE,FALSEandNULLin the string colour. - No syntax highlighting at all in the MongoDB and Elasticsearch query editors.
- JavaScript
localsandtagsqueries that failed to compile against the bundled parser. - JSON
true,falseandnullunhighlighted in the row inspector and the JSON viewer. - Operator and Function theme colours with no effect on the editor.
- MCP access prompt with no setting to turn it off, and hidden entirely with AI features off. (#2640)
- MCP access prompt discarding an answer given more than 30 seconds after it appeared. (#2640)
- MCP access prompt returning every 30 minutes, and after each rotation of the bundled bridge's credential. (#2640)
- Repeated MCP access prompts when a client retried a call the user had just denied. (#2640)
- Destructive-operation consent reaching an elicitation-capable MCP client as an internal error instead of a prompt.
ai_policyinlist_connectionsreportingaskEachTimewhatever the app-wide default was.- Quote menu in the CSV export options untranslated in every localized build. (#2534)
- Line feed instead of the chosen line ending on the table comment of a multi-table CSV export. (#2534)
- Indexes missing from an SQL export on SQLite, LibSQL, Cloudflare D1, SQL Server, Oracle, Dameng and Cassandra. (#2492)
- DuckDB expression index exported as invalid SQL. (#2492)
- DuckDB index whose name contains "primary" reported as the table's primary key and left out of its DDL. (#2492)
- PostgreSQL index left out of an export when a check constraint on the same table shared its name. (#2492)
- PostgreSQL materialized view exported as a
CREATE TABLE. (#2492) DROP TYPEandDROP SEQUENCEin an SQL export with Drop unticked. (#2492)- Oracle and ClickHouse views exported as a bare
SELECTwith noCREATE VIEW. (#2492) - Bare
;written for an object whose definition the server would not return. (#2492) - SQL Server reporting every index as clustered. (#2492)
- Unique constraints missing from a SQL Server, Oracle and Dameng
CREATE TABLEin an SQL export. (#2492) - ClickHouse materialized view exported as an ordinary view. (#2492)
- Backup Dump and Restore Dump unusable on SQLite, with an empty database list and a dimmed confirm button. (#2485)
- libSQL backup writing an empty 52-byte file and reporting success. (#2485)
- Restore Dump asking every engine for a file
pg_dumpwrote. (#2485) - Cancel doing nothing while a backup's size estimate ran. (#2485)
- Backup size estimate queueing behind a query tab's own work and joining its open transaction. (#2485)
- A narrowed PostgreSQL dump matching nothing when a table name held a capital, a dot or a wildcard. (#2485)
- Redis and Valkey ACL users without permission to run
PINGrefused at connect and dropped by the health check. - Redis database index ignoring the
dbNspelling the driver itself publishes. - A Sentinel that rejected the credentials reported as unreachable.
- A failed Redis reconnect leaving the connection marked live, with every later command reporting it as not connected.
Security
- Redis and Valkey connections signing in as the default user when a username was typed with an empty password.
- Redis connections on iOS reported as successful without a single command reaching the server.