Wekan
Open source kanban board application built with Meteor
Alternative to: trello
v11.03
2026-08-19Binaries 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.54.0 | verified | cefef799be4d3abd… |
| amd64 | Node.js | nodejs.org | v24.19.0 | verified | 14b342e71204f811… |
| arm64 | FerretDB | wekan/FerretDB | v1.54.0 | verified | d6fc40d8657dc989… |
| arm64 | Node.js | nodejs.org | v24.19.0 | verified | 01443c1e1a29e531… |
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.03 2026-08-19 WeKan ® release
In short: accessibility gives shared tabs, dialogs, images, password controls and card edit targets coherent names and keyboard order throughout WeKan, with one common keyboard utility keeping those behaviors consistent. Card details restore checkbox custom fields, keep their saved values separate from field visibility, save currency values, provide independent opened-card and minicard visibility settings, make every custom-field value copyable, use compact accessible pencil icons for Edit actions, restore the grid/one-per-row layout switch, restore cross-board card links, omit deleted custom fields from exports, and make attachment previews use the available viewport. JFIF image uploads receive portable JPEG download names. Linked cards mirror every visible source field across boards and authorized members can edit that shared content from either board. Card locations recognize both map URLs and plain coordinate pairs. Positive, negative and browser regression coverage keeps each interaction working. Existing boards also receive the new default-on opened-card custom-fields setting during schema upgrade. Opened cards can be resized wider as well as narrower on desktop. All Boards keeps the complete invitation message and its actions visible on phone-sized layouts. Developer tooling keeps long-running Rspack development watchers from retaining cache state until they exhaust the JavaScript heap, and lets Flatpak terminals run the Firefox/WebKit matrix through host Docker. Dependencies refresh S3 storage, build analysis, keyboard shortcuts, CSV parsing and browser automation. Admin Panel / Problems / Offices groups login addresses by person and shows each address family, available location, per-person login count and available initials instead of empty avatar circles. Admin Panel / People / People summarizes each person’s login countries and opens country-by-country city, IPv4, IPv6 and login-time details. Problems pagination no longer mixes a specialized pane’s state with the shared reports. The complete browser run restores inline title and date editing, popup focus, loading-state accessibility and phone board scrolling while bringing its selectors in step with the current UI.
| 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 fixes the following bugs:
The Admin Panel - reports about people and where they log in from.
Offices groups login addresses by person with locations and counts. Thanks to xet7.
The Offices report was inverted: each row represented an address and placed all people using it inside one cell. It now pages people and keeps every address for one person together. Each row has separate IPv4 and IPv6 columns, the latest country flag and city supplied by Cloudflare or another supported proxy, and that person’s successful-login count and first/last times for that address.
Location is recorded when a login succeeds; existing address tallies are not
retroactively geolocated. With Cloudflare, the proxied hostname must enable the
Add visitor location headers Managed Transform so CF-IPCountry, CF-IPCity,
CF-Region, CF-IPLatitude and CF-IPLongitude reach WeKan. Caddy passes
these request headers through by default; any header_up override belongs
inside its reverse_proxy block.
People sharing one address remain separate groups with separate counts. Search still matches names, addresses and locations, while location metadata for a page is fetched in one batch. Positive and negative coverage checks both IP families, shared addresses, supported location headers and absent geography.
Offices shows available initials instead of empty avatar circles. Thanks to xet7.
The server already computed initials for every person, but person grouping dropped that field and the shared table tried to find the user again in the client cache. When the full user document was not published there, the fallback had no letters to draw and rendered an empty grey circle.
Initials now travel with the person through the response, grouped rows and shared table cell. The existing avatar template uses them directly and retains its reactive user lookup as the fallback everywhere else. Regression coverage checks both the Offices path and the generic table conversion.
People shows country login counters with city and address details. Thanks to xet7.
A Location column immediately before Status now shows each person’s country flags and successful-login counts. Selecting a counter opens that person’s location report: countries are the left menu, busiest first, and the selected country’s shared Table.md table lists city, IPv4, IPv6 and the person’s first and last login times for every address.
The detail view has the shared search, pagination and Back controls. Location data is fetched once per People page and restricted through the same site-admin or tenant-admin scope as the People list. Unknown locations are not guessed, stale page responses are discarded, and new logins retain the available proxy location on the person’s own address tally.
Positive and negative coverage checks country totals and ordering, both IP families, city rows, timestamps, menu and table wiring, authorization limits and absent geography.
Problems pagination keeps each pane's state separate. Thanks to xet7.
Pagination events from specialized Problems panes bubbled into the containing shared report handler. Their pane ids intentionally have no shared report configuration, so clicking Next could try to read a count from undefined and stop the requested action with a browser exception.
Event-stream and Offices controls now keep their events inside their own pane. The shared Previous, Next and search handlers also safely ignore missing or transitional report state. Regression coverage exercises both specialized pagers and the defensive shared-handler path.
Card details - fields, attachments and links on an opened card.
Existing boards keep default-on opened-card custom fields. Thanks to xet7.
The board schema made opened-card custom fields visible by default, but the
schema-upgrade list omitted that new flag. Boards created before the setting
therefore retained no stored default when their other default-on feature flags
were repaired. The upgrade now backfills allowsCustomFields: true while still
preserving an administrator’s explicit false choice.
The complete 490-suite Node run also exposed guards that still described old
custom-field, date-control, card-width, initials and publication layouts, plus a
security scan entering a downloaded Go toolchain under .tools. Those guards
now pin the current intended behavior and scan only maintained FerretDB source.
JFIF uploads use portable JPEG download names. Thanks to xet7.
Content detection already identified a JFIF upload as JPEG, but the MIME
database did not recognize the .jfif filename suffix. The generic correction
therefore appended .jpeg and stored names such as photo.jfif.jpeg.
Detected JPEG content named with .jfif now replaces that suffix with .jpeg.
Downloads consequently use a conventional filename that desktop file
associations can open directly, while valid .jpg and .jpeg names remain
unchanged. Positive and negative tests cover replacement, non-appending and the
Security Report’s sanitization reason.
Edit actions use compact accessible pencil icons. Thanks to xet7.
Visible Edit controls on cards now use the same Font Awesome pencil-square icon as Description instead of repeating the word. This covers custom fields, Requested By, Assigned By and comments; Add remains text where it is a distinct action. Every icon is decorative to assistive technology, while its control retains the localized Edit tooltip and accessible name.
Focused coverage rejects textual Edit controls, checks the icon and accessibility attributes, and keeps the separate Add state intact.
Opened cards can be resized wider as well as narrower. Thanks to xet7.
The desktop card already had a bottom-right resize handle, but its 520px opening width was also a hard maximum, so dragging could only make the card narrower. It still opens at the compact 520px width and can now grow up to the viewport’s eight-pixel margins. Mobile remains full-screen and non-resizable.
Placement and maximized-card regression coverage checks both resize directions, the initial width, viewport ceiling, mobile behavior and maximized geometry.
The Custom Fields layout toggle changes and remembers the layout. Thanks to xet7.
The toggle continued saving the user’s customFieldsGrid preference after the
card-section refactor, but the rendered container no longer read it, so nothing
visibly changed. The off state now produces a compact wrapping grid and the on
state makes each custom field occupy a full row, preserving the toggle’s
original behavior.
Focused positive and negative coverage checks both layout classes and the persisted method wiring. A browser regression switches the layout and reloads the card to verify that the selected mode remains active.
-
Wider opened cards fit more compact-grid custom field columns. Thanks to xet7.
-
The Custom Fields layout selector shows Grid and List icons. Thanks to xet7.
-
The layout selector sits between the Custom Fields title and menu. Thanks to xet7.
-
Changing the Custom Fields layout no longer collapses the section. Thanks to xet7.
Checkbox custom fields respond, stay removed, and leave clean exports. Thanks to Heart1010 and xet7.
Selecting a custom field and changing a checkbox now use acknowledged server methods with board-write and field-definition checks. A rejected optimistic client write can therefore no longer make a checkbox appear inert or make a deselected field spring back. PDF and Excel export also omit an orphan field whose definition has been deleted instead of exposing its internal ID.
Unit tests cover successful writes, authorization and field-type failures, and the orphan export case. The browser test checks a checkbox and removes its field from an opened card.
Opened-card custom checkboxes save values without hiding fields. Thanks to xet7.
The checkbox rendered as a card field borrowed the checklist item’s event class and derived its next state from the template context. It now has a dedicated control, reads the persisted field value, and saves its boolean without allowing the click to reach visibility or checklist handlers. The Custom Fields menu remains the separate place that shows or hides the field.
Static coverage keeps the value and visibility event paths distinct. The
browser regression saves both true and false from the opened card and
verifies that the field remains visible after each change.
Opened cards display their saved custom checkbox checkmark. Thanks to xet7.
Saving the checkbox already changed the card’s boolean and its minicard badge, but the opened-card square read a nested template path that did not react to that change. It now reads the custom field’s direct persisted value, so the opened card and minicard show the same checked state immediately.
The regression test requires every opened-card checkbox checkmark to bind to
value and rejects the stale data.value path.
Cards and minicards control custom-field visibility independently. Thanks to xet7.
The checkbox editor calculated its second click from the Card object captured
when the template was created, so it could keep saving true instead of
unchecking. It now reads the reactive field context and saves either boolean.
Custom-field values also no longer appear automatically on minicards. Card menu / Show on Card gains a Custom Fields setting that defaults to enabled; Minicard menu / Show on Minicard gains its independent Custom Fields setting that defaults to disabled. Enabling the minicard option shows assigned fields without changing their values or the opened-card setting.
Positive and negative tests cover both defaults, both menu handlers, both rendering gates and repeated checkbox toggles. Existing browser coverage that expects minicard custom fields explicitly enables the opt-in setting.
Currency custom fields save and provide an X beside Save. Thanks to xet7.
The currency editor issued an unacknowledged direct card update and closed without knowing whether the value was accepted. It now parses dot or comma decimals, rejects non-finite input, and awaits a server method that verifies card-edit permission, the board’s currency-field definition and the assigned field before storing the number. Linked cards use the same source-card route.
Its input reads the direct current value, and the standard X close control now sits immediately after Save. Static tests cover authorization, field type, finite-number validation and control order; the browser regression enters a comma-decimal amount and verifies the stored numeric value.
-
Custom Field Dropdown places an X close control beside Save. Thanks to xet7.
-
Custom Field Number places an X close control beside Save. Thanks to xet7.
-
Custom Field Text places an X close control beside Save. Thanks to xet7.
-
Custom Field String Template places an X close control beside Save. Thanks to xet7.
Every custom field editor provides a copy-to-clipboard control. Thanks to xet7.
Text fields retain the copy button supplied by their rich-text editor. Number, checkbox, currency, date, dropdown and string-template fields now use a shared copy control beside their editable value. Date values are copied in ISO format and multi-part values are separated by newlines.
Focused interaction coverage verifies that every field type exposes a copy control and that the shared handler normalizes scalar, date and array values.
Custom field titles open editing without taking over field controls. Thanks to xet7.
Clicking a custom field’s title or displayed value now opens its value editor. Checkbox fields keep their square as an immediate on/off control, while their title and the empty area beside the square open a staged editor with Save and Close.
Copy is hidden while a field is only being viewed. Every field editor provides the action while editing, and it copies the currently edited input rather than the previously saved value. Focused positive and negative coverage checks the view/edit boundary; the browser regression checks its editing-only visibility.
-
Custom field titles and values open editing while checkbox squares toggle. Thanks to xet7.
-
Checkbox custom fields can be checked and unchecked while editing. Thanks to xet7.
-
Non-Date custom field value clicks work across their nested Blaze templates. Thanks to xet7.
-
Date custom fields restore their direct datetime popup opener. Thanks to xet7.
-
The Date custom field popup keeps Date, Time and Copy on one row without a second X. Thanks to xet7.
-
Dropdown custom fields preselect their saved value when editing. Thanks to xet7.
-
Every custom field editor starts with its saved value. Thanks to xet7.
-
Text custom fields align Convert to Markdown immediately left of Copy. Thanks to xet7.
Currency and String Template custom fields no longer break minicards. Thanks to xet7.
Their Blaze helpers run inside each customFieldsWD, where the current context
is already a custom-field row. They tried to call the Card method
customFieldsWD() on that row, throwing on every render and interrupting the
surrounding card UI. Both helpers now format the row’s resolved trueValue
directly, preserve numeric zero, leave empty values empty and use safe fallbacks
for invalid definitions or values.
Focused regression coverage rejects the invalid Card call and checks the value, empty, numeric and String Template paths.
- Custom field Copy controls sit above editors’ top-right corners. Thanks to xet7.
Linked card content is editable from either board. Thanks to hever and xet7.
A linked card displayed the source fields but several editors still wrote its empty placement placeholder, while server methods required write access on the source board. A member who may edit the current board can now edit the shared source content through a visible, active link. Revoking source visibility, archiving the link, or assigning a read-only current-board role removes that delegation. Moving and archiving still affect only the linked representation.
The same source route covers titles, descriptions, dates, colors, people, labels, stickers, locations, dependencies, custom fields, checklists, subtasks, attachments, covers, watchers, minicard settings, votes and estimates. Label and custom-field definitions come from the source board, while permission to edit the card comes from the board on which the linked card is visible.
Positive and negative tests inventory the content mutators, method arguments and active-link authorization boundary. The browser regression edits the opened linked card, verifies both stored representations, then edits the source card from its own board.
Attachment previews use the available viewport. Thanks to rmb82 and xet7.
Desktop PDF and text previews were fixed at 560 pixels wide, while a misplaced media query changed them to 840 pixels only on narrower screens. The overlay is now a viewport-filling flex layout: document viewers take the space between the navigation controls, images retain their aspect ratio, and mobile controls keep their compact layout. Static positive and negative tests reject another fixed desktop document width, and a browser test measures the rendered preview.
Cross-board card links are created and their dialog closes. Thanks to ClemStrummer and xet7.
The Link dialog directly inserted its pointer card from the client, so a server rejection could undo the optimistic insert and leave the dialog open without an explanation. It now awaits one server-authoritative operation and closes only after success. The server verifies read access to the source, write access to the destination, the selected list and swimlane, and rejects archived, same-board, template and link-pointer targets.
Method tests cover the acknowledged path and invalid targets. The browser test follows the reported board, swimlane, list, card and position selection, then checks both the closed dialog and the stored linked card.
Link placement survives asynchronous popup confirmation. Thanks to xet7.
The linked-board confirmation asked Blaze for the popup’s top or bottom
position after awaiting the next card number. By then its event view was no
longer current, so Blaze threw There is no current view before inserting the
link. The popup now captures its position when it is created and its sort
calculation uses only that stored value after asynchronous work. The board
selector is scoped to the same popup as well.
The regression test rejects any later Template.currentData() call inside the
sort calculation and covers both placement choices.
Card locations detect plain latitude and longitude pairs. Thanks to xet7.
Detect location already recognized provider URLs such as Google Maps
@latitude,longitude,zoom, but a coordinate pair copied directly from a map or
GPS application produced no result. The same field now accepts a complete
latitude, longitude pair with optional surrounding whitespace and retains its
range checks. The match is anchored to the entire input so prose that happens
to contain two numbers is not mistaken for a location.
Parser tests cover both supplied formats, exact precision and the prose negative case. The browser regression enters each format through the location popup and verifies the detected latitude and longitude fields.
Linked cards mirror every visible field from their source. Thanks to xet7.
A linked card mixed a few source-aware getters with raw fields from its empty placement placeholder. Titles, dates and comments worked, while labels, stickers, custom fields, locations, dependencies, subtasks, colors, creator details and other direct fields could disappear. After reload, the source board’s label and custom-field definitions were also absent because only the source card document and children were published.
Linked cards now resolve displayed content through one live source-card path. The current-board publication supplies the authorized source metadata, definition records, relevant users, subtasks and dependency targets; all remain behind the existing source-board visibility check, and child-card queries are constrained to those authorized boards. Placement itself still belongs to the linked placeholder on the current board.
Parity tests cover every directly rendered collection and the negative publication boundaries. The browser regression adds a source label, sticker, custom field and location, then verifies them on both the linked minicard and its opened details.
Accessibility - keyboard order, control names and dialog focus across pages.
Tabs and dialogs follow a coherent keyboard and screen-reader model. Thanks to xet7.
Shared tabs now expose tablist, tab and tabpanel relationships, keep only the active tab in normal Tab order, and support arrow, Home, End, Enter and Space keys. Popups and modals move focus inside, contain forward and reverse Tab navigation, and return focus to their opener when closed. Password visibility is no longer skipped by Tab, card and minicard edit targets are focusable, and all template images explicitly provide meaningful or intentionally empty alternative text.
Application-wide static coverage rejects positive tabindex values and images
without alt, while focused tests pin names, roles, relationships, keyboard
handlers and focus restoration. The browser regression audits representative
pages for natural order, unnamed controls and missing image alternatives, and
exercises both directions of the popup focus loop.
Keyboard navigation uses one shared accessibility utility. Thanks to xet7.
Popup, modal and board-menu focus previously discovered controls independently,
while shared tabs and Archive tabs separately implemented the same six-key
navigation rule. Focusable-element discovery, initial focus, Tab trapping and
tab-key calculation now live together in client/lib/accessibility.js; each
consumer supplies only its own state transition. The board-only menu observer
also disconnects with its template instead of remaining attached after leaving
a board.
Regression coverage requires both tab implementations and every dialog consumer to delegate to the shared helpers, and rejects copies of the old key and focus selector branches.
All Boards - the overview, its Archive actions and phone-sized layouts.
Archived boards can be deleted and selected cards can be archived reliably. Thanks to Nissulya and xet7.
The archived-board half of #6608 is handled by the new Global-Admin-only, explicitly enabled and confirmed multi-selection Delete action. For cards, the sidebar previously fired direct client updates and closed immediately, so a refused write looked successful while every card stayed in place. It now sends one ordered selection to an awaited server method. The server validates the board, write access and every live card before archiving the first; a failure reports its reason and keeps the selection open. Unit tests cover positive and negative client/server paths, and a browser test selects and archives two cards from one list.
Phone board invitations show their message and actions. Thanks to mimZD and xet7.
The compact phone layout forced every board icon to exactly four rem, including an invitation that also contains its explanatory message and two touch-size buttons. The board tile clipped that overflow, leaving only the title visible. Invitation tiles now carry an explicit state class and retain the ordinary four-rem floor while growing naturally around the message, Accept and Decline. Ordinary board icons remain compact and equal-height.
Static coverage keeps the invitation exception attached to its template state. The phone browser regression creates a real pending invitation and verifies that its message and both buttons remain visible and inside the tile.
Complete browser regression run - cross-page interactions exercised by all three browser engines.
Browser regressions restore editing, focus and phone scrolling. Thanks to xet7.
The all-browser run exposed interactions that narrower source tests could not: the minicard wrapper stopped its sibling inline-title handler, shared opened-card date badges lost the explicit edit-permission argument, popup Tab handling used Blaze’s inconsistent delegated event container, and the stock logo briefly lost its alternative text while settings loaded. Those paths now retain editing permission, focus containment and accessible loading states.
The shared table search has an accessible name and a phone’s board list grows inside the single page scroller. Browser coverage now opens the attachment viewer where that template exists, scopes the linked-card and custom-field controls to their real DOM owners, waits for reactive options and fields, and checks the icon-only Edit control by its accessible name. Focused positive and negative source tests pin the permission, focus, table and scroll contracts.
Browser regression corrections now pass against a fresh production bundle. Thanks to xet7.
Linked-card creation now restarts the board subscription so source labels, stickers and custom fields are available with the new link. Date writes are awaited and refresh the same subscription, popup focus trapping uses the real dialog element, and the phone board grid leaves vertical scrolling to the page.
The browser tests now use stable card identities and the actual interactive DOM targets after titles change, distinguish visible and compact label markup, seed existing dates before subscribing, and measure scroll ownership instead of relying on a browser’s normalized overflow keyword. The complete Node suite and the modified Chromium browser group cover the positive and negative paths.
and updates the following dependencies:
- @aws-sdk/client-s3 3.1109.0 → 3.1113.0 — the AWS S3 client used by S3-compatible attachment storage.
- @rsdoctor/rspack-plugin 1.6.1 → 1.6.2 — the Rspack build-analysis plugin.
- hotkeys-js 4.0.4 → 4.0.5 — keyboard shortcut handling.
- papaparse 5.5.4 → 5.6.0 — CSV parsing and generation.
- puppeteer 25.6.0 → 25.8.0 — browser automation for exports and tests.
Thanks to dependabot.
and improves developer tooling:
Development builds - local builds and long-running watchers.
Long-running Rspack watchers no longer exhaust the JavaScript heap. Thanks to xet7.
Rspack’s experimental persistent cache retained JavaScript-side serialization
state while meteor run repeatedly rebuilt WeKan’s large Blaze graph. After a
long development session that retained state could consume the full 16 GB V8
heap and abort the bundler.
Development client and server watchers now run without the persistent cache. Short-lived production builds keep caching, and unrelated Rspack experiments still merge normally. Focused coverage checks both watchers, the production negative case and the merge over Meteor’s cache defaults.
Browser test containers - running the complete Playwright matrix from the documented VS Code sandbox.
Flatpak terminals can run Firefox and WebKit through host Docker. Thanks to xet7.
The ARM64 browser runner correctly selected Playwright’s official Docker image,
but a VS Code Flatpak terminal could not see the host docker executable and
reported that Docker was not installed. The build script now discovers Docker
through flatpak-spawn --host and routes image pulls, browser containers and
conformance cleanup through the same host-aware wrapper.
Regression coverage pins both direct and Flatpak-host discovery. The complete Firefox and WebKit matrices were run against a fresh production bundle; all 255 runnable tests passed in each engine, with the eight Chromium-only drag harness tests intentionally skipped.
Thanks to above GitHub users for their contributions and translators for their translations.