Wekan
Open source kanban board application built with Meteor
Alternative to: trello
v10.00
2026-07-18v10.00 2026-07-18 WeKan ® release
This release adds the following updates:
- Updated Sandstorm Backup docs. Thanks to robertdahlem and xet7.
and adds the following features:
-
WeKan has been translated to 154 languages. Thanks to xet7. Every language file in
imports/i18n/data/is now filled in (previously most were largely English). Each language matches its own existing terminology as a glossary plus standard Kanban terms; product/brand names, acronyms, placeholders and markup are preserved; regional variants were seeded from their base language; and a few wrong ones were corrected (Wu Chinesewuu-Hanswas registered; thewa-RRfile is Waray/war, not a Walloon variant, so it was re-translated; Wolof/Malay display names were fixed) so that all languages are browser-detectable and visible in the Change Language popup.releases/translations/push-all-translations.shforce-pushes every language to Transifex. Commits:- Finnish: translate newest UI strings (theme, font, size, colors, Sandstorm)
- i18n: translate new admin/import-export strings to Finnish
- releases: add translations-push-all-translations.sh (force-push all languages)
- i18n: translate untranslated strings (wave 1: zh-TW, pt-BR, da, he, sv)
- i18n: translate untranslated strings (wave 2: 15 major languages)
- i18n: seed 32 regional variants from their translated base languages
- i18n: seed close-relative lects as baselines (cmn, wuu, yue, ja-Hira, vls, ary)
- i18n: register generic Chinese (zh) so it is selectable and browser-detectable
- i18n: translate untranslated strings (wave 4: 15 languages + 9 variants)
- i18n: translate untranslated strings (wave 5: 15 languages + 5 variants)
- i18n: translate untranslated strings (wave 6: 15 languages + 2 variants)
- i18n: translate untranslated strings (wave 7, final: 14 languages + 5 variants)
- WeKan has been translated to 154 languages
- i18n: register wuu-Hans, fix Wolof/Malay names, add wuu browser alias
- Changelog: WeKan translated to 154 languages, with commit links
- Moved translation script to correct directory. Thanks to xet7
- i18n: fix wa-RR — translate as Waray (war), not Walloon
- Changelog: add Part 12 (Waray wa-RR fix) to the 154-languages entry
- releases: fix push-all-translations.sh cd depth for its translations/ location
-
Member menu / Change Color — global theme override, visible swatches, applies everywhere, no Save button (#5778,
docs/Theme/Theme.md). The member menu gets a Change Color entry that works like Board Settings / Change Color but is a per-user global override saved to your profile, so the chosen theme applies to the whole UI — All Boards, Search, Admin Panel, My Cards, Due Cards and board pages — via aboard-color-<name>class on<body>/header (while you are on a board, that board’s own color still wins). This makes a dark theme everywhere possible. Done differently from the first cut: the picker was initially built as two-level dropdowns (category then theme); that was replaced by visible color swatches grouped by category (Flat / Clear / Dark / Special, category name above each group), and the Save button was removed — clicking a swatch applies immediately. Flat themes allow 1 custom color and clear themes 2 (a gradient) via the native color wheel; dark/special are fixed. Custom colors are validated server-side as#rrggbband applied as CSS variables (--theme-accent/--theme-accent-2). Category titles are left-aligned and the popup has a title. Thanks to xet7. Commits:- Member Menu / Change Color: global per-user theme override (#5778)
- Select Color: theme categories core + design doc (docs/Theme/Theme.md)
- Select Color: two-level dropdown picker + custom colors (#5778)
- Select Color: global override applies everywhere + visible grouped swatches (#5778)
- Change Color popup: immediate apply (no Save), left-aligned titles, title, spacing
- Change Color popup: remove the “Preview” text from the custom-color preview swatch
-
Member Settings / Font — pick an installed UI font, size and text colors (part of #4759). A new Font member-menu entry lets you choose a UI font that already exists in your browser (canvas-detected; names are plain text, never HTML/markdown, validated server-side against a curated whitelist — only a known font name and a preset percentage ever reach the DOM), a font size, and custom text and text-background colors (each unsettable). Done differently from the first cut: the font and size were first built as dropdowns; that was replaced by buttons — one font-name button per detected font, each rendered in its own font, and a row of size buttons (smaller … 100% in the middle … larger) — that apply immediately on click (no Save). A preview pangram shows below the font buttons, the Unset links are styled as buttons, and the popup has a title. Stored as
profile.uiFont/profile.uiFontSize/profile.uiTextColor/profile.uiTextBgColor. (Only the font part of #4759, so the issue stays open.) Thanks to xet7. Commits:- Member Settings / Font: pick an installed font + preset size (#4759)
- Member Settings / Font / Color: custom text + background color (#4759)
- Fix #4759 regression: uiTextColor/uiTextBgColor custom() rejected every user insert
- Member Settings / Font popup: add a title (changeFontPopup-title)
- Member Settings / Font: font-name + size buttons, immediate apply (no dropdowns)
- Member Settings / Font: show the preview pangram below the font-name buttons
- Font popup: style the “Unset” colour reset links as buttons
-
Soft delete + Undo/Redo + change-History — deleting is reversible, and moves can be undone (#1023, #6478,
docs/Features/Undo/Undo.md). Deleting a list no longer destroys it: the list and its cards are marked deleted (deletedAt/deletedBy/deleteBatchId), hidden from the board, and restorable vialists.restoreorCtrl+Z— the first slice of a general “no permanent delete in ordinary use” principle (physical deletion limited to GDPR/account erasure and an explicit Global-Admin purge behind an off-by-default Admin Panel / Features / Delete flag). Card/list/swimlane moves are now undoable/redoable withCtrl+Z/Ctrl+Y(theuserPositionHistorycollection was silently not recording — its guard checked an un-imported global — and had no redo or key bindings; all fixed, selection logic unit-tested). Design unifies this into one universal change-History with scoped views. Activities were confirmed to already load progressively. Thanks to xet7. Commits:- Soft delete for lists: delete = mark, restorable + undoable (#1023)
- Undo docs: soft-delete design (delete = mark, never destroy)
- #6478: undo/redo for card/list/swimlane moves + confirm high-impact list move on touch
- Docs: design for per-group card History (view + restore)
- Docs: undo/redo + high-impact confirmation feature doc
- Docs: unify undo/redo into one universal change-History (every change) with many scoped views
- Activities already load progressively (infinite scroll), like visible cards
-
Home board — set a board that opens automatically after login (#2220). A per-user default “home” board (
profile.defaultBoardId) opens automatically after login on all deployments (a once-per-session router redirect), and on Sandstorm a grain with exactly one board again opens straight into it (without saving anything; a saved Home board wins, a many-board grain with no choice shows All Boards). You set the Home board from the All Boards page via Multi-Selection: turn Multi-Selection on, select a board, and click the home action in the new “Selected:” row (which also has a star action); the Home board then shows a home badge and sits at the top of Starred. Done differently: the earlier per-board-tile home toggle was hidden, but setting a Home board was brought back through the Multi-Selection “Selected:” action — so the feature is available, not disabled, and not Sandstorm-only — and the initial Sandstorm “save the single-board choice” was changed to no-save. Thanks to xet7. Commits:- Feature #2220: mark a board to open automatically after login (home board)
- Sandstorm: auto-open a single-board grain (no save) (#2220)
- All Boards: hide Home-board icons and disable setting a Home board (#2220)
- All Boards: “Selected:” star/home actions + Home board badge (#2220)
- Tests: cover the remaining Upcoming changes (#2220 default board, #6465 UI, #6478 confirm)
-
Add List moved from a standing column to a per-list header button (#6465). The Swimlanes/Lists views no longer show a permanent “Add List” composer column; each list header has a far-right add-list button that opens the composer as a column immediately after that list (right in LTR, left in RTL), and an empty swimlane/board shows a + button. Also fixes the composer’s Save doing nothing (
createListAfter’scheck()used a non-Optionalmatcher fornextListId, so the inline composer 400’d with “Match failed”). (First cut — desktop/main views.) Thanks to csonkaoszimt (report) and xet7. Commits: -
All Boards, board header, top bar and popups — a large batch of layout/theming polish. Highlights: the right-sidebar hamburger is pinned to the right edge at every width with an ~8px gap, and the duplicate Board Settings cog was removed; the All Boards My Boards toolbar wraps (order Multi-Selection then Sort then Search), the Multi-Selection button matches the Swimlanes view, the empty grey band was removed, ”+ Add …” tiles match board-tile height, the board-tile drag handle sits at the right middle (transparent, icon only), and the search box is half width with the multi-selection hint beneath it; the mobile/desktop toggle and zoom swapped places; the Change Language popup shows multiple columns; the Change Avatar upload button and the Search All Boards / Archived boards buttons follow the theme colors; the Archived boards modal is full width and starts below the header; the Notifications drawer is full width with a black hamburger + X and black menu icons; and the member menu’s duplicate Notifications entry was removed. Done differently: an “icons only — always hide button text labels” board-header change was tried and then reverted, so button text labels stay. Thanks to xet7. Commits:
- Board header: keep the sidebar hamburger pinned to the right edge at all widths
- Board header: remove empty space around the sidebar hamburger button
- Board header: hamburger right gap matches the user-name gap (~8px)
- Board header: hide button text labels on narrow windows (icons only)
- Board header: remove the Board Settings cog (it is already in the right sidebar)
- Board header: icons only — always hide button text labels
- Revert board-header icons-only; update CHANGELOG Upcoming with newest changes
- Header/All Boards: reorder Multi-Selection/Sort/Search and swap mobile-toggle/zoom
- All Boards: + Add Board / + Add Template Container tile same height as board icons
- All Boards: remove empty .board-list-header dead grey space above the layout
- All Boards: My Boards bar wraps so Sort/Multi-Selection/Clear stay visible
- All Boards: Multi-Selection button looks the same as in Swimlanes View
- All Boards: move board tile drag handle to the right middle
- All Boards: transparent board tile drag-handle background (icon only)
- All Boards: vertically center the Search boards input text
- All Boards: move the Search boards input text 4px further down (top: 6px)
- All Boards: move the Search boards input text 2px further down (top: 8px)
- All Boards: move ”+ Add Board” text 4px up (keep tile height)
- All Boards: move ”+ Add Board” text 2px further up (padding 18/8/24/8)
- All Boards: move ”+ Add Template Container” text 2px down (separate from Add Board)
- All Boards: half-width search, hint below Multi-Selection, title beside icon
- Change Language popup: show languages in multiple columns when there is width
- Change Avatar popup: Upload button uses theme colors (blue bg, white text)
- Archived boards modal: full width + extends to the bottom of the window
- Archived boards modal: start below the header bar so its top is visible
- Archived boards: Restore/Delete buttons follow the theme override colors
- Search All Boards: new-search button follows theme override colors
- Search All Boards: label the clear button “Clear” using existing trello-clear-job key
- Member menu: remove the Notifications entry (duplicates the header bell icon)
- Notifications drawer header: black X + hamburger, X near the top-right edge
- Notifications drawer: full width + robust flex header (black hamburger + X)
- Notifications drawer: fix X position — cancel the global absolute .close rule
- Notifications menu: make the dropdown item icons black
-
Denser default layout: thinner lists, board tiles and card dock; taller-looking minicards (#6465). List width default 272 to 220px (minimum 270 to 200px), All Boards board tiles min-height 100 to 72px, and the card-detail right dock max-width 800 to 520px — all overridable, user customizations untouched. Minicards no longer reserve a tall empty band under a one-line title (the title viewer gets
min-height: 0), and the swimlane header no longer clips at non-100% zoom. Thanks to csonkaoszimt (report) and xet7. Commits:
and fixes the following bugs:
-
Confirmation dialogs work again — clicking any
.js-confirmbutton (e.g. “Remove Member”) did nothing becausePopup.afterConfirm()stashed the pending action on the Blaze data context (an immutable Minimongo doc that Blaze re-creates on re-render); it is now stored on the Popup instance (#6479). Thanks to mueschel (report) and xet7. -
Moving a card between swimlanes is no longer broken with long lists — jQuery UI sortable cached geometry at drag-start and never re-cached on WeKan’s manual auto-scroll, so the drop re-homed the card in the source swimlane; fixed with
sortable('refreshPositions')after a scroll (#6477). Thanks to mueschel (report) and xet7. -
Filter by date -> Overdue no longer lists cards with no due date —
$lte/range selectors matchednullunder both FerretDB and minimongo;DateFilter._getMongoSelectornow adds$ne: null(reported by email). Thanks to the reporter and xet7. -
A board-wide list no longer disappears from other swimlanes when nudged — the drop handler treated any small drag of a board-wide list (
swimlaneId === null) as a swimlane change; it now also requires an original swimlane (reported by email). Thanks to the reporter and xet7. -
FerretDB (bundled) — #6476 crash-loop root cause fixed, and label/title/date filters pushed down to SQLite (#6476). A startup SyncedCron upsert hit an orphaned-table error (
table "…connections_<hash>" already exists) that became an unhandledRejection and crash-looped WeKan so its port never opened; the bundled FerretDB now creates tables/indexes withIF NOT EXISTS. It also pushes label ($in), title ($regex) anddueAtrange filters down to SQLite instead of scanning every card in Go. (Details in the fork’s own CHANGELOG.) Thanks to uusijani, a1bert01 and xet7. Changelog commits: -
Snap release, CI and dev tooling. The exotic
ppc64el/s390xsnaps now build on GitHub Actions under QEMU instead of Launchpad (which returned exit 0 with no artifact);rebuild-wekan.shCURRENT-IP detection is subnet-agnostic (no morehttp://:3000); and the Playwright E2E workflow was disabled. Commits: -
Changelog, docs and test housekeeping. Commits:
Thanks to above for their contributions.