Two things in 0.11. The app stops locking you out when a licence expires, and the MongoDB IntelliShell went through a full audit — not a code review, an audit against the running build, which is how we found sixteen defects that reading the source had not.
The App No Longer Locks
Previously, a trial that ran out or a subscription that lapsed left the client in a locked state. That was always the wrong shape: the thing you need your database client for is rarely scheduled around your billing cycle.
Now a lapsed licence drops you to the Free tier — the real client, all five engines, the editor, the grid, delete recovery, limited to three saved connections and personal use. Nothing is held hostage, and your connections, history and snippets stay where they are. Alongside that we removed a set of licence flags that gated nothing at all, which is a small change with a clear rule behind it: a check that does not correspond to a real limit is not a licence check, it is a bug waiting for a support ticket.
Sixteen Defects in the Mongo Shell
The IntelliShell is meant to behave like a mongo shell session: variables, loops, comments, helper functions, mixed with aggregations and collection methods. "Meant to" is doing a lot of work in that sentence, so we tested it the only way that answers the question — by driving the built application with Playwright, typing into the real editor, and reading the real result panel. No unit tests standing in for user behaviour.
Some of what came back:
- Deletes that wrote no backup. The pre-pass that snapshots documents into
the changelog ran in a context missing the shell's own constructors, so a filter written
with
NumberLong()or a bareISODate()threw inside the capture, the throw was swallowed, and the delete proceeded with nothing recorded. Recovery was silently unavailable for exactly the filters most likely to match a lot of documents. - Bracket notation skipped the parser.
db["orders"].deleteMany({})reads identically todb.orders.deleteMany({})but missed the statement parser entirely: no default limit, and no changelog entry. Two scripts that look the same have to be as safe as each other. - Delete recovery was broken outright. The changelog builds its restore
scripts with
ObjectId("…"), the way the mongo shell writes it — withoutnew. The driver'sObjectIdis a real class, so calling it plainly threw and the restore failed. The sandbox now hands out a proxy that is callable as well as constructible. - Keyboard shortcuts bypassed the safety dialog. The destructive-statement confirmation guarded the buttons and not the keybindings — the users fast enough to use shortcuts got no dialog at all.
-
var a = 1, b = 2assignedb's value to both. - Every operator snippet lost its name. Monaco reads a bare
$namein a snippet as a variable reference and substitutes it away, so picking$matchfrom the completion list inserted: { }. All 57 operator and stage snippets needed escaping, and a test now holds the completion lists and the executor honest about each other in both directions. - A line comment without a trailing semicolon swallowed the next statement.
Three findings from the first pass were not defects at all — they were artefacts of our own harness, because typing into Monaco through a synthetic keyboard triggers auto-closing brackets and produces input the user never typed. Worth saying out loud: a black-box test that lies to you is more expensive than no test, and the fix was pasting via the clipboard and reading the editor back.
Results That Look Like Results
The result panel now converts BSON to Extended JSON in the main process, before the values
cross the IPC boundary — structured clone strips class identity, which is why an
ObjectId used to arrive in the renderer as an anonymous object. Typed cells
render with their own icons, and anything that is not tabular falls back to shell-style text
in the output pane rather than an empty grid, the way a terminal session would show it.
Abort Now Reaches the Server
Aborting a MongoDB operation used to drop the client's interest in the result. The server
kept going. Runs are now tagged with a comment, and abort locates the operation through
$currentOp and issues a real killOp. Write operations carry the
comment only where the server understands it — MongoDB 4.4 and up — so
legacy servers keep working exactly as before.
Also In This Release
- Fixed a renderer crash in the connection forms, from reading an event target inside a state updater after React had already nulled it.
- An SSH jump-host fixture in the end-to-end suite, so bastion connections are covered by tests rather than by hope.
- Three more feature recordings on the walkthrough.