github wekan/wekan v10.99

5 hours ago

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.

Bundle Binary From Version Checked SHA256
amd64 FerretDB wekan/FerretDB v1.53.0 verified eae1f0a8f73bfc97…
amd64 Node.js nodejs.org v24.19.0 verified 14b342e71204f811…
arm64 FerretDB wekan/FerretDB v1.53.0 verified bdc50caee3ac2849…
arm64 Node.js nodejs.org v24.19.0 verified 01443c1e1a29e531…
armhf FerretDB wekan/FerretDB v1.53.0 verified f7f050207e656d65…
armhf Node.js wekan/node-patches v24.19.0 verified b55350f3071b765a…
armv6 FerretDB wekan/FerretDB v1.53.0 verified 34f5f553dcd2bff3…
armv6 Node.js wekan/node-patches v24.19.0 verified 128ded0cda638c1f…
armv7 FerretDB wekan/FerretDB v1.53.0 verified f7f050207e656d65…
armv7 Node.js wekan/node-patches v24.19.0 verified 8dbe0a9aa8550ad5…
i386 FerretDB wekan/FerretDB v1.53.0 verified 515b1189b4c7d58f…
i386 Node.js wekan/node-patches v24.19.0 verified 3b0b3bbfe27daf58…
mac-arm64 FerretDB wekan/FerretDB v1.53.0 verified cb14ffe93e285903…
mac-arm64 Node.js nodejs.org v24.19.0 verified 3f1cf157479c1480…
mac-x64 FerretDB wekan/FerretDB v1.53.0 verified d97dfa9afa60aa05…
mac-x64 Node.js nodejs.org v24.19.0 verified d35e95230f46f6f0…
ppc64le FerretDB wekan/FerretDB v1.53.0 verified 481d36a80ec73673…
ppc64le Node.js nodejs.org v24.19.0 verified c510c6ce12f07010…
riscv64 FerretDB wekan/FerretDB v1.53.0 verified 4b43f86eb0f3fa0b…
riscv64 Node.js unofficial-builds.nodejs.org v24.19.0 verified cd1f14af28121480…
s390x FerretDB wekan/FerretDB v1.53.0 verified fe74e03894b84897…
s390x Node.js nodejs.org v24.19.0 verified a4792e65962ffa0a…
win-arm64 FerretDB wekan/FerretDB v1.53.0 verified f1186c310a4dd144…
win-arm64 Node.js nodejs.org v24.19.0 verified 8502f4a50b458d4c…
win64 FerretDB wekan/FerretDB v1.53.0 verified c6dad7bc8ad56f47…
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.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.

Platform Binary From Version SHA256
amd64 Node.js nodejs.org v24.19.0 14b342e71204f811bde6153be8e04b62aef63c236fef92b55f9c83154b409647
amd64 FerretDB wekan/FerretDB v1.53.0 eae1f0a8f73bfc979738bfff7284d40fd1bc55de2cc56514721fc155c3624f7d
arm64 Node.js nodejs.org v24.19.0 01443c1e1a29e531ccad5a46fefa6df490d2189c49f7955904aecdbb0fe86fdc
arm64 FerretDB wekan/FerretDB v1.53.0 bdc50caee3ac28495b42d2130b94a042a9dd6d3a38f732cac02b648f36c891da
mac-arm64 Node.js nodejs.org v24.19.0 3f1cf157479c1480352083105e13faf9d008ede98e7e157746b6df940d197b94
mac-arm64 FerretDB wekan/FerretDB v1.53.0 cb14ffe93e285903e5a8a9c1821687ddb5b8a979a11c584bf4af534b272c6d3e
mac-x64 Node.js nodejs.org v24.19.0 d35e95230f46f6f0751df497c56622c6735e05d5e1fb1630996a005b9d328fe4
mac-x64 FerretDB wekan/FerretDB v1.53.0 d97dfa9afa60aa05f25384327de82efe7b71d958ed24c1f66618284294a65cd3

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.

Don't miss a new wekan release

NewReleases is sending notifications on new releases.