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 2026f1f375ef
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 anALTER DATABASEstood 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 withSET NOCOUNT ONa 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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 27 MB | b09c71224cc32cc2ab13cb2547a3480fe87c1ae8c682356106494850280c84e1 |
Download |
| Windows x64 | zip | 29.9 MB | bc8697c7bb1639de6e5dbd08c0941244be6bfc9d1943f6360c09ca297331c889 |
Download |
0.12.109
11 Oct 2026cf0ddd41
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 1000on PostgreSQL, MySQL and SQLite tables, and the statement it opened there had no limit at all. It now ends inLIMIT 1000on those three, SQL Server keeps itsTOP, 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_INCREMENTstays.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
.knpackcan 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 --helpdescribes 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 asapp:secret@hostorpostgres:/app:secret@hostcame 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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 27 MB | f0fe201c4e264cc9e2986d9eb1791dc3ff30b972f900256f7a33afd1e238a631 |
Download |
| Windows x64 | zip | 29.9 MB | 33143c2fa6e1c2faa096846ee34ba3b94003fe766ec505dd8f84f77f5edd7f98 |
Download |
0.11.95
1 Oct 20269301a841
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 TABLEcolumn by column,CREATE OR REPLACEfor 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,scriptandsyncreach a MySQL target:ALTER TABLEkey 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--transactionalis 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,.csvor.tsvdestination 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 nameddbo.Config.json, and one whose rows each say theirTable. A file that carries no types is read as the other side's, so"2026-01-01 08:00"equals adatetime2, 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/otherused to open a file calledotherin the working folder; it now refuses, naming the alias. An unknown--enginename is refused when it is typed rather than later.swcli helpprints the example a topic is written around, as the Help tab already did.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 26.7 MB | 9993d11e88c79a1ece511e303934c210bdc50765eaef70b83895bc4b4d9e7d44 |
Download |
| Windows x64 | zip | 29.6 MB | b72fa9dd6442b2b30b6936fdd76527ea2d7a9c44bd178e77af266557aa45eb8a |
Download |
0.10.89
29 Sep 20267e89896c
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 aspostgres://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 AppDbormysql://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 themysqlclient 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 assqlite:///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, undermain. A query tab runs scripts against it, and aCREATE 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
HELPstatement, 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 DISTINCTat 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 customersis marked underform, 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
authorizationor a column calleddualwas 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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 26.6 MB | ece6662888a134f85a541b98d620ec3d583100c287f1c81c2db98219cef0c8ec |
Download |
| Windows x64 | zip | 29.5 MB | 72c151105634b314177be9baee378753744f805eb4af0af7b4617bbe689194ca |
Download |
0.10.87
29 Sep 202656c63a3b
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 aspostgres://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 AppDbormysql://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 themysqlclient 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 assqlite:///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, undermain. A query tab runs scripts against it, and aCREATE 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
HELPstatement, 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 DISTINCTat 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 customersis marked underform, 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
authorizationor a column calleddualwas 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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 26.5 MB | 62173067d2bde134cfa7ea0b9dca4b877e018d1381d4ed6b47fd31f8ffb76725 |
Download |
| Windows x64 | zip | 29.4 MB | af90246a9e3f5b09f27ae24441e454808b92a5150f05747dd8cf146bf6b33cb1 |
Download |
0.9.85
24 Sep 20261319686b
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 andswcli relationsshow 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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 24.6 MB | e906596041c1054ac40901fc7d0d78ef2c3762fc17a833b8797f6b22377d3bbd |
Download |
| Windows x64 | zip | 27.1 MB | 1f18835d57c3fa849a8ae9c9982102d9a7fe85d29309423363073ecf4ed4d05e |
Download |
0.8.83
24 Sep 2026fc4e1b17
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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 24.6 MB | 6fe7c8a6368e28648bea1841bdf1b7da46a15ab1af7b57b8c8b77faf764bae76 |
Download |
| Windows x64 | zip | 27.1 MB | 90f678e8d65046f436a632a0481892be4dd35ab861e71ffc49c772880a8b2458 |
Download |
0.8.80
23 Sep 2026b31c40ee
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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 24.5 MB | 23641a6fa2e93e50c0a39a5277d7a3373eafea2159f7950830ce146049e90df7 |
Download |
| Windows x64 | zip | 27.1 MB | 2cc128065b4d80bf0971754fe45f2bbcc113ace5df4f478ebe4b7a367aa215d9 |
Download |
0.7.79
22 Sep 20265c0d44de
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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 24.5 MB | 78c4f881f7309510b3676d40b219e09e5a20aeea22983b383bc3021824c57f7e |
Download |
| Windows x64 | zip | 27.1 MB | e9044dd1e7c0fc1544cc54958889550f8b2fda274f19a464fc3f110da7b7c92c |
Download |
0.6.77
22 Sep 2026ebbd4f39
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 = salesnames the file,AddDate = truedates it,FreezeColumns = 2andFormat Amount = #,##0.000shape the sheets, and-- ##QR: PageName = Summarynames the next result set's sheet. A first column called##PAGENAMEnames 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.Totalunder 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_customeraccountlinkis joined ascalrather thana,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
ANDbetween 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 orWHEREpredicate per line,ASon 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 ibecomesselect 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. Afterjoin Customer c, after a bareON, and in aWHERE, 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
FROMclause 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 inrelations/*.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 —
.knpackor.zip— is read wherever a folder is, andknowledge export -o ledger.knpackwrites 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 itsschemaandtableitself; 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=Waylandfor 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
dictionaryqueries that read it, so the descriptions and code lists are the installation's own and never a snapshot, and declaresparameterssuch as@languagethatconfig.json, a connection or a project file set;swcli knowledge list @uat/AppDbshows what each query contributed and which language is in effect, andknowledge export --from-packwrites 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|syncthen 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, andjdbc:addresses too, are read into the ordinary connection string;swcli alias addtakes one, and--enginenames 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
swclicall, 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=orIN (offers the codes, and Alt+F1 on a column opens the inspector with the description and codes beside every column.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 24.5 MB | 2d67c1e66d62fba11a49894e6a08de6bc368347d7de24865b69369ad7e99d0f3 |
Download |
| Windows x64 | zip | 27 MB | 687940934d336a4a78ac829e6c6dd0151a85dbe18a9a9afe066e3a14a89b67f2 |
Download |
0.5.64
17 Sep 20265fae2d66
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 ALTERin 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-runto 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 datetime2print the summary, the syntax and the link to the page, offline;swcli help --search windowfinds 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 checkvalidates a pack,exportwrites one from a database's extended properties, andexplain @uat/AppDb dbo.Invoice.Status 3answers 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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 35.4 MB | 9e6d15fcc3de2c68595a74c65e8da1f7245710583bb556abeebb52c4b794182b |
Download |
| Windows x64 | zip | 27.3 MB | b526953d4354fcaa3c8db2087f9b517c036c62a733b064c7f98303b226f4ba75 |
Download |
0.5.62
17 Sep 20269ba1d3de
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 ALTERin 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-runto 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 datetime2print the summary, the syntax and the link to the page, offline;swcli help --search windowfinds 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 checkvalidates a pack,exportwrites one from a database's extended properties, andexplain @uat/AppDb dbo.Invoice.Status 3answers 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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 35.1 MB | a15e1d1a1a642248a4fe146b4fbb6e5cd061d3d40a4036319c9eb921b216daed |
Download |
| Windows x64 | zip | 27 MB | f8e0a579a0acc5065ca48200706f4a108b41d89e38718d9b5caa9d8ef6f77bc8 |
Download |
0.4.60
13 Sep 20260aeda1b9
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 #Resultswith 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
DELETEper 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
PRINTbefore a long statement, orRAISERROR(..., 0, 1) WITH NOWAITfrom a script reporting its progress, appears in the Messages pane the moment the server sends it instead of when the whole execution ends.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 35 MB | d6bb7bfe99aa3ca7f77702bf0fad47c96b515656b0bcb98e286805cbe88c6737 |
Download |
| Windows x64 | zip | 27 MB | 8d8d28b74dd007edce786ad80c611b42cdf0d075a4f2ca261c03c56aec630596 |
Download |
0.3.56
12 Sep 202601033a12
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 exportandswcli data sync; in the workbench: the Data compare tab, reached from the compare tab'sDatabutton 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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 34.9 MB | f0e7d908579952d64a6959146829b6c3bbfc87253597332b420c9872480dbfdd |
Download |
| Windows x64 | zip | 26.9 MB | 4b13305c0392a8a7a14de58c07c67fde4e4c711e787eca8e6633915648366c62 |
Download |
0.2.54
12 Sep 2026c4397766
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
.dacpacare 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,
--jsonon every command, diagnostics on stderr and aplanverb 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.gzandSqlWorkbench-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 updatereplaces 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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 34.8 MB | eeba2e766c7668141a28d7188971dd62a479e72f72b178028938026e09e9f370 |
Download |
| Windows x64 | zip | 26.7 MB | fe4c8416f2657cfbec53dac2b63daa6dbeb8a5ea8245886c1e3f48047c1547aa |
Download |
0.2.50
10 Sep 20260c1d9ffa
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
.dacpacare 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,
--jsonon every command, diagnostics on stderr and aplanverb 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.gzandSqlWorkbench-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 updatereplaces 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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 34.8 MB | b040c92a6de7f2b3c332a1000c9247cea1656489922c478dbfb0f25dae3e4f50 |
Download |
| Windows x64 | zip | 26.7 MB | 78ef663e8581bc1b536c48477e3ad5ec07e67e6abca30f86cae2fa16d9ef5d72 |
Download |
0.2.47
10 Sep 202676d66fff
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
.dacpacare 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,
--jsonon every command, diagnostics on stderr and aplanverb 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.gzandSqlWorkbench-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 updatereplaces 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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 34.7 MB | aeb7b14b92e8e95fed3dc690abe965244eb9f48ead00a42db8a6e19fcf3c892f |
Download |
| Windows x64 | zip | 26.7 MB | 67e1d6a9f269dc9ccc43f37afade9c803f0bcf28d91da743b12b60c37c2e9f87 |
Download |
0.2.45
10 Sep 20269817214b
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
.dacpacare 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,
--jsonon every command, diagnostics on stderr and aplanverb 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.gzandSqlWorkbench-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 updatereplaces 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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 34.7 MB | e875dfd1a78161e14deeec53348ee6403237e014de0e86e8b7abeca914d96bd9 |
Download |
| Windows x64 | zip | 26.7 MB | 3cda32cbfb669c1dab7760c244814bb2d774f5ce766ad57de31ca844841c0d4b |
Download |
0.2.41
10 Sep 202653e231da
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
.dacpacare 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,
--jsonon every command, diagnostics on stderr and aplanverb 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.gzandSqlWorkbench-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 updatereplaces 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.
| Platform | Format | Size | SHA-256 | |
|---|---|---|---|---|
| Linux x64 | tar.gz | 34.7 MB | 7dce01f87b333f1465df13e0c73965e4d19d1ea43cd4ac6320702ec45c2f8cc1 |
Download |
| Windows x64 | zip | 26.7 MB | ac262fe415e3ec9bdac7d435728b3598109f3d3fcc6bd66f9eb4a735bec8b98c |
Download |