Skip to content

Latest commit

 

History

History
2469 lines (1906 loc) · 172 KB

File metadata and controls

2469 lines (1906 loc) · 172 KB

Changelog

All notable changes to TablePro will be documented in this file.

The format is based on Keep a Changelog 1.1.0, and this project adheres to Semantic Versioning.

Added

  • Connections can now have more than one tag. Assign several tags in the connection form, and filter the welcome list by tag with Match Any or Match All. (#744)
  • Per-column value filter in the data grid. Hover a column header and click the funnel icon to pick which values to show from the loaded rows. Filter several columns at once, search the value list, and clear filters from the header menu. The filter runs on loaded rows without re-querying. (#1454)
  • Elasticsearch support. Connect to Elasticsearch 7.x and 8.x, browse indices, run Query DSL requests in a console, and edit documents in the data grid. Install from Settings > Plugins. (#1529)
  • The connection switcher and welcome list now show each connection's tags and group, so you can tell production from staging at a glance. (#1323)

Changed

  • The ER diagram now arranges tables in a compact layout that fills the canvas in both directions, keeps tables linked by foreign keys together, and tints each group of connected tables with its own header color. (#1755)
  • When an Oracle server closes the connection during login, the error dialog now shows which handshake phase it stopped at, so dropped-handshake failures (for example on Oracle 11g) are easier to pin down. (#1746)

Fixed

  • Raw filters in the data grid now apply on document and key-value databases; the typed text was being dropped before it reached the driver. (#1529)
  • Connecting to Oracle no longer crashes the app while reading certain server values during the handshake; a bad packet now fails the connection with an error instead. (#1746)
  • Following a foreign key into a table in another schema now opens the correct table for SQL Server and Oracle; the referenced schema was missing, so navigation fell back to the default schema. (#1754)
  • Browsing and editing a SQL Server or Oracle table or view outside the default schema no longer fails with "Invalid object name" or writes to the wrong table; data, filter, and save queries now qualify the table with its schema. (#1754)

0.52.1 - 2026-06-22

Added

  • Import connections on iPhone. Open a .tablepro file from Files or AirDrop, or use Import Connections in the list menu. Encrypted files prompt for the passphrase, and you choose how to handle duplicates.
  • Export connections on iPhone from the list menu. Passwords are left out by default; include them by setting a passphrase that encrypts the file.

Changed

  • Drag-selecting many columns in a wide result set scrolls smoothly instead of lagging.
  • The connection Export Options dialog keeps a steady size when you turn on Include Credentials, and saves through the standard macOS save dialog.
  • Scrolling large result sets uses less CPU.
  • Typing in the sidebar table search stays responsive on databases with thousands of tables.
  • The welcome sidebar stays responsive with many connections and nested groups.
  • Autocomplete stays snappy on wide SELECT clauses with hundreds of columns.

Fixed

  • SQL autocomplete no longer stops appearing until the app is relaunched; it stays available after switching query tabs and windows. (#1731)
  • Oracle connections no longer crash the app when the server sends a message the driver cannot decode; the query fails with a clear error and reconnects. (#483)
  • MongoDB TLS handshake failures now report the actual cause instead of always blaming a cipher or protocol mismatch. (#1418)
  • The External Clients access level no longer reverts to Read Only after saving and reopening a connection, so MCP clients keep the write access you granted. (#1730)
  • Typing fast with the autocomplete window open no longer stalls each keystroke.

0.52.0 - 2026-06-19

Added

  • Triggers tab in the table structure view for MySQL, MariaDB, PostgreSQL, SQLite, SQL Server, Oracle, libSQL, and Cloudflare D1, with a filter field, sortable columns, and a read-only view of each trigger's definition. (#1695)
  • Create, edit, and drop triggers from the Triggers tab. (#1695)
  • Traditional Chinese (繁體中文) language in Settings > General.
  • An Add button in the table status bar inserts a new row at the end of the grid and starts editing it.
  • DuckDB connections can now reach a remote server over the Quack protocol (experimental). Pick Remote (Quack) in the connection form, enter the host, port, and token. Listing remote tables in the sidebar is not available yet. Needs DuckDB 1.5.3 or later. (#1716)

Changed

  • Selecting a Redis namespace in the sidebar now filters the open view to that prefix with paging, instead of opening a separate tab. (#1701)

Fixed

  • SQL autocomplete now suggests columns for a derived-table or CTE alias. (#1697)
  • Redis entries no longer disappear after the connection sits idle. (#1701)
  • Redis key browsing now lists and pages through every key in a database or namespace, instead of only the first SCAN batch. (#1701)
  • A dropped Redis connection now reconnects on the next command and replays auth and the selected database. (#1701)
  • DuckDB VARIANT columns now show their value as text instead of an empty cell.
  • A new database group now appears in the connection list right away instead of only after restarting the app. (#1704)
  • The SQL formatter keeps nested indentation for UNION, INTERSECT, and EXCEPT inside a subquery, and puts the closing parenthesis on its own line. (#1698)
  • Toolbar button tooltips now show each action's real keyboard shortcut and follow your custom bindings. (#1694)
  • Deleting a table from the sidebar now removes it from the tree right away on multi-database servers like MySQL and PostgreSQL. (#1714)
  • The row detail panel no longer stays blank when a table is opened in a second tab.
  • The sidebar filter now stays put when you open another tab.
  • Fixed a crash when browsing the database tree on servers with many schemas, such as PostgreSQL.
  • Reopening the app no longer shows a "Not connected to database" error when it restores a table tab on a connection that is still reconnecting, such as one over SSH.

0.51.1 - 2026-06-16

Added

  • The tree sidebar can filter to only the databases you pick, saved per connection. (#1667)
  • Closing a query tab no longer loses unsaved SQL. The next blank query tab for the same connection restores the last closed draft. (#1686)
  • A checkbox in the filter panel header turns every filter row on or off at once, with a dash when only some are on.

Changed

  • The filter panel's "Unset" button is now "Clear". It keeps your filter rows and only drops the applied state. To remove the rows, use "Remove All Filters" in the filter options menu.
  • A row's right-click menu now has "Apply Only This Filter". The inline per-row Apply button is gone.

Changed

  • Expanding a database in the tree sidebar loads tables first and fills in procedures and functions in the background, so the table list appears after one round-trip instead of waiting for three queries to finish in sequence.

Fixed

  • Expanding or collapsing a database or schema in the tree sidebar while its tables were still loading could crash the app. The tree now updates its rows without rebuilding the outline structure.
  • MongoDB filters on _id and other ObjectId fields now match. A 24-character hex value is matched as an ObjectId as well as a string, so filtering by _id returns the row instead of nothing. (#1682)
  • Shift+Arrow in the data grid now starts and extends a cell selection from the focused cell. Cmd+Shift+Arrow extends to the row or column edge.
  • Delete key now removes all rows covered by a cell-range selection instead of ignoring it.
  • Right-clicking inside a multi-row or cell-range selection no longer collapses the selection first.
  • Oracle connections no longer crash during connect when the server sends a short or unexpected handshake packet. (#1683)
  • MongoDB filters on _id and other ObjectId fields now match. A 24-character hex value is matched as an ObjectId as well as a string. (#1682)
  • The sidebar and inspector keep their width per connection, the sidebar its collapsed state, and the inspector its selected tab, across quit and reopen.

0.51.0 - 2026-06-13

Added

  • BigQuery datasets can be switched, created, and dropped from the toolbar, Cmd+K switcher, and File menu. (#509)
  • Quick Switcher now searches saved queries too, alongside tables, views, databases, and history.
  • Quick Switcher scopes: an empty search shows recent items, and Cmd+1 to Cmd+4 browse all tables, databases, or queries.
  • Quick Switcher: Option+Return opens a table in a new tab, and right-click opens its structure or copies the name or query.
  • Tables already open show an Open badge in the Quick Switcher, rank higher, and Return switches to the existing tab.
  • .psql and .pgsql files now open in the SQL editor like .sql. (#1641)
  • Session restore brings back each tab's sort, page, cursor position, and column widths, plus the connection's active database and schema. Tabs autosave every 30 seconds, so a crash recovers your last session and reopens its connections. (#1673)

Changed

  • Redis connections now filter with a key-pattern search field and a key-type scope. Glob patterns like user:* match server-side across the whole keyspace, replacing the SQL-style filter row that only matched one batch of keys.
  • Switcher, menus, and alerts now use each database's own container name: Dataset for BigQuery, Keyspace for Cassandra and ScyllaDB. (#509)
  • Quick Switcher highlights matched characters, aligns camelCase and snake_case names better, and ranks items you open often and recently higher.
  • Quick Switcher now opens as a Spotlight-style floating panel instead of a modal sheet, with Liquid Glass on macOS 26.
  • The sidebar filter, database switcher, and connection switcher now use the same fuzzy matching as the Quick Switcher, so upv finds user_profile_view.
  • Refresh (Cmd+R) now acts only on the focused window's connection instead of reloading every open connection.
  • Holding Cmd+R no longer queues a backlog of refreshes; rapid presses collapse into a single reload.
  • Switching PostgreSQL schemas now sets the search path to just the selected schema. Unqualified references to "public" objects, such as extension functions, need a "public." prefix while another schema is selected. (#1662)
  • The inspector panel can now be resized freely by dragging its divider.
  • TablePro now reopens your last session on launch by default instead of the welcome screen. Existing installs move over once; change it under Settings > General > Startup Behavior. (#1673)

Fixed

  • PostgreSQL and Redshift autocomplete now completes tables and columns from schemas other than the selected one, so SELECT * FROM s2.orders suggests s2's columns. (#1668)
  • Favorite keywords work again. Deleting a connection now also deletes its saved queries, folders, and per-table filters, the confirmation says so, and favorites orphaned by an earlier delete are cleaned up at launch.
  • Keyword and SQL keyword autocomplete now work in editors without a connection, and favorites appear in the completion popup immediately.
  • Typing a favorite's keyword in the Quick Switcher now finds the saved query instead of ranking it below name matches.
  • PostgreSQL databases without a "public" schema now load tables from the first available schema, show the schema selector even with one schema, and count tables across every user schema. (#1662)
  • Switching schemas no longer closes open tabs or discards unsaved SQL; the sidebar, schema chip, and autocomplete update to the new schema. (#1669)
  • Creating a table now turns the Create Table tab into the new table's tab and shows it in the sidebar without a manual refresh. (#1664)
  • Cmd+S in the Create Table tab now creates the table, matching the Save shortcut everywhere else. (#1664)
  • Format Query can now be undone with Cmd+Z. (#1645)
  • Format Query now formats only the selection when one is active, and the full query otherwise. (#1656)
  • Foreign key jump arrows no longer disappear after sorting, filtering, or paginating, and a failed lookup is retried on the next load.
  • PostgreSQL foreign keys are now read from the system catalogs, so FK jump arrows appear even when the role does not own the referenced tables.
  • Sorting a query result no longer overwrites the SQL editor or an opened .sql file; the sort runs as a separate query. (#1645)
  • iCloud Sync between the iPhone and Mac apps now uses the Production CloudKit environment, so development builds no longer sync into a separate database.
  • Exports no longer fail mid-table on servers with a statement time limit; the export session disables the limit and restores it afterwards. (#1633)
  • Quick Switcher no longer shows an empty table list when opened before the schema finishes loading.
  • Loading a saved query or history entry from the no-tabs screen now opens it in the current window instead of a second tab.
  • Opening a query from history in the Quick Switcher loads the full query instead of a 100-character preview.
  • Refreshing a table now reloads its data even when the previous load is still running. (#1637)
  • Cmd+R on a table now reloads its rows instead of failing with a query error.
  • SQL autocomplete now suggests tables after JOIN across multi-join and multi-clause queries, with tables leading the list. (#1646)
  • Large SQL scripts no longer freeze the editor or pin the CPU. Above 2 MB the editor suspends syntax highlighting and inline AI so typing and scrolling stay responsive. (#1652)

Security

  • Imported connections from a deep link or shared file can no longer carry a pre-connect script that runs a shell command on connect.
  • External database links now ask for confirmation before connecting, and a password in the link is never saved to the Keychain.
  • MCP tools now enforce each connection's external access level, AI policy, and token scope on every request.
  • The MCP server now requires a paired token by default, even over loopback.
  • An installed plugin's code signature is re-checked right before it loads, so the binary cannot be swapped after the first check.
  • MongoDB filter values in the Contains, Not Contains, Starts With, Ends With, and Regex operators can no longer inject query operators.
  • iOS validates TLS certificates for MySQL, PostgreSQL, and Redis connections set to a verify SSL mode.
  • Database values copied on iOS stay on the device and clear from the clipboard after a minute.
  • The iOS home screen widget no longer stores database host and port on disk.

0.50.0 - 2026-06-09

Added

  • Cursor as an AI provider: use a Cursor API key or sign in with the Cursor CLI. (#1624)
  • Sign in with ChatGPT to run AI chat and inline suggestions without an API key. Existing Codex CLI logins can be imported. (#1617)
  • libSQL / Turso connections can open a local database file offline, transactions included. (#1607)

Fixed

  • Default row sort now applies to the first table opened after launch. (#1603)
  • Cancelling a SQLite query no longer races a disconnect. (#1610)
  • Typing in the query editor no longer erases characters or drops focus, most visible on macOS 15. (#1608)
  • The autocomplete popup now filters in place instead of closing and reopening on each keystroke. (#1608)
  • Syntax highlighting no longer disappears after formatting a query. (#1612)
  • The GitHub Copilot provider no longer shows a Max output tokens field it ignores or leaves a stray model ID field behind.
  • Oracle connections with native network encryption no longer crash on a server error; the real ORA error is shown and the connection keeps working. (#483)
  • Clicking an already-open table switches to its tab instead of opening a duplicate. (#1613)
  • MongoDB now connects over an SSH or Cloudflare tunnel instead of failing with connection refused. (#1621)
  • A plugin updated in Settings stays marked Installed instead of showing the Update button again.
  • DBeaver connections import from any edition, based on your DBeaver data rather than which app is installed. (#1628)

0.49.1 - 2026-06-06

Fixed

  • Default row sort by primary key works again for PostgreSQL and other databases, and the rows arrive already sorted on the first load instead of re-sorting after they appear. (#1603)
  • Registry plugins built before 0.49.0 install and load again instead of failing with an invalid plugin bundle error.

0.49.0 - 2026-06-06

Added

  • Snowflake support: sign in with username & password (MFA included), key-pair, browser SSO, or an access token; browse and edit data, import CSV and JSON, edit table structure, run scripts, and switch warehouse and role from the toolbar. Snowflake CLI connections can be reused by name. (#1420)
  • Import CSV and TSV files into a table: map columns to an existing table or create a new one, with delimiter, quote, encoding, header, and NULL options. (#1568)
  • SQL autocomplete completes each segment of qualified names (database, schema, table), loads tables of unopened schemas on demand, resolves alias columns, and suggests the connection's dialect functions.
  • Each filter row can be switched on or off and applied on its own; disabled rows stay in the panel. (#1561)
  • Importing connections from other apps detects duplicates and lets you replace, add a copy, or skip each one.
  • Oracle connections negotiate Native Network Encryption, so servers that require it now connect. (#483)
  • Oracle connections follow listener redirects, so RAC SCAN, shared server, and load-balanced setups connect. (#483)
  • AWS connections can assume an IAM role through STS, including chained source profiles, external IDs, and custom durations. (#1567)
  • Redis connects to Amazon ElastiCache with IAM auth via access key, profile, or SSO. (#1567)
  • AWS SSO sign-in from TablePro: an expired session prompts a browser sign-in and refreshes the token. (#1567)
  • Cassandra connects to Amazon Keyspaces with AWS IAM (SigV4) auth via access keys, profile, or SSO. (#1567)
  • Export and import dialogs remember the last-used format, options, and encoding; cancelling keeps your saved settings, and Reset to Defaults restores the stock options. (#1591)

Changed

  • The results status bar has a divider, balanced margins, and a spinner sized to its controls. (#1569)
  • Custom keyboard shortcuts work on non-US layouts, and shifted symbols like Cmd+[ record correctly.
  • The Keyboard settings list is grouped by where shortcuts act (Editor, Data Grid, Navigation, Connections), with a reset button per changed shortcut.
  • Shortcut conflict detection checks live macOS system shortcuts and editor commands, and allows the same key in the editor and the data grid since focus decides which runs.
  • Show Tables and Show Favorites moved to Cmd+Option+1 and Cmd+Option+2; Control+1 and Control+2 belong to macOS Spaces.
  • Cmd+N opens a new connection; Manage Connections stays in the File menu.
  • First Page and Last Page default to Cmd+Option+Up and Cmd+Option+Down.
  • Shortcuts can use function keys (F1 through F12), with or without a modifier.
  • AWS connections list the profiles from ~/.aws/config and ~/.aws/credentials, and still accept a typed name. (#1567)

Fixed

  • Accepting an autocomplete suggestion replaces the whole typed word; it could leave part of the word behind, turning mess plus Tab into memessage.
  • MongoDB: connecting to Atlas no longer fails with TLS internal error (-9838); the plugin ships the OpenSSL TLS stack again. (#1599)
  • DuckDB: the plugin runs DuckDB 1.5.2 again after a rollback to 1.5.0.
  • JSON import: a failed import with "Delete existing rows before import" restores the deleted rows.
  • JSON import: skip-and-continue no longer inserts duplicate rows after a mid-batch error.
  • JSON import: "Stop and Commit" keeps the rows inserted before the error.
  • The connection and database switcher focuses its search field even while a filter input is being edited; the filter text is kept. (#1575)
  • TablePro no longer shows its icon for .sql, .sqlite, and .duckdb files when it is not their default app. (#1594)
  • The JSON results view shows row data right away, follows the row selection, and shows a spinner while large results format. (#1576)
  • Double-click or Enter edits a JSON cell inline and opens the hex editor on a blob cell; the chevron still opens the tree or hex editor. (#1588)
  • Query results appear as soon as rows return; metadata loads in the background, removing a multi-second wait on slow remote databases. (#1574)
  • MySQL and MariaDB queries are editable right away instead of waiting on a separate metadata query. (#1574)
  • Status bar buttons no longer get blocked by the bottom-right window resize zone. (#1569)
  • VoiceOver reads clear labels for the results status bar controls. (#1569)
  • The custom rows-per-page popover points at the page-size menu. (#1569)
  • DynamoDB AWS Profile auth reads ~/.aws/config too and supports credential_process, so config-only, SSO, and credential-process profiles work. (#1567)
  • Query result columns follow the SELECT order; new columns no longer get stuck at the end of the grid. (#1565)
  • JSON file import works again. It failed to load in 0.48.0.
  • SQL export quotes empty or malformed numeric values instead of producing invalid INSERT statements.
  • SQL Server: logins restricted to one database, such as Azure SQL contained users, now connect; the database is sent during login.
  • Custom Copy and Cut shortcuts take effect in the SQL editor.
  • The Delete shortcut in the data grid follows a custom binding.
  • Find Next (Cmd+G) and Find Previous (Cmd+Shift+G) work in the editor.
  • Pagination buttons no longer fire their page shortcut twice.
  • PostgreSQL scripts with DO $$ ... $$ blocks or dollar-quoted bodies no longer fail with an unterminated string error. (#1559)
  • AWS IAM connections no longer ask for a password; the same holds for any auth mode that replaces the password, such as a Postgres password file.
  • Oracle connection failures show the listener's actual reason instead of a generic message. (#483)
  • A connection password read from a command no longer fails when the command finishes quickly.
  • A cancelled MCP query returns a cancelled error instead of an invalid-parameters error, and emits an initial progress notification.

0.48.0 - 2026-06-02

Added

  • Import a JSON file into a table: an array of objects, newline-delimited JSON, or TablePro's JSON export, mapped to a new or existing table. Pick SQL or JSON from the Import menu.
  • The title bar shows the open table's name, with its database and schema below. (#1475)
  • iOS: open DuckDB database files and in-memory DuckDB databases. (#1526)
  • Save the current query as a favorite from the SQL editor toolbar.
  • Select and copy field names and types in the row Details panel.

Changed

  • The plugin interface is now binary-stable, so app updates that add plugin capabilities no longer force installed plugins to be rebuilt.
  • Connection list rows show the database name after the host, so look-alike connections are easier to tell apart. (#1535)
  • Save as Favorite uses Cmd+D again. The 0.47.0 Cmd+Control+D was reserved by macOS for Look Up.
  • Editor toolbar buttons show their keyboard shortcut in the tooltip, updated when you rebind it.
  • Window toolbar: connection and database selectors move left as navigation items, Refresh and Save move right. Customized toolbars reset once.

Fixed

  • PostgreSQL: the selected schema stays applied after an automatic reconnect, so unqualified table names keep resolving against it. (#1540)
  • Import now finds the Setapp edition of TablePlus and reads its connections. (#1528)
  • Favorite keyword suggestions now appear in editor autocomplete. They were dropped before reaching the popup.
  • Editor autocomplete refreshes when you switch schema, suggesting the new schema's tables and columns.
  • Plugins settings: the unloaded-plugins banner now scrolls instead of pushing the plugin list off screen, shows each plugin's real icon, and only offers an Update button when a compatible build exists. Plugins waiting on a build that publishes automatically no longer show a button that fails.
  • Opening a connection right after an app update no longer fails when its driver plugin needs updating. The driver updates in the background and the connection proceeds, instead of showing an error until you quit and reopen. (#1552)

0.47.0 - 2026-06-01

Added

  • Previous Page, Next Page, First Page, and Last Page are now in the Query menu. Previous and Next keep their Cmd+[ and Cmd+] shortcuts. (#1490)
  • Keyboard control of the sidebar: focus the filter field (Cmd+Option+F) and switch between the Tables and Favorites sidebars (Ctrl+1 and Ctrl+2). Tab or Down moves from the filter field into the list. All rebindable in Settings, Keyboard. (#1490)
  • Star a table in its sidebar row to favorite it. Favorites are scoped to the connection, database, and schema, pinned to the top of their section, listed in the Favorites tab, and synced through iCloud when Table Favorites is on.
  • A plus button in the Tables sidebar footer creates a new table or view without right-clicking. Disabled while safe mode blocks writes.
  • The sidebar can show every database on the server as an expandable tree. Switch between the flat list and the tree in the View menu (Sidebar Layout), and right-click a database or schema to set it active. Set the default for new connections in Settings, General. Applies to MySQL, MariaDB, PostgreSQL, MSSQL, ClickHouse, Redshift; SQLite, Redis, MongoDB, BigQuery keep their existing sidebar. (#139)
  • A connection can read its password from a file, environment variable, or command at connect time instead of the Keychain, so scripts can provision it without typing the password. (#1254)
  • PostgreSQL: PostGIS geometry and geography columns render as WKT with SRID instead of raw hex. (#1458)
  • Import connections from Navicat: export from Navicat (File, Export Connections), then pick the file under Import from Other App. SSH tunnel and SSL settings carry over, and saved passwords are decrypted during import. (#1485)

Changed

  • Save as Favorite moved from Cmd+D to Cmd+Control+D, leaving Cmd+D free for the system "Don't Save" action. Rebindable in Settings, Keyboard. (#1490)
  • The Tables sidebar footer uses native macOS styling. The schema switcher is now a borderless pull-down matching the Favorites footer, and switching schemas goes through the same path as the toolbar so filters and the active tab stay in sync.
  • The Maintenance submenu in the sidebar context menu is hidden when no operations apply or the target is read-only, instead of showing an empty disabled menu.
  • The window minimum width adjusts to the visible panes, so opening the inspector on a small window no longer pushes content off-screen.
  • Destructive queries (DROP, TRUNCATE, DELETE without WHERE) always ask for confirmation, even with Safe Mode off. (#1481)
  • Table structure changes, table creation, maintenance, column reorder, and saved data-grid edits follow the connection's Safe Mode and read-only setting. (#1481)
  • AI assistant and MCP queries follow the same Safe Mode, read-only, and authentication rules as the editor. (#1481)
  • iOS: sheet close, cancel, and confirm buttons use the native iOS 26 button roles, matching system apps like Mail. iOS 18 keeps titled buttons. (#1524)

Removed

  • "Create New Table…" from the sidebar right-click menu. Use the plus button in the Tables sidebar footer instead.

Fixed

  • The Details pane updates when you select a row by clicking, not only with the arrow keys. (#1496)
  • Tab and Shift-Tab move focus out of the AI rules field in the connection form instead of inserting a tab. (#1490)
  • The cell inspector's Set NULL, Set DEFAULT, copy, and SQL-function actions are now in a right-click menu on each field, reachable by keyboard, Full Keyboard Access, and VoiceOver, not only on hover. (#1490)
  • VoiceOver: grid selection changes are announced even when VoiceOver was not already on, the drop and truncate dialog toggles describe their effect, and the favorite query editor is labeled. (#1490)
  • Tab moves keyboard focus between the window panes (sidebar, results, inspector). (#1490)
  • The license activation sheet focuses the key field on open, the SQL review sheet closes with Escape even while the editor has focus, and the integration token sheet focuses its Done button. (#1490)
  • Copy with Headers now has a default shortcut (Cmd+Option+C) instead of appearing in the Edit menu with no key. (#1490)
  • VoiceOver reads the column name and current value for each field editor in the cell inspector. (#1490)
  • VoiceOver announces the active tab title when you switch between window tabs. (#1490)
  • Opening a query tab no longer pulls keyboard focus from the sidebar or another control; the editor takes focus only when nothing else holds it. VoiceOver now labels the SQL editor and the Clear and Format buttons. (#1490)
  • The connection form opens with the Name field focused, Return or Down in the welcome search moves to the connection list, and focus returns to the list after a sheet closes, so you can set up a connection without the mouse. (#1490)
  • Escape dismisses search-based sheets and popovers (database switcher, quick switcher, column and connection pickers). The first Escape clears the search text; a second closes the sheet. (#1490)
  • Running EXPLAIN or EXPLAIN ANALYZE in the editor opens the plan viewer instead of squashing the plan into one truncated grid cell. (#1480)
  • Filtering the data grid keeps you on the keyboard: applying or clearing a filter returns focus to the grid, Return applies the filter, and Escape closes the filter panel. (#1490)
  • Opening a table (Return or double-click in the sidebar) moves keyboard focus into the data grid for arrow-key navigation. Arrowing the sidebar still previews tables without taking focus. (#1490)
  • Moving a connection into or out of a group syncs across devices instead of leaving it ungrouped on your other Macs.
  • Opening a table on a connection with many tables no longer stalls for several seconds while autocomplete and metadata load. Schema introspection runs on separate connections instead of blocking the query that fills the grid. (#1483)
  • Cassandra SSL connections with a client certificate now have a Key Passphrase field for an encrypted private key, and report "key is encrypted" or "passphrase is incorrect" instead of a generic handshake failure. The passphrase is stored in the Keychain. (#1487)

0.46.0 - 2026-05-28

Added

  • Rectangular cell selection in the data grid, with Shift and Cmd modifiers to extend or add cells, and Cmd+C to copy as TSV. (#1446)
  • BigQuery datasets show as expandable nodes in the sidebar instead of one at a time behind a picker.
  • OpenCode Zen as an AI provider, with free models when no key is set. (#1400)
  • Oracle Database 11g (11.1 and 11.2) now connects. (#1425)
  • Oracle connections can use a SID instead of a service name. (#1425)
  • Cmd-click a foreign key arrow (or pick Open in New Tab from the right-click menu) to open the referenced table in a new tab. (#1421)
  • Favorite a connection from the welcome screen; starred connections appear in a Favorites section at the top of the list. (#1302)
  • Text-column cells holding JSON or PHP serialized values open in the structured viewer automatically.
  • Add and remove buttons in the table structure editor (Cmd+Shift+N to add, Cmd+Delete to remove), and a labelled add button on empty Indexes or Foreign Keys tabs. (#1319)

Changed

  • The query trash button clears results too, and a Clear Results item on the right-click menu clears results alone. (#1256)
  • Inserting SQL from AI Chat opens a new query tab, or fills an empty editor in place. (#1257)

Fixed

  • Safe mode level changes in the toolbar persist as the connection default across reconnects.
  • Toolbar customizations persist after closing and reopening a session window. (#1455)
  • Pasting rows with commas in a cell keeps each value in its own column and preserves NULL vs the literal text "NULL".
  • BigQuery: switching to another table loads its data immediately instead of leaving the grid empty.
  • Custom and OpenAI-compatible AI providers work when the base URL ends in /v1. (#1400)
  • MongoDB: opening a collection no longer crashes on documents containing NaN or infinite numbers. (#1418)
  • Connecting after an app update waits for in-progress plugin updates; when no compatible plugin build exists yet, the message asks you to update TablePro. (#1380)
  • Failed saved connections show the Test Connection troubleshooting dialog instead of a generic alert. (#1425, #483)
  • Oracle connection errors explain the cause in plain language instead of the driver's raw message. (#483)
  • AWS IAM authentication with a named profile reads ~/.aws/config and supports credential_process, so SSO, IAM Identity Center, and assume-role profiles work. (#1291)
  • Opening a table no longer runs the initial query multiple times before data arrives.
  • iOS: Safe Mode setting survives relaunch instead of reverting to Off after iCloud sync.
  • iOS: large query results no longer crash the app; the editor keeps the rows it loaded and suggests adding LIMIT.
  • iOS: Safe Mode "Confirm Writes" prompts before grid edits and inserts, matching the query editor.
  • Redshift: schema switching, table search, and contains/starts with/ends with filters now work. (#1439)
  • MCP server: turning on Require Authentication no longer hangs the first request, generates a default token if needed, and shows it once. (#1093)
  • The Generate Token sheet focuses the Token Name field on first open. (#1093)
  • Double-clicking a CSV or TSV file when TablePro is closed opens the file directly. (#1443)
  • Opening a .sql file names the tab after the file instead of "SQL Query". (#1220)
  • Server Dashboard shows the Slow Queries panel, with a draggable vertical split and remembered divider positions. (#1464)
  • Data grid row context menus now copy the clicked or focused cell value for Copy, while Copy Rows still keeps the full-row TSV action.
  • Opening a table in a new tab now restores saved hidden columns before the first load, so the initial query matches the visible column set.
  • The JSON detail popover now shows long string values up to 300 characters in the tree view instead of cutting them off at 80.
  • Restoring or previewing a table no longer leaves the Tables sidebar spinner stuck after the table list has already loaded.

0.45.0 - 2026-05-26

Added

  • Cloudflare Tunnel: connect to a database behind Cloudflare Access. TablePro starts and stops cloudflared access tcp per connection, the same way it manages SSH tunnels, with browser sign-in or a service token. Needs cloudflared (brew install cloudflared). (#1285)
  • Fill Column: right-click a column header to set one value across all loaded rows. The fill is staged like a normal edit, and one undo reverts it. Not available on primary key columns. (#1304)
  • AWS IAM authentication for PostgreSQL and MySQL on RDS and Aurora. Pick AWS IAM in the connection's Authentication field with an access key, named profile, or SSO. TablePro generates a fresh token on every connect and requires SSL. (#1291)
  • Date picker for date, datetime, timestamp, and time cells, from the chevron button. Double-clicking still edits the cell as text, and the picker keeps the value's format, fractional seconds, and timezone offset. (#1405)
  • Pagination bar for table tabs with a rows-per-page menu (5, 10, 20, 100, 500, 1,000, All rows, or custom) and First, Previous, Next, and Last buttons. (#1364)
  • Click the page indicator in the pagination bar to jump to a specific page. (#1364)
  • Pagination now appears for filtered tables with an unknown total row count, instead of showing only the first page. (#1364)
  • First Page and Last Page keyboard actions, unbound by default and assignable in Settings > Keyboard. (#1364)
  • JSON and JSONB cells display pretty-printed by default, keeping your key order and exact numbers. Viewing or reformatting no longer marks the row changed, and saving no longer reorders keys or rounds large integers.

Fixed

  • Changing the editor or data grid font size in Appearance settings now applies immediately and persists across relaunch, with no orphan custom themes left behind. (#1381)
  • Installing or updating a plugin right after updating TablePro now refetches the plugin list first, so it no longer fails against a stale cached list. (#1380)
  • Pressing Esc to close the Raw SQL filter suggestions, or to clear a search field, no longer also exits fullscreen. (#1403)
  • Connecting an OAuth-capable MCP client like Claude Code with an invalid or expired token now shows a clear error instead of "Invalid OAuth error response". (#1409)

0.44.0 - 2026-05-23

Added

  • Import connections and passwords from DataGrip, including SSH tunnels and SSL settings. The source app doesn't need to be running. (#1374)

Changed

  • Active Connections is now a searchable toolbar popover instead of a modal dialog. (#1350)

Fixed

  • Connecting to a PostgreSQL-compatible engine without the pg_matviews catalog (such as db9.ai) no longer fails to load tables. (#1383)
  • Filtering a table now updates the row and page counts to match the filtered result, instead of the whole-table totals.
  • Reopening a table restores the filter you had applied, per connection. Removing or clearing a filter is remembered too, so an unfiltered table reopens with no filter. (#1347)
  • Quick switcher panel height now fits its results instead of leaving empty space below short lists. (#1349)
  • Importing connections from TablePlus brings over saved passwords again, after a recent release looked under the wrong keychain name.
  • Importing an SSH connection from TablePlus no longer fills in a fake private key path when no key was selected, and skips empty TLS certificate paths.
  • Importing from DBeaver no longer shows an unnecessary keychain permission warning, since DBeaver stores passwords in its own file.
  • Raw SQL filter now suggests columns and keywords at every position, including after AND and OR, instead of only the first. (#1346)
  • Plugins left incompatible after a TablePro update now update quietly in the background instead of showing a premature "could not be loaded" alert. You are notified only when no compatible version exists yet. (#1322)
  • A plugin you download and install by hand is no longer blocked by macOS Gatekeeper once its signature is verified. (#1322)
  • Clicking a table now replaces the active tab instead of opening a new one when you have multiple tabs open. A new tab still opens for unsaved edits, an applied filter, or sorting; double-click always opens a new tab. (#1348)

0.43.3 - 2026-05-22

Fixed

  • Fixed a crash when adding a row while a cell editor or value viewer was open (#1378)

0.43.2 - 2026-05-22

Changed

  • Hiding a column now also drops it from the query, so tables with one heavy column load faster. The primary key is always fetched so editing still works

Removed

  • Removed the embedded database CLI terminal. Use your system terminal for command-line access to your databases.

Fixed

  • Opening a connection no longer crashes when its database plugin is older than the app; outdated plugins now update automatically (#1371)
  • Safe mode no longer resets when you open another table; it stays set for the connection until you change it (#1351)
  • Reassigning the Execute Query, Execute All Statements, and Cancel Query shortcuts now takes effect and shows in the Query menu (#1357)
  • Custom shortcuts now require a modifier key, so a plain key like Space is no longer silently ignored (#1357)
  • Cancelling a pending connection no longer lets the abandoned attempt overwrite a later successful one to the same database (#1358)
  • Cancelling a pending SSH connection now closes its tunnel instead of leaving the port open (#1369)
  • Importing connections from DBeaver now brings over the username (#1355)
  • Copying rows now includes only the visible columns, in their current order (#1354)
  • The query shown in the editor when you open a table now matches the query that actually runs
  • Large text columns are no longer truncated to 256 characters when browsing a table, so editing a cell can't save a shortened value

0.43.1 - 2026-05-20

Added

  • Right-click a column header to copy all its loaded values (#1325)
  • The row "Copy as" submenu adds CSV, CSV with Headers, Markdown table, and an IN clause for WHERE id IN (...) lookups (#1325)
  • A plugin update that arrives while a connection is open installs when you close the connection or quit, instead of being blocked
  • Settings > Plugins shows a badge with the count of rejected plugins and available updates
  • Connections whose driver plugin failed to load show a yellow warning triangle in the welcome list
  • A rejected driver plugin shows an inline banner with an Update Plugin button in the connection form

Changed

  • A plugin that fails to load no longer interrupts launch with an alert. The app posts a notification and lists rejected plugins in Settings > Plugins with Update Now and Remove buttons (#1322)
  • Rejected plugins auto-update from the registry in the background, retrying with backoff until they load (#1322)
  • The app installs the plugin binary built for its own version, even when the registry holds binaries for other versions (#1322)
  • Double-click or press Return on a read-only result cell to open a selectable text viewer. JSON columns open a viewer popover and BLOB columns open the hex viewer (#1336)
  • Cmd+C copies the focused cell when one row is selected and a cell has focus; otherwise it copies the selected row(s) as TSV. Cmd+Shift+C always copies row(s) as TSV. "Copy with Headers" stays in the Edit and row context menus (#1332)
  • Cmd+F toggles the filter panel on a table and opens Find in the SQL editor. The old Cmd+Shift+F filter shortcut is removed

Fixed

  • Fixes the recurring "Plugin was built with PluginKit version N, but version M is required" error after app updates. Rejected plugins now recover without manual steps (#1322, #1237, #923, #912, #443)
  • DuckDB spatial GEOMETRY columns show as WKT instead of NULL (#1324)
  • DuckDB HUGEINT and UHUGEINT keep full precision and no longer crash on negative values
  • DuckDB streaming results respect the row cap and show TIMESTAMPTZ, TIMETZ, and GEOMETRY instead of NULL
  • DuckDB schema reads handle apostrophes and concurrent schema switches
  • DuckDB ENUMs in schemas other than main resolve correctly
  • DuckDB DATE and TIMESTAMP BC years show a leading minus
  • .db, .db3, .s3db, .sl3, and .sqlitedb files open from Finder (#1327)
  • DynamoDB SSO connections work with sso-session profiles right after aws sso login, with no extra AWS CLI command (#1333)

0.43.0 - 2026-05-18

Added

  • Import connections from Beekeeper Studio, including encrypted passwords and SSH bastion hosts
  • Schema picker at the bottom of the Tables sidebar to switch the active schema (#1296)
  • Inline dropdown picker when editing ENUM and SET columns across MySQL, MariaDB, PostgreSQL, ClickHouse, DuckDB, and MongoDB JSON-schema enums (#1283)
  • Filter rows show an enum dropdown for = and != operators on enum columns (#1283)
  • CSV/TSV inspector: edit cells, filter, sort, add/remove/rename columns, undo/redo, auto-reload on external changes; large files stream from disk (#1259)
  • iOS: SQL Server connections via FreeTDS over TDS 7.4, with schema browsing, data browser, search, filter, pagination, and explicit transactions
  • iOS: Settings > Sync shows last sync time with Sync Now and Refresh from iCloud actions

Changed

  • Drivers populate allowed enum values directly in column metadata instead of parsing them downstream
  • PluginKit ABI bumped to version 13; all registry plugins need to be re-tagged
  • New PostgreSQL, MySQL, MariaDB, SQL Server, Redshift, and CockroachDB connections default to Preferred SSL mode, matching the native client library defaults
  • MySQL and MariaDB Preferred mode now does a 2-pass connect: tries TLS first, falls back to plaintext only on SSL handshake errors (auth and network errors are not retried)
  • SSL pane shows per-engine guidance and warns inline when the driver has no TLS fallback for Preferred mode
  • Connection failures caused by SSL handshake errors now show a structured message naming the cause and recommending an SSL Mode to switch to, with credentials redacted from the raw driver response

Fixed

  • Import from other apps now detects TablePlus, Sequel Ace, and DBeaver via LaunchServices, so newly installed apps are picked up before they have been opened (#1305)
  • ClickHouse and other HTTP-based drivers can now connect to plain-HTTP servers addressed by DNS hostname (#1316)
  • Import from TablePlus now reads passwords from the keychain correctly instead of returning empty
  • Port numbers no longer render with a thousand separator under locales that use a dot as a digit separator
  • New query tab (Cmd+T) no longer jumps focus back to the previous table tab on SQLite and other file-based databases (#1313)
  • File-based databases (SQLite, DuckDB) no longer flash the sidebar table list on window focus; external changes are picked up via the file watcher instead
  • PostgreSQL connections to AWS RDS, Cloud SQL, Azure, and other hosted Postgres no longer fail with "no pg_hba.conf entry for host" (#1298)
  • Oracle SSL/TCPS settings from the SSL pane are now respected; previously every Oracle connection was plain TCP
  • Cassandra SSL settings from the SSL pane are now respected; previously every Cassandra connection was plain TCP
  • MySQL and MariaDB Preferred mode no longer fails against Cloud SQL, Azure Database, and other hosted MySQL servers that require TLS

0.42.0 - 2026-05-16

Added

  • CockroachDB support over the PostgreSQL wire protocol, with a Connection Options field for libpq routing (#1226)
  • AI Chat: OpenAI Responses API for GPT-5 and Codex with a collapsible Thinking panel, reasoning effort picker, curated model picker, strict tool schemas by default, and image input via paste or drop (HEIC/TIFF/BMP converted, EXIF/GPS stripped) (#1112)
  • AI Chat: Claude extended thinking on Opus 4.7, Sonnet 4.6, and Haiku 4.5 (#1112)
  • iOS: SQL Server connections via FreeTDS over TDS 7.4, including data browser, search, filter, and pagination with SQL Server syntax
  • iOS: Settings > Sync shows last sync time with Sync Now and Refresh from iCloud
  • Settings > Data Grid > Default row sort opens tables sorted by primary key or first column (#1284)

Changed

  • Database switcher is now a toolbar popover with active-row checkmark, search, Refresh, and an engine-aware New Database footer (⌘N and ⌘R bound globally)
  • New Database and Drop Database use native sheet and confirmation dialogs

Security

  • AI Chat: destructive operations (DROP, TRUNCATE, ALTER...DROP) always prompt for approval; Silent mode and Always Allow no longer bypass the check

Fixed

  • AI Chat: Gemini tool calls no longer fail with 400, thoughtSignature round-trips after tool runs, and DeepSeek V4 thinking is captured across turns
  • AI Chat: GitHub Copilot tool registration accepts optional fields
  • MySQL/MariaDB: BIT(N) columns display as decimal numbers instead of raw bytes (#1272)
  • Structure tab: Refresh and ⌘R show external schema changes on Columns, DDL, and ClickHouse Parts (#1281)
  • Query editor: Enter and ⌘+Enter work after accepting an autocomplete suggestion, and double-click no longer closes the window (#1278)
  • Query editor autocomplete reflects external column renames after Refresh
  • ClickHouse, BigQuery, CloudflareD1, LibSQL, Etcd, and DynamoDB: long-running queries honor Settings > Query timeout instead of failing at 30 seconds (#1267)
  • MongoDB: connection form shows the Username field so auth-enabled servers stop failing with "requires authentication"
  • MongoDB: deleting a host from the multi-host editor keeps the list interactive (#1293)
  • SQL import: PostgreSQL dollar-quoted function bodies parse correctly, and statements are no longer dropped when the database is slower than the parser (#1264)
  • SQL export: views, materialized views, and foreign tables emit the matching DROP (#1264)
  • iOS: connections, groups, and tags survive TestFlight and App Store updates

Removed

  • Help > Report an Issue; the menu item opens GitHub Issues in a browser

0.41.0 - 2026-05-13

Added

  • File > Backup Dump… and Restore Dump… for PostgreSQL and Redshift, with live progress, cancel, and SSH tunnel reuse (#1211).

Changed

  • Plugin format updated. Older plugin builds no longer load; reinstall plugins from the registry after updating.

Fixed

  • Redis: "Required (skip verify)" SSL mode now actually skips certificate verification, so Upstash and other untrusted-CA endpoints connect (#1247).
  • MSSQL: SSL mode setting now affects the connection. Previously every mode was silently ignored.
  • MongoDB: "Required" and "Verify CA" SSL modes connect to self-signed and untrusted-CA servers instead of failing.
  • MongoDB: connecting no longer crashes with dispatch_sync called on queue already owned by current thread (#1249).
  • MongoDB: TLS handshake to Atlas no longer fails with internal error (-9838) on macOS 26.
  • MongoDB: importing a connection URL with no database path now works for Atlas users restricted to one database.
  • MySQL: CA certificate is no longer loaded when the SSL mode skips verification, matching PostgreSQL.

0.40.3 - 2026-05-13

Fixed

  • AI Chat: scrolling stays smooth on long conversations and stream completion no longer briefly hides the chat. (#1239)
  • AI Chat: starting a new conversation no longer carries context from the previous one.
  • PostgreSQL: connecting to servers older than 9.3 no longer fails on schema load. (#1240)
  • MySQL: EXPLAIN now offers a plain variant that works on every version.
  • MSSQL: editing a view on SQL Server 2014 or earlier no longer fails with a syntax error.
  • Cassandra: connecting to a 2.x server now shows a clear unsupported-version message instead of failing on sidebar load.
  • MongoDB: connecting to servers older than 3.4 no longer fails on the database listing.
  • ClickHouse: the index sidebar no longer fails on versions older than 19.17.

0.40.2 - 2026-05-12

Added

  • Right-click Set Value on date, datetime, and timestamp cells now offers CURRENT_DATE, CURRENT_TIME, NOW(), and CURRENT_TIMESTAMP, filtered by column type.
  • Welcome screen left pane gains an Import from Other App button.

Changed

  • Row numbers in the data grid continue across pages and the # column auto-sizes to fit the widest visible number.
  • Date, datetime, and timestamp cells use the standard inline text editor; the popover date picker is removed.
  • Foreign key preview popover follows the selected row as you arrow up or down.
  • The connection window shows the connecting state inline with a Cancel button.

Fixed

  • Closing the connection window during a slow connect no longer leaves a stuck "Connecting…" window or a stray failure alert (#1185).
  • Cmd+Z while editing a cell now undoes typing in the editor; pressing it after dismissing the editor no longer crashes.
  • Cmd+Z right after Add Row no longer leaves a stranded editor floating over the removed row.
  • Editing a NULL cell and dismissing without typing no longer flips the value to an empty string.
  • Double-clicking another cell while editing no longer delays the new editor or drops pending changes on the previous one.
  • Double-clicking an enum, set, or boolean cell now opens the inline text editor; the chevron still opens the picker popover.
  • Chevron-accessory cells (enum, boolean, JSON, blob) no longer truncate short values that fit the full cell width.
  • DATE columns no longer render a phantom 00:00:00 time suffix.
  • Adding a new row no longer renders the row on top of the auto-opened cell editor mid-animation.

0.40.1 - 2026-05-12

Changed

  • Quick Switcher matches the Open Database dialog and shows a Recent section per connection.
  • Connection Switcher and SQL Preview open as sheets so they work from the toolbar, overflow menu, and keyboard shortcuts.
  • Filters button moved out of the toolbar; the bottom-bar Filters control remains.
  • Welcome screen drops the Import Connections button; both import flows remain in the + menu.

Fixed

  • Toolbar overflow menu entries now fire their action when the window is narrowed.
  • SQL Preview no longer freezes when previewing a very large batch.
  • Quick Switcher crash on macOS 26.
  • Registry updates for bundled drivers (ClickHouse, Redis) now persist after restart.

0.40.0 - 2026-05-12

Added

  • Vim mode in the SQL editor (motions, operators, text objects, registers, macros, marks, search)
  • Sidebar groups views, materialized views, foreign tables, procedures, and functions; Show DDL opens in a new tab (#1038)
  • iOS: Live Activity for running queries
  • iOS: multi-window on iPad
  • iOS: Face ID / Touch ID / Optic ID app lock with idle timeout
  • iOS: background iCloud sync
  • iOS: Connection Info tab
  • iOS: Cmd+F focuses search; search text persists across kill
  • iOS: VoiceOver delete actions; Create button on empty Groups/Tags; No Results empty state; alert when active connection is deleted mid-session
  • iOS Settings: iCloud Sync, Rows per Page, Default Safe Mode, Hide query in Live Activities
  • MCP Setup adds Zed

Changed

  • Wide-table scroll faster (max main-thread stall 3.5s to 1.3s); display cache 50k rows / 64 MB
  • Sidebar: white tint on selected row; per-section count removed
  • Edits in one window no longer refresh unrelated windows (favorites, history, linked folders)
  • iOS: Vietnamese localization complete
  • iOS: centered nav title dropped on connection tabs
  • iOS accessibility: combined VoiceOver row labels, icon-button labels, badge size caps
  • iOS: SQL editor uses the system keyboard input view; Edit Connection moved to the nav bar
  • PostgreSQL SQL export round-trips foreign keys and sequences cleanly (#1114)
  • SQL import parser streams large files (#1114)
  • AI inline-suggestion debounce configurable (default 500 ms)
  • Copilot LSP: 10s shutdown cap; quarantine attribute stripped
  • MCP HTTP: 30-second SSE keep-alive
  • AI providers: 5s timeout, known-model fallback, model list through Claude 4.7
  • AI Chat: per-tool access modes; duplicate slash command names rejected
  • AI Chat views: native button styles, semantic colors, 8-pt grid, a11y labels
  • Translucent surfaces honor Reduce Transparency and Increase Contrast
  • Result grid: direct-draw cells on a layer-backed view
  • Plugin contract: typed binary cells across all engines (#1188)
  • Double-click and Return on a binary cell open the hex editor
  • Plugin registry cache moved to ~/Library/Caches
  • Plugin install off the main actor; signing reads team id at runtime
  • Restart TablePro banner gains Quit & Reopen; state in-memory only
  • Default PluginKit escape no longer escapes backslashes

Fixed

  • Vim: Shift+J joins lines; w/W no longer overshoot; Esc switches mode after ; (#1222)
  • AI Chat: Copilot Agent mode persists across turns
  • AI Chat: streaming no longer hangs at 100% CPU; pre-tool text shows above the tool card; native Markdown renderer (#1205)
  • AI Chat: @ mentions handle emoji at the cursor
  • AI Chat: Fix Error prompt uses the database display name
  • iOS: data browser no longer flashes No Data during reload
  • iOS: row detail pager crash on filter
  • MySQL/MariaDB: BINARY(N)/VARBINARY(N) route to blob editor; numeric/date/time render as values; stable JSON detection
  • Data grid chevrons refresh on editability change and dim on deleted rows
  • Welcome window opens reliably on launch and Dock click
  • Plugin upgrades for built-in drivers persist after restart (#1192)
  • Plugin install: end-to-end install lock; no continuation leak; multi-bundle ZIP rejected; auto-update preserves concurrent rejections
  • Built-in plugins enforce the PluginKit version check
  • Query cancelled alert no longer appears on tab supersession, refresh, or teardown
  • Structure tab: tinting repaints on edit, delete, undo, save, discard; right-click Undo Delete; dropdown columns enter inline edit; Cmd+Shift+N adds a row
  • Structure view: switching Columns / Indexes / Foreign Keys no longer shows stale data (#1110)
  • Create Table: foreign-key and index-type columns render as dropdowns
  • Sidebar tables load after a slow connect
  • SQL Server: USE <database> switches DB; IDENTITY skipped on INSERT; default schema from SELECT SCHEMA_NAME(); DATETIME round-trips as ISO 8601
  • Toolbar database/schema chip correct on connect
  • Safe Mode silent: Cmd+Return no longer double-fires
  • LSP cancelRequest no longer leaks continuations
  • Schema provider no longer leaks via throwaway coordinator
  • Reconnect-then-disconnect no longer writes into a tearing-down coordinator
  • Sync coordinator: no overlapping tasks; syncNow is re-entrant-safe
  • Failed connections-file save aborts dependent steps; form stays open with error
  • iCloud sync: decode failures skip the record/category and log; cloud copy preserved
  • Keychain reads distinguish cancelled prompts, failed biometrics, and not-found
  • Terminal PTY writes retry on EINTR
  • MCP HTTP: structured internal-error envelope on encode failure
  • Closing the last window no longer flashes Connection lost
  • Smart-quote and dash substitution in cell editors and filter inputs
  • Connecting one window no longer fetches tables in unrelated windows
  • Foreign-key navigation from a tab with unsaved edits opens in a new tab without wiping the original
  • SQL import: tables sidebar refreshes; PostgreSQL Disable foreign key checks; identity columns and dollar-quoted blocks round-trip (#1114)
  • PostgreSQL/Redshift: schema picker no longer hides pg* user schemas
  • Connection-only payloads no longer create an empty Query 1 tab
  • Import from Other App: Cancel button stops the keychain prompt loop (#1134)

0.39.1 - 2026-05-08

Added

  • AI Chat: tool calling with per-card approval, Ask / Edit / Agent modes, and 7 providers (Anthropic, OpenAI, OpenRouter, Gemini, Ollama, GitHub Copilot, custom OpenAI-compatible)
  • AI Chat: @ mentions for Schema, Table, Current Query, Query Results, and saved queries
  • AI Chat: slash commands (/explain, /optimize, /fix, /help) plus user-defined commands
  • AI Chat: inline model picker with per-turn model attribution
  • AI Chat: per-connection rules for the assistant
  • Linked SQL Folders: two-way sync between Favorites and a folder of .sql files
  • Database type chooser sheet for new connections
  • Connection URL import in the database type chooser

Changed

  • iOS: streaming data layer for large queries
  • Toolbar shows a tinted engine icon to distinguish windows on the same database (#1044)
  • XLSX export is free
  • Safe Mode is free
  • Favorites sidebar is connection-scoped
  • Connection Form: sidebar navigation with native toolbar actions
  • "Read-Only" / "Read-Write" renamed to "Read Only" / "Read & Write"
  • ER diagram nodes scale with system text size
  • Welcome, Connection Form, and Integrations Activity use SwiftUI scenes

Fixed

  • App fails to launch on 0.39.0 with errno 163 "Launchd job spawn failed". Production entitlements shipped a literal $(AppIdentifierPrefix) placeholder in keychain-access-groups because codesign --entitlements does not expand Xcode build variables. Reverted to the hardcoded team prefix; personal-team contributors still use TablePro.Debug.entitlements (#1104)
  • "MariaDB plugin not installed" prompt for built-in lazy drivers
  • Cmd+K Quick Switcher schema selection on SQL Server and Oracle
  • iOS: crash opening some MySQL tables
  • iOS: silent timeout on .local and local-network addresses
  • iOS: row list "Index out of range" crash on shrink (#1094)
  • iOS: out-of-range port crash on MySQL, PostgreSQL, Redis (#1094)
  • IME editor jump after committing words like "测试" (#1012)
  • Cmd+T tab focus flash
  • Cmd+X with no selection now cuts the line (#1075)
  • Cmd+A on a query with a trailing newline (#1075)
  • Editor window size, position, and zoom across launches
  • Personal Apple Developer team builds (#1020)
  • SSH auth-failure alerts labelled the wrong cause (#1005)
  • TOTP codes rejected across rotation boundary
  • SSH Password against keyboard-interactive-only servers (#1005)
  • SSH Password + Google Authenticator (#1005)
  • Up/Down arrow at end-of-document caret
  • Caret line-number color in the gutter
  • Cmd+Left/Right at end of a line without a trailing newline (#1007)
  • Multi-window tab persistence dropped all but one tab on relaunch
  • Filter autocomplete focus on Full Keyboard Access
  • Toolbar database name on relaunch
  • Cmd+K database switch reverted in Cmd+T and other paths (#1043)
  • AI provider Test Connection showed unsupported URL on draft endpoint
  • Connection Form coordinator rebuilt on every parent re-render (#1102)
  • MongoDB SRV connection strings include the port (#1101)
  • AI Chat composer: IME, scroll bar, Shift+Return (#1100)
  • AI Chat tool roundtrip limit raised 5 → 10 (#1096)
  • AI Chat per-connection rules CloudKit sync (#1098)
  • AI Chat Retry button on non-recoverable errors
  • AI Chat code blocks without a language tag
  • AI Chat Insert button focus
  • MCP errors surface readable messages (#1095)
  • Data grid column header inset
  • Toolbar connection status left inset

0.38.0 - 2026-05-04

Added

  • Welcome window: "Check for Updates" link next to the version number
  • Window menu: dedicated Integrations Activity window for the MCP activity log and connected clients. Sidebar, native search, filter, refresh, export. Position remembered across launches
  • Sample database (Chinook) bundled. Open from welcome screen with one click; reset via File menu
  • Connection string detection: paste a postgres://, mysql://, redis://, or mongodb:// URL to auto-fill the form
  • MCP: protocol versions 2025-06-18 and 2025-11-25 (in addition to 2025-03-26). Includes structured tool output (structuredContent), tool annotations (readOnlyHint, destructiveHint, etc.), completions capability, and streaming progress notifications via notifications/progress
  • MCP: pairing redirect carries error=denied when the user clicks Deny
  • MCP: re-pairing the same client name revokes the previous token
  • Oracle 10G password verifier auth, matching DBeaver/JDBC/sqlplus (#483)
  • Oracle Test Connection: diagnostic sheet on auth failure with copy-able info, suggested actions, and an issue link
  • Oracle connection negotiation matches python-oracledb 23ai (TTC4 boundary, TTC5 token/pipelining/sessionless, OCI3 sync, dequeue selectors, sparse vectors)
  • SSH tunnel resolves ~/.ssh/config host aliases at connection time, with full ssh_config(5) semantics: glob Host patterns, all Match types, ProxyJump, hostname canonicalization, Include. Live (no app restart). Applies to primary host and jump hosts (#977)

Changed

  • Welcome window aligned to macOS HIG: subtle drop shadow on the app icon (no accent glow), dynamic text styles, "Sponsor" button removed, "Create connection" uses the bordered style, toolbar + / new-group buttons gain a hover background, native window vibrancy via NSVisualEffectView
  • Settings > Integrations is a flat preferences pane per macOS HIG. Activity log and connected-clients moved to the new Integrations Activity window; setup snippets to a "Connect a Client…" sheet
  • MCP: idle session timeout 5 → 15 minutes
  • MCP: server, stdio bridge, and protocol dispatcher rewritten for spec compliance. Public API of MCPServerManager and the on-disk handshake format unchanged; clients do not need to re-pair
  • Security: non-syncing keychain items use kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly. Keeps local-only secrets out of unencrypted device backups. Existing items keep their accessibility class until you re-save
  • Settings > Sync > Passwords: caption clarifies the toggle only affects new saves

Removed

  • SSH useSSHConfig per-connection toggle. ~/.ssh/config is always consulted now; explicit form values still take precedence
  • Legacy-keychain migration and password-sync-state migration. Both violated Apple's Data Protection keychain contract on sandboxed macOS and corrupted credentials. Stale items in the legacy keychain can be cleaned via Keychain Access

Fixed

  • Welcome / connection form / feedback panel now remember position and size across launches (frame autosave was missing on the underlying NSWindow/NSPanel)
  • Saved connection passwords no longer disappear after relaunch. The legacy-keychain migration was deleting the only copy on sandboxed macOS; removed entirely
  • Cmd+Z after editing a cell now clears the yellow "modified" highlight (the coordinator's dataTabDelegate was being nilled too eagerly)
  • Tab switching: rapid Cmd+Number no longer leaves a tail of tab transitions after key release. AppKit switches now apply synchronously via NSAnimationContext with duration = 0
  • Oracle: TIMESTAMP variants, INTERVAL DAY TO SECOND, INTERVAL YEAR TO MONTH, DATE, RAW, and BLOB render through typed decoders. INTERVAL YEAR TO MONTH and BFILE no longer crash on row fetch. Unknown types show <unsupported: type> instead of crashing (#965)
  • Oracle: 23ai cloud and container handshakes no longer fail with uncleanShutdown. OOB urgent-byte send now requires TNS_ACCEPT_FLAG_CHECK_OOB advertisement (#483)
  • Plugin install prompt reopens when connecting to a downloadable database type whose plugin is disabled or uninstalled (#975)
  • Redshift: schema switcher no longer empty for non-admin users. Reads from pg_namespace filtered by has_schema_privilege instead of information_schema.schemata (#971)
  • MCP: GET /mcp opens a real SSE notification stream
  • MCP: concurrent tool calls no longer serialize at the dispatcher loop
  • MCP: server validates protocolVersion and MCP-Protocol-Version; rejects unknown versions with -32600 invalid_request
  • MCP: 429 responses include a real Retry-After header from the rate-limiter lockout
  • MCP: token revocation cancels in-flight requests and terminates sessions
  • MCP: CORS reflects the request Origin against an allowlist (localhost, 127.0.0.1, claude.ai, app.cursor.com)
  • MCP: stale Mcp-Session-Id after idle timeout returns JSON-RPC -32001 "Session not found" with HTTP 404, letting clients re-initialize cleanly instead of hanging until a 4-minute client timeout
  • MCP: stdio bridge uses FileHandle.bytes AsyncBytes (no more silent exit on briefly empty stdin)
  • MCP: SSE responses stream incrementally instead of buffering
  • MCP: rate limiter keys on (client_address, principal_fingerprint) to close localhost auth-DoS
  • MCP: in-app setup snippets use the stdio command form for tablepro-mcp (Claude Desktop rejected the URL form)
  • MCP: duplicate initialize returns invalid_request instead of overwriting clientInfo
  • MCP: xcodebuild test no longer leaves an orphan TablePro.app running
  • MCP: server start cleans stale handshake file from a crashed previous PID
  • MCP: activity log auto-refreshes when new audit entries are written

0.37.0 - 2026-05-01

Added

  • External API for Raycast, Cursor, Claude Desktop, and other MCP clients. New Integrations panel with token-based pairing (PKCE), per-connection access control, and a 90-day activity log
  • New MCP tools: list_recent_tabs, search_query_history, open_connection_window, open_table_tab, focus_query_tab
  • Per-connection External Access setting (blocked / readOnly / readWrite); effective scope is the minimum of token scope and connection level
  • PostgreSQL ICU collation provider in Create Database (PG 15+)
  • Connection URL parsing supports SSH user:password@host, multi-host, MongoDB auth params, and Redis database index
  • SSH Private Key auth auto-resolves keys from ~/.ssh/config and default locations (id_ed25519, id_rsa, id_ecdsa)
  • Single-click cell editing in the data grid (no more double-click)
  • Multi-cell paste from TSV clipboard data, grouped as one undo
  • Shift+Tab navigates to the previous cell
  • Copy rows in TSV, HTML table, and plain text for richer paste in spreadsheet apps
  • AI provider settings allow manually entering a model name when the provider does not return one
  • VoiceOver: column headers announce sort direction and priority; cells expose row and column index ranges

Changed

  • Result safety cap is enforced after the query runs, not by rewriting your SQL. When a result is capped, the status bar shows "Showing N rows (truncated)" with a Fetch All button. Load More on user-query tabs is removed; table-tab pagination is unchanged
  • MCP server lazy-starts on first external request; manual enable is gone
  • Settings tab renamed from "MCP" to "Integrations" with sections for connected clients, activity log, and pairing
  • Activity log gained an Export button that writes the current filtered list to CSV
  • Connection Advanced settings: AI Policy and External Clients share a single External Access section with a segmented control
  • Create Database is driver-driven; engines without creation support hide the Create button instead of failing on click
  • Data grid: persistent column reuse pool, SF Symbol sort indicators that respect light and dark mode, header divider taps trigger resize instead of sort, focus ring follows system accent
  • Data grid undo/redo uses the window's UndoManager, unifying Cmd+Z across editor and grid
  • Right-click during cell editing shows the native text context menu instead of the row menu
  • OpenSSL shared as dylib across app and plugins, reducing bundle size by ~15MB

Removed (BREAKING)

  • Old name-based deep links (tablepro://connect/{name}/...) are gone. Use UUID-keyed paths from "Copy Connection Deep Link" in the sidebar context menu; saved bookmarks must be regenerated
  • MCP server data directory moved from ~/Library/Application Support/com.TablePro/ to ~/Library/Application Support/TablePro/. Re-pair external clients after upgrading. Delete the old directory with rm -rf ~/Library/Application\ Support/com.TablePro
  • Separately distributed plugins (Oracle, DuckDB, MSSQL, MongoDB, BigQuery, LibSQL, Cassandra, Etcd, Cloudflare D1, DynamoDB) require update before use. PluginKit ABI bumped to 9
  • Settings renamed: enforceQueryResultLimit is now truncateQueryResults, queryResultLimit is now queryResultRowCap. Custom values revert to defaults on first launch

Fixed

  • SELECT queries with a user-written LIMIT now return the requested row count. The query engine no longer strips your LIMIT and substitutes its own cap, so LIMIT 10 returns 10 rows. Affected SQLite, DuckDB, LibSQL, ClickHouse, Redshift, Cloudflare D1, and the MCP query path. MSSQL and Oracle no longer silently inject ORDER BY 1 either (#956)
  • Crash on macOS 26 when opening SQL Preview
  • File associations for .sql, .sqlite, .duckdb now appear in Finder's Open With menu
  • New tab from the empty state replaces the placeholder instead of opening a side-by-side tab
  • PostgreSQL Create Database collation errors on glibc-initialized servers (#927)
  • Redshift Create Database emits valid COLLATE { CASE_SENSITIVE | CASE_INSENSITIVE } instead of PostgreSQL LC_COLLATE syntax
  • SSH agent and IdentityAgent socket paths now expand ~ so 1Password and similar agents work
  • Connection form usePrivateKey=true from URL no longer disables Test and Create buttons
  • Transient connections from URL clean up keychain entries on connection failure
  • Native Search Field focus regression when clearing text
  • Group and connection deletions persist before firing the sync notification, fixing a race that could re-upload deleted records to iCloud
  • MCP execute_query: trailing semicolons no longer break appended LIMIT/OFFSET
  • Pairing approval: 5-minute countdown timer, searchable connection list, can no longer grant via Return key, requires explicit Approve click
  • Token deletion and client disconnect now require confirmation
  • Activity log: searchable across action, token, connection, and details; connection name shown instead of UUID prefix; single scroll owner
  • Token, audit, and pairing sheets respect Dynamic Type and dark mode; warning banner stays visible in dark mode
  • Token list switched to a native list with keyboard navigation, multi-select, and a context menu (Revoke, Copy ID, Delete)
  • "Last used" timestamps use RelativeDateTimeFormatter for correct localization
  • Refuse to generate SQL when the database dialect cannot be resolved, instead of silently emitting unquoted identifiers

0.36.0 - 2026-04-27

Added

  • GitHub Copilot: inline suggestions, chat, OAuth sign-in, schema context
  • Query parameters: :name placeholders in SQL with inline value panel and native prepared statement binding
  • Plugin auto-update at launch and one-click update in Settings
  • Connection sharing: Copy Connection String, Copy TablePro Link, Copy as JSON via Share menu
  • MCP server: token auth with permission tiers, TLS, remote access, rate limiting, stdio bridge, one-click setup for Claude Code/Desktop/Cursor
  • Edit > Find menu item (Cmd+F)

Changed

  • AI settings rewritten as single tab with one active provider, per-provider config sheets
  • Filter value field uses native SwiftUI suggestion dropdown
  • MCP bridge pins TLS certificate fingerprint
  • Native NSSearchField in keyboard shortcuts, database switcher, quick switcher
  • About window uses standard macOS panel

Fixed

  • Plugin ABI mismatch guard for user-installed plugins
  • SQL parameter escaping for control characters and edge-case formats
  • Query parameter conversion for Bool, Date, Data, non-finite numbers
  • Filter preset duplicate name overwrite
  • Raw SQL filter injection and destructive statement validation
  • IME input (Chinese, Japanese, Korean) in filter value field
  • MCP server shutdown on app quit and access policy enforcement
  • Foreign app import: SSL/SSH parsing for TablePlus, DBeaver, Sequel Ace
  • Export race condition, missing confirmation dialog, empty state
  • Window position restore, connection error display, list selection clicks
  • Localization for error messages, connection labels, filter options

0.35.0 - 2026-04-25

Added

  • MongoDB multi-host connections for replica sets
  • JSON results view mode with Data/Structure/JSON toggle in status bar
  • JSON viewer: "Open in Window" action for resizing and fullscreen
  • Import URL: dynamic placeholder, parsed preview, clipboard auto-paste, libSQL/D1/Oracle/ClickHouse/etcd support
  • In-app feedback form via Help > Report an Issue
  • Per-connection "Local only" option to exclude from iCloud sync
  • Filter operator picker shows SQL symbols alongside names
  • SQL autocomplete suggests columns before FROM using cached schema
  • MCP query safety: server-side confirmation for write and destructive queries

Changed

  • Native macOS UI: menu pickers, native alerts, native List selection, NSSearchField, borderless toolbar buttons
  • Quit dialog defaults to Cancel on Return key
  • Connection form delete button moved to far left

Fixed

  • Connection form overflow with SSH jump hosts and TOTP fields
  • Missing confirmation on group deletion
  • Plugin principalClass resolved off main thread
  • Crash when scrolling AI Chat during streaming on macOS 15.x
  • Connection failure on PostgreSQL-compatible databases without SET statement_timeout
  • Schema-qualified table names resolve correctly in autocomplete
  • Alert dialogs use sheet attachment instead of bare modal

0.34.0 - 2026-04-22

Added

  • libSQL / Turso plugin
  • JSON viewer with text/tree toggle
  • MCP server with client list and status menu
  • Import connections from TablePlus, Sequel Ace, DBeaver
  • Database CLI terminal (`Ctrl+Cmd+``)
  • Structure tab: alter columns, indexes, foreign keys, primary keys

Fixed

  • SQL formatter preserving original case, UNION and parentheses spacing

Changed

  • Sidebar toggle uses Xcode-style navigator buttons
  • Sidebar and inspector use native split view controls
  • Theme colors follow system appearance and accent color. Removed Layout tab, font sizes use system text styles.

0.33.0 - 2026-04-19

Added

  • Cancel running query from toolbar or Cmd+.
  • Execute All Statements shortcut (Cmd+Shift+Enter) (#770)
  • Drop database from the database switcher (context menu, toolbar button, Delete key)
  • Query result limit setting in Data Grid preferences
  • Structure tab: search, sort, count badges, PK column, DDL view with highlighting, Copy As (CSV/JSON/SQL), dropdown pickers, destructive change confirmation
  • Structure tab: charset/collation (MySQL), index prefix length, partial indexes (PostgreSQL), cross-schema FK, schema changes in query history
  • ClickHouse: parts tab actions (optimize table, drop/detach partition)
  • Streaming export for query results with partial loading (no memory limit)
  • Import error handling modes: Stop and Rollback, Stop and Commit, Skip and Continue
  • Handoff via NSUserActivity

Changed

  • Query tabs load rows progressively (default 10,000) with Load More and Fetch All in status bar
  • Main editor window rewritten on AppKit (NSWindowController + NSToolbar) for faster tab opens and correct lifecycle
  • Toolbar layout follows Apple HIG (sidebar left, connection center, view actions right)
  • Export engine rewritten: streaming row fetch, macOS system progress, atomic file writes
  • SQL import parser rewritten: DELIMITER support, MySQL conditional/hash comments, chunk boundary handling, single-pass async decompression, error surfacing

Fixed

  • Selection highlight not covering the last line on Cmd+A (#770)
  • Cmd+W closing the connection window instead of clearing to empty state
  • ER Diagram and Server Dashboard replacing the current tab instead of opening a new one
  • Welcome window stealing focus on connect, disabling Cmd+T until manual click
  • Toolbar empty on second tab, menu shortcuts disabled after toolbar click
  • AI chat freeze when large queries or results are in the system prompt (#774)
  • AI chat panel not updating when switching database connections
  • Schema restored on reconnect for PostgreSQL, Redshift, and BigQuery (#777)
  • Database restored after auto-reconnect (was lost when connection dropped)
  • Database switch no longer closes windows before confirming success
  • Redis database selection persisted across sessions
  • SSH jumphost lost after disconnect or app restart (#790)
  • Password appears missing when Keychain is locked after reboot (#780)
  • Import: correct rollback reporting, FK checks restored after failure, decompressed-size progress
  • JSON export no longer coerces leading-zero strings to integers
  • XLSX export auto-splits tables exceeding 1,048,576 rows into multiple sheets
  • CSV formula injection guard corrected to OWASP-standard prefixes only
  • MQL export validates JSON values before passthrough
  • SQL export gzip compression is now async and cancellable
  • Export progress bar reliably reaches 100%

0.32.1 - 2026-04-17

Changed

  • Revert in-app tab bar refactor to restore native macOS window tabs (stability)

0.32.0 - 2026-04-16

Fixed

  • Raw SQL injection via external URL scheme deeplinks — now requires user confirmation
  • MySQL prepared statements silently truncating columns larger than 64KB
  • MSSQL error messages misattributed when multiple connections open simultaneously
  • BigQuery filter injection via unescaped column names and unvalidated operators
  • App quitting without warning when tabs have unsaved edits
  • Connection list corruption risk from non-atomic UserDefaults writes
  • Stale user-installed plugins silently rejected with no UI feedback
  • SSL mode picker showing misleading "Required" instead of "Required (skip verify)"
  • Plugin load blocking main thread on first connection after launch

Changed

  • OpenSSL updated to 3.4.3 (CVE-2025-9230, CVE-2025-9231)
  • SHA-256 checksum verification added to FreeTDS, Cassandra, and DuckDB build scripts
  • Memory pressure monitoring now reactive via DispatchSource

0.31.5 - 2026-04-14

Fixed

  • Fix AI chat hanging the app during streaming, schema fetch, and conversation loading (#735)
  • SSH Agent auth: fall back to key file from ~/.ssh/config or default paths when agent has no loaded identities (#729)
  • Wire AI Explain (⌘L), Optimize (⌘⌥L), and Toggle Sidebar (⌘0) shortcuts to menu bar commands
  • Keyboard shortcuts follow macOS HIG — remap Quick Switcher to ⌘⇧O, Format Query to ⌘⇧L, fix stale tooltip hints
  • SSH-tunneled connections failing to reconnect after idle/sleep — health monitor now rebuilds the tunnel, OS-level TCP keepalive detects dead NAT mappings, and wake-from-sleep triggers immediate validation (#736)
  • Composite primary key tables: editing or deleting a row affects all rows sharing the first PK value instead of just the target row
  • Structure view saves bypass safe mode on read-only connections

0.31.4 - 2026-04-14

Added

  • iOS: database brand icons instead of SF Symbols (#733)

Fixed

  • Native tab bar "+" button always creates "Query 1" instead of incrementing (#727)
  • Sidebar gap inconsistent when switching tabs (#728)
  • SSH Agent auth failing when SSH_AUTH_SOCK not in process env (#729)
  • iOS: SSH private key import file not working during test connection (#730)
  • iOS: SQLite file picker not updating after file selection (#732)
  • Default shortcut mismatch with toast in toggle inspector (#726)

0.31.3 - 2026-04-13

Added

  • Restore all open connections and tabs after quitting the app (#703)

Fixed

  • Database Switcher: auto-select first item on fast typing (#714)
  • AI settings: fix Ollama model selection and error messages (#712)
  • SQL formatter: rewrite with token-based architecture (#705)
  • Filters: = NULL auto-converts to IS NULL, BETWEEN and IN/NOT IN NULL handling (#706)
  • SQLite: auto-detect schema changes from external tools (#704)
  • UI layout stability when toggling menus, panels, and inspectors (#702)
  • Misc bug fixes: save tabs before DB switch, log rollback failures, standardize colors, fix localization, button safety, filter validation (#707)
  • Fix Ollama AI chat streaming — responses were silently discarded due to wrong stream format parsing

Changed

  • Keyboard shortcuts follow macOS HIG — ⌘F is Find, ⌘⇧F for filters, ⌘⌥I for inspector, ⌘0 for sidebar
  • Format Query and Pagination shortcuts now customizable in Settings
  • Menu bar restructured per macOS HIG: ⌘N opens connection list (#722), new Query menu, Help search restored, duplicate items removed

0.31.2 - 2026-04-13

Fixed

  • Query tabs always named "Query 1" instead of incrementing (#695)
  • Sidebar empty in new or restored window tabs (#694)
  • Tab titles, order, and persistence lost on quit/restore
  • PostgreSQL version display for v10+ (#698)
  • License activation metadata and deactivation error handling

0.31.1 - 2026-04-12

Fixed

  • iCloud Sync not working on TestFlight/App Store builds (CloudKit environment set to Production)

0.31.0 - 2026-04-12

Added

  • Server Dashboard: active sessions, metrics, slow queries (PostgreSQL, MySQL, MSSQL, ClickHouse, DuckDB, SQLite)
  • Handoff support between iOS and macOS
  • iOS: full-text search in data browser, state restoration, iPad keyboard shortcuts

Changed

  • Sidebar table loading refactored: single source of truth, explicit loading states, no race conditions on database switch

Fixed

  • Create Database dialog now shows correct options per database type (encoding/LC_COLLATE for PostgreSQL, hidden for Redis/etcd)
  • SSH tunnel with ~/.ssh/config profiles (#672): Include directives, token expansion, multi-word Host filtering

0.30.1 - 2026-04-10

Added

  • Auto-uppercase SQL keywords setting (#660)
  • Unified cell editor chevrons for boolean, enum, date, JSON, blob columns (#665)

Fixed

  • MSSQL connection failing on Docker/fresh SQL Server (#661)
  • Context menu Format SQL not working (#659)

0.30.0 - 2026-04-10

Added

  • ER diagram with interactive layout, crow's foot notation, and PNG export (#186)
  • Space key toggles FK preview popover (#648)
  • Connection drag-to-reorder in iOS app with iCloud sync (#652)

Fixed

  • Fix export dialog doing nothing on macOS Tahoe due to incorrect window reference for save panel (#654)
  • Fix column visibility popover and hex editor alignment — left-align per macOS HIG (#653)
  • Accept SQLAlchemy-style connection URLs with driver hints (#642)

0.29.0 - 2026-04-09

Added

  • Maintenance tools via table context menu (VACUUM, ANALYZE, OPTIMIZE, REINDEX, CHECK TABLE, etc.)
  • EXPLAIN plan visualization with diagram, tree, and raw views (PostgreSQL, MySQL)

Fixed

  • Fix cross-schema foreign key preview, edit, and navigation for PostgreSQL and MySQL (#644)
  • Fix macOS HIG compliance: system colors, accessibility labels, theme tokens, localization
  • Fix idle ping spin loop caused by exhausted AsyncStream iterator (#618)
  • Skip exact row count for large tables — use database statistics estimate (#519)

Changed

  • Theme font pickers now list installed monospaced fonts dynamically instead of a fixed built-in list

0.28.0 - 2026-04-07

Added

  • Smart value detection for UUIDs in BINARY(16) and timestamps in integer columns
  • Per-column "Display As" override via column header context menu
  • iOS: safe mode, FK navigation, syntax highlighting

Fixed

  • Fix excessive idle ping traffic from orphaned monitor tasks
  • Fix Cmd+W save not persisting data grid changes
  • Fix window sizing, selection highlight, and connection switcher errors
  • Move file loading off main thread, replace timing hacks with signals

0.27.5 - 2026-04-06

Added

  • iOS: groups, tags, filter, sort, pagination, query history, export to clipboard, Spotlight, Siri Shortcuts, Home Screen widget

Fixed

  • Fix crashes in SSH tunnel, export dialog, and jump host removal
  • Fix data races in storage layers (MainActor isolation)
  • Use native sheet presentation for all dialogs and file pickers
  • Replace event monitors and timing hacks with native SwiftUI APIs

Changed

  • Migrate undo system to NSUndoManager

0.27.4 - 2026-04-05

Added

  • Cloudflare D1: batch query execution via REST API for multi-statement SQL
  • Cloudflare D1: schema editing — CREATE TABLE, ADD/DROP COLUMN, CREATE/DROP INDEX

Fixed

  • Multi-statement SQL execution fails on Cloudflare D1, ClickHouse, and other drivers that don't support transactions

Changed

  • Use Apple-standard xcodebuild archive + exportArchive build pipeline with dSYM collection

0.27.3 - 2026-04-03

Added

  • Structure tab context menu with Copy Name, Copy Definition (SQL), Duplicate, and Delete for columns, indexes, and foreign keys
  • Foreign key preview: press Cmd+Enter on a FK cell to see the referenced row in a popover
  • Column header: sort ascending/descending and show all hidden columns in context menu
  • Data grid: preview and navigate FK references from right-click context menu
  • Data grid: add row from right-click on empty space

Fixed

  • Oracle: crash when opening views caused by OracleNIO state-machine corruption from concurrent queries, LONG column types, and DBMS_METADATA errors

0.27.2 - 2026-04-02

Added

  • Option to group all connection tabs in one window instead of separate windows per connection

Changed

  • Separate preferred themes for Light and Dark appearance modes, with automatic switching in Auto mode

0.27.1 - 2026-04-01

Fixed

  • Table queries incorrectly prefixed with connection username as schema name on non-schema databases (MySQL, MariaDB, ClickHouse, Redis, etc.), causing "Table 'username.table' doesn't exist" errors when opening a second table tab

0.27.0 - 2026-03-31

Added

  • Option to prompt for database password on every connection instead of saving to Keychain
  • Autocompletion for filter fields: column names and SQL keywords suggested as you type (Raw SQL and Value fields)
  • Multi-line support for Raw SQL filter field (Option+Enter for newline)
  • Visual Create Table UI with multi-database support (sidebar → "Create New Table...")
  • Auto-fit column width: double-click column divider or right-click → "Size to Fit"
  • Collapsible results panel (Cmd+Opt+R), multiple result tabs for multi-statement queries, result pinning
  • Inline error banner for query errors
  • JSON syntax highlighting and brace matching in Details sidebar and JSON editor popover
  • Database-aware SQL functions in field menu (MySQL, PostgreSQL, SQLite, SQL Server, ClickHouse)

Changed

  • Replace GCD dispatch patterns with Swift structured concurrency
  • Refactor Details sidebar into modular field editor architecture with extracted editor components

Fixed

  • PostgreSQL: Schema name lost after app restart, causing "relation does not exist" errors for non-public schemas
  • Error dialog OK button not dismissing when a SwiftUI sheet is active, making the app unusable
  • SQL Server: Unicode characters (Thai, CJK, etc.) in nvarchar/nchar/ntext columns displaying as question marks
  • Globe+F (fn+F) fullscreen shortcut not working in SwiftUI lifecycle app

0.26.0 - 2026-03-29

Added

  • Global toggle to disable all AI features (Settings > AI)
  • Drag to reorder columns in the Structure tab (MySQL/MariaDB)
  • Nested hierarchical groups for connection list (up to 3 levels deep)
  • Confirmation dialogs for deep link queries, connection imports, and pre-connect scripts
  • JSON fields in Row Details sidebar now display in a scrollable monospaced text area
  • Open, save, and save-as for SQL files with native macOS title bar integration (#475)
  • BigQuery plugin support (Google BigQuery analytics via REST API)

Changed

  • Removed query history sync from iCloud Sync (connections, groups, settings, and SSH profiles still sync)

Fixed

  • SQL editor not auto-focused on new tab and cursor missing after tab switch
  • Long lines not scrollable horizontally in the SQL editor
  • Home and End keys not moving cursor in the SQL editor (#448)
  • SSH profile lost after app restart when iCloud Sync enabled
  • MariaDB JSON columns showing as hex dumps instead of JSON text
  • MongoDB Atlas TLS certificate verification failure
  • ENUM/SET dropdown chevron buttons not showing on first table open

0.25.0 - 2026-03-27

Added

  • Connection sharing: export/import connections as .tablepro files with import preview and duplicate detection (#466)
  • Encrypted export with credentials, protected by AES-256-GCM passphrase (Pro)
  • Linked Folders: watch a shared directory for .tablepro files (Pro)
  • Environment variable references ($VAR, ${VAR}) in connection fields (Pro)

0.24.2 - 2026-03-26

Fixed

  • XLSX export producing corrupted files that Excel cannot open (#464)
  • Deep link cold launch missing toolbar and duplicate windows (#465)

Added

  • Enum/set picker support for PostgreSQL custom enums, ClickHouse Enum8/Enum16, and DuckDB ENUM types
  • Boolean picker for MSSQL BIT columns and MySQL TINYINT(1) convention
  • Correct type classification for ClickHouse Nullable()/LowCardinality() wrappers, MSSQL MONEY/IMAGE/DATETIME2, DuckDB unsigned integers, and parameterized MySQL integer types

0.24.1 - 2026-03-26

Fixed

  • Keyboard shortcut hints in welcome window footer overflowing and truncating when too many items are displayed

0.24.0 - 2026-03-26

Added

  • Multi-select connections in Welcome window (Cmd+Click, Shift+Click) with bulk delete (⌘⌫), Move to Group, and multi-connect
  • Reorder connections within groups and reorder groups in Welcome window
  • ClickHouse, MSSQL, Redis, XLSX Export, MQL Export, and SQL Import now ship as built-in plugins
  • Large document safety caps for syntax highlighting (skip >5MB, throttle >50KB)
  • Lazy-load full values for LONGTEXT/MEDIUMTEXT/CLOB columns in the detail pane sidebar

Fixed

  • SSH profile connections displaying incorrect host/username on the Welcome window home screen (#454)
  • Saved connections disappearing after normal app quit (Cmd+Q) while persisting after force quit (#452)
  • Crash when disconnecting an etcd connection while requests are in-flight
  • Detail pane showing truncated values for LONGTEXT/MEDIUMTEXT/CLOB columns, preventing correct editing
  • Redis hash/list/set/zset/stream views showing empty or misaligned rows when values contained binary, null, or integer types

0.23.2 - 2026-03-24

Fixed

  • MongoDB Atlas connections failing to authenticate (#438)
  • MongoDB TLS certificate verification skipped for SRV connections
  • Active tab data no longer refreshes when switching back to the app window
  • Undo history preserved when switching between database tables
  • Health monitor now detects stuck queries beyond the configured timeout
  • SSH tunnel closure errors now logged instead of silently discarded
  • Schema/database restore errors during reconnect now logged
  • Memory not released after closing tabs
  • New tabs opening as separate windows instead of joining the connection tab group
  • Clicking tables in sidebar not opening table tabs

0.23.1 - 2026-03-24

Added

  • Test Connection button in SSH profile editor to validate SSH connectivity independently

Changed

  • Improve performance: faster sorting, lower memory usage, adaptive tab eviction

0.23.0 - 2026-03-22

Added

  • Redis key namespace tree view with collapse/expand grouping in sidebar (#418)
  • Keyboard focus navigation (Tab, Ctrl+J/K/N/P, arrow keys) for connection list, quick switcher, and database switcher
  • MongoDB mongodb+srv:// URI support with SRV toggle, Auth Mechanism dropdown, and Replica Set field (#419)
  • Show all available database types in connection form with install status badge (#418)

Changed

  • MongoDB authSource defaults to database name per MongoDB URI spec instead of always "admin"

Fixed

  • DuckDB: TIMESTAMPTZ, TIMETZ, and other temporal columns displaying as null (#424)
  • Onboarding "Get Started" button not rendering on macOS 15 until window loses focus (#420)
  • MongoDB collection loading uses estimatedDocumentCount and smaller schema sample for faster sidebar population

0.22.1 - 2026-03-22

Added

  • Show/hide row numbers column in data grid (Settings > Data Grid)
  • Persist column widths and order per table across tab switches, view toggles, and app restarts

Fixed

  • Show correct version for installed registry plugins (#410)
  • Dangling pointer in release builds due to incorrect withUnsafeBufferPointer usage
  • AI provider connection test error handling (#407)
  • Use-after-free crash in Redis plugin redisFree

0.22.0 - 2026-03-21

Added

  • Export query results directly to CSV, JSON, SQL, XLSX, or MQL via File menu, context menu, or toolbar

  • Pro license gating for Safe Mode (Touch ID) and XLSX export

  • License activation dialog

  • Reusable SSH tunnel profiles: save SSH configurations once and select them across multiple connections

  • Ctrl+HJKL navigation as arrow key alternative for keyboards without dedicated arrow keys

  • Amazon DynamoDB database support with PartiQL queries, AWS IAM/Profile/SSO authentication, GSI/LSI browsing, table scanning, capacity display, and DynamoDB Local support

Fixed

  • High CPU usage (79%+) and energy consumption when idle (#394)
  • etcd connection failing with 404 when gRPC gateway uses a different API prefix (auto-detects /v3/, /v3beta/, /v3alpha/)
  • Data grid editing (delete rows, modify cells, add rows) not working in query tabs (#383)

0.21.0 - 2026-03-19

Added

  • Cloudflare D1 database support
  • Match highlighting in autocomplete suggestions (matched characters shown in bold)
  • Loading spinner in autocomplete popup while fetching column metadata

Changed

  • Refactored autocomplete popup to native SwiftUI (visible selection highlight, native accent color, scroll-to-selection)
  • Autocomplete now suppresses noisy empty-prefix suggestions in non-browseable contexts (e.g., after SELECT, WHERE)
  • Autocomplete ranking stays consistent as you type (unified fuzzy scoring between initial display and live filtering)
  • Increased autocomplete suggestion limit from 20 to 40 for schema-heavy contexts (FROM, SELECT, WHERE)

0.20.4 - 2026-03-19

Fixed

  • SQL syntax error when editing columns with reserved keyword names (e.g., database, table, order) in MySQL/PostgreSQL/SQLite
  • High CPU usage and memory leaks at idle
  • N+1 query performance in foreign key fetching with bulk queries
  • Architecture-specific update delivery using sparkle:hardwareRequirements

Changed

  • Improved performance for medium and low severity bottlenecks (query history, tab persistence, sidebar rendering)

0.20.3 - 2026-03-18

Added

  • Optional iCloud Keychain sync for connection passwords

Fixed

  • Use ~/.pgpass setting not persisting when saving a PostgreSQL connection

0.20.2 - 2026-03-18

Fixed

  • Safe mode badge not displaying for silent level
  • Safe mode level reading from immutable connection state instead of live toolbar state
  • ~/.pgpass password lookup using SSH tunnel host instead of original host when connecting through SSH

0.20.1 - 2026-03-17

Fixed

  • Plugin registry compatibility with PluginKit version 2

0.20.0 - 2026-03-17

Added

  • Turkish language in Settings > General (Türkçe) with Turkish translations for UI strings
  • etcd v3 plugin with prefix-tree key browsing, etcdctl syntax editor, lease management, watch, mTLS, auth, and cluster info
  • Save Changes button in toolbar for committing pending data edits
  • Confirmation dialog before deleting a connection
  • Confirmation dialog before sort, pagination, filter, or search discards unsaved edits

Fixed

  • SSH tunnel crashes caused by concurrent libssh2 calls on the same session
  • Unsaved cell edits lost when switching tabs, sorting, paginating, filtering, or switching apps
  • Auto-reconnect and health monitor silently discarding unsaved changes
  • SSH tunnel recovery failing after tunnel death due to stale driver state
  • Health monitor ping interfering with active user queries
  • Connection test not cleaning up SSH tunnel on completion
  • Test connection success indicator not resetting after field changes
  • SSH port field accepting invalid values
  • DROP TABLE and TRUNCATE TABLE sidebar operations producing no SQL for plugin-based drivers
  • Foreign key navigation arrows not appearing after switching databases with Cmd+K on MySQL
  • Sidebar not refreshing after creating or dropping tables
  • Dropping a table disconnecting the database when the dropped table's tab was active

0.19.1 - 2026-03-16

Fixed

  • SSH tunnel connections timing out due to relay deadlock
  • Plugin metadata dispatch failing for externally installed plugins
  • SSH public key authentication error messages now include detailed failure reason

0.19.0 - 2026-03-15

Added

  • iCloud Sync (Pro): sync connections, groups, tags, settings, and query history across Macs with per-category toggles, conflict resolution, and real-time status indicator
  • SQL Favorites: save frequently used queries with optional keyword bindings for autocomplete expansion
  • Copy selected rows as JSON from context menu and Edit menu
  • Help menu and welcome screen links to website, documentation, GitHub, and sponsor page
  • Display BLOB data as hex dump in detail view sidebar

Fixed

  • SSH agent connections failing when socket path contains ~ (e.g., 1Password agent)
  • Keychain authorization prompt no longer appears on every table open

0.18.1 - 2026-03-14

Fixed

  • Plugin download counts now accumulate across all versions instead of only counting the current release

0.18.0 - 2026-03-14

Added

  • Theme engine: 4 built-in themes (Default Light/Dark, Dracula, Nord), custom themes with full color/font/layout customization, import/export as JSON
  • Theme registry: browse, install, and update community themes from the plugin registry
  • App-level appearance mode: Light, Dark, or Auto (follow system), independent of theme
  • Cassandra and ScyllaDB database support (downloadable plugin)
  • SSH TOTP/two-factor authentication with auto-generate and prompt modes
  • SSH host key verification with fingerprint confirmation
  • Keyboard Interactive SSH authentication
  • Column visibility: toggle columns on/off via status bar or header context menu
  • Copy as INSERT/UPDATE SQL from data grid context menu
  • ~/.pgpass support for PostgreSQL/Redshift connections
  • Pre-connect script: run a shell command before each connection
  • MSSQL query cancellation and lock timeout support
  • Custom plugin registry URL for enterprise/private registries

Changed

  • Extracted MSSQL, MongoDB, Redis, XLSX export, MQL export, and SQL import into downloadable plugins. MySQL, PostgreSQL, SQLite, CSV, JSON, and SQL export remain built-in
  • Redesigned Plugins settings with master-detail layout and download counts
  • All database-specific behavior now driven by plugin metadata instead of hardcoded switches, enabling third-party database plugins
  • Connection form fields, sidebar labels, and SQL dialect features are now fully plugin-driven

Fixed

  • Plugin icon rendering now supports custom asset images alongside SF Symbols

0.17.0 - 2026-03-11

Added

  • DuckDB database support — connect to .duckdb files, query CSV/Parquet/JSON files via SQL, schema navigation, and DuckDB extension management
  • MongoDB configurable auth database (authSource) — authenticate against any database instead of hardcoded admin

Fixed

  • MongoDB Read Preference, Write Concern, and Redis Database not persisted across app restarts

  • Result truncation at 100K rows now reported to UI via PluginQueryResult.isTruncated instead of being silently discarded

  • DELETE and UPDATE queries using all columns in WHERE clause instead of just the primary key for PostgreSQL, Redshift, MSSQL, and ClickHouse

  • SSL/TLS always being enabled for MongoDB, Redis, and ClickHouse connections due to case mismatch in SSL mode string comparison (#249)

  • Redis sidebar click showing data briefly then going empty due to double-navigation race condition (#251)

  • MongoDB showing "Invalid database name: ''" when connecting without a database name

Changed

  • Namespaced disabledPlugins UserDefaults key to com.TablePro.disabledPlugins with automatic migration
  • Removed unused plugin capability types (sqlDialect, aiProvider, cellRenderer, sidebarPanel)
  • SQLite driver extracted from built-in bundle to downloadable plugin, reducing app size
  • Unified error formatting across all database drivers via default PluginDriverError.errorDescription, removing 10 per-driver implementations
  • Standardized async bridging: 5 queue-based drivers (MySQL, PostgreSQL, MongoDB, Redis, MSSQL) now use shared pluginDispatchAsync helper
  • Added localization to remaining driver error messages (MySQL, PostgreSQL, ClickHouse, Oracle, Redis, MongoDB)
  • NoSQL query building moved from Core to MongoDB/Redis plugins via optional PluginDatabaseDriver protocol methods
  • Standardized parameter binding across all database drivers with improved default escaping (type-aware numeric handling, NUL byte stripping, NULL literal support)

Added

  • Open SQLite database files directly from Finder by double-clicking .sqlite, .sqlite3, .db3, .s3db, .sl3, and .sqlitedb files (#262)
  • Export plugin options (CSV, XLSX, JSON, SQL, MQL) now persist across app restarts
  • Plugins can declare settings views rendered in Settings > Plugins
  • True prepared statements for MSSQL (sp_executesql) and ClickHouse (HTTP query parameters), eliminating string interpolation for parameterized queries
  • Batch query operations for MSSQL, Oracle, and ClickHouse, eliminating N+1 query patterns for column, foreign key, and database metadata fetching; SQLite adds a batched fetchAllForeignKeys override within PRAGMA limitations
  • PluginDriverError protocol in TableProPluginKit for structured error reporting from driver plugins, with richer connection error messages showing error codes and SQL states
  • pluginDispatchAsync concurrency helper in TableProPluginKit for standardized async bridging in plugins
  • Shared PluginRowLimits constant in TableProPluginKit with 100K row default, enforced across all 8 driver plugins (ClickHouse, MSSQL, Oracle previously had no cap)
  • driverVariant(for:) method on DriverPlugin protocol for dynamic multi-type plugin dispatch, replacing hardcoded variant mapping
  • Safe mode levels: per-connection setting with 6 levels (Silent, Alert, Alert Full, Safe Mode, Safe Mode Full, Read-Only) replacing the boolean read-only toggle, with confirmation dialogs and Touch ID/password authentication for stricter levels
  • Preview tabs: single-click opens a temporary preview tab, double-click or editing promotes it to a permanent tab
  • Import plugin system: SQL import extracted into a .tableplugin bundle, matching the export plugin architecture
  • ImportFormatPlugin protocol in TableProPluginKit for building custom import format plugins
  • SQLImportPlugin as the first import format plugin (SQL files and .gz compressed SQL)
  • Oracle and ClickHouse shipped as downloadable plugins, reducing app bundle size for most users
  • Plugin install prompt when connecting to a database whose driver plugin is not installed
  • databaseTypeIds field on registry plugins for mapping registry entries to database types
  • build-plugin.sh script and build-plugin.yml CI workflow for building standalone plugin releases

0.16.1 - 2026-03-09

Fixed

  • Stale filter causing repeated errors when restoring tabs after schema/database switch (#237)
  • Sidebar showing old tables during database/schema switch instead of loading state
  • Sidebar search field disappearing when no tables match filter on macOS 15 and earlier (#235)
  • Disabled plugin database types still appearing in connection form picker
  • Main window not closing before reopening welcome screen on connection failure

0.16.0 - 2026-03-09

Fixed

  • Inspector separator no longer bleeds into toolbar area with default connection color (#228)
  • Inspector toggle no longer lags due to synchronous UserDefaults writes during animation (#229)

Added

  • Direct .tableplugin bundle installation via file picker, Finder double-click, and drag-and-drop
  • Plugin capability enforcement — registration now gated on declared capabilities, with validation warnings for mismatches
  • Plugin dependency declarations — plugins can declare required dependencies via TableProPlugin.dependencies, validated at load time
  • Plugin state change notification (pluginStateDidChange) posted when plugins are enabled/disabled
  • Restart recommendation banner in Settings > Plugins after uninstalling a plugin
  • Startup commands — run custom SQL after connecting (e.g., SET time_zone) in Connection > Advanced tab
  • Plugin system architecture — all 8 database drivers (MySQL, PostgreSQL, SQLite, ClickHouse, MSSQL, MongoDB, Redis, Oracle) extracted into .tableplugin bundles loaded at runtime
  • Export format plugins — all 5 export formats (CSV, JSON, SQL, XLSX, MQL) extracted into .tableplugin bundles with plugin-provided option views and per-table option columns
  • Settings > Plugins tab for plugin management — list installed plugins, enable/disable, install from file, uninstall user plugins, view plugin details
  • Plugin marketplace — browse, search, and install plugins from the GitHub-hosted registry with SHA-256 checksum verification, ETag caching, and offline fallback
  • TableProPluginKit framework — shared protocols and types for driver and export plugins
  • ClickHouse database support with query progress tracking, EXPLAIN variants, TLS/HTTPS, server-side cancellation, and Parts view

Changed

  • Reduce memory: eliminate dedicated ping driver (~30-50 MB per connection), use main driver for health checks
  • Reduce memory: evict inactive native window-tab row data after 5s, re-fetch on focus
  • Reduce memory: lazy-load plugin bundles on first use instead of at startup (~20-30 MB saved)
  • Reduce memory: remove duplicate sourceQuery string from RowBuffer
  • Reduce memory: InMemoryRowProvider references RowBuffer directly instead of copying rows (~3-10 MB per tab)
  • Reduce memory: eliminate metadata driver entirely, multiplex all queries on main driver (~30-50 MB per connection)
  • Reduce memory: lazy AIChatViewModel initialization (deferred until AI panel is first opened)
  • Reduce memory: remove duplicate connections array from ContentView (use ConnectionStorage.shared directly)
  • Reduce CPU: consolidate per-editor NSEvent monitors into shared EditorEventRouter singleton (O(n) → O(1) per event)
  • Fix tab persistence: aggregate tabs from all windows at quit time instead of last-write-wins per-coordinator save
  • Split DatabaseManager.sessionVersion into fine-grained connectionListVersion and connectionStatusVersion to reduce cascade re-renders
  • Extract AppState property reads into local lets in view bodies for explicit granular observation tracking
  • Reorganized project directory structure: Services, Utilities, Models split into domain-specific subdirectories
  • Database driver code moved from monolithic app binary into independent plugin bundles under Plugins/

0.15.0 - 2026-03-08

Added

  • Oracle Database support via OCI (Oracle Call Interface)
  • Add database URL scheme support — open connections directly from terminal with open "mysql://user@host/db" -a TablePro (supports MySQL, PostgreSQL, SQLite, MongoDB, Redis, MSSQL, Oracle)
  • SSH Agent authentication method for SSH tunnels (compatible with 1Password SSH Agent, Secretive, ssh-agent)
  • Multi-jump SSH support — chain multiple SSH hops (ProxyJump) to reach databases through bastion hosts

Changed

  • Replace CodeEditLanguages xcframework (38 grammars) with local package compiling only SQL, Bash, and JavaScript, reducing app binary size by ~55%

Fixed

  • Fix memory leak where session state objects were recreated on every tab open due to SwiftUI @State init trap, causing 785MB usage at 5 tabs with 734MB retained after closing
  • Fix per-cell field editor allocation in DataGrid creating 180+ NSTextView instances instead of sharing one
  • Fix NSEvent monitor not removed on all popover dismissal paths in connection switcher
  • Fix race condition in FreeTDS disconnect() where dbproc was set to nil without holding the lock
  • Fix data race in MainContentCoordinator.deinit reading nonisolated(unsafe) flags from arbitrary threads
  • Fix JSON encoding and file I/O blocking the main thread in TabStateStorage
  • Fix MySQL/MariaDB getting BEGIN instead of START TRANSACTION in table operations and SQL preview
  • Fix port resetting to default value when editing a connection with a custom port
  • Replace .onTapGesture with Button in color pickers, section headers, group headers, and connection switcher for VoiceOver accessibility
  • Fix data race on isAppTerminating static var in MainContentCoordinator using OSAllocatedUnfairLock
  • Fix MainActor.assumeIsolated crash risk in VimKeyInterceptor notification observer
  • Fix data race on conn pointer in LibPQConnection during disconnect and cancel
  • Fix SSH askpass script written with world-readable permissions; now uses atomic 0o700 creation and immediate cleanup
  • Fix potential dict mutation during iteration in DatabaseManager.disconnectAll()
  • Fix welcome screen showing blank panel when connections have orphaned group IDs
  • Fix multiple tabs auto-executing queries simultaneously on connection restore, causing lag
  • Fix welcome window becoming oversized after closing main windows due to AppKit scene restoration
  • Fix unescaped identifiers in MySQL SHOW CREATE TABLE/VIEW queries allowing SQL injection via table names
  • Fix QueryResultRow equality ignoring cell values, preventing SwiftUI from re-rendering updated rows
  • Fix status bar row info text rendering off-center due to duplicate spacer
  • Fix Cmd+Delete in sidebar search or right sidebar clearing the query editor
  • Fix SSH tunnel processes not terminated when closing connection window or quitting the app

0.14.1 - 2026-03-06

Added

  • Add database and schema switching for PostgreSQL connections via ⌘K

0.14.0 - 2026-03-05

Added

  • Microsoft SQL Server (MSSQL) database support via FreeTDS
  • Support for editing and deleting rows in tables without a primary key

Fixed

  • Fix MSSQL connection losing selected database after disconnect and reconnect when no default database is configured
  • DELETE operations on tables without a primary key now show an error if row data is missing instead of being silently dropped
  • SQLite and MSSQL now use safe single-row limits for DELETE and UPDATE on tables without a primary key
  • Fix high CPU/RAM on app launch from blocking storage init, unsynchronized health monitors, and excessive retry loops
  • Fix O(n log n) row cache eviction in RowProvider by replacing sorted eviction with O(n) distance-threshold filter
  • Fix O(n) string operations in GeometryWKBParser, RedisDriver, and autocomplete scoring by switching to NSString O(1) indexing
  • Fix slow database switcher loading by replacing N+1 metadata queries with single batched queries (MySQL, PostgreSQL, Redshift)
  • Fix slow Redis key browsing by pipelining TYPE and TTL commands in a single round trip instead of 3 sequential commands per key
  • Fix slow SQL export startup by batching COUNT(*) queries via UNION ALL and batching dependent sequence/type lookups
  • Fix slow AI Chat schema loading by fetching all foreign keys in a single bulk query instead of per-table

0.13.0 - 2026-03-04

Added

  • Redis database support with key-value browsing, database-level sidebar (db0–db15), TTL management, and interactive CLI
  • TablePlus-compatible database URL handling: open -a TablePro "postgresql://user@host/db" with support for schema switching, table opening, filters, color, and environment tags

Fixed

  • Fix sidebar search field and main content area background colors to blend with macOS vibrancy
  • Fix POINT and geometry columns showing blank values in MySQL and wrong type label in sidebar

0.12.0 - 2026-03-03

Added

  • Amazon Redshift database support
  • Deep link support via tablepro:// URL scheme for opening connections, tables, queries, and importing connections
  • "Copy as URL" context menu action on connections to copy connection details as a URL string (e.g., mysql://user:pass@host/db)
  • Auto-show inspector option: automatically open the right sidebar when selecting a row (Settings > Data Grid)
  • ENUM and SET columns now open their picker on single click with a chevron indicator, matching boolean column behavior
  • Homebrew Cask installation via brew install --cask tablepro

Fixed

  • "Table not found" error when switching databases within the same connection (Cmd+K) while a table tab is open
  • Right sidebar state now persists across native window-tabs instead of resetting to closed

0.11.1 - 2026-03-02

Fixed

  • MySQL second tab showing empty rows due to premature coordinator teardown during native macOS tab group merging
  • MongoDB tab name showing "MQL Query" instead of collection name when using bracket notation db["collection"].find()

0.11.0 - 2026-03-02

Added

  • Environment color indicator: subtle toolbar tint based on connection color for at-a-glance environment identification
  • Import database connections from SSH tunnel URLs (e.g., mysql+ssh://, postgresql+ssh://)
  • Connection groups for organizing database connections into folders with colored headers

Fixed

  • Toolbar briefly showing "MySQL" and missing version (e.g., "MongoDB" instead of "MongoDB 8.2.5") when opening a new tab
  • Keyboard shortcuts not working (beep sound) after connecting from welcome screen until a second tab is opened
  • Toolbar overflow menu showing only one item and missing all other buttons when window is narrow
  • AI chat showing "SQL" language label and missing syntax highlighting for MongoDB code blocks

Changed

  • Refactored toolbar to use individual ToolbarItem entries with Label for native macOS overflow behavior, and moved History/Export/Import to .secondaryAction overflow menu
  • Redesigned right sidebar detail pane with compact field layout and type-aware editors

0.10.0 - 2026-03-01

Added

  • Support for multiple independent database connections in separate windows with per-window session isolation
  • MongoDB database support
  • Custom About window with version info and links (Website, GitHub, Documentation)
  • Import database connections from URL/connection string (e.g., postgresql://user:pass@host:5432/db)
  • Release notes in Sparkle update window

Fixed

  • New row (Cmd+I) and duplicated row not appearing in datagrid until manual refresh
  • PostgreSQL SSH tunnel connections failing with "no encryption" due to SSL config not being preserved
  • PostgreSQL SSL sslrootcert passed unconditionally to libpq, causing certificate verification failure even in Required mode

0.9.2 - 2026-02-28

Fixed

  • Fix app bundle not ad-hoc signed — signing step was unreachable when no dylibs were bundled

0.9.1 - 2026-02-28

Fixed

  • Fix Sparkle auto-update failing with "improperly signed" error — release ZIPs now preserve framework symlinks and include proper ad-hoc code signatures

0.9.0 - 2026-02-28

Added

  • Vim keybindings for SQL editor (Normal/Insert/Visual modes, motions, operators, :w/:q commands) with toggle in Editor Settings
  • ^ and _ motions (first non-blank character) in Vim normal, visual, and operator-pending modes
  • :q command to close current tab in Vim command-line mode
  • PostgreSQL schema switching via ⌘K database switcher (browse and switch between schemas like public, auth, custom schemas)

Changed

  • Convert QueryHistoryStorage and QueryHistoryManager from callback-based async dispatch to native Swift async/await — eliminates double thread hops per history operation
  • Consolidate ExportService @Published properties into single state struct — reduces objectWillChange events from 7 per batch to 1
  • Consolidate ImportService @Published properties into single state struct — reduces objectWillChange events during SQL import
  • Replace DispatchQueue.main.asyncAfter chains in AppDelegate startup with structured Task-based retry loops
  • Merge 3 identical Combine notification subscriptions in SidebarViewModel into Publishers.Merge3
  • Make AIChatStorage encoder/decoder static — shared across all instances instead of duplicated

Fixed

  • Cell edit showing modified background but displaying original value until save (reloadData during active editing ignored by NSTableView, updateNSView blocked by editedRow guard)
  • Undo on inserted row cell edit not syncing insertedRowData (stale values after undo)
  • Vim Escape key not exiting Insert/Visual mode when autocomplete popup is visible (popup's event monitor consumed the key)
  • Copy (Cmd+C) and Cut (Cmd+X) not working in SQL editor — clipboard retained old value due to CodeEditTextView's copy: silently failing
  • Vim yank/delete operations not syncing to system clipboard (register only stored text internally)
  • Vim word motions (w, b, e) using two-class word boundary detection instead of correct three-class (word chars, punctuation, whitespace)
  • Vim visual mode selection now correctly includes cursor character (inclusive selection matching real Vim behavior)
  • Arrow keys now work in Vim visual/normal mode (mapped to h/j/k/l instead of bypassing the Vim engine)
  • Vim block cursor now follows the moving end of the selection in visual mode instead of staying at the anchor
  • Vim visual mode selection highlight now renders visibly (trigger needsDisplay after programmatic selection)
  • Fix event monitor leaks in SQL editor — deinit now cleans up NSEvent monitors, notification observers, and work items that leaked when CodeEditSourceEditor never called destroy()
  • Fix unbounded memory growth from NativeTabRegistry holding full QueryTab objects (including RowBuffer references) — registry now stores lightweight TabSnapshot structs
  • Fix SortedRowsCache storing full row copies — now stores index permutations only, halving sorted-tab memory
  • Fix schema provider memory leak — shared providers are now reference-counted with 5s grace period removal when all windows for a connection close
  • Fix duplicate schema fetches in InlineSuggestionManager — now shares the coordinator's SQLSchemaProvider instead of maintaining a separate cache
  • Fix background tabs retaining full result data indefinitely — RowBuffer eviction frees memory for inactive tabs (re-fetched on switch back)
  • Fix InMemoryRowProvider bulk cache eviction — now uses proximity-based eviction keeping entries near current scroll position
  • Fix stale tabRowProviders entries when tab IDs change without count changing
  • Fix crash on macOS 14.x caused by _strchrnul symbol not found in libpq.5.dylib — switch libpq and OpenSSL from dynamic Homebrew linking to vendored static libraries built with MACOSX_DEPLOYMENT_TARGET=14.0
  • Fix duplicate tabs and lag when inserting SQL from AI Chat or History panel with multiple window-tabs open — notification handlers now only fire in the key window
  • Fix "Run in New Tab" race condition in History panel — replaced fragile two-notification + 100ms delay pattern with a single atomic notification
  • Fix MainContentCoordinator deinit Task that may never execute — added explicit teardown() method with didTeardown guard and orphaned schema provider purge
  • Fix SQLEditorCoordinator deinit deferring InlineSuggestionManager cleanup to Task — added explicit destroy() lifecycle and didDestroy guard with warning log
  • Fix ExportService while-true batch loops not checking Task.isCancelled — cancelled exports now stop promptly instead of running all remaining batches
  • Fix DataGridView full column reconfiguration on every resultVersion bump — narrowed rebuild condition to only trigger when transitioning from empty state
  • Fix ConnectionHealthMonitor fixed 30s interval that delays failure detection — added checkNow() with wakeUpContinuation for immediate health checks and exponential backoff
  • Fix HistoryPanelView and TableStructureView asyncAfter copy-reset timers not cancellable — replaced with cancellable Task pattern
  • Fix MainContentView redundant onChange handler causing cascading re-renders on tab/table changes
  • Fix DatabaseManager notification observer creating unnecessary Tasks when self is already deallocated — added guard let self before Task creation

0.8.0 - 2026-02-27

Changed

  • Refactored sidebar table list to MVVM architecture with testable SidebarViewModel
  • Extracted TableRow and context menu into separate files (TableRowView.swift, SidebarContextMenu.swift)
  • Migrated to native macOS window tabs (NSWindow tabbing) — tab bar is now rendered by macOS itself, identical to Finder/Safari/Xcode tabs with automatic dark/light mode support, drag-to-reorder, and "Merge All Windows" for free
  • Each tab is a full independent window with its own sidebar, editor, and state — no more shared tab manager or ZStack keep-alive pattern
  • New Tab (Cmd+T) creates a native macOS window tab; Close Tab (Cmd+W) closes the native tab
  • Tab switching (Cmd+Shift+[/], Cmd+1-9) now uses native macOS tab navigation
  • Sidebar table selection is per-window-tab (independent of other tabs)
  • Tab persistence now saves/restores combined state from all native window tabs via NativeTabRegistry; restored tabs reopen as individual native window tabs
  • Sidebar table click navigates in-place when no unsaved changes; opens new native tab when dirty
  • FK navigation follows the same in-place/new-tab behavior based on unsaved changes
  • "Show All Tables" now opens metadata query in a new native tab instead of appending to the current window
  • Create Table success closes the create-table window and opens the new table in a fresh native tab
  • Window title updates dynamically after navigate-in-place (sidebar click, FK navigation)

Fixed

  • Sidebar loses keyboard focus (arrow key navigation) after opening a second table tab
  • Sidebar active state flash and loss when clicking a table that opens in a new native window tab — removed the async revert; each window now re-syncs its sidebar via NSWindow.didBecomeKeyNotification, and programmatic syncs skip navigation via an early-return guard
  • Sidebar loses active state when opening a second table in a new native window tab — handleTabSelectionChange now calls syncSidebarToCurrentTab() so the new window's empty localSelectedTables is seeded from the restored tab
  • Sidebar now refreshes immediately after switching databases via Cmd+K — clears session.tables during the switch so SidebarView.onChange triggers loadTables() against the new database without requiring a manual refresh
  • Cmd+W in empty state (after all tabs are cleared) now closes the connection window and disconnects, instead of doing nothing
  • Fix Cmd+K database switch flooding all windows with error alerts — .refreshAll broadcast caused every window to re-execute its table query against the wrong database; now only the current tab re-executes, and only if its table exists in the new database
  • Fix clicking a table in the sidebar replacing the current tab instead of opening a new native tab
  • Fix clicking a table from a query tab overwriting the SQL editor instead of opening a separate table tab
  • Tab persistence no longer overwrites combined state from all windows when a single window saves — uses NativeTabRegistry for combined state
  • Query text editing in one window no longer corrupts other windows' persisted tab state
  • Fix Cmd+W on any tab disconnecting the session and showing welcome screen — now only disconnects when the last main window is closed
  • Fix Cmd+T from empty state creating two native tabs instead of one — now adds a query tab to the current window
  • Fix clicking a table in the sidebar from empty state not opening the table — now creates a table tab in the current window
  • Fix native tab title showing "SQL Query" instead of the table name when opening a table from empty state
  • Fix Cmd+W on the last tab disconnecting the session instead of returning to empty state

Removed

  • Removed broken SidebarFocusRestorer (non-functional NSViewRepresentable focus hack)
  • Removed dead code: unused onTablePro callback, single-table toggle methods
  • Custom AppKit tab bar (NativeTabBarView) — replaced by native macOS window tab bar
  • Removed vestigial multi-tab code: performDirectTabSwitch, skipNextTabChangeOnChange, tabPendingChanges, tabSelectionCache, lastFlushTime, filterStateSavedExternally, flushSelectionCache, duplicateTab, togglePin, selectTab, switchToDatabase (legacy)

Performance

  • Cache SQLSchemaProvider per connection so new native tabs reuse the already-loaded schema instead of re-fetching tables and columns from the database (saves 500ms-2s per tab)
  • Schema loading now runs in background, no longer blocks the data query from starting — table data appears immediately while autocomplete schema loads concurrently
  • Remove unconditional 100ms sleep in waitForConnectionAndExecute when connection is already established
  • Defer loadTableMetadataIfNeeded until after the tab's first query completes, avoiding a redundant DB round-trip during tab initialization
  • Replace @ObservedObject dbManager in ContentView with targeted @State + onReceive — eliminates O(N) view cascade where every window re-rendered on any DatabaseManager state change
  • Remove @StateObject dbManager from TableProApp — prevents app-level body re-evaluation on every DatabaseManager publish
  • Batch connectToSession session mutations into a single activeSessions write — reduces 5 separate objectWillChange publishes to 1
  • Remove redundant DatabaseManager.updateSession calls in tab change handlers — NativeTabRegistry already handles persistence, eliminating unnecessary @Published cascades
  • Add initialization guard to initializeAndRestoreTabs preventing duplicate query execution from racing .task and onChange(of: selectedTabId) paths
  • Replace onChange(of: DatabaseManager.shared.currentSession?.*) with per-window onReceive filtered by connection ID — stops SwiftUI from tracking the global DatabaseManager singleton as a dependency
  • Guard health monitor status writes to skip no-op .connected.connected transitions — eliminates idle 30-second cascade on all windows
  • Extract all menu commands into AppMenuCommands struct — AppState changes now only re-evaluate menu items, not the Scene body / all WindowGroups
  • Add isContentViewEquivalent(to:) comparison on ConnectionSession — skips @State writes when only tabs, selectedTabId, or lastActiveAt changed, preventing O(N) MainContentView.init cascade across windows

0.7.0 - 2026-02-25

Added

  • Quick search and filter rows can now be combined — when both are active, their WHERE conditions are joined with AND
  • Foreign key columns now show a navigation arrow icon in each cell — click to open the referenced table filtered by the FK value

Changed

  • Metadata queries (columns, FKs, row count) now run on a dedicated parallel connection, eliminating 200-300ms delay for FK arrows and pagination count on initial table load
  • Approximate row count from database metadata displays instantly with data; exact count refines silently in the background
  • Show warning indicator on filter presets referencing columns not in current table
  • Increase filter row height estimate for better accessibility support
  • FK navigation now uses dedicated FilterStateManager.setFKFilter API instead of direct property manipulation
  • Add syntax highlighting to Import SQL file preview
  • XLSX export now enforces the Excel row limit (1,048,576) per sheet and uses autoreleasepool per row to reduce peak memory during large exports
  • Multiline cell values now use a scrollable overlay editor instead of the constrained field editor, enabling proper vertical scrolling and line navigation during inline editing
  • AnyChangeManager now uses a reference-type box for lazy initialization, avoiding Combine pipeline creation during SwiftUI body evaluation
  • DataGridView identity check moved before AppSettingsManager read to skip settings access when nothing has changed
  • DataGridView async column width write-back now uses an isWritingColumnLayout guard to prevent two-frame bounce
  • Tab switch flushPendingSave debounced to skip redundant saves within 100ms of rapid tab switching
  • SQL editor frame-change notification throttled to 50ms to avoid redundant syntax highlight viewport recalculation on every keystroke
  • SQL editor text binding sync now uses O(1) NSString length pre-check before O(n) full string equality comparison
  • Toolbar executing state now fires a single objectWillChange instead of double-publishing isExecuting and connectionState
  • Row provider onChange handlers coalesced into a single trigger to avoid redundant InMemoryRowProvider rebuilds
  • SQL import now uses file-size estimation instead of a separate counting pass, eliminating the double-parse overhead for large files
  • History cleanup COUNT + DELETE now wrapped in a single transaction to reduce journal flushes
  • SQLite fetchTableMetadata now caps row count scan at 100k rows to avoid full table scans on large tables
  • SQLite fetchIndexes uses table-valued pragma functions in a single query instead of N+1 separate PRAGMA calls
  • MySQL empty-result DESCRIBE fallback now only triggers for SELECT queries, avoiding redundant round-trips for non-SELECT statements
  • Remove redundant String(query) copy in MariaDB query execution
  • MySQL result fetching now uses mysql_use_result (streaming) instead of mysql_store_result (full buffering), so only the capped row count is held in memory instead of the entire server result set
  • Instant pagination via approximate row count — MySQL/PostgreSQL tables now show "~N rows" immediately with data, then refine to exact count in background
  • QueryTab uses value-based equality for SwiftUI diffing, eliminating unnecessary ForEach re-renders on tab array writes
  • Cached static regex for extractTableName, SQLiteDriver.stripLimitOffset, and SQL function expressions to avoid per-call compilation
  • Static NumberFormatter in status bar to avoid per-render locale resolution
  • Batch TableProTabSmart field writes into single array store to avoid 14 CoW copies per query execution
  • Tab persistence writes moved off main thread via Task.detached
  • Single history entry per SQL import instead of per-statement recording
  • WAL mode enabled for query history SQLite database
  • Merged fetchDatabaseMetadata into single query for MySQL and PostgreSQL
  • Health ping now uses dedicated metadata driver to avoid blocking user queries
  • SSH tunnel setup extracted into shared helper to eliminate code duplication
  • PostgreSQL DDL queries restructured with async let for cleaner dispatch (sequential on serial connection queue)
  • Cancel query connection now uses 5-second connect timeout
  • PostgreSQL connection parameters properly escaped for special characters
  • SQLite fetchAllColumns overridden with single sqlite_master + pragma_table_info query
  • Eliminated intermediate [UInt8] buffer in MySQL and PostgreSQL field extraction
  • Column layout sync gated behind user-resize flag to skip O(n) loop on cursor moves
  • Column width calculation uses monospace character arithmetic instead of per-row CoreText calls
  • DataChangeManager maintains change index incrementally instead of full O(n) rebuild
  • JSON export buffers writes per row instead of per field
  • SQLFormatterService uses NSMutableString for keyword uppercasing and integer counter for placeholders
  • SQLContextAnalyzer uses single alternation regex and single-pass state machine for string/comment detection
  • escapeJSONString iterates UTF-8 bytes instead of grapheme clusters
  • AppSettingsStorage caches JSONDecoder/JSONEncoder as stored properties
  • AppSettingsManager stores validated settings in memory after didSet
  • FilterSettingsStorage uses tracked key set instead of loading full plist
  • Keychain saves use SecItemAdd + SecItemUpdate upsert pattern instead of delete + add
  • Autocomplete detectFunctionContext uses index tracking instead of character-by-character string building

Fixed

  • Fix AND/OR filter logic mode ignored in query execution — preview showed correct OR logic but actual query always used AND
  • Fix filter panel state (filters, visibility, quick search, logic mode) not preserved when switching between tabs
  • Fix foreign key navigation filter being wiped when switching to a new tab (tab switch restore overwrote FK filter state)
  • Fix pagination count appearing 200-300ms after data loads — approximate row count from database metadata now displays instantly with data, exact count refines silently in the background
  • Fix foreign key navigation arrows and pagination count appearing with visible delay on initial table load — metadata now fetches on a dedicated parallel connection concurrent with the main query
  • Fix LibPQ parameterized query using Swift deallocate() for strdup-allocated memory instead of free()
  • FTS5 search input now sanitized to prevent parse errors from special characters like *, OR, AND
  • Fix SQL export corrupting newline/tab/backslash characters for PostgreSQL and SQLite (MySQL-style backslash escaping was incorrectly applied to all database types)
  • Fix PostgreSQL SQL export failing to import when types/sequences already exist (DROP IF EXISTS now always emitted for dependent types and sequences)
  • Fix PostgreSQL SQL export missing CREATE TYPE definitions for enum columns, causing import errors
  • Fix PostgreSQL DDL tab not showing enum type definitions used by table columns
  • Fix compilation error for PostgreSQL dependent sequences export (fetchDependentSequences missing from DatabaseDriver protocol)
  • Fix PostgreSQL LIKE/NOT LIKE expressions missing ESCAPE '\' clause, causing wildcard escaping (\%, \_) to be treated as literal characters
  • Fix SQLite regex filter silently degrading to LIKE substring match instead of being excluded from the WHERE clause

0.6.4 - 2026-02-23

Fixed

  • Fix PostgreSQL SQL export failing to fetch DDL for tables (passed quoted identifier instead of raw table name to catalog queries)

0.6.3 - 2026-02-23

Changed

  • Extract shared performDirectTabSwitch into MainContentCoordinator to eliminate duplicate tab-switch logic
  • Welcome window now uses native macOS frosted glass translucency (NSVisualEffectView with behind-window blending)

Fixed

  • Auto-detect MySQL vs MariaDB server type from version string to use correct timeout variable (max_execution_time for MySQL, max_statement_time for MariaDB)
  • Improved tab switching performance by caching row providers and change managers across SwiftUI render cycles
  • Eliminated selection sync feedback loop causing redundant DataGridView updates during tab switch
  • Enabled NSTableView row view recycling to reduce heap allocations during scrolling
  • Reduced SwiftUI re-render cascades by batching @Published mutations during tab switch
  • Improved DataGrid scrolling performance:
    • Row views now recycled via NSTableView's reuse pool instead of allocating new objects per scroll
    • Replaced O(n) String.count with O(1) NSString.length for large cell value truncation
    • Replaced expensive NSFontDescriptor.symbolicTraits checks with O(1) pointer equality on cached fonts
    • Added layerContentsRedrawPolicy and canDrawSubviewsIntoLayer to reduce compositing overhead
    • Cached NULL display string locally instead of per-cell singleton access
    • Cached AnyChangeManager to avoid per-render allocation with Combine subscriptions
    • Deferred accessibility label generation to when VoiceOver is active
    • Removed unnecessary async dispatch in focusedColumn, collapsed two reloadData calls into one

0.6.2 - 2026-02-23

Changed

  • Replace generic SwiftUI colors with native macOS system colors (Color(nsColor: .system*) instead of Color.red/green/blue/orange) for proper dark mode, vibrancy, and accessibility adaptation
  • Replace hardcoded opacity on semantic colors with quaternaryLabelColor/tertiaryLabelColor
  • Use shadowColor instead of Color.black for shadows
  • Replace iOS-style Capsule badges with RoundedRectangle

0.6.1 - 2026-02-23

Fixed

  • Fixed all 45 performance issues identified in PERFORMANCE.md audit:
    • Memory: RowBuffer reference wrapper for QueryTab (MEM-1/2), index-based sort cache (MEM-3), streaming XLSX export with inline strings (MEM-4/15), driver-level row limits cap at 100K rows (MEM-5), removed redundant String deep copies (MEM-6), weak driver reference in SQLSchemaProvider (MEM-9), undo stack depth cap (MEM-10), dictionary-based tab pending changes (MEM-11), weak self in Task captures (MEM-12), clear cached data on disconnect (MEM-13), AI chat message cap (MEM-14)
    • CPU: Removed unicodeScalars.map in MariaDB/PostgreSQL drivers (CPU-1/2), cached 100+ regex patterns in SQLFormatterService (CPU-3/5/8/9/10), async Keychain reads (CPU-4), cached stripLimitOffset/extractTableName/isDangerousQuery regex (CPU-6/13/14), cached CSV decimal regex (CPU-7), O(1) change lookup index (CPU-11), removed unused loadPassword call (CPU-12)
    • Data handling: Auto-append LIMIT 10000 for unprotected queries (DAT-1), driver-level row limit cap for MySQL/PostgreSQL (DAT-2), SQLite row limit cap at 100K (DAT-3), batch fetchAllColumns via INFORMATION_SCHEMA (DAT-4), index permutation sort cache (DAT-5), cached InMemoryRowProvider in @State (DAT-6), clipboard 50K row cap (DAT-7), Int-based row IDs replacing UUID allocation (DAT-8)
    • Network: Phase 2 metadata cache check (NET-1), connect_timeout for LibPQ (NET-2), driver-level cancelQuery via mysql_kill/PQcancel/sqlite3_interrupt (NET-3), isLoading guard for sidebar (NET-4), reuse cached schema for AI chat (NET-5)
    • I/O: Throttled history cleanup (IO-1), async history storage migration (IO-2), consolidated onChange handlers (IO-3)

0.6.0 - 2026-02-22

Added

  • Inline AI suggestions (ghost text) in the SQL editor — auto-triggers on typing pause, Tab to accept, Escape to dismiss
  • Schema-aware inline suggestions — AI now uses actual table/column names from the connected database (cached with 30s TTL, respects includeSchema and maxSchemaTables settings)
  • AI feature highlight row on onboarding features page
  • Added VoiceOver accessibility labels to custom controls: data grid (table view, column headers, cells), filter panel (logic toggle, presets, action buttons, filter row controls), toolbar buttons (connection switcher, database switcher, refresh, export, import, filter toggle, history toggle, inspector toggle), editor tab bar (tab items, close buttons, add tab button), and sidebar (table/view rows, search clear button)

Changed

  • Migrated notification observers in MainContentCommandActions from Combine publishers (.publisher(for:).sink) to async sequences (for await over NotificationCenter.default.notifications(named:)) — removes AnyCancellable storage in favor of Task handles with proper cancellation on deinit
  • Migrated tab state persistence from UserDefaults to file-based storage in Application Support — prevents large JSON payloads from bloating the plist loaded at app launch, with automatic one-time migration of existing data
  • Refactored menu and toolbar commands from NotificationCenter to @FocusedObject pattern — menu commands and toolbar buttons now call MainContentCommandActions methods directly instead of posting global notifications, with context-aware routing for structure view operations
  • Redesigned connection form with tab-based layout (General / SSH Tunnel / SSL/TLS / Advanced), replacing the single-scroll layout
  • Revamped connection form UI to use native macOS grouped form style (Form/.formStyle(.grouped)) with LabeledContent for automatic label-value alignment and Section headers — replacing the previous hand-rolled VStack layout with custom FormField component
  • Removed unused FormField component and helper methods (iconForType, colorForType)
  • SQLite connections now only show General and Advanced tabs (SSH/SSL hidden)
  • Added async/await wrapper methods to QueryHistoryStorage — existing completion-handler API preserved for compatibility, new async overloads use withCheckedContinuation for modern Swift concurrency callers

Fixed

  • Fixed TOCTOU race condition in SQLiteDriver — replaced nonisolated(unsafe) + DispatchQueue pattern with a dedicated actor (SQLiteConnectionActor) that serializes all sqlite3 handle access, preventing concurrent task races on the connection state
  • Consolidated multiple .sheet(isPresented:) modifiers in MainContentView into a single .sheet(item:) with an ActiveSheet enum — fixes SwiftUI anti-pattern where only the last .sheet modifier reliably activates
  • Replaced blocking Process.waitUntilExit() calls in SSHTunnelManager with async withCheckedContinuation-based waiting, and replaced the fixed 1.5s sleep with active port probing — SSH tunnel setup no longer blocks the actor thread, keeping the UI responsive during connection
  • Eliminated potential deadlocks in MariaDBConnection and LibPQConnection — replaced all queue.sync calls (in disconnect, deinit, isConnected, serverVersion) with lock-protected cached state and queue.async cleanup, preventing deadlocks when callbacks re-enter the connection queue
  • SQL editor now respects the macOS accessibility text size preference (System Settings > Accessibility > Display > Text Size) — the user's chosen font size is scaled by the system's preferred text size factor, with live updates when the setting changes
  • Fixed retain cycle in UpdaterBridge.assign(to:on:self) retains self strongly; replaced with .sink using [weak self]
  • Fixed leaked NotificationCenter observer in SQLEditorCoordinator — observer token is now stored and removed in destroy()
  • Eliminated tab switching delay — replaced view teardown/recreation with ZStack+ForEach to keep NSViews alive, moved tab persistence I/O to background threads, skipped unnecessary change-tracking deep copies, and coalesced redundant inspector/sidebar updates during tab switch
  • Reduced tab-switch CPU spikes from 40-60% to ~10-20% by eliminating redundant reloadData() calls: configureForTable no longer triggers a reload during tab switch (single controlled bump instead of 2-3), onChange(of: resultColumns) is suppressed while the switch is in progress, and DataGridView.updateNSView skips all heavy work when the data identity hasn't changed
  • Table open now shows data instantly — split executeQueryInternal into two phases: rows display immediately after SELECT completes, metadata (columns, FKs, enums, row count) loads in the background without blocking the grid
  • Eliminated 20-80ms overhead when clicking an already-open table in the sidebar — openTableTab short-circuits immediately, and TableProTabSmart no longer fires @Published when the selected tab hasn't changed
  • Keychain SecItemAdd return values are now checked and logged — previously, failed writes (e.g. errSecDuplicateItem, errSecInteractionNotAllowed) were silently discarded, risking password loss
  • Added kSecAttrService to all Keychain queries across ConnectionStorage, LicenseStorage, and AIKeyStorage — items now have a proper service identifier, preventing potential collisions with other apps
  • Ensured proper cleanup for @State reference type tokens — tracked untracked Task instances in ImportDialog (file selection), AIProviderEditorSheet (model fetching, connection test), and added onDisappear cancellation to prevent leaked work after view dismissal
  • Replaced .onAppear with .task for I/O operations in ConnectionTagEditor — uses SwiftUI-idiomatic lifecycle-tied loading instead of onAppear which can re-fire on navigation

0.5.0 - 2026-02-19

Changed

  • AI chat panel — native macOS inspector styling: removed iOS-style chat bubbles, flattened message layout with role headers and compact spacing, reduced heading sizes for narrow sidebar, inline typing indicator without pill background
  • AppKit → SwiftUI migration: migrated 5 NSPopover controllers (Enum, Set, TypePicker, JSONEditor, ForeignKey) to SwiftUI content views with a shared PopoverPresenter utility — eliminates manual NSEvent monitors, NSPopoverDelegate, and singleton patterns
  • AppKit → SwiftUI migration: replaced KeyEventHandler NSViewRepresentable with native .onKeyPress() modifiers (macOS 14+) in DatabaseSwitcherSheet and WelcomeWindowView
  • AppKit → SwiftUI migration: replaced AppKit history panel (5 files: HistoryPanelController, HistoryListViewController, QueryPreviewViewController, HistoryTableView, HistoryRowView) with single pure SwiftUI HistoryPanelView using HSplitView, List with selection, context menus, and swipe-to-delete
  • AppKit → SwiftUI migration: replaced ExportTableOutlineView (NSOutlineView, 757 lines across 2 files) with SwiftUI ExportTableTreeView using List, DisclosureGroup, and tristate checkboxes (~146 lines)
  • Design tokens: replaced hardcoded Color.secondary.opacity(0.6) with system Color(nsColor: .tertiaryLabelColor) in DesignConstants and ToolbarDesignTokens for proper semantic color

Added

  • AI chat panel shows "Set Up AI Provider" empty state when no AI provider is configured, with a button to open Settings
  • AI chat panel — right-side panel for AI-assisted SQL queries with multi-provider support (Claude, OpenAI, OpenRouter, Ollama, custom endpoints)
  • AI provider settings — configure multiple AI providers in Settings > AI with API key management (Keychain), endpoint configuration, model selection, and connection testing
  • AI feature routing — map AI features (Chat, Explain Query, Fix Error, Inline Suggestions) to specific providers and models
  • AI schema context — automatically includes database schema, current query, and query results in AI conversations for context-aware assistance
  • AI chat code blocks — SQL code blocks in AI responses include Copy and Insert to Editor buttons
  • AI chat markdown rendering — replaced custom per-line AttributedString parsing with MarkdownUI library for full CommonMark + GitHub Flavored Markdown support (proper lists, tables, blockquotes, headers, strikethrough)
  • Per-connection AI policy — control AI access per connection (Always Allow, Ask Each Time, Never) in the connection form
  • Toggle AI Chat keyboard shortcut (⌘⇧L) and toolbar button
  • Tab reuse setting — opt-in option in Settings > Tabs to reuse clean table tabs when clicking a new table in the sidebar (off by default)
  • Structure view: full undo/redo support (⌘Z / ⇧⌘Z) for all column, index, and foreign key operations
  • Structure view: database-specific type picker popover for the Type column — searchable, grouped by category (Numeric, String, Date & Time, Binary, Other), supports freeform input for parametric types like VARCHAR(255)
  • Structure view: YES/NO dropdown menu for Nullable, Auto Inc, and Unique columns (replaces freeform text input)
  • Structure view: "Don't show again" toggle in SQL preview sheet now correctly skips the review step on future saves
  • SQL autocomplete: new clause types — RETURNING, UNION/INTERSECT/EXCEPT, OVER/PARTITION BY, USING, DROP/CREATE INDEX/VIEW
  • SQL autocomplete: smart clause transition suggestions (e.g., WHERE after FROM, HAVING after GROUP BY, LIMIT after ORDER BY)
  • SQL autocomplete: qualified column suggestions (table.column) in JOIN ON clauses and table.* in SELECT
  • SQL autocomplete: compound keyword suggestions — IS NULL, IS NOT NULL, NULLS FIRST, NULLS LAST, ON CONFLICT, ON DUPLICATE KEY UPDATE
  • SQL autocomplete: richer column metadata in suggestions (primary key, nullability, default value, comment)
  • SQL autocomplete: keyword documentation in completion popover
  • SQL autocomplete: expanded keyword and function coverage — window functions, PostgreSQL/MySQL-specific, transaction, DCL, aggregate, datetime, string, numeric, JSON
  • SQL autocomplete: context-aware suggestions for ALTER TABLE, INSERT INTO, CREATE TABLE, and COUNT(*)
  • SQL autocomplete: improved fuzzy match scoring — prefix and contains matches rank above fuzzy-only matches
  • Keyboard shortcut customization in Settings > Keyboard — rebind any menu shortcut via press-to-record UI, with conflict detection and "Reset to Defaults" support
  • Keyboard shortcut for Switch Connection (⌘⌥C) — quickly open the connection switcher popover from the menu or keyboard

Changed

  • Layout architecture: replaced SplitViewMinWidthEnforcer NSViewRepresentable hack with proper AppDelegate-based inspector split view configuration — eliminates KVO observation, 300ms sleep, and recursive view tree traversal
  • Inspector data flow: replaced manual snapshot syncing (syncRightPanelSnapshotData() + 5 onChange handlers) with InspectorContext value type passed directly through the view hierarchy via @Binding
  • Right panel state: RightPanelState no longer holds snapshot copies of coordinator data or a weak coordinator reference — it now only manages panel visibility, tab state, and owned objects
  • AI chat panel: receives currentQuery: String? parameter instead of a MainContentCoordinator reference — better separation of concerns
  • Sidebar save: replaced .saveSidebarChanges notification with direct closure (RightPanelState.onSave) set by the notification handler
  • Structure tab grid columns now auto-size to fit content on data load
  • Structure view column headers and status messages are now localized
  • SQL autocomplete: 50ms debounce for completion triggers to reduce unnecessary work
  • SQL autocomplete: fuzzy matching rewritten for O(1) character access performance

Fixed

  • Structure view: undo/redo (⌘Z / ⇧⌘Z) now works for all schema editing operations — previously non-functional
  • Structure view: undo-delete no longer duplicates existing rows in the grid
  • Structure view: deleting a new (unsaved) item then undoing correctly re-adds it
  • Structure view: save button now disabled when validation errors exist (empty column names/types)
  • Structure view: validation now rejects indexes and foreign keys referencing columns pending deletion
  • Structure view: multi-column foreign keys are correctly preserved instead of being truncated to single-column
  • Structure view: renaming a MySQL/MariaDB column now uses CHANGE COLUMN instead of MODIFY COLUMN (which cannot rename)
  • Structure view: eliminated redundant discardChanges() and loadSchemaForEditing() calls on save and initial load
  • PostgreSQL: DDL tab now includes PRIMARY KEY, UNIQUE, CHECK, and FOREIGN KEY constraints plus standalone indexes
  • PostgreSQL: primary key columns are now correctly detected and displayed in the structure grid
  • Security: escape table and database names in all driver schema queries to prevent SQL injection from names containing special characters
  • SQL editor: undo/redo (⌘Z / ⇧⌘Z) now works correctly (was blocked by responder chain selector mismatch)
  • SQL autocomplete: clause detection now works correctly inside subqueries
  • SQL autocomplete: block comment detection no longer treats -- inside /* */ as a line comment
  • SQL autocomplete: database-specific type keywords (e.g., PostgreSQL JSONB, MySQL ENUM) now appear in suggestions
  • SQL autocomplete: schema suggestions no longer disappear after CREATE TABLE
  • SQL autocomplete: function completion now inserts COUNT() with cursor between parentheses instead of COUNT(
  • SQL autocomplete: RETURNING suggestions now work after INSERT INTO and after closed VALUES (...) parentheses
  • SQL autocomplete: CREATE INDEX ON suggests columns from the referenced table instead of table names
  • SQL autocomplete: transition keywords (WHERE, JOIN, ORDER BY) no longer buried under columns at clause boundaries
  • SQL autocomplete: schema-qualified names (e.g., schema.table.column) handled correctly
  • Data grid: column order no longer flashes/swaps when sorting (stable identifiers for layout persistence)
  • Data grid: "Copy Column Name" and "Filter with column" context menu actions no longer copy sort indicators (e.g., "name 1▲")
  • SQL generation: ALTER TABLE, DDL, and SQL Preview statements now consistently end with a semicolon
  • AI chat: "Ask Each Time" connection policy now shows a confirmation dialog before sending data to AI — previously silently fell through to "Always Allow"

Removed

  • Deleted unused StructureTableCoordinator.swift (~275 lines of dead code)
  • Deleted 5 dead NSToolbar files (ToolbarController, ToolbarWindowConfigurator, ToolbarItemFactory, ToolbarItemIdentifier, ToolbarHostingViews) — never referenced by active code
  • Removed SplitViewMinWidthEnforcer struct from ContentView.swift
  • Removed .saveSidebarChanges notification definition and subscription

0.4.0 - 2026-02-16

Added

  • SQL Preview button (eye icon) in toolbar to review all pending SQL statements before committing changes (⌘⇧P)
  • Multi-column sorting: Shift+click column headers to add columns to the sort list; regular click replaces with single sort. Sort priority indicators (1▲, 2▼) are shown in column headers when multiple columns are sorted
  • "Copy with Headers" feature (Shift+Cmd+C) to copy selected rows with column headers as the first TSV line, also available via context menu in the data grid
  • Column width persistence within tab session: resized columns retain their width across pagination, sorting, and filtering reloads
  • Dangerous query confirmation dialog for DELETE/UPDATE statements without a WHERE clause — summarizes affected queries before execution
  • SQL editor horizontal scrolling for long lines without word wrapping
  • Scroll-to-match navigation in SQL editor find panel
  • GitHub Sponsors funding configuration

Changed

  • Raise minimum macOS version from 13.5 (Ventura) to 14.0 (Sonoma)
  • Change Export/Import keyboard shortcuts from ⌘E/⌘I to ⇧⌘E/⇧⌘I to avoid conflicts with standard text editing shortcuts
  • Configure URLSession to wait for network connectivity in analytics and license services
  • Improve SQL statement parser to handle backslash escapes within string literals, preventing false positives in dangerous query detection

Fixed

  • Fix SQL editor not updating colors when switching between light and dark mode
  • Fix sidebar retaining stale table selections and pending operations for tables that no longer exist after a database refresh

0.3.2 - 2026-02-14

Fixed

  • Fix launch crash on macOS 13 (Ventura) x86_64 caused by accessing NSApp.appearance before NSApplication is initialized during settings singleton setup

0.3.1 - 2026-02-14

Fixed

  • Fix syntax highlighting not applying after paste in SQL editor — defer frame-change notification so the visible range recalculates after layout processes the new text
  • Fix data grid not refreshing after inserting a new row by incrementing reloadVersion on row insertion

0.3.0 - 2026-02-13

Added

  • AI chat panel — right-side panel for AI-assisted SQL queries with multi-provider support (Claude, OpenAI, OpenRouter, Ollama, custom endpoints)

  • AI provider settings — configure multiple AI providers in Settings > AI with API key management (Keychain), endpoint configuration, model selection, and connection testing

  • AI feature routing — map AI features (Chat, Explain Query, Fix Error, Inline Suggestions) to specific providers and models

  • AI schema context — automatically includes database schema, current query, and query results in AI conversations for context-aware assistance

  • AI chat code blocks — SQL code blocks in AI responses include Copy and Insert to Editor buttons

  • Per-connection AI policy — control AI access per connection (Always Allow, Ask Each Time, Never) in the connection form

  • Toggle AI Chat keyboard shortcut (⌘⇧L) and toolbar button

  • Anonymous usage analytics with opt-out toggle in Settings > General > Privacy — sends lightweight heartbeat (OS version, architecture, locale, database types) every 24 hours to help improve TablePro; no personal data or queries are collected

  • ENUM/SET column editor: double-click ENUM columns to select from a searchable dropdown popover, SET columns show a multi-select checkbox popover with OK/Cancel buttons

  • PostgreSQL user-defined enum type support via pg_enum catalog lookup

  • SQLite CHECK constraint pseudo-enum detection (e.g., CHECK(col IN ('a','b','c')))

  • Language setting in General preferences (System, English, Vietnamese) with full Vietnamese localization (637 strings)

  • Connection health monitoring with automatic reconnection for MySQL/MariaDB and PostgreSQL — pings every 30 seconds, retries 3 times with exponential backoff (2s/4s/8s) on failure

  • Manual "Reconnect" toolbar button appears when connection is lost or in error state

Changed

  • Migrate Libs/*.a static libraries to Git LFS tracking to reduce repository clone size
  • Remove stale .gitignore entries for architecture-specific MariaDB libraries
  • Replace filter { }.count with count(where:) across 7 files for more efficient collection counting
  • Replace print() with Logger in documentation examples and remove from #Preview blocks
  • Replace .count > 0 with !.isEmpty in documentation example

Fixed

  • Fix launch crash on macOS 13 caused by missing asyncAndWait symbol in CodeEditSourceEditor 0.15.2 (API requires macOS 14+); updated dependency to track main branch which uses sync instead
  • Escape single quotes in PostgreSQL pg_enum lookup and SQLite sqlite_master queries to prevent SQL injection
  • ENUM column nullable detection now uses actual schema metadata instead of heuristic rawType check
  • PostgreSQL primary key modification now queries the actual constraint name from pg_constraint instead of assuming the {table}_pkey naming convention, supporting tables with custom constraint names
  • Align Xcode SWIFT_VERSION build setting from 5.0 to 5.9 to match .swiftformat target version

0.2.0 - 2026-02-11

Added

  • AI chat panel — right-side panel for AI-assisted SQL queries with multi-provider support (Claude, OpenAI, OpenRouter, Ollama, custom endpoints)

  • AI provider settings — configure multiple AI providers in Settings > AI with API key management (Keychain), endpoint configuration, model selection, and connection testing

  • AI feature routing — map AI features (Chat, Explain Query, Fix Error, Inline Suggestions) to specific providers and models

  • AI schema context — automatically includes database schema, current query, and query results in AI conversations for context-aware assistance

  • AI chat code blocks — SQL code blocks in AI responses include Copy and Insert to Editor buttons

  • Per-connection AI policy — control AI access per connection (Always Allow, Ask Each Time, Never) in the connection form

  • Toggle AI Chat keyboard shortcut (⌘⇧L) and toolbar button

  • SSL/TLS connection support for MySQL/MariaDB and PostgreSQL with configurable modes (Disabled, Preferred, Required, Verify CA, Verify Identity) and certificate file paths

  • RFC 4180-compliant CSV parser for clipboard paste with auto-detection of CSV vs TSV format

  • Explain Query button in SQL editor toolbar and menu item (⌥⌘E) for viewing execution plans

  • Connection switcher popover for quick switching between active/saved connections from the toolbar

  • Date/time picker popover for editing date, datetime, timestamp, and time columns in the data grid

  • Read-only connection mode with toggle in connection form, toolbar badge, and UI-level enforcement (disables editing, row operations, and save changes)

  • Configurable query execution timeout in Settings > General (default 60s, 0 = no limit) with per-driver enforcement via statement_timeout (PostgreSQL), max_execution_time (MySQL), max_statement_time (MariaDB), and sqlite3_busy_timeout (SQLite)

  • Foreign key lookup dropdown for FK columns in the data grid — shows a searchable popover with values from the referenced table, displaying both the ID and a descriptive display column

  • JSON column editor popover for JSON/JSONB columns with pretty-print formatting, compact mode, real-time validation, and explicit save/cancel buttons

  • Excel (.xlsx) export format with lightweight pure-Swift OOXML writer — supports shared strings deduplication, bold header rows, numeric type detection, sheet name sanitization, and multi-table export to separate worksheets

  • View management: Create View (opens SQL editor with template), Edit View Definition (fetches and opens existing definition), and Drop View from sidebar context menu. Adds fetchViewDefinition() to all database drivers (MySQL, PostgreSQL, SQLite)

Fixed

  • Fixed crash on launch on macOS 13 (Ventura) caused by missing Swift runtime symbol
  • Fix redo functionality in data grid (Cmd+Shift+Z now works correctly)
  • Fix redo stack not being cleared when new changes are made (standard undo/redo behavior)
  • Fix canRedo() always returning false in data grid coordinator
  • Wire undo/redo callbacks directly to data grid for proper responder chain validation
  • Fix MariaDB connection error 1193 "Unknown system variable 'max_execution_time'" by using the correct max_statement_time variable for MariaDB
  • Query timeout errors no longer prevent database connections from being established

Changed

  • Replace all print() statements with structured OSLog Logger across 25 files for better debugging via Console.app

0.1.1 - 2026-02-09

Added

  • AI chat panel — right-side panel for AI-assisted SQL queries with multi-provider support (Claude, OpenAI, OpenRouter, Ollama, custom endpoints)

  • AI provider settings — configure multiple AI providers in Settings > AI with API key management (Keychain), endpoint configuration, model selection, and connection testing

  • AI feature routing — map AI features (Chat, Explain Query, Fix Error, Inline Suggestions) to specific providers and models

  • AI schema context — automatically includes database schema, current query, and query results in AI conversations for context-aware assistance

  • AI chat code blocks — SQL code blocks in AI responses include Copy and Insert to Editor buttons

  • Per-connection AI policy — control AI access per connection (Always Allow, Ask Each Time, Never) in the connection form

  • Toggle AI Chat keyboard shortcut (⌘⇧L) and toolbar button

  • Auto-update support via Sparkle 2 framework (EdDSA signed)

  • "Check for Updates..." menu item in TablePro menu

  • Software Update section in Settings > General with auto-check toggle

  • CI appcast generation and auto-deploy on tagged releases

  • Migrate SQL editor to CodeEditSourceEditor (tree-sitter powered)

  • Multi-statement SQL execution support

  • "Show Structure" context menu for sidebar tables

  • Improved filter panel UI/UX

  • SwiftUI EditorTabBar (replacing AppKit NativeTabBarView)

  • GPL v3 license

Fixed

  • Fix MySQL 8+ connections failing with caching_sha2_password plugin error by rebuilding libmariadb.a with the auth plugin compiled statically
  • Fix Delete key on data grid row from marking table as deleted
  • Downgrade all APIs to support macOS 13.5 (Ventura)
  • Code review fixes for multi-statement execution

Changed

  • CI release notes now read from CHANGELOG.md instead of auto-generating from commits
  • Removed prepare-libs CI job to speed up build pipeline (~5 min savings)
  • Add SPM Package.resolved for CodeEditSourceEditor dependencies
  • Add Claude Code project settings
  • Update build/test commands with -skipPackagePluginValidation

0.1.0 - 2026-02-05

Initial Public Release

TablePro is a native macOS database client built with SwiftUI and AppKit, designed as a fast, lightweight alternative to TablePlus.

Features

  • Database Support

    • MySQL/MariaDB connections
    • PostgreSQL support
    • SQLite database files
    • SSH tunneling for secure remote connections
  • SQL Editor

    • Syntax highlighting with TreeSitter
    • Intelligent autocomplete for tables, columns, and SQL keywords
    • Multi-tab editing support
    • Query execution with result grid
  • Data Management

    • Interactive data grid with sorting and filtering
    • Inline editing capabilities
    • Add, edit, and delete rows
    • Pagination for large result sets
    • Export data (CSV, JSON, SQL)
  • Database Explorer

    • Browse tables, views, and schema
    • View table structure and indexes
    • Quick table information and statistics
    • Search across database objects
  • User Experience

    • Native macOS design with SwiftUI
    • Dark mode support
    • Customizable keyboard shortcuts
    • Query history tracking
    • Multiple database connections
  • Developer Features

    • Import/export connection configurations
    • Custom SQL query templates
    • Performance optimized for large datasets