Wekan logo

Wekan

Open source kanban board application built with Meteor

Alternative to: trello


About Versions (218)

v10.99

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.

v10.99 2026-08-17 WeKan ® release

In short: the unified export dialog can finally be changed, visibly shows its selection with the Admin Panel’s own checkbox, and passes that selection to every export format. PDF and Excel exports now share one card document, use the saved user language or browser fallback, keep the opened card’s date format, preserve multilingual text, and name downloads for the localized board, swimlane, list or card exported. Their shared card layout now includes locations, stickers, dependencies and sort position; PDF also embeds JPEG and PNG attachment previews plus Unicode-plane fonts. Admin Panel / Problems keeps avatars at avatar size, and All Boards keeps its Add Board and Home placeholder tiles as tall as the boards beside them. Requested By and Assigned By can select board members while retaining their free-text fields. Below that: fourteen export fixes, one export-layout consolidation, one people-picker fix, two shared-checkbox fixes, two UI sizing fixes, restored subtask creation, and the documentation move into its feature and platform hierarchy with every local link checked.

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 adds the following new feature:

Opened cards - the people responsible for requesting and assigning work.

Requested By and Assigned By can select board members. Thanks to xet7.

Their round + now opens a searchable board-member picker like Members and Assignee. Selected people appear as avatars, while the Add link stays below the + and continues to open the existing free-text editor. The two forms are independent, so a card can retain an external name or note beside its selected members.

Cards store selected people in requesters and assigners user-ID arrays, with assign, unassign and toggle operations matching assignees. WeKan JSON and scoped imports preserve them, whole-board imports remap their user IDs, and user removal cleans them up. PDF, detailed and table Excel, and CSV resolve the selected people beside the original text fields. The implementation completes the existing Requested By / Assigned By design document.

and fixes the following bugs:

Opened cards - the people responsible for requesting and assigning work.

The new people pickers have titles and stay below their buttons. Thanks to xet7.

Requested By and Assigned By opened headerless popups because their generated title keys did not exist. They now reuse the fields’ existing translated names, so every language gets a title without adding a second English placeholder to all translation files.

The general popup geometry also chose whichever side of an opener had more space. That made Assigned By jump above the card while Members and Assignee happened to open below. All four card-people pickers now anchor directly below their + button, use the remaining space there, and retain the same member-list body and styling.

Subtasks - creating their hidden helper-board records.

A new subtask is created even before its helper-board cache refreshes. Thanks to xet7.

Creating the first subtask also creates its hidden helper board and default swimlane. The server immediately looked for that swimlane through a reactive cache which could still hold the earlier empty result, so it returned without inserting the subtask and the form appeared to do nothing.

The async server lookup now reads the authoritative collection, and its default-swimlane self-heal falls back to that collection after inserting. The form retains the entered title and reports the actual error when creation really fails instead of silently clearing it.

Exporting - choosing what goes in the file.

Board Excel exports now use the detailed card layout they request. Thanks to xet7.

The export popup sent the card-details layout choice, but the server’s shared field allowlist omitted that key and silently removed it. Every board, swimlane and list Excel request therefore selected the old one-row-per-card streaming table even though Card details was checked.

The layout key now survives validation, so the detailed exporter draws each card with the same renderer as Export card to Excel. Attachment metadata and embedded image galleries are included along with the other selected card fields, while the existing Board → Swimlane → List → Card order remains. The streaming table is still available by deliberately unticking Card details for very large boards.

Every PDF and detailed Excel scope carries the complete card fields. Thanks to xet7.

The shared card layout omitted locations, stickers, dependencies and numeric sort position. Locations now include place name, address, latitude and longitude for every current location entry, and retain the legacy single- location fields used by older and Trello-imported cards. The other missing fields have their own selectable sections or metadata row.

Because card, list, swimlane and board exports all draw this one document, the fix applies to both PDF and detailed Excel at every scope. The hierarchy is pinned as Board → Swimlane → List → Card, Swimlane → List → Card, and List → Card, without repeating an ancestor above a smaller export. The Excel and PDF format documentation now lists the complete shared card data.

Detailed PDF and Excel exports follow the board hierarchy. Thanks to xet7.

A board export now reads in the same order as the board: board name, members, creation and modification times, then each swimlane, each list within it, and each card within that list. Even the only visible swimlane is named instead of being silently flattened away.

Smaller exports start at the level selected rather than repeating unrelated ancestors. A swimlane export begins with its swimlane and continues through its lists and cards; a list export begins with that list and its cards; a card export remains the card. PDF and detailed Excel use the same ordering, and the format documentation records it.

PDF and Excel downloads are named for the object exported. Thanks to xet7.

A swimlane export no longer arrives with the board title in PDF or Excel’s generic default filename. Download names now use the localized object type and its number: for example, the first English swimlane is Swimlane-1.pdf or Swimlane-1.xlsx. Lists and cards follow the same convention, while a whole board pairs the localized board label with its title.

The saved profile language wins; when it is absent, the browser language sent with the export request supplies the label. The response includes the UTF-8 content-disposition filename, so scripts outside ASCII remain intact, and the browser no longer overrides it with a title-derived download attribute. The low-memory Excel table exporter also keeps list and swimlane scope while naming its result.

The export popup's checkboxes can be changed, and they say what they are. Thanks to Heart1010 and xet7.

Reported as #6586: “with v10.98 we have that unified export dialog 👍 But I can’t select/deselect those arrows here”, and confirmed as “clicking a checked option, like labels, does not uncheck it”. Two faults, and either one alone makes the list useless.

It could not be changed, and the first fix was not enough. The handlers were a template event map, and a click on a row did nothing; moving them onto exportScopeSelect — the template that actually draws the rows — did not help either, and that was built and shipped in both bundles before the answer came back that the list still could not be changed. What the built bundle shows is that the templates are registered, their helpers run and both event maps are attached; the click simply never arrives. This list is drawn inside FIVE popups, each rendered into its own Blaze view tree, so the toggle is now bound where nothing in that chain can drop it: one native listener on the document, in the capture phase — capture so a stopPropagation() between the row and the document cannot eat it, native so an absent window.jQuery cannot fail silently, and exactly one so it cannot toggle twice and cancel out.

And no row said whether it was ticked. Each drew an unconditional i.fa.fa-check on a li.active, which is the OTHER convention in popup.css: that tick is hidden and shown only for an active row by a selector needing a nested list carrying checkable, and this list was neither. So the tick was never hidden and active was never styled — every row looked ticked whatever it was. Each row now carries .materialCheckBox, the checkbox Admin Panel / Settings / Announcement uses, which needs no ancestor to be right, and the box aligns with the first line of a label that wraps.

What is ticked is what the file contains — checked rather than assumed. Every format builds its URL through one function that appends the selection, and every route parses it: the JSON, .zip and Kanboard exports, Excel, PDF, the CSV (where the selection lands on columns), and the ten external-tool exports, which share one handler. A test reads the format table, so a format added later is covered without editing it.

A card sent to PDF came back as an HTML file. Thanks to Heart1010 and xet7.

Not a broken PDF — WeKan’s own page, saved as <card>.pdf. Every export in the interface is a download from an /api/… address, and the server refuses every /api request unless WITH_API is exactly true. It refused by answering 301 Location: /, so the browser followed it to the front page and the download link’s download="<card>.pdf" wrote the HTML it got there to that name. Reproduced against a running instance: GET /api/boards/x/exportPDF answered 301.

Two faults, either one enough on its own. The bundle launchers did not set WITH_API — the snap has defaulted it to true for years and every docker-compose*.yml here sets it, so the bundle was the one platform where exporting was off by default, and therefore the one platform where an export came back as HTML. Both launchers now default it to true, overridable, and say why: the name reads like a developer feature, and somebody switching it off to harden an instance should know they are turning off every export in the interface.

And the refusal was a redirect. Whatever the setting, “the API is off” must not arrive as a page. It is now a 403 in plain text, saying that exports use the API too and naming the variable to set — an answer that cannot be mistaken for the file that was asked for.

PDF exports carry their JPEG and PNG attachment previews. Thanks to xet7.

PDF listed image attachments by name while Excel embedded their previews. Card and detailed board PDFs now read JPEG and PNG attachments from the configured file store and put real image XObjects into the document. JPEG keeps its original DCT-compressed bytes; PNG scanlines are decoded, their filters removed and their transparency composited onto white before the RGB pixels are deflated into the PDF. Images keep their aspect ratio and are only scaled down.

A missing object, unsupported format or corrupt image is still listed by name and cannot fail the rest of the export. Tests inspect both filters and the page’s XObject references, exercise transparent PNG pixels, and pin that failure-safe path. The format design and current progress moved from TODO Later to reciprocal Excel and PDF documentation pages. The shared Excel renderer described there is completed by the multilingual export entry below.

PDF and Excel exports preserve every language and share one card layout. Thanks to xet7.

PDF exports now subset and embed the OFL-licensed GNU Unifont BMP and supplementary-plane fonts. Finnish, Greek, Cyrillic, Hebrew, Arabic, Indic and CJK text, plus supplementary characters such as emoji, therefore remain visible, searchable and portable without fonts installed on the reader’s device. The former WinAnsi writer remains as a failure-safe fallback.

Printable Excel cards now render every block from the same medium-independent card document as PDF while retaining their six-column metadata, colored labels, checklist progress, attachment table and image placement. Excel cells already store real Unicode text; .xlsx cannot portably embed an OpenType font, so the spreadsheet application chooses an installed font or fallback rather than turning editable cells into pictures.

Both formats now resolve locale in one explicit order: a logged-in user’s saved language first, the current browser language when none is saved, then English. Public card Excel no longer hard-codes English. Their export links continue to carry the date format displayed by the opened card and the browser’s timezone, and the routes validate that format before rendering it.

Tests parse and subset both shipped font files with multilingual text, pin the locale precedence and opened-card date-format handoff, and exercise the shared Excel renderer with ordinary metadata and enough colored labels to wrap onto a second row. The reciprocal Excel and PDF pages record the implementation and the .xlsx portability boundary.

Loading the export routes no longer stops a production bundle at startup. Thanks to xet7.

The production bundle resolved markdown-it as an ES-module namespace, while bare Node resolved the same package as its constructor. The shared PDF and Excel Markdown parser constructed the value directly, so unit tests passed but the bundled server stopped during module initialization with is not a constructor, restarted, and repeated the same failure.

The parser now normalizes both module shapes before constructing MarkdownIt. A regression test supplies the CommonJS and Meteor production-bundle shapes and requires both to resolve to the same constructor.

PDF dates remain complete, and attachment previews share rows. Thanks to xet7.

Three metadata cells fit across the printable PDF width, but long translated labels and full date/time values were shortened with an ellipsis. Each cell now grows onto additional lines, keeping the complete value visible.

Attachment previews formerly occupied one full-width row each and carried a synthetic [image: filename] line. Up to three previews now share a row, with the real filename and human-readable file size above each image and no image: prefix. The row is one pagination unit: when its caption and previews do not fit, all of them move together to the next page.

Tests pin the complete translated dates, three-column captions, absence of the old prefix, multiple images in one row, image XObjects and atomic page break.

The production bundle uses its embedded Unicode PDF font. Thanks to xet7.

PDFKit initialized its built-in Helvetica before WeKan selected the bundled Unicode fonts. That reads data/Helvetica.afm relative to PDFKit’s own module, but Meteor’s production bundle rewrote the lookup to /_build/main-prod/data/Helvetica.afm, where no such application asset exists. Every Unicode export therefore logged the missing file and fell back to the WinAnsi writer.

PDFKit now starts with the already-loaded GNU Unifont buffer as its default font, so initialization performs no Helvetica AFM filesystem lookup. A regression PDF begins from that buffer, embeds its Unicode map and contains no Helvetica reference; the normal named BMP and supplementary-plane fonts remain available for all subsequent text runs.

An image attachment is named once in PDF and Excel exports. Thanks to xet7.

An attachment image with a displayed preview was named in the bullet list and again in the caption above its image. Successfully loaded previews are now removed from that list and keep their filename and human-readable size in the caption.

The decision follows the preview that was actually loaded, not only the file’s declared type. Non-image files and images whose stored object is missing, unreadable or corrupt therefore remain listed with filename and size instead of disappearing from the export. A regression card contains one previewed image and one ordinary file and pins that each is named in exactly its proper place.

PDF and Excel cards share their visual attachment layout. Thanks to xet7.

Excel stacked every preview vertically despite having six worksheet columns. It now uses three two-column preview cells per row and starts the fourth image on the next row. PDF uses the same three-column arrangement. In both formats, only the filename appears below each image.

The attachment details above those previews include EVERY file, images included, in the same six fields: row number, filename, human-readable size, media type, upload date/time and uploader. PDF now resolves attachment uploaders alongside card members and comment authors, and the Excel headings use their real translated attachment keys instead of displaying uploaded-at and uploaded-by when those generic keys do not exist.

PDF also consumes the presentation data the shared card document already gives Excel: labels use their actual background and contrasting text colors, metadata keeps the same positions, and checklist completion is a six-part blue progress bar with its completed/total count. Tests exercise a real ExcelJS worksheet with four images and pin the corresponding PDF label, progress, detail-table, preview-caption and pagination objects.

This intentionally follows the preceding duplicate-name fix with the complete details requested here: an image is present in the all-attachments details table, while its filename-only preview caption identifies the image below.

Six attachment previews fit across an Excel row. Thanks to xet7.

The first shared attachment layout put three Excel previews in two-column cells, but the worksheet has six usable columns and the screenshots showed the images still consuming far more vertical space than necessary. Each preview now occupies one column: images one through six share an image row, their filenames sit in cells A through F directly below, and image seven begins the next image row followed by its filename row.

An actual ExcelJS worksheet test places seven PNGs, checks that the first six have the same row coordinate, the seventh has the next image-row coordinate, and verifies the filename cells below both rows. PDF keeps three previews on an A4 row because six would make them too small to read; the shared details, colors, field positions and progress styling remain the same.

Checkboxes - the one square WeKan draws everywhere.

A checkbox keeps its shape, wherever it is put and whatever is beside it. Thanks to xet7.

In the export popup an unchecked box drew a thin vertical sliver beside a long label and a proper square beside a short one: the row is a flex container, the box is a flex item, and a flex item shrinks.

That is the third time this shape has broken — settingBody.css already carries a fix for a 41px min-height that “turns a 13px box into a tall rectangle”, and another for a height: 100% that stretched it — so the fix goes in the rule that DEFINES the checkbox: flex: none, for all 90 of them across 19 templates, rather than one more local patch. The local patch went with it: it had set box-sizing: border-box, which would have made that one popup’s boxes 13px including their border while every other checkbox in WeKan is 13px plus 2px.

The rest was audited rather than assumed: every rule in the client that sizes a checkbox gives it equal width and height, including the two “clean” board themes that deliberately draw theirs at 24px and 18px. A test now pins that for every rule, so the fourth one fails a suite instead of a screenshot.

The custom-field picker uses WeKan's shared animated checkbox. Thanks to xet7.

The checkbox beside each custom-field name was two Font Awesome square icons, switched according to state. It looked like the browser’s tiny native checkbox and had none of the behavior used by Admin Panel / Settings / Announcement.

The picker now uses the same .materialCheckBox element and is-checked state as those settings: a 13px grey square whose shared 0.2-second CSS transition morphs it into the rotated green tick. No local copy of its dimensions, colors or animation was added, so future changes to the common checkbox reach this picker too. Tests pin the shared markup and its transition, rotation and green checked-state borders, and reject the old icon imitation.

Admin Panel / Problems - how a person is shown.

A user's avatar is avatar-sized, in every pane that names one. Thanks to xet7.

Offices and the Impersonation Report drew a user’s photograph at its NATURAL size — a 300px portrait in a table row, a screen tall, with the login counts scattered around it — and it was every pane that names a user, because they all draw one the same way.

Every avatar rule in userAvatar.css is scoped to .member, which is what makes an avatar 24px and round and crops the image to fill it. The shared table page’s cells had no such box: the image and the initials had been copied, and the thing they belong in had not. The cells use .member now rather than a fourth private copy of “how big is an avatar” — there were already three, which is how the three came to disagree — with the two board-specific declarations it carries turned off for a table.

All Boards - the size of a tile.

Two tiles that were shorter than the boards beside them. Thanks to xet7.

On Starred, the grey ”+ Add Board” tile hung short. min-height: 114px is a FLOOR, and a board whose title wraps to three lines grows past it; the grid stretches every other tile in that row to match, but the grey comes from the label INSIDE the list item rather than from the item itself, so it kept its 114px while its row grew. The item is a flex box now and the label grows into it.

On Home, “Drag a board here to open it after login” was padding around a line of text, about 85px, on a page whose entire content is that box. It stands where a board tile will be, so it is a board tile’s height.

Templates and the workspaces were checked and were already right. Every view — Starred, Remaining, Home, Templates, Archive and each workspace — is the same list with a different set of boards in it, so they share one rule, and every tile variant computes to the same 114px border-box floor. A test pins that there is one list and that no variant sets a height of its own, so that question keeps having one answer instead of six.

and has the following developer-tooling improvement:

Every PDF and Excel scope maps cards through one shared adapter. Thanks to xet7.

Board, swimlane, list and card hamburger menus already use one export popup, selection and URL builder, and the detailed board exporters reuse their card renderers. One duplicate layer remained: PDF and Excel separately converted database records into the shared card document, including separate people, date, checklist, comment, attachment and file-size mappings.

Both formats now call one pure adapter for every card at every scope. Scope only selects the surrounding Board → Swimlane → List → Card hierarchy; PDF-specific code draws pages and Excel-specific code draws worksheet cells. The Excel and PDF feature documents describe this design and its format-specific boundary.

and reorganizes the following documentation:

Documentation follows its feature and platform hierarchy, and its links resolve. Thanks to xet7.

Feature documentation that had grown into separate top-level Date, DragDrop, Email, ImportExport, Login, Theme, Translations and Webhooks trees now lives under docs/Features; webserver documentation lives under docs/Platforms. The move also puts related pages and images beside their subject instead of in the broad Features directory.

All references were recalculated from their source page’s old and new location, including links from pages that moved themselves. The documentation link test now walks every Markdown page recursively instead of checking only the flat DeveloperDocs directory, so a future move cannot silently leave links or images pointing at paths that no longer exist.

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