Wekan logo

Wekan

Open source kanban board application built with Meteor

Alternative to: trello


About Versions (218)

v11.00

2026-08-17

Binaries in these bundles

Each bundle carries a Node.js, a FerretDB and the MongoDB Database Tools. Which source has a given CPU varies from release to release - nodejs.org builds some architectures, unofficial-builds others, and the wekan/node-patches build the ones neither of them does - and not every source publishes a checksum. This is what went into this release, and which downloads were checked against a published SHA256.

BundleBinaryFromVersionCheckedSHA256
amd64FerretDBwekan/FerretDBv1.53.0verifiedeae1f0a8f73bfc97…
amd64Node.jsnodejs.orgv24.19.0verified14b342e71204f811…
arm64FerretDBwekan/FerretDBv1.53.0verifiedbdc50caee3ac2849…
arm64Node.jsnodejs.orgv24.19.0verified01443c1e1a29e531…
armhfFerretDBwekan/FerretDBv1.53.0verifiedf7f050207e656d65…
armhfNode.jswekan/node-patchesv24.19.0verifiedb55350f3071b765a…
armv6FerretDBwekan/FerretDBv1.53.0verified34f5f553dcd2bff3…
armv6Node.jswekan/node-patchesv24.19.0verified128ded0cda638c1f…
armv7FerretDBwekan/FerretDBv1.53.0verifiedf7f050207e656d65…
armv7Node.jswekan/node-patchesv24.19.0verified8dbe0a9aa8550ad5…
i386FerretDBwekan/FerretDBv1.53.0verified515b1189b4c7d58f…
i386Node.jswekan/node-patchesv24.19.0verified3b0b3bbfe27daf58…
mac-arm64FerretDBwekan/FerretDBv1.53.0verifiedcb14ffe93e285903…
mac-arm64Node.jsnodejs.orgv24.19.0verified3f1cf157479c1480…
mac-x64FerretDBwekan/FerretDBv1.53.0verifiedd97dfa9afa60aa05…
mac-x64Node.jsnodejs.orgv24.19.0verifiedd35e95230f46f6f0…
ppc64leFerretDBwekan/FerretDBv1.53.0verified481d36a80ec73673…
ppc64leNode.jsnodejs.orgv24.19.0verifiedc510c6ce12f07010…
riscv64FerretDBwekan/FerretDBv1.53.0verified4b43f86eb0f3fa0b…
riscv64Node.jsunofficial-builds.nodejs.orgv24.19.0verifiedcd1f14af28121480…
s390xFerretDBwekan/FerretDBv1.53.0verifiedfe74e03894b84897…
s390xNode.jsnodejs.orgv24.19.0verifieda4792e65962ffa0a…
win-arm64FerretDBwekan/FerretDBv1.53.0verifiedf1186c310a4dd144…
win-arm64Node.jsnodejs.orgv24.19.0verified8502f4a50b458d4c…
win64FerretDBwekan/FerretDBv1.53.0verifiedc6dad7bc8ad56f47…
win64Node.jsnodejs.orgv24.19.0verified57f71ab3652e797d…

A row saying no checksum published is not a failed check - it is a source that publishes nothing to check against. Those are the ones worth fixing at the source.

v11.00 2026-08-17 WeKan ® release

In short: RouteBleed, found by GitHub CodeQL, removes an incompletely escaped dynamic regular expression from board-export route coverage. All Boards on phones uses one native page scroller in mobile and desktop UI modes, so ordinary boards, invitation controls and table rows remain reachable with the same vertical swipe; the shared layout extends that behavior to every page. Snap database recovery can read retained MongoDB 4.x, 5.0, 6 and 7 data and merge it into the live FerretDB without opening SQLite twice. Helm containers size the Node.js heap from their memory limit, and the official chart supplies enough memory for startup plus native allocations. Minicard titles save again from their inline editor, and card dates can be reopened, changed or deleted again after they have been saved. Full-suite repairs keep the shared date form registered before its events, preserve the one mobile page scroller in mobile-view mode, and make the standalone E2E browser selection architecture-safe. Translations reuse 3,838 unambiguous same-language values, and the new reports are complete in Finnish. Regression coverage now exercises inline minicard title editing in the browser and guards the Finnish Office and API report vocabulary directly. Requested By and Assigned By say Edit when their free-text value already exists and Add when it is empty.

PlatformBinaryFromVersionSHA256
amd64Node.jsnodejs.orgv24.19.014b342e71204f811bde6153be8e04b62aef63c236fef92b55f9c83154b409647
amd64FerretDBwekan/FerretDBv1.53.0eae1f0a8f73bfc979738bfff7284d40fd1bc55de2cc56514721fc155c3624f7d
arm64Node.jsnodejs.orgv24.19.001443c1e1a29e531ccad5a46fefa6df490d2189c49f7955904aecdbb0fe86fdc
arm64FerretDBwekan/FerretDBv1.53.0bdc50caee3ac28495b42d2130b94a042a9dd6d3a38f732cac02b648f36c891da
mac-arm64Node.jsnodejs.orgv24.19.03f1cf157479c1480352083105e13faf9d008ede98e7e157746b6df940d197b94
mac-arm64FerretDBwekan/FerretDBv1.53.0cb14ffe93e285903e5a8a9c1821687ddb5b8a979a11c584bf4af534b272c6d3e
mac-x64Node.jsnodejs.orgv24.19.0d35e95230f46f6f0751df497c56622c6735e05d5e1fb1630996a005b9d328fe4
mac-x64FerretDBwekan/FerretDBv1.53.0d97dfa9afa60aa05f25384327de82efe7b71d958ed24c1f66618284294a65cd3

This release fixes the following SECURITY ISSUES found by GitHub CodeQL code scanning:

RouteBleed: route coverage compares exact text instead of an incompletely escaped pattern. Thanks to GitHub CodeQL code scanning and xet7.

RouteBleed - code scanning alert #434, rule js/incomplete-sanitization (CWE-20, CWE-80 and CWE-116), in tests/boardExportScope.test.cjs: an export path was interpolated into a dynamic regular expression after escaping only forward slashes. Backslashes and every actual regular-expression metacharacter remained active, so the test could match a different route, fail to match the intended one or fail to compile.

The code was test-only, read a hardcoded route table and is never shipped in a WeKan bundle, so there was no runtime or user-input exposure. There is no denied operation to attribute in Admin Panel → Problems. The fix removes the pattern rather than adding another sanitizer: the test wants an exact route literal and now checks that exact string with includes().

Positive and negative cases cover backslashes and the full metacharacter set, and a repository-wide guard rejects the reported slash-only escape shape in tracked JavaScript. The same sweep removed a second partial dynamic pattern from release-bundle coverage.

and fixes the following bugs:

All Boards - scrolling the overview on a phone.

One vertical swipe reaches every board and invitation control. Thanks to mimZD and xet7.

The page had nested vertical overflow panes on #content, its wrapper, the left menu, the icon grid and the table view. A swipe could be captured by the wrong pane, and an invited-board tile’s Accept and Decline controls made its grid row taller than the percentage-height chain expected, leaving boards below it unreachable.

#content is now the one native vertical scroller. The wrapper, both columns, the board grid and the table page contribute their natural height to it, so a gesture has one owner and invitation controls are not clipped. Regression tests cover ordinary tiles, invitations, table view, viewport sizing and reject a second nested vertical scroller.

Desktop mode on a phone can scroll every page to its end. Thanks to xet7.

The narrow-device rule made the body a viewport-sized, non-scrolling box, but made #content non-scrollable too. Mobile UI mode happened to restore its overflow through a more specific selector; explicitly selecting desktop UI mode did not, so the bottom of All Boards and other pages was clipped behind the browser controls.

The phone viewport and content-scroller contract now lives in the shared page layout rather than the All Boards stylesheet. The top header stays separate while #content scrolls in both UI modes on every route. All Boards continues to use that one scroll owner for Starred, Remaining, Public, Archived, Workspaces and every other left-menu section. Source and negative tests reject a hidden content pane, and the phone browser test toggles to desktop mode before checking that its final board remains visible.

Snap database recovery - comparing and merging the retained database copy.

Recovery uses the compatible MongoDB reader and the live FerretDB. Thanks to waltermhl and xet7.

database-compare and database-merge tried only the current MongoDB 7 executable, although the migration carries MongoDB 5.0 and 4.2 readers for older WiredTiger formats. A retained MongoDB 4.x or 5.0 database was therefore reported as unreadable, and merge had no source from which to recover the missing work.

Both recovery phases now use the same 7, 5.0 and 4.2 compatibility ladder as migration, safely skipping readers absent on an architecture and naming the startup log when all of them fail. Merge also reuses a running FerretDB target; it no longer starts a second FerretDB against the already-open SQLite database. Only temporary processes are stopped afterwards, so a live database borrowed for the operation remains running.

Helm containers - the memory available while the server starts.

The Node.js heap fits its container and the official pod fits the heap. Thanks to titver968 and xet7.

The official chart limited WeKan to 1 GiB while its own comments claimed the Docker image supplied a 4 GiB heap setting. It did not: Node.js 24 derived a roughly 640 MiB V8 ceiling from the cgroup, and the v10.96+ server bundle could exhaust it while linking and creating startup indexes, before ordinary application logging began.

The container now gives V8 three quarters of its cgroup memory, from 768 MiB up to the documented 4 GiB ceiling, leaving one quarter for native allocations. An administrator’s explicit NODE_OPTIONS always wins. The official chart now requests 512 MiB and limits the WeKan pod to 2 GiB, providing a 1536 MiB heap plus 512 MiB of native headroom by default.

Minicards - editing a card directly on the board.

Saving an inline title edit renames its minicard again. Thanks to Heart1010 and xet7.

The title editor is a nested inlinedForm, whose submit event receives the form arguments as this, not the Card document. Saving therefore called getTitle() on { classNames: "js-minicard-title-form" }, threw a TypeError and restored the old title.

The handler now takes the Card from its enclosing minicard template instance, compares and saves through that document, and never treats the nested event context as a Card. Empty and unchanged titles remain no-ops.

Opened cards - editing dates that are already stored on a card.

Saved card dates can be changed and deleted again. Thanks to Alishara and xet7.

The common date form became a child Blaze template, but its Save, Delete and validation event map remained on each parent popup. Blaze does not dispatch a child template’s events to its parent’s event map, so the form rendered its existing value while every control inside it was inert.

The common form now owns its common event handlers and receives the parent popup’s state and field-specific callbacks explicitly. Received, start, due, end, vote, planning-poker and custom-field dates retain one shared form, and a browser regression test changes a previously stored due date.

Clicking any saved card date reopens its editor with the Card context. Thanks to xet7.

The first date could be added because its plus button lives directly in the opened card’s data context. Once saved, however, the date became a shared badge whose child-template data contains only display arguments. Clicking that badge passed those arguments to the popup as though they were a Card, so calls such as getStart() and getReceived() threw and no editor appeared.

Every received, start, due, end, vote and planning-poker date badge now opens its popup explicitly with the surrounding date template’s Card and stops the click before the opened-card handler can create a second popup. Source-level positive and negative tests cover all four ordinary card dates, and the browser suite adds a saved start date, reopens it, changes it and verifies the new date.

Populated Requested By and Assigned By text fields say Edit instead of Add. Thanks to xet7.

The free-text control previously said Add regardless of whether the field was empty or already displayed a value. Both opened-card fields now use the existing translated Edit label when text exists and retain Add only for an empty value; their separate plus button continues to open the board-member selector.

The source guard checks both branches for both fields, including the empty-value negative case. Browser coverage seeds populated Requested By text beside an empty Assigned By field and verifies that the two controls render Edit and Add respectively.

The full test run - client startup, mobile scrolling and portable test execution.

The newest full-suite regressions are repaired and diagnosed at their source. Thanks to xet7.

The shared date form registered its Blaze event map before its Jade template existed, throwing on client startup and leaving Node E2E and every browser test on a blank page. The forms feature now creates editDateForm before the datepicker library attaches its events, with an import-order regression guard.

On phone-sized All Boards pages, the more-specific .board-list.mobile-view rule overrode the new natural-height list and restored a nested vertical scroller. The phone rule now covers both selectors, so #content remains the one swipe owner in either view.

The standalone E2E runner now discovers current Playwright cache revisions and rejects a Chromium binary for the wrong CPU architecture. Failed page renders also report browser exceptions and failed requests instead of only an empty body. The remaining completed failures were stale guards updated for the shared export document, server-supplied download names, reorganized LDAP documentation, the translation-memory helper and explicit bundle-smoke Node binary.

and adds the following developer-facing test coverage:

Upcoming minicard and Finnish translation changes have direct regression tests. Thanks to xet7.

The browser suite now edits a minicard title from the board and verifies that the card is renamed without opening its details. Its negative case submits only whitespace and verifies that the original title remains visible.

A plain Node.js suite inventories every Office and API report translation in Finnish, rejects missing, empty and unintended English placeholders, and keeps the universal API, REST API and WITH_API=true terms recognizable. The existing Upcoming tests continue to cover RouteBleed, phone scrolling, Snap recovery, container heap limits, card dates and same-language translation memory, including their negative cases.

and improves translations:

Translation completeness - filling only English placeholders, without an external translation service.

Repeated source text reuses unambiguous translation memory from the same language. Thanks to xet7.

WeKan has many keys with identical English text. When a language already has exactly one non-English translation for that source, the same value can safely fill its still-English copies without guessing or crossing a language boundary. This filled 3,838 placeholders across 227 language files.

The reusable pass is dry-run by default, writes only when explicitly asked, never replaces an existing target translation, and leaves a source untouched when its translations disagree. Tests pin all four constraints; the human-preference and wrong-script checks remain clean.

The Office and API reports are translated into Finnish. Thanks to xet7.

All fourteen translatable strings added by the two Admin Panel → Problems reports now have Finnish labels, descriptions and empty-state messages. Product names, protocol acronyms, numbers and symbols remain unchanged because those values are already the same in Finnish.

Thanks to above GitHub users for their contributions and translators for their translations.