{"slug": "v0-15-0-bring-your-connections-with-you-imports-nested-groups-and-encrypted", "title": "v0.15.0: Bring Your Connections With You — Imports, Nested Groups, and Encrypted Exports", "summary": "TabularisDB released v0.15.0, adding connection imports from five other SQL clients, nested folder groups, bulk actions, and encrypted exports. The update also introduces ENUM dropdowns for MySQL and PostgreSQL, fixes an EXPLAIN ANALYZE security loophole, and eliminates phantom console windows on Windows.", "body_md": "# v0.15.0: Bring Your Connections With You — Imports, Nested Groups, and Encrypted Exports\n\n**v0.15.0** follows [v0.14.0](/blog/v0140-stored-routines-connection-windows-destructive-query-guard) and has one clear theme: the Connections page stops being a flat list you retype things into and becomes something you can actually *manage*. You can now import your saved connections from five other SQL clients, file them into folders inside folders, select twenty of them and act on all twenty, and hand a teammate an export that is actually encrypted instead of a JSON full of plaintext passwords. Around that core: ENUM columns become dropdowns on both MySQL and PostgreSQL, the MCP safety layer closes an `EXPLAIN ANALYZE`\n\nloophole, and Windows users stop seeing phantom console windows. Fourteen external contributors land in this tag.\n\n## Import Connections From the Client You're Leaving\n\nThe biggest friction in trying a new database client is retyping every connection you've accumulated over the years. PR [#393](https://github.com/TabularisDB/tabularis/pull/393) removes it: a new **Import** dropup next to *Add Connection* reads saved connections from **DBeaver**, **Beekeeper Studio**, **TablePlus**, **DataGrip** and **Sequel Ace** — plus Tabularis's own JSON exports.\n\nEach source is parsed into a neutral envelope, and credentials are decrypted or read from the source client's keychain when you ask for them. Nothing is merged blindly: a **preview** lists every connection found, flags duplicates against what you already have (keep, replace, or skip — the duplicate's existing name shown so you know what you're replacing), and lets each new connection pick a target group — or create one on the fly, with defaults seeded from the source app's own folder structure.\n\nThe feature ships marked **beta**, with a visible badge and a direct link to [file an issue](https://github.com/TabularisDB/tabularis/issues) — parsing five other apps' formats across three platforms is exactly the kind of surface where real-world files will find edge cases. One already got fixed before release: Beekeeper payloads containing non-ASCII characters used to abort the whole import on a byte-boundary panic; they now parse or skip gracefully.\n\nVideo unavailable\n\n## Folders Inside Folders\n\nConnection groups were single-level since the day they shipped. PR [#405](https://github.com/TabularisDB/tabularis/pull/405), from [@p4pupro](https://github.com/p4pupro), makes them a real tree: groups can contain groups, to arbitrary depth, in both grid and list view.\n\nThe workflow got the attention the data model change deserved:\n\n**Create paths, not just names.** Typing`clients/acme/staging`\n\nin the New Group input creates the whole chain, reusing existing segments case-insensitively — the same`/`\n\nsyntax works in the inline subfolder input on each group header.**Drag to re-parent.** Dropping a group onto another group's header past one indent step moves it inside; dropping near the left edge keeps the plain reorder. A cycle guard refuses to move a folder into its own descendant, with a clear error rather than silent corruption.**Cascade delete.** Deleting a group now removes its entire subtree — nested groups and their connections included — instead of quietly orphaning children to the root.**Counts that add up.** A folder's badge sums direct*and*descendant connections, so a collapsed tree still tells you what's inside.\n\nExisting `connections.json`\n\nfiles keep working unchanged — `parent_id`\n\nis optional and defaults to root — and the export/import path preserves the hierarchy, demoting any dangling parent reference to root instead of rendering ghost trees.\n\nVideo unavailable\n\n## Select Many, Act Once\n\nWith imports and folders in place, you need a way to move things around in bulk. PR [#468](https://github.com/TabularisDB/tabularis/pull/468) adds **multi-select** to the connections list: a checkbox appears on hover, selected cards get a ring, and a pinned action bar shows the count with three actions — **Move to group** (a submenu built from the nested tree, plus *Ungrouped*), **Delete selected** behind a confirmation with the count, and clear.\n\n[@pokertour](https://github.com/pokertour) immediately wired the selection into the export flow in PR [#469](https://github.com/TabularisDB/tabularis/pull/469): the action bar gains an **Export** button that writes only the selected connections. The filtering happens *before* secrets are resolved, so credentials for unselected connections never leave the keychain, and the exported group list is pruned to just the ancestor chains the retained connections actually need.\n\n## Exports That Don't Leak Passwords\n\nUntil now, exporting connections wrote database, SSH and Kubernetes credentials in plaintext behind a single warning dialog. PR [#447](https://github.com/TabularisDB/tabularis/pull/447), also from [@pokertour](https://github.com/pokertour), replaces that with a proper export modal offering three modes:\n\n**Encrypted with a password**(the default) — the payload is encrypted with** AES-256-GCM**under an** Argon2id**-derived key.** Plain text without passwords**— secrets stripped entirely; fine for sharing a topology.** Plain text with all passwords**— the old behavior, with the warning now attached to the option that deserves it.\n\nImport detects the encrypted envelope and prompts for the password before merging. The decryption path is hardened too: the Argon2 parameters read from the envelope are bounded, so a malicious import file can't request unbounded memory or CPU. Plain exports from older versions import unchanged.\n\n## ENUM Columns Become Dropdowns — on Both MySQL and PostgreSQL\n\nEditing an ENUM cell used to mean remembering the allowed values and typing one exactly. Two PRs fix that end to end.\n\nOn MySQL, [@fhriz](https://github.com/fhriz) introspected the full `column_type`\n\nfrom `information_schema`\n\nin PR [#455](https://github.com/TabularisDB/tabularis/pull/455) (closes [#452](https://github.com/TabularisDB/tabularis/issues/452)), so a column shows as `enum('pending','approved','rejected')`\n\ninstead of a stripped `enum`\n\n— and both the inline grid editor and the row sidebar render a **dropdown** of the allowed values, with a NULL option on nullable columns. SET types get the same treatment, ENUM joins the column-type picker for new tables, and the sidebar now matches column metadata by *name* rather than position, fixing type mismatches when a query's SELECT order differs from the table's.\n\nPostgreSQL followed in PR [#471](https://github.com/TabularisDB/tabularis/pull/471) (fixes [#465](https://github.com/TabularisDB/tabularis/issues/465)), where the problem ran deeper: editing an enum cell failed outright with SQLSTATE 42804 — *column is of type X but expression is of type text* — because the bound value was never cast to the enum type. The binding layer now wraps enum parameters in a `CAST($N AS \"schema\".\"type\")`\n\nwith the qualified type name resolved from `pg_catalog`\n\n, mirroring the existing temporal/UUID coercions. And since column introspection now aggregates labels from `pg_enum`\n\ninto the same `enum('a','b',...)`\n\nshape MySQL uses, the dropdown editor kicks in for PostgreSQL automatically — grid and sidebar both.\n\n## MCP Safety: EXPLAIN ANALYZE Is Not a Read\n\nThe MCP safety layer classifies queries so read-only mode and the write-approval prompt can gate them. Its classifier mapped anything starting with `EXPLAIN`\n\nto the read-only path — but `EXPLAIN ANALYZE DELETE ...`\n\nactually *executes* the DELETE. An AI agent could therefore slip a write past both gates by wrapping it. Thanks to [@daniel-mertz](https://github.com/daniel-mertz) for reporting it; PR [#456](https://github.com/TabularisDB/tabularis/pull/456) makes classification option-aware: a plain `EXPLAIN`\n\nstays a read (it only plans), while the presence of the `ANALYZE`\n\noption classifies the wrapped statement as if it had been submitted directly. Matching is word-boundary aware — a table named `analyze_runs`\n\ndoesn't trip it — and unbalanced option lists fail closed.\n\nTwo more MCP improvements landed alongside it. [@erneztox](https://github.com/erneztox) fixed `list_connections`\n\nto serialize *all* of a connection's databases instead of collapsing them, and added a dedicated ** list_databases** tool in PR\n\n[#426](https://github.com/TabularisDB/tabularis/pull/426), complete with AI Activity filtering and documentation across all translated READMEs. And the repo now has a\n\n[security policy](https://github.com/TabularisDB/tabularis/blob/main/SECURITY.md)documenting how to report vulnerabilities privately — with MCP safety-layer bypasses under an untrusted-input threat model explicitly called in scope.\n\n## Windows Stops Flashing Terminals\n\nTwo independent contributors fixed the same class of Windows papercut in the same release. Launching a console executable from a GUI app on Windows allocates a visible console window — so an SSH tunnel popped an `ssh.exe`\n\nterminal, and starting a plugin popped another.\n\n[@kennelken](https://github.com/kennelken) fixed the SSH side in PR [#418](https://github.com/TabularisDB/tabularis/pull/418) (fixes [#413](https://github.com/TabularisDB/tabularis/issues/413)), spawning `ssh.exe`\n\nwith the `CREATE_NO_WINDOW`\n\nflag — and went further: SSH child processes used to outlive the app, so the fix also hooks Tauri's exit event to tear down every active tunnel when Tabularis closes. No more orphaned `ssh.exe`\n\nin Task Manager. [@erwin-lovecraft](https://github.com/erwin-lovecraft) applied the same `CREATE_NO_WINDOW`\n\ntreatment to plugin processes in PR [#451](https://github.com/TabularisDB/tabularis/pull/451), keeping the stdin/stdout pipe communication intact.\n\n## Grid and Editor Refinements\n\n**Column headers actually stay pinned.**[@thomaswasle](https://github.com/thomaswasle)fixed the result grid's sticky header in PR[#433](https://github.com/TabularisDB/tabularis/pull/433)— the old implementation fought the virtualizer with a counter-transform that desynced after ~40 rows of scrolling. The grid now uses spacer rows so`position: sticky`\n\nworks unconditionally, and a*Sticky column headers*toggle in Settings → Appearance keeps the old behavior available.**Hover a header, see the type.**[@benedettoraviotta](https://github.com/benedettoraviotta)added a DataGrip-style tooltip in PR[#436](https://github.com/TabularisDB/tabularis/pull/436)(closes[#435](https://github.com/TabularisDB/tabularis/issues/435)) showing`name: type`\n\n— e.g.`id: uuid`\n\n— on column header hover, read from metadata already in hand, so it costs no backend round-trip.**Set Empty knows its limits.** The quick action used to write a single space to*any*non-BLOB column, which strongly-typed columns rejected (`column is of type uuid but expression is of type text`\n\n). PR[#442](https://github.com/TabularisDB/tabularis/pull/442)gates it to textual columns, writes a real empty string, and swaps its icon for an eraser.**Summon IntelliSense on demand.**[@GabrielMalava](https://github.com/GabrielMalava)added a configurable shortcut in PR[#371](https://github.com/TabularisDB/tabularis/pull/371)to force the SQL editor's suggestion widget open (⌘I on macOS, Ctrl+I on Windows, Ctrl+Space on Linux) — remappable in Settings → Keyboard Shortcuts, working in both the editor and notebook cells — plus a new rebindable**refresh table** keybinding.**Disconnected means disconnected.** Disconnecting your last open connection didn't persist the change, so the next launch auto-reconnected and restored its tabs anyway. PR[#467](https://github.com/TabularisDB/tabularis/pull/467)persists the session at disconnect time; the saved tab file stays on disk, so*manually*reconnecting later still restores your queries.\n\n## Tabularis Speaks Tagalog\n\n[@chriscupas](https://github.com/chriscupas) contributed a complete **Tagalog** locale in PR [#457](https://github.com/TabularisDB/tabularis/pull/457) — 1,574 translated strings, a translated README, and browser-locale detection that maps Filipino (`fil`\n\n) systems to it automatically. That makes nine UI languages. [@pokertour](https://github.com/pokertour) also brought **French** back to parity in PR [#445](https://github.com/TabularisDB/tabularis/pull/445), adding the 66 keys that had accumulated in English only — triggers, result colors, timezone settings and more.\n\n**Finding Tabularis useful?** Star it on GitHub — it takes a second and helps more developers discover the project. Star on GitHub## Smaller Things\n\n**Typo-tolerant connection search**([@Davydhh](https://github.com/Davydhh), PR[#444](https://github.com/TabularisDB/tabularis/pull/444)) — the connection search joins the table filters and Quick Navigator on Fuse.js fuzzy matching, so`postgre prod`\n\nfinds what you meant, ranked by closeness.**SSH connections get a Settings tab**(PR[#441](https://github.com/TabularisDB/tabularis/pull/441)) — saved SSH tunnels are now manageable from Settings, not just from inside the connection-creation modal, and deleting one warns how many database connections still reference it.**No more autocorrect in filters**([@Necriso](https://github.com/Necriso), PRs[#432](https://github.com/TabularisDB/tabularis/pull/432)and[#437](https://github.com/TabularisDB/tabularis/pull/437)) — spellcheck, autocorrect and autocapitalize are off in the table toolbar and filter inputs, where they never belonged.**Visual fixes**([@math-krish](https://github.com/math-krish), PR[#461](https://github.com/TabularisDB/tabularis/pull/461)) — auto-pagination colors (fixes[#448](https://github.com/TabularisDB/tabularis/issues/448)), dropdown menu font (fixes[#446](https://github.com/TabularisDB/tabularis/issues/446)), and the save menu that appears on edit.**Modal consistency pass**(PR[#440](https://github.com/TabularisDB/tabularis/pull/440)) — the last`window.confirm()`\n\ncalls replaced with the app's ConfirmModal, Escape now closes the trigger/routine/explain modals like every other one, primary fields autofocus, and a batch of hardcoded strings moved to i18n across all locales.\n\n## Thanks\n\nFourteen external contributors land in v0.15.0 — the widest tag yet.\n\n** @pokertour** owns the export story: password-encrypted connection exports (\n\n[#447](https://github.com/TabularisDB/tabularis/pull/447)), export-only-the-selection (\n\n[#469](https://github.com/TabularisDB/tabularis/pull/469)), and the French translation catch-up (\n\n[#445](https://github.com/TabularisDB/tabularis/pull/445)).\n\n**built nested connection groups (**\n\n[@p4pupro](https://github.com/p4pupro)[#405](https://github.com/TabularisDB/tabularis/pull/405)).\n\n**translated the entire app into Tagalog (**\n\n[@chriscupas](https://github.com/chriscupas)[#457](https://github.com/TabularisDB/tabularis/pull/457)).\n\n** @fhriz** brought ENUM dropdown editing to MySQL (\n\n[#455](https://github.com/TabularisDB/tabularis/pull/455)).\n\n**silenced the Windows SSH console window and cleaned up tunnels on exit (**\n\n[@kennelken](https://github.com/kennelken)[#418](https://github.com/TabularisDB/tabularis/pull/418));\n\n**did the same for plugin processes (**\n\n[@erwin-lovecraft](https://github.com/erwin-lovecraft)[#451](https://github.com/TabularisDB/tabularis/pull/451)).\n\n**fixed the sticky result headers (**\n\n[@thomaswasle](https://github.com/thomaswasle)[#433](https://github.com/TabularisDB/tabularis/pull/433)),\n\n**added the column-type tooltip (**\n\n[@benedettoraviotta](https://github.com/benedettoraviotta)[#436](https://github.com/TabularisDB/tabularis/pull/436)), and\n\n**added the IntelliSense trigger shortcut (**\n\n[@GabrielMalava](https://github.com/GabrielMalava)[#371](https://github.com/TabularisDB/tabularis/pull/371)).\n\n** @erneztox** fixed multi-database serialization in MCP and added\n\n`list_databases`\n\n([#426](https://github.com/TabularisDB/tabularis/pull/426)).\n\n**made the connection search fuzzy (**\n\n[@Davydhh](https://github.com/Davydhh)[#444](https://github.com/TabularisDB/tabularis/pull/444)),\n\n**killed autocorrect in the filters (**\n\n[@Necriso](https://github.com/Necriso)[#432](https://github.com/TabularisDB/tabularis/pull/432),\n\n[#437](https://github.com/TabularisDB/tabularis/pull/437)), and\n\n**cleaned up pagination colors, the dropdown font and the save menu (**\n\n[@math-krish](https://github.com/math-krish)[#461](https://github.com/TabularisDB/tabularis/pull/461)). And thanks to\n\n**for responsibly reporting the**\n\n[@daniel-mertz](https://github.com/daniel-mertz)`EXPLAIN ANALYZE`\n\nsafety bypass.If you've been meaning to switch from DBeaver but dreaded retyping thirty connections, if your team shares connection files, or if your database leans on ENUMs — this is the upgrade.\n\n*v0.15.0 is available now. Update via the in-app updater, or download from the releases page.*", "url": "https://wpnews.pro/news/v0-15-0-bring-your-connections-with-you-imports-nested-groups-and-encrypted", "canonical_source": "https://tabularis.dev/blog/v0150-import-connections-nested-groups-encrypted-exports", "published_at": "2026-07-14 10:26:15.583622+00:00", "updated_at": "2026-07-14 10:26:17.312518+00:00", "lang": "en", "topics": ["developer-tools"], "entities": ["TabularisDB", "DBeaver", "Beekeeper Studio", "TablePlus", "DataGrip", "Sequel Ace"], "alternates": {"html": "https://wpnews.pro/news/v0-15-0-bring-your-connections-with-you-imports-nested-groups-and-encrypted", "markdown": "https://wpnews.pro/news/v0-15-0-bring-your-connections-with-you-imports-nested-groups-and-encrypted.md", "text": "https://wpnews.pro/news/v0-15-0-bring-your-connections-with-you-imports-nested-groups-and-encrypted.txt", "jsonld": "https://wpnews.pro/news/v0-15-0-bring-your-connections-with-you-imports-nested-groups-and-encrypted.jsonld"}}