This release adds 1 notable feature for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+2 more
Summary
AI summaryFixes FerretDB login resume breakage and makes MongoDB‑to‑FerretDB snap migrations resilient to interruptions.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Low |
Automatically publishes snap releases to the Snap Store `stable` channel. Automatically publishes snap releases to the Snap Store `stable` channel. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Bugfix | High |
Fixes FerretDB migration logout loop caused by positional operator query. Fixes FerretDB migration logout loop caused by positional operator query. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Bugfix | High |
Prevents snap refresh from discarding partial FerretDB migration progress. Prevents snap refresh from discarding partial FerretDB migration progress. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Bugfix | Medium |
Avoids double disk usage when resuming interrupted snap migration attachment extraction. Avoids double disk usage when resuming interrupted snap migration attachment extraction. Source: llm_adapter@2026-07-15 Confidence: high |
— |
| Bugfix | Medium |
Ensures partial FerretDB migration checkpoint and SQLite are discarded together. Ensures partial FerretDB migration checkpoint and SQLite are discarded together. Source: llm_adapter@2026-07-15 Confidence: high |
— |
Full changelog
v9.95 2026-07-15 WeKan ® release
This release fixes the following bugs:
-
FerretDB: WeKan did not work after migrating to FerretDB — every logged-in browser was
logged out again and the database CPU was pinned at 100% (#6457,
server/accounts-resume-login.js,server/imports.js). Meteor'saccounts-base"resume"
login handler projects one array element with the positional operator
({fields: {'services.resume.loginTokens.$': 1}}), and FerretDB rejects that find with
"Executor error during find command :: caused by :: positional operator '.$' couldn't find
a matching element in the array" (code 51246). Resume is how an already-logged-in browser
re-authenticates on every page load and every DDP reconnect, so the throw logged the user
out, the client reconnected, resume threw again, and the retry loop pinned the FerretDB CPU —
the board looked broken right after a migration that had just taken hours. WeKan now replaces
that login handler with one that projects the whole (small)loginTokensarray and picks the
matching token in JavaScript — which is what upstream already does in its own$orfallback
query, so nothing else about login behaviour changes. Thanks to markusst1982 and xet7. -
Snap: a snap refresh during the MongoDB → FerretDB migration threw away hours of migration
progress (snap-src/bin/migration-control,releases/migrate-mongodb-to-ferretdb.mjs,
snap-src/bin/migrate-mongo3-to-ferretdb.mjs). A big migration can run for 5 hours, so
being interrupted by a snap refresh,snap stopor a reboot is normal — but it was treated
as a failure: snapd's SIGTERM killed the importer,migration-controlread its signal exit
code (143) as "the migration failed", andfail_and_run_mongodbdeleted the partial FerretDB
SQLite and setmigrate=off. Every refresh meant starting the whole migration from zero.
Now an interruption is distinguished from a failure (a SIGTERM/SIGINT trap, plus an importer
exit code >= 128) and keeps the partial database and the checkpoint, leaves auto-migration
on, and hands back to MongoDB so WeKan keeps working until the next start resumes. Thanks
to markusst1982 and xet7. -
Snap: an interrupted migration re-extracted every attachment, needing double the disk space
(releases/migrate-mongodb-to-ferretdb.mjs,snap-src/bin/migrate-mongo3-to-ferretdb.mjs).
Only fully-copied collections were checkpointed; the file phase started over, and because the
destination path was picked with a "add a_1,_2, … counter while the file exists" loop,
every already-extracted attachment was written a second time under a new name, orphaning
the first copy — so a resumed migration silently needed twice the disk the up-front space check
had budgeted for. Extracted files are now checkpointed individually (recorded only once the
bytes are on disk and the record points at them, and re-verified by size on resume, so a
half-written file is never mistaken for a finished one) and skipped when resuming, and the
destination path is deterministic — an existing file at that path can only be this record's own
partial extraction, so it is overwritten. The MongoDB 3 importer had no checkpoint at all and
now resumes collections and files the same way. Thanks to markusst1982 and xet7. -
Snap: discarding a partial FerretDB migration left the resume checkpoint behind, so the retry
could switch to a database missing most of its data (snap-src/bin/migration-control). The
importer's checkpoint lists the collections it has already copied and lives in$SNAP_COMMON,
not in the SQLite directory thatdiscard_partial_ferretdbwipes — so it survived. The next
migration then trusted it, skipped every "already migrated" collection, copied only the rest into
the now-empty database, and reported success — leaving the snap serving a FerretDB missing most
of its data. The checkpoint is only meaningful together with the SQLite it describes, so the two
are now always discarded together. Thanks to markusst1982 and xet7. -
Snap: releases are now published to the Snap Store
stablechannel automatically
(.github/workflows/release-all.yml). Both snap jobs (native and Launchpad) pushed only to
candidate,betaandedge, andstablehad to be released by hand afterwards. Both now
publish tostable,candidate,beta,edge. Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About wekan
The Open Source kanban, built with Meteor. GitHub issues/PRs are only for FLOSS Developers, not for support, support is at https://wekan.fi/commercial-support/ . New English strings for new features at imports/i18n/data/en.i18n.json . Non-English translations at https://app.transifex.com/wekan/wekan only.
Related context
Related tools
Beta — feedback welcome: [email protected]