Skip to content

Releases: wekan/wekan

v10.40

Choose a tag to compare

@github-actions github-actions released this 26 Jul 21:16

v10.40 2026-07-27 WeKan ® release

This release fixes the following bugs:

The right sidebar starts below the header, in both modes. Thanks to xet7.

Its upper part — the panel title, the tabs, the members row — was underneath
the two header bars, so the sidebar appeared to start in the middle of itself.
On a phone it is position: fixed, and it has to be: the board behind it is
wider than the screen, so an absolutely-positioned sidebar pins to the far
right of the BOARD and shows as a narrow strip. But fixed means against the
viewport, and it was pinned at top: 0 — where the header bars are. There is
no number to put there: the header is the quick-access bar plus a board bar
whose buttons wrap to one, two or three rows depending on language and window
width. So the header measures itself into --wekan-header-height and the
sidebar starts at that, kept current by a ResizeObserver — the buttons
re-wrapping does not fire a window resize.

A subscription with no board id took the server down; it is answered, not fatal. Thanks to xet7.

publishComposite('board') starts with check(boardId, String). A
subscription arrives with a null board id, check() throws, and a throw inside
an ASYNC publisher escapes as an unhandled promise rejection — which this app
treats as fatal: SyncedCron: Fatal error encountered (unhandledRejection) and
Exited with code: 1. One bad subscription stopped the server for everyone,
and subscription arguments come from the client, so any client could send it;
the app was sending it itself, from a popup that read
Session.get('currentBoard') on a page that has no current board. The
publisher TESTS its arguments now instead of checking them — a subscription
that names no board publishes nothing and readies — and the same guard is on
boardCardsWindow and boardCardsLoadingMode. The client no longer sends a
subscription for a board id it does not have. Each guarded publisher still
marks its arguments with check(x, Match.Any)
(b3537985e), because this
app runs with audit-argument-checks and Match.test alone is not checking —
without that, every subscription failed with "Did not check() all arguments".
tests/publicationArgumentGuard.test.cjs replays the guard and fails on an
unguarded board subscription.

The board bar's icons fit two rows, and a desktop-mode board is a desktop board. Thanks to xet7.

The board bar's icons still took four rows - title, seven, three, hamburger -
because the rule that makes each button a flex item of the bar was in
boardHeader.css, and the display: flex for those groups in header.css has
the same specificity and loads later; it is written in the file that wins now.
And lists still stacked in desktop mode: boardBody.css lays the whole canvas
out for a phone by WIDTH — display: block on the swimlane, overflow-x: hidden on the wrapper — which makes every list a full-width row and drops the
add-list form under the last list. That is mobile mode's layout now; desktop
mode gets a swimlane that is a flex ROW scrolling sideways, so the lists run
left to right and the add-list form is the last item of the row — the right in
LTR and the left in RTL, by writing direction rather than a hard-coded side.

Mobile mode is the phone layout; desktop mode is the desktop layout, on a phone too. Thanks to xet7.

Five things, one theme: what belongs to the MODE the user chose and what
belongs to the width of the window. The board bar's buttons still took three
rows in desktop mode — the metrics were written in boardHeader.css, and
Meteor loads components/boards/ before components/main/, so header.css's
margin: 0 6px won at equal specificity; they are written in the file that
wins now, and eleven icons take two rows in both modes. The sidebar hamburger
is the last button at the right of the last row instead of pinned beside the
title. The avatar was cut in half in mobile mode only: the drag-handle toggle
in the top bar is also a .board-header-btn, so mobile mode gave it 42px of
padding for one icon — the width the avatar needed. Lists stacked one per row
in desktop mode, because that layout is chosen by width; it is
body.mobile-mode now. And the minicard's full-height thumb handle, chosen by
pointer: coarse, is mobile mode's too — desktop mode keeps the compact handle
in the corner under the menu button.

The board bar's icons fit two rows on a phone. Thanks to xet7.

Eleven icons took three rows under the title: each button was ~20px of icon
inside 10px of icon margin inside 6px of button margin — 52px of a 375px bar
for 20px of icon — so five fitted a row. A 44px touch target with 2px between
buttons is 48px each, so seven fit a row and the icons take two, the first of
them sharing the title's row. 44px is the minimum comfortable touch target, so
this is as tight as it goes: one row would need 34px each, smaller than a
fingertip. tests/narrowWindowLayout.test.cjs does the arithmetic and fails if
the metrics stop fitting eleven icons in two rows.

The avatar lines up with the bell, and "My Boards" is back at the left. Thanks to xet7.

The avatar sat above the bell and against the right edge: its wrapper carries
top: -5px from the desktop bar, and #header-user-bar carries 10px of
padding on each side — 20px of a 375px bar spent on nothing. Neither applies on
a phone now, and the chips behind the mode-toggle icons are trimmed to match.
"My Boards" had moved to the middle of the second header bar, which was a
scoping mistake: the phone rule that makes the All Boards page a flex column
was written for a bare .wrapper, and header.jade puts wrapper on
#header-main-bar on every page that is not a board — so the bar became a flex
column and centred its items. It is scoped to #content .wrapper now.

The board bar reads left to right, and the header says which mode you are in. Thanks to xet7.

Four things on a phone, all the same in mobile mode and desktop mode. The
board's buttons started on a row of their own under the title, because every
group is one flex item and moves as a block; on a phone the groups are
display: contents, so each button is a flex item of the bar and they start
right of the title. The sidebar hamburger sat on a row below them although two
rules were meant to pin it to the top right corner — they were scoped to
body.board-view, a class written in 67 CSS rules and set by NO code, so they
had never applied; the width-based copy asks
:has(.board-header-sidebar-toggle) instead. The mobile/desktop toggle did not
say which mode was on: #000 against #666 at 14px is no difference, so the
current side is a filled chip in the active theme with a white glyph and the
other is faded. And the avatar sat higher than the bell — a bottom margin lifts
an item by half of it in a centred row — while its initials sat low in the
circle, at y="11" of a 15-unit viewBox with a font-size taller than the box.

All Boards on a phone: the board list scrolls to its last board. Thanks to mimZD and xet7.

Reported against 10.10, again against 10.37, and again against 10.38 after two
fixes that made the numbers more accurate instead of removing them. An inner
scroller only works when every ancestor between it and the viewport has a
definite height, and this chain was built out of viewport arithmetic: the
wrapper was 100dvh although it begins below the two header bars, so its
bottom sat about two bars below the screen; the layout between had no height at
all, so height: 100% under it resolved to auto; and the list was `calc(100dvh

  • 120px)— a guess at everything above it, which on a phone is ~226px, so the list box reached ~100px below the screen and its last rows were under the fold where no gesture could bring them. There is no viewport arithmetic belowbodynow: the page is 100dvh and everything under it is a flex chain, so the list ends exactly where the screen does, whatever the bars above it are. Both modes use the same mechanism.tests/boardListScrollChain.test.cjs` fails if
    "viewport minus a guess" comes back. Not verified on a device: there is no
    phone here, and Playwright's fixed viewport has no browser toolbar.

and has the following developer-facing changes:

build.sh and build.bat always build WeKan before running the tests. Thanks to xet7.

Both built the bundle only when .build/bundle was MISSING — exactly the case
where a bundle exists and is stale. The :3000 test server runs that precompiled
bundle, so Node E2E and every Playwright browser were testing whatever was built
last time, and the run passed or failed on code that is no longer in the working
tree. Both delete .build and build every time now, and stop with an error if
the bundle is missing afterwards. build.bat was also two menu entries behind
build.sh — the dev server's custom port + ROOT_URL host, and "Install
Playwright browsers" — and both are added, renumbered and dispatched.
tests/buildScriptParity.test.cjs fails if either script stops rebuilding, if a
menu entry has no counterpart, if...

Read more

v10.39

Choose a tag to compare

@github-actions github-actions released this 26 Jul 17:40

v10.39 2026-07-26 WeKan ® release

This release fixes the following bugs:

The notification bell and the avatar sit the same way in both modes. Thanks to xet7.

They were placed by whatever margin happened to win: one auto margin on the zoom
pill pushed the pill, the bell and the avatar to the end of the row as a packed
group, so the bell sat against the pill with the empty space beyond it, and the
avatar's distance from the edge was whatever was left — different in mobile mode
and in desktop mode on the same phone. Below 800px the free space is shared
around the bell instead: an auto margin on each side puts it midway between the
zoom pill and the avatar, and the avatar keeps a fixed 12px gap to the right
edge. Both .iphone-device variants are named in the selector list, since that
fallback sets these margins with !important and two classes more, and the
placement would otherwise apply everywhere except the phone it was reported
from.

All Boards on a phone: one drag-handle size, and a workspace name you can read. Thanks to xet7.

Two things differed between mobile mode and desktop mode on the same phone. The
board tile's drag handle was a 26px circle in one and a 40px circle in the
other, and on a ~97px tile the big one covered a good part of the tile it sits
on; both are the smaller one now, still well over the ~24px a finger needs. And
a workspace had no readable name in EITHER mode: the row's rule said the name
"must give way to the fixed items around it", and it gave way completely — the
drag handle, folder icon, menu button and count chip come to ~130px at their
desktop paddings, the menu column on a 375px phone is ~145px, and the name was
laid out in the 15px left over. Those items are trimmed to ~90px and the name
has a 3.5em floor it may not shrink below, with an ellipsis when it is long.
tests/allBoardsPhoneRow.test.cjs reads the sizes out of the cascade.

Admin Panel: /information and /translation showed the page you came from. Thanks to xet7.

Both old URLs are panes of Admin Panel / Settings now, and both redirected with
FlowRouter.go('setting') called from INSIDE triggersEnter. A trigger runs
while its own route is still entering, and a go() from there is swallowed - so
nothing was rendered at all and whatever page the browser was showing simply
stayed. Playwright caught it on every browser: /information showed All Boards. A
trigger now redirects with the redirect it is handed, and each URL asks for
the pane it used to be a page of, so the bookmark lands where it pointed.
tests/adminOldUrlRedirect.test.cjs pins the redirect form and the pane.

All Boards on a phone fits the screen, and the board titles get their width back. Thanks to xet7.

The board titles were laid out two characters per line. Space for the drag
handle - one absolutely-positioned circle - was reserved three times on the way
down: on the list item, on the tile and on the text container, which is more
than a ~97px phone tile has. It is reserved once now, and not at all when drag
handles are off and no handle is rendered. The page could also be dragged
sideways, with the avatar past the right edge: the quick-access bar is nowrap
with overflow: visible and every item flex-shrink: 0, so a row wider than
the screen spilled - and visible overflow is scrollable overflow. The zoom pill,
by far the widest item, gives way instead, and html { overflow-x: hidden } on
a phone is the guarantee. tests/mobileAllBoardsFit.test.cjs pins both.

The zoom number is inside its white pill again, and big enough to read. Thanks to xet7.

On a phone the pill was empty and "100" sat to the right of it in tiny type,
half under the notification bell. The pill was allowed to shrink below its own
contents, and a flex item that shrinks past its content does not clip it - the
white background ends where the width says and the text carries on outside it.
The pill is sized by what is in it now, and what is in it is made small instead.
The tiny type was font-size: 0.7em of a 12px bar - about 8px, the smallest
text on the page - now a plain 14px, which is also why the pill stays narrow.
The base rule's 24px height cap, shorter than that text, is lifted so the number
is centred. tests/mobileAllBoardsFit.test.cjs pins all of it.

A narrow window gets the narrow-window layout, not only an explicit mobile mode. Thanks to xet7.

The phone/desktop toggle writes an explicit choice, and Utils.isMiniScreen()
returns it as-is, so a phone whose user picked DESKTOP mode is not a mini screen
and its body carries no .mobile-mode — while the viewport is still 375px wide.
Three fixes written for one of those two therefore did nothing there. "Create
board" opened 160px in with its right half off the screen, because the geometry
laid it out as a floating box anchored to the button while the CSS made it the
full width; the board bar's hamburger was pushed to a third row of its own; and
the top bar was still wider than the screen, so the avatar was cut off. The
popup is a sheet pinned to the corner at any viewport that narrow, the hamburger
leaves the flow by width as well as by mode, and the drag-handle toggle, the
mode toggle and the logo give back the ~60px the avatar needed.
tests/narrowWindowLayout.test.cjs pins all three.

and improves the changelog and the documentation:

The changelog shows a short description, and hides the long one behind it. Thanks to xet7.

Every entry is a <details> now: the <summary> is a short description of what
was done and IS the link to the commit — the hash is in the href, never on the
page — and clicking it reveals the long description, wrapped at 80 columns. 977
entries across every release were converted, the ones the old prose format had
left malformed were repaired rather than carried over, and no URL or heading was
lost. The top of the file became # Platforms (with its collapsible Version
list) and # TODO Later, whose blocks carry no Thanks to because nothing
there is done yet. The rules are written down in
CLAUDE.md
, and
tests/changelogFormat.test.cjs checks the whole file against them.

CLAUDE.md records how a Hall of Fame entry is written. Thanks to xet7.

The wekan.fi Hall of Fame page grew a row of
eight cells, one thing in
each
— CVE, Icon beside
it
, Vulnerability name, Date,
Responsible Security Disclosure by, Stars, Process, Vulnerabilities — with the
Process and Vulnerabilities
cells collapsed behind their own summary, the stars of a row on one
line
and the icon beside its
red drop on one
, the
reporter's nickname as the link to their
GitHub
— checked to exist
before it is linked — and no role note after a
name
. All of it is stated in
CLAUDE.md so the next security entry is written to fit rather than reconstructed
from the file.

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

v10.38

Choose a tag to compare

@github-actions github-actions released this 26 Jul 12:31

v10.38 2026-07-26 WeKan ® release

This release fixes the following CRITICAL SECURITY ISSUES:

  • ZipBleed: arbitrary file write when
    restoring a backup archive (zip-slip)
    (f1c89548e).
    Thanks to xet7.
  • GHSA-3gcg-g6rf-w2rx:
    an invalid authToken on a board export endpoint crashed the server (40de1799a).
    Thanks to laijunyue for the coordinated disclosure, and xet7.

and adds the following new features:

  • Multitenancy: one WeKan server for many domains, with Organizations as the
    tenants (36b899b9d).
    Thanks to xet7.
  • Admin Panel / Settings / Visibility: Change color sets the site theme
    (36b899b9d).
    Thanks to xet7.

and reorganises the Admin Panel:

  • Admin Panel / Settings is reorganised so every setting sits with the thing it
    is about (fa0da9178).
    Thanks to xet7.
  • Every Admin Panel page renders ONE shared left menu
    (e26706799).
    Thanks to xet7.
  • Admin Panel / People: Domains, Organizations, Teams and People use the shared
    table page (ccc95bffb).
    Thanks to xet7.
  • The Admin Panel Features tab is removed
    (b72a4996d).
    Thanks to xet7.
  • Admin Panel / Problems: the Security report is renamed Security Report and
    moved above Broken Cards
    (4df87fd6b).
    Thanks to xet7.
  • Admin Panel: the Login and E-mail panes moved from Settings to People, above
    Organizations (47b03ef89).
    Thanks to xet7.
  • Every Admin Panel pane opens with the same heading, and the heading is the
    open left-menu entry's own label
    (d23219407).
    Thanks to xet7.
  • Admin Panel / Settings / Translation renders through the shared table page
    (docs/Design/Page/Table.md)
    (d23219407).
    Thanks to xet7.
  • Version is the FIRST pane of Admin Panel / Settings and the one that opens
    with the page (d23219407).
    Thanks to xet7.
  • Admin Panel / Settings / Visibility is four named groups instead of one long
    list (671262ddb).
    Thanks to xet7.
  • "Add board members only from the same Organization or Team" moves out of Admin
    Panel / People / Login
    (f0ea1601b).
    Thanks to xet7.
  • Admin Panel / People / Login is one "Login: Allow" group of checkboxes
    (40c1c1e71).
    Thanks to xet7.
  • Admin Panel / People / E-mail: "Email domain name" is renamed to say what it
    does (f15b37e4e).
    Thanks to xet7.
  • Admin Panel / Settings / Visibility: the All Boards rows say only what is
    hidden (2ef34924d).
    Thanks to xet7.
  • Each section of Admin Panel / Settings / Visibility has its own Save, directly
    above the rule that closes it
    (9255a6533).
    Thanks to xet7.
  • "Product name" appears once in that pane, not twice: the group holds one field
    (bbb1b3ff0).
    Thanks to xet7.
  • Admin Panel / Problems: the left menu is grouped under Settings and Reports
    (fc0fe3177).
    Thanks to xet7.
  • Admin Panel / People: Domains moves up beside E-mail, the settings it is about
    (d23219407).
    Thanks to xet7.
  • Admin Panel / Problems / Broken Cards has the same controls as the other
    reports (fc0fe3177).
    Thanks to xet7.
  • No Admin Panel pane repeats the title above it
    (9a0db4343).
    Thanks to xet7.
  • Admin Panel / Attachments opens on Backup, which is also the first entry of
    its menu (a9680fa3d).
    Thanks to xet7.
  • Admin Panel / Attachments no longer has a Sandstorm pane
    (eba25459a).
    Thanks to xet7.

and updates the following dependencies:

  • @aws-sdk/client-s3 3.1090.0 → 3.1095.0 — the S3 / MinIO attachment storage
    client (#6530, 36b54b1f5).
    Thanks to dependabot.
  • unzipper 0.12.3 → 0.12.5 — the zip reader behind board import and backup
    restore (#6529, aa7abcf09).
    Thanks to dependabot.
  • bson 7.3.0 → 7.3.1 — the BSON codec used with MongoDB and FerretDB (#6527,
    047319fb2).
    Thanks to dependabot.
  • @playwright/test 1.61.1 → 1.62.0 in tests/playwright — the browser test
    runner, a development dependency that is not part of the shipped bundle
    (#6528, f7fb32774).
    Thanks to dependabot.
  • docker/login-action 4.4.0 → 4.5.1 — the GitHub Actions step that signs in
    to the container registries when a release image is published (#6526,
    d4684448c).
    Thanks to dependabot.

and fixes the following bugs:

  • Clicking a card closes the one that was open; keeping many open is a per-user
    setting (2973240a7).
    Thanks to mimZD and xet7.
  • All Boards on a phone sizes its scrollers by the viewport that is actually
    there (89920762a).
    Thanks to mimZD and xet7.
  • Choosing a theme now recolours the whole UI, not just the header
    (d72675906).
    Thanks to xet7.
  • Admin Panel: the Edit User, Organization and Team popups fit the window, in
    columns (19a5ea0b7).
    Thanks to xet7.
  • Admin Panel / Settings / Visibility / Wait Spinner shows the spinner it names,
    spinning (19a5ea0b7).
    Thanks to xet7.
  • Admin Panel / Settings / Translation puts its New column on the left
    (19a5ea0b7).
    Thanks to xet7.
  • Admin Panel / People / People showed nothing at all — no table, no search box,
    no pager (d23219407).
    Thanks to xet7.
  • The right-hand side of an Admin Panel table is no longer off screen
    (d23219407).
    Thanks to xet7.
  • An empty Admin Panel table still shows its header, so its New button is there
    (d23219407).
    Thanks to xet7.
  • Every control in an Admin Panel table's controls row sits at the same height
    (d23219407).
    Thanks to xet7.
  • A long Admin Panel left menu scrolls inside its panel
    (a4990a474).
    Thanks to xet7.
  • The build stopped with Can't use the built-in 'if' here on the People page
    (f8793bec4).
    Thanks to xet7.
  • Admin Panel / People / E-mail saved neither of the two settings it shows
    (f15b37e4e).
    Thanks to xet7.
  • Admin Panel pages no longer repeat the pane name in a bar of their own
    (73cd930a4).
    Thanks to xet7.
  • The Admin Panel left menu is back on every page
    (d34d28159).
    Thanks to xet7.
  • The password field is back on the Sign In and Register pages
    (696c49038).
    Thanks to xet7.
  • A finished MongoDB → FerretDB migration on Snap no longer leaves WeKan on 503
    (aebede877).
    Thanks to S0QR2 and xet7.
  • In mobile mode the fixed-size light grey bands around a swimlane are gone
    (6837198bf).
    Thanks to xet7.
  • In mobile mode the board fits the width again
    (a5850296a).
    Thanks to xet7.
  • In mobile mode the titles and the top bar sit on one line
    (a5850296a).
    Thanks to xet7.
  • In mobile mode, clicking the Add List + no longer opens the list as well
    (df27e349d).
    Thanks to xet7.
  • In mobile mode the "Add List" + moved into each list header, between the caret
    and the drag handle
    (61979c0f6).
    Thanks to xet7.
  • Checked for the same window-resizing bug everywhere else it could hide
    (7dcd9da67).
    Thanks to xet7.
  • Elements no longer change size when the browser window is resized
    (d03cd0300).
    Thanks to xet7.
  • The second header bar in mobile mode is the same on a phone as in mobile mode
    on a desktop window
    (72315d8f9).
    Thanks to xet7.
  • The list title is visible in mobile mode again, both on a phone and on a
    desktop (72315d8f9).
    Thanks to xet7.
  • The board...
Read more

v10.37

Choose a tag to compare

@github-actions github-actions released this 25 Jul 00:04

v10.37 2026-07-25 WeKan ® release

This release fixes the following SECURITY ISSUES found by GitHub CodeQL code
scanning:

  • js/incomplete-sanitization (High), alert #428, in
    tests/boardHeaderOneLine.test.cjs: the CSS rule bodies were split with
    rule.split('{') and the trailing brace removed with body.replace('}', ''),
    which strips only the FIRST }. The block is now matched with one regex that
    captures selector and body as separate groups, so no brace ends up in the text
    and there is nothing to strip.
  • js/incomplete-sanitization (High), alert #427, in
    tests/testsAreRegistered.test.cjs: a file name was spliced into a RegExp
    after escaping only dots, leaving every other metacharacter — the backslash
    above all — able to change the meaning of the pattern. It now goes through an
    escapeRegExp() that escapes the full set, backslash included.
  • Both are test helpers, so neither was reachable by an attacker, but both were
    genuinely wrong string handling
    (commit).
  • Thanks to GitHub CodeQL (alerts #427 and #428) and xet7.

and resolves the following GitHub Dependabot alerts in npm dependencies:

  • brace-expansion 5.0.7 → 5.0.8 (RUNTIME dependency, transitive via minimatch):
    fixes CVE-2026-14257
    (GHSA-mh99-v99m-4gvg, High, CVSS 7.5, alert #119) — expand() bounds how MANY
    results it produces (max, 100000) but not how LONG they get, so chained brace
    groups keep the count under the cap while every result grows one character per
    group. A ~7.5 KB input ('{a,b}'.repeat(1500)) exhausts memory and kills the Node
    process with a fatal, uncatchable out-of-memory error that try/catch cannot
    contain. 5.0.8 bounds the total characters one expand() call may accumulate
    (maxLength, default 4000000) inside the output-building loops, so intermediate
    arrays are bounded too and oversized input is truncated rather than fatal. Patch
    release in the same major line; the only other change is engines.node, which drops
    Node 18 — WeKan builds and ships on Node 24 (Dockerfile NODE_VERSION=v24.18.0, CI
    NODE_VERSION: '24'), so nothing is affected
    (#6523, merge commit).
  • postcss 8.5.15 → 8.5.22 (dev dependency; enters only through css-loader, which
    the rspack build uses for .css, and is not itself part of the shipped bundle):
    fixes GHSA-r28c-9q8g-f849
    (High, CVSS 7.5) — postcss follows a /*# sourceMappingURL=... */ comment in the CSS
    it parses and builds the path with path.join(dirname(from), annotation), which
    normalises but does not sandbox .., so a crafted comment discloses arbitrary .map
    files. Affected <= 8.5.17, patched in 8.5.18. nanoid 3.3.12 → 3.3.16 rides along
    as postcss's own dependency
    (#6522, merge commit).
  • Both are lock-only changes whose tarball integrity hashes were verified against the
    npm registry, and the brace-expansion lock edit was reproduced independently with
    npm update brace-expansion --package-lock-only, which produced a byte-identical
    diff. elliptic (alert #55, CVE-2025-14505) is still left pinned for the reason
    recorded in v10.14: no fixed version is published upstream — the latest release is
    still 6.6.1 and the advisory lists no patched version. It is a dev-only transitive
    polyfill (@meteorjs/rspacknode-stdlib-browsercrypto-browserify
    browserify-sign/create-ecdh), no WeKan client module imports node crypto, and
    the built client bundle contains no elliptic/secp256k1/crypto-browserify code
    at all, so it never reaches users.
  • Thanks to GitHub Dependabot and xet7.

and has the following developer-tooling fix:

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

v10.36

Choose a tag to compare

@github-actions github-actions released this 24 Jul 22:01

v10.36 2026-07-25 WeKan ® release

This release fixes the following bugs:

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

v10.35

Choose a tag to compare

@github-actions github-actions released this 24 Jul 18:27

v10.35 2026-07-24 WeKan ® release

This release fixes the following bugs:

and has the following developer-tooling changes:

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

v10.34

Choose a tag to compare

@github-actions github-actions released this 24 Jul 07:26

v10.34 2026-07-24 WeKan ® release

This release adds the following new features:

and fixes the following bugs:

Read more

v10.33

Choose a tag to compare

@github-actions github-actions released this 23 Jul 19:32

v10.33 2026-07-23 WeKan ® release

This release adds the following updates:

and fixes the following bugs:

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

v10.32

Choose a tag to compare

@github-actions github-actions released this 23 Jul 17:31

v10.32 2026-07-23 WeKan ® release

This release fixes the following bugs:

and updates the following dependencies:

and has the following developer-tooling fix:

and improves the translation workflow:

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

v10.31

Choose a tag to compare

@github-actions github-actions released this 23 Jul 13:55

v10.31 2026-07-23 WeKan ® release

This release fixes the following bugs:

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