Free Latest v0.13.114

SQL Workbench

A SQL tool that treats production as production.

Version 0.13.114, released 12 October 2026. All versions and checksums.

Every SQL tool can run a query. This one is built around the two things that actually go wrong: losing an afternoon to a grid that cannot cope with the result you asked for, and running a statement against the wrong server.

Connections carry an environment. A UAT connection asks before it writes. A production connection refuses until you unlock it, and says so in the tab, the banner and the badge — so the answer to "which server am I on?" is never more than a glance away.

Version history

0.13.114

Current 12 Oct 2026 f1f375ef

A server's list of databases answers at once, even while someone else creates, alters, drops or restores one; Copy pastes values as they are; and Messages holds only what the server sent, with the run's figures on a Statistics tab.

What changed in 0.13.114

0.13 · 2026-10-12

A server's list of databases answers at once, even while someone else creates, alters, drops or restores one; Copy pastes values as they are; and Messages holds only what the server sent, with the run's figures on a Statistics tab.

  • A server's databases list at once, whatever else is happening on it. Opening a server in the explorer, completing @alias/ or expanding @alias/App_* used to wait while another session created, dropped or restored a database, and for as long as an ALTER DATABASE stood waiting for its users to leave — often until it gave up. The list no longer waits: a database in the middle of such a change is left out until it is done, one that is not online is not offered, and a login that can open every database is not asked about each one. A login with narrower rights is still checked database by database.
  • Copy pastes the values as they are. Ctrl+C and Ctrl+Shift+C used to quote a value holding a quote, a tab or a line break the way a CSV file does, so a view's definition came back wrapped in quotes with every " doubled. They now copy tab-separated values unchanged, as Management Studio does. Quote copied values in Settings › Results brings the spreadsheet quoting back; Copy as… TSV still quotes.
  • Messages holds only what the server sent. PRINT, RAISERROR, row counts and errors — so with SET NOCOUNT ON a script can write its own output there and copy it out clean. The "Done — 2 result set(s), …" line, each set's rows and time, and when the run started and finished are on a new Statistics tab, in the terminal as well. Run summary in Messages in Settings › Results puts the line back under the messages.
  • Messages can be copied. Ctrl+C copies the selected message and Copy all on the list's menu copies every one, a line each. Selecting a message still shows its line in the editor but leaves the keyboard on the list; a double-click or Enter goes to the line.
PlatformFormatSizeSHA-256
Linux x64 tar.gz 27 MB b09c71224cc32cc2ab13cb2547a3480fe87c1ae8c682356106494850280c84e1 Download
Windows x64 zip 29.9 MB bc8697c7bb1639de6e5dbd08c0941244be6bfc9d1943f6360c09ca297331c889 Download

0.12.109

11 Oct 2026 cf0ddd41

The workbench runs in a terminal as swtui; PostgreSQL answers what depends on what; and the knowledge pack editor writes archives, adds rules and relations and tests its dictionary queries.

What changed in 0.12.109

0.12 · 2026-10-11

The workbench runs in a terminal as swtui; PostgreSQL answers what depends on what; and the knowledge pack editor writes archives, adds rules and relations and tests its dictionary queries.

  • A terminal front-end, swtui. The workbench runs in a terminal over SSH or on a server with no desktop: the same explorer, query tabs and compare tabs as the desktop, drawn in text. F2 adds a source, F3 opens a query on the selected source, F4 a compare, F5 or Ctrl+E runs or compares, F6 moves between the explorer and the tabs, Shift+F10 or the Menu key opens the explorer's menu for the selected row (new query, compare, refresh, remove, the script-as entries, diff with a counterpart), and the other tabs the desktop has say so until they get a terminal view of their own.

  • PostgreSQL shows what depends on what. The inspector's dependencies, "Show dependencies" in the explorer and the dependency order of a compare now work on PostgreSQL, read from the server's own catalogue: views over tables and views, materialized views, trigger functions, sequences a table owns, foreign keys and SQL-standard function bodies. A plpgsql body is not read, since the server never parses it, and a folder says it cannot answer.

  • "Select the first 1000 rows" limits on every engine. The explorer offered SQL Server's SELECT TOP 1000 on PostgreSQL, MySQL and SQLite tables, and the statement it opened there had no limit at all. It now ends in LIMIT 1000 on those three, SQL Server keeps its TOP, and the entry has one name everywhere.

  • A MySQL table's AUTO_INCREMENT counter is no longer part of its script. Two tables with one definition and different row histories compared unequal, and a folder under version control changed with every insert. Export no longer writes the counter and compare ignores it where a folder or dump still carries it; a column's own AUTO_INCREMENT stays.

  • Completion on one letter stays readable. A connected PostgreSQL offers about 2,700 functions, and Ctrl+Space on "p" listed 475 of them. A word shorter than three letters now gets at most a hundred functions — the word itself, the dialect's own, then the shortest names. Three letters or more still offer every function that fits; keywords, snippets and the schema's names are never cut.

  • The knowledge pack editor saves archives and builds packs. A pack kept as one .knpack can be saved, written beside the original and swapped in only once complete. Tables, rules, relations and dictionary queries can be added and removed; a rule and a relation are asked for in a form, and a relation's tables and columns can be corrected, with the open database's names offered as you type. Nothing is written unless the pack still loads.

  • Dictionary queries show what they produce. Running one lists the tables and columns the pack would know from it, with description, unit and code source, and "Check the code queries" runs each column's code query the way a reader would and marks what came back — codes, none, the engine's refusal, a write it held back, or a parameter with no default.

  • Safe mode asks SQLite which statements write. On a guarded environment a SQLite query is also checked by SQLite itself, so a write behind a reading first word (WITH … DELETE) is held. swcli --help describes SQL Server, PostgreSQL, MySQL and SQLite rather than SQL Server alone.

  • A target that changes while its plan is made is compared once more. SQL Server refuses to script against a database whose catalogue changed after the comparison — a login created anywhere on the server is enough. Generate script and sync now compare again once on that refusal and explain a second one in plain words; running an existing plan says it has to be made again.

  • A SQLite file is no longer "unreachable". A query tab on a sqlite:// file, or a compare with one as a side, used to stop at "Server unreachable": the two-second reachability check was handed the connection string alone and read it as a SQL Server address. The check now knows the engine, so a file is reachable when it exists.

  • A password typed without :// is hidden like any other. An address such as app:secret@host or postgres:/app:secret@host came back verbatim in labels and in the session file. Such passwords are now scrubbed too, half-typed ones included; drive letters and real paths are left alone.

PlatformFormatSizeSHA-256
Linux x64 tar.gz 27 MB f0fe201c4e264cc9e2986d9eb1791dc3ff30b972f900256f7a33afd1e238a631 Download
Windows x64 zip 29.9 MB 33143c2fa6e1c2faa096846ee34ba3b94003fe766ec505dd8f84f77f5edd7f98 Download

0.11.95

1 Oct 2026 9301a841

PostgreSQL and MySQL can now be synced, schema and rows alike; table data can be written as JSON, CSV or TSV; and completion offers what the connected database has installed.

What changed in 0.11.95

0.11 · 2026-10-01

PostgreSQL and MySQL can now be synced, schema and rows alike; table data can be written as JSON, CSV or TSV; and completion offers what the connected database has installed.

  • PostgreSQL databases can be made to match. Sync, Dry run and Generate deploy script are no longer greyed out for a PostgreSQL pair: the tool writes the DDL itself — ALTER TABLE column by column, CREATE OR REPLACE for a view whose columns stand still, drop and create where nothing gentler exists — everything that goes before everything that arrives, each in dependency order. A folder target is written as the mirror it is.

  • MySQL databases can be made to match, and you are told first that it cannot be undone. plan, script and sync reach a MySQL target: ALTER TABLE key by key, views replaced, routines, triggers and events dropped and recreated, tables in foreign-key order. MySQL commits each DDL statement as it runs, so every plan, dry run, confirmation and generated script says so before anything starts, and --transactional is refused with the reason rather than quietly ignored.

  • Data compare and sync on PostgreSQL and MySQL. A table's rows are compared and synced on both engines, from a database or from a folder of their rows, so a folder exported from either no longer comes back with every lookup table empty. A row that already matches is not written again — no trigger fires and no timestamp column moves for it — so a sync that finds nothing to do touches nothing.

  • Table data as JSON, CSV or TSV. Data export and sync can write a table's rows as a JSON file naming the table, its key and its column types (--data-format json), as bare JSON rows, or as CSV or TSV, one file per table in {Schema}/Data/; a .json, .csv or .tsv destination takes every table in one file. Such a file is a data side of its own — swcli data compare ./seed.json @uat/AppDb — and lists its own tables when nothing else names any. SqlDeploy's two layouts read as SqlDeploy reads them: a file named dbo.Config.json, and one whose rows each say their Table. A file that carries no types is read as the other side's, so "2026-01-01 08:00" equals a datetime2, and takes its key from there. The data compare tab has an Export as choice, query results save as a JSON data file, and Import data opens one with its tables as the sheets. Reading these files back is SQL Server's for now.

  • Completion knows what your database has installed. A PostgreSQL with an extension offers that extension's functions, with the argument list and comment the server keeps; MySQL and SQLite offer the keywords and functions their own catalogues list. And on all three, your tables and columns now come before the language's keywords in the list, as they always did on SQL Server.

  • A deployment that was never scripted is no longer reported as done. With several deployments in one process, the engine could refuse to script one of them, and the run went on to publish only the pre- and post-deployment scripts and call it a success. The refusal is now a blocking warning on the plan, with the engine's own message.

  • A SQLite alias with a database beside it opens no other file. @lite/other used to open a file called other in the working folder; it now refuses, naming the alias. An unknown --engine name is refused when it is typed rather than later.

  • swcli help prints the example a topic is written around, as the Help tab already did.

PlatformFormatSizeSHA-256
Linux x64 tar.gz 26.7 MB 9993d11e88c79a1ece511e303934c210bdc50765eaef70b83895bc4b4d9e7d44 Download
Windows x64 zip 29.6 MB b72fa9dd6442b2b30b6936fdd76527ea2d7a9c44bd178e77af266557aa45eb8a Download

0.10.89

29 Sep 2026 7e89896c

PostgreSQL, MySQL and SQLite join SQL Server, to browse and to query, with their own documentation and primers offline and the engine itself checking your SQL as you type.

What changed in 0.10.89

0.10 · 2026-09-29

PostgreSQL, MySQL and SQLite join SQL Server, to browse and to query, with their own documentation and primers offline and the engine itself checking your SQL as you type.

  • PostgreSQL, to browse and to query. Register a connection with alias add pg "Host=myserver;Username=app;Database=AppDb" --engine postgres --database AppDb, or write the address as postgres://app@myserver/AppDb, and the explorer reads the database: schemas, tables with their constraints, indexes and triggers, views and materialized views, functions and procedures, and sequences, each as the server's own DDL with every name schema-qualified. A query tab runs scripts against it, a notice raised mid-batch prints where it happened, and an error points at the line it is on. Databases can be listed and a server can be tested (alias test). Comparing, deploying and data sync stay SQL Server's for now, and the actions that need them are greyed out with a reason.

  • MySQL, to browse and to query. The same as Postgres, through alias add my "Server=myserver;User ID=app;Database=AppDb" --engine mysql --database AppDb or mysql://app@myserver/AppDb: the explorer reads the database's tables (keys and indexes inside them, as MySQL writes them), views, procedures, functions, triggers and scheduled events, each as the statement the server itself prints. A query tab runs scripts against it, DELIMITER $$ in a script does what the mysql client does with it, and a failed statement carries the engine's own error number. A database here is what a schema is elsewhere, so the explorer groups under the database's name.

  • SQLite, to browse and to query. A database is a file, so there is nothing to reach: alias add lite "Data Source=/home/me/app.db" --engine sqlite, or write it as sqlite:///home/me/app.db. The explorer reads the tables — with their indexes and triggers, exactly as they were written, since SQLite keeps the statement it was given — and the views, under main. A query tab runs scripts against it, and a CREATE TRIGGER … BEGIN … END; counts as the one statement it is. A file that is not there reads as not there, rather than as a server that will not answer.

  • A primer for the engine you are on. F1 on a PostgreSQL or MySQL tab now answers the question a developer actually asks — how a CTE is spelled here, what this engine's upsert is, how temporary tables and indexes are written, what happens to a name you did not quote — in about forty topics per engine, each with a worked example. They are written for someone who knows SQL and not this engine, they say what the engine does not have as plainly as what it does, and every example in them is run against a real server by the build, so an example that stopped working cannot ship. On PostgreSQL they sit in front of the statement pages, so the grammar is still one search away.

  • MySQL explains itself out of your own server. MySQL's manual is not ours to ship, but a stock MySQL server carries it: the tables behind its own HELP statement, around 700 topics. Where the connection in front of you has them, they are read once and answer beside the primer — held in memory, written to no file — and the Help tab says which answer came from where. A server whose help tables were never filled is not an error; you simply keep what the build carries.

  • A folder of scripts reads back on the new engines. PostgreSQL, MySQL and SQLite could write a database out to a folder but never read one in, so everything standing on a folder was SQL Server's alone. Now a clean folder or a dump file reads back on all three: comparing a PostgreSQL database against a checkout is a comparison rather than a refusal, a table keeps the indexes and constraints written under it, and each object keeps the file's own text, comments and terminators included. A file whose statements name nothing is reported rather than quietly skipped, because next time it would read as a deletion.

  • Knowledge packs can be read and corrected inside the product. A pack is a folder of hand-written JSON, and a real one runs to a hundred and forty files. Settings now offers Edit beside every pack that loaded: the tree of files it is written in, an editor for the one picked, and a save that writes only the file it changed, so the names and groupings its author chose survive. Before the disk sees anything the whole pack is loaded as it would be afterwards, and a change that would not load leaves its reasons on screen and the file untouched. With a database of the pack's engine open, Check marks every table and column the pack names and the database has not, and Check codes reads what a column actually holds — one read-only SELECT DISTINCT at a time.

  • PostgreSQL's own documentation ships with it too. F1 on a Postgres tab explains a statement in PostgreSQL's own words, with the syntax it publishes and what each parameter means: 185 statements, 87 KiB, offline. Its functions are documented as tables rather than pages and are not in the pack yet, so those still show only their names.

  • SQLite's own documentation ships with it. F1 and hover explain a SQLite statement, function or pragma out of SQLite's own words — 227 entries, 18 KiB, offline — and Ctrl+Space shows a function's signature and what it does. SQLite's documentation is public domain, which is why this one could be included; the importer refuses any documentation whose licence does not say as much.

  • The engine checks your SQL, without running it. A moment after the editor's own squiggles, the engine itself is asked about each statement — by preparing it, which parses it and resolves every name and column and executes nothing. So select * form customers is marked under form, and a column or table that is not there is caught with the engine's own words, on PostgreSQL, MySQL and SQLite. SQLite answers in microseconds because it is built into the application. A statement MySQL will not prepare is left unmarked rather than called wrong, the check never runs on the connection your tab is using — so an open transaction of yours is never disturbed — and typing on cancels a check in flight.

  • The editor knows what it is looking at on the new engines. A literal or comment left open, a bracket that does not match, and a table the database does not have are all marked where they stand — and a name that is in the database is coloured as one. Ctrl+Space offers a table's columns behind its alias, the knowledge packs' codes and column meanings work, Select and Insert templates are offered from the explorer, and "execute the statement under the caret" follows the engine's own idea of a statement, DELIMITER $$ bodies and SQLite triggers included. Writing a result back stays SQL Server's: telling which table a column came from needs a parser these engines do not ship, and the editor says so rather than guessing.

  • A name that is a reserved word is quoted, on every engine. The keyword lists the new engines shipped were written by hand and fell short of what the engines actually reserve — 70 words for PostgreSQL, 96 for MySQL, 17 for SQLite — so a table called authorization or a column called dual was scripted bare and the engine refused it. Each list now comes from the engine itself and is checked against it.

  • Language help answers as the engine in front of you. The Help tab used to show T-SQL whatever the tab was connected to. F1 on a Postgres tab now opens Postgres's own reference, and an engine this build carries nothing for says so plainly rather than explaining another engine's language.

  • The connection editor knows which engine it is writing for. Connections gains an Engine picker as soon as the build can open more than one, and everything on the page follows it: the sign-on kinds it offers, the keywords it writes, and whether there is an Encrypt option at all. Test connects through that engine's own driver and says which engine and version answered.

PlatformFormatSizeSHA-256
Linux x64 tar.gz 26.6 MB ece6662888a134f85a541b98d620ec3d583100c287f1c81c2db98219cef0c8ec Download
Windows x64 zip 29.5 MB 72c151105634b314177be9baee378753744f805eb4af0af7b4617bbe689194ca Download

0.10.87

29 Sep 2026 56c63a3b

PostgreSQL, MySQL and SQLite join SQL Server, to browse and to query, with their own documentation and primers offline and the engine itself checking your SQL as you type.

What changed in 0.10.87

0.10 · 2026-09-29

PostgreSQL, MySQL and SQLite join SQL Server, to browse and to query, with their own documentation and primers offline and the engine itself checking your SQL as you type.

  • PostgreSQL, to browse and to query. Register a connection with alias add pg "Host=myserver;Username=app;Database=AppDb" --engine postgres --database AppDb, or write the address as postgres://app@myserver/AppDb, and the explorer reads the database: schemas, tables with their constraints, indexes and triggers, views and materialized views, functions and procedures, and sequences, each as the server's own DDL with every name schema-qualified. A query tab runs scripts against it, a notice raised mid-batch prints where it happened, and an error points at the line it is on. Databases can be listed and a server can be tested (alias test). Comparing, deploying and data sync stay SQL Server's for now, and the actions that need them are greyed out with a reason.

  • MySQL, to browse and to query. The same as Postgres, through alias add my "Server=myserver;User ID=app;Database=AppDb" --engine mysql --database AppDb or mysql://app@myserver/AppDb: the explorer reads the database's tables (keys and indexes inside them, as MySQL writes them), views, procedures, functions, triggers and scheduled events, each as the statement the server itself prints. A query tab runs scripts against it, DELIMITER $$ in a script does what the mysql client does with it, and a failed statement carries the engine's own error number. A database here is what a schema is elsewhere, so the explorer groups under the database's name.

  • SQLite, to browse and to query. A database is a file, so there is nothing to reach: alias add lite "Data Source=/home/me/app.db" --engine sqlite, or write it as sqlite:///home/me/app.db. The explorer reads the tables — with their indexes and triggers, exactly as they were written, since SQLite keeps the statement it was given — and the views, under main. A query tab runs scripts against it, and a CREATE TRIGGER … BEGIN … END; counts as the one statement it is. A file that is not there reads as not there, rather than as a server that will not answer.

  • A primer for the engine you are on. F1 on a PostgreSQL or MySQL tab now answers the question a developer actually asks — how a CTE is spelled here, what this engine's upsert is, how temporary tables and indexes are written, what happens to a name you did not quote — in about forty topics per engine, each with a worked example. They are written for someone who knows SQL and not this engine, they say what the engine does not have as plainly as what it does, and every example in them is run against a real server by the build, so an example that stopped working cannot ship. On PostgreSQL they sit in front of the statement pages, so the grammar is still one search away.

  • MySQL explains itself out of your own server. MySQL's manual is not ours to ship, but a stock MySQL server carries it: the tables behind its own HELP statement, around 700 topics. Where the connection in front of you has them, they are read once and answer beside the primer — held in memory, written to no file — and the Help tab says which answer came from where. A server whose help tables were never filled is not an error; you simply keep what the build carries.

  • A folder of scripts reads back on the new engines. PostgreSQL, MySQL and SQLite could write a database out to a folder but never read one in, so everything standing on a folder was SQL Server's alone. Now a clean folder or a dump file reads back on all three: comparing a PostgreSQL database against a checkout is a comparison rather than a refusal, a table keeps the indexes and constraints written under it, and each object keeps the file's own text, comments and terminators included. A file whose statements name nothing is reported rather than quietly skipped, because next time it would read as a deletion.

  • Knowledge packs can be read and corrected inside the product. A pack is a folder of hand-written JSON, and a real one runs to a hundred and forty files. Settings now offers Edit beside every pack that loaded: the tree of files it is written in, an editor for the one picked, and a save that writes only the file it changed, so the names and groupings its author chose survive. Before the disk sees anything the whole pack is loaded as it would be afterwards, and a change that would not load leaves its reasons on screen and the file untouched. With a database of the pack's engine open, Check marks every table and column the pack names and the database has not, and Check codes reads what a column actually holds — one read-only SELECT DISTINCT at a time.

  • PostgreSQL's own documentation ships with it too. F1 on a Postgres tab explains a statement in PostgreSQL's own words, with the syntax it publishes and what each parameter means: 185 statements, 87 KiB, offline. Its functions are documented as tables rather than pages and are not in the pack yet, so those still show only their names.

  • SQLite's own documentation ships with it. F1 and hover explain a SQLite statement, function or pragma out of SQLite's own words — 227 entries, 18 KiB, offline — and Ctrl+Space shows a function's signature and what it does. SQLite's documentation is public domain, which is why this one could be included; the importer refuses any documentation whose licence does not say as much.

  • The engine checks your SQL, without running it. A moment after the editor's own squiggles, the engine itself is asked about each statement — by preparing it, which parses it and resolves every name and column and executes nothing. So select * form customers is marked under form, and a column or table that is not there is caught with the engine's own words, on PostgreSQL, MySQL and SQLite. SQLite answers in microseconds because it is built into the application. A statement MySQL will not prepare is left unmarked rather than called wrong, the check never runs on the connection your tab is using — so an open transaction of yours is never disturbed — and typing on cancels a check in flight.

  • The editor knows what it is looking at on the new engines. A literal or comment left open, a bracket that does not match, and a table the database does not have are all marked where they stand — and a name that is in the database is coloured as one. Ctrl+Space offers a table's columns behind its alias, the knowledge packs' codes and column meanings work, Select and Insert templates are offered from the explorer, and "execute the statement under the caret" follows the engine's own idea of a statement, DELIMITER $$ bodies and SQLite triggers included. Writing a result back stays SQL Server's: telling which table a column came from needs a parser these engines do not ship, and the editor says so rather than guessing.

  • A name that is a reserved word is quoted, on every engine. The keyword lists the new engines shipped were written by hand and fell short of what the engines actually reserve — 70 words for PostgreSQL, 96 for MySQL, 17 for SQLite — so a table called authorization or a column called dual was scripted bare and the engine refused it. Each list now comes from the engine itself and is checked against it.

  • Language help answers as the engine in front of you. The Help tab used to show T-SQL whatever the tab was connected to. F1 on a Postgres tab now opens Postgres's own reference, and an engine this build carries nothing for says so plainly rather than explaining another engine's language.

  • The connection editor knows which engine it is writing for. Connections gains an Engine picker as soon as the build can open more than one, and everything on the page follows it: the sign-on kinds it offers, the keywords it writes, and whether there is an Encrypt option at all. Test connects through that engine's own driver and says which engine and version answered.

PlatformFormatSizeSHA-256
Linux x64 tar.gz 26.5 MB 62173067d2bde134cfa7ea0b9dca4b877e018d1381d4ed6b47fd31f8ffb76725 Download
Windows x64 zip 29.4 MB af90246a9e3f5b09f27ae24441e454808b92a5150f05747dd8cf146bf6b33cb1 Download

0.9.85

24 Sep 2026 1319686b

A query tab shows at a glance whether it is connected, reconnects when you come back to it, and a coded column offers its codes as you type its value.

What changed in 0.9.85

0.9 · 2026-09-24

A query tab shows at a glance whether it is connected, reconnects when you come back to it, and a coded column offers its codes as you type its value.

  • A database icon beside the connection box says where the tab stands. Grey when it is not connected, green when it is, blue while it is connecting or the box names somewhere the session is not yet, red when the last connect failed — with the details in its tip.

  • Tabs reconnect when you come back to them. A tab that was connected when the application closed connects again the first time you look at it after a restart; tabs you do not open stay closed, and one that cannot connect shows red.

  • Changing the connection box changes the connection. On a connected tab, the box takes effect when you press Enter or leave it: another database on the same server is switched to on the same session — open transactions and temp tables stay — and anything else reconnects. Execute applies a change first. With a transaction open, a change of server waits for you to commit, roll back or press Connect. Shift+Tab at the very start of the script, with nothing left to outdent, goes up to the box, and Down from the box or any button above the script goes back into it.

  • A relation a pack describes can hold for some rows only. A pack's relation may say "when": { "SubjectKind": 1 }: the type column beside a key that points at a different table for every type. The join and the ON clause the editor writes carry it — on r.SubjectId = i.Id and r.SubjectKind = 1 — and the inspector and swcli relations show it. Numbers are written as numbers, text as a string.

  • A coded column offers its codes as you type its value. where Status = opens the column's code list as soon as the space is typed, and Ctrl+Space there does the same with the first code chosen. It used to stay shut in a new tab until something had been hovered, and for a statement still waiting for its value, which is exactly when it is wanted.

PlatformFormatSizeSHA-256
Linux x64 tar.gz 24.6 MB e906596041c1054ac40901fc7d0d78ef2c3762fc17a833b8797f6b22377d3bbd Download
Windows x64 zip 27.1 MB 1f18835d57c3fa849a8ae9c9982102d9a7fe85d29309423363073ecf4ed4d05e Download

0.8.83

24 Sep 2026 fc4e1b17

Knowledge packs install from inside the application, and every result of a script shows its rows.

What changed in 0.8.83

0.8 · 2026-09-23

Knowledge packs install from inside the application, and every result of a script shows its rows.

  • Install a knowledge pack from the application. Settings → Knowledge packs lists every pack it can see — what it holds, where it came from, and why it was refused where it was — and installs one from a .knpack, a zip or a folder. A pack that cannot be read is refused before anything is copied, one of the same name asks before it is replaced, and Remove takes away one you installed. A pack shipped with the application, or named in the configuration, is listed but left alone. Changes apply without a restart.

  • Every result of a script shows its rows. A script whose statements all returned at once — select 'a' twice, in one batch — showed the first result and an empty second one. Each result set is now put on screen as it finishes, and the run's last word on them waits for the window rather than racing it.

PlatformFormatSizeSHA-256
Linux x64 tar.gz 24.6 MB 6fe7c8a6368e28648bea1841bdf1b7da46a15ab1af7b57b8c8b77faf764bae76 Download
Windows x64 zip 27.1 MB 90f678e8d65046f436a632a0481892be4dd35ab861e71ffc49c772880a8b2458 Download

0.8.80

23 Sep 2026 b31c40ee

Knowledge packs install from inside the application, and every result of a script shows its rows.

What changed in 0.8.80

0.8 · 2026-09-23

Knowledge packs install from inside the application, and every result of a script shows its rows.

  • Install a knowledge pack from the application. Settings → Knowledge packs lists every pack it can see — what it holds, where it came from, and why it was refused where it was — and installs one from a .knpack, a zip or a folder. A pack that cannot be read is refused before anything is copied, one of the same name asks before it is replaced, and Remove takes away one you installed. A pack shipped with the application, or named in the configuration, is listed but left alone. Changes apply without a restart.

  • Every result of a script shows its rows. A script whose statements all returned at once — select 'a' twice, in one batch — showed the first result and an empty second one. Each result set is now put on screen as it finishes, and the run's last word on them waits for the window rather than racing it.

PlatformFormatSizeSHA-256
Linux x64 tar.gz 24.5 MB 23641a6fa2e93e50c0a39a5277d7a3373eafea2159f7950830ce146049e90df7 Download
Windows x64 zip 27.1 MB 2cc128065b4d80bf0971754fe45f2bbcc113ace5df4f478ebe4b7a367aa215d9 Download

0.7.79

22 Sep 2026 5c0d44de

Workspaces group your tabs, each can have its own folders for scripts, exports and reports, and Execute without a connection asks for one.

What changed in 0.7.79

0.7 · 2026-09-22

Workspaces group your tabs, each can have its own folders for scripts, exports and reports, and Execute without a connection asks for one.

  • Workspaces. Open tabs can be kept in workspaces, the way a desktop keeps windows: Alt+PgDn goes to the next one, Alt+PgUp back, and Alt+Shift+PgUp/PgDn takes the tab in front along. The workspaces are chips in the middle of the top bar, "1", "2" and so on, with always one empty one after the last in use; an empty one you have not named goes away once you leave it. Right-click one to name it, give it a colour, keep it when empty, move it, close all its tabs, delete it, or open its settings. An empty workspace shows where to start — New query, Open .sql file and the rest — as buttons beside their keys. The explorer is shared; each workspace keeps its own tabs, and they come back where they were at the next start.
  • Execute without a connection asks for one. Ctrl+E or F5 in a tab with nothing to run against puts the cursor in the connection box and says what is missing. Enter connects and takes you back to the editor, or stays and says why it could not; Escape goes back without connecting.
  • Folders. Settings → Workspaces and folders says where the dialogs start for SQL scripts, exports and reports, and a workspace can have folders of its own: set Settings for to This workspace. A script opened from a file is saved next to it.
PlatformFormatSizeSHA-256
Linux x64 tar.gz 24.5 MB 78c4f881f7309510b3676d40b219e09e5a20aeea22983b383bc3021824c57f7e Download
Windows x64 zip 27.1 MB e9044dd1e7c0fc1544cc54958889550f8b2fda274f19a464fc3f110da7b7c92c Download

0.6.77

22 Sep 2026 ebbd4f39

The editor writes columns and joins for you, quick reports turn a script into an Excel workbook, and relations, packs and a settings page in sections make a database explain itself.

What changed in 0.6.77

0.6 · 2026-09-22

The editor writes columns and joins for you, quick reports turn a script into an Excel workbook, and relations, packs and a settings page in sections make a database explain itself.

  • Quick reports. A script with a -- ##QR: line is a report: Execute report (beside Execute, in the editor's menu and in the palette) runs it with every row kept and writes an Excel workbook, a sheet per result set, laid out the way QuickReport laid them out. -- ##QR: Name = sales names the file, AddDate = true dates it, FreezeColumns = 2 and Format Amount = #,##0.000 shape the sheets, and -- ##QR: PageName = Summary names the next result set's sheet. A first column called ##PAGENAME names its sheet from the data instead, and is not written; a script that uses one is a report without any ##QR.

  • Settings in sections. The Settings page lists its sections on the left — General, Editor, Query and results, Explorer, Storage, Notifications, Keyboard shortcuts — and shows one at a time, instead of one page that scrolled for a dozen screens.

  • Alt+Space on a selection is about the selection. With text selected, the list starts with Format selection and Execute selection, then what applies at the caret. The editor's right-click menu has Format document (or Format selection) too, and Execute selection while something is selected; the Ctrl+Space list shows a column the way it will be written, o.Total under its table's alias.

  • The code actions ask instead of listing everything. The context menu and Alt+Space now show one line per kind of thing — Expand * …, one Add columns …, one Add a join … — so a sixty-column table with eight relations is two lines. The join dialog starts with the related tables: type to narrow them, Up and Down to pick. Expand and Add columns open a checklist of the columns with their type and what the knowledge packs call them: type to filter, Space to tick, Ctrl+A for all or none, choose one line, one per line or a wrap width, and watch the text in the preview. Join asks inner, left, right or full outer — left already chosen where the referencing column may be null — lets you change the alias (it tells you when the statement already uses it), and picks between several relations to the same table, each named with its foreign key and marked where a pack describes it. Where a join could take more than one ON, Write the ON clause … asks which. Everything works from the keyboard, OK is one undo step and leaves the caret after what was written, and Escape changes nothing.

  • A joined table gets an alias that reads like it. Add join strips the prefix a system puts on every table and takes the initials of the words in the name, so app_customeraccountlink is joined as cal rather than a, a2, a3. The words of a name written all in lower case are found from the database's own table and column names, with nothing to configure; a knowledge pack can add prefixes and words of its own, and so can you in the editor settings. An alias the script already gives the table is used again, and a reserved word is never proposed. Join aliases on the Settings page brings back the first letter, or writes the whole name.

  • You choose how the editor lays out SQL. A sixty-column Expand * no longer lands on one line nobody reads: lists the editor writes now wrap at 100 columns, aligned under the first column wherever in the line the star stood, with the editor's own tabs or spaces. The new Formatting group on the Settings page switches that to one line or one item per line, sets the width, and puts the comma — or the AND between the pairs of a join — at the end of a line or the start of the next. The same group sets what Format Document does: keyword casing, indentation, aligned clause bodies, which clauses start a new line, one select item or WHERE predicate per line, AS on its own line, and semicolons. Leave them alone and it formats exactly as before; comparing scripts is not affected.

  • The editor writes the columns and the join for you. Alt+Space (or Ctrl+., where the desktop keeps Alt+Space for itself) and the editor's context menu offer what applies at the caret. Expand * writes out the columns of the tables the statement reads, under the aliases it uses — select * from Invoice i becomes select i.Id, i.Status, … — and brackets a name only where it needs them. Qualify gives a bare column its alias, Add column lists the ones not selected yet, and Add join offers one entry per relation to a table not yet in the query and writes the whole join, with an alias that is free and every pair of a composite key. After join Customer c, after a bare ON, and in a WHERE, it offers the predicate between tables already there. A relation a knowledge pack describes is offered too and says so; where nothing relates two tables, nothing is offered rather than guessed. Each is one undo step, a right-click acts where you clicked, and none of it reads the database while you type.

  • Delete the star to see the columns. With the select list empty, Ctrl+Space — or the first letters of a name — offers the columns of the tables in the FROM clause ahead of everything else, each once and with its table and type beside it. A statement with a hole in it no longer has to parse for the editor to know what it reads.

  • Alt+F1 opens a page, and a column has one of its own. The inspector opens on what an object is: its description, its columns, and the relations it takes part in, in both directions — Enter on one opens the table at the other end. The script waits behind Show script and the dependency lists behind Show dependencies (also in the explorer's menu), so opening the page reads nothing it was not asked for; it used to read the database's whole dependency graph every time. Alt+F1 on a column opens that column's page: its type, its description and unit, its code list in full, its relations, and a way back to the table. A coded column explains itself with the same card the editor shows — rest the pointer on the row, or press F1 — and the card never takes the keyboard from the list.

  • The card under the pointer can be used. More… on a keyword's card and … N more under a long code list are buttons you can reach and press: the card stays while the pointer travels to it, and a press inside it lands. … N more opens the column's page, where the list is whole.

  • Relations. swcli relations @uat/AppDb [dbo.Invoice] lists which columns join which tables. Foreign keys are read from the database; for a database that declares none, a knowledge pack can describe them in relations/*.json, and every list says which is which.

  • A knowledge pack can be one file, and any table can be described. A pack folder zipped — .knpack or .zip — is read wherever a folder is, and knowledge export -o ledger.knpack writes one. A table whose name a file system cannot spell (a dot inside it, a character it forbids, letters outside ASCII) is described by a file that names its schema and table itself; an exported pack writes such files that way, so it reads the same on another machine.

  • Native Wayland, if you want it. On Linux, Settings → Windowing backend → Wayland (or SVALEFELT_SQL_BACKEND=Wayland for one start) runs the window without XWayland where a compositor answers, and on X11 as before where none does. The page and the system report name the backend the running window actually got. Under Wayland the compositor sets the scale of each screen, so the scale setting says it does not apply.

  • The window reopens where it was left, unless you would rather it did not. Reopen the window where it was left is a setting now. A desktop that places windows itself — a tiling one, or Wayland, where a window may not choose its position — has the last word, and the setting says so.

  • A newer toolkit underneath. The application runs on Avalonia 12 and every package it uses is on its latest version. What the toolkit itself has to say — a renderer that gives up, a backend that falls back — now reaches the application's log file, where it used to go nowhere.

  • A pack can ask the database about itself. Some systems carry their own field dictionary: a table of fields with labels and the lookup each column uses, and description tables beside the configuration tables. A pack now lists dictionary queries that read it, so the descriptions and code lists are the installation's own and never a snapshot, and declares parameters such as @language that config.json, a connection or a project file set; swcli knowledge list @uat/AppDb shows what each query contributed and which language is in effect, and knowledge export --from-pack writes the answer down as static files.

  • The Compare tab counts what is ticked. After a compare the footer read 0 of 0 selected and the button Sync 0 objects while the rows were ticked; the sync itself acted on the ticks, so only the count was wrong. It is right now, and Sync and Preview are not offered while nothing is ticked. The two scripts share the diff pane evenly whatever the longest line is, a long line scrolling inside its own half; the take marks are large enough to hit; Options sits beside the source boxes, so the object list is two rows taller.

  • A confirmation can be read. The sheet before a sync, in the Compare tab and in the Data compare tab, stays inside the tab: warnings wrap, the box for the environment's name takes the sheet's width, and a long list of changes scrolls instead of pushing the buttons away.

  • Data compare reads in the dark theme. Inserted, updated and deleted rows take their colours from the theme, and the key line under the selected table is legible.

  • Save as data set. The Data compare tab can save the ticked tables as the data set, into the folder's project file when a side is a folder and into your own configuration otherwise, and says where it wrote. swcli data compare|export|sync then sees the same tables, and a new tab starts from them.

  • Badges stay whole in a narrow explorer. Environment and counterpart badges sit at the row's right edge and keep their width; the name gives way with an ellipsis. The tree no longer scrolls sideways.

  • A source can be written as a URL. sqlserver://myserver/AppDb, and jdbc: addresses too, are read into the ordinary connection string; swcli alias add takes one, and --engine names the engine of an alias. A password written into such an address (anything with :// in it) is not shown, logged or saved, whatever punctuation the password holds and even while it is half typed. Several older messages that repeated a typed source as it was written now show its server and database instead.

  • A database explains itself as soon as it is opened. The explorer's tooltips carry a knowledge pack's descriptions once you open the database, without a query tab having connected to it first. Nothing is resolved when the application starts, and a filter that opens many rows at once reaches no server: a pack that recognises its system with a query waits until you open that database yourself.

  • The plain-text password warning is said once per swcli call, not twice.

  • The editor shows what the packs know. Resting the pointer on a column shows its description and its code list, on a literal compared with a coded column it shows 3 = Posted (the status bar says the same while the caret is on it), completion after = or IN ( offers the codes, and Alt+F1 on a column opens the inspector with the description and codes beside every column.

PlatformFormatSizeSHA-256
Linux x64 tar.gz 24.5 MB 2d67c1e66d62fba11a49894e6a08de6bc368347d7de24865b69369ad7e99d0f3 Download
Windows x64 zip 27 MB 687940934d336a4a78ac829e6c6dd0151a85dbe18a9a9afe066e3a14a89b67f2 Download

0.5.64

17 Sep 2026 5fae2d66

Diffs fold the quiet parts and merge line by line, one script deploys straight from the editor, and knowledge packs and a T-SQL reference arrive.

What changed in 0.5.64

0.5 · 2026-09-17

Diffs fold the quiet parts and merge line by line, one script deploys straight from the editor, and knowledge packs and a T-SQL reference arrive.

  • Diffs fold the quiet parts. A diff now holds the whole object and folds the unchanged stretches into one row that says how many lines it hides; open it a step with the chevrons, Enter or Space, or all of it with Ctrl+Enter, and Whole object opens every fold. The @@ header rows are gone. A narrow map beside the scrollbar shows where every change sits in the object; click a mark to go there.
  • Merge lines between two scripts. For a view, procedure, function or trigger the Compare tab shows the two scripts line by line as they are really written, and each change carries take ◀ and take ▶ (Space and Shift+Space). Write to … under the diff writes the chosen changes into that side alone: a folder gets its file back with its own layout, comments and line endings kept; a database gets a CREATE OR ALTER in one transaction, and the object is read back to prove it took. The confirmation shows the statement or the file and branch, and a blocking environment still asks for its name.
  • Deploy one script from the editor. A tab opened from a script object, or holding one CREATE, has Deploy to… listing its own database and every mapped counterpart. The same on the command line: swcli deploy Procedures/dbo.GetOrders.sql @uat/AppDb, with --dry-run to see the statement first.
  • Counterparts in the explorer. A connection can map to several counterparts at once — the code folder and the next environment. The database row wears a badge per counterpart: not checked until you click it, then 3 differ · code (main) or matches · @prod/AppDb, with the breakdown in the tooltip. Objects that differ carry a dot, a filter chip narrows the tree to them, and Diff with … in the context menu opens the compare on that object. No counterpart is contacted until you ask.
  • Compare with… in the editor. Show changes can measure the text against the code folder or the next environment instead of the tab's own baseline, one at a time, live while you type.
  • An idle window is idle. A finished run left the toolbar's progress bar animating behind its faded strip, and with a large explorer open that kept a whole core busy repainting a window that was doing nothing. It stops now, and a folder of objects in the explorer builds its rows only when it is opened, so a database with thousands of objects costs its folders, not its objects.
  • Every T-SQL statement, function and data type explains itself. swcli help MERGE, swcli help STRING_AGG, swcli help datetime2 print the summary, the syntax and the link to the page, offline; swcli help --search window finds the rest. In the editor, resting the pointer on a keyword, a clause or a function shows a card with the summary and the syntax; Alt+F1 on it opens a Help tab with the arguments, the return value and a search box over the whole reference; while a call is being written the status bar shows its signature with the argument at the caret marked, and the completion list leads a function's tip with the same line. The text is condensed from Microsoft's documentation under its CC BY 4.0 licence, credited on the About page.
  • Knowledge packs. A folder of JSON files can say what a system's tables, columns and coded values mean: descriptions, static code lists, or a read-only query that fetches the codes from the system's own description tables. swcli knowledge check validates a pack, export writes one from a database's extended properties, and explain @uat/AppDb dbo.Invoice.Status 3 answers the question. In the result grid, Show meanings draws what each code means beside it (3 · Posted) for columns the pack describes, the header tooltip carries the column's description, and with meanings in Copy as… / Save as… writes them out; copy, export and sort otherwise see exactly what the database holds. The editor learns to show it next.
  • Folders know their branch. A folder source under git shows its branch and, once known, its uncommitted count; switching branch in a terminal refreshes the folder within one sweep. Drift and snapshot reports name the branch and commit they were checked against.
PlatformFormatSizeSHA-256
Linux x64 tar.gz 35.4 MB 9e6d15fcc3de2c68595a74c65e8da1f7245710583bb556abeebb52c4b794182b Download
Windows x64 zip 27.3 MB b526953d4354fcaa3c8db2087f9b517c036c62a733b064c7f98303b226f4ba75 Download

0.5.62

17 Sep 2026 9ba1d3de

Diffs fold the quiet parts and merge line by line, one script deploys straight from the editor, and knowledge packs and a T-SQL reference arrive.

What changed in 0.5.62

0.5 · 2026-09-17

Diffs fold the quiet parts and merge line by line, one script deploys straight from the editor, and knowledge packs and a T-SQL reference arrive.

  • Diffs fold the quiet parts. A diff now holds the whole object and folds the unchanged stretches into one row that says how many lines it hides; open it a step with the chevrons, Enter or Space, or all of it with Ctrl+Enter, and Whole object opens every fold. The @@ header rows are gone. A narrow map beside the scrollbar shows where every change sits in the object; click a mark to go there.
  • Merge lines between two scripts. For a view, procedure, function or trigger the Compare tab shows the two scripts line by line as they are really written, and each change carries take ◀ and take ▶ (Space and Shift+Space). Write to … under the diff writes the chosen changes into that side alone: a folder gets its file back with its own layout, comments and line endings kept; a database gets a CREATE OR ALTER in one transaction, and the object is read back to prove it took. The confirmation shows the statement or the file and branch, and a blocking environment still asks for its name.
  • Deploy one script from the editor. A tab opened from a script object, or holding one CREATE, has Deploy to… listing its own database and every mapped counterpart. The same on the command line: swcli deploy Procedures/dbo.GetOrders.sql @uat/AppDb, with --dry-run to see the statement first.
  • Counterparts in the explorer. A connection can map to several counterparts at once — the code folder and the next environment. The database row wears a badge per counterpart: not checked until you click it, then 3 differ · code (main) or matches · @prod/AppDb, with the breakdown in the tooltip. Objects that differ carry a dot, a filter chip narrows the tree to them, and Diff with … in the context menu opens the compare on that object. No counterpart is contacted until you ask.
  • Compare with… in the editor. Show changes can measure the text against the code folder or the next environment instead of the tab's own baseline, one at a time, live while you type.
  • An idle window is idle. A finished run left the toolbar's progress bar animating behind its faded strip, and with a large explorer open that kept a whole core busy repainting a window that was doing nothing. It stops now, and a folder of objects in the explorer builds its rows only when it is opened, so a database with thousands of objects costs its folders, not its objects.
  • Every T-SQL statement, function and data type explains itself. swcli help MERGE, swcli help STRING_AGG, swcli help datetime2 print the summary, the syntax and the link to the page, offline; swcli help --search window finds the rest. In the editor, resting the pointer on a keyword, a clause or a function shows a card with the summary and the syntax; Alt+F1 on it opens a Help tab with the arguments, the return value and a search box over the whole reference; while a call is being written the status bar shows its signature with the argument at the caret marked, and the completion list leads a function's tip with the same line. The text is condensed from Microsoft's documentation under its CC BY 4.0 licence, credited on the About page.
  • Knowledge packs. A folder of JSON files can say what a system's tables, columns and coded values mean: descriptions, static code lists, or a read-only query that fetches the codes from the system's own description tables. swcli knowledge check validates a pack, export writes one from a database's extended properties, and explain @uat/AppDb dbo.Invoice.Status 3 answers the question. In the result grid, Show meanings draws what each code means beside it (3 · Posted) for columns the pack describes, the header tooltip carries the column's description, and with meanings in Copy as… / Save as… writes them out; copy, export and sort otherwise see exactly what the database holds. The editor learns to show it next.
  • Folders know their branch. A folder source under git shows its branch and, once known, its uncommitted count; switching branch in a terminal refreshes the folder within one sweep. Drift and snapshot reports name the branch and commit they were checked against.
PlatformFormatSizeSHA-256
Linux x64 tar.gz 35.1 MB a15e1d1a1a642248a4fe146b4fbb6e5cd061d3d40a4036319c9eb921b216daed Download
Windows x64 zip 27 MB f8e0a579a0acc5065ca48200706f4a108b41d89e38718d9b5caa9d8ef6f77bc8 Download

0.4.60

13 Sep 2026 0aeda1b9

A result grid you can select in, copy as SQL and script deletes from, with messages arriving while a batch runs.

What changed in 0.4.60

0.4 · 2026-09-13

A result grid you can select in, copy as SQL and script deletes from, with messages arriving while a batch runs.

  • Execute answers its own question. A tab restored from the last session asks before connecting; pressing Execute again while the question shows is the yes, so a restored tab runs on the second F5 or Ctrl+E rather than a click on the banner.
  • A result grid you can select in. Query results are drawn by a grid of the workbench's own: click a cell, drag a block, click a header for a whole column or the gutter for a whole row, and hold Ctrl for several blocks at once. Copy and every export carry exactly what is selected, with the columns lined up even when the blocks do not meet, and everything the grid shows when nothing is selected. It paints only the cells that changed, so a hundred thousand rows scroll at full speed and a selection moved over a remote desktop no longer redraws the whole pane; a result sixty columns wide behaves the same way.
  • The result menu follows the pointer. Right-click a cell, a column header or the row gutter — what is under the pointer becomes the selection unless it is already selected — and the menu is the one that region has verbs for: the cell viewer, Copy and Copy with headers, Save as CSV/JSON/XML/Excel and Select all in the body; Select column and Fit column width on a header; Select row on the gutter. The menu key opens it without a pointer. Copy as… and Save as… ask which format in a small dialog: TSV, CSV, JSON, XML, SQL, a Markdown table, a Confluence/Jira wiki table or fixed-width text, with headers where they apply — and Save as… adds Excel and a file picker. A CSV now follows Settings → Results: comma or semicolon, quoted always or only when needed.
  • Copy as SQL. The menu copies or saves the selected rows as a script that runs anywhere: CREATE TABLE #Results with the real column types, then the rows batched a thousand to a statement — paste it into another connection and the data is there.
  • Script as DELETE. Where the workbench knows which table a result came from and what keys it, the row menu writes one DELETE per selected row into a new query tab — read it, edit it, run it yourself. Nothing is executed from the grid.
  • Editing a result in place is gone for now. The rows are read-only, and the edit-and- script path returns as a row editor rather than typing into a cell.
  • Messages a batch prints while it runs show up as they arrive. A PRINT before a long statement, or RAISERROR(..., 0, 1) WITH NOWAIT from a script reporting its progress, appears in the Messages pane the moment the server sends it instead of when the whole execution ends.
PlatformFormatSizeSHA-256
Linux x64 tar.gz 35 MB d6bb7bfe99aa3ca7f77702bf0fad47c96b515656b0bcb98e286805cbe88c6737 Download
Windows x64 zip 27 MB 8d8d28b74dd007edce786ad80c611b42cdf0d075a4f2ca261c03c56aec630596 Download

0.3.56

12 Sep 2026 01033a12

Reference data travels with the schema, and the compare tab can be read at a glance, walked diff by diff and synced in one step after a preview.

What changed in 0.3.56

0.3 · 2026-09-12

Reference data travels with the schema, and the compare tab can be read at a glance, walked diff by diff and synced in one step after a preview.

  • Reference data travels with the schema. A data set names the lookup tables that matter; the tool infers each table's key (an explicit key, the primary key, or a unique index), finds the rows the other side lacks, has extra or has changed, and writes the change as a MERGE script you can read before it runs. Rows live in the folder beside the schema as {Schema}/Data/{Table}.sql, so a git checkout can rebuild the lookup tables too. On the command line: swcli data compare, swcli data export and swcli data sync; in the workbench: the Data compare tab, reached from the compare tab's Data button or the palette.
  • The compare tab reads at a glance. Summary chips filter the list, objects are grouped by type with a tick per group, an object only on the left says "To add" and one only on the right "To remove", and a ticked object whose dependencies are not ticked says so with an Include button. Changing a picker marks the result stale instead of clearing it; a swap button and Ctrl+Shift+S exchange the sides; F5 compares.
  • Preview, then one Sync. Preview validates the deployment without touching the destination and opens the script in a query tab. Sync is the one accent button and always goes through the confirmation, now a panel beside the list with the plan, the engine's warnings, what stays unchanged, and a Script button for the exact text that will run.
  • A diff you can walk. Each side has a gutter with the line number and a +, − or ~ glyph, F7 and Shift+F7 step between changes, a Whole object toggle shows the full text, and Ctrl+C copies the visible diff. The same pane shows a query tab's changes since its baseline and a trashed tab's preview.
PlatformFormatSizeSHA-256
Linux x64 tar.gz 34.9 MB f0e7d908579952d64a6959146829b6c3bbfc87253597332b420c9872480dbfdd Download
Windows x64 zip 26.9 MB 4b13305c0392a8a7a14de58c07c67fde4e4c711e787eca8e6633915648366c62 Download

0.2.54

12 Sep 2026 c4397766

The first release of the rewritten workbench. Everything below is new or has been rebuilt from scratch since the previous shape of the tool.

What changed in 0.2.54

0.2 · 2026-09-10

The first release of the rewritten workbench. Everything below is new or has been rebuilt from scratch since the previous shape of the tool.

  • Sources are one idea. A server alias, a database, a folder of SQL files, a SQL project or a .dacpac are all written the same way in the source box (@alias, @alias/Database, a path), parsed by one grammar and read through one provider model. Whatever the tool can do to one kind of source it offers for the others.
  • Builds carry only the providers they need. A build says which provider packages it was compiled with. The lean flavour browses, queries and compares without the deployment engine, and the actions it cannot perform are greyed out with a reason instead of failing when pressed.
  • Browsing is lean. The explorer reads the catalog directly rather than building a full model of the database first, so a big server opens in a fraction of the time and a tree expands while the rest is still arriving.
  • Refresh is incremental, and only where you are working. A crawl policy watches the sources you actually use, checks them on a schedule you can see in the status bar, and applies the difference instead of re-reading everything. Auto-refresh can be paused, and each row says how fresh it is.
  • Safe mode on real environments. Environment rules mark a source as production or UAT; writes there are blocked until you break the glass, every gate decision is journalled, and sync from the compare tab honours the same rules.
  • A command palette on Ctrl+K. Every toolbar verb, tab command and query action in one searchable list, with its shortcut beside it and your recent choices at the top.
  • Compare and sync you can inspect. Object-by-object differences with a line diff, comment-preserving normalisation, a stated scope, and a plan you can read before anything runs. Deployment is transactional, warns about data loss, can take a backup, asks before dropping what is missing, and asks before pulling in dependencies.
  • Folder targets know about git. Syncing into a working tree refuses to write over uncommitted changes, respects .gitignore, and can commit what it wrote.
  • Connections page with a real secret store. Servers are added, edited, tested and removed in one page; passwords go to the OS keyring or an environment variable, never into a settings file, and nothing the tool writes contains a connection string.
  • Query tabs that keep your work. Each tab remembers a baseline and can show what you changed, asks before closing something unsaved or inside a transaction, and a closed tab goes to a searchable trash you can restore from. The session comes back the way you left it.
  • Results you can take with you. Copy or export a result as CSV, TSV, JSON, XML or Excel; open a CSV or Excel file as a grid and copy a selection back out as SQL; open a single cell, a table's data, or an object's definition in its own tab.
  • A shell that fits the screen. Light and dark themes that switch live, one set of design tokens, vector icons, UI zoom on Ctrl+= / Ctrl+- , a window-scale setting for sessions that report the wrong one, a collapsible explorer that remembers its width, and a bookmark bar where one click opens a query tab on a database you keep returning to.
  • Schema changes are reported, not discovered. A change feed records what changed in the databases being watched, when, and whether this application caused it, and can raise a notification when it happens.
  • Feedback in one place. Toasts that fade, per-tab problems, a background-jobs line, progress with a cancel button, confirmations as an overlay the keyboard can answer, and every shortcut written down once. The CLI shares the engine: one exit-code table, --json on every command, diagnostics on stderr and a plan verb that shows what a sync would do.
  • One place for configuration. Config, workspace, UI and session files under a single per-user root, with environment variables to move it, the paths shown in Settings, and an About page that reports the build and the running system.
  • A slow session can say why. The About page keeps a Performance section: what a key press, a button, a tab switch and a frame cost this session, and how late the window's own work ran. Copy or save it as JSON — with the system report in the same document — and it reads without the application. Settings → Appearance adds Rendering, which forces the CPU drawing path for sessions where the GPU one goes over a remote desktop.
  • One download, two programs. A release is one folder per operating system holding both the desktop application (swgui) and the command line (swcli), sharing one copy of everything they have in common: SqlWorkbench-linux-x64-<version>.tar.gz and SqlWorkbench-win-x64-<version>.zip. Unpack it anywhere and run either. It needs the .NET 10 runtime installed on the machine — the trade for a download of about 30 MiB instead of two of 70 MiB each. swcli update replaces the whole folder, keeping the one it replaced beside it as .previous; on Windows it tells you to unpack the archive by hand, because a running program there holds its own files open.
PlatformFormatSizeSHA-256
Linux x64 tar.gz 34.8 MB eeba2e766c7668141a28d7188971dd62a479e72f72b178028938026e09e9f370 Download
Windows x64 zip 26.7 MB fe4c8416f2657cfbec53dac2b63daa6dbeb8a5ea8245886c1e3f48047c1547aa Download

0.2.50

10 Sep 2026 0c1d9ffa

The first release of the rewritten workbench. Everything below is new or has been rebuilt from scratch since the previous shape of the tool.

What changed in 0.2.50

0.2 · 2026-09-10

The first release of the rewritten workbench. Everything below is new or has been rebuilt from scratch since the previous shape of the tool.

  • Sources are one idea. A server alias, a database, a folder of SQL files, a SQL project or a .dacpac are all written the same way in the source box (@alias, @alias/Database, a path), parsed by one grammar and read through one provider model. Whatever the tool can do to one kind of source it offers for the others.
  • Builds carry only the providers they need. A build says which provider packages it was compiled with. The lean flavour browses, queries and compares without the deployment engine, and the actions it cannot perform are greyed out with a reason instead of failing when pressed.
  • Browsing is lean. The explorer reads the catalog directly rather than building a full model of the database first, so a big server opens in a fraction of the time and a tree expands while the rest is still arriving.
  • Refresh is incremental, and only where you are working. A crawl policy watches the sources you actually use, checks them on a schedule you can see in the status bar, and applies the difference instead of re-reading everything. Auto-refresh can be paused, and each row says how fresh it is.
  • Safe mode on real environments. Environment rules mark a source as production or UAT; writes there are blocked until you break the glass, every gate decision is journalled, and sync from the compare tab honours the same rules.
  • A command palette on Ctrl+K. Every toolbar verb, tab command and query action in one searchable list, with its shortcut beside it and your recent choices at the top.
  • Compare and sync you can inspect. Object-by-object differences with a line diff, comment-preserving normalisation, a stated scope, and a plan you can read before anything runs. Deployment is transactional, warns about data loss, can take a backup, asks before dropping what is missing, and asks before pulling in dependencies.
  • Folder targets know about git. Syncing into a working tree refuses to write over uncommitted changes, respects .gitignore, and can commit what it wrote.
  • Connections page with a real secret store. Servers are added, edited, tested and removed in one page; passwords go to the OS keyring or an environment variable, never into a settings file, and nothing the tool writes contains a connection string.
  • Query tabs that keep your work. Each tab remembers a baseline and can show what you changed, asks before closing something unsaved or inside a transaction, and a closed tab goes to a searchable trash you can restore from. The session comes back the way you left it.
  • Results you can take with you. Copy or export a result as CSV, TSV, JSON, XML or Excel; open a CSV or Excel file as a grid and copy a selection back out as SQL; open a single cell, a table's data, or an object's definition in its own tab.
  • A shell that fits the screen. Light and dark themes that switch live, one set of design tokens, vector icons, UI zoom on Ctrl+= / Ctrl+- , a window-scale setting for sessions that report the wrong one, a collapsible explorer that remembers its width, and a bookmark bar where one click opens a query tab on a database you keep returning to.
  • Schema changes are reported, not discovered. A change feed records what changed in the databases being watched, when, and whether this application caused it, and can raise a notification when it happens.
  • Feedback in one place. Toasts that fade, per-tab problems, a background-jobs line, progress with a cancel button, confirmations as an overlay the keyboard can answer, and every shortcut written down once. The CLI shares the engine: one exit-code table, --json on every command, diagnostics on stderr and a plan verb that shows what a sync would do.
  • One place for configuration. Config, workspace, UI and session files under a single per-user root, with environment variables to move it, the paths shown in Settings, and an About page that reports the build and the running system.
  • A slow session can say why. The About page keeps a Performance section: what a key press, a button, a tab switch and a frame cost this session, and how late the window's own work ran. Copy or save it as JSON — with the system report in the same document — and it reads without the application. Settings → Appearance adds Rendering, which forces the CPU drawing path for sessions where the GPU one goes over a remote desktop.
  • One download, two programs. A release is one folder per operating system holding both the desktop application (swgui) and the command line (swcli), sharing one copy of everything they have in common: SqlWorkbench-linux-x64-<version>.tar.gz and SqlWorkbench-win-x64-<version>.zip. Unpack it anywhere and run either. It needs the .NET 10 runtime installed on the machine — the trade for a download of about 30 MiB instead of two of 70 MiB each. swcli update replaces the whole folder, keeping the one it replaced beside it as .previous; on Windows it tells you to unpack the archive by hand, because a running program there holds its own files open.
PlatformFormatSizeSHA-256
Linux x64 tar.gz 34.8 MB b040c92a6de7f2b3c332a1000c9247cea1656489922c478dbfb0f25dae3e4f50 Download
Windows x64 zip 26.7 MB 78ef663e8581bc1b536c48477e3ad5ec07e67e6abca30f86cae2fa16d9ef5d72 Download

0.2.47

10 Sep 2026 76d66fff

The first release of the rewritten workbench. Everything below is new or has been rebuilt from scratch since the previous shape of the tool.

What changed in 0.2.47

0.2 · 2026-09-10

The first release of the rewritten workbench. Everything below is new or has been rebuilt from scratch since the previous shape of the tool.

  • Sources are one idea. A server alias, a database, a folder of SQL files, a SQL project or a .dacpac are all written the same way in the source box (@alias, @alias/Database, a path), parsed by one grammar and read through one provider model. Whatever the tool can do to one kind of source it offers for the others.
  • Builds carry only the providers they need. A build says which provider packages it was compiled with. The lean flavour browses, queries and compares without the deployment engine, and the actions it cannot perform are greyed out with a reason instead of failing when pressed.
  • Browsing is lean. The explorer reads the catalog directly rather than building a full model of the database first, so a big server opens in a fraction of the time and a tree expands while the rest is still arriving.
  • Refresh is incremental, and only where you are working. A crawl policy watches the sources you actually use, checks them on a schedule you can see in the status bar, and applies the difference instead of re-reading everything. Auto-refresh can be paused, and each row says how fresh it is.
  • Safe mode on real environments. Environment rules mark a source as production or UAT; writes there are blocked until you break the glass, every gate decision is journalled, and sync from the compare tab honours the same rules.
  • A command palette on Ctrl+K. Every toolbar verb, tab command and query action in one searchable list, with its shortcut beside it and your recent choices at the top.
  • Compare and sync you can inspect. Object-by-object differences with a line diff, comment-preserving normalisation, a stated scope, and a plan you can read before anything runs. Deployment is transactional, warns about data loss, can take a backup, asks before dropping what is missing, and asks before pulling in dependencies.
  • Folder targets know about git. Syncing into a working tree refuses to write over uncommitted changes, respects .gitignore, and can commit what it wrote.
  • Connections page with a real secret store. Servers are added, edited, tested and removed in one page; passwords go to the OS keyring or an environment variable, never into a settings file, and nothing the tool writes contains a connection string.
  • Query tabs that keep your work. Each tab remembers a baseline and can show what you changed, asks before closing something unsaved or inside a transaction, and a closed tab goes to a searchable trash you can restore from. The session comes back the way you left it.
  • Results you can take with you. Copy or export a result as CSV, TSV, JSON, XML or Excel; open a CSV or Excel file as a grid and copy a selection back out as SQL; open a single cell, a table's data, or an object's definition in its own tab.
  • A shell that fits the screen. Light and dark themes that switch live, one set of design tokens, vector icons, UI zoom on Ctrl+= / Ctrl+- , a window-scale setting for sessions that report the wrong one, a collapsible explorer that remembers its width, and a bookmark bar where one click opens a query tab on a database you keep returning to.
  • Schema changes are reported, not discovered. A change feed records what changed in the databases being watched, when, and whether this application caused it, and can raise a notification when it happens.
  • Feedback in one place. Toasts that fade, per-tab problems, a background-jobs line, progress with a cancel button, confirmations as an overlay the keyboard can answer, and every shortcut written down once. The CLI shares the engine: one exit-code table, --json on every command, diagnostics on stderr and a plan verb that shows what a sync would do.
  • One place for configuration. Config, workspace, UI and session files under a single per-user root, with environment variables to move it, the paths shown in Settings, and an About page that reports the build and the running system.
  • A slow session can say why. The About page keeps a Performance section: what a key press, a button, a tab switch and a frame cost this session, and how late the window's own work ran. Copy or save it as JSON — with the system report in the same document — and it reads without the application. Settings → Appearance adds Rendering, which forces the CPU drawing path for sessions where the GPU one goes over a remote desktop.
  • One download, two programs. A release is one folder per operating system holding both the desktop application (swgui) and the command line (swcli), sharing one copy of everything they have in common: SqlWorkbench-linux-x64-<version>.tar.gz and SqlWorkbench-win-x64-<version>.zip. Unpack it anywhere and run either. It needs the .NET 10 runtime installed on the machine — the trade for a download of about 30 MiB instead of two of 70 MiB each. swcli update replaces the whole folder, keeping the one it replaced beside it as .previous; on Windows it tells you to unpack the archive by hand, because a running program there holds its own files open.
PlatformFormatSizeSHA-256
Linux x64 tar.gz 34.7 MB aeb7b14b92e8e95fed3dc690abe965244eb9f48ead00a42db8a6e19fcf3c892f Download
Windows x64 zip 26.7 MB 67e1d6a9f269dc9ccc43f37afade9c803f0bcf28d91da743b12b60c37c2e9f87 Download

0.2.45

10 Sep 2026 9817214b

The first release of the rewritten workbench. Everything below is new or has been rebuilt from scratch since the previous shape of the tool.

What changed in 0.2.45

0.2 · 2026-09-10

The first release of the rewritten workbench. Everything below is new or has been rebuilt from scratch since the previous shape of the tool.

  • Sources are one idea. A server alias, a database, a folder of SQL files, a SQL project or a .dacpac are all written the same way in the source box (@alias, @alias/Database, a path), parsed by one grammar and read through one provider model. Whatever the tool can do to one kind of source it offers for the others.
  • Builds carry only the providers they need. A build says which provider packages it was compiled with. The lean flavour browses, queries and compares without the deployment engine, and the actions it cannot perform are greyed out with a reason instead of failing when pressed.
  • Browsing is lean. The explorer reads the catalog directly rather than building a full model of the database first, so a big server opens in a fraction of the time and a tree expands while the rest is still arriving.
  • Refresh is incremental, and only where you are working. A crawl policy watches the sources you actually use, checks them on a schedule you can see in the status bar, and applies the difference instead of re-reading everything. Auto-refresh can be paused, and each row says how fresh it is.
  • Safe mode on real environments. Environment rules mark a source as production or UAT; writes there are blocked until you break the glass, every gate decision is journalled, and sync from the compare tab honours the same rules.
  • A command palette on Ctrl+K. Every toolbar verb, tab command and query action in one searchable list, with its shortcut beside it and your recent choices at the top.
  • Compare and sync you can inspect. Object-by-object differences with a line diff, comment-preserving normalisation, a stated scope, and a plan you can read before anything runs. Deployment is transactional, warns about data loss, can take a backup, asks before dropping what is missing, and asks before pulling in dependencies.
  • Folder targets know about git. Syncing into a working tree refuses to write over uncommitted changes, respects .gitignore, and can commit what it wrote.
  • Connections page with a real secret store. Servers are added, edited, tested and removed in one page; passwords go to the OS keyring or an environment variable, never into a settings file, and nothing the tool writes contains a connection string.
  • Query tabs that keep your work. Each tab remembers a baseline and can show what you changed, asks before closing something unsaved or inside a transaction, and a closed tab goes to a searchable trash you can restore from. The session comes back the way you left it.
  • Results you can take with you. Copy or export a result as CSV, TSV, JSON, XML or Excel; open a CSV or Excel file as a grid and copy a selection back out as SQL; open a single cell, a table's data, or an object's definition in its own tab.
  • A shell that fits the screen. Light and dark themes that switch live, one set of design tokens, vector icons, UI zoom on Ctrl+= / Ctrl+- , a window-scale setting for sessions that report the wrong one, a collapsible explorer that remembers its width, and a bookmark bar where one click opens a query tab on a database you keep returning to.
  • Schema changes are reported, not discovered. A change feed records what changed in the databases being watched, when, and whether this application caused it, and can raise a notification when it happens.
  • Feedback in one place. Toasts that fade, per-tab problems, a background-jobs line, progress with a cancel button, confirmations as an overlay the keyboard can answer, and every shortcut written down once. The CLI shares the engine: one exit-code table, --json on every command, diagnostics on stderr and a plan verb that shows what a sync would do.
  • One place for configuration. Config, workspace, UI and session files under a single per-user root, with environment variables to move it, the paths shown in Settings, and an About page that reports the build and the running system.
  • A slow session can say why. The About page keeps a Performance section: what a key press, a button, a tab switch and a frame cost this session, and how late the window's own work ran. Copy or save it as JSON — with the system report in the same document — and it reads without the application. Settings → Appearance adds Rendering, which forces the CPU drawing path for sessions where the GPU one goes over a remote desktop.
  • One download, two programs. A release is one folder per operating system holding both the desktop application (swgui) and the command line (swcli), sharing one copy of everything they have in common: SqlWorkbench-linux-x64-<version>.tar.gz and SqlWorkbench-win-x64-<version>.zip. Unpack it anywhere and run either. It needs the .NET 10 runtime installed on the machine — the trade for a download of about 30 MiB instead of two of 70 MiB each. swcli update replaces the whole folder, keeping the one it replaced beside it as .previous; on Windows it tells you to unpack the archive by hand, because a running program there holds its own files open.
PlatformFormatSizeSHA-256
Linux x64 tar.gz 34.7 MB e875dfd1a78161e14deeec53348ee6403237e014de0e86e8b7abeca914d96bd9 Download
Windows x64 zip 26.7 MB 3cda32cbfb669c1dab7760c244814bb2d774f5ce766ad57de31ca844841c0d4b Download

0.2.41

10 Sep 2026 53e231da

The first release of the rewritten workbench. Everything below is new or has been rebuilt from scratch since the previous shape of the tool.

What changed in 0.2.41

0.2 · 2026-09-10

The first release of the rewritten workbench. Everything below is new or has been rebuilt from scratch since the previous shape of the tool.

  • Sources are one idea. A server alias, a database, a folder of SQL files, a SQL project or a .dacpac are all written the same way in the source box (@alias, @alias/Database, a path), parsed by one grammar and read through one provider model. Whatever the tool can do to one kind of source it offers for the others.
  • Builds carry only the providers they need. A build says which provider packages it was compiled with. The lean flavour browses, queries and compares without the deployment engine, and the actions it cannot perform are greyed out with a reason instead of failing when pressed.
  • Browsing is lean. The explorer reads the catalog directly rather than building a full model of the database first, so a big server opens in a fraction of the time and a tree expands while the rest is still arriving.
  • Refresh is incremental, and only where you are working. A crawl policy watches the sources you actually use, checks them on a schedule you can see in the status bar, and applies the difference instead of re-reading everything. Auto-refresh can be paused, and each row says how fresh it is.
  • Safe mode on real environments. Environment rules mark a source as production or UAT; writes there are blocked until you break the glass, every gate decision is journalled, and sync from the compare tab honours the same rules.
  • A command palette on Ctrl+K. Every toolbar verb, tab command and query action in one searchable list, with its shortcut beside it and your recent choices at the top.
  • Compare and sync you can inspect. Object-by-object differences with a line diff, comment-preserving normalisation, a stated scope, and a plan you can read before anything runs. Deployment is transactional, warns about data loss, can take a backup, asks before dropping what is missing, and asks before pulling in dependencies.
  • Folder targets know about git. Syncing into a working tree refuses to write over uncommitted changes, respects .gitignore, and can commit what it wrote.
  • Connections page with a real secret store. Servers are added, edited, tested and removed in one page; passwords go to the OS keyring or an environment variable, never into a settings file, and nothing the tool writes contains a connection string.
  • Query tabs that keep your work. Each tab remembers a baseline and can show what you changed, asks before closing something unsaved or inside a transaction, and a closed tab goes to a searchable trash you can restore from. The session comes back the way you left it.
  • Results you can take with you. Copy or export a result as CSV, TSV, JSON, XML or Excel; open a CSV or Excel file as a grid and copy a selection back out as SQL; open a single cell, a table's data, or an object's definition in its own tab.
  • A shell that fits the screen. Light and dark themes that switch live, one set of design tokens, vector icons, UI zoom on Ctrl+= / Ctrl+- , a window-scale setting for sessions that report the wrong one, a collapsible explorer that remembers its width, and a bookmark bar where one click opens a query tab on a database you keep returning to.
  • Schema changes are reported, not discovered. A change feed records what changed in the databases being watched, when, and whether this application caused it, and can raise a notification when it happens.
  • Feedback in one place. Toasts that fade, per-tab problems, a background-jobs line, progress with a cancel button, confirmations as an overlay the keyboard can answer, and every shortcut written down once. The CLI shares the engine: one exit-code table, --json on every command, diagnostics on stderr and a plan verb that shows what a sync would do.
  • One place for configuration. Config, workspace, UI and session files under a single per-user root, with environment variables to move it, the paths shown in Settings, and an About page that reports the build and the running system.
  • A slow session can say why. The About page keeps a Performance section: what a key press, a button, a tab switch and a frame cost this session, and how late the window's own work ran. Copy or save it as JSON — with the system report in the same document — and it reads without the application. Settings → Appearance adds Rendering, which forces the CPU drawing path for sessions where the GPU one goes over a remote desktop.
  • One download, two programs. A release is one folder per operating system holding both the desktop application (swgui) and the command line (swcli), sharing one copy of everything they have in common: SqlWorkbench-linux-x64-<version>.tar.gz and SqlWorkbench-win-x64-<version>.zip. Unpack it anywhere and run either. It needs the .NET 10 runtime installed on the machine — the trade for a download of about 30 MiB instead of two of 70 MiB each. swcli update replaces the whole folder, keeping the one it replaced beside it as .previous; on Windows it tells you to unpack the archive by hand, because a running program there holds its own files open.
PlatformFormatSizeSHA-256
Linux x64 tar.gz 34.7 MB 7dce01f87b333f1465df13e0c73965e4d19d1ea43cd4ac6320702ec45c2f8cc1 Download
Windows x64 zip 26.7 MB ac262fe415e3ec9bdac7d435728b3598109f3d3fcc6bd66f9eb4a735bec8b98c Download