Start Pro Trial
37 Releases

Release History

Track all versions, updates, and improvements to VisuaLeaf.

v1.0.2416

Latest
October 1, 2026

VisuaLeaf v1.0.2416 Release Notes

Release Date: September 30 2026

Covers 1.0.2362 – 1.0.2413.


Headline: A Real Query Profiler, Tab Groups, a Faster Data Grid, Editable Tables on Four More Engines

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 Query Profiler, Rebuilt

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?

What you can see

  • One row per query, not per execution. Group by operation, by query shape β€” the same query with
  • 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.

  • Counts that mean what they say. "Count 368" means 368 operations happened, not "368 is as many
  • as we managed to download". The totals are computed across everything that matched your filter.

  • Collection scans flagged. Any query group that scanned instead of using an index is marked, and
  • a scan-efficiency figure shows how much of what was read got returned.

  • An index suggestion per group β€” with the number of queries it would help, so you see *"47
  • queries need this index"* instead of 47 separate warnings.

  • A scatter plot of time against duration, coloured by collection and operation. Click a point to
  • open the full query behind it.

  • Stable colours. A collection keeps its colour when the time window changes, when a new
  • namespace appears, and between the chart and the table below it.

  • A clear empty state. If profiling is off, the panel says so and offers to turn it on rather
  • than showing you a blank screen.

What you can do

  • Filter by collection, operation and time window β€” the chart and the table always agree,
  • because they are built from the same filter.

  • Drill into a group and see the real operations behind it, including the raw profiler entry.
  • Set the profiler level, the slow threshold and the sample rate from the panel, without the
  • shell.

  • Watch what is running right now and kill a stuck operation in one click.

Tab Groups

The tab strip was flat, and a workspace with fifteen tabs across four connections read as fifteen
unrelated things.

What you can do

  • Organize automatically. The tab strip's β–Ύ 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.

  • Or group by hand. Right-click a tab β†’ Add to New Group, then rename it, give it a colour, and
  • drag other tabs in. Custom groups and automatic grouping coexist; switching between them loses
    neither your colours nor which groups were collapsed.

  • Collapse a group to a single β–Έ Name (n) chip. Pick a tab from the dropdown that lives inside
  • a collapsed group and it expands itself to show you.

  • Move a whole group. Drag the header and the entire block lands where the indicator showed, in
  • its original internal order. Drag it out of the window and the whole group pops into a window of
    its own, still grouped.

  • Close or pop out a group from the header's hover buttons, or Ungroup and keep every tab
  • open.

  • Everything survives a reload and a restart β€” the grouping, the collapse state, the colours and
  • 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.


A Faster Data Grid

Both the MongoDB table view and the SQL grid were rebuilt for scrolling, and the tree view got the
same treatment.

  • Up to 6Γ— faster scrolling on wide tables. Scrolling sideways across 150 columns used to cost
  • about three frames per step. It now fits in one.

  • Fast scrolling fills in as you go. A quick fling down a big table used to leave most of the
  • 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.

  • Reordering columns no longer lags on tables with many rows on screen. Holding a column still
  • over the header costs nothing.

  • The tree view scrolls smoothly on large result sets. Scrolling through thousands of documents
  • no longer stutters as rows come into view.

  • Resizing rows is smooth. Dragging the row height used to redraw every cell for every pixel
  • the mouse moved. It now keeps up with the pointer, even on a full screen of data.

  • Resizing a column no longer draws the table's right border through the last column.

Table Management Is Now an Editor β€” SQLite, DuckDB and ClickHouse

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.

  • DuckDB β€” add, drop, rename and retype columns, change nullability, defaults and comments,
  • rename the table.

  • SQLite β€” the same editing surface, on an engine whose own ALTER TABLE does not have most of
  • these operations. Existing indexes, triggers and views are preserved through the change, and a
    failed edit leaves the original table exactly as it was.

  • ClickHouse β€” column and table changes, comments and check constraints. A **type change is
  • 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.

  • What an engine cannot do is greyed out with a reason β€” primary keys, foreign keys, partitions
  • β€” instead of being offered and then rejected.

Editing rows on tables with no key

  • Nominate the columns that identify a row. For a table the engine gives no primary key for β€” a
  • view, a Snowflake table, a ClickHouse MergeTree β€” you can tell VisuaLeaf which combination of
    columns identifies a row, and the grid becomes editable.

  • The dialog is honest about what you are promising. Nothing validates uniqueness; if the
  • 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.

  • A nominated key is never presented as a real one. Export jobs, ERD diagrams, mock-data
  • generation and schema views keep treating the table as keyless, so nothing silently starts
    building upserts on a promise.

  • On a shared connection, only someone with write access can nominate a key. Everyone who
  • edits through that connection relies on it, so a read-only collaborator cannot set one.

Undo on grid edits

  • Ctrl/⌘-Z after a cell edit, an insert or a delete now reverses it against the database.
  • Editing a primary key column and then undoing works β€” the revert targets the row where it
  • actually is now, not where it used to be.


Snowflake

  • Snowflake is a selectable connection type, with its tree, metadata, query execution, explain
  • and table editing wired through the same paths as every other engine.

  • A fresh Snowflake connection shows your databases, not the account's internals. Snowflake's own
  • ~20 internal schemas no longer fill the tree ahead of your data.

  • Snowflake has its own logo in the engine picker, the connection lists and tab breadcrumbs,
  • 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, and Recognising Which DocumentDB You Have

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.

What you can see

  • Compatibility warnings that match your engine. Index types, pipeline stages and collection
  • 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.

  • A clear answer where a feature cannot work. Microsoft DocumentDB has no profiler and no server
  • metrics, so the Query Profiler and server monitoring explain that up front instead of showing an
    empty screen.

  • Each DocumentDB has its own logo in the connection lists, the engine picker and tab
  • breadcrumbs.

What you can do

  • Pick Microsoft DocumentDB in the New Connection form's engine picker.
  • Let the app notice for you. Microsoft DocumentDB, Amazon DocumentDB, MongoDB and Cosmos DB
  • 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.

  • See it in Test Connection too. If the server or its hostname doesn't match the type you picked
  • in the form, the result says "This looks like …" with a one-click Switch button.

  • Nothing changes without you. Other Mongo-compatible servers are never mislabelled, and a type
  • you chose yourself is never questioned.


Guided Tutorials

  • A Tutorials playlist listing every guided tour the app ships, with how many steps each one
  • takes and which ones you have already finished.

  • Tours coach rather than drive. A step that teaches an action waits for you to do it and then
  • 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.

  • The app gets out of your way. A tour opens the sidebar and expands the tree to whatever it is
  • about to point at, so you are never hunting for the thing being explained.

  • The Getting Started window is clearer. It has two paths side by side: Explore a demo (a
  • 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.

  • Tutorials for features your plan does not include stay visible, marked, so you can see what
  • exists rather than concluding it does not.


Schemas, Everywhere They Were Missing

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.

  • SQL scripts remember their schema. A new editor asks for it, keeps it, and autocompletes
  • against it.

  • Tasks, Export Data and Import Data address a table as connection β†’ database β†’ schema β†’ table.
  • An export that used to quietly read public.customers now reads the table you picked.

  • The Mock Data generator writes into the schema you chose β€” creating the tables there, pointing
  • foreign keys there, and reading the existing schema from there. It also applies the blueprint's
    database, which it previously ignored entirely.

  • Sequences and Procedures are schema-scoped rather than showing everything on the connection.
  • The SQL query builder qualifies tables properly, so a query built against staging runs
  • against staging.


XML and Excel Export

  • Export to XML and Excel (.xlsx) wherever CSV was already offered β€” one-off exports and
  • scheduled jobs, from both MongoDB and SQL sources, with the same field mapping, progress,
    pause/cancel and resume you already had.

  • Excel gets real cells, not text. Numbers sort and sum, dates are dates. Very large exports cost
  • 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.

  • XML keeps your structure. Sub-documents and arrays nest as elements instead of being flattened
  • into a string.


AI Assistant Control (MCP)

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.

  • The switch stays where you put it. Turning MCP on β€” and, more importantly, turning it off β€”
  • now survives a restart.

  • It can open any panel the app has, not the handful that were hand-listed: the JSON Schema tab,
  • 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.

  • It can look at your schema before writing a query β€” list the tables in a SQL database or the
  • collections in a Mongo one, read one table's columns, types and keys, and pull a handful of real
    rows.

  • It can hand you a pipeline to edit. Ask for an aggregation and it opens the builder with the
  • stages already in it, editable, rather than pasting text at you.

  • It can build up scheduled work properly β€” not just create a task, but add, change and remove
  • the jobs inside it, set a schedule, and read or adjust the run queue's settings.

  • It can open the collection stats panel, the create-collection form and the mock data builder,
  • pre-filled as far as it can get.

  • It can work with ER diagrams. It can list, open, generate from a database, edit, auto-arrange,
  • save, export (as DDL and more) and delete saved diagrams. Deleting removes the drawing only, never
    a table or a collection.

  • It can compare two collections and read or show the differences. Applying those differences
  • writes to a database, so it has its own permission switch, separate from comparing.

  • It can change the app's appearance, such as theme, interface font and default result view,
  • just like Settings β†’ Appearance.

  • It can fill in a New Connection form for you. It cannot save one. The assistant picks the
  • 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.

  • Tabs it opens come out right. A SQL table opened by the assistant now has its real name, the
  • 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.

  • It is told what actually happened. If a panel was already open and got focused instead, or
  • lives in another window, the assistant hears that. Before, it was told the panel had opened.

  • Opening a panel that reads from a database counts as reading data, not as navigation β€” so
  • "let it arrange my tabs" can never become a way around "don't let it look at my data".

  • MCP is a licensed feature. If your licence does not include it, the settings panel and the
  • 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.

  • Your plan applies to the assistant too. A tool whose feature your licence does not cover is
  • refused for the same reason the screen would refuse it.


Improvements

SQL Editor & Data Grid

  • SQLite and DuckDB editors no longer freeze on "Execution started…". The query had run and the
  • 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.

  • Expand a JSON column recursively. One action opens the whole subtree instead of its first
  • level, with sensible limits so a deeply nested document does not produce a thousand columns.

  • Import and Export buttons in the toolbar of both the SQL grid and the Mongo collection view.
  • They were reachable only by right-clicking before. A read-only result or a view still exports β€” it
    just cannot be written to.

  • Selecting rows in the SQL tree view reaches the toolbar's batch actions again.
  • Run a SQL script straight from a connection (SOZO-1553). An editor opened on a connection with
  • 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.

  • Explain has Plan, SQL and JSON tabs. Next to the visual plan you can read the exact statement
  • that was explained and the engine's raw plan output, and copy either with one click.

  • Expanding a field in aggregation results expands only that row. Results with no _id, or
  • with 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.

  • Explain works on ClickHouse. Every Explain on every ClickHouse connection used to come back as
  • the engine's own syntax error; the plan now renders like any other engine's.

Tasks

  • Open a task or a folder full screen. Click its name, or use the expand button or the
  • right-click menu, and the Task Manager shows just that task or folder.

  • A breadcrumb walks you back (Task Manager β€Ί folder β€Ί task). Each part goes up one level, and
  • Esc exits.

  • Step through tasks with Previous / Next (Alt+← / Alt+β†’) without going back to the list, with a
  • position counter (3 / 12).

  • The Task Manager remembers where you were. Switching to Monitor or History and back keeps the
  • task or folder you had open, your search and your scroll position.

  • Folder header buttons have proper tooltips. Sort buttons show the current direction and say
  • that clicking reverses it.

  • Choosing a target database type is searchable. Type to filter the engine list instead of
  • scrolling a long dropdown.

Connections

  • Test Connection tells you what is missing (SOZO-1552). With a required field left blank, it
  • 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.

  • The Projects count in the sidebar is right (SOZO-1555). Three projects no longer show as
  • (30).

User Management

  • Connections show their real engine logo in the user management list. SQL connections used to
  • get a generic database icon.

Query Profiler

  • The profiler's scrollbars match dark mode. The desktop app used to show a bright white scroll
  • track beside the table.

Workspaces & Tabs

  • Changing the theme updates every window at once. Popout windows used to keep the old theme
  • until they were reloaded.

  • The data viewer is part of your workspace. Its tabs come back after a reload or a restart like
  • everything else.

  • Panels opened in the background announce themselves instead of looking stuck.

Licensing

  • The trial-expired dialog reads correctly in light mode.

Notifications

  • Quick confirmations are solid coloured pills again. Copy, undo/redo and document
  • insert/update/delete confirmations in the bottom-right corner can be read at a glance.

Cluster & Sharding

  • The sharding and cluster overview screens were reworked for readability β€” the same information,
  • laid out so the state of the cluster reads at a glance.

Query Builder

  • Text in the query builder is sharp again on every zoom level and on high-DPI displays.

Infrastructure

  • System objects are classified from the engine's own metadata rather than from lists of names
  • 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.

  • Test databases for development now seed a multi-schema fixture on PostgreSQL, Oracle and SQL
  • Server, so schema-related behaviour is exercised rather than assumed.

  • Expanded automated coverage across the new engine strategies, tab grouping and drag behaviour,
  • 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.


Notes

  • ClickHouse connections download a newer driver on first connect after upgrading. An offline
  • machine that has only the previous driver cached can still select it on the connection.

  • Snowflake connections pin a compatibility option in their connection string. Leave it in place;
  • without it, connections open and the tree browses fine but every query fails.

  • Tab grouping needs both the app and the backend on this version. Against an older backend the
  • grouping works until you reload and then silently resets.

  • Don't downgrade below this version after saving a Microsoft DocumentDB connection. Older
  • 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.

  • MCP now needs a licence that includes it. A plan without it cannot connect an assistant, and
  • the MCP settings say so.

  • Treat your MCP token like a password. Anyone holding it can drive that window.
Read the full v1.0.2416 release notes

v1.0.2361

September 22, 2026

VisuaLeaf v1.0.2361 Release Notes

Release Date: September 22 2026

Covers 1.0.2355 – 1.0.2361.


Headline: $lookup Joins With let and pipeline Now Run

If 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.


Correlated $lookup Is Fixed

Only 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.

  • A $lookup with let and pipeline now runs. Previously the stage was stripped down to
  • from 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.

  • The error was especially confusing because the Query Code tab was right. It showed the pipeline
  • you actually wrote, so there was no way to see that something different was being sent.

  • Anything else you put in a $lookup survives too β€” the stage is now passed through as written
  • rather than rebuilt from a fixed list of keys.


Correlated Joins in the Aggregation Builder

$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.

What you can do

  • Add let variables. Expose fields from your source collection to the joined side and read them
  • there as $$variable.

  • Add a sub-pipeline. Write stages that run on the joined collection β€” filter it, sort it, limit
  • it, reshape it β€” with field autocomplete drawn from the joined collection, not the source one.

  • Join on more than equality. With a sub-pipeline in play, Local Field and Foreign Field become
  • optional and are labelled as such, so a join driven purely by an expression is a first-class option
    rather than a workaround.

  • Combine both with a plain field join, the way MongoDB 5.0 and later allow.
  • See mistakes as you type β€” malformed let or pipeline JSON is flagged inline instead of failing
  • when you run the stage.


AI Assistant Control (MCP) β€” Experimental

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.

What you can see

  • A new MCP tab in Settings with one switch. It says Running or Off, how many calls have been
  • made, and how many windows are connected.

  • The address, the token, and a ready-made client configuration β€” all three copyable, with a
  • 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.

  • A permanent MCP indicator in the status bar. Dim when off, normal when on, and it pulses while
  • 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.

  • An "Allowed access" list of seven groups β€” UI navigation, read data, connections, tasks (read),
  • tasks (modify), charts, and files β€” each showing what it covers and how many tools it contains.

What you can do

  • Ask your assistant to open things. SQL panels, collection panels, charts, tasks β€” in the main
  • window or a popout β€” then focus, move, or close them.

  • Ask it to run a query and tell you what came back. It can run a panel, read the rows, and cancel
  • a query that is taking too long.

  • Let it work with your connections. Both MongoDB and SQL connections are visible to it; it can
  • list them, see which have an open session, connect one on demand, and list databases.

  • Let it manage scheduled work. List, open, create, edit, chain, schedule and delete tasks and
  • task folders, and check the run queue.

  • Let it build and run charts, and read files from your storage.
  • Switch any group off on its own. "Drive my panels" and "delete my tasks" are separate decisions
  • β€” 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.

  • Turn the whole thing off instantly. No restart. One click in the status bar or Settings and no
  • client can connect.

Worth knowing

  • Nothing is written to disk until you switch it on for the first time β€” an install that never
  • enables MCP never has a token file at all.

  • The assistant cannot grant itself more access, and it cannot stop you switching it off.
  • In server mode, an assistant can only touch tasks and charts belonging to the account it is acting
  • as β€” it can't delete a colleague's work.


Licensing Fixes

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.

  • Community Edition works again. When a paid plan or trial ends you drop to the free tier, and the
  • features it includes are genuinely unlocked.

  • Settings is always reachable β€” it used to lock when no licence could be read, which is exactly
  • when you need it, since activation and the offline options live inside it.

  • The subscription-expired dialog appears once, not every hour.
  • Changing your computer's clock no longer costs you your licence.
  • Trials end when they should β€” a lapsed trial no longer keeps its Professional features.
  • Refresh License in the activation dialog, for a plan bought or renewed on the website.
  • The License Changed dialog reads correctly in light mode.

Improvements

Workspaces & Tabs

  • Popping a tab out and dragging it back no longer quietly breaks saving. A returned tab could put
  • 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.


Notes

  • MCP is experimental in this release. The tools it offers and the permission groups are likely to
  • change in future versions.

  • MCP is a desktop feature and appears in Settings only on the desktop app. It is off by default;
  • nothing is exposed until you turn it on.

  • Anyone holding your MCP token can drive that window. Treat it like a password, and switch the server
  • off when you're not using it.

Read the full v1.0.2361 release notes

v1.0.2354

Critical Update
September 17, 2026

VisuaLeaf v1.0.2354 Release Notes

Release Date: September 17 2026

Covers 1.0.2351 – 1.0.2354.


Headline: Hover an ObjectId to See When It Was Created

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.


ObjectId Creation Time in the Cell Tooltip

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.

What you can see

  • Hover any cell holding an ObjectId and the tooltip now carries an extra line: Created, the
  • full date and time, and a dimmer note saying how long ago that was.

  • It works in all four table surfaces β€” the MongoDB grid and tree, and the SQL grid and tree β€” so
  • the behaviour is the same wherever you meet an id.

  • It recognises the id in whatever shape it arrives: a real 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.

  • Nothing is shown when the timestamp is implausible. A hex string that happens to be 24
  • 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.

Where it fits

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.


Licensing

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.

Read the full v1.0.2354 release notes

v1.0.2350

September 12, 2026

VisuaLeaf v1.0.2350 Release Notes

Release Date: September 14 2026


Headline: Quality-of-Life Release β€” Favourite Views, Cell Previews, Follow Any Foreign Key, and a Shell That Opens Instantly

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.


Offline Activation

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.

What you can see

  • A third tab in the Activate window: Offline. It shows this computer's activation request code β€”
  • 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.

  • A place to paste the licence token you get back, or open it from the file you were emailed.
  • 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.

  • **Settings β†’ Licensing shows an Offline licence line** with the date it is valid until and how many
  • days are left, and offers Re-activate offline when the time comes.

  • **In your licence-server account, Licenses β†’ Device Activations has Activate a machine offline.**
  • 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.

What you can do

  1. On the offline computer, open Activate β†’ Offline and copy the request code, or save it to a
  2. file. Carry it to any device that is online.

  3. On that device, sign in to your licence-server account, open the licence, and choose **Activate a
  4. machine offline**. Paste the code, confirm, and copy or download the token. It is also emailed to you.

  5. Back on the offline computer, paste the token or open the file, check the one-line summary, and
  6. click Activate. That's it β€” the computer never needs to connect, not now and not later.

A few things worth knowing:

  • An offline computer never contacts the licence server again. No check-ins, no telemetry, no
  • waiting on a connection that is not there β€” not even on startup.

  • An offline token lasts up to a year (or until your licence ends, if that is sooner). About a
  • 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.

  • When a token runs out, VisuaLeaf keeps working as Community Edition until you re-activate.
  • Nothing is deleted.

  • To move the activation to another computer, release the machine on the Device Activations page.
  • The original computer keeps working until its token runs out.

  • Offline activation is for the desktop app. Server installs already have their own licence file.

Community Edition Actually Works Offline

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.


Schema Diagrams: Type It or Draw It

The schema designer gained a text panel beside the canvas, and the two stay in step with each other.

What you can see

  • A live text view of the whole diagram, in DBML or JSON Schema. Edit a card, drag a
  • relation, rename a field β€” the text updates as you go.

  • A "what Apply would do" summary before anything happens: green chips for what gets added, red for
  • 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.

  • A Relations panel listing every relation in the diagram, searchable, with a count. Rows are
  • 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.

What you can do

  • Paste a DBML or JSON Schema document and get a diagram β€” tables, columns, types and the
  • relationships between them, laid out for you.

  • Export the diagram back out as DBML or JSON Schema, to share, to check into a repo, or to feed to
  • another tool.

  • Edit either side. Fix a column in the text, apply, and the cards move; move the cards, and the
  • 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.


Verify Schema

Checking a collection against its JSON Schema now works β€” and gives you an answer you can trust.

  • Both questions, one toggle. Switch the result set between the documents your schema rejects
  • 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.

  • "Verify Schema" used to fail outright on the matching side. Asking which documents match the
  • schema returned an error instead of results. Fixed β€” both directions run.

  • "Not matching" used to list the entire collection. In a collection of ~9,000 documents where 259
  • 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 can see why a document was rejected.** Offending fields are flagged in the tree view where
  • 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.


Imports and Exports That Tell You the Truth

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.

What you can see

  • **A new outcome: Completed with errors.** A run that finished but skipped collections along the way
  • no longer wears the same badge as one that didn't. The failed pieces are listed by name.

  • A run that could not reach its source or target fails immediately, in seconds, naming the
  • connection and the host β€” instead of grinding through the whole job first. This now covers MongoDB,
    every SQL engine, and S3-compatible storage.

  • The history charts count it honestly. A run that finished with errors has its own colour on the
  • timeline and lowers the success rate rather than disappearing into the green.

  • A run that had nothing to do says so, in the history, with the reason ("no tables matched", "no
  • .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.

  • Tasks that reference a connection you deleted are called out before the run, rather than failing
  • halfway.

  • One unreadable job no longer takes the whole export area down with it. A job saved by a newer
  • 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.

What you can do

  • Trust the file on disk. An export writes to a temporary file and only replaces the previous one
  • 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.

  • Resume a restore and have it actually resume. Collections that already landed are skipped instead
  • of being dropped and re-imported.

  • Cancel a run and see it as cancelled, not quietly relabelled Completed.
  • Pick schemas, not just databases, for SQL jobs. Export jobs, data-source variables and the mock
  • data generator all take a schema now, and the picker remembers what it already loaded instead of
    re-fetching every time you open it.


Bring Your Own AI Endpoint

(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 β€”

  • OpenAI-compatible β€” anything speaking the chat-completions API: a local Ollama, OpenRouter,
  • a third-party gateway, or an enterprise install.

  • Anthropic-compatible
  • Gemini-compatible

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.


SQL

Foreign keys

  • "Go to referenced table" now appears in the tree view as well as the grid. It used to exist only
  • 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)

  • Following a key opens a normal tab beside the one you came from, instead of splitting the screen
  • in half for what is a lookup. (SOZO-1455)

  • Each hop gets its own tab, named after the key you followed β€” fk_customers (id=3) β€” so you can
  • hold 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.

  • Foreign keys are editable in the table designer. Change ON DELETE / ON UPDATE on an existing
  • key, add or remove column pairs on a new one, and see modified fields ringed before you save.

What the tree offers you can actually open

  • MySQL: a database you have no privilege on is no longer listed, expanded, and then failed with a
  • 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'.

  • Oracle: the tree used to offer 19 schemas and only ever fill 9 β€” the two halves of the tree
  • disagreed about which system schemas to hide. They now use one rule, so every schema listed is one
    that opens.

Values that come back as themselves

  • jsonb in the SQL editor renders as a document you can expand, not as a three-field wrapper with
  • your 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)

  • Fixes for SQLite and DuckDB value handling, and for Neon specifically.
  • Browsing a DuckDB file no longer poisons every later connection to it. Once you had opened a
  • 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.

Saved queries reopen as you left them

  • A saved query remembers which engine it belongs to. A DuckDB, Oracle or MySQL query used to
  • reopen labelled Postgres and generate Postgres-dialect SQL.

  • It remembers the schema too, so the table it addresses is the one you saved it against rather
  • than a same-named table in the connection's default schema β€” or nothing at all.

  • The visual builder comes back with it. Joins, filters and canvas layout are restored instead of
  • the tab opening on bare SELECT text with an empty builder. Queries saved before this release open
    exactly as they did.

Users and roles

  • The SQL user management page's create-user and role dialogs are now proper modals β€” they stack,
  • close on Escape, and lock the page behind them like every other dialog in the app.

  • User & Roles Management no longer appears for SQLite and DuckDB. Those engines have no users to
  • manage, so the page opened on zeroes and every button on it failed.

The table designer

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.


Visual Shell

  • Opening a shell on a TLS connection is fast again. (GitHub issue #31) It used to sit on
  • "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.

  • A brand-new shell no longer says "Not Connected" with Run greyed out. It was connected the whole
  • time; the tab just had no way to say so.

  • Turning a shell session off works properly.
  • find() filters keep their BSON types. A filter matching on a date, an ObjectId or a
  • Decimal128 inside an object value used to lose the type on its way to the server and silently match
    nothing.


Favourite Views

Everyone has a view they always end up in. VisuaLeaf now lets you say so β€” or works it out and offers.

  • Settings β†’ Appearance β†’ Default result view β€” pick Tree, Table or JSON, and every result opens
  • there: collections, SQL tables, queries, aggregation previews and shell results, in the main window,
    in a popout, in Electron. One setting, every entry point.

  • VisuaLeaf offers to remember your favourite. Keep landing on the same view and it asks, once,
  • whether to make that your default.

  • It only asks when you've actually shown a preference. The count is of unbroken runs, so
  • 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.


MongoDB Index Manager

(GitHub issue #33) The Create Index screen no longer lets you get stuck, and no longer accepts input
it then silently ignores.

  • A disabled Create button always says why. One line next to it names the reason β€” a row with no
  • field name, a duplicate index name, an invalid TTL β€” instead of leaving you to guess.

  • Field rows that need a name say so. The row is flagged where the problem is, but only once
  • you've been in it or once another row is filled in, so an untouched form is never shown as an error.

  • The last remaining field row can't be removed, and hovering its X explains why rather than
  • looking clickable and doing nothing.

  • TTL takes whole seconds and nothing else. Typing e used to be accepted and then quietly
  • produced 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.

  • TTL echoes back what it will do β€” "2,592,000 seconds β‰ˆ 30 days" β€” so a long run of digits is
  • readable before you commit. A TTL of 0 explains itself too: documents expire at the time held in the
    indexed date field.


Everyday Improvements

Grids

  • Hovering a cell shows a preview (GitHub issue #30) β€” a grid cell is one line wide and clipped
  • 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.

The data viewer can stay open

  • Dock the data viewer as a tab instead of a floating panel. Docked and left unpinned, it absorbs
  • every value you open from the table it was docked from β€” click down a column and read each one in
    place.

  • Pin it and it holds what it has, sending the next value to a floating panel. That's how you get
  • two documents side by side.

  • Float it again whenever you like β€” docking is a preference, not a commitment.
  • The tab says which tab it is following, and keeps up when that tab is renamed.

Saved queries and scripts

  • Saving tells you it saved. Every save and save-as β€” Mongo find, aggregation, SQL, Redis β€”
  • confirms, instead of some engines confirming and others going quiet.

  • Importing a script accepts your engine's files. .sql and .redis files are read as scripts
  • rather 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".

Connections

  • Filter the connection list by database type. Click the count on any section β€” Project, Connected,
  • 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.

  • Edit a connection straight from the sidebar β€” right-click it in the connections list instead of
  • 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.

MongoDB sync

  • A failed sync job tells you why, in the job list and on the monitor β€” the phase it failed in and
  • the reason, instead of a red badge and nothing else.

  • Running or not is answered by the server, so a job's state is no longer guessed from progress
  • rows that can't tell the difference.

  • Estimated document counts are marked as estimates β€” shown as "~4.2M" rather than as a precise
  • figure β€” and a total the server genuinely doesn't know is no longer displayed as an empty collection.

Fixes

  • The Redis key browser stayed readable in a narrow window. Below a certain width the Value column
  • collapsed to one character per line and the Value and TTL headers overlapped; the table now scrolls
    sideways instead. (SOZO-1487)

  • PDF previews in GridFS work again β€” they failed with a version-mismatch error. The preview now
  • always ships the matching viewer, so an upgrade can't break it again. (SOZO-1514)

  • The last row of a grid keeps its stripe. Any table with an even number of rows lost the striping
  • on its final row.

  • The What's new dialog's heading showed a line of raw template code instead of the words "What's
  • new". (SOZO-1248, SOZO-1513)


Infrastructure

  • Faster startup for shells, and the shell no longer leaks a connection pool per shell you open.
  • Cached connection clients are properly released when you edit or delete a connection.
  • One shared licence key ring with pinned signing keys and revocation lists, so a key can be rotated
  • without a new build.

  • New test coverage across offline activation, licence entitlements, export outcomes and pre-flight
  • 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.


Notes

  • The AI endpoint fields moved to generic ones. Existing Ollama settings are read as before; you do
  • not need to re-enter anything.

  • **Notifications for a run that ends Completed with errors** still report it as Completed. The run
  • itself, the history and the task list all show the new outcome correctly.

  • Foreign-key navigation needs a table or tree view of the results β€” it lives on the column, so a
  • JSON view offers nothing to right-click.

Read the full v1.0.2350 release notes

v1.0.2349-mongodb34

September 12, 2026
  • New Release For MongoDB Version 3.4

v1.0.2289

September 1, 2026

VisuaLeaf v1.0.2289 Release Notes

Release Date: September 1, 2026


Headline: Copy and Paste Rows in SQL, a Redis Script Editor, and Saved Tabs That Come Back as Themselves

  • Copy a row and paste it β€” within a table, into another table, or straight across from a MongoDB collection.
  • A Redis script editor, with saved scripts, saved key queries and command history, in the same library as your Mongo and SQL ones.
  • Ten kinds of saved tab used to come back as a Welcome page. They come back as themselves now.

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.


Copy & Paste Rows

  • Paste a row you copied from a SQL grid β€” into another row of the same table, or into a different table with matching columns.
  • Copy from a MongoDB collection and paste into SQL, and the other way round; both follow the same clipboard conventions.
  • Paste several rows at once.
  • One Paste, one meaning. There used to be a cell-level paste sitting next to the row paste doing something different; the cell one is gone.
  • Empty trailing columns survive the round trip β€” they were being trimmed away, so a row ending in blanks came back short.

Redis Script Editor

  • Run a batch of commands and read each result, instead of one command at a time.
  • Save a script, reopen it later, and share it β€” Redis scripts live in the same saved-items library as Shell and SQL scripts.
  • Save a key query β€” match glob, type filter and hash value filter β€” and re-run it whenever.
  • Command history records what you ran and lets you run it again.
  • The toolbars collapse to icons when the panel is narrow, instead of overflowing.

Connections: Honest URLs, Visible Passwords

  • The version comes from your server. The Version dropdown is gone β€” VisuaLeaf asks the server what it is instead of asking you to guess.
  • Reveal a stored password with the eye icon on a connection you own, and choose whether Export to URL includes it.
  • Paste a URL with a username but no password and you're told, rather than finding out at connect time.
  • The exported URL is correct for your engine. Three separate screens each built this URL themselves and all three were wrong the same way β€” a DuckDB connection exported as 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.

Saved Tabs Come Back as Themselves

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.


Smaller Things

  • Follow a foreign key from a cell to the table it references, opened in its own panel.
  • A one-click SQLite sample database on the Welcome page β€” created and connected in a single press, nothing to download or configure.
  • Filter what a connection shows. A connection with twenty-one databases was twenty-one rows, most of them admin, config and local; now you choose which ones to see. The MongoDB tree gains the filter the SQL tree already had.
  • A half-filled date and time is refused, instead of being quietly left out of the row you saved β€” and the message names the field instead of saying "Marked in red".
  • The SQL grid's background, header and cell menus now match each other.
  • Job success rates count only finished runs. Runs that neither succeeded nor failed were being counted as failures, so the percentage read lower than it was, and the sparkline plotted them as zeroes.

Notes

  • Don't roll back to a build older than this one over the same data. This release stores a few new values β€” a Redis key-query type, a Redis entry in query history, and the server-reported version on SQL connections β€” that older versions read strictly and may refuse. Your data is not altered; an older app simply may not open it.
Read the full v1.0.2289 release notes

v1.0.2264

August 28, 2026

VisuaLeaf v1.0.2264 Release Notes

Release Date: August 30, 2026


Headline: Query Builders That Take the Whole Window, Oracle and SQL Server Addressed the Way Your DBA Wrote Them Down, Shell Scripts That Keep Running, Fixed Query Field Deletion

  • Both query builders open into the full workspace β€” and the SQL one becomes a real ERD canvas you can drag, pan and zoom, with your tables as cards and the generated SQL beside them.
  • Connection modes for Oracle, SQL Server and any engine you'd rather address yourself. An Oracle database that answers to a SID could not be connected to at all before this release. Neither could a SQL Server named instance.
  • Two bugs that were costing people real work are gone: switching tabs mid-script no longer loses the run's output and results, and the MongoDB query field no longer deletes the last second of what you typed.

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.


Query Builders, Full Screen

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.

What you can see

  • The SQL builder becomes an ERD. Your tables are cards on a canvas with their joins drawn between them, instead of a stack in a narrow column. Drag a card to move it, drag the canvas to pan, scroll to zoom, or hit Tidy to lay everything out again.
  • The generated SQL sits alongside the canvas, with a Copy button β€” so you can see the query taking shape as you build it.
  • The MongoDB builder gets the same room, with zoom and "fit the query in view" controls, and your condition groups laid out as nodes rather than nested boxes.
  • An empty canvas says what to do β€” "No tables yet Β· Add one to start building the query" β€” instead of showing nothing.

What you can do

  • Search for a table to join from the canvas itself, without collapsing back to the sidebar.
  • Collapse back at any time β€” the builder returns to the side panel with everything exactly as you left it.
  • Copy the query from either builder in one click.

Connecting to Oracle and SQL Server, Properly

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 |

  • The form reshapes itself to the mode. Host and port disappear for a mode whose address already names its server; the port alone disappears for a named instance, which replaces it. The Database field is relabelled Service Name or SID β€” calling a SID "Database" is exactly how a service name ends up typed into it.
  • TNS Alias and TNS Descriptor connect through your existing tnsnames.ora or a descriptor pasted straight in.
  • Copy link now exports the URL your connection actually uses. A SID connection used to export the service-name form β€” the precise URL that comes back as ORA-12514.
  • When a save is refused, you get the reason. The server rejects several things you can act on β€” a password embedded in a custom URL, a URL whose scheme belongs to a different engine, a malformed instance name, an SSH tunnel a mode can't route through β€” and each is written as a sentence telling you what to do instead. Those sentences used to be thrown away and replaced with "400 Bad Request".
  • The default port follows the engine again. After switching engines once, it used to stay on the previous engine's port for the rest of the session.
  • Custom URLs are not offered for SQLite and DuckDB, deliberately β€” those two are confined to a configured folder on the server, and a hand-written URL would walk straight around it.

Existing connections are untouched: a connection saved before this release dials exactly the URL it always did.


A Long Script No Longer Loses Its Results Because You Looked Away

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.

  • Output keeps arriving while you're on another tab, and it's all there when you return.
  • Results appear for work finished in your absence β€” result tabs are now built whether or not you're looking at the shell.
  • The console keeps its history across tab switches, rather than starting from empty, and holds a long run's worth of lines.
  • Nothing is lost by closing and reopening the shell tab either; the run and its output belong to the shell, not to whether it happens to be on screen.

The Query Field Stops Deleting What You Type

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.

  • Whatever you type stays typed. The builder no longer echoes stale text back over the field.
  • Edits made in the builder still flow to the field, exactly as before β€” only the echo of your own typing is dropped.
  • Applies to the query, sort and projection fields alike.

Tables, Schemas and Foreign Keys

A set of fixes for things the app reported confidently and wrongly on engines where one database holds many schemas.

  • Two tables with the same name in different schemas no longer merge. Opening 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.
  • Table statistics answer about the schema you asked for. A blank schema didn't mean "the default one" β€” it meant no filter at all, so the numbers covered every schema at once.
  • DuckDB foreign keys exist and are now visible. The driver refuses the question outright, and the refusal was being read as "this table has no foreign keys": 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.
  • CrateDB tables no longer come back with no columns. A single unsupported metadata call was closing the pooled connection underneath, and everything after it failed silently β€” a table with columns and a table the app couldn't read looked identical.
  • Oracle table statistics are collected properly rather than falling back to a generic read.
  • The system monitor says what failed. An Oracle error arrived as a bare ORA-00942: table or view does not exist with no indication of which operation produced it.

Inserting and Editing Rows

  • The dialog stays open when the database refuses the write. It used to close first and report the failure as a toast afterwards β€” so your entire typed row was gone by the time you read why. Now the values survive, the offending column is marked with the driver's own reason, and the fix is one keystroke.
  • Insert & add another β€” commit the row and keep the dialog open for the next one.
  • Numeric fields check themselves as you type, per column type, instead of failing at the server.
  • Duplicate-key and foreign-key failures are written in plain language across MySQL/MariaDB, PostgreSQL, SQLite and SQL Server, and a duplicate spells out which values clashed. SQLite's referential errors are the awkward ones β€” they name the other table in the broken link β€” so they now say which table you're actually unable to write.

Generate Mock Data: Better Guesses From Column Names

  • A column called exactly 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.
  • Naming rules went from 33 to 54, reaching generators that inference could never previously select: credit card, IBAN and BIC β€” these carry real checksum structure, so anything validating the value accepts the generated rows β€” plus salutation, gender, nationality, occupation, tagline, material, promo code, barcode, ticker, currency name, password, file extension, checksum, colour hex, word and paragraph.

Fixes Worth Naming

  • Opening a saved query containing a regular expression broke the query builder. Patterns written in any of the three spellings the app itself produces are now all understood.
  • The advanced driver properties panel sat flush against the footer, reading as one crowded line.

Notes

  • TNS Alias mode reads tnsnames.ora from the machine running VisuaLeaf, not from the database server β€” point the mode at the folder holding that file.
  • Custom JDBC URLs must use the scheme of the engine you selected, and may not carry a username or password. The URL is stored as typed and shown again on every read, unlike the password field, so credentials belong in their own boxes.
Read the full v1.0.2264 release notes

v1.0.2237

August 24, 2026

VisuaLeaf v1.0.2237 Release Notes

Release Date: August 24, 2026


Headline: One-step connect for SQL and Redis, connection hints that match your engine, and a trial that ends when it says it does

  • Save & Connect now works for SQL and Redis. Saving a new connection and opening it is one button, the way it has always been for MongoDB β€” previously you saved, closed the dialog, found the row in the sidebar and connected it by hand. The button steps aside when the connection is already open, and if the connection fails it says so and tells you the connection was still saved, so you never re-type it.
  • The New Connection form proposes details that belong to your engine. Choosing MySQL used to suggest a PostgreSQL URL, port 5432, a database called 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 notes are navigable. Both What's new and the full release history now carry a Contents bar: jump straight to a section, and see which one you're reading as you scroll.

Notes

  • If your trial already ran out, the switch to Community Edition happens the next time the app has an internet connection β€” on the next launch, or within the hour if you leave it open. Until then the app keeps working exactly as it did.
Read the full v1.0.2237 release notes

v1.0.2234

August 21, 2026

VisuaLeaf v1.0.2234 Release Notes

Release Date: August 23, 2026


Headline: Rebuilt Data Sync, 32 SQL Engines, and AI That Designs Your Schema

  • Data Sync, rebuilt β€” continuous replication between any pair of MongoDB and SQL connections, in any direction, with live change capture, a cutover checklist that refuses to say "ready" when it isn't, and reconciliation reports that prove the target still matches the source.
  • 32 SQL engines you can actually pick. Ten are new β€” TimescaleDB, Neon, Supabase, Azure Database for PostgreSQL, Citus, Azure SQL Database, CrateDB, QuestDB, RisingWave and Materialize β€” but the bigger win is that twelve engines you already had were invisible from the screen most people start on. Every picker in the app now shows the same list.
  • AI that designs your database and builds your charts β€” describe what you're building and get a real ERD on the canvas, or describe a chart in words and get it built, query and all.

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.


Data Sync, Rebuilt

Continuous replication between any pair of MongoDB and SQL connections β€” PostgreSQL, MySQL/MariaDB, SQL Server and Oracle β€” in any direction.

What you can see

  • Reconciliation reports that prove the target still matches the source, at three depths: count only, sampled content checksums, or a full document diff naming the exact mismatched ids. A count on its own can't tell a lost write from a spurious one; the checksum tier can.
  • A cutover readiness checklist β€” initial copy, change capture, replication lag, dead letters and verification, each pass or blocked, with the remedy printed on every blocker. It is deliberately pessimistic: one pending dead letter blocks cutover, and that isn't configurable.
  • Schema drift raised distinctly β€” a dropped, renamed or recreated source collection, a dropped database, a missing target collection, a changed field type are each reported as themselves, with the choices available (re-seed, repoint, accept).
  • A dead-letter queue listing records that couldn't be written, inspectable and replayable.
  • Alerting and health for replication lag, dead-letter growth and clock skew.

What you can do

  • See the exact statements VisuaLeaf would run against your server before you consent to them β€” log-based change capture for SQL sources shows you every statement with its current value and its undo, one checkbox per consequence, and tells you afterwards what actually happened.
  • Confirm a clean drain before cutover. After you stop your own writers, VisuaLeaf watches the source, confirms the silence, freezes the job and verifies. Every response says explicitly what it is not claiming.
  • Re-copy a single collection of a running job without resetting the whole thing β€” previously that meant hours of re-copying collections that were never wrong.
  • Prepare a reverse sync for rollback after cutover. It's created stopped, and never guesses at an inverse transformation.

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.


SQL: More Engines, and Controls That Know What Your Engine Can Do

The engine list

  • Ten new engines β€” TimescaleDB, Neon, Supabase, Azure Database for PostgreSQL, Citus, Azure SQL Database, CrateDB, QuestDB, RisingWave, Materialize. All ten reuse a driver you already have, so there's nothing new to download.
  • Twelve engines became reachable. The main New Connection screen offered ten SQL engines while an older dialog offered twenty-two. YugabyteDB, Redshift, both Aurora flavours, both RDS flavours, Percona, H2, DB2, Firebird, HSQLDB and Derby were fully supported and invisible from the screen most people start on. All six pickers in the app now show the same list β€” 32 engines.
  • A searchable, grouped picker with a live count. Typing "postgres" surfaces Neon, Supabase, Timescale and CrateDB. Cards lead with the product and demote the vendor, so "Amazon Aurora (PostgreSQL)" and "Amazon Aurora (MySQL)" are no longer two identical-looking truncated cards.
  • Nine new brand logos; engines with no official mark get a distinct shape rather than a generic cylinder.
  • A connection shows the mark of the service it actually talks to. A Supabase, Neon, Aurora, Redshift, Timescale, ClickHouse Cloud, TiDB Cloud, CockroachDB Cloud, YugabyteDB or Azure database is picked out from its address and gets its own logo in the sidebar, the connection lists, the tabs and the profiling screen β€” instead of the plain elephant or dolphin you got for choosing "PostgreSQL" or "MySQL" in the form, which is what those services tell you to pick. Hover the icon and it names both: "Supabase (PostgreSQL)". A self-hosted server is unaffected, and picking a branded engine yourself always wins over the address.
  • Pasting a connection string recognises the host, not just the scheme β€” a .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.

Controls that are honest about your engine

Every create, drop, alter and truncate used to be composed without consulting what the engine could actually do. Now:

  • Menu entries an engine can't perform are disabled before you click, and the description under the entry becomes the reason. On SQLite, Create New Database reads "An SQLite database is a single file β€” create a new connection pointing at a new file path instead." No tooltip to hunt for.
  • A brand-new Create Table tab used to be refused on 8 of 32 engines before you touched anything, because it opened with options those engines don't accept. Fixed.
  • Foreign Keys, Indexes and Auto-increment tabs explain themselves where unsupported, instead of silently vanishing.
  • Redshift foreign keys are now offered β€” they were being falsely refused β€” with the honest warning that Redshift stores and trusts them but never enforces them, so queries can silently return wrong results.
  • Every drawback is listed while you're choosing the engine, not discovered after a failure, and everything an engine can't do is reported at once rather than one failure at a time.
  • Sidebar folders that could only ever be empty on a given engine no longer appear at all.

Connection settings and sharing

  • Custom connection settings for SQL databases. Two concrete wins: Azure MySQL and PlanetScale could not be connected to at all before, and a default modern MySQL server would fail with an opaque key-retrieval error. The settings editor suggests the right options for your actual driver.
  • Choosing a driver version now takes effect on reconnect instead of silently requiring a full app restart.
  • Sharing a SQL connection works. The Share menu had never once succeeded. A read-only share is genuinely read-only β€” schema changes, table alterations, row edits, database create/drop and all user management require write access β€” and it says READ-ONLY on the screen with Run, Save and Drop greyed out, instead of letting you type a query and handing back a bare permission error.

Keyboard Shortcuts, Now Yours

  • One Keyboard Shortcuts window listing roughly 180 commands across the whole app with their real key combinations, grouped by area and searchable β€” matching the command name, the group, and the rendered combination, so you can search for the keys you remember pressing.
  • Rebind almost anything. Pencil, press your keys, Set, Save. Your bindings persist and come back on every window, popout and launch. Live preview as you go, closing without saving rolls back, and there's Reset to defaults per row and globally.
  • Conflicts are explained, not just blocked. A clash in the same context warns you and unbinds the other one; an overlap across different contexts is shown as neutral information β€” "Both keep working β€” the focused view wins."
  • While you're recording, every shortcut goes dead, so pressing Ctrl+W to assign it doesn't close your tab.
  • Keys that can't be reassigned carry a padlock and the reason β€” structural navigation and combinations owned by your OS or the editor.
  • Menu labels now tell the truth. They render your own rebound keys, and several were simply wrong before: Redo was advertised as Ctrl+Y when it is Ctrl+Shift+Z, Batch update was mislabelled, and Refresh literally displayed the text "TODO ACTION".
  • Three separate cheat-sheets (global, Shell, GridFS) are now one window; the Shell and GridFS buttons open it pre-filtered.

AI That Designs Schemas and Builds Charts

  • Describe an application, get a database design. With a diagram open, describe what you're building and the assistant draws real tables β€” it reads your current canvas first, including existing tables, column types, keys and the engine. Ten domain templates (e-commerce, B2B SaaS, blog/CMS, CRM, booking, LMS, project tracking, inventory, social, HR) and six cross-cutting patterns (multi-tenancy, soft deletes, audit trail, roles and permissions, versioning, localisation) back it up.
  • Merge is the default β€” new tables are drawn and existing tables gain columns without losing anything. Replace never happens silently; it warns and waits.
  • It reports what it actually did β€” "added 3 tables, added 5 fields to 2 existing tables, drew 4 relations", or "Everything suggested is already on the canvas β€” nothing changed."
  • Describe a chart and get it built. Works for both MongoDB and SQL: it picks the chart type, writes the query or pipeline, maps fields to axes and series, sets titles and axis labels, and can modify a chart you already have.
  • Nothing touches a live database β€” materialising a design is a separate, deliberate step.
  • The model picker is honest again. Claude Opus 5 was added, five withdrawn models removed, and every entry now shows a readable name with its provider model id. One was outright wrong β€” it said Haiku 3.5 while actually addressing Haiku 4.5.

Mock Data Generator, Rebuilt

An empty blueprint now opens on a chooser with three routes:

  • Ready-made datasets, with entity and row counts shown up front.
  • Realistic values β€” a searchable catalogue showing each generator's label, its path, and a live example.
  • Read from tables you already have β€” pick which ones to import, rather than importing a whole database and deleting thirty entities by hand.

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.


Reading Your Data

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.


One Saved-Items Library, Six Screens

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:

  • Folders and subfolders anywhere, with drag-and-drop for a single item or a whole multi-selection, and a "Drop here" chip. Folders are genuinely new for Dashboards, JSON Schemas and Visual Schemas.
  • Inline rename β€” the row label becomes a text box. New for scripts, dashboards, JSON schemas and visual schemas.
  • Duplicate, new for JSON schemas and visual schemas.
  • Multi-select with Ctrl/Shift and bulk delete behind a single confirmation.
  • Search, Name/Date sort, keyboard navigation, and smooth scrolling in large libraries.
  • A live connected/disconnected dot on every row, with a deleted connection marked in red β€” a query whose connection is gone has Run greyed out and tells you why.

Export & Import

The whole export pipeline was measured and reworked.

  • Exports start immediately. A 146-collection export used to write nothing at all for its first 18 seconds.
  • Progress is honest. The screen used to show 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.
  • One big collection no longer holds up the run. On a measured 10.36 GB export, a single collection took 93% of the wall-clock with three of four workers sitting idle. Large collections are now split across threads.
  • Thread count is automatic, scaled to your machine instead of a flat four, and the badge reads "auto threads" rather than "0 threads".
  • Export traffic is compressed for non-local connections β€” dump data typically compresses 3–5Γ— β€” and compression itself is about 2.5–3Γ— faster for files 10–15% larger.
  • Restores are faster, writing in much larger batches and reading while inserting.
  • Re-export just the failures. "57 collections failed on the last run" now comes with a button that narrows the job to exactly those; re-running all 146 used to be the only option.
  • A failed job no longer claims progress β€” the fake "100 / 100 documents" is gone β€” and resume is no longer offered when there's nothing to resume from.
  • The export form scrolls, so the lower half is reachable.
  • Restore can select a dump folder. The picker only accepted files, which made restoring a BSON dump impossible.
  • A restore into a database that doesn't exist yet is checked up front β€” VisuaLeaf tells you while you're configuring the job whether your database user is even allowed to create it.
  • The duration estimate accounts for chunking, so a database with one dominant collection is no longer predicted at that collection's full duration no matter how many threads you give it.

Numbers You Can Trust

A recurring theme this release: several readouts were confidently wrong, and are now either correct or honest about not knowing.

  • "Not available" instead of a zero nobody could justify. Views, Sequences, Events, Packages, Triggers and Constraints folders now say when the engine can't be asked β€” this is not an empty list; nobody could look.
  • Active connections. The monitoring panel was showing the server's connection ceiling under a label reading current, so an idle server reported hundreds of connections that did not exist. It now shows the real number, "Not reported", or "Not available on this engine".
  • Replication lag never invents a number β€” you get a duration, "Unknown", or "Clock skew", each explained.
  • Live sync totals. A sampled stream now says "covers 12,043 of 8,300,000 events β€” roughly 1 in 689 shown". A 50,000/second job was previously reported off by three orders of magnitude.
  • Dead letter counts are the real total, not how many fit on the page.
  • Index analysis works on sharded clusters. A query that scanned every document on both shards previously produced no recommendation at all, and the index a shard actually used was reported as "No Index Used".
  • Explain results are real. A plan you ran yourself reported 0 examined, 0 returned and 100% efficiency on a plan that scanned 5,000 documents β€” and, worse, silently recommended the wrong index direction. It now reads 5,000 / 1,667 / 33%.
  • New index health badges β€” UNUSED and REDUNDANT, with hover reasons and the caveat that usage counters are per-server and reset on restart. They're advisory by design: a unique index with no reads is a caution, not a suggestion, because dropping it changes which writes are accepted.
  • Slow pages name their phase. Jumping to the last page now says "Counting documents" or "Loading documents", with a live timer, a Cancel that works, and a note that large collections can take a while to count. Impatient clicking no longer stacks a full scan each time, and if the server can't kill the operation the app says so rather than dropping it.
  • The web widget no longer reports "Schema saved successfully!" for a save that never happened.

Improvements

Scrolling through your data

Shared by the MongoDB collection view, SQL query and table results, aggregation results and the Redis key browser.

  • Rows no longer go blank during a fast scroll. Fling the list and you used to get an empty band where rows should be until it settled. Rows are now redrawn every frame, so the list stays populated the whole way down β€” only a scrollbar yanked across the track pauses at all, and only until it stops.
  • Scrolling is smoother, most noticeably on wide documents and while the query builder is open. Each visible row used to be rebuilt from scratch on every scroll movement; now only the row you're hovering and the row you've selected do that work.
  • Expanding or collapsing a large selection is immediate. With many rows selected this used to stall noticeably before anything moved, and so did jumping to a search result in a long document.

Connections & the sidebar

  • A SQL table row opens immediately. Its columns, indexes, foreign keys and constraints are fetched the first time you expand it, rather than as part of loading the tree around it.
  • PostgreSQL connections stopped dropping after about half an hour. A single slow health check used to close the pool and end your whole session; the routine trigger was the connection pool's own recycling. A genuinely unreachable server is still reported within about fifteen seconds.
  • "Reveal in Sidebar" on tab right-click, plus clickable breadcrumbs on eight screens that highlight the connection, database or collection in the tree.
  • A disconnected screen is actionable. It used to read "SQL connection e76d2829-… is not connected. Please connect first." with nothing to click. Now: a plug icon, a plain sentence, a Connect button β€” and it retries whatever failed once you're connected.
  • Advanced driver properties are editable. This setting existed, was applied by the driver, and no screen referenced it β€” the only way to set one was to edit stored data by hand, and the next Save wiped it.

Redis

  • Undo on every edit, with a visible Undo button on the toast, faithful down to per-field expiry and sorted-set scores β€” and deliberately withheld where undoing would damage data you never touched.
  • A New Key dialog, multi-select with bulk delete, rename with a collision check, and per-field TTL for hashes.
  • The ACL page now matches the standard user-management design, with stat tiles, status/commands/selectors columns and Allow all / Deny all.

Editors & the shell

  • SQL autocomplete offers the current statement's own columns. Typing a WHERE clause used to offer table names and not one column of the table being read.
  • Query history feeds autocomplete in the MongoDB query field, tagged history and showing "Last run Β· N runs Β· starred". Picking one stays undoable.
  • Run fires the statement you're actually on. With the cursor on a comment line nothing ran at all, and when two statements shared a line it always ran the first.
  • Large scripts paste instantly β€” 200 KB of SQL used to take 11.6 seconds.
  • Shell sessions no longer leak. Idle sessions were never being cleaned up, and enough of them made the shell unusable.
  • 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.

Diagrams & schemas

  • Export a diagram as PNG, black-and-white PNG or SVG. The SVG is interactive when opened in a browser β€” hover a field to highlight its relations β€” and embeds its fonts so it opens anywhere.
  • Materialize lists every problem at once, catching blank table and column names with row numbers and nested paths before any statement is generated.

Compare

  • A "Simple" mode, now the default β€” pick source and target from a picker instead of the drag canvas. Visual mode gains click-to-link, and naming is optional until you save.
  • Compare stopped reporting differences that don't exist. Keys were compared as text while the server sorted them as data, so numeric keys desynchronised immediately and everything after the first numeric key was mis-reported.
  • "Repair" no longer reports success when it did nothing, and re-running a repair no longer duplicates documents.
  • When a sort exceeds the server's memory limit, Compare now tells you to create an index on the match keys instead of failing opaquely.

Charts & maps

  • Map charts load dramatically faster β€” map data is 89% smaller, taking about 41 MB off the download. Japan keeps all 1,158 prefecture parts. Asia and India were genuinely over-detailed and do lose some small islands at this resolution.

Elsewhere

  • A "What's new" panel after an update β€” on a genuine version increase, never on a fresh install, and it waits for a clear screen rather than stacking on another dialog.
  • A 14-day free trial at signup, replacing the anonymous 7-plus-7 arrangement. "Upgrade" is now "Activate License", so people who already bought one have somewhere to enter the key, and a machine that has already used its trial is offered Sign In rather than a promise the server will refuse.
  • The app is 70 MB smaller β€” 675 MB to 605 MB on macOS, with the installer down from 408 MB to 354 MB.
  • GridFS filename and metadata save together. They were separate operations that clobbered each other, so either order lost data. Errors now name the actual problem β€” duplicate name, invalid name, missing file β€” and the dialog stays open on failure.
  • Light-mode fixes β€” autofilled login fields were white-on-white, drag previews carried colours that broke theme switching, and the Redis connection dialog, the Materialize preview pane and the Import Script modal were all dark-only. Two further passes caught the rest: the Create Table screen (its form, tabs, SQL preview and error bar all rendered dark on a light page), the Delete Connection dialog, the right-click menus and environment colour picker in the connection sidebar, the failed-query panel in the SQL editor, the stored-procedures list, the Create/Drop Database dialogs, Table Info, and the row hovers and paging buttons across the SQL grid, Edit Row, Batch Update and foreign-key preview.
  • Long foreign-key error messages wrap instead of stretching into one unreadable line.

Fixes Worth Naming

  • Dropping a table could drop the wrong table. An unqualified drop resolved through the session's search path, so dropping reporting.orders silently and successfully dropped public.orders instead. This is the most serious fix in the release.
  • Materialising a diagram failed on columns that looked fine. Any nullable text, JSON, boolean, date or timestamp column produced a syntax error and rolled back the whole operation. Integer columns always worked, which is why it hid for so long.
  • Shell aggregations ignored the types you typed. An 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.
  • Saved aggregations quietly returned the wrong rows. A date in any stage other than $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.
  • Opening one tab wiped every other tab's saved state. Opening Generate Mock Data or Redis Security made the entire workspace fail to save, and every open tab lost its state.
  • Imported JSON schemas lost every field name β€” every property read "New Entity", and saving collapsed them onto one entry.
  • Dialogs in the embedded schema widget opened behind the canvas. Import from Script and every other dialog appeared centred and looked perfectly normal, but no click reached them β€” the diagram was painted over the top. They also had no route back in: the Import from Script button vanished as soon as the table list had anything in it, which is every sample session and every session after your first import. Both fixed, and a closing dialog can no longer swallow a click on its way out.
  • Pasting the wrong JSON into Schema Import produced a table called "undefined". A file whose columns don't carry a table and a name β€” the usual result of exporting from a different tool β€” built one nameless phantom table and then crashed relationship detection. It now stops and tells you what shape it expected.
  • Renaming a diagram card broke its connector lines permanently, and pressing Escape during a rename silently kept the typed name anyway.
  • A column added minutes ago stayed invisible through any number of refreshes, for up to five minutes.
  • A 146-collection export reported 57 failures when none had failed. One GridFS bucket poisoned every collection processed after it; the files on disk were correct the whole time.
  • A dump that died mid-write left a truncated file behind β€” and a truncated dump is indistinguishable from a complete one, restoring without complaint and quietly missing its tail.
  • Copying between two SQL databases built the wrong column types. PostgreSQL's type names were being sent to MariaDB, HSQLDB and QuestDB β€” an outright failure on the first two, and on QuestDB accepted and then silently wrong.
  • Engine picker cards were unclickable β€” they were rebuilt mid-click, so the browser never registered it. They looked alive and did nothing.
  • Saving a connection could permanently break it β€” switching engines kept the previous engine's pinned driver, so a MySQL connection could be saved with a PostgreSQL driver that fails at connect time.
  • "Disconnect all 0 connections?" β€” with two SQL connections open and no MongoDB one, the confirmation said exactly that and then disconnected nothing.
  • A modal's backdrop covered the title bar, and because the bar was still clickable underneath, the Workspace Manager could stack duplicate copies of itself.
  • Redis database nodes always opened database 0, and Redis rows opened the MongoDB connection dialog.
  • A diagram offered you every schema's tables. Opening an ERD on one PostgreSQL or SQL Server schema listed the tables of every other schema in the database alongside it, so 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.
  • Two diagrams could overwrite each other, expanding one schema's Tables fold re-opened it on another's row, and Tables Info listed every schema's tables while refusing to open a second tab.
  • Deleting a rule in the sync wizard made the rule below it inherit the deleted one's filter.
  • Initial-sync progress bars never moved β€” the progress stream listened for the wrong signal for the entire life of the feature.
  • Dead-letter replay reported success without replaying anything.
  • Cancelling an aggregation now tells you truthfully whether it stopped.
  • Server errors are readable. They used to render as a single word β€” "IllegalArgumentException", "ResourceAccessDenied" β€” and streaming failures reported a bare HTTP error! status: 400 instead of the server's actual reason.
  • AI providers that never worked, now do. Gemini failed before a request was even sent, GPT-5.6 failed outright, and newer Claude models returned their reasoning text to the parser instead of the answer. All 36 models were tested against the live APIs.
  • Per-engine fixes: CrateDB showed empty columns and reported 0 rows for all 63 tables; QuestDB couldn't browse at all; PostgreSQL silently rewrote JSON-looking text written into a plain text column; SQLite emitted definitions it then rejected; Oracle returned no column statistics for tables VisuaLeaf itself created; MariaDB silently truncated long text at insert; DuckDB couldn't be seeded; ClickHouse failed exporting MongoDB into a JSON column.

Infrastructure

  • The legacy split NoSQL/SQL connection sidebars were removed; the unified list is the only path now.
  • A single engine catalogue is the source of truth for which engines are selectable, contract-tested across both the app and the server in each direction.
  • The frontend test suite was running 38 of its 490 tests; that's fixed, and roughly 4,000 lines of new tests were added. Backend unit tests grew from 1,505 to 2,546, and container-backed suites from 27 to 40. Test runners now fail when a pattern matches nothing, so a package that quietly stopped being covered can't pass as green.

Notes

  • Every saved ERD diagram is rewritten on first launch after upgrade. Nullability moves out of the type text into a real field. The visible consequence: SQL diagrams now generate 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.
  • Startup now reads your saved diagrams to check for the old format. If you have many or very large diagrams, expect slightly longer startup on the first run.
  • SQLite foreign keys are now enforced. 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.
  • If you already have sync jobs: stop any SQL change-capture job with "release source resources" before upgrading. An upgraded job re-anchors rather than resuming, and the old capture resources on your source server need releasing. Dead letters recorded before the upgrade can't be replayed and are marked as such.
  • Deploy MongoDB is temporarily hidden. The command-palette entry for provisioning a replica set is off in this build while it's finished. Managing clusters you already have is untouched.
  • Known issue: Explain on a shell aggregation shows an empty plan. Run an 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.
  • Silent default changes. Export thread count is now automatic rather than a flat four; compression is lighter and faster, so dump files are 10–15% larger; network compression is on for non-local exports; and restores insert in much larger batches. All are performance-positive, but they change file sizes and your machine's CPU and network profile.
Read the full v1.0.2234 release notes

v1.0.2091

July 30, 2026

VisuaLeaf v1.0.2091 Release Notes

Release Date: July 30, 2026


Headline: Faster Results, Schemas You Can Build For Real, One Connections List, and a Modern Look Throughout

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:

  • Big query results arrive sooner β€” aimed squarely at the extreme end, like a page of 50 documents at MongoDB's 16 MB limit each load even faster than before ( which was already pretty fast)
  • Materialize a schema diagram into a real database β€” design it once, preview the exact DDL or validators, then build the tables or collections for real.
  • One connections list for every engine β€” MongoDB, SQL, and Redis in the same sidebar, with the connection manager to match.
  • Real folders for saved queries, scripts, and charts, offered everywhere you save.
  • Live index-build progress, and index errors written in plain English instead of driver-speak.
  • Results from your own SQL are editable, and browsing tables on a remote database is much faster.
  • A modern look across modals and editors β€” the dialogs you live in no longer each look like the year they were written.

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.


Faster Large Result Sets

  • Big query results arrive sooner. Loading a large result no longer alternates between waiting on the network and processing what arrived β€” both happen at once, on both sides of the connection. The target case is the punishing one: a page of 50 documents at MongoDB's 16 MB ceiling each, roughly 800 MB in one go, where the load used to spend most of its time idle in the middle. If anything goes wrong the app falls back to the old behaviour rather than failing.
  • Loading a collection of those documents is lighter on memory β€” moving between pages of 16 MB documents settles faster and leaves less behind.
  • Scrolling a long result stays smooth as the data grows, including in the tree view.
  • The query builder no longer stalls on complex queries β€” building up a big filter, projection, or sort no longer gets slower with every field you add.
  • Binary and UUID fields survive the trip. Streamed results used to be able to corrupt Binary and UUID values in rare cases; every path now reads them the same, correct way.

Connections Sidebar & Connection Manager

  • One list for every engine. MongoDB, SQL, and Redis connections sit in a single sidebar list, each with its own brand logo, and the connection manager looks the same β€” so you're not moving between two different-looking lists of the same connections.
  • Recent connections first β€” both the sidebar and the connection manager can filter to what you've actually opened lately, instead of scrolling a list of fifty.
  • Every SQL object action came with it β€” views, procedures, triggers, sequences, packages, and events are still edited straight from the tree in the unified list.
  • Capped collections are labelled in the tree, so you know before you try to write to one.
  • SQL connections show when you last connected, like MongoDB ones do.
  • Redis over SSH β€” reach a Redis server on a private network through an SSH tunnel.
  • Reconnect without hunting β€” if a connection dropped, actions that need it now offer to reconnect instead of failing.

Saved Queries, Scripts & Charts: Real Folders

  • Folders are real now. A folder you create exists on its own, so the Save As dialogs offer the same folders the list shows β€” including an empty one you just made.
  • Rename a folder and everything in it follows.
  • Sensible default names when saving from the file explorer, instead of a blank field.
  • Saved lists behave. What you save lands where you saved it, the list shows it without a manual refresh, and the counts are right β€” across saved queries, scripts, charts, dashboards, schemas, and JSON schemas.

Index Management

  • Watch an index build. Creating or rebuilding an index shows live progress, and that progress survives switching tabs or closing and re-opening the index screen. When it finishes you get a notification, wherever you are.
  • Index errors in plain English. A failed index no longer dumps a driver error at you β€” you get a short sentence naming the problem (a duplicate value blocking a unique index, a field that's too long, an unsupported option) and what to do about it.

SQL Editing & Query Building

  • Edit the results of your own SQL. Results from a hand-written query used to be read-only. Now, when a result column traces back to a real table column, you can edit it in place β€” and a badge on the grid tells you which cells are editable and why the others aren't.
  • Browsing tables on a remote database is much faster. Opening a table on a distant Oracle, SQL Server, or Postgres box no longer re-reads the whole catalogue every time β€” the second visit is close to instant.
  • Change the schema and the tree keeps up. Run a CREATE, DROP, or ALTER in the editor and the connection tree refreshes itself; you don't have to reconnect to see the new table.
  • Paging shows real numbers. Changing a filter no longer leaves a stale row count on screen while the new page loads.
  • Writing SQL and editing JSON feels quicker β€” typing stays responsive on long statements, with sharper highlighting and completion that keeps up.
  • Smart split layout β€” the query editor and its results now arrange themselves from the shape of the panel: side-by-side when it's wide, stacked when it's tall, with the results getting the space. Drag the divider and your size is respected until you change the layout.
  • A better SQL query builder β€” a cleaner layout and a much more responsive one on large queries.
  • SQL table schemas get their own list view, alongside the MongoDB JSON-schema list.
  • Query profiling tells you where you stand β€” if your engine doesn't support profiling, it says so in a sentence instead of showing an empty screen, and on SQL Server the statistics no longer drop ad-hoc queries.
  • Writes respect the engine. Generated and imported SQL now adapts to what each dialect actually supports β€” upsert style, foreign keys, transactions, identity columns, batch sizes, identifier limits β€” so a script that works on Postgres also works on MySQL, ClickHouse, or SQLite.
  • Fixed SQLite connections and imports.

A Modern Look for Modals and Editors

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.

  • Modals across the app share one look β€” rounded panels, a proper iconified header with the context you're working in, a soft fade on open, and consistent buttons. Query History, Load Query, the Save Query / Script / Chart dialogs, the command palette, the keyboard-shortcut sheets, the feedback and help panels, the JSON-schema editor, and the whole Settings screen (Appearance, AI Configuration, Storage, Email, License Information) all follow it now.
  • Query History is genuinely searchable β€” filter by type and status, search as you type, and see a real "nothing matches" message instead of a blank panel.
  • Load Query got the same treatment β€” search your saved queries, with clear empty states when you have none yet.
  • Editors look and behave consistently β€” the shell, SQL, and JSON editors share one visual language, and the aggregation stage editors show a ghost hint of the expected shape while they're empty, so an empty stage tells you what goes in it.
  • Dropdowns look the same on every OS β€” the AI model picker no longer renders as a native menu that looks out of place on Windows.

Schema Diagram (VisuaSchema)

  • Import a schema from a "smart query" JSON dump β€” paste the metadata output from tools like ChartDB and get tables, columns, keys, indexes, and views laid out for you.
  • Smoother pan and zoom β€” the minimap no longer redraws the whole canvas while you move around, and a locate bug that jumped you to the wrong place is fixed.
  • A new collection shows up in the diagram without a manual refresh.
  • JSON schema on collection stats β€” see a collection's schema where you're already looking at its numbers.
  • Exported diagrams keep their fonts, so a shared PNG looks like what you saw.

Materialize a diagram into a real database

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.

  • See exactly what will run before it runs. Every materialization starts as a dry run: on SQL you get the full generated DDL script in an editor; on MongoDB you get the JSON Schema validator that will be attached to each collection. Nothing touches the database until you say so.
  • Tables get created in the right order. Foreign keys are worked out ahead of time so parent tables exist before the tables that reference them β€” no hand-sorting your CREATE TABLE statements.
  • Collections come with their rules attached. On MongoDB, each collection is created with its JSON Schema validator in place, so the shape you designed is enforced from the first insert.
  • Decide what happens to anything that already exists β€” skip it (the safe default), attach or refresh just its validator, or stop the whole run and fail. You get a per-collection report of what was created, skipped, or updated.

Deploy MongoDB (BETA)

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.

What you can see

  • A card per cluster with its phase, members, versions, and live resource usage (CPU, memory, disk) that refreshes on its own instead of being a one-shot snapshot.
  • An Infrastructure tab listing every server behind your clusters with live status, so you can tell a sick machine from a sick database.
  • A live progress panel for long operations β€” adding a shard, growing a disk, upgrading a version β€” instead of a spinner that tells you nothing.
  • An Audit log tab recording every deploy, scale, restart, password reset, and destroy, with who ran it and when.
  • Plain-English preflight before anything is created: whether Docker or the deploy tooling is present, whether the port is free, and what to do about it if not. If port 27017 is already taken on the target machine, the deploy stops immediately and tells you, instead of failing halfway through. Nothing to install by hand first β€” VisuaLeaf fetches the tooling it needs for a cloud deploy on its own.

What you can do

  • Pick a deployment shape β€” standalone server, replica set, or sharded cluster (config servers, shards, and a router), on cloud VMs, your own SSH hosts, Docker, or Kubernetes.
  • Bring your own accounts and servers β€” add a target once (DigitalOcean, AWS EC2, Hetzner Cloud, Hostinger VPS, OVHcloud, DigitalOcean Kubernetes, your own Kubernetes, an SSH host, or Docker), and reuse it for every cluster. Targets are editable after the fact, credentials are checked against the provider when you save them, and SSH hosts get a real reachability test rather than a hopeful "saved".
  • Authenticate SSH targets your way β€” private key or password, and per-server credentials when the members live on different machines with different logins.
  • Deploy secured by default β€” set the admin password yourself (the field starts empty on purpose), turn on TLS with one toggle, and download the cluster's CA certificate from the Overview tab so other tools can trust it.
  • Get a working connection immediately β€” VisuaLeaf creates the connection for you, matching the cluster's TLS setting, and marks it as managed. For a database on a private network, open an SSH tunnel from the Tunnels pane and connect through it.
  • Run day-2 operations without a shell β€” reset the admin password, scale members up or down, grow a disk, add a shard, scale config servers, restart a member, do a rolling MongoDB version upgrade, or convert a replica set into a sharded cluster.
  • Schedule backups β€” pick a schedule and retention window, organise runs into folders, and optionally push copies offsite to S3 / R2. Each run shows up as a task you can open, and delete failures now surface an error instead of quietly doing nothing.
  • Set up alerts and auto-heal β€” get told when a cluster is unhealthy, and let VisuaLeaf bring failed members back on its own with the auto-heal toggle on each cluster card.
  • Place members deliberately β€” spread a replica set across regions or across different targets, one member at a time.
  • Adopt what already exists β€” point VisuaLeaf at a replica set you built yourself and watch it read-only, then take over management of it. It can also scan a remote Docker host or an SSH host for MongoDB it didn't create, recover a cluster whose container is gone but whose data volume survives, and add a new member to an existing set for you.
  • Remove things safely β€” a target that still has databases on it can't be removed, and the app tells you which ones are in the way. Adding an account you already added reuses it instead of creating a duplicate.

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 Support (BETA)

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.

  • Connect to any shape of Redis β€” standalone, cluster (with seed nodes), or Sentinel (with sentinel nodes and a master name), plus Redis Enterprise and Redis Cloud using their management APIs. Pick a database index, or authenticate with a username and password.
  • Browse keys β€” a searchable key tree with a value filter, so you can find 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).
  • Run commands β€” a Redis CLI tab with command help built in.
  • Read server health β€” the System Monitor button opens Redis Server Info for a Redis connection instead of a Mongo-shaped screen.
  • Manage security β€” the Users & Roles button opens Redis Security for a Redis connection: manage ACL users and permissions, set or change the server password, and manage users on Redis Enterprise and Redis Cloud. A banner makes clear that ACL changes apply to the remote Redis server, and the panel refreshes once instead of thrashing.

Backups & Exports to S3 / Cloudflare R2

  • Save your buckets once β€” a new Cloud Storage screen holds your S3 and Cloudflare R2 buckets with a connection test, so tasks can just pick one. Secrets are stored encrypted with no extra setup on your part.
  • Export to a bucket β€” pick a saved bucket and a path, and browse the bucket's folders (or create one) right from the picker instead of typing a path blind.
  • Restore from a bucket β€” a dump sitting in S3 or R2 can now be the source of a job, not just the destination.
  • Back up a whole cluster β€” every database in one job, and restore the same way.
  • Dated paths without editing the job β€” use date tokens in the path and every run lands in its own folder.
  • Job lists read correctly β€” object-storage sources and targets show up properly instead of a red "Unknown", and jobs that don't have a field mapping (whole-database and object-storage jobs) no longer show an irrelevant preview.

Improvements

Stability

  • An AI provider rejecting your key no longer signs you out of VisuaLeaf. You get a clear message about the AI key instead of being dropped back to the login screen.
  • Fixed a start-up failure that could stop the desktop app from opening at all.
  • Control your crash reports. Settings now has a Crash Reporting panel: send reports automatically, keep them local only, and view the recent ones yourself.

Tabs & Workspace

  • Put a popped-out tab back. A tab you popped into its own window can be returned to the main window.
  • Heavy tabs no longer break your workspace. Long-running monitor and oplog tabs used to be able to grow your saved workspace past its limit, which meant it stopped saving; they now keep their history locally and repaint instantly when you come back.
  • A workspace saved by a newer build opens in an older one instead of failing to load.
  • Custom tooltips across the app render properly instead of getting clipped at panel edges.
  • Select-all no longer runs away on very large selections.

Export & Import Jobs

  • Paste documents straight into a task β€” no file needed. An import task's file source now has a Paste JSON box: drop in an array or one document per line, hit Use this JSON, and it becomes the task's source. Handy for a quick one-off set of documents you'd otherwise have to save to disk first. Pasted data is kept as a file behind the scenes, so the job still streams, resumes, and re-runs like any other; anything over 8 MB should still come from a file.
  • One job at a time. Clicking a job that takes a moment to open no longer opens it three times.
  • Standalone imports are editable β€” choose insert, upsert, or drop-and-insert per import.
  • Exported queries match what you ran β€” a query saved into a job now carries its exact values, so ObjectId, Decimal128, dates, and binary fields survive round-tripping instead of being re-parsed from text.
  • Shell-style JSON import and export works correctly, including ObjectId(...) and friends.
  • Export tasks run on connection existence, not on whether the connection is currently open β€” a scheduled task no longer skips because you closed a tab.
  • Tell running, pending, and scheduled work apart at a glance in the Execution Monitor and a job's history β€” and when a section is empty, it says why instead of leaving you guessing.
  • Saving a job sticks. A batch of bugs where job and export settings didn't save, or came back changed after a reload, is fixed.
  • Renaming the key field no longer loses your records. An import that mapped _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).
  • Opening a run's log is instant, even on a job with a long history, and old execution history is cleaned up on a retention schedule instead of growing forever.
  • Import warnings belong to the right item. When several items of a task run at once, each one's warnings now stay with it instead of bleeding into its neighbours.
  • Job history and live progress work in the desktop app's own storage β€” some log and running-status lookups used to fail there, which could leave a running export looking stuck.
  • The help panels answer the question you have β€” bulk import, field mapping, and data-source variables now explain what to type and show an example.

Users & Roles

  • Rebuilt user and role management β€” clearer user and role lists, a cleaner create-user and create-role flow, role detail, and an effective-privileges view that answers "what can this user actually do?".

Queries, Aggregations & Profiling

  • Complex aggregations save correctly. Pipelines with nested stages and rich values used to come back altered β€” or not save at all. Save, reopen, and you get exactly the pipeline you wrote.
  • Aggregation builder uses the space it has β€” a much more compact, readable layout.
  • Aggregation history works again.
  • Query profiling shows correct data, and you can now inspect active sessions.
  • Copy and paste files in the file explorer, including JSON files.
  • Capped collections get a proper configuration panel, with a clear warning that converting is irreversible.

Naming & Navigation

  • Names that say what the tool does. The schema diagram is now Visual Schema (ERD), the JSON-schema editor is Schema Manager, and Mongo Sync is now Database Sync β€” since it moves data between SQL engines as well, not just MongoDB. Each new name is used everywhere: sidebar, tabs, and the command palette.
  • Every create flow goes through the same picker. Starting a chart, query, aggregation, shell, or schema from the welcome page, the + button, or the command palette now behaves identically, and each one only offers what the connection actually supports.
  • Redis sits in the same list as MongoDB, rather than in a separate tree of its own.

Dashboards & Onboarding

  • An empty dashboard offers to create a chart instead of leaving you at a dead end.
  • Pick your chart's source β€” including an aggregation β€” from a clearer source picker.
  • Check for updates manually from within the app.
  • Getting-started guides for the comparison and compare screens, and a refreshed getting-started modal.
  • The free-trial prompt only appears if you haven't already started a trial.

Notes

  • Deploy MongoDB and Redis support are BETA. They're complete enough to use daily, but expect rough edges; the destructive operations (destroy, convert-to-sharded, force reconfig) are all behind confirmations for a reason.
  • Deploying to a cloud provider needs your own account and credentials. VisuaLeaf spawns servers in your account and you pay your provider directly β€” nothing runs through us.
  • A cluster deployed with TLS uses a self-signed certificate. Use Download CA certificate on the cluster Overview tab to make other tools trust it.
  • Adopted clusters start read-only. A replica set you import is observed first; take over management explicitly when you're ready.
  • Existing workspaces, connections, and export jobs upgrade in place β€” nothing to migrate.
Read the full v1.0.2091 release notes

Looking for the latest version?

Go to Downloads