TrueCharts Bot e8a042a3ee feat(wekan): update image docker.io/wekanteam/wekan v9.67 → v9.70 (#49404)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [docker.io/wekanteam/wekan](https://redirect.github.com/wekan/wekan) |
minor | `6a6a5cc` → `9e84f05` |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the [Dependency
Dashboard](../issues/18710) for more information.

Add the preset `:preserveSemverRanges` to your config if you don't want
to pin your dependencies.

---

### Release Notes

<details>
<summary>wekan/wekan (docker.io/wekanteam/wekan)</summary>

###
[`v9.70`](https://redirect.github.com/wekan/wekan/blob/HEAD/CHANGELOG.md#v970-2026-06-23-WeKan--release)

[Compare
Source](https://redirect.github.com/wekan/wekan/compare/v9.69...v9.70)

This release fixes the following bugs:

- **Copying a card to or from a board with no labels threw.**
`Card.copy()`'s cross-board label-remap did
`oldBoard.labels.filter(...)` / `filterCopiedLabelIds(newBoard.labels,
…)` without guarding a missing `labels` array.
Most boards always have default labels, but a board **created via the
REST API** (`POST /api/boards`) has no `labels`
array — so copying a card to/from such a board (or copying the board
itself, which copies its cards) threw
`Cannot read properties of undefined (reading 'filter')` and returned
HTTP 500. Both label lookups now fall back to
`[]`. Cross-board copy regressions in
`tests/playwright/specs/17-rest-api.e2e.js`.
- [Copying a board did not copy its
webhooks](https://redirect.github.com/wekan/wekan/issues/5592),
[#&#8203;5592](https://redirect.github.com/wekan/wekan/issues/5592):
`board.copy()` duplicated swimlanes/lists/cards, custom fields
and rules/triggers/actions, but had no loop for **Integrations**
(outgoing webhooks), so a copied board lost all of
them (even though they are per-board children — `boardRemover` deletes
them by `boardId`). `copy()` now also copies
the board's Integrations, remapping `boardId` (URL/token/activities
carry over — the copying user is a board admin
with access to them). Regression in
`tests/playwright/specs/17-rest-api.e2e.js`.
- [Disabled user accounts could be added to
boards](https://redirect.github.com/wekan/wekan/issues/1894),
[#&#8203;1894](https://redirect.github.com/wekan/wekan/issues/1894):
none of the add-member paths checked the target account's
`loginDisabled` flag, so a deactivated user could be invited/added and
assigned to cards. `inviteUserToBoard` now
throws `error-user-disabled`, and the REST `POST
/api/boards/:boardId/members/:userId/add` endpoint returns HTTP 400,
when the target account is disabled (re-enabling the account allows the
add again). Regression in
  `tests/playwright/specs/17-rest-api.e2e.js`.
- [Admin Panel boards report listed removed members as current
members](https://redirect.github.com/wekan/wekan/issues/5122),
[#&#8203;5122](https://redirect.github.com/wekan/wekan/issues/5122):
removing a member from a board marks the member entry
`isActive: false` (it is kept in `board.members` for role history /
re-activation), but the Admin Panel → Reports →
Boards member column listed **all** member entries, so removed users
still appeared as members. The report now
filters to active members (`isActive !== false`). (The raw `GET
/api/boards/:boardId` response intentionally still
returns the full `members` array with each entry's `isActive` flag, so
API consumers can filter as they need.)
- [Could not remove a deleted user from a card's
members](https://redirect.github.com/wekan/wekan/issues/4847),
[#&#8203;4847](https://redirect.github.com/wekan/wekan/issues/4847)
(card side): when a user account is deleted, its entry stays in a
card's `members`, rendering as a blank avatar. Clicking it opened the
member popup, whose template dereferenced the
now-missing user document (`user.profile.fullname` / `user.username`)
and failed to render — so there was no way to
remove the orphaned member. The popup now detects a missing user, shows
a **"Deleted user"** entry with the raw id, and
keeps the **Remove from Card** control (the remove handler keys off the
member's `userId`, not the user document), so
orphaned card members can be removed. (No automated regression — a
self-evident Blaze template guard; the underlying
`unassignMember` removal already worked. The board-members *list* still
hides such entries because `activeMembers()`
also intentionally filters members whose user doc is merely
not-yet-loaded, so surfacing board-side orphans cleanly is
  a separate follow-up.)
- [A newly added board member was missing from the card members
popup](https://redirect.github.com/wekan/wekan/issues/4965),
[#&#8203;4965](https://redirect.github.com/wekan/wekan/issues/4965): the
card "add members" popup snapshotted the board's member list
**once** when it opened, so a member added to the board afterwards (or
whose user document finished loading just after
the popup opened) did not appear until the popup was reopened. The popup
now derives its candidate list **reactively**
(it stores only the filter term and re-reads `board.activeMembers()` on
each render), so newly-added members show up
without reopening. No change to `activeMembers()` itself (its
deleted-user filtering is unchanged).
- [Editing a linked card you cannot write to failed
silently](https://redirect.github.com/wekan/wekan/issues/5809),
[#&#8203;5809](https://redirect.github.com/wekan/wekan/issues/5809): a
linked card whose target lives on a board the user cannot
write to (e.g. a private board) rejected title/description edits at the
server allow rule, but the card-detail edit
handlers had no error handling, so the edit just vanished with no
feedback. The title and description submit handlers
now catch the failure and show the error (mirroring the existing
label-color handler), so the user sees why the edit
did not save. (No automated regression — surfacing a permission denial
across a private linked board is a UX/error
  path that is not cleanly reproducible in the test harness.)
- **Performance: copying a card with many checklist items took minutes**
([#&#8203;5688](https://redirect.github.com/wekan/wekan/issues/5688)).
`Checklist.copy()` duplicated each checklist item with the hooked
`insertAsync`, so collection-hooks fired each item's
`after.insert` — every one doing a `getCard` and inserting an
`addChecklistItem` activity. Copying a card with \~100
items meant \~100+ activity inserts (plus per-item DB round-trips),
taking minutes and spiking CPU. The copy now uses
`.direct` for the checklist and its items (skipping the per-item
activity hooks — pure churn for a wholesale copy) and
sets `boardId` itself, the same approach as the `cardRemover` delete
path. Copy regression (checklist + all items
  duplicated) in `tests/playwright/specs/17-rest-api.e2e.js`.
- **Copying a card to another board orphaned its subtasks on the old
board**
([#&#8203;5347](https://redirect.github.com/wekan/wekan/issues/5347)
data symptom): `Card.copy()` re-pointed each subtask's
`parentId` to the copied card but left its
`boardId`/`swimlaneId`/`listId` pointing at the **source** board — so a
cross-board copy created subtasks stranded on the original board whose
parent lives on another board (and it mutated
the cached source docs in place). Copied subtasks are now re-homed onto
the destination board/swimlane/list alongside
the copied parent, via a fresh object (no cache mutation). Cross-board
copy regression in
`tests/playwright/specs/17-rest-api.e2e.js`. (This fixes the
orphaned-cross-board-subtask data symptom noted in
[#&#8203;5347](https://redirect.github.com/wekan/wekan/issues/5347); the
separate "Maximum call stack" error there is not yet root-caused — see
the issue.)
- [Error when clicking the notification
icon](https://redirect.github.com/wekan/wekan/issues/5325),
[#&#8203;5325](https://redirect.github.com/wekan/wekan/issues/5325): a
notification whose referenced activity no longer existed (its
card/board was deleted) left an entry whose `activityObj` was null, and
the notifications drawer dereferences it
(`activity.user`, `activity._id`, …) — so one orphaned notification
threw and broke the whole popup. `user.notifications()`
now drops entries whose activity can't be resolved. (No automated
regression — an orphaned-notification state is not
cleanly reproducible in the harness; the fix is a self-evident filter.)
- [Deleting a custom field from a board could
throw](https://redirect.github.com/wekan/wekan/issues/5390),
[#&#8203;5390](https://redirect.github.com/wekan/wekan/issues/5390):
removing a (multi-board) custom field from one board runs a
`before.update` hook that logged a `setCustomField` activity by reading
`(await getActivity({customFieldId})).value` —
with **no null guard**, so a field that never had a value set (no such
activity) threw `Cannot read properties of
undefined` and aborted the removal. The lookup is now guarded.
([server/models/customFields.js](server/models/customFields.js))
- [Board "show checklists on minicard" setting had no
effect](https://redirect.github.com/wekan/wekan/issues/5565),
[#&#8203;5565](https://redirect.github.com/wekan/wekan/issues/5565): the
sidebar toggle writes `board.allowsChecklistsOnMinicard`, but
the minicard render checked a different, UI-less field
(`board.allowsChecklistAtMinicard`), so enabling the board-wide
setting never showed checklists on minicards. The minicard now reads the
field the toggle actually sets.

([client/components/cards/minicard.js](client/components/cards/minicard.js))

and these issues are verified resolved in current code (could not
reproduce / no error observed here; re-test on the
reporter's data requested):

- [#&#8203;5388](https://redirect.github.com/wekan/wekan/issues/5388)
(collapsing a list affected all users): list collapse state is
now stored **per user** (`profile.collapsedLists[boardId][listId]`, or a
cookie for logged-out users) instead of a
shared `collapsed` field on the list document — so one user collapsing a
list no longer changes it for everyone
(resolved by commit
[`414b8db`](https://redirect.github.com/wekan/wekan/commit/414b8dbf4),
which postdates the report; mirrors the per-user swimlane-collapse
handling).
- [#&#8203;3894](https://redirect.github.com/wekan/wekan/issues/3894)
(board import failed when the JSON's `members` referenced a user
not present in `users`): the importers already guard a missing user
entry (skip the dangling member instead of
dereferencing `undefined`) in
`client/components/import/wekanMembersMapper.js`,
`models/wekanmapper.js` and
`models/wekanCreator.js`, with a dedicated test
(`tests/wekanCreator.inconsistent.test.js`).
- [#&#8203;5411](https://redirect.github.com/wekan/wekan/issues/5411)
(non-super-admin board admins could not see the add-member "+"):
the sidebar add-member button is gated on
`currentUser.canInviteToBoard`, which returns `true` for any board admin
(`board.hasAdmin`), and the secure default invite roles include
`board-admin`. So board admins (not just site admins)
see the "+". This was resolved by the "Allow Invite to Board" roles
feature (commit
[`c956ab5`](https://redirect.github.com/wekan/wekan/commit/c956ab5a4)),
which postdates the
report; a site admin can additionally let other board roles invite via
Admin Panel → People → Roles.
- [#&#8203;5627](https://redirect.github.com/wekan/wekan/issues/5627)
(rules not copied when creating a board from a template):
`board.copy()` already copies the board's rules + triggers + actions
(remapping `boardId` and the rule's
`triggerId`/`actionId`); the report predates that code. Now covered by
the
[#&#8203;5592](https://redirect.github.com/wekan/wekan/issues/5592)/[#&#8203;5627](https://redirect.github.com/wekan/wekan/issues/5627)
copy regression in
`tests/playwright/specs/17-rest-api.e2e.js` so it cannot silently
regress.
- [#&#8203;5630](https://redirect.github.com/wekan/wekan/issues/5630)
(cannot save Admin Panel Layout settings): already fixed — the
Layout save handler had referenced form fields that were moved to the
separate Accessibility settings template,
throwing before the save; the current `js-save-layout` handler no longer
reads those fields.
- [#&#8203;5117](https://redirect.github.com/wekan/wekan/issues/5117) (a
TeX formula rendered both an SVG and a `<math>` tag): already
fixed by migrating math rendering from `markdown-it-mathjax3` (which
emitted both SVG and MathML) to **Temml**, which
  outputs MathML only (`packages/markdown/src/template-integration.js`).

###
[`v9.69`](https://redirect.github.com/wekan/wekan/blob/HEAD/CHANGELOG.md#v969-2026-06-23-WeKan--release)

[Compare
Source](https://redirect.github.com/wekan/wekan/compare/v9.68...v9.69)

This release fixes the following bugs:

- [Can't edit a card's members in the UI after removing them via the
REST API](https://redirect.github.com/wekan/wekan/issues/3697),
[#&#8203;3697](https://redirect.github.com/wekan/wekan/issues/3697):
clearing a card's `members` (or `assignees`) over REST left the
field uneditable in the UI. The card PUT handler guarded with `if
(req.body.members)` — falsy for the two natural
clear payloads (`null` and `""`) — so "remove the last member" was a
silent no-op, and its string branch was written
to store `null` rather than `[]`; a card with `members: null` then
breaks UI code that treats it as an array. The
handler now uses an `!== undefined` guard plus a shared coercion helper
so any clear payload (`null` / `""` / `[]`)
stores a clean `String[]` (never null), a single id is wrapped into an
array, and stray non-string entries are
dropped; `getMembers()`/`getAssignees()` also coerce a legacy `null` to
`[]` on read so existing corrupted documents
edit cleanly. Pure logic in `models/lib/restArrayParam.js` with a
Meteor-free Node unit test
(`tests/restArrayParam.test.cjs`, `npm run test:unit:node`, incl. a
**negative test** reproducing the old
null-writing logic), plus a REST regression in
`tests/playwright/specs/17-rest-api.e2e.js`.
- [Can't create a card with no member via the REST
API](https://redirect.github.com/wekan/wekan/issues/2875),
[#&#8203;2875](https://redirect.github.com/wekan/wekan/issues/2875): the
card-create endpoints (`POST .../cards` and
`POST .../cards/bulk`) wrote `req.body.members`/`assignees` straight to
the insert with no normalization — the
create-side twin of
[#&#8203;3697](https://redirect.github.com/wekan/wekan/issues/3697) — so
a `null`/`""` payload persisted as `null` (breaking later UI editing).
Both handlers
now run the same `coerceRestArrayParam` helper: the field is omitted
when not provided (so the schema default `[]`
applies), any clear payload becomes `[]` (never null), and a single id
is wrapped into an array. REST regression in
  `tests/playwright/specs/17-rest-api.e2e.js`.
- [Board created through the REST API shows in the API but not in the
browser UI](https://redirect.github.com/wekan/wekan/issues/5650),
[#&#8203;5650](https://redirect.github.com/wekan/wekan/issues/5650):
`POST /api/boards` set the board's sole member's `userId` from
`req.body.owner` with no fallback, so a request that omits `owner`
created a board whose only member had
`userId: undefined`. The board-list publication matches
`members.$elemMatch: { userId, isActive: true }`, which can
never match an undefined id — so the board was returned by the REST API
but invisible in the browser. `owner` now
falls back to the authenticated caller (`req.body.owner || req.userId`),
mirroring the Meteor create method. REST +
  DB regression in `tests/playwright/specs/17-rest-api.e2e.js`.
- [Copying a card to another board left its comments on the wrong
board](https://redirect.github.com/wekan/wekan/issues/5166),
[#&#8203;5166](https://redirect.github.com/wekan/wekan/issues/5166):
`CardComments.copy()` cloned a comment but only changed its
`cardId`, so a card copied to another board produced comments that kept
the **source** board's `boardId`. Comment
permission checks key off the comment's `boardId`, so edit/delete on a
copied comment was validated against the wrong
board, and any board-scoped query saw it on the old board. `copy()` now
also sets the destination `boardId` (the
author `userId` is intentionally preserved). Cross-board copy regression
in
`tests/playwright/specs/17-rest-api.e2e.js`. *Note:* the related "wrong
author shown" symptom is a separate display
issue — when a copied comment's author is **not a member of the
destination board**, their user document isn't
published there, so the UI can't resolve the name; adding those users to
the board resolves it. A broader fix
(publishing comment authors' minimal profile on boards where their
comments appear) is left as a follow-up.
- [Exception "Removed nonexistent document" when deleting a card
detail](https://redirect.github.com/wekan/wekan/issues/3252),
[#&#8203;3252](https://redirect.github.com/wekan/wekan/issues/3252)
(partial): deleting a comment or checklist/checklist-item could
throw `Removed nonexistent document` on the client. The delete handlers
called `Collection.remove(_id)` directly, but
under heavy archive/delete churn the target doc can already have been
evicted from the client's Minimongo cache, and
removing a missing `_id` throws. The comment / checklist /
checklist-item delete handlers now check the doc still
  exists in the local cache before removing it
(`client/components/activities/comments.js`,
`client/components/cards/checklists.js`). The server-side
`before.remove` hooks were already hardened to guard + log instead of
throwing. (No automated regression for the
thrown exception — the eviction race is not deterministically
reproducible; the guard itself is a self-evident
findOne-then-remove.) The **high CPU on bulk delete** the issue also
reports is reduced by the cascade change below;
the remaining cost is on the **archive** path (a bulk update, not a
delete) and is a separate follow-up.
- **Performance: deleting a card no longer fans out per-child activity
churn**
([#&#8203;3252](https://redirect.github.com/wekan/wekan/issues/3252),
[#&#8203;5322](https://redirect.github.com/wekan/wekan/issues/5322)).
`cardRemover` removed a card's checklist items, checklists and
comments with the hooked `removeAsync`, so collection-hooks fired each
child's `before.remove` **once per document** —
every one doing a `getCard` and inserting an activity (e.g. a
`removedChecklistItem` per item), which then triggered
the notification + publication observers. Deleting (or bulk-deleting) a
card with many children produced an
activity-insert storm and pegged the CPU. `cardRemover` now removes
those children with `.direct` (skipping the
per-child hooks — they only logged activities that are unviewable once
the card is gone) and clears **all** of the
card's activities in a single bulk op, which also removes the activities
that a delete previously left orphaned. The
`deleteCard` activity is still logged afterward (so the outgoing webhook
fires), and attachments still go through the
normal remove so their files are deleted. Cascade + activity-cleanup
regression (also a negative test) in
  `tests/playwright/specs/17-rest-api.e2e.js`.

and this issue is verified resolved in current code (could not reproduce
/ no error observed here; re-test on the
reporter's data requested):

- [#&#8203;2292](https://redirect.github.com/wekan/wekan/issues/2292)
(archiving a swimlane appeared to delete all its cards):
`Swimlane.archive()` ([models/swimlanes.js](models/swimlanes.js)) only
sets `archived: true` on the swimlane — it
does **not** touch or delete the cards, and `restore()` brings the
swimlane and its cards back. While a swimlane is
archived its cards are merely hidden from the board view (board queries
filter to `archived: false` swimlanes), not
lost — the v2.27-era cascade described in the report no longer happens.
(A dedicated way to view an archived
  swimlane's cards before restoring would be a separate UX improvement.)

###
[`v9.68`](https://redirect.github.com/wekan/wekan/blob/HEAD/CHANGELOG.md#v968-2026-06-23-WeKan--release)

[Compare
Source](https://redirect.github.com/wekan/wekan/compare/v9.67...v9.68)

This release adds the following updates and developer tooling:

- **rebuild-wekan.sh / rebuild-wekan.bat: multi-forge mirroring.** Two
new menu options: *Install forge CLI
tools* (installs the gh-like CLIs `gh`, `glab`, `tea`, `git-bug`, and
the unified [`forge`](https://redirect.github.com/git-pkgs/forge)
via the detected package manager / `go install`), and *Mirror repo
GitHub → GitLab/Codeberg/Forgejo/Gitea*. The
mirror flow selects source + target by number (e.g. `1 3` = GitHub →
Codeberg), pushes all branches/tags with
`git push --mirror`, then runs a cross-platform Node engine
(`tools/forge-mirror.js`) that syncs only the issues and
pull requests **missing** at the target (driving the authenticated CLIs;
de-duplicated by title; dry-run by default)
and converts the GitHub Actions workflow syntax for the target: an
annotated `.forgejo/workflows/` copy that flags
the known Forgejo/Gitea incompatibilities (`hashFiles()`,
`permissions:`, `continue-on-error:`, complex `runs-on:`),
or for GitLab a `.gitlab-ci.yml` scaffold plus a guide pointing at
GitLab's official converter skill.
- **Updated Meteor to 3.5-rc.2**
([#&#8203;6413](https://redirect.github.com/wekan/wekan/pull/6413),
thanks harryadel;
merged in
[d5be28bc2](https://redirect.github.com/wekan/wekan/commit/d5be28bc2)).
- **Dependency updates** (merged the low-risk Dependabot PRs that pass
build + unit tests):
`@swc/helpers` 0.5.22 → 0.5.23
([#&#8203;6416](https://redirect.github.com/wekan/wekan/pull/6416)) and
the test-only
`sinon` 21 → 22
([#&#8203;6418](https://redirect.github.com/wekan/wekan/pull/6418)). The
major **production** bumps were held back
for individual testing rather than merged: `jquery` 3 → 4
([#&#8203;6417](https://redirect.github.com/wekan/wekan/pull/6417),
risks Blaze / jQuery-UI compatibility), `@babel/runtime` 7 → 8
([#&#8203;6415](https://redirect.github.com/wekan/wekan/pull/6415)),
and `@tweedegolf/sab-adapter-amazon-s3` 1 → 3
([#&#8203;6414](https://redirect.github.com/wekan/wekan/pull/6414), S3
storage is not
  exercised by CI).
- **rebuild-wekan.sh: run the Chromium / Firefox / WebKit Playwright
matrix with or without Docker.** The
WebKit-only Docker support is generalized so any browser can run
natively or inside the official Playwright Docker
image, selectable via `WEKAN_PLAYWRIGHT_DOCKER=1/0` (whole matrix) or
per-browser
`WEKAN_CHROMIUM_DOCKER` / `WEKAN_FIREFOX_DOCKER` /
`WEKAN_WEBKIT_DOCKER`. Defaults are unchanged (Chromium/Firefox
native, WebKit via Docker on Linux arm64). Adds an "Install Playwright
browsers" menu item that does
`playwright install --with-deps` and/or pulls the Playwright Docker
image.
[commit
c3e6d97bd](https://redirect.github.com/wekan/wekan/commit/c3e6d97bd).
- **E2E reliability:** the Playwright suite was red on `main` because
the **rspack client JS bundle was not being
served** by `meteor run` (dev mode) in headless CI — browser requests
for the bundle returned the SPA HTML fallback
(`Unexpected token '<'`), so Meteor never initialised and all \~212
specs timed out in `waitForMeteor` (confirmed: a
CI readiness probe got an empty response from the bundle URL for 10
minutes straight). The CI E2E job now runs
against a **production build** (`meteor build` → `node bundle/main.js`),
where the client JS is baked into the bundle
and served statically by the Meteor server — no rspack dev server, no
chunk-serving race. The production run also
needed two env vars the dev runner sets but CI did not: `WRITABLE_PATH`
(without it `server/00checkStartup.js` exits
before listening) and `WITH_API=true` (without it every REST-API spec
gets HTML instead of JSON). The suite is also
**sharded 2× per browser** (6 parallel jobs) to cut wall-clock time, and
the per-spec `waitForMeteor` timeout was
raised 30s → 60s. **Confirmed:** the suite went from *0 tests running*
(all timed out) to \~**119/120 passing per
shard**. The handful of residual specs were then triaged locally: two
were **real product bugs** (below — the
sort-cards button and Template Container deletion); the RTL/LTR
i18n-text spec was CI-only timing on the production
bundle, made robust by waiting for the async result instead of reading
it immediately. Two specs are **quarantined**
(`test.fixme`) for focused follow-up: a pre-existing "control" assertion
(a plain click outside the card closing it
— the actual
[#&#8203;5686](https://redirect.github.com/wekan/wekan/issues/5686)
guard it backs still passes), and the
[#&#8203;5798](https://redirect.github.com/wekan/wekan/issues/5798)
template-card end-to-end flow, which is unstable
*only* on the CI production bundle (it passes locally) — the
[#&#8203;5798](https://redirect.github.com/wekan/wekan/issues/5798)
product fix itself is committed and verified (see
below); the flaky part is the multi-step template-search-and-instantiate
UI under polling reactivity.
- **Sort-cards button stayed clickable after sorting.** In the board
header the `js-sort-cards` class (which carries
the handler that opens the sort popup) was *replaced* by `emphasis` once
a sort was active, so after sorting once the
button was dead — the popup could not be reopened to change or clear the
sort. It now keeps `js-sort-cards` and only
  *adds* `emphasis` when active.
- **Deleting a Template Container board threw and aborted.**
`boardRemover` cleared the user's template profile
pointers with `$unset`, but those four `profile.*` fields were
non-optional `String` in the schema, so SimpleSchema
rejected the update ("Templates board ID is required") and the whole
board removal failed. The fields are now
`optional`, so the container deletes and its pointers clear cleanly
([#&#8203;2339](https://redirect.github.com/wekan/wekan/issues/2339)/[#&#8203;5850](https://redirect.github.com/wekan/wekan/issues/5850)).
- **Regression tests** for several of the fixes below, **each
negative-tested** (verified to fail on the pre-fix
code): the attachment filename truncation
([#&#8203;6412](https://redirect.github.com/wekan/wekan/issues/6412))
has a Meteor-free Node unit test
(`tests/filenameSanitizer.test.cjs`, `npm run test:unit:node`) plus the
`meteor test` mocha test, and Playwright
specs (`tests/playwright/specs/36-fixed-bug-regressions.e2e.js`) cover
[#&#8203;3907](https://redirect.github.com/wekan/wekan/issues/3907),
[#&#8203;5886](https://redirect.github.com/wekan/wekan/issues/5886),
[#&#8203;5892](https://redirect.github.com/wekan/wekan/issues/5892),
[#&#8203;3897](https://redirect.github.com/wekan/wekan/issues/3897) and
[#&#8203;5798](https://redirect.github.com/wekan/wekan/issues/5798) (the
[#&#8203;5798](https://redirect.github.com/wekan/wekan/issues/5798) spec
passes locally but is quarantined on CI — see the E2E reliability note
above).

and fixes the following bugs:

- [Cannot delete some boards from
Archive](https://redirect.github.com/wekan/wekan/issues/4255),
[#&#8203;4255](https://redirect.github.com/wekan/wekan/issues/4255): the
Archive listed boards the user could not actually delete —
clicking *Delete* did nothing and the console showed `remove failed:
Access denied`. The `archivedBoards`
publication scoped its list to admin members (`isAdmin: true`) but
ignored the **active** flag, whereas the
`Boards.remove` permission (`hasAdmin()`) requires an **active** admin
(`isActive: true && isAdmin: true`). A user
who was an admin on a board but no longer active still saw it in the
Archive, then hit "Access denied" on delete.
The publication now matches the remove permission exactly (`isActive:
true && isAdmin: true`), so the Archive only
  lists boards the user can really delete.

- [Weird moving card bug — cross-board move could silently lose a
card](https://redirect.github.com/wekan/wekan/issues/5874),
[#&#8203;5874](https://redirect.github.com/wekan/wekan/issues/5874)
(data loss): rarely, moving a card from board A to board B left
it in a **corrupt half-moved state** — the card's `boardId` became B but
its `listId`/`swimlaneId` still belonged to
board A. The reporter saw exactly this: the card existed in board B's
JSON but with board A's list/swimlane, so it
was invisible in every normal view on both boards and clicking its link
reopened board A. **Root cause:** the
Move/Copy-card dialog resolves the destination board's swimlanes and
lists from the *client* Minimongo cache, which
can still be empty at the moment the user clicks "Done" — the
destination board's `publishComposite('board')` data
has not finished merging — so the dialog keeps the *source* board's
`swimlaneId`/`listId` while the `boardId` is
already the destination. (`setFirstSwimlaneId()`/`setFirstListId()`
swallow the lookup miss in a silent
`try/catch`, leaving the stale ids in place.) Several other callers —
drag reorder, multi-card move in the filter
sidebar, board-action rules, the REST API — can in principle produce the
same mismatch. **Fix:** a new server-side
`Cards.before.update` guard (`enforceCardBoardConsistency`, registered
first so the corrected modifier is what every
later hook and the persisted write see) runs whenever a card's `boardId`
changes and rewrites the pending update so
the swimlane/list always belong to the destination board, falling back
to that board's default swimlane and first
list when they don't. It runs on the server, where the destination
board's swimlanes/lists are always present
regardless of client cache state, and is **corrective only** — a
cross-board move whose targets already belong to the
destination board is left untouched, and a same-board reorder is
ignored. The decision logic was extracted into a
pure, dependency-injected module (`models/lib/cardBoardConsistency.js`)
with a Meteor-free Node unit test
(`tests/cardBoardConsistency.test.cjs`, `npm run test:unit:node`),
including a **negative test** asserting that the
raw unguarded modifier is exactly the
[#&#8203;5874](https://redirect.github.com/wekan/wekan/issues/5874)
corrupt state.

- [Responsive views still seem
broken](https://redirect.github.com/wekan/wekan/issues/6419),
[#&#8203;6419](https://redirect.github.com/wekan/wekan/issues/6419)
(partial): the most concrete, "stops-work" part is fixed — on
mobile an **open card could not be closed** because the card-details
overlay (z-index 100) sat *below* the app
header bar (`#header-main-bar`, z-index 1000), so the header covered the
close (X) button. The full-screen mobile
card now uses z-index 1100 — above the header, still below popups
(2000+) so card menus/date pickers open over it.
Mobile header action icons were also enlarged and **verified on a real
iPhone profile via Playwright screenshots**
(`tests/playwright/mobile-shot.js`): the top bar and the board action
bar buttons were only \~28–32px tall with a
13–15px font (below the comfortable \~44px touch-target / 16px readable
minimum). They are now \~44px tall with a 16px
font, applied **by viewport width** (`@media (max-width: 800px)`) so
they work on any phone without toggling
Desktop/Mobile mode — the board header renders as a clean row of large,
icon-only buttons.
**Two deeper root causes were then found and fixed (verified on an
iPhone profile via Playwright screenshots):**
(1) **No viewport meta tag.** WeKan's server-rendered `<head>`
(`server/lib/customHeadRender.js`) had no
`<meta name="viewport">`, so mobile browsers laid the page out at their
default \~980px virtual width and scaled it
down — making the whole UI tiny, reporting `window.innerWidth === 980`
on a 390px phone, and preventing every
`@media (max-width: 800px)` rule (and the width-based mobile detection)
from ever matching. Added
`width=device-width, initial-scale=1, viewport-fit=cover` (user zoom
left enabled for accessibility).
(2) **`profile.mobileMode` defaulted to `false`.** The user schema set
`mobileMode: false` on *every* user, so
`Utils.getMobileMode()` always returned the profile value and the
auto-detection below it was dead code — every user
was locked to desktop-mode even on a phone. The field is now `optional`
(no default), so it stays unset until the
user explicitly toggles; auto-detection was also rewritten to use
reliable `matchMedia` width/pointer queries instead
of fragile user-agent sniffing (cf. **Meteor
[#&#8203;12421](https://redirect.github.com/meteor/meteor/issues/12421)**,
where Mobile
Safari UA version parsing was wrong — this instance reports `isModern:
true`, so
[#&#8203;12421](https://redirect.github.com/wekan/wekan/issues/12421) is
not the cause here, but it
is the same class of UA-detection fragility this rewrite avoids), and a
`matchMedia` listener now re-applies
mobile-mode on resize/orientation when the user has no explicit
preference. Net: phones auto-detect mobile mode at
  the correct device width, with large tappable icons, no manual toggle.
Also fixed the **Admin Panel's secondary top bar** in small-width mode:
those tab buttons (Settings / People /
Reports / Attachments / Translation / Info) are rendered inside
`#header-quick-access`, whose mobile rules scale all
text/icons 2× — so the admin tabs rendered at 28px text / **56px
icons**, huge and overlapping the "Version" label.
A scoped override caps them at a normal touch size (15px text / 18px
icons).
And fixed **overlapping text in the Admin Panel settings body** on
phones: the layout forced a side-by-side
menu+content row "even on narrow windows", so the \~127px side menu and
the content were crammed together and the long
(e.g. Finnish) section labels overflowed the menu box rightward,
visually overlapping the content. On small screens
the layout now **stacks** — a full-width compact section menu on top,
full-width settings content below — verified via
  iPhone-profile screenshots.

- [Missing voting
buttons](https://redirect.github.com/wekan/wekan/issues/6420),
[#&#8203;6420](https://redirect.github.com/wekan/wekan/issues/6420): the
`showVotingButtons` (and `showPlanningPokerButtons`)
helpers in `cardDetails.js` referenced an **undefined `currentUser`**
variable, so every card render threw
`ReferenceError: currentUser is not defined` and the vote /
planning-poker buttons silently disappeared. The helpers
now resolve `currentUser` via `ReactiveCache.getCurrentUser()` and
null-guard the board-member check. Regression test
  in `tests/playwright/specs/36-fixed-bug-regressions.e2e.js`.

- [ENAMETOOLONG: very long attachment filenames could not be migrated to
filesystem
storage](https://redirect.github.com/wekan/wekan/issues/6412),
[#&#8203;6412](https://redirect.github.com/wekan/wekan/issues/6412):
attachment filenames were sanitized for path traversal but
never length-limited, so a very long name (worse with multibyte UTF-8
like German umlauts) produced an on-disk
`<id>-<version>-<name>` component exceeding the filesystem's 255-byte
limit and failed with `ENAMETOOLONG`.
`sanitizeFilename` now truncates to 200 UTF-8 bytes (measured in bytes,
never splitting a codepoint) while
  preserving the file extension. Done:
[commit
5e26cf004](https://redirect.github.com/wekan/wekan/commit/5e26cf004).

- [Card "added label" history was deleted whenever the card was
moved](https://redirect.github.com/wekan/wekan/issues/3907),
[#&#8203;3907](https://redirect.github.com/wekan/wekan/issues/3907):
`updateActivities` removed all `addedLabel` activities whenever
`boardId` appeared in a card update, but `Card.move()` always re-sets
`boardId` (even moving within the same board),
so every move wiped the card's label history (data loss in the
`activities` collection). The removal/remap now only
runs on an actual board change (comparing the pre-update `boardId` with
the new value). Done:
[commit
6382ad6a8](https://redirect.github.com/wekan/wekan/commit/6382ad6a8).

- [Public boards did not fully load longer lists when viewed as a
guest](https://redirect.github.com/wekan/wekan/issues/3897),
[#&#8203;3897](https://redirect.github.com/wekan/wekan/issues/3897): a
guest (no logged-in user) hit
`getCurrentUser().isBoardAdmin()` in template helpers, throwing `Cannot
read property 'isBoardAdmin' of null` and
aborting the Tracker render so lists stopped loading partway. The
helpers now use optional chaining
(`getCurrentUser()?.isBoardAdmin()` / `?.isWorker()`), which is falsy
for guests instead of throwing. Done:
[commit
fc0fe0b61](https://redirect.github.com/wekan/wekan/commit/fc0fe0b61).

- [Changed order of lists is not
persisted](https://redirect.github.com/wekan/wekan/issues/5997),
[#&#8203;5997](https://redirect.github.com/wekan/wekan/issues/5997): the
server side was verified working end-to-end (a DDP call to
`updateListSort` reorders the `lists` collection and the `sort:1` query
returns the new order), so the regression was
client-side. `saveSorting` read the neighbouring lists with
`.prev('.js-list')` / `.next('.js-list')`, which jQuery
only matches when the sibling is *immediately* adjacent; the lists
container also renders the add-list composer and a
`+cardDetails` element (when a card is open) between lists, so an
interspersed non-list sibling made `calculateIndex`
mis-detect the first/last position and compute a wrong sort. Now uses
`prevAll/nextAll('.js-list').first()`. Done:
[commit
1165c9b6d](https://redirect.github.com/wekan/wekan/commit/1165c9b6d).

- [Cards made from a template link to the template
itself](https://redirect.github.com/wekan/wekan/issues/5798),
[#&#8203;5798](https://redirect.github.com/wekan/wekan/issues/5798): a
card instantiated from a template was copied with the
*templates* board id (the template-search source), so it had `boardId` =
templates board. It still showed in the
target list (the list renders cards by `listId` and the templates board
is subscribed), but clicking it navigated to
the templates board instead of opening the card. It is now copied into
the current board. Done:
[commit
097806984](https://redirect.github.com/wekan/wekan/commit/097806984).

- **Creating a card from a template threw "There is no current view" and
created no card.** Found while adding the
[#&#8203;5798](https://redirect.github.com/wekan/wekan/issues/5798)
regression test: the searchElement popup's minicard-click handler called
`tpl.getSortIndex()` (which reads
`Template.currentData()`) *after* `await tpl.board.getNextCardNumber()`,
and Blaze's synchronous current-view context
is lost across an `await`. The sort index is now computed before the
await. Done:
[commit
612ed3e51](https://redirect.github.com/wekan/wekan/commit/612ed3e51).

- [Lists do not collapse correctly with the Modern
theme](https://redirect.github.com/wekan/wekan/issues/5892),
[#&#8203;5892](https://redirect.github.com/wekan/wekan/issues/5892): the
list-width rework
([#&#8203;6409](https://redirect.github.com/wekan/wekan/issues/6409))
added a persistent
`.list[style*="--list-width"] { width: … !important }` rule that
overrode the 30px collapsed width, so a list with a
custom width stayed full width when collapsed. Collapsed lists are now
excluded from that rule and the 30px width is
`!important`. Done: [commit
5e9b2bccd](https://redirect.github.com/wekan/wekan/commit/5e9b2bccd).

- [Sort by due date is not remembered as the default
view](https://redirect.github.com/wekan/wekan/issues/5886),
[#&#8203;5886](https://redirect.github.com/wekan/wekan/issues/5886): the
card sort was kept only in an in-memory Meteor `Session`
variable, which resets on page reload, so the chosen sort reverted to
the default. The sort is now persisted to
  `localStorage` and restored on load (sorting and the sort icon). Done:
[commit
6aad946bc](https://redirect.github.com/wekan/wekan/commit/6aad946bc).

- [Change card's parent shows no cards the first time you select a
board](https://redirect.github.com/wekan/wekan/issues/3745),
[#&#8203;3745](https://redirect.github.com/wekan/wekan/issues/3745):
`Template.cardMorePopup`'s `cards()` helper queried
`ReactiveCache.getCards({ boardId })` from client minimongo the instant
a board was picked, before that board's card
subscription had loaded, so the parent-card list was empty the first
time (and only worked on reopen, once the data
had arrived). It now subscribes with an `onReady` callback and a
`parentBoardReady` reactive flag, and the list only
renders once the subscription is ready — the same subscription-readiness
pattern as the
[#&#8203;5798](https://redirect.github.com/wekan/wekan/issues/5798) fix.
Done:
[commit
f999b9e74](https://redirect.github.com/wekan/wekan/commit/f999b9e74).

and these issues are verified resolved in current code (could not
reproduce / no error observed here; re-test on the
reporter's data requested):

- [#&#8203;3826](https://redirect.github.com/wekan/wekan/issues/3826)
(cannot reorder cards in a list whose cards have parents): built a
**drag-sort reproduction harness**
(`tests/playwright/helpers/dragSort.js`) that drives jQuery-UI sortable
with a
realistic stepped mouse gesture (Playwright's `dragTo()` does not
trigger it), plus a regression spec
(`tests/playwright/specs/37-card-drag-sort.e2e.js`). Dragging a sub-task
card (one with a `parentId`) to a new
position in its list **persists** the new order both with a few cards
and at 15 cards — it does not revert.
- [#&#8203;1289](https://redirect.github.com/wekan/wekan/issues/1289)
(card with a deleted member user): verified via the Playwright
harness — a card whose `members`/`assignees` reference a non-existent
user renders its board minicard and opens the
card detail with **zero console errors**, so `userAvatar` null-guards
missing users correctly.
- [#&#8203;1389](https://redirect.github.com/wekan/wekan/issues/1389)
(edge-to-edge URL makes the description uneditable): the card
detail has an explicit edit (pencil) control rather than relying on
clicking the rendered text, so a full-width link
  no longer blocks editing.
- [#&#8203;5808](https://redirect.github.com/wekan/wekan/issues/5808)
(bidirectional cross-board card link makes both cards hang on
open): a Playwright repro that mutually links two cards across two
boards opens the card detail in \~1s with no errors
and no redirect loop — the link only navigates on an explicit click, not
on open, so there is no auto-bounce.
- [#&#8203;5757](https://redirect.github.com/wekan/wekan/issues/5757)
(card activities jump to a recent date after changing the due
date): activity `createdAt` is set once in the
`Activities.before.insert` hook, nothing bulk-updates it, and the UI
renders `activity.createdAt` directly — so changing a due date inserts
one new `a-dueAt` activity and cannot re-date
  existing ones.

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://redirect.github.com/renovatebot/renovate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMzAuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEzMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbImFwcC93ZWthbiIsImF1dG9tZXJnZSIsInJlbm92YXRlL2NvbnRhaW5lciIsInR5cGUvbWlub3IiXX0=-->
2026-06-23 16:40:54 +02:00

title
title
TrueCharts

Community Helm Chart Catalog

docs Discord GitHub last commit


TrueCharts is a catalog of highly optimised Helm Charts. Made for the community, by the community!

All our charts are supposed to work together and be easy to setup using any helm-compatible deployment tool, above all, give the average user more than enough options to tune things to their liking.


Getting started using TrueCharts

docs


Support

Please check our FAQ, manual and Issue tracker There is a significant chance your issue has been reported before!

Still something not working as expected? Contact us! and we'll figure it out together!

Development

pre-commit renovate GitHub last commit


Our development process is fully distributed and agile, so every chart-maintainer is free to set their own roadmap and development speed and does not have to comply to a centralised roadmap. This ensures freedom and flexibility for everyone involved and makes sure you, the end user, always has the latest and greatest of every Chart installed.

Getting into creating Charts

For more information check the website: https://truecharts.org

Contact and Support

Discord


To contact the TrueCharts project:




Contributors

All Contributors

Thanks goes to these wonderful people (emoji key):


Kjeld Schouten-Lebbing
Kjeld Schouten-Lebbing

💻 🚇 📖 👀 💵
Justin Clift
Justin Clift

📖
whiskerz007
whiskerz007

💻
Stavros Kois
Stavros Kois

💻 📖 🐛 👀 💵
allen-4
allen-4

💻
Troy Prelog
Troy Prelog

💻 📖 💵
Dan Sheridan
Dan Sheridan

💻
Sebastien Dupont
Sebastien Dupont

📖 💵
Vegetto
Vegetto

👀
Ellie Nieuwdorp
Ellie Nieuwdorp

💻
Nate Walck
Nate Walck

💻
Lloyd
Lloyd

💻 💵
Dave Withnall
Dave Withnall

📖
ksimm1
ksimm1

📖 🐛 💵 🧑‍🏫
Aaron Johnson
Aaron Johnson

📖
Ralph
Ralph

💻
Joachim Baten
Joachim Baten

💻 🐛
Michael Yang
Michael Yang

💻
Ciaran Farley
Ciaran Farley

📖
Heavybullets8
Heavybullets8

📖 💻 🐛 📹 🧑‍🏫 💵
662
662

💻
alex171
alex171

📖
Techno Tim
Techno Tim

📖
Mingyao Liu
Mingyao Liu

💻 🐛
NightShaman
NightShaman

💻 📖 🐛 💵 🧑‍🏫
Andrew Smith
Andrew Smith

📖 ⚠️
Bob Klosinski
Bob Klosinski

💻
Sukarn
Sukarn

💻 📖
sebs
sebs

💻
Dyllan Tinoco
Dyllan Tinoco

💻
StevenMcElligott
StevenMcElligott

💻 💵 📖 🐛 🧑‍🏫
brothergomez
brothergomez

💻 🐛
sagit
sagit

💻 🐛 📹 📖 🧑‍🏫
Nevan Chow
Nevan Chow

💻
Daniel Carlsson
Daniel Carlsson

🐛
Devon Louie
Devon Louie

🐛
Alex-Orsholits
Alex-Orsholits

🐛
Tails32
Tails32

🐛
Menaxerius
Menaxerius

🐛
hidefog
hidefog

🐛
Darren Gibbard
Darren Gibbard

🐛
Barti
Barti

🐛
Sunii
Sunii

🐛
trbmchs
trbmchs

🐛
Light
Light

🐛
Boostflow
Boostflow

🐛
Trigardon
Trigardon

🐛
dbb12345
dbb12345

🐛 💻
karypid
karypid

🐛
Philipp
Philipp

🐛
John
John

🐛 📖
John Parton
John Parton

🐛
Marc
Marc

🐛
fdzaebel
fdzaebel

🐛
kloeckwerx
kloeckwerx

🐛
Bradley Bare
Bradley Bare

🐛
Alexander Thamm
Alexander Thamm

🐛
rexit1982
rexit1982

🐛
iaxx
iaxx

🐛
Xstar97
Xstar97

💻 🐛 🧑‍🏫
ornias
ornias

📹
Josh Asplund
Josh Asplund

💵
midnight33233
midnight33233

💵
kbftech
kbftech

💵
hogenf
hogenf

💵
Hawks
Hawks

💵
Jim Russell
Jim Russell

💵
TheGovnah
TheGovnah

💵
famewolf
famewolf

💵 🐛
Konrad Bujak
Konrad Bujak

📖
190n
190n

💻 📖
Alexej Kubarev
Alexej Kubarev

📖
r-vanooyen
r-vanooyen

📖
shadofall
shadofall

📖 🧑‍🏫
agreppin
agreppin

💻
Stavros Ntentos
Stavros Ntentos

💻 🤔
Vlad-Florin Ilie
Vlad-Florin Ilie

💻
huma2000
huma2000

🐛
hugalafutro
hugalafutro

🐛 💵
yehia Amer
yehia Amer

📖
Tyler Stransky
Tyler Stransky

🐛
juggie
juggie

🐛
Ben Tilford
Ben Tilford

🐛 💻
I-nebukad-I
I-nebukad-I

🐛 💻
Ethan Leisinger
Ethan Leisinger

💻 📖
Cullen Murphy
Cullen Murphy

💻 🐛
Jason Thatcher
Jason Thatcher

💻 🐛 📖
Stefan Schramek
Stefan Schramek

🐛
nokaka
nokaka

🐛
Gal Szkolnik
Gal Szkolnik

🐛
Evgeny Stepanovych
Evgeny Stepanovych

🐛
Waqar Ahmed
Waqar Ahmed

🐛
DrSKiZZ
DrSKiZZ

💵
Jan Puciłowski
Jan Puciłowski

💻 ⚠️
Shaun Coyne
Shaun Coyne

💵
Christoph
Christoph

💵
Brandon Rutledge
Brandon Rutledge

🐛
Michael Bestas
Michael Bestas

🐛
Jurģis Rudaks
Jurģis Rudaks

🐛
brunofatia
brunofatia

💵
TopicsLP
TopicsLP

📖
Michael Schnerring
Michael Schnerring

🐛 💻
Tamas Nagy
Tamas Nagy

🐛
OpenSpeedTest™️
OpenSpeedTest™️

💻
Richard James Acton
Richard James Acton

📖
lps-rocks
lps-rocks

🐛
Faust
Faust

🐛
uranderu
uranderu

🐛
Tom Cassady
Tom Cassady

🐛
Huftierchen
Huftierchen

🐛
ZasX
ZasX

📖 🧑‍🏫 💻
Kevin T.
Kevin T.

🐛
Steven Scott
Steven Scott

📖
Watteel Pascal
Watteel Pascal

💻
JamesOsborn-SE
JamesOsborn-SE

💻 📖
NeoToxic
NeoToxic

🧑‍🏫 🐛
jab416171
jab416171

📖
Anna
Anna

📖
ChaosBlades
ChaosBlades

🐛
Patric Stout
Patric Stout

💻
Ben Kochie
Ben Kochie

💻
Jeff Bachtel
Jeff Bachtel

📖
Ben Woods
Ben Woods

💻
Karl Shea
Karl Shea

🐛
Balakumaran MN
Balakumaran MN

📖
Jesperbelt
Jesperbelt

📖
cccs31
cccs31

🐛
Sam Smucny
Sam Smucny

💻
Keith Cirkel
Keith Cirkel

💻
mgale456
mgale456

💻
Alec Fenichel
Alec Fenichel

💻
John Dorman
John Dorman

💻
Dan
Dan

💻
u4ium
u4ium

📖
ErroneousBosch
ErroneousBosch

🐛
MaverickD650
MaverickD650

💻 🐛
Grogdor
Grogdor

📖
Ryan Gooler
Ryan Gooler

📖
Rob Herley
Rob Herley

📖
Christian Heimlich
Christian Heimlich

📖
l-moon-git
l-moon-git

💻
hughes5
hughes5

📖
sdimovv
sdimovv

💻
AllieQpzm
AllieQpzm

💻
Dominik
Dominik

🐛
renovate[bot]
renovate[bot]

🔧
allcontributors[bot]
allcontributors[bot]

🔧
dependabot[bot]
dependabot[bot]

🔧
TrueCharts Bot
TrueCharts Bot

🔧 🚇 💻
Mend Renovate
Mend Renovate

🔧
Simone
Simone

💻
Jean-François Roy
Jean-François Roy

💻
Whiskey24
Whiskey24

💻
inmanturbo
inmanturbo

📖
Alex
Alex

💻
Brian Semrad
Brian Semrad

💻
Christopher
Christopher

💻 📖
Csaba Engedi
Csaba Engedi

💻
Cyb3rzombie
Cyb3rzombie

💻
Eric Cavalcanti
Eric Cavalcanti

💻
Gavin Chappell
Gavin Chappell

💻 🐛
raynay-r
raynay-r

💻
Jip-Hop
Jip-Hop

📖
Jonas Wrede
Jonas Wrede

💻
SilentNyte
SilentNyte

📖
Stan
Stan

💻
Tiago Gaspar
Tiago Gaspar

💻
gismo2004
gismo2004

💻
jsegaert
jsegaert

📖
Miguel Angel Nubla
Miguel Angel Nubla

💻
xal3xhx
xal3xhx

💻
jeremybox
jeremybox

📖
Cameron Sabuda
Cameron Sabuda

📖
Jeroen Schepens
Jeroen Schepens

🐛
James Wright
James Wright

📖
Malpractis
Malpractis

🐛
CommanderStarhump
CommanderStarhump

🐛
Vianchiel
Vianchiel

🐛
Maximilian Ehlers
Maximilian Ehlers

🐛
nautilus7
nautilus7

🐛 💻
kqmaverick
kqmaverick

🐛
ccalby
ccalby

🐛
kofeyh
kofeyh

🐛
imjustleaving
imjustleaving

🐛
Cristian Torres
Cristian Torres

🐛
schopenhauer
schopenhauer

🐛
Zackptg5
Zackptg5

🐛
Brad Ackerman
Brad Ackerman

🐛
mcspiff313
mcspiff313

🐛
Fletcher Nichol
Fletcher Nichol

💻 🐛
Marco Faggian
Marco Faggian

💻
John P
John P

📖
kryojenik
kryojenik

💻
Malcolm
Malcolm

📖
depasseg
depasseg

📖
j1mbl3s
j1mbl3s

📖
VictorienXP
VictorienXP

💻
yelhouti
yelhouti

💻
Jaroslav Lichtblau
Jaroslav Lichtblau

📖
MaximilianS
MaximilianS

📖
Dion Larson
Dion Larson

💻 📖
Physics-Dude
Physics-Dude

📖
waflint
waflint

💻
Henry Wilkinson
Henry Wilkinson

💻 📖
cedstrom
cedstrom

💻
v3DJG6GL
v3DJG6GL

🐛 💻
polarstack
polarstack

💻
Keyvan
Keyvan

💻
MickaelFontes
MickaelFontes

💻
David CM
David CM

💻
Aamir Azad
Aamir Azad

📖
Jordan Woyak
Jordan Woyak

💻
Simon Hofman
Simon Hofman

💻
notyouraveragegamer
notyouraveragegamer

📖
Varac
Varac

💻
tuxsudo
tuxsudo

💻
TylerRudie
TylerRudie

📖
qnb59bny5x
qnb59bny5x

💻
Filip Bednárik
Filip Bednárik

🐛
Serhii Shcherbinin
Serhii Shcherbinin

💻
Quentin Raynaud
Quentin Raynaud

🐛
Felix Schäfer
Felix Schäfer

📖
Julien Nicolas de Verteuil
Julien Nicolas de Verteuil

💻
Gabriel Donadel Dall'Agnol
Gabriel Donadel Dall'Agnol

📖
Jon S. Stumpf
Jon S. Stumpf

📖
Tanguille
Tanguille

📖
Dennis
Dennis

🐛 📖
TheIceCreamTroll
TheIceCreamTroll

💻
Atanas Pamukchiev
Atanas Pamukchiev

💻
Boemeltrein
Boemeltrein

📖
Yiannis Marangos
Yiannis Marangos

💻
Michael Ruoss
Michael Ruoss

💻
Aron Kahrs
Aron Kahrs

💻
nemesis1982
nemesis1982

📖
Ed P
Ed P

💻
Frédéric Nadeau
Frédéric Nadeau

📖
frapbod
frapbod

💻
Max Bachhuber
Max Bachhuber

💻
zierbeek
zierbeek

💻
Ac1dburn
Ac1dburn

💻
Antoine Saget
Antoine Saget

📖
Ben Bodenmiller
Ben Bodenmiller

🐛
felixfon
felixfon

📖
adtwomey
adtwomey

📖
alfi0812
alfi0812

💻 📖 🐛 👀
Agassi
Agassi

💻
Artur
Artur

💻
Morgan Hunter
Morgan Hunter

💻
Aleksandr Oleinikov
Aleksandr Oleinikov

💻
Jamie
Jamie

💻
David Gries
David Gries

🐛 💻
Phreeman33
Phreeman33

💻 🐛
Jens Wolvers
Jens Wolvers

💻
Bart Willems
Bart Willems

💻
Caidy
Caidy

💻
Mr Khachaturov
Mr Khachaturov

💻
LordCrash101
LordCrash101

📖
elendil95
elendil95

💻
TheDodger
TheDodger

💻
Saad Awan
Saad Awan

💻
Felix von Arx
Felix von Arx

💻
yodatak
yodatak

💻
Marcel Henrich
Marcel Henrich

💻
Florent Viel
Florent Viel

💻
SniperAsh6
SniperAsh6

💻
Alexandre Acebedo
Alexandre Acebedo

💻
Douglas Chimento
Douglas Chimento

💻
Addison McDermid
Addison McDermid

💻
Jaël Gareau
Jaël Gareau

💻
Steve Sampson
Steve Sampson

📖
Albert Romkes
Albert Romkes

💻
Maja Bojarska
Maja Bojarska

💻
astro-stan
astro-stan

💻
Oliver Simons
Oliver Simons

💻
Brioche
Brioche

💻

This project follows the all-contributors specification. Contributions of any kind welcome!

Licence

License


Truecharts, is primarily based on the AGPL-v3 license, this ensures almost everyone can use and modify our charts. Licences can vary on a per-Chart basis. This can easily be seen by the presence of a "LICENSE" file in that folder.

An exception to this, has been made for every document inside folders labeled as docs or doc and their subfolders: those folders are not licensed under AGPL-v3 and are considered "all rights reserved". Said content can be modified and changes submitted per PR, in accordance to the github End User License Agreement.

SPDX-License-Identifier: AGPL-3.0


built-with-resentment contains-technical-debt

S
Description
Fork of trueforge-org/truecharts with some customizations
Readme 890 MiB
luanti-v1.0.0 Latest
2026-07-08 18:51:26 +00:00
Languages
Go Template 97.9%
Shell 2.1%