Repository navigation
✨ Added
-
DuckDB failure diagnosis and file-format reporting — DuckDB connection failures are translated into an explanation with the fix attached: file lock held by another process or connection, instance-configuration conflict, and storage-format incompatibility each get their own message, and the two lock cases offer retry as read-only inline in the connection form (the connecting modal shows the same explanation on connect).
probe_database_fileadditionally reports the DuckDB storage-format version (header bytes 12..20, mapped to the oldest release that can open the file) and whether a sibling.walwrite-ahead log is present, both shown under the file path. -
Create DuckDB / SQLite databases from the connection form — the file-based path field is editable again and gains
New…/Open…actions backed by the native save dialog (extension appended automatically), an inline explanation of what will happen on connect (the engine creates a missing file, the file exists, is empty, is read-only, is a folder, is a different engine's file, or the parent folder is missing with a one-click "Create folder"), and a per-engine recent-files list with reveal/remove actions. DuckDB also gets the SQLite-style File / In-Memory tabs; in-memory connections are stored as named instances (memory:<label>) because unnamed DuckDB in-memory databases are private to a single connection and would otherwise give every pooled connection its own empty database. A new read-only access mode (access_mode=READ_ONLY) is meant to let DuckDB share a file with other processes (~is expanded for file-based paths, and opening the same DuckDB file a second time with a conflicting access mode is blocked with "switch to that connection" / "open read-only" choices — read-only needs a bridge build with the HikariCP flag alignment below, and the form explains that until it ships). New Tauri commands:probe_database_file(existence, size, writability, header sniffing) andcreate_database_directory.scripts/verify-duckdb-jdbc-urls.shrecords the DuckDB JDBC semantics these decisions rely on. -
Entitlements & version-lock subscription model (geekfun#56) — client-side implementation of the Ultimate entitlement contract: the two server-computed fields
ultimateExpiresAt+versionLockHorizonare consumed via a new Rust entitlement module (persisted cache, offline tolerance, failure degradation, 5-minute refresh throttle,app.releaseDate <= versionLockHorizonunlock check). Rust command gates returnENTITLEMENT_REQUIREDfor AI (agent loop/step, compaction, LLM validation), the whole Transfer module (import/export/migration/structure execution), SSH tunnel establishment, and the MCP bridge (config/policy save + auto-start). The frontend adds an entitlement store, Geekfun login entry, paid-feature gates with upgrade guidance on Data Studio, Transfer, AI assistant sidebar, ER diagram actions, AI/MCP settings, SSH tunnel option in the connection form, plus an Account & Plan settings tab showing the version-lock state with Geekfun login and logout (logout clears the local entitlement cache so entitlements never outlive the account session). -
Requesty provider preset in AI settings (OpenAI compatible, base URL
https://router.requesty.ai/v1) -
Opper provider preset in AI settings (OpenAI compatible, base URL
https://api.opper.ai/v3/compat) -
API Route provider preset in AI settings (OpenAI compatible, base URL
https://global.api-route.com/v1) -
SSH tunnels for any connection — connect through a bastion, with multi-hop chains, reusable SSH profiles, an optional proxy hop, password or key auth (ED25519/RSA, optional passphrase), and trust-on-first-use host-key pinning plus an unpin command for when a server key changes.
-
Cross-database browsing without reconnecting — table, column, index, foreign-key, view, routine and trigger panels can inspect any database on the server; PostgreSQL and SQL Server route through a short-lived connection instead of asking you to reconnect.
-
Instant result-grid sorting — sorting runs in the frontend over the rows already returned, so clicking a header no longer re-runs the query; primitive columns sort consistently even when one column mixes numbers, dates, booleans and text.
-
Settings report what is happening — JRE/driver installs, provider sync, update checks and other settings actions show pending, success and failure inline with progress and retry, replacing silent no-ops.
🔧 Changed
-
JDBC connections are much faster (DuckDB "Test connection" above all) — measured per connect before: an Adoptium JRE update check (1.4-2.5 s, on every connect), two Maven Central metadata round trips (0.6-0.8 s each), a fresh bridge JVM (DuckDB maps a ~107 MB native library, ~1.4 s) and a new driver class loader per connection. Now: the JRE check is memoised for 6 hours, a cached driver JAR skips the Maven resolution on the Rust side (the Java side follows in the next bridge build), bridge downloads use a shared HTTP client with a bounded connect timeout instead of
reqwest::get(which had none), the bridge process is shared across connections (shared_launcher), and a connection releases only its own pool through thedisconnectRPC instead of killing the process. Verified withsrc-tauri/tests/duckdb_bridge_integration.rs: a warm connect went from ~4.3 s to 5.5 ms with a bridge build that also caches the driver class loader; with the currently released bridge the same test measures ~1.4 s per warm connect. -
Result grids use the available width — data columns stretch to fill spare space and the Actions column stays pinned to the right edge.
🐛 Fixed
-
Editing an AI provider now selects its exact provider preset before falling back to API compatibility.
-
DuckDB read-only mode is rejected by the released JDBC bridge — DuckDB refuses
Connection.setReadOnly(), and HikariCP calls it whenever its own read-only flag disagrees with the opened connection (it defaults to false), so a read-only URL failed withCan't change read-only status on connection level. The bridge now derives HikariCP's flag from the URL (ConnectionManager.isReadOnlyUrl); until a bridge build with that change ships, the connection form explains the limitation and offers retry as read-write. Verified against a patched bridge insrc-tauri/tests/duckdb_bridge_integration.rs. -
Untranslated keys could render in the UI — the new-connection menu displayed
pages.connections.newMenu.*because those strings were added under the wrong node of the locale files;src/__tests__/i18nKeys.test.tsnow scans every literalt('…')insrc/and fails when a key does not resolve inenUSorzhCN, so this class of regression is caught bynpm testinstead of by a screenshot. The same scan surfaced two latent gaps, both fixed:common.cancel(used by the device-replace dialog, now the existingcommon.buttons.cancel) and the missingzhCNvalue forcomponents.serverForm.placeholders.encryptionKey. -
DuckDB database files whose path contains
;were mis-parsed — the DuckDB JDBC driver splits its URL on;, sojdbc:duckdb:/path/semi;colon.duckdbfailed withInvalid URL entry(verified againstduckdb_jdbc1.5.6); such paths are now rejected with an explanation in the connection form and in the backend instead of surfacing a confusing driver error, and read-only mode is never silently dropped for them. -
DuckDB connections fail with "The following options were not recognized: ssl" (issue #158) — embedded/file-based engines (DuckDB, SQLite, SQLCipher, Access) have no SSL settings in the UI, so their stored ssl mode is just the
Preferdefault; the JDBC bridge now receives no ssl mode for such types instead of injectingssl=true, which DuckDB's driver rejects as an unknown option; the bridge's property mapper also stops blindly settingssl=truefor drivers without explicit SSL support (H2 and Firebird previously fell into that fallback). -
Deep-link sign-in on cold start — a
sqlkit://authlink that launches the app no longer drops the token: the payload is parked in a pending-auth slot during startup and the frontend pulls it viaconsume_pending_authonce mounted; running-instance links double-write the same slot, closing the startup window too. -
Complex queries across all four databases — PostgreSQL multi-statement batches keep their result sets and exotic types (arrays, JSON, ranges, geometry); MySQL and SQL Server keep sessions across requests and preserve later or empty result sets, row counts and errors; Oracle keeps PL/SQL definitions and slash delimiters and returns complete DDL. MySQL functional-index crashes and numeric/binary conversion, SQL Server duplicate columns and missing precision, and Oracle JSON, timestamp and object-type conversion are fixed.
-
Statements that start with a comment or end in RETURNING — these were classified as non-row statements, so the UI showed "N row(s) affected" and an empty grid; they now return rows.
-
Numeric column headers line up with their values — headers take the same alignment as their cells, the sort indicator stays after the column name, and sort-priority numbers appear only for multi-column sorts.
-
The DDL panel's close button no longer overlaps Copy — the header reserves the space the dialog close button occupies.
-
AI providers update instead of duplicating — adding an existing provider updates it in place, and a failed model sync reports the error instead of silently leaving the default model list.
-
DuckDB native-load warnings — the bridge JVM starts with native access enabled, so JDK 24+ no longer prints restricted-method warnings into connection error messages.
-
Themed default avatar — accounts without a picture get a deterministic gradient initial derived from the account name instead of the flat ink block.
👥 Contributors
- Anand Hegde (1 commit)
- Felix Wunderlich (1 commit)
- Thibault Jaigu (1 commit)
- blankll (51 commits)
- dennyho0917 (1 commit)
- seven (11 commits)
📋 Full commit history
Changes from v0.8.8 to v1.0.0
- 084b61f release: v1.0.0 (blankll, 7 minutes ago)
- 8aa85e2 docs(sql-test): add graduated sample query ladder (blankll, 18 minutes ago)
- ce42d63 fix(grid): align numeric headers with their values (blankll, 18 minutes ago)
- 4d0890a feat(settings): add status feedback and harden provider/JRE settings (blankll, 18 minutes ago)
- 2d7ecb2 docs: record standalone Rust regression test count (blankll, 2 hours ago)
- 13e6cd7 fix: resolve multi-database SQL stress regressions (blankll, 2 hours ago)
- fbc91d9 fix: audit fix (blankll, 2 days ago)
- de34e88 docs(readme): drop the WeChat group and Discord links (#186) (seven, 2 days ago)
- 81348e4 feat(entitlement): session-phase source of truth + paid-gate fixes (#184) (#185) (seven, 2 days ago)
- 41f2e46 docs: test insturctions (blankll, 2 days ago)
- e41085b feat: bridge metadata panels (#181) + cross-database metadata + connection form tabs & SSH journey (#182) (seven, 3 days ago)
- ab9c5ce fix(connections): gate SSH tunnel behind Ultimate and move SSL/TLS into Advanced Configuration (blankll, 5 days ago)
- b5b57ce fix(jdbc-bridge): grant native access to bridge JVM for DuckDB native loads (issue #176) (blankll, 8 days ago)
- 51298bc style(auth): import order and blank-line cleanup (blankll, 6 days ago)
- 42aa775 feat(auth): themed default avatar for accounts without a picture (blankll, 6 days ago)
- a926ed2 docs(ssh): move the tunnel test stack to event-search (#177) (seven, 6 days ago)
- 669ca39 fix(query-result): let data columns stretch when the grid has spare width (blankll, 9 days ago)
- 6ad46e2 fix(query-result): pin Actions column at the right edge even without overflow (blankll, 9 days ago)
- 5973097 fix(query-result): pin Actions column right and keep export buttons visible (blankll, 9 days ago)
- 39e758c fix(database): route commented and RETURNING statements to the row path (blankll, 9 days ago)
- c29474c style(ssh): eslint autofix for docker-compose-ssh-tunnel.yml (blankll, 9 days ago)
- a0a0d72 docs(ssh): tunnel testing guide for the pg/mysql/mssql/oracle stack (blankll, 9 days ago)
- 70b30a7 test(ssh): docker compose stack for SSH tunnel testing (pg/mysql/mssql/oracle) (blankll, 9 days ago)
- 1488539 test(ssh): isolate known_hosts tests via store-path injection (blankll, 9 days ago)
- eee5a97 fix(ssh): TOFU recovery command, sshTunnel passthrough, audit-fix lockfile (blankll, 9 days ago)
- 1bed588 fix(ssh): review fixes — profile round-trip, TOFU recovery, warning cleanup (blankll, 9 days ago)
- b77a6e4 fix(deps): gate system-configuration to macOS (macOS-only crate) (blankll, 10 days ago)
- be2dda5 style: eslint autofix (import order, template indent) (blankll, 10 days ago)
- d0b283c feat(ssh): full tunnel parity with dockit — chains, profiles, proxies, TOFU (blankll, 10 days ago)
- 86bded8 chore(lint): allow const-arrow top-level declarations per AGENTS.md (blankll, 10 days ago)
- e23ca32 fix(grid): consistent sorting for columns with mixed primitive types (blankll, 10 days ago)
- d572341 feat(settings): add API Route provider preset (dennyho0917, 10 days ago)
- 6b6fb95 feat(grid): client-side sorting for primitive result columns (blankll, 10 days ago)
- da18dc9 fix(connections): saved SSH connections are Ultimate-only to operate (blankll, 10 days ago)
- c78b01f feat(settings): add Opper provider preset (Felix Wunderlich, 11 days ago)
- 28aac83 chore(deps): bump data-studio-agent to v0.1.9 (blankll, 10 days ago)
- 0d93509 fix(upgrade): style the MCP poster's Ultimate lock badge (blankll, 11 days ago)
- 82df9a8 fix(sidebar): Queries is a Community page — drop the stray Pro dot (blankll, 11 days ago)
- 6235cb1 fix(entitlement): no dead Checking… — every terminal state lands somewhere (blankll, 11 days ago)
- fd7b953 feat(plan): show a Checking… state instead of Unknown before the first answer (blankll, 12 days ago)
- 323a17d test(ultimate): cover entitlement store, activation fatal path, seed semantics (blankll, 12 days ago)
- 01a7333 refactor: review fixes — await seed ordering, comment discipline, arrow style (blankll, 12 days ago)
- f47d683 fix(device): restore 5030 replace-picker flow and make retry tests timer-safe (blankll, 12 days ago)
- 45ef0d5 lint fix (blankll, 12 days ago)
- 0ec6026 feat(ultimate): session renewal hardening, AI gate coverage & login handoff (blankll, 12 days ago)
- 4d1364e fix(entitlement): unwrap the API response data envelope (blankll, 13 days ago)
- 4537c00 debug(entitlement): log the raw subscriptions API response in debug builds (blankll, 13 days ago)
- df8ed1b refactor(upgrade): unify logged-out CTAs to Log in + Register (blankll, 13 days ago)
- c622bc7 refactor(sidebar): replace the S logo with the user identity entry (blankll, 13 days ago)
- 7d42377 feat(account): user menu with login entry and entitlement state in the sidebar (blankll, 13 days ago)
📦 Downloads
See the assets below to download this version and install for your platform:
- macOS: Apple Silicon & Intel
- Windows: x64 installer
- Linux: AppImage / deb