Wekan
Open source kanban board application built with Meteor
Alternative to: trello
v10.64
2026-08-04Binaries 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 fork 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.
| Bundle | Binary | From | Version | Checked | SHA256 |
|---|---|---|---|---|---|
| arm64 | FerretDB | wekan/FerretDB | latest | verified | 275ae50ac97e6a70… |
| arm64 | FerretDB | wekan/FerretDB | latest | verified | 275ae50ac97e6a70… |
| arm64 | Node.js | nodejs.org | v24.19.0 | verified | 01443c1e1a29e531… |
| arm64 | Node.js | nodejs.org | v24.19.0 | verified | 01443c1e1a29e531… |
| mac-arm64 | FerretDB | wekan/FerretDB | latest | verified | 639ed58b84820b3d… |
| mac-arm64 | FerretDB | wekan/FerretDB | latest | verified | 639ed58b84820b3d… |
| mac-arm64 | Node.js | nodejs.org | v24.19.0 | verified | 8294b7aa9b039974… |
| mac-arm64 | Node.js | nodejs.org | v24.19.0 | verified | 8294b7aa9b039974… |
| ppc64le | FerretDB | wekan/FerretDB | v1.45.0 | verified | de4518c7774d3025… |
| ppc64le | FerretDB | wekan/FerretDB | v1.45.0 | verified | de4518c7774d3025… |
| ppc64le | Node.js | official | v24.19.0 | verified | c510c6ce12f07010… |
| ppc64le | Node.js | official | v24.19.0 | verified | c510c6ce12f07010… |
| riscv64 | FerretDB | wekan/FerretDB | v1.45.0 | verified | 7dc2952f554e8800… |
| riscv64 | FerretDB | wekan/FerretDB | v1.45.0 | verified | 7dc2952f554e8800… |
| riscv64 | Node.js | unofficial | v24.19.0 | verified | cd1f14af28121480… |
| riscv64 | Node.js | unofficial | v24.19.0 | verified | cd1f14af28121480… |
| s390x | FerretDB | wekan/FerretDB | v1.45.0 | verified | 0ae2e2f2cffdc5dd… |
| s390x | FerretDB | wekan/FerretDB | v1.45.0 | verified | 0ae2e2f2cffdc5dd… |
| s390x | Node.js | official | v24.19.0 | verified | a4792e65962ffa0a… |
| s390x | Node.js | official | v24.19.0 | verified | a4792e65962ffa0a… |
| win64 | FerretDB | wekan/FerretDB | latest | verified | f6337994368a52d0… |
| win64 | FerretDB | wekan/FerretDB | latest | verified | f6337994368a52d0… |
| win64 | Node.js | nodejs.org | v24.19.0 | verified | 57f71ab3652e797d… |
| win64 | Node.js | nodejs.org | v24.19.0 | verified | 57f71ab3652e797d… |
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.
v10.64 2026-08-04 WeKan ® release
In short: this release hardens how the multi-platform release is assembled.
The Node.js and FerretDB inside every platform bundle become named,
checksummed binaries, so the release provenance table can say exactly which
build each platform carries - the thing you need when a Node.js CVE lands;
the four native bundles used to ship whatever Node the GitHub runner carried
(cp $(command -v node)), and arm64 was even shipping Node 22 because
its job had no setup-node. Separately, the base bundles (amd64, arm64)
are now attached to the release loudly and verified, and - the real fix behind
that - the release job checks out before downloading the bundles instead of
after: the after-checkout deleted the just-downloaded zips (that is what
shipped v10.63 and v10.64 with no amd64/arm64 bundle, 404’ing every snap
build). And i386/armhf are skipped when no Node.js exists for them anywhere
instead of failing the run every release. It
also fixes an Admin Panel bug where a report opened by its own URL came up
empty over data that was plainly there, because the subscription was cancelled
by its own count re-render.
This release fixes the following release-build issues:
Bundle provenance - which Node.js and FerretDB binary each platform ships.
Every native bundle ships a named, checksummed Node.js and FerretDB instead of the runner's node. Thanks to xet7.
The amd64, arm64, win64 and mac-arm64 bundles embedded Node.js with cp $(command -v node) - the runner’s node. A bare binary extracted onto the
runner publishes no checksum, so releases/record-provenance.sh could only
write no checksum published, and the provenance table at the top of the
release could not name the exact Node.js build a platform carried. It was also
the wrong build on arm64: build-arm64 has no setup-node step, so
$(command -v node) was ubuntu-24.04-arm’s DEFAULT Node 22.x, not the
pinned Node 24 every other bundle shipped - and nothing recorded the
disagreement. A new releases/embed-verified-node.sh downloads the pinned
Node.js for the bundle’s OS+CPU from nodejs.org, verifies the archive against
the published SHASUMS256.txt (fatal on a mismatch), and puts its node into
the bundle; each native job now calls it and records nodejs.org + the exact
version + the verified SHA256. FerretDB is verified the same way, against the
.sha256sum wekan/FerretDB now publishes beside every binary, and win64 and
mac-arm64 - which recorded no provenance at all - now upload a provenance
artifact like amd64 and arm64, so every platform is accounted for. The
emulated arches already did this through install-node-for-arch.sh.
tests/releaseNodeVerified.test.cjs pins that no native bundle can go back to
the runner’s node or an unverified download.
Release assembly - attaching the base bundles, and the arches that can be built at all.
The base amd64/arm64 bundles are attached loudly and verified, not silently by softprops. Thanks to xet7.
Every bundle except amd64 and arm64 attaches itself with gh release upload --clobber, which fails on a missing file and is verified from the release
side. The two base bundles were the exception: the central release job
attached them with softprops files:, which does NOT fail on an unmatched
file. So when a run produced no base zip, softprops created the release with
none of them and reported success - and v10.63
shipped with no amd64 or arm64 bundle at all, which 404’d every snap build
(native, wekan-ondra, wekan-gantt-gpl) on wekan-10.63-amd64.zip. softprops
also never listed the .sha256sum, so the base bundles had no checksum beside
them. The release job now creates the release with softprops (so it exists for
the self-attaching jobs) and attaches amd64/arm64 in a following step with gh release upload --clobber - failing the release if a base bundle is missing or
empty, rather than 404’ing ten downstream jobs - and it checksums the exact
bytes it attaches, so the base bundles get a .sha256sum like the rest. (Why
the base zip was missing in the first place is the next entry - the loud,
verified attach is what turned that silent gap into a failed release that
names it.)
The release job checks out before downloading the bundles, so the checkout stops deleting them. Thanks to xet7.
The real reason v10.63 (and then v10.64) shipped with no amd64/arm64 bundle was
not softprops - it was the checkout. The release job downloaded the bundles
into the workspace and THEN ran actions/checkout for the provenance script.
The workspace is not a git repository at that point, so checkout’s very first
act is “Deleting the contents of ‘<workspace>’” to make room for a fresh
clone - and it does this even with clean: false, which only skips the
git clean in an already-checked-out repo, not the initial wipe. The
just-downloaded wekan-<version>-{amd64,arm64}.zip were deleted before the
attach step, which then failed with “wekan-tests/releaseBundlesSurviveCheckout.test.cjs
pins the order (checkout before the bundle download) rather than clean: false,
which was never enough.
i386 and armhf are skipped when no Node.js exists for them, instead of failing the run. Thanks to xet7.
build-extra-arches failed on i386 and armhf because there is no Node.js to
build them against: Node has no linux-x86 build at all, and no source builds
Node 24 for armv7l (nodejs.org and unofficial-builds have neither, and the
wekan/node fork has not built them yet). A red job every release for a CPU
nothing can currently produce a Node for is noise, not news. Both are now
marked best-effort (optional: true), and when a best-effort arch’s
Node.js is absent everywhere releases/check-arch-binaries.sh emits
skip=true (a warning, exit 0) rather than a fatal error; every build step in
the job is gated on it, so the arch is skipped cleanly with nothing built. It
returns on its own the first release after wekan/node publishes node-i386 /
node-armhf. A required arch whose Node.js is missing is still fatal, as
before. tests/releaseArchSkipAndBaseAttach.test.cjs pins both this and the
base-bundle attachment above.
and fixes the following Admin Panel bug:
Admin Panel reports - loading a report by its own URL.
An admin report opened by its URL keeps the subscription its own count re-render used to cancel. Thanks to xet7.
Opening an admin report by its address - /admin/problems/files typed,
bookmarked or refreshed - drew the column headers, “No results” and a “1 / 1”
pager over data that was plainly there, while the count method reported five.
An earlier fix
addressed one half (re-subscribe once the login lands), but the report still
came up empty. The onCreated autorun opens the pane and subscribes when the
open-pane or the logged-in user changes, and it called openReportPane() /
loadReport() directly in its reactive body - so it became reactive on
cfg.count (which loadReport reads through pageInfo), and loadReport’s
own count method then did cfg.count.set(...). That re-ran the autorun, and a
Meteor.subscribe made inside an autorun is AUTO-CANCELLED when the autorun
re-runs; the re-run took the “same user, same pane” path, did not re-subscribe,
and left the report with no subscription - attachments in minimongo: 0. From
the left menu it worked, because that opens the pane from an event rather than a
computation, so the subscribe was never auto-managed; only the URL path hit it.
The autorun now reads only the pane id and the user reactively and runs its body
inside Tracker.nonreactive, so a count re-render no longer cancels the
subscription, whose lifetime is managed explicitly (a new onDestroyed stops
the last one). tests/adminReportsSubscriptionLifetime.test.cjs pins it.
Thanks to above GitHub users for their contributions and translators for their translations.