diff --git a/changelog.mdx b/changelog.mdx
index fab0c46..d5905b9 100644
--- a/changelog.mdx
+++ b/changelog.mdx
@@ -4,6 +4,194 @@ description: "Product updates and announcements for TablePro"
rss: true
---
+
+ Neo4j, InfluxDB 2 and 3, Qdrant, Memcached and StarRocks connections, and KingbaseES with a downloadable driver.
+
+ Two to six query results show as tabs, and the Structure tab shows columns, indexes, foreign keys and checks on one page.
+
+ Masking rules hide column values in the grid, copies, exports, the AI assistant and MCP. Table Health finds bloat and unused indexes.
+
+ Routine Debugger steps through PL/pgSQL and PL/SQL, and Live Messages watches PostgreSQL notifications, Redis channels and Kafka topics.
+
+ Imported and synced connections ask before using cloud or Kerberos sign-ins, and PostgreSQL reads ~/.pgpass only when you turn it on.
+
+ Settings > Plugins is now Settings > Extensions. A .sql-formatter.json saved by 0.83 needs exporting again with sql-formatter's key names.
+
+ ### New Features
+
+ - Formatter settings for clause items, AND and OR position, and data type case. ([#3854](https://github.com/TableProApp/TablePro/pull/3854))
+ - Vim mode switches tabs with gt, gT, :tabnext and :tabprevious. ([#3854](https://github.com/TableProApp/TablePro/pull/3854))
+ - Connect to KingbaseES in PostgreSQL and Oracle compatibility modes with a downloadable driver. ([#3855](https://github.com/TableProApp/TablePro/pull/3855))
+ - In the export dialog, a database, schema or group row now sets Structure, Drop or Data for every object beneath it. ([#3857](https://github.com/TableProApp/TablePro/pull/3857))
+ - Copy To can stop and keep what ran, or skip a failing object and continue by [@MrWeb](https://github.com/MrWeb). ([#3859](https://github.com/TableProApp/TablePro/pull/3859))
+ - Routine Debugger in Settings > Extensions: step through PL/pgSQL and Oracle PL/SQL routines with breakpoints. ([#3860](https://github.com/TableProApp/TablePro/pull/3860))
+ - Pick a column's character set and collation from the server's own list in Structure and Create Table. ([#3866](https://github.com/TableProApp/TablePro/pull/3866))
+ - Change a MySQL or MariaDB table's character set, collation and next AUTO_INCREMENT value in Structure > Options. ([#3866](https://github.com/TableProApp/TablePro/pull/3866))
+ - File > Discard Changes… discards staged structure or data edits after asking. ([#3872](https://github.com/TableProApp/TablePro/pull/3872))
+ - After 30 days of use without a license, a sheet asks once whether you would buy one, then at most every 90 days. ([#3922](https://github.com/TableProApp/TablePro/pull/3922))
+ - Two to six query results show as tabs above the grid, so switching takes one click. ([#3924](https://github.com/TableProApp/TablePro/pull/3924))
+ - Neo4j connections, with labels and relationship types in the sidebar and Cypher in the editor. ([#3925](https://github.com/TableProApp/TablePro/pull/3925))
+ - Connect to StarRocks with a downloadable driver, and browse its external catalogs, such as Iceberg, alongside default_catalog by [@vbabenkoru](https://github.com/vbabenkoru). ([#3939](https://github.com/TableProApp/TablePro/pull/3939))
+ - Server Dashboard and Query Insights open with ⌥⇧⌘D and ⌥⇧⌘I, or from a connection's menu on the connections strip. ([#3957](https://github.com/TableProApp/TablePro/pull/3957))
+ - Table Health lists bloated tables, unused and redundant indexes, and missing keys in a PostgreSQL or MySQL database. ([#3958](https://github.com/TableProApp/TablePro/pull/3958))
+ - Rows of updatable PostgreSQL, MySQL, MariaDB and SQL Server views that show their table's primary key are editable. ([#3961](https://github.com/TableProApp/TablePro/pull/3961))
+ - Display As decodes igbinary and Avro values in binary columns, Avro with a schema file chosen for the column. ([#3962](https://github.com/TableProApp/TablePro/pull/3962))
+ - iPhone and iPad show table rows and query results in a grid with a pinned header and key column, beside the cards. ([#3963](https://github.com/TableProApp/TablePro/pull/3963))
+ - Qdrant support: browse collections, filter and sort points, edit payloads and vectors, and run REST requests. ([#3972](https://github.com/TableProApp/TablePro/pull/3972))
+ - InfluxDB 2 and 3 connections, with SQL, InfluxQL and Flux in the editor. ([#3976](https://github.com/TableProApp/TablePro/pull/3976))
+ - Masking rules hide matching column values in the grid, copies, exports, the AI assistant and MCP. ([#3978](https://github.com/TableProApp/TablePro/pull/3978))
+ - Display As decodes Protobuf with a .proto file chosen for the column, and Kafka values with a Schema Registry. ([#3979](https://github.com/TableProApp/TablePro/pull/3979))
+ - Memcached support: browse keys with values and TTLs, edit them in the grid, and run text protocol commands. ([#3980](https://github.com/TableProApp/TablePro/pull/3980))
+ - Live Messages module: watch PostgreSQL notifications, Redis channels and Kafka topics as messages arrive. ([#3981](https://github.com/TableProApp/TablePro/pull/3981))
+ - Connection windows show Relaunch to Update in the title bar when an update or plugin update is ready. ([#3993](https://github.com/TableProApp/TablePro/pull/3993))
+ - People without a license see a Black Friday offer on the Welcome window: 40% off Pro until December 1. ([#3995](https://github.com/TableProApp/TablePro/pull/3995))
+ - iPhone and iPad open Cloudflare D1 connections, with the database picked from your account's list. ([#3998](https://github.com/TableProApp/TablePro/pull/3998))
+
+ ### Improvements
+
+ - .sql-formatter.json uses the npm sql-formatter key names, so export a rules file saved by 0.83 again. ([#3854](https://github.com/TableProApp/TablePro/pull/3854))
+ - Each export option is now its own column with a heading, and a table's checkbox only includes or excludes it. ([#3857](https://github.com/TableProApp/TablePro/pull/3857))
+ - Copy To's Stop and roll back now takes back the rows of every table, not only the one that failed by [@MrWeb](https://github.com/MrWeb). ([#3859](https://github.com/TableProApp/TablePro/pull/3859))
+ - Settings > Plugins is now Settings > Extensions. ([#3860](https://github.com/TableProApp/TablePro/pull/3860))
+ - The Structure tab shows columns, indexes, foreign keys and checks on one page, with the inspector editing them. ([#3872](https://github.com/TableProApp/TablePro/pull/3872))
+ - DuckDB connections run DuckDB 2.0, and a .duckdb file TablePro creates stays readable by DuckDB 1.x. ([#3928](https://github.com/TableProApp/TablePro/pull/3928))
+ - A dragged field in the row inspector keeps its height per column, not for every field of its kind by [@vbabenkoru](https://github.com/vbabenkoru). ([#3975](https://github.com/TableProApp/TablePro/pull/3975))
+ - The paid plan is now called Pro across the app, matching the pricing page. ([#3989](https://github.com/TableProApp/TablePro/pull/3989))
+ - The disk image opens to a window with TablePro beside the Applications folder, ready to drag. ([#3990](https://github.com/TableProApp/TablePro/pull/3990))
+ - Importing an Excel file reads date and time cells as dates and times, as the Data Files window shows them. ([#3991](https://github.com/TableProApp/TablePro/pull/3991))
+ - Settings picks the update channel from a Stable or Beta menu, and the Welcome window always shows the version. ([#3993](https://github.com/TableProApp/TablePro/pull/3993))
+ - An imported Google service account key must be the key itself; a path to a key file is left for you to choose again.
+ - Imported and synced connections ask once before signing in with AWS, Microsoft, Google or Kerberos logins on this Mac.
+ - PostgreSQL reads ~/.pgpass only when Use ~/.pgpass is on.
+ - Through a tunnel, Verify CA and Verify Identity now check the certificate and need its CA file.
+ - Through a tunnel, an SSL mode the driver cannot check there is refused before connecting, naming the modes it can use.
+
+ ### Bug Fixes
+
+ - The sidebar no longer freezes the window for a moment when a very large table list first loads. ([#3849](https://github.com/TableProApp/TablePro/pull/3849))
+ - The Vim "_ register overwriting the clipboard and the other registers. ([#3854](https://github.com/TableProApp/TablePro/pull/3854))
+ - Format Query changing SQL with brackets, dollar bodies, GO or DELIMITER lines, operators like @> or window ORDER BY. ([#3854](https://github.com/TableProApp/TablePro/pull/3854))
+ - Format Query doing nothing on a statement too large to format, without saying why. ([#3854](https://github.com/TableProApp/TablePro/pull/3854))
+ - The "is not empty" filter found no rows on Oracle, and both empty filters failed on a CLOB column. ([#3855](https://github.com/TableProApp/TablePro/pull/3855))
+ - Space over a database and its rows in the export or backup list toggled the rows twice. ([#3857](https://github.com/TableProApp/TablePro/pull/3857))
+ - Switching an SQL export to CSV and back dropped routines, triggers, sequences and types from the list. ([#3857](https://github.com/TableProApp/TablePro/pull/3857))
+ - An MQL export with Data off showed its progress stuck at 0 rows. ([#3857](https://github.com/TableProApp/TablePro/pull/3857))
+ - A saved export selection made under another format came back with every option turned on. ([#3857](https://github.com/TableProApp/TablePro/pull/3857))
+ - The export dialog's Structure, Drop and Data headings sat off their checkboxes and were never translated. ([#3857](https://github.com/TableProApp/TablePro/pull/3857))
+ - Opening a query tab, or loading a query, from a query tab left the keyboard in the grid or sidebar. ([#3857](https://github.com/TableProApp/TablePro/pull/3857))
+ - A format change that reloaded the export list dropped each table's row filter. ([#3857](https://github.com/TableProApp/TablePro/pull/3857))
+ - SQL import and Ignore foreign key checks left a SQLite connection enforcing foreign keys afterwards by [@MrWeb](https://github.com/MrWeb). ([#3859](https://github.com/TableProApp/TablePro/pull/3859))
+ - After a Copy To into PostgreSQL failed creating a schema, the next Copy To or Compare on that database could fail by [@MrWeb](https://github.com/MrWeb). ([#3859](https://github.com/TableProApp/TablePro/pull/3859))
+ - Copy To read a whole database one table at a time before showing the review by [@MrWeb](https://github.com/MrWeb). ([#3859](https://github.com/TableProApp/TablePro/pull/3859))
+ - Copy To stopped with a foreign key error on MySQL tables that reference each other or themselves by [@MrWeb](https://github.com/MrWeb). ([#3859](https://github.com/TableProApp/TablePro/pull/3859))
+ - Duplicating a PostgreSQL database failed when a table referenced one in another schema by [@MrWeb](https://github.com/MrWeb). ([#3859](https://github.com/TableProApp/TablePro/pull/3859))
+ - Compare & Sync on MySQL and PostgreSQL wrote tables in name order instead of parents first by [@MrWeb](https://github.com/MrWeb). ([#3859](https://github.com/TableProApp/TablePro/pull/3859))
+ - Disabling foreign key checks on PostgreSQL without superuser failed the import or aborted the open transaction by [@MrWeb](https://github.com/MrWeb). ([#3859](https://github.com/TableProApp/TablePro/pull/3859))
+ - Create Table on MySQL wrote utf8mb4_unicode_ci instead of the database's own default collation. ([#3866](https://github.com/TableProApp/TablePro/pull/3866))
+ - The MariaDB table list showed no character set for tables on a uca1400 collation. ([#3866](https://github.com/TableProApp/TablePro/pull/3866))
+ - Changing a column's character set saved without asking first, though characters can be lost. ([#3866](https://github.com/TableProApp/TablePro/pull/3866))
+ - Changing a MySQL text column to a numeric type failed with a syntax error about CHARACTER SET. ([#3866](https://github.com/TableProApp/TablePro/pull/3866))
+ - New Database and Duplicate Database on MariaDB 10.10 and later did not offer the uca1400 collations. ([#3866](https://github.com/TableProApp/TablePro/pull/3866))
+ - Editing a column on MariaDB removed its CHECK constraint, the JSON validity check included. ([#3866](https://github.com/TableProApp/TablePro/pull/3866))
+ - Create Table offered MySQL storage engines the server does not have. ([#3866](https://github.com/TableProApp/TablePro/pull/3866))
+ - Refreshing the Structure tab, or saving in it, did not read check constraints again. ([#3872](https://github.com/TableProApp/TablePro/pull/3872))
+ - Making a column part of the primary key in the Structure tab did not change the table's key. ([#3872](https://github.com/TableProApp/TablePro/pull/3872))
+ - Create Table read foreign key targets from the sidebar's database instead of the tab's. ([#3872](https://github.com/TableProApp/TablePro/pull/3872))
+ - Edit > Undo in the Structure tab did not name the change and stayed enabled with nothing to undo. ([#3872](https://github.com/TableProApp/TablePro/pull/3872))
+ - The selection in the Structure tab moved to another column after a reload or a sort. ([#3872](https://github.com/TableProApp/TablePro/pull/3872))
+ - Switching a table from Structure to Data dimmed Save Changes while structure edits were still staged. ([#3872](https://github.com/TableProApp/TablePro/pull/3872))
+ - One failed read blanked every Structure tab, and a failed Triggers read showed No Triggers. ([#3872](https://github.com/TableProApp/TablePro/pull/3872))
+ - Undo Delete on an edited column in the Structure tab dropped the edit made before the delete. ([#3872](https://github.com/TableProApp/TablePro/pull/3872))
+ - MySQL and MariaDB indexes offered a Condition the server drops. ([#3872](https://github.com/TableProApp/TablePro/pull/3872))
+ - The Welcome window offering What’s New after opening an older version, and again after going back to the newer one by [@sedax90](https://github.com/sedax90). ([#3878](https://github.com/TableProApp/TablePro/pull/3878))
+ - What’s New opening on iPhone and iPad after installing an older TestFlight build by [@sedax90](https://github.com/sedax90). ([#3878](https://github.com/TableProApp/TablePro/pull/3878))
+ - A script's error banner stayed over the results of the statements that succeeded. ([#3924](https://github.com/TableProApp/TablePro/pull/3924))
+ - Closing or clearing a result dropped its unsaved cell edits without asking. ([#3924](https://github.com/TableProApp/TablePro/pull/3924))
+ - Closing a result jumped to the last result instead of the one beside it. ([#3924](https://github.com/TableProApp/TablePro/pull/3924))
+ - Long result names were cut through an emoji. ([#3924](https://github.com/TableProApp/TablePro/pull/3924))
+ - Close Result Tab emptied a table tab, and Previous Result and Next Result stayed enabled with nowhere to go. ([#3924](https://github.com/TableProApp/TablePro/pull/3924))
+ - A new run numbered its results from 1 even when pinned results already used those numbers. ([#3924](https://github.com/TableProApp/TablePro/pull/3924))
+ - Dismissing a failed statement's error turned its result into a success message. ([#3924](https://github.com/TableProApp/TablePro/pull/3924))
+ - Backing up or restoring a DuckDB database with foreign keys as a .duckdb file failed. ([#3928](https://github.com/TableProApp/TablePro/pull/3928))
+ - Undo in the AI chat composer undid a Structure, Users & Roles or ER diagram edit instead of the typing. ([#3957](https://github.com/TableProApp/TablePro/pull/3957))
+ - Close Connection with Save closed over unsaved edits in tabs other than the one in front. ([#3957](https://github.com/TableProApp/TablePro/pull/3957))
+ - Save at the close prompt closed before inspector edits were written, so a failed write went unreported. ([#3957](https://github.com/TableProApp/TablePro/pull/3957))
+ - In Agent mode, menu commands and shortcuts acted on the hidden browse tabs, grid and sidebar. ([#3957](https://github.com/TableProApp/TablePro/pull/3957))
+ - Refresh did nothing on the Server Dashboard, Query Insights, Users & Roles and object source tabs. ([#3958](https://github.com/TableProApp/TablePro/pull/3958))
+ - An expanded field in the row inspector collapsed when another row was selected by [@vbabenkoru](https://github.com/vbabenkoru). ([#3975](https://github.com/TableProApp/TablePro/pull/3975))
+ - Dragging a field's resize handle in the row inspector snapped back a few points into the drag by [@vbabenkoru](https://github.com/vbabenkoru). ([#3975](https://github.com/TableProApp/TablePro/pull/3975))
+ - The SQLite restore confirmation said existing objects get the dump's data, though the restore stops at the first error. ([#3984](https://github.com/TableProApp/TablePro/pull/3984))
+ - A crafted Excel, CSV or compressed file could hang TablePro or fill memory and disk. ([#3991](https://github.com/TableProApp/TablePro/pull/3991))
+ - Malformed replies from Kafka, Teradata, Redis, Neo4j, Trino and other servers could crash TablePro. ([#3991](https://github.com/TableProApp/TablePro/pull/3991))
+ - An update downloaded in the background gave no sign until TablePro quit. ([#3993](https://github.com/TableProApp/TablePro/pull/3993))
+ - Relaunching from Settings could leave two copies of TablePro running when the quit was cancelled. ([#3993](https://github.com/TableProApp/TablePro/pull/3993))
+ - A Snowflake connect that fails on the network no longer forgets the cached SSO or MFA token. ([#3996](https://github.com/TableProApp/TablePro/pull/3996))
+ - A connection switched to SQLite or DuckDB on iPhone and iPad still dialing the SSH tunnel it had before. ([#3998](https://github.com/TableProApp/TablePro/pull/3998))
+ - Cloudflare D1 queries with no LIMIT downloading every row, which fails once the result passes 50 MB. ([#3998](https://github.com/TableProApp/TablePro/pull/3998))
+ - Cloudflare D1 connection failures reading "Failed to connect" instead of the cause, such as an expired token. ([#3998](https://github.com/TableProApp/TablePro/pull/3998))
+ - Truncate Table on a SQLite connection on iPhone and iPad failing with a syntax error. ([#3998](https://github.com/TableProApp/TablePro/pull/3998))
+ - Saving a binary value to Cloudflare D1 storing its base64 text instead of the bytes. ([#3998](https://github.com/TableProApp/TablePro/pull/3998))
+ - A Cloudflare D1 database past the first 1,000 in an account not found by name or missing from the switcher. ([#3998](https://github.com/TableProApp/TablePro/pull/3998))
+ - Cloudflare D1 values sent as arrays, such as BLOBs, showing as NULL. ([#3998](https://github.com/TableProApp/TablePro/pull/3998))
+ - Filtering a Cloudflare D1 table by a long text value failing with "LIKE or GLOB pattern too complex". ([#3998](https://github.com/TableProApp/TablePro/pull/3998))
+ - A query on a table or column named fetch skipping the row limit. ([#3998](https://github.com/TableProApp/TablePro/pull/3998))
+ - A keyless save matched no row when a PostGIS coordinate had more than 15 decimal places.
+ - An enum or other new type column could read as plain text for the rest of the session after a cancelled query.
+ - Geometry and geography values showed as hex after CREATE EXTENSION postgis until you reconnected.
+ - New Kafka connections showing Verify Identity while connecting without TLS.
+
+ ### Security
+
+ - A Beancount BQL query starting with a dash could read any local file, including from MCP and AI tools.
+ - A Cassandra function body holding $$ or a crafted type name could add a statement to its definition.
+ - A DuckDB macro name, or a MySQL routine made under another sql_mode, could add statements to Copy To and sync.
+ - A DuckDB name quoted in backticks hiding a statement from Safe Mode and read-only external clients.
+ - A Kafka DROP TOPIC behind a comma or a Greek question mark skipping the confirmation MCP clients need.
+ - A MongoDB statement from an MCP client could drop data or run server-side JavaScript without the confirmation it needs.
+ - A MySQL value ending in a backslash could end its literal early in a saved sync script, MCP export or copied INSERT.
+ - A NUL character in an imported connection value could quit the app when it started a backup, tunnel or other tool.
+ - A PostgreSQL E'' string continued on the next line hiding a statement from Safe Mode and read-only external clients.
+ - A SELECT INTO written right after a number passing as a read in Safe Mode and for external clients.
+ - A SQL Server batch opening with SHOW, HELP, INFO, EXPLAIN or DESCRIBE, which runs a procedure, passing as a read.
+ - A SQL Server column name holding ] could end its quoting in the table DDL and run the rest as SQL.
+ - A SQL file or a functional index read under NO_BACKSLASH_ESCAPES could run text from inside a string.
+ - A Snowflake account written as an address sending a cached sign-in token to another server.
+ - A Snowflake or Vault server opening a file or another app's link during browser sign-in.
+ - A Trino or Presto query parameter after a ? in a comment or a quoted name could run as SQL.
+ - A Weaviate DELETE with a tab or other space after the verb skipping the destructive prompt.
+ - A column default or type a SQL Server, MySQL 5.7, SAP HANA or Trino server reported could run as SQL in copied DDL.
+ - A comment in a SQLite, libSQL or D1 table definition could add statements to a SQL export.
+ - A connection file imported with Replace sending a saved password to a server the file named.
+ - A connection file or synced password naming a Google key file on this Mac signing in with that key.
+ - A connection from a file, link or team library signing in with this Mac's AWS, Microsoft, Google or Kerberos login.
+ - A question mark in a quoted name could bind a value as SQL on Teradata, and in backtick or bracket names.
+ - A read from an MCP client, AppleScript or the assistant writing data on PostgreSQL, MySQL, SQLite, DuckDB or ClickHouse.
+ - A shared connection sending values of TablePro's environment variables to its server without asking.
+ - A tampered plugin registry replacing an installed plugin with an older release.
+ - AWS, Microsoft, AI provider and license requests following a redirect to another server with their keys.
+ - An ALTER that drops a column after a line break, tab, comma or parenthesis running without the destructive prompt.
+ - An SSH host or user with a Greek question mark or varia could run commands through a Match exec line in ~/.ssh/config.
+ - An imported or shared connection carrying settings TablePro sets itself, or fields this version does not know.
+ - Another account on the Mac could answer the MCP bridge after TablePro quit.
+ - CockroachDB connections could run a version() or count() function another user planted in a schema on the path.
+ - Deleting or editing a MongoDB row whose _id held a toEJSON field could change a different document.
+ - MCP browse_table and count_rows reading rows without the confirmation Safe Mode asks for.
+ - MCP confirmations not naming the database a statement runs in, or the values insert_rows writes.
+ - MongoDB on iPhone and iPad not checking the server's name through SSH with Verify Identity.
+ - Oracle EXPLAIN PLAN INTO a table, which inserts the plan, passing as a read for read-only external clients.
+ - PostgreSQL crosstab, connectby, xpath_table and pg_import_system_collations, and DuckDB query(), passing as reads.
+ - Safe Mode on iPhone and iPad passing server file reads, such as pg_read_file and LOAD_FILE, as reads.
+ - Setting a PostgreSQL sequence past its column could run an operator the database owner planted ahead of pg_catalog.
+ - Shortcuts listing tables and adding rows on iPhone and iPad while TablePro was locked.
+ - Shortening DynamoDB point-in-time recovery, or an UpdateTable setting the app does not know, passing as a plain write.
+ - SurrealDB REMOVE TABLE, Snowflake REMOVE, and MySQL or Oracle PURGE or RESET MASTER skipping the destructive prompt.
+ - Table Health, a primary key change in Structure or a backup could run a function planted in a PostgreSQL schema as you.
+ - Table names, Copilot tool results and iPhone server errors reaching the system log in clear.
+ - The assistant's confirm_destructive_operation running statements that read server files or run server code.
+ - Verify CA and Verify Identity checking no certificate when connecting through an SSH, Cloudflare or other tunnel.
+ - With Python Beancount, a ledger could run code with Run Ledger Plugins off, through a bundled plugin or a nearby file.
+
+
Find and Replace work in every data grid, with Match Case, Whole Words, regular expressions and a column scope.