Wekan logo

Wekan

Open source kanban board application built with Meteor

Alternative to: trello


About Versions (218)

v11.03

2026-08-19

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.54.0verifiedcefef799be4d3abd…
amd64Node.jsnodejs.orgv24.19.0verified14b342e71204f811…
arm64FerretDBwekan/FerretDBv1.54.0verifiedd6fc40d8657dc989…
arm64Node.jsnodejs.orgv24.19.0verified01443c1e1a29e531…

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.

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

This release fixes the following 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.

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.

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.

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.

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.