Wekan
Open source kanban board application built with Meteor
Alternative to: trello
v9.93
2026-07-15v9.93 2026-07-15 WeKan ® release
This release adds the following new features:
-
Snap: new
snap run wekan.migratecommand to force a fresh MongoDB → FerretDB migration (snap-src/bin/wekan-force-migrate, registered insnapcraft.yaml). Ignores thedatabasesetting and the migration marker, removes any partial FerretDB SQLite + resume checkpoint, then re-runs the migration so it re-reads the existing MongoDB (3 or 7) data and migrates text + attachments + avatars to FerretDB again. The source MongoDB data is never modified or deleted. Watch it withsnap logs -f wekan.mongodbor the migration dashboard. Thanks to xet7. -
Snap: new maintenance mode (
snap run wekan.maintenance on|off) so you can run MongoDB OR FerretDB by hand for data access (snap-src/bin/wekan-maintenance,snap-src/bin/wekan-maintenance-page.mjs, and the DB control scripts). While the$SNAP_COMMON/.wekan-maintenancemarker is present, the control scripts do not auto-migrate or auto-disable, sosnap start wekan.mongodb(old MongoDB data) orsnap start wekan.ferretdb(migrated FerretDB SQLite data) stays up instead of shutting itself down — letting you reach the data over the MongoDB wire protocol on port 27019 (one at a time; they share the port). WeKan itself serves an “under maintenance” page (HTTP 503) on the web port for all URLs while maintenance is on, so end users see a clear message. The page shows the Admin Panel product name if one is set (not “WeKan”): it is cached to$SNAP_COMMON/.productname.txtwhile a database is running (bywekan-controlon startup and by the migration importers), so it is still available in maintenance mode when both databases are stopped. Thanks to xet7.
and fixes the following bugs:
-
Snap:
db-evalcould not load the MongoDB driver, so EVERY database readiness check silently failed (snap-src/bin/db-eval.mjs; alsomigrate-schema-v843.mjs,migrate-gridfs-to-fs.mjs).db-evalis the small Node helper the snap uses (instead ofmongosh) to check whether MongoDB/FerretDB is up, elect the replica-set primary, and run the migration’s mongod-7 readiness probe. It didimport { MongoClient } from 'mongodb'and the wrapper setNODE_PATH=$SNAP/programs/server/node_modulesto point at the bundled driver — but Node’s ESM loader ignoresNODE_PATH(that env var is honored only by the CommonJS loader). So the import resolved nothing,db-evalexited before ever opening a connection, and everyping/primary/rs-*check “failed.” This was the single root cause behind a whole family of symptoms: WeKan looping “MongoDB not ready yet, retrying…” or “FerretDB not ready yet…” forever even though the database was running and listening; replica-set initialisation failing; and — most damaging — the MongoDB → FerretDB migration falling back to MongoDB 3.2 because the mongod-7 readiness probe never connected (mongod 7 opened the data fine, butdb-evalcouldn’t reach it, so migration-control wrongly concluded “mongod 7 can’t open this” and tried the 3.2 reader, which cannot read WiredTiger-7 files — producing no FerretDB SQLite). Proven by the migration source mongod log: mongod 7 reachedWaiting for connectionswith zeroConnection acceptedbefore being killed by the readiness timeout. Fixed by resolving the driver withcreateRequire(CommonJS, which does honorNODE_PATHand the bundle layout), anchored inside the modern bundle. Thanks to xet7. -
Snap: the presence of a FerretDB SQLite database — not the migration marker — now decides whether to use FerretDB, so a FAILED migration no longer leaves the snap with no database (
snap-src/bin/ferretdb-control,snap-src/bin/mongodb-control,snap-src/bin/wekan-control). An earlier attempt keyed the “use FerretDB / disable MongoDB” decision off the$SNAP_COMMON/.migration-to-ferretdb-donemarker. Butmigration-controlalso writes that marker when the migration falls back (data unreadable, tools missing) or when there is nothing to migrate — with no FerretDB data produced. So on a server whose MongoDB → FerretDB migration failed,mongodb-controlsaw the marker, logged “migration already finished; disabling mongodb service” and disabled MongoDB, while FerretDB’s SQLite was empty — leaving WeKan with no database at all, looping “MongoDB not ready yet, retrying…” forever and refusing to keepwekan.mongodbrunning. Now all three scripts decide from actual data on disk: MongoDB is disabled / FerretDB is forced only when a*.sqlitedatabase exists infiles/db; an emptyfiles/dbmeans the migration did not succeed, so MongoDB starts normally and WeKan keeps working while the migration can be retried. The check is a single shared helper (snap-src/bin/ferretdb-has-data) that requires a*.sqlitefile bigger than 0 bytes, not merely present, so a 0-byte stub never counts as “migrated”. Andmigration-control’sfinish_successnow verifies that non-empty SQLite (with its WAL) exists before switching to FerretDB — if the importer returns success but wrote no data, the snap keeps MongoDB and retries next start instead of switching to an empty database. Thanks to xet7. -
Snap: the migration’s mongod-7 readiness probe fast-fails when the temporary mongod has exited (
snap-src/bin/migration-control).ready_via_nodewaits up to 45 s for the temporary source mongod to accept connections (a large MongoDB 6/7 database can need that long to replay its journal, #6454), but it now also checks the process is still alive: if the temp mongod has exited — e.g. mongod 7 cannot open old MongoDB 3.x data — it stops waiting immediately and drops to the MongoDB 3.2 reader instead of pinging a dead process for the full timeout. Matters across many unattended 6.09 → 9.x upgrades. Thanks to xet7.
Thanks to above GitHub users for their contributions and translators for their translations.