Wekan
Open source kanban board application built with Meteor
Alternative to: trello
v9.92
2026-07-15v9.92 2026-07-15 WeKan ® release
This release fixes the following bugs:
-
Snap: WeKan never started on a running MongoDB, looping “MongoDB not ready yet, retrying in 5 seconds…” forever, on any server with less than ~34 GB RAM (#6454,
snap-src/bin/mongodb-control,snap-src/bin/migration-control). The WiredTiger cache size was hardcoded to 32 GB. On a smaller box (e.g. 8 GB) mongod was OOM-killed seconds after it started — including the temporary mongod thatmongodb-controlstarts to initialise the replica set, which died before it could be reached, so the replica set was never initiated. The final mongod then ran with--replSet rs0but no config, no PRIMARY was ever elected, and since Meteor requires the replica-set primary (change streams),wekan-controlwaited on it forever. Fixes: (1) the cache size is now RAM-aware — ~50 % of (RAM − 1 GB), the same formula mongod uses for its own default, capped at 32 GB, min 1 GB, overridable withMONGODB_WIREDTIGER_CACHE_GB; (2) the temporary-mongod readiness wait is raised from 30 s to 90 s so a large database that needs longer to replay its journal still gets its replica set initialised; and (3) the temporary source mongod that the MongoDB → FerretDB migration starts to read the data now uses a conservative RAM-aware cache (¼ of (RAM − 1 GB), cap 8 GB) so it leaves room for the target FerretDB and the importer running alongside it. Thanks to xet7. -
Snap: the MongoDB 6/7 → FerretDB importer now resolves the correct driver and matches the MongoDB 3.2 importer’s safety and dashboard (
releases/migrate-mongodb-to-ferretdb.mjs). It now (a) resolves themongodbdriver by probing the WeKan bundle and using whichever actually works — preferring a v6+ driver that exposesGridFSBucketand speaks OP_MSG, because an older v2 driver’s OP_QUERY is rejected by FerretDB (“Unsupported OP_QUERY command: update”); and (b) gained the same disk-space guard and progress UI asmigrate-mongo3-to-ferretdb.mjs: it measures the total attachment/avatar size up front and stops before extracting if it will not fit, and if space runs out mid-run it stops, deletes the partially-migrated files, and reports how much more disk is needed (a full disk can corrupt the still-running source MongoDB), shows a live per-file progress bar, and translates the dashboard into the browser’s language. Thanks to xet7. -
Snap: verified the migration’s disk-space guard actually works inside snap confinement (
snap-src/bin/migrate-mongo3-to-ferretdb.mjs,releases/migrate-mongodb-to-ferretdb.mjs— comment/documentation only, no behaviour change).statfs(andstatfs64/fstatfs/fstatfs64/statvfs/fstatvfs) is in snapd’s default seccomp allow-list (snapcore/snapd→interfaces/seccomp/template.go), and a snap has no per-snap disk quota by default, so the migration’s free-space check (statfsSyncon$SNAP_COMMON/files) returns the real free space and its “stop before the disk fills” safety is fully active on Snap.quotactlis not allowed, but the migration never calls it; the one case it would matter — a snapd storage-quota group (project quotas invisible tostatfs) — is still caught by theENOSPC/EDQUOTwrite-failure fallback. Only Sandstorm grains genuinely lackstatfs(FUSE does not implement it,quotactlblocked), where the guard already relies on that write-failure fallback. Thanks to xet7. -
Snap: after a MongoDB → FerretDB migration, FerretDB never started and WeKan was stuck on “MongoDB not ready yet, retrying…” (
snap-src/bin/migration-control). Thewekan.ferretdbservice disables itself whiledatabaseismongodb; the migration then switches the snap with an internalsnapctl set database=ferretdb, but an internalsnapctl setdoes not re-run theconfigurehook that flips the two database services — so FerretDB was left disabled and MongoDB enabled but stopped, leaving WeKan with no database (both bind the same port, so only one runs at a time).finish_successnow performs the flip itself, exactly as the configure hook’s ferretdb branch does: enable + start (and restart)wekan.ferretdb, then stop + disablewekan.mongodb— using the snap instance name so parallel snaps target their own services. Immediate recovery on an already-migrated install — flip the setting so theconfigurehook re-runs and enables + starts FerretDB and stops MongoDB (do not trysnap start wekan.ferretdbdirectly; whiledatabaseis stillmongodb, ferretdb-control reads the setting and disables itself again — see the next entry):sudo snap set wekan database=ferretdb. Thanks to xet7. -
Snap: the migration-success marker is now authoritative, so FerretDB starts even if the
databasesetting was never flipped (snap-src/bin/ferretdb-control,snap-src/bin/mongodb-control,snap-src/bin/wekan-control). Every DB service keyed its behaviour off thedatabasesetting alone:ferretdb-controllogged “database is ‘mongodb’, not ‘ferretdb’. Disabling ferretdb service.” and self-disabled whenever the setting still saidmongodb— so on an already-migrated installsnap start wekan.ferretdbstarted and then immediately stopped itself, unfixable by hand without first settingdatabase=ferretdb. Now the marker$SNAP_COMMON/.migration-to-ferretdb-doneoverrides the setting: when present,ferretdb-controlrepairsdatabase=ferretdband keeps running instead of self-disabling;mongodb-controldisables itself (before the migration-pending check, so a finished migration is never re-attempted); andwekan-controlforces ferretdb and brings the service up. WeKan thus recovers on its own after a migration whose setting flip was lost. Thanks to xet7. -
Snap: WeKan now starts its database itself on startup instead of waiting forever for a stopped one (
snap-src/bin/wekan-control). Previously thewekan.wekanservice only waited for whichever databasedatabasepointed at (FerretDB not ready yet…/MongoDB not ready yet…) and never started a DB service, so if bothwekan.ferretdbandwekan.mongodbwere stopped/disabled WeKan hung indefinitely. Now, before waiting, it enables + starts whichever DB service is configured (snapctl start --enable=snap enable+snap start, targeting the snap instance name so parallel snaps hit their own services). Thanks to xet7. -
Snap: WeKan never starts an EMPTY FerretDB while data still lives in MongoDB (
snap-src/bin/wekan-control). On startup WeKan now checks what data actually exists on disk — the FerretDB SQLite dir ($SNAP_COMMON/files/db) and the MongoDB WiredTiger data ($SNAP_COMMON) — instead of trusting thedatabasesetting alone. Ifdatabase=ferretdbwas selected (or forced) but the migration never ran, so the SQLite database is empty while MongoDB still holds the data, WeKan reverts todatabase=mongodband prints how to run the migration, rather than starting an empty FerretDB that would look like all data was lost. Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.