New Features
- SQL File Management: Open, save, and save-as for SQL files with native macOS title bar integration
- BigQuery Support: Google BigQuery analytics database via REST API (plugin)
- AI Kill Switch: Global toggle to disable all AI features (Settings > AI)
- Column Reordering: Drag to reorder columns in the Structure tab (MySQL/MariaDB)
- Nested Groups: Hierarchical connection groups up to 3 levels deep
- Safety Dialogs: Confirmation prompts for deep link queries, connection imports, and pre-connect scripts
Improvements
- JSON fields in Row Details sidebar now display in a scrollable monospaced text area
- Removed query history sync from iCloud Sync (history stays local-only)
Bug Fixes
- 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
- 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
New Features
- Connection Sharing: Export and import connections as
.tableprofiles. Includes import preview with duplicate detection, status badges, and per-item resolution (#466) - Encrypted Export (Pro): Include passwords in exported files, protected by AES-256-GCM encryption with a passphrase
- Linked Folders (Pro): Watch a shared directory for
.tableprofiles. Connections appear read-only in the sidebar with per-user passwords - Environment Variables (Pro): Use
$VARand${VAR}in.tableproconnection files, resolved at connection time
New Features
- Enum/Set Picker: Edit enum and set columns with a dropdown picker for PostgreSQL custom enums, ClickHouse Enum8/Enum16, and DuckDB ENUM types
- Boolean Picker: MSSQL BIT columns and MySQL TINYINT(1) columns now use a boolean toggle instead of manual text entry
Improvements
- Correct type classification for ClickHouse Nullable()/LowCardinality() wrappers, MSSQL MONEY/IMAGE/DATETIME2, DuckDB unsigned integers, and parameterized MySQL integer types
Bug Fixes
- XLSX export producing corrupted files that Excel cannot open
- Deep link cold launch missing toolbar and duplicate windows
Bug Fixes
- Keyboard shortcut hints in the welcome window footer no longer overflow and truncate when space is limited
New Features
- Multi-select Connections: Select multiple connections in the Welcome window with Cmd+Click and Shift+Click, then bulk delete (⌘⌫), move to group, or multi-connect
- Reorder Connections: Drag to reorder connections within groups and reorder groups in the Welcome window
- Built-in Plugins: ClickHouse, MSSQL, Redis, XLSX Export, MQL Export, and SQL Import now ship as built-in plugins (no separate installation needed)
Improvements
- Large document safety caps for syntax highlighting (skip files >5MB, throttle >50KB)
- Lazy-load full values for LONGTEXT/MEDIUMTEXT/CLOB columns in the detail pane sidebar
Bug Fixes
- SSH profile connections displaying incorrect host/username on the Welcome window home screen
- Saved connections disappearing after normal app quit (Cmd+Q) while persisting after force quit
- 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
Bug Fixes
- 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 and schema restore errors during reconnect now logged instead of silently discarded
- 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
New Features
- Redis Key Tree: Browse Redis keys grouped by namespace with collapsible tree view in the sidebar (#418)
- Keyboard Focus Navigation: Navigate connection list, quick switcher, and database switcher using Tab, Ctrl+J/K/N/P, and arrow keys
- MongoDB SRV Support: Connect using
mongodb+srv://URIs with SRV toggle, Auth Mechanism dropdown, and Replica Set field (#419) - Database Type Badges: Connection form shows all available database types with install status badges (#418)
Improvements
- MongoDB
authSourcenow defaults to the database name per MongoDB URI spec instead of always “admin”
Bug Fixes
- Fixed DuckDB TIMESTAMPTZ, TIMETZ, and other temporal columns displaying as null (#424)
- Fixed onboarding “Get Started” button not rendering on macOS 15 until window loses focus (#420)
- Faster MongoDB sidebar loading with
estimatedDocumentCountand smaller schema sample
New Features
- Row Numbers Column: Show or hide row numbers in the data grid via Settings > Data Grid
- Persistent Column Layout: Column widths and order are saved per table across tab switches, view toggles, and app restarts
Bug Fixes
- Fixed incorrect version displayed for installed registry plugins (#410)
- Fixed dangling pointer in release builds due to incorrect buffer handling
- Fixed AI provider connection test error handling (#407)
- Fixed use-after-free crash in Redis plugin
New Features
- Export Query Results: Export the results of any SQL query directly to CSV, JSON, SQL, XLSX, or MQL files via right-click context menu or File > Export Results
- Amazon DynamoDB Support: Connect to DynamoDB with PartiQL queries, AWS IAM/Profile/SSO authentication, GSI/LSI browsing, table scanning, capacity display, and DynamoDB Local support
- SSH Tunnel Profiles: Save SSH configurations once and reuse them across multiple connections
- Ctrl+HJKL Navigation: Arrow key alternative for keyboards without dedicated arrow keys
- Pro License Gating: Safe Mode (Touch ID) and XLSX export now require a Pro license
Bug Fixes
- Fixed high CPU usage (79%+) and energy consumption when idle (#394)
- Fixed etcd connection failing with 404 when gRPC gateway uses a different API prefix
- Fixed data grid editing not working in query tabs (#383)
New Features
- Cloudflare D1 Support: Connect to Cloudflare D1 databases directly from TablePro
- Autocomplete Match Highlighting: Matched characters in autocomplete suggestions are now shown in bold
- Autocomplete Loading Indicator: Loading spinner while fetching column metadata
Improvements
- Refactored autocomplete popup to native SwiftUI with visible selection highlight, native accent color, and 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 with unified fuzzy scoring
- Increased autocomplete suggestion limit from 20 to 40 for schema-heavy contexts
Improvements
- Improved performance for foreign key fetching, query history, tab persistence, and sidebar rendering
Bug Fixes
- Fixed SQL syntax error when editing columns with reserved keyword names (e.g.,
database,table,order) in MySQL, PostgreSQL, and SQLite - Fixed high CPU usage and memory leaks at idle
- Fixed architecture-specific update delivery
Bug Fixes
- Fixed safe mode badge not displaying for silent level
- Fixed safe mode level not reflecting live toolbar changes
- Fixed
~/.pgpasspassword lookup using SSH tunnel host instead of the original host
New Features
- Turkish Language: Added Turkish (Türkçe) as a new language option in Settings > General
- etcd v3 Support: New database plugin with prefix-tree key browsing, etcdctl syntax editor, lease management, watch, mTLS, auth, and cluster info
- Save Changes Button: New toolbar button for committing pending data edits
- Connection Delete Confirmation: Confirmation dialog before deleting a connection
- Unsaved Edit Protection: Confirmation dialog before sort, pagination, filter, or search discards unsaved edits
Bug Fixes
- Fixed SSH tunnel crashes caused by concurrent libssh2 calls on the same session
- Fixed unsaved cell edits lost when switching tabs, sorting, paginating, filtering, or switching apps
- Fixed auto-reconnect and health monitor silently discarding unsaved changes
- Fixed SSH tunnel recovery failing after tunnel death due to stale driver state
- Fixed health monitor ping interfering with active user queries
- Fixed connection test not cleaning up SSH tunnel on completion
- Fixed test connection success indicator not resetting after field changes
- Fixed SSH port field accepting invalid values
- Fixed DROP TABLE and TRUNCATE TABLE sidebar operations producing no SQL for plugin-based drivers
- Fixed foreign key navigation arrows not appearing after switching databases with Cmd+K on MySQL
- Fixed sidebar not refreshing after creating or dropping tables
- Fixed dropping a table disconnecting the database when the dropped table’s tab was active
Bug Fixes
- Fixed SSH tunnel connections timing out when connecting through SSH
- Fixed plugin metadata dispatch failing for externally installed plugins
- Improved SSH public key authentication error messages with detailed failure reasons
New Features
- 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 as JSON: Copy selected rows as JSON from context menu and Edit menu
- Help Menu: Quick links to website, documentation, GitHub, and sponsor page
- BLOB Hex Display: View BLOB data as hex dump in the detail view sidebar
Bug Fixes
- Fixed SSH agent connections failing when socket path contains
~(e.g., 1Password agent) - Fixed Keychain authorization prompt appearing on every table open
Bug Fixes
- Fixed plugin download counts resetting to zero when a new plugin version is released
New Features
- Theme Engine: 4 built-in themes (Default Light/Dark, Dracula, Nord) with full color, font, and layout customization. Import/export themes as JSON
- Theme Registry: Browse, install, and update community themes from the plugin registry
- Cassandra & ScyllaDB Support: Connect to Cassandra and ScyllaDB databases via a downloadable plugin
- SSH Two-Factor Authentication: TOTP support with auto-generate and prompt modes for SSH connections
- SSH Host Key Verification: Fingerprint confirmation dialog for new and changed host keys
- Keyboard Interactive SSH: Support for keyboard-interactive authentication method
- Column Visibility: Toggle columns on/off via status bar button or header context menu
- Copy as SQL: Copy selected rows as INSERT or UPDATE statements from the data grid context menu
- PostgreSQL
.pgpassSupport: Automatic password lookup from~/.pgpassfor PostgreSQL and Redshift connections - Pre-connect Script: Run a shell command before each connection via Connection > Advanced
- Custom Plugin Registry URL: Configure a private/enterprise registry URL for plugin distribution
Improvements
- MSSQL, MongoDB, Redis, XLSX export, MQL export, and SQL import extracted 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
- App-level appearance mode (Light, Dark, Auto) independent of theme selection
- MSSQL query cancellation and lock timeout support
Bug Fixes
- Fixed plugin icon rendering not supporting custom asset images alongside SF Symbols
New Features
- DuckDB Support: Connect to
.duckdbfiles, query CSV/Parquet/JSON files via SQL, schema navigation, and extension management - MongoDB Auth Database: Configure
authSourceto authenticate against any database instead of the defaultadmin - Safe Mode Levels: 6 per-connection 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
- 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
.tablepluginbundle with support for.sqland.gzcompressed files - Open SQLite from Finder: Double-click
.sqlite,.sqlite3,.db3,.s3db,.sl3, and.sqlitedbfiles to open them directly - Plugin Install Prompt: Automatic prompt to install missing driver plugins when connecting to an unsupported database type
Improvements
- Oracle and ClickHouse shipped as downloadable plugins, reducing app bundle size
- SQLite driver extracted from built-in bundle to downloadable plugin
- 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 and ClickHouse, eliminating string interpolation
- Batch query operations for MSSQL, Oracle, ClickHouse, and SQLite, eliminating N+1 patterns
- Unified error formatting and localized error messages across all database drivers
- Standardized parameter binding with type-aware numeric handling and NULL literal support
Bug Fixes
- Fixed MongoDB Read Preference, Write Concern, and Redis Database not persisting across app restarts
- Fixed DELETE and UPDATE queries using all columns in WHERE clause instead of primary key for PostgreSQL, Redshift, MSSQL, and ClickHouse
- Fixed SSL/TLS always being enabled for MongoDB, Redis, and ClickHouse connections
- Fixed Redis sidebar click showing data briefly then going empty
- Fixed MongoDB showing “Invalid database name” when connecting without a database name
- Fixed result truncation at 100K rows being silently discarded instead of reported to UI
Bug Fixes
- Fixed stale filter causing repeated errors when restoring tabs after switching database or schema
- Fixed sidebar showing old tables during database/schema switch instead of a loading indicator
- Fixed sidebar search field disappearing when no tables match filter on macOS 15 and earlier
- Fixed disabled plugin database types still appearing in connection form picker
- Fixed main window not closing before reopening welcome screen on connection failure
New Features
- Plugin System: All 8 database drivers and 5 export formats extracted into
.tablepluginbundles loaded at runtime. Enables third-party plugins - Plugin Marketplace: Browse, search, and install plugins from the GitHub-hosted registry with checksum verification
- Settings > Plugins: Manage installed plugins: enable/disable, install from file or marketplace, view details
- ClickHouse Support: Query ClickHouse databases with progress tracking, EXPLAIN variants, TLS/HTTPS, server-side cancellation, and Parts view
- Startup Commands: Run custom SQL after connecting (e.g.,
SET time_zone) via Connection > Advanced tab - Chinese Simplified Localization: Full zh-Hans translation for the entire app UI
Improvements
- Reduced memory by ~80-130 MB per connection: eliminated dedicated ping driver, lazy plugin loading, RowBuffer deduplication, metadata driver consolidation
- Consolidated per-editor NSEvent monitors into shared singleton (O(n) to O(1) per event)
- Reorganized project into domain-specific subdirectories
Bug Fixes
- Fixed inspector separator bleeding into toolbar area with default connection color
- Fixed inspector toggle lagging due to synchronous UserDefaults writes during animation
New Features
- Oracle Database Support: Connect to Oracle databases via OCI (Oracle Call Interface)
- Database URL Scheme: Open connections directly from terminal with
open "mysql://user@host/db" -a TablePro. Supports MySQL, PostgreSQL, SQLite, MongoDB, Redis, MSSQL, and Oracle - SSH Agent Authentication: Use SSH Agent for tunnel authentication, compatible with 1Password SSH Agent, Secretive, and ssh-agent
- Multi-Jump SSH: Chain multiple SSH hops (ProxyJump) to reach databases through bastion hosts. Configure jump hosts in the connection form or import from
~/.ssh/config
Improvements
- Reduced app binary size by ~55% by replacing CodeEditLanguages xcframework (38 grammars) with a local package compiling only SQL, Bash, and JavaScript
Bug Fixes
- Fixed memory leak where session state objects were recreated on every tab open, causing 785MB usage at 5 tabs
- Fixed per-cell field editor allocation in DataGrid creating 180+ NSTextView instances instead of sharing one
- Fixed NSEvent monitor not removed on all popover dismissal paths in connection switcher
- Fixed race condition in FreeTDS
disconnect()wheredbprocwas set to nil without holding the lock - Fixed JSON encoding and file I/O blocking the main thread in TabStateStorage
- Fixed MySQL/MariaDB getting
BEGINinstead ofSTART TRANSACTIONin table operations - Fixed port resetting to default value when editing a connection with a custom port
- Fixed data races in
MainContentCoordinator,LibPQConnection, andVimKeyInterceptor - Fixed SSH askpass script written with world-readable permissions
- Fixed welcome screen showing blank panel when connections have orphaned group IDs
- Fixed multiple tabs auto-executing queries simultaneously on connection restore
- Fixed unescaped identifiers in MySQL
SHOW CREATE TABLEqueries allowing SQL injection via table names - Fixed
QueryResultRowequality ignoring cell values, preventing SwiftUI from re-rendering updated rows - Fixed
Cmd+Deletein sidebar search clearing the query editor
New Features
- PostgreSQL Database & Schema Switching: Switch databases and schemas for PostgreSQL connections via ⌘K
New Features
- Microsoft SQL Server Support: Connect to SQL Server 2017+ databases via FreeTDS with schema browsing, table structure, indexes, foreign keys, and paginated queries
- Edit and Delete Without Primary Key: Edit and delete rows in tables that don’t have a primary key
Bug Fixes
- Fixed MSSQL connection losing selected database after disconnect and reconnect when no default database is configured
- Fixed DELETE operations on tables without a primary key being silently dropped when row data is missing
- Fixed high CPU and RAM usage on app launch from blocking storage init, unsynchronized health monitors, and excessive retry loops
- Fixed slow database switcher loading by replacing N+1 metadata queries with single batched queries
- Fixed slow Redis key browsing by pipelining TYPE and TTL commands in a single round trip
- Fixed slow SQL export startup by batching COUNT(*) queries and dependent lookups
- Fixed slow AI Chat schema loading by fetching all foreign keys in a single bulk query
- Fixed O(n) string operations causing high CPU in geometry parsing, Redis driver, and autocomplete scoring
New Features
- Redis Support: Connect to Redis databases with key-value browsing, database-level sidebar (db0-db15), TTL management, and interactive CLI
- TablePlus-compatible URLs: Open databases via command line with
open -a TablePro "postgresql://user@host/db", supporting schema switching, table opening, filters, color, and environment tags
Bug Fixes
- Fixed sidebar search field and main content area background colors not blending with macOS vibrancy
- Fixed POINT and geometry columns showing blank values in MySQL and wrong type label in sidebar
New Features
- Amazon Redshift Support: Connect to Amazon Redshift data warehouses
- Deep Links: Open connections, tables, queries, and import connections via
tablepro://URLs - Copy as URL: Right-click a connection to copy its details as a connection string (e.g.,
mysql://user:pass@host/db) - Auto-show Inspector: Automatically open the right sidebar when selecting a row (Settings > Data Grid)
- Homebrew Cask: Install via
brew install --cask tablepro
Improvements
- ENUM and SET columns now open their picker on single click with a chevron indicator, matching boolean column behavior
Bug Fixes
- Fixed “Table not found” error when switching databases within the same connection (Cmd+K) while a table tab is open
- Fixed right sidebar state not persisting across native window-tabs
Bug Fixes
- Fixed MySQL second tab showing empty rows when macOS merges tab groups
- Fixed MongoDB tab name showing “MQL Query” instead of collection name when using bracket notation
New Features
- Environment Color Indicator: Subtle toolbar tint based on connection color for at-a-glance environment identification
- SSH Tunnel URL Import: Import database connections from SSH tunnel URLs (e.g.,
mysql+ssh://,postgresql+ssh://) - Connection Groups: Organize database connections into folders with colored headers
Improvements
- Toolbar now uses native macOS overflow behavior with History/Export/Import in the secondary action menu
- Redesigned right sidebar detail pane with compact field layout and type-aware editors
Bug Fixes
- Fixed toolbar briefly showing “MySQL” and missing version info when opening a new tab
- Fixed keyboard shortcuts not working after connecting from the welcome screen until a second tab was opened
- Fixed toolbar overflow menu showing only one item when the window is narrow
- Fixed AI chat showing “SQL” label and missing syntax highlighting for MongoDB code blocks
New Features
- Multiple Database Connections: Open separate windows for different database connections, each with independent session isolation
- MongoDB Support: Connect to MongoDB databases with collection browsing, document viewing, and MQL export
- Import from URL: Import database connections directly from connection strings (e.g.,
postgresql://user:pass@host:5432/db) - Custom About Window: New About window with version info and quick links to Website, GitHub, and Documentation
Improvements
- Release notes now shown in the Sparkle update window
Bug Fixes
- Fixed new row (Cmd+I) and duplicated row not appearing in data grid until manual refresh
- Fixed PostgreSQL SSH tunnel connections failing with “no encryption” due to SSL config not being preserved
- Fixed PostgreSQL SSL
sslrootcertpassed unconditionally, causing certificate verification failure in Required mode
Bug Fixes
- Fixed app bundle not ad-hoc signed. Signing step was unreachable when no dylibs were bundled
Bug Fixes
- Fixed Sparkle auto-update failing with “improperly signed” error. Release ZIPs now preserve framework symlinks and include proper ad-hoc code signatures
New Features
- Vim Mode for SQL Editor: Full Vim keybindings with Normal/Insert/Visual modes, motions (
w,b,e,^,_), operators, and:w/:qcommands. Toggle in Editor Settings - PostgreSQL Schema Switching: Browse and switch between schemas (
public,auth, custom schemas) via ⌘K database switcher
Improvements
- Query history operations converted to native Swift async/await for faster response
- Export and Import services consolidated to reduce UI update overhead
- App startup uses structured Task-based retry loops instead of dispatch chains
Bug Fixes
- Fixed cell edit showing modified background (yellow) but reverting to original value after pressing Enter
- Fixed undo on inserted row cell edit not syncing data correctly
- Fixed Vim Escape key not working when autocomplete popup is visible
- Fixed Copy/Cut (⌘C/⌘X) not working in SQL editor
- Fixed Vim yank/delete not syncing to system clipboard
- Fixed multiple Vim motion and visual mode selection issues
- Fixed event monitor and memory leaks in SQL editor lifecycle
- Fixed unbounded memory growth from tab registry, sorted row cache, and schema provider retention
- Fixed background tabs retaining full result data indefinitely
- Fixed crash on macOS 14.x caused by missing libpq symbol. Now uses vendored static libraries
- Fixed duplicate tabs when inserting SQL from AI Chat or History with multiple windows open
- Fixed various coordinator lifecycle issues (teardown, destroy, cancellation)
- Fixed DataGridView unnecessary column reconfiguration on every version bump
- Fixed ConnectionHealthMonitor slow failure detection. Now supports immediate health checks
New Features
- Native macOS Window Tabs: The tab bar is now rendered by macOS itself. Identical to Finder, Safari, and Xcode tabs with automatic dark/light mode support, drag-to-reorder, and “Merge All Windows” for free
- Independent Tab Windows: Each tab is a full independent window with its own sidebar, editor, and state. No more shared state between tabs
Improvements
- Tab Switching Performance: Schema is now cached per connection so new native tabs reuse the already-loaded schema instead of re-fetching from the database (saves 500ms–2s per tab)
- Background Schema Loading: Schema loads concurrently. Table data appears immediately while autocomplete schema loads in the background
- Sidebar MVVM Refactor: Sidebar table list migrated to a testable
SidebarViewModelarchitecture with extractedTableRowViewand context menu components - Window title updates dynamically after in-place navigation (sidebar click, FK navigation)
- 10+ SwiftUI rendering optimizations to prevent O(N) view cascades across windows
Bug Fixes
- Fixed sidebar losing keyboard focus (arrow key navigation) after opening a second table tab
- Fixed sidebar active state flash when clicking a table that opens in a new native window tab
- Fixed sidebar losing active state when opening a second table in a new native window tab
- Fixed sidebar not refreshing after switching databases via Cmd+K
- Fixed Cmd+W in empty state doing nothing. Now closes the connection window and disconnects
- Fixed Cmd+K database switch flooding all windows with error alerts
- Fixed clicking a table in the sidebar replacing the current tab instead of opening a new one
- Fixed Cmd+W on any tab disconnecting the entire session
- Fixed Cmd+T from empty state creating two native tabs instead of one
- Fixed native tab title showing “SQL Query” instead of the table name
- Fixed Cmd+W on the last tab disconnecting the session instead of returning to empty state
New Features
- Combined Search & Filters: Quick search and filter rows now work together. When both are active, conditions are combined with AND for precise data discovery
- Foreign Key Navigation: FK columns display a clickable arrow icon in each cell. Click to jump directly to the referenced table, pre-filtered to the related row
Improvements
- Instant Metadata Loading: FK arrows, column info, and row counts now load on a dedicated parallel connection, eliminating the 200-300ms delay on initial table load
- Instant Pagination: Approximate row count from database metadata displays immediately with data; exact count refines silently in the background
- Syntax highlighting added to Import SQL file preview
- XLSX export enforces Excel’s 1M row limit per sheet with reduced memory usage
- Multiline cell editing now uses a scrollable overlay editor for better navigation
- MySQL result fetching switched to streaming mode to reduce memory for large result sets
- 30+ internal performance optimizations across SQL editor, tab switching, data grid, exports, and persistence
Bug Fixes
- Fixed AND/OR filter logic mode being ignored in query execution
- Fixed filter panel state (filters, visibility, search, logic mode) not preserved when switching tabs
- Fixed FK navigation filter being cleared when switching to a new tab
- Fixed PostgreSQL and SQLite LIKE/NOT LIKE expressions missing ESCAPE clause
- Fixed SQLite regex filter silently falling back to LIKE substring match
- Fixed PostgreSQL SQL export: newline/tab escaping, missing enum types, missing DROP IF EXISTS for types and sequences
- Fixed memory management issue in PostgreSQL C connector (free vs deallocate)
- Fixed FTS5 search errors from special characters like *, OR, AND
Bug Fixes
- PostgreSQL SQL Export: Fixed DDL export failing for all PostgreSQL tables with “Failed to fetch DDL” error
Improvements
- Welcome window now uses native macOS frosted glass translucency
- Improved tab switching performance by caching row providers and change managers across render cycles
Bug Fixes
- MySQL/MariaDB Timeout: Auto-detect server type to use the correct timeout variable (
max_execution_timefor MySQL,max_statement_timefor MariaDB) - DataGrid Scrolling: Row view recycling, O(1) string length checks, cached fonts, reduced compositing overhead, deferred accessibility labels
- Eliminated selection sync feedback loop causing redundant updates during tab switch
- Reduced SwiftUI re-render cascades by batching state mutations during tab switch
Improvements
- Replaced generic SwiftUI colors with native macOS system colors for proper dark mode, vibrancy, and accessibility adaptation
- Use semantic label colors (
quaternaryLabelColor,tertiaryLabelColor) instead of hardcoded opacity - Use native
shadowColorinstead ofColor.blackfor shadows - Replaced iOS-style Capsule badges with RoundedRectangle for native macOS look
Performance
- 45 performance fixes across the entire codebase, covering memory, CPU, data handling, network, and I/O:
- Memory: Reference-based row buffers, index-based sort cache, streaming XLSX export, driver-level row limits (100K cap), removed redundant string copies, weak references in schema provider, undo stack depth cap, dictionary-based pending changes, weak self in Task captures, clear cached data on disconnect, AI chat message cap
- CPU: Removed expensive Unicode operations in database drivers, cached 100+ regex patterns in SQL formatter, async Keychain reads, cached frequently-used regex patterns, O(1) change lookup index
- Data: Auto-append LIMIT for unprotected queries, row limit caps for all drivers, batch column fetching via INFORMATION_SCHEMA, index permutation sort cache, cached row provider, clipboard 50K row cap, Int-based row IDs replacing UUID
- Network: Phase 2 metadata cache, connect timeout for PostgreSQL, query cancellation via mysql_kill/PQcancel/sqlite3_interrupt, loading guard for sidebar, reuse cached schema for AI
- I/O: Throttled history cleanup, async history storage migration, consolidated onChange handlers
New Features
- Inline AI Suggestions: Ghost text completions in the SQL editor. Triggers automatically on typing pause, Tab to accept, Escape to dismiss
- Schema-Aware Completions: Inline suggestions use actual table and column names from your connected database (cached with 30s TTL)
- VoiceOver Accessibility: Added accessibility labels to data grid, filter panel, toolbar buttons, editor tab bar, and sidebar controls
Improvements
- Migrated notification observers to async sequences for modern Swift concurrency
- Migrated tab state persistence from UserDefaults to file-based storage in Application Support for faster app launch
- Refactored menu and toolbar commands to
@FocusedObjectpattern. Direct method calls instead of global notifications - Redesigned connection form with tab-based layout (General / SSH Tunnel / SSL/TLS / Advanced)
- Revamped connection form UI to native macOS grouped form style with automatic label alignment
- SQLite connections now only show relevant tabs (General and Advanced)
- Added async/await wrapper methods to query history storage
Bug Fixes
- Fixed thread safety race condition in SQLite driver. Serialized all handle access with a dedicated actor
- Fixed SwiftUI sheet presentation reliability. Consolidated multiple
.sheetmodifiers into a single.sheet(item:) - Fixed SSH tunnel setup blocking the UI. Replaced synchronous process waiting with async port probing
- Fixed potential deadlocks in MySQL and PostgreSQL connection cleanup
- SQL editor now respects the macOS accessibility text size preference with live updates
- Fixed retain cycle in update checker and leaked observer in SQL editor coordinator
- Eliminated tab switching delay. Kept NSViews alive across switches, moved I/O to background threads
- Reduced tab-switch CPU spikes from 40-60% to ~10-20% by eliminating redundant data grid reloads
- Table open now shows data instantly. Metadata loads in the background without blocking the grid
- Eliminated 20-80ms overhead when clicking an already-open table in the sidebar
- Fixed Keychain writes silently failing. Return values are now checked and logged
- Added proper service identifiers to all Keychain queries to prevent collisions with other apps
- Fixed leaked async tasks in import dialog and AI provider settings
New Features
- AI Chat Panel: Right-side panel for AI-assisted SQL queries with multi-provider support (Claude, OpenAI, OpenRouter, Ollama, custom endpoints). Includes schema-aware context, markdown rendering, and code blocks with Copy/Insert to Editor buttons
- AI Provider Settings: Configure multiple AI providers in Settings > AI with API key management, 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
- Per-Connection AI Policy: Control AI access per connection (Always Allow, Ask Each Time, Never) in the connection form
- Keyboard Shortcut Customization: Rebind any menu shortcut in Settings > Keyboard via press-to-record UI with conflict detection and “Reset to Defaults”
- Structure View Undo/Redo: Full undo/redo support (⌘Z / ⇧⌘Z) for all column, index, and foreign key operations in the structure editor
- Structure View Type Picker: Database-specific type picker popover: searchable, grouped by category, supports freeform input for parametric types like
VARCHAR(255) - Structure View Dropdowns: YES/NO dropdown menus for Nullable, Auto Inc, and Unique columns
- Tab Reuse Setting: Opt-in option in Settings > Tabs to reuse clean table tabs when clicking a new table in the sidebar
- Switch Connection Shortcut: ⌘⌥C to quickly open the connection switcher popover
- SQL Autocomplete Enhancements: New clause types (RETURNING, UNION, OVER/PARTITION BY), smart clause transitions, qualified column suggestions in JOINs, compound keywords, richer column metadata, keyword documentation, and expanded function/keyword coverage
Improvements
- Migrated 5 NSPopover controllers (Enum, Set, TypePicker, JSONEditor, ForeignKey) to SwiftUI with shared
PopoverPresenterutility - Replaced AppKit history panel (5 files) with single pure SwiftUI
HistoryPanelView - Replaced
ExportTableOutlineView(757 lines) with SwiftUIExportTableTreeView(~146 lines) - Replaced
KeyEventHandlerNSViewRepresentable with native.onKeyPress()modifiers - Improved layout architecture. Eliminated KVO observation hacks and recursive view tree traversal
- Structure tab grid columns now auto-size to fit content on data load
- SQL autocomplete now uses 50ms debounce and optimized fuzzy matching
Bug Fixes
- Fixed structure view undo/redo not working. Undo-delete no longer duplicates rows, and undoing deletion of unsaved items works correctly
- Fixed structure view save button remaining enabled when validation errors exist
- Fixed structure view incorrectly handling multi-column foreign keys and column renames on MySQL/MariaDB
- Fixed PostgreSQL DDL tab missing constraints and primary key detection in structure grid
- Fixed SQL injection vulnerability in driver schema queries with special characters in table/database names
- Fixed SQL editor undo/redo (⌘Z / ⇧⌘Z) being blocked by responder chain mismatch
- Fixed SQL autocomplete issues: subquery clause detection, block comment handling, database-specific types, schema suggestions after CREATE TABLE, function completion inserting incomplete parentheses
- Fixed data grid column order flashing/swapping when sorting
- Fixed “Copy Column Name” and “Filter with column” context menu copying sort indicators
- Fixed AI chat “Ask Each Time” policy silently falling through to “Always Allow”
New Features
- SQL Preview: Review all pending SQL statements before committing changes with a new toolbar button (eye icon) or shortcut (⌘⇧P)
- Multi-Column Sorting: Shift+click column headers to add columns to the sort list; regular click replaces with single sort. Priority indicators (1▲, 2▼) shown in headers
- Copy with Headers: Copy selected rows with column headers as the first TSV line via ⇧⌘C or the data grid context menu
- Column Width Persistence: Resized columns retain their width across pagination, sorting, and filtering reloads within a tab session
- Dangerous Query Confirmation: DELETE/UPDATE statements without a WHERE clause now prompt a confirmation dialog summarizing affected queries
- SQL Editor Horizontal Scrolling: Long lines scroll horizontally without word wrapping
- Find Panel Scroll-to-Match: SQL editor find panel now scrolls to each match during navigation
Improvements
- Raised minimum macOS version from 13.5 (Ventura) to 14.0 (Sonoma)
- Changed Export/Import keyboard shortcuts from ⌘E/⌘I to ⇧⌘E/⇧⌘I to avoid conflicts with standard text editing shortcuts
- URLSession now waits for network connectivity in analytics and license services
- Improved SQL statement parser to handle backslash escapes within string literals, preventing false positives in dangerous query detection
Bug Fixes
- Fixed SQL editor not updating colors when switching between light and dark mode
- Fixed sidebar retaining stale table selections and pending operations for tables removed since the last refresh
Bug Fixes
- Fixed launch crash on macOS 13 (Ventura) x86_64 caused by accessing
NSApp.appearancebeforeNSApplicationis initialized during settings singleton setup
Bug Fixes
- Fixed syntax highlighting not applying after paste in SQL editor by deferring frame-change notification so the visible range recalculates after layout
- Fixed data grid not refreshing after inserting a new row
New Features
- Language Setting: Choose between System, English, or Vietnamese in Settings > General with full Vietnamese localization (637 strings)
- ENUM/SET Column Editor: Double-click ENUM columns for a searchable dropdown, SET columns show multi-select checkboxes with OK/Cancel buttons
- PostgreSQL Enum Support: User-defined enum types resolved via
pg_enumcatalog lookup - SQLite Pseudo-Enum Detection: CHECK constraint-based enum detection for SQLite columns
- Connection Health Monitoring: Automatic 30-second health checks with exponential backoff auto-reconnect (3 retries)
- Anonymous Usage Analytics: Opt-out toggle available in Settings > General > Privacy
Improvements
- Migrated
Libs/*.astatic libraries to Git LFS tracking to reduce repository clone size - Replaced
filter { }.countwithcount(where:)across 7 files - Replaced
print()withLoggerin documentation examples - Aligned Xcode
SWIFT_VERSIONbuild setting from 5.0 to 5.9
Bug Fixes
- Fixed launch crash on macOS 13 caused by missing
asyncAndWaitsymbol in CodeEditSourceEditor 0.15.2 - Fixed SQL injection vulnerability in PostgreSQL
pg_enumlookup and SQLitesqlite_masterqueries by escaping single quotes - Fixed ENUM column nullable detection to use actual schema metadata instead of heuristic
rawTypecheck - Fixed PostgreSQL primary key modification to query actual constraint name from
pg_constraint
New Features
- SSL/TLS Connection Support: Secure connections for MySQL/MariaDB and PostgreSQL with configurable modes (Disabled, Preferred, Required, Verify CA, Verify Identity) and custom certificate file paths
- CSV Clipboard Paste: RFC 4180-compliant CSV parser with auto-detection of CSV vs TSV format when pasting from clipboard
- Explain Query: New button in the SQL editor toolbar and menu item (⌥⌘E) for viewing query execution plans
- Connection Switcher: Quick-switch popover for active and saved connections directly from the toolbar
- Date/Time Picker: Dedicated date picker popover for editing date, datetime, timestamp, and time columns in the data grid
- Read-Only Mode: Connection-level read-only toggle with toolbar badge and full UI enforcement. Disables editing, row operations, and save changes
- Query Timeout: Configurable 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), andsqlite3_busy_timeout(SQLite) - Foreign Key Lookup: Searchable dropdown for FK columns showing values from the referenced table with both ID and descriptive display column
- JSON Column Editor: Popover editor for JSON/JSONB columns with pretty-print formatting, compact mode, real-time validation, and explicit save/cancel buttons
- Excel Export: Export to
.xlsxformat with a lightweight pure-Swift OOXML writer. Supports shared strings deduplication, bold headers, numeric type detection, and multi-table export to separate worksheets - View Management: Create View (opens SQL editor with template), Edit View Definition (fetches existing definition), and Drop View from sidebar context menu
Bug Fixes
- Fixed crash on launch on macOS 13 (Ventura) caused by missing Swift runtime symbol
- Fixed redo functionality in data grid (⌘⇧Z now works correctly)
- Fixed redo stack not being cleared when new changes are made
- Fixed
canRedo()always returning false in data grid coordinator - Wired undo/redo callbacks directly to data grid for proper responder chain validation
- Fixed MariaDB connection error 1193 “Unknown system variable ‘max_execution_time’” by using the correct
max_statement_timevariable - Query timeout errors no longer prevent database connections from being established
Improvements
- Replaced all
print()statements with structured OSLogLoggeracross 25 files for better debugging via Console.app
New Features
- CodeEditSourceEditor Migration: SQL editor now powered by tree-sitter via CodeEditSourceEditor for improved syntax highlighting and performance
- Multi-Statement Execution: Execute multiple SQL statements in a single run
- Show Structure: Right-click any table in the sidebar to quickly view its structure
- Improved Filter Panel: Redesigned filter UI for a better experience
- SwiftUI Tab Bar: New pure SwiftUI editor tab bar replacing the AppKit implementation
- GPL v3 License: Project is now licensed under the GNU General Public License v3
- Auto-Update: In-app updates via Sparkle 2 with EdDSA signing. Check for updates from the TablePro menu or Settings > General
Bug Fixes
- Fixed MySQL 8+ connections failing with
caching_sha2_passwordplugin error by rebuilding libmariadb with the auth plugin compiled statically - Fixed Delete key on data grid rows incorrectly marking the table as deleted
- Downgraded all APIs to support macOS 13.5 (Ventura)
Maintenance
- CI release notes now read from curated CHANGELOG.md instead of auto-generating from commits
- Removed redundant
prepare-libsCI job, speeding up the build pipeline by ~5 minutes - Added SPM Package.resolved for CodeEditSourceEditor dependencies
- Updated build and test commands with
-skipPackagePluginValidation
The first public release of TablePro: a native macOS database client built with SwiftUI and AppKit.
Features
- Multi-Database Support: Connect to MySQL, PostgreSQL, and SQLite databases
- SQL Editor: Full-featured editor with syntax highlighting, autocomplete, and line numbers
- Data Grid: Browse and edit table data with sorting, filtering, and pagination
- SSH Tunneling: Secure database connections via SSH tunnels
- Query History: Track and replay your SQL queries
- Table Structure: View and modify table schemas, indexes, and constraints
- Import/Export: Import SQL files and export data in CSV, JSON, and SQL formats
- Keyboard Shortcuts: Keyboard navigation for power users
- Native Tab Bar: AppKit-powered tab bar with drag-to-reorder support
- Dock Menu: Quick access to welcome window and recent connections
- License Activation: RSA-signed license verification with offline support
Performance
- Optimized SQL editor for large files with viewport-only syntax highlighting
- Native AppKit tab bar for lightweight tab management
- Efficient data grid rendering for large result sets
- Lightweight memory footprint with native Apple frameworks
