Track all versions, updates, and improvements to VisuaLeaf.
Release Date: September 30 2026
Covers 1.0.2362 β 1.0.2413.
Four things change how a day in the app feels. The Query Profiler is rebuilt β slow queries now
roll up into one row per query shape, with the collection scans and the missing indexes called out
for you. Tabs can be grouped β by connection, by database, or by hand β named, coloured,
collapsed, dragged as a block and popped into their own window. **Table Management is an editor on
SQLite, DuckDB and ClickHouse**, not a read-only screen, with undo on grid edits and a way to edit
tables the engine gives no key for. And the data grid scrolls up to 6Γ faster: fast scrolling
on a wide table no longer leaves the screen blank while it catches up.
Also shipping: full-screen tasks and task folders, Microsoft DocumentDB as a connection type,
Snowflake as a connection type, **XML and
Excel as export targets, guided in-app tutorials, schema awareness** in the places that still assumed there was only one, and a
much larger MCP surface for driving the app from an AI assistant.
The old profiler showed you a list of slow operations. The new one answers the question you actually
have: which query is costing me, and what do I do about it?
different values collapses into one row β or by the exact command. Count, mean, max, total time,
docs examined against docs returned, and the plan each one used.
as we managed to download". The totals are computed across everything that matched your filter.
a scan-efficiency figure shows how much of what was read got returned.
queries need this index"* instead of 47 separate warnings.
open the full query behind it.
namespace appears, and between the chart and the table below it.
than showing you a blank screen.
because they are built from the same filter.
shell.
The tab strip was flat, and a workspace with fifteen tabs across four connections read as fifteen
unrelated things.
βΎ menu gets an Organize row β None,Connection, Database. Pick one and tabs that belong together sit together behind a group
header showing the engine logo, the name and a count.
drag other tabs in. Custom groups and automatic grouping coexist; switching between them loses
neither your colours nor which groups were collapsed.
βΈ Name (n) chip. Pick a tab from the dropdown that lives insidea collapsed group and it expands itself to show you.
its original internal order. Drag it out of the window and the whole group pops into a window of
its own, still grouped.
open.
the order you dragged them into.
Tabs with no single connection β Data Sync, Compare, User Management β collect in a trailing
Other group instead of scattering.
Alongside it, the tab right-click menu grew: Clone Tab, Reveal in Sidebar, Split Right /
Split Down, Close Tabs to the left / right / others / all, and **Return All Tabs to Main
Window** from a popout.
Both the MongoDB table view and the SQL grid were rebuilt for scrolling, and the tree view got the
same treatment.
about three frames per step. It now fits in one.
grid blank until you stopped. Now the grid keeps drawing the whole way, and at most a thin strip
at the leading edge is ever empty.
over the header costs nothing.
no longer stutters as rows come into view.
the mouse moved. It now keeps up with the pointer, even on a full screen of data.
Until now these three engines showed you their table structure and refused to change it. All three
can be edited, and each one tells you exactly what it can and cannot do rather than failing at Save.
rename the table.
ALTER TABLE does not have most ofthese operations. Existing indexes, triggers and views are preserved through the change, and a
failed edit leaves the original table exactly as it was.
checked before anything is run**: if any row could not be converted, the edit is refused up front
with the number of rows that would have failed. This matters more on ClickHouse than anywhere
else, because a half-applied retype there leaves a table that cannot be read at all.
β instead of being offered and then rejected.
view, a Snowflake table, a ClickHouse MergeTree β you can tell VisuaLeaf which combination of
columns identifies a row, and the grid becomes editable.
combination is not unique an edit touches more rows than you meant, and it says so in the first
sentence. Columns that cannot work as a key β nullable ones, floating-point ones, blobs β cannot
be picked, each with its own reason.
generation and schema views keep treating the table as keyless, so nothing silently starts
building upserts on a promise.
edits through that connection relies on it, so a read-only collaborator cannot set one.
actually is now, not where it used to be.
and table editing wired through the same paths as every other engine.
~20 internal schemas no longer fill the tree ahead of your data.
instead of the generic grey database icon.
ClickHouse also moves to a newer driver: table primary keys are reported correctly (so the grid
lets you edit), and opening a connection no longer stalls for around thirty seconds before the
database list appears. ClickHouse tables sorted by an expression are editable. A table whose
key uses something like toDate(order_time) used to open with every column read-only. Now only the
key columns are locked, which ClickHouse itself will not let you change. **Results of your own SQL
on ClickHouse can be edited too.** They used to
open read-only whenever the table lived in a database other than the one the connection opened on.
Microsoft DocumentDB (the open-source engine that also runs Cosmos DB vCore) is now its own
connection type, separate from Amazon DocumentDB. The two share a name and a protocol but are
unrelated engines with different limits, and the app now treats each one by its own rules.
options are marked by what your server supports. On Microsoft DocumentDB, text, hashed and
geospatial indexes, $text, $setWindowFields, $unionWith and more are no longer flagged,
because Microsoft's engine supports them where Amazon's does not.
metrics, so the Query Profiler and server monitoring explain that up front instead of showing an
empty screen.
breadcrumbs.
accept the same connection strings, so it is easy to save one as another. When a connection saved
as MongoDB turns out to be Microsoft DocumentDB, you are asked once whether to switch. Answer
either way and you are not asked again. Close the prompt and it asks next time.
in the form, the result says "This looks like β¦" with a one-click Switch button.
you chose yourself is never questioned.
takes and which ones you have already finished.
moves on by itself β the control is the lesson, not a Next button β but Next is always there if
you would rather read than click, and Escape ends a tour from anywhere.
about to point at, so you are never hunting for the thing being explained.
MongoDB and a SQLite sample, each saying what's inside) or Connect your database, with the
engine logos showing that it isn't MongoDB-only. Once this machine has used its free trial, the
trial offer becomes a sign-in option instead.
exists rather than concluding it does not.
Several parts of the app stopped at connection β database and assumed whatever schema the engine
looked in first. On PostgreSQL, Oracle, SQL Server and DB2 that is a silent wrong answer, not an
error.
against it.
An export that used to quietly read public.customers now reads the table you picked.
foreign keys there, and reading the existing schema from there. It also applies the blueprint's
database, which it previously ignored entirely.
staging runsagainst staging.
.xlsx) wherever CSV was already offered β one-off exports andscheduled jobs, from both MongoDB and SQL sources, with the same field mapping, progress,
pause/cancel and resume you already had.
no more memory than small ones, and a source with more rows than a sheet can hold continues onto
further sheets rather than stopping at the limit.
into a string.
MCP shipped last release as a first cut. This release roughly doubles what an assistant can do with
it, and fixes the thing that annoyed everyone first.
now survives a restart.
the index manager, table statistics, create-table, the view and procedure managers, and the rest.
It can also ask which kinds of panel this build offers.
collections in a Mongo one, read one table's columns, types and keys, and pull a handful of real
rows.
stages already in it, editable, rather than pasting text at you.
the jobs inside it, set a schedule, and read or adjust the run queue's settings.
pre-filled as far as it can get.
save, export (as DDL and more) and delete saved diagrams. Deleting removes the drawing only, never
a table or a collection.
writes to a database, so it has its own permission switch, separate from comparing.
just like Settings β Appearance.
engine and types the host, port, database and user. The form shows a banner saying an AI agent
filled it in, and nothing is stored until you check it and press Save. A password it passes goes
into the form's password field only. It is never stored, logged or read back.
connection's name in the breadcrumb, the right engine (a MySQL or ClickHouse tab no longer
generates PostgreSQL), and the schema it asked for. A SQLite table no longer opens blank.
lives in another window, the assistant hears that. Before, it was told the panel had opened.
"let it arrange my tabs" can never become a way around "don't let it look at my data".
status bar say so instead of offering a switch. If you downgrade with MCP switched on, it shows as
off, and your setting comes back when you upgrade again.
refused for the same reason the screen would refuse it.
rows had come back; the tab never heard about it. Stop did nothing for the same reason. Fixed β
and it also fixes the rarer case of the same freeze on a fast connection to any engine.
level, with sensible limits so a deeply nested document does not produce a thousand columns.
They were reachable only by right-clicking before. A read-only result or a view still exports β it
just cannot be written to.
no database picked had Run, Run All and Run at Cursor greyed out, even though the query would run
fine against the connection's default database. They are enabled now. Saving DDL still asks for
a database.
that was explained and the engine's raw plan output, and copy either with one click.
_id, orwith a null or compound one (a $group, say), used to share one identity: expanding a field on
one row expanded it on every row, and search jumped to the first document instead of the match.
the engine's own syntax error; the plan now renders like any other engine's.
right-click menu, and the Task Manager shows just that task or folder.
Esc exits.
position counter (3 / 12).
task or folder you had open, your search and your scroll position.
that clicking reverses it.
scrolling a long dropdown.
used to do nothing. It now names the missing fields and highlights them. The test result also
scrolls into view, so a failure is never hidden above the fold.
(30).
get a generic database icon.
track beside the table.
until they were reloaded.
everything else.
insert/update/delete confirmations in the bottom-right corner can be read at a glance.
laid out so the state of the cluster reads at a glance.
written per engine, so a new engine's internal schemas are recognised without a code change and a
user schema is never hidden for having an unlucky name.
Server, so schema-related behaviour is exercised rather than assumed.
virtual keys (including a guard that keeps a nominated key out of anything that reports what the
database says), export writers and the SQL type layer, including tests that run against the real
SQLite, DuckDB and ClickHouse engines.
machine that has only the previous driver cached can still select it on the connection.
without it, connections open and the tree browses fine but every query fails.
grouping works until you reload and then silently resets.
versions do not know the new type and may fail to load your connection list. This version and
later read an unknown type as MongoDB instead.
the MCP settings say so.
Release Date: September 22 2026
Covers 1.0.2355 β 1.0.2361.
$lookup Joins With let and pipeline Now RunIf you wrote a $lookup with let and pipeline, VisuaLeaf would not run it. MongoDB rejected
the stage as invalid β even though the exact same pipeline worked in Mongosh, Compass and Studio 3T,
and even though VisuaLeaf's own Query Code tab showed it back to you correctly. This release fixes
that, and adds proper builder support for those joins so you don't have to hand-write them at all.
Also shipping: an experimental MCP server that lets an AI assistant drive the app, and a round of
licensing fixes that end the wrong padlocks and the hourly pop-up.
$lookup Is FixedOnly the plain four-key join β from, localField, foreignField, as β ever reached the server.
Anything else you put in a $lookup was quietly dropped on the way out.
$lookup with let and pipeline now runs. Previously the stage was stripped down tofrom and as before being sent, and MongoDB refused it with *"$lookup requires either 'pipeline'
or both 'localField' and 'foreignField' to be specified."* Valid syntax, reported as invalid.
you actually wrote, so there was no way to see that something different was being sent.
$lookup survives too β the stage is now passed through as writtenrather than rebuilt from a fixed list of keys.
$lookup used to mean one thing in the builder: match a local field against a foreign field. Anything
more β filtering the joined side, joining on two fields, comparing values across the join β meant
dropping out to raw JSON.
there as $$variable.
it, reshape it β with field autocomplete drawn from the joined collection, not the source one.
optional and are labelled as such, so a join driven purely by an expression is a first-class option
rather than a workaround.
when you run the stage.
VisuaLeaf now speaks MCP, the protocol assistants like Claude use to work with an application. Rather
than describing your data to an assistant, you let it open the panel and look.
This is experimental. It is a first release, the tool set and the permission groups will change,
and we'd rather you try it on work you can afford to redo than on anything critical. Feedback is very
welcome.
made, and how many windows are connected.
Copy for Claude button that hands over a block you can paste straight into your assistant's
config. The token is hidden behind an eye toggle until you want to see it.
the assistant is actually doing something β so you can see a tool running rather than wondering why
a panel just changed. Click it to switch the server on or off from anywhere in the app.
tasks (modify), charts, and files β each showing what it covers and how many tools it contains.
window or a popout β then focus, move, or close them.
a query that is taking too long.
list them, see which have an open session, connect one on demand, and list databases.
task folders, and check the run queue.
β a group you switch off disappears from the assistant's tool list entirely, and if it tries anyway
it is refused with the name of the switch you'd need to turn on.
client can connect.
enables MCP never has a token file at all.
as β it can't delete a colleague's work.
For anyone on a free or lapsed plan, the app had started to look broken β greyed-out tiles, padlocked
sidebar icons, and a dialog reappearing every hour. That's fixed.
features it includes are genuinely unlocked.
when you need it, since activation and the offline options live inside it.
the whole window's workspace into a state where nothing was saved from then on β while the app still
reported All changes saved β and every tab in that window was lost on the next reload.
change in future versions.
nothing is exposed until you turn it on.
off when you're not using it.
Release Date: September 17 2026
Covers 1.0.2351 β 1.0.2354.
A small release: one convenience in the grid, plus licensing fixes.
Every MongoDB ObjectId carries the moment it was created, in its first four bytes. VisuaLeaf now
reads it out for you: hover any _id and the tooltip tells you when that document was minted and how
long ago that was. No shell, no conversion, no copying the hex somewhere else.
An ObjectId is not a random 24 characters. The first four bytes are a Unix timestamp β the second the
id was generated β which for most collections is also when the document was inserted. That has always
been true and has always been invisible unless you went and decoded it yourself.
full date and time, and a dimmer note saying how long ago that was.
the behaviour is the same wherever you meet an id.
ObjectId from a live query, the{$oid: "β¦"} form you get from extended JSON, and a plain 24-character hex string pasted in from
somewhere else.
characters but decodes to 1974 or 2140 is far more likely to be a hash or a random key than an id,
so the line is simply left out rather than asserting something wrong.
This rides on the cell tooltip introduced in 1.0.2350 β the one that shows you a readable preview of
a clipped value on hover, with Open in popup for the whole thing. The creation time is another fact
on that same tooltip, next to the value itself.
A hotfix to licence handling. Plans, trials and their end dates are now applied consistently across
the app.
If you were on 1.0.2352 or 1.0.2353 and saw features unexpectedly unavailable, updating to 1.0.2354
resolves it. Nothing on your machine or your account needs repairing.
Release Date: September 14 2026
This one is full of the small things you hit every day. **Results open in the view you actually
want β set it once, or let VisuaLeaf notice and offer. Hover any grid cell and read the whole
value, instead of right-clicking a clipped ellipsis into a panel. Follow a foreign key from
anywhere you see one**, in the tree as well as the grid, into a tab beside the one you came from
instead of a screen sliced in half. And the Visual Shell opens straight away on TLS connections
rather than sitting on "Starting shell sessionβ¦" for a minute.
Alongside those: schema diagrams gained a text side β paste DBML or JSON Schema and watch the
diagram build itself, edit the diagram and watch the text follow. Verify Schema works, in both
directions and with counts you can trust. **Every import and export now reports what actually
happened**, so a run against a server that is down fails in seconds instead of finishing green an hour
later. And a computer that is never allowed online can now be activated, by carrying a short code
to any device that has internet and a token back.
Also shipping: bring-your-own AI endpoint, a cleaned-up MongoDB index manager, saved SQL queries that
reopen with their builder intact, and a long list of SQL fixes across PostgreSQL, MySQL, Oracle,
SQLite and DuckDB.
Some computers are not allowed to reach the internet β a workstation on a regulated network, a machine
in an isolated lab, a laptop behind a proxy that swallows everything. Until now those computers could
not be activated at all. You can now activate any computer without it ever connecting.
a short block of text that describes the computer and can only be read by the licence server β with
Copy and Save as file⦠next to it.
Before you activate, one line tells you exactly what will happen: the plan, the date it is valid
until, and that it is for this computer. If the token is for another machine, or is a server licence
pasted by mistake, it says so in words and the Activate button stays off.
days are left, and offers Re-activate offline when the time comes.
It reads the code you paste, shows the machine it came from, tells you how many of your machine
activations are in use, and hands you the token β on screen, as a download, and by email with a.vlic attachment. Offline machines are marked in the list with the date their token runs out.
file. Carry it to any device that is online.
machine offline**. Paste the code, confirm, and copy or download the token. It is also emailed to you.
click Activate. That's it β the computer never needs to connect, not now and not later.
A few things worth knowing:
waiting on a connection that is not there β not even on startup.
month before it runs out VisuaLeaf reminds you, and the licence server emails you too. Renewing is
the same three steps and does not use up another machine activation.
Nothing is deleted.
The original computer keeps working until its token runs out.
There used to be four situations where VisuaLeaf told you it was "running as Community Edition" and
then locked everything, including the Connection Manager: a fresh install behind a firewall that had
never reached the licence server, a licence that had lapsed, an offline token that had run out, and a
build newer than your update window. All four now give you a real free tier β connections, shell,
queries, aggregation, table and tree views, saved queries and scripts, inline editing and the rest of
the Free plan β instead of an empty app with a banner on it.
Starting a trial got shorter too: **click the link in the verification email and the trial unlocks by
itself**, a few seconds later, without coming back to the app to press a button. You can close the
"check your inbox" screen and it still works.
The schema designer gained a text panel beside the canvas, and the two stay in step with each other.
relation, rename a field β the text updates as you go.
what gets removed, blue for what changes. Syntax errors are pointed at the line, and the message
waits for you to stop typing rather than flickering on every keystroke.
flagged when a relation points at a card that isn't on the canvas any more, or at a card you've
hidden. Click a row and the canvas frames that relation.
relationships between them, laid out for you.
another tool.
text says the same thing.
Relations drawn between cards are also more accurate now, and the relationship detector no longer
proposes matches it can't back up.
Checking a collection against its JSON Schema now works β and gives you an answer you can trust.
and the ones it accepts, without touching the query. Each side is asked of the whole collection
rather than the page you are looking at, so the counts and paging are real.
schema returned an error instead of results. Fixed β both directions run.
genuinely failed the schema, the not-matching list quietly returned all of them. The worst kind of
bug: the query succeeded and returned rows, so nothing looked wrong. Fixed.
you are reading them, and a field the schema requires but the document doesn't have is marked on the
document itself β previously a document rejected for a missing field looked perfectly fine.
A mongodump task whose server was down used to run for a full minute and finish **Completed, with a
green badge and an 80% success rate**. That whole family of dishonest outcomes is gone.
no longer wears the same badge as one that didn't. The failed pieces are listed by name.
connection and the host β instead of grinding through the whole job first. This now covers MongoDB,
every SQL engine, and S3-compatible storage.
timeline and lowers the success rate rather than disappearing into the green.
.sql files in this folder", "this cluster has no user databases") and a hint on how to fix it.
Empty upstreams are legitimate in a chained pipeline, so the run still counts as finished β it just
isn't silent about it any more.
halfway.
build could name a source or target this build doesn't know, and that single row made every export
screen fail to load β and keep retrying every few seconds. Now it costs that one job, which shows an
unknown target you can re-pick, and everything else loads.
once it has finished. A failure halfway through no longer overwrites last night's good export with
tonight's truncated one β that goes for CSV, JSON, SQL scripts, SQL dumps and MongoβSQL exports.
of being dropped and re-imported.
data generator all take a schema now, and the picker remembers what it already loaded instead of
re-fetching every time you open it.
(GitHub issue #32) Settings β AI now takes a provider you point at yourself: **base URL, model id and
API key**. There is one entry per wire format rather than one per vendor β
a third-party gateway, or an enterprise install.
Paste the URL in whichever form your provider publishes it β with or without the trailing /v1, both
work. (This also fixes Grok, which was hitting a doubled path and failing.) Where a gateway renames the
models it serves, two dropdowns let you override how requests are shaped instead of leaving VisuaLeaf
to guess from the model name. Ollama takes an optional API key for setups behind an authenticating
proxy, and existing AI settings keep working untouched.
A provider with no API key is no longer reported as unconfigured. The AI Assistant toggle read
"AI Assistant (Not configured)" with a greyed-out icon while the assistant beside it was happily
answering from a local model. Ollama has no key and a self-hosted endpoint needn't have one; both now
show as configured.
in the table grid β and the tree is the default view β so on a fresh install right-clicking a column
badged FK offered nothing at all. (SOZO-1505)
in half for what is a lookup. (SOZO-1455)
fk_customers (id=3) β so you canhold two rows of the same table side by side. Following the same key twice focuses the tab you
already have rather than piling up duplicates.
ON DELETE / ON UPDATE on an existingkey, add or remove column pairs on a new one, and see modified fields ringed before you save.
raw driver error. If an operation does hit a permissions wall, you get a sentence you can act on
instead of Access denied for user 'x'@'%' to database 'y'.
disagreed about which system schemas to hide. They now use one rule, so every schema listed is one
that opens.
jsonb in the SQL editor renders as a document you can expand, not as a three-field wrapper withyour JSON trapped inside as an escaped string. The editor, the table browser and row comparison now
read values the same way, so the same column no longer shows two different answers in two places.
This covers PostgreSQL and every Postgres-family engine β Neon, Supabase, Timescale, Citus,
CockroachDB, YugabyteDB, Redshift, CrateDB, QuestDB and the rest. (SOZO-1495)
DuckDB file in the tree, export pre-flight, the export run itself and Test Connection all failed
against that same file with "Can't open a connection to same database file with a different
configuration" β for the rest of the session.
reopen labelled Postgres and generate Postgres-dialect SQL.
than a same-named table in the connection's default schema β or nothing at all.
the tab opening on bare SELECT text with an empty builder. Queries saved before this release open
exactly as they did.
close on Escape, and lock the page behind them like every other dialog in the app.
manage, so the page opened on zeroes and every button on it failed.
Every control across the columns, foreign keys, indexes, partitions, triggers and constraints tabs β
and the create-table form β now sits on one size, one type scale and one surface. A single row used to
mix a 22px pill, a 28px button, a 29px input and a 30px select. The forms also follow the UI font you
picked in Settings β Appearance, which they previously ignored.
"Starting shell sessionβ¦" for up to a minute on a connection the dashboard opened instantly; the
shell now opens with the same settings as the rest of the app β your custom CA, self-signed
certificate or client certificate included β and stops making two round trips it never used. On an
unreachable host, use <db> went from six seconds to a few milliseconds.
time; the tab just had no way to say so.
find() filters keep their BSON types. A filter matching on a date, an ObjectId or aDecimal128 inside an object value used to lose the type on its way to the server and silently match
nothing.
Everyone has a view they always end up in. VisuaLeaf now lets you say so β or works it out and offers.
there: collections, SQL tables, queries, aggregation previews and shell results, in the main window,
in a popout, in Electron. One setting, every entry point.
whether to make that your default.
flipping between Tree and Table all day never triggers it β one switch somewhere else resets the
run. Say no and it waits much longer before asking again; say no twice and it stops asking for good.
Say yes and it never holds that against you: the next suggestion starts fresh.
(GitHub issue #33) The Create Index screen no longer lets you get stuck, and no longer accepts input
it then silently ignores.
field name, a duplicate index name, an invalid TTL β instead of leaving you to guess.
you've been in it or once another row is filled in, so an untouched form is never shown as an error.
looking clickable and doing nothing.
e used to be accepted and then quietlyproduced an index with no TTL at all; scientific notation, decimals and minus signs are now
refused at the keyboard, and pasting "3600 seconds" keeps the 3600. Values over MongoDB's ceiling
(about 68 years) and negative values are rejected with a message.
readable before you commit. A TTL of 0 explains itself too: documents expire at the time held in the
indexed date field.
with an ellipsis, so a long string or a nested object could only be read by right-clicking into a
panel. The tooltip now carries the full value, the hint that used to live in the browser tooltip
("Double-click to edit"), and a link that opens the value in the viewer. It appears where your
cursor is, after a short pause, and doesn't slow the grid down while you sweep across it.
every value you open from the table it was docked from β click down a column and read each one in
place.
two documents side by side.
confirms, instead of some engines confirming and others going quiet.
.sql and .redis files are read as scriptsrather than being run through a JSON parse, the wording tells you which file types this dropdown
takes, and an imported report.sql is saved as "report" instead of "report.sql".
and the rest β and pick the engines you want to see. The count becomes "2 of 5" so you always know
you are looking at a filtered list rather than an empty one.
opening the manager first. Works for MongoDB, Redis and SQL, and each opens on its own form.
Connections an administrator has made read-only don't offer it, rather than opening a form that
then refuses to save.
the reason, instead of a red badge and nothing else.
rows that can't tell the difference.
figure β and a total the server genuinely doesn't know is no longer displayed as an empty collection.
collapsed to one character per line and the Value and TTL headers overlapped; the table now scrolls
sideways instead. (SOZO-1487)
always ships the matching viewer, so an upgrade can't break it again. (SOZO-1514)
on its final row.
new". (SOZO-1248, SOZO-1513)
without a new build.
checks, atomic file writes, restore resume, SQL value conversion, Oracle schema filtering, custom AI
endpoints, DBML and JSON Schema import/export, and end-to-end coverage for licence activation and
foreign-key navigation.
not need to re-enter anything.
itself, the history and the task list all show the new outcome correctly.
JSON view offers nothing to right-click.
Release Date: September 1, 2026
Alongside those: follow a foreign key to the row it points at, a one-click SQLite sample database, connection URLs that are finally correct for every engine, and a filter on the connection tree so a connection with twenty-one databases isn't twenty-one rows.
jdbc:postgresql://localhost:0//path/demo.duckdb, and both export buttons left the jdbc: off entirely. H2, Derby, Firebird, DB2 and the MySQL family were mislabelled too. There is now one builder behind all three, and the connection info dialog asks the server for the URL rather than assembling a plausible-looking one.Reopening the app rebuilt your tabs from two separate lists that had drifted apart. Ten kinds of tab were missing from one of them, so they came back as a Welcome page β with no error and no warning that anything had been lost: Blank, Group Management, Mongo Schema Viewer, Monitor Stream List, Redis Security, SQL Create Table, SQL Events, SQL User Management, User Management List and Web User Management.
There is now one list, so the tab you saved is the tab you get back β and a new kind of tab can't quietly go missing from it again.
admin, config and local; now you choose which ones to see. The MongoDB tree gains the filter the SQL tree already had.Release Date: August 30, 2026
Alongside those: a row editor that holds your work when the database says no, foreign keys that finally appear on DuckDB, table metadata that stops mixing up same-named tables in different schemas, and a rebuilt naming pass for Generate Mock Data β including credit-card, IBAN and BIC values that pass a validator.
Both the MongoDB and SQL builders now expand out of their side panel and take the whole workspace β one button, and the panel slides into its new shape rather than jumping there.
VisuaLeaf could only ever address Oracle one way: as a service name. A database that answers to a SID was unreachable, and so was a SQL Server named instance. Both are now first-class, alongside a mode for typing your own JDBC URL.
| Engine | Modes |
|---|---|
| Oracle | Service Name (default), SID, TNS Alias, TNS Descriptor |
| SQL Server | Port (default), Named Instance |
| Every host-based engine | Custom JDBC URL |
tnsnames.ora or a descriptor pasted straight in.ORA-12514.Existing connections are untouched: a connection saved before this release dials exactly the URL it always did.
This is the big one. Start a script that takes a few minutes, switch to another tab while it works, and everything it produced after you left was gone: no output, no result tabs, and a console that came back empty. The script itself carried on running on the server β the app simply stopped listening to it, so the only way to see a long run through was to sit and watch it.
The other one worth naming. Typing a query into the MongoDB query field, you could watch characters vanish about a second after you paused β most reliably by typing {}, then a quote, and seeing the quote disappear.
The field and the visual query builder keep each other in step, and the builder was answering with a snapshot of what the field held roughly a second earlier. Anything typed in the meantime was overwritten by it. The longer you thought between keystrokes, the more reliably it bit.
A set of fixes for things the app reported confidently and wrongly on engines where one database holds many schemas.
customers on a database that has one in main and another in retail produced a card with six columns for a three-column table, mixing both. This ran through the table card, "add this table" on a diagram, the query builder, the row editor, the foreign-key preview and the table context the AI reads.Foreign Keys (0) in the connection tree, an empty Foreign Keys section, no relationship lines on a schema diagram, and "Relinked 0 foreign key(s)" from a button you pressed precisely because the keys are there. They're now read from DuckDB's own catalogue.ORA-00942: table or view does not exist with no indication of which operation produced it.name used to produce random text. Every person rule was anchored to a compound β first_name, full_name, company_name β and the plain case was never written. It now maps to a full name, without stealing the compounds' own generators.tnsnames.ora from the machine running VisuaLeaf, not from the database server β point the mode at the folder holding that file.Release Date: August 24, 2026
postgres and a user called admin β four wrong hints on the one screen where you're deciding what to type. Every engine now shows its own: MySQL reads mysql://user:pass@localhost:3306/mysql, SQLite shows a file path, Materialize its own port. Where an engine has no conventional login β Azure SQL, Azure Database for PostgreSQL, SQLite β the box is simply left empty rather than borrowing another engine's. Fixed on the New Connection screen and the older connections dialog alike. (SOZO-1437)-Crucial Bug on License Resolved.
Release Date: August 23, 2026
Alongside those: customisable keyboard shortcuts across roughly 180 commands, a rebuilt mock-data generator, folders in every saved-items library, a dockable Data Viewer, in-place row filtering in every grid, multi-line MongoDB queries with Shift+Enter, a much faster export pipeline, a smoother connection tree that now shows Supabase, Neon, Aurora and the other managed services by their own logo, and a 70 MB smaller app.
There's also a set of fixes for numbers the app used to report that were simply not true, and the Notes at the end matter this time β every saved diagram is rewritten on first launch, and SQLite now enforces foreign keys.
Continuous replication between any pair of MongoDB and SQL connections β PostgreSQL, MySQL/MariaDB, SQL Server and Oracle β in any direction.
Speed, measured on one machine before and after: transformation scripts went from 1,993 to 17,326 documents/second, and with a 5,000-row lookup from 46 to 14,233 documents/second. Target writes went from 1,134 to 26,051 documents/second. The initial copy is now split across threads rather than running down one cursor. Refreshing a list of 50 sync jobs went from 601 server round-trips to 4.
Job limits are now checked when you save the job, so an unworkable configuration is refused while you're still looking at the form.
.neon.tech URL lands on Neon rather than generic PostgreSQL. SQL Server, Oracle and DuckDB URL shapes that the product's own output used to reject now parse correctly.Every create, drop, alter and truncate used to be composed without consulting what the engine could actually do. Now:
An empty blueprint now opens on a chooser with three routes:
Plus links between collections, written as a sentence: "Each orders row stores a key from [customers βΎ] [its primary key βΎ]". You choose the distribution β evenly, clustered, or a few get most, which is what makes a group-by look believable β along with one-each relationships, self-referencing hierarchies that can't loop, two-pass mutual references, and a blank percentage.
A live sample preview updates in a bottom panel while you edit, so a cycle or an impossible unique column surfaces before a million rows are written. Every run finishes with a copyable seed that reproduces exactly the same data. Generating for a whole database now works when you don't pick any collections, instead of silently producing nothing.
A Data Viewer you can dock. Open any cell, row, document or multi-row selection in a floating panel β right-click, or Ctrl/Cmd+Shift+V. In the SQL grid, double-clicking a truncated read-only cell opens it too. MongoDB values render in shell syntax and SQL JSON columns are pretty-printed, with a wrap toggle, Copy, and its own Ctrl+F. It's modeless, so the table behind it stays scrollable and clickable β and if you drag it to the edge of a panel, or use the four pop-out arrows, it becomes a real Data Viewer tab in its own split.
Filter rows in place, in every grid. "Show/Hide Columns" is now "Columns & Filters". Every column gets a condition (=, β , >, β₯, <, β€, contains, starts with, regex, in, exists, is null) and a value box, filtering what's already loaded with no round-trip and no query rewrite. The footer says exactly that: "Showing X of Y loaded rows Β· this page only, query unchanged." Matching mirrors what the cell actually shows β ObjectIds as hex, dates matching both the displayed and ISO forms, SQL NULL cells matching "NULL" β and 64-bit ids compare exactly, so neighbouring Snowflake ids stay distinguishable. Your filters survive a restart with the tab.
Multi-line queries in MongoDB. Press Shift+Enter in the query field to add a line, the same way Compass does β Enter still runs the query, so the muscle memory you already have is untouched. As soon as there's a second line the query bar reflows: the editor gets its own full-width row with the Run cluster and actions moving up into a header strip above it, and it grows as you type. Delete the newline and it slides back to the single-line bar. Formatting a long $or or a nested $elemMatch across several lines no longer means squinting at one long strip.
Oversized results warn instead of freezing. A raw view over too many documents now says "Too large for the BSON view β this result holds 12,500 documents, past the 500 this view renders at once" with a Display anyway button. It used to freeze the app with no warning.
Queries, Scripts, Charts, Dashboards, JSON Schemas and Visual Schemas now look and behave identically. Every capability below is on all six, where each previously had a different subset:
The whole export pipeline was measured and reworked.
0 B / 5.23 MB at 0% β document counts were being formatted as bytes β and then reach 100% while three collections were still running. It now counts the right thing and shows real bytes written and observed MB/s.A recurring theme this release: several readouts were confidently wrong, and are now either correct or honest about not knowing.
Shared by the MongoDB collection view, SQL query and table results, aggregation results and the Redis key browser.
WHERE clause used to offer table names and not one column of the table being read.history and showing "Last run Β· N runs Β· starred". Picking one stays undoable.if (count) behaves correctly on an empty collection. Counts arrived in JavaScript as objects, which are truthy even at zero, so a script checking "did I find anything?" took the wrong branch. sleep() works, autocompletion no longer blocks on a slow cluster, and two errors logged on every shell open are gone.reporting.orders silently and successfully dropped public.orders instead. This is the most serious fix in the release.aggregate() run from the shell had every ISODate(...), ObjectId(...) and regular expression in its pipeline flattened to plain text before it reached the server β so {$gt: ISODate("2026-01-01")} compared text against a date field and came back with zero rows and no error, and a $not: /β¦/ was rejected outright. The shell now sends exactly what the aggregation builder sends, and the pipeline keeps its types through paging and through closing and reopening the workspace.$match was flattened to plain text, so the restored pipeline compared text against a date field β which MongoDB answers with wrong rows rather than an error. Browser caching masked it, so it only appeared when you opened the same saved workspace on another machine.public.orders and audit.orders sat in the same picker with nothing to tell them apart. The list is now the schema you opened. Engines that have no schemas, and diagrams saved before this, are unchanged.HTTP error! status: 400 instead of the server's actual reason.NOT NULL on columns that previously produced none, which makes materialising match what the diagram's own DDL export was already showing you. MongoDB diagrams are unchanged. The migration is safe to repeat and retries on the next launch if it fails.ON DELETE CASCADE and similar rules were previously inert and now fire, so a delete or a drop can empty a table you did not name. Nothing about your existing data is altered or checked on upgrade β but the next time you write, some things will be refused and some will do more than they used to.aggregate() in the shell, switch the results to Explain, and the plan describes no stages rather than the ones you ran. The results themselves are correct, and explaining the same pipeline from the aggregation builder is correct β only the shell's Explain tab is affected. A fix is queued.Release Date: July 30, 2026
This release is mostly about the app you use every day β the grid, the sidebar, the editors, the dialogs β getting faster, tidier, and more consistent. The things you'll feel first:
Also shipping: Deploy MongoDB (BETA) β stand up and run a standalone server, replica set, or sharded cluster on your own cloud accounts, servers, or Docker β Redis as a first-class connection type (BETA), and backups and exports straight to S3 / Cloudflare R2.
Binary and UUID values in rare cases; every path now reads them the same, correct way.CREATE, DROP, or ALTER in the editor and the connection tree refreshes itself; you don't have to reconnect to see the new table.A broad styling pass β the dialogs and editors you live in every day were brought up to the same modern standard, instead of each one looking like the year it was written.
A diagram doesn't have to stay a drawing. Materialize takes the schema you designed and builds it for real, on the connection and database you point it at.
CREATE TABLE statements.A new Deploy MongoDB launcher creates and runs MongoDB for you, and a Cluster tab manages each deployment afterwards. It works the same whether the machine is a cloud VM you've never logged into, a server you already own, or Docker on your laptop.
Deployments survive an app restart, and the deploy and cluster screens are ordinary tabs, so they can be split and popped out like anything else.
Redis now behaves like every other connection: add it from the connection manager, see it in the sidebar with its own logo, and open activities against it.
session:* without scanning by eye. Values open in a proper editor: a form view for simple values, a code view for JSON, and per-type editing for hashes, lists, sets, and sorted sets (with member and score fields).ObjectId, Decimal128, dates, and binary fields survive round-tripping instead of being re-parsed from text.ObjectId(...) and friends._id to a different name with "include unmapped fields" turned off used to produce rows with no key at all; the key now follows the mapping (SOZO-1329).+ button, or the command palette now behaves identically, and each one only offers what the connection actually supports.Looking for the latest version?
Go to Downloads