Commit Graph

23735 Commits

Author SHA1 Message Date
Ken Sternberg
06cc680bfb Got the first draft of the color bridge in. Problems remaining: 1. 17 colors remain unmapped and undefined; 2. not emitting Patternfly dark mode yet; 3. Linter can't compare Patternfly and Authentik colors because we use oklch for everything. 2026-08-26 17:14:39 -07:00
Ken Sternberg
22667c0854 Got the first draft of the color bridge in. Problems remaining: 1. 17 colors remain unmapped and undefined; 2. not emitting Patternfly dark mode yet; 3. Linter can't compare Patternfly and Authentik colors because we use oklch for everything. 2026-08-26 17:12:17 -07:00
Ken Sternberg
d04dcfa5c0 All variables aside from colors now defined or redacted. 2026-08-26 11:00:04 -07:00
Ken Sternberg
e4c274e9a2 Everything but the color. 2026-08-26 10:53:06 -07:00
Ken Sternberg
f9447400bc A lot of the bridges are so 1:1 that the machinery just disappears. This saves me about 102 lines of code. Nifty! 2026-08-25 15:13:41 -07:00
Ken Sternberg
8b7497c2d0 This commit:
- Separates the Authentik and Patternfly themes into their own namespaces, creating a bridge from Authentik’s definitions to Patternfly’s usages
- Renames “shadow” to “box-shadow”, to maintain compatibility with Patternfly
- Adds “Shadows” to the Authentik theme, and bridges it with Patternfly
- Updates the theme selector to distinguish clearly between “current” and “other” (rather than “light or dark”.
- Updates the ESLint configuration to allow `console` calls in build and lint scripts, and to use Javascript rules instead of Typescript rules when linting `.mjs` files like build and lint scripts.
- Moves the Patternfly reference files into a pure JavaScript module, so we don’t have to do brittle parsing.
- Corrects a specification in BorderRadii
- Adds a missing specification to BorderWidth
- Adds Motion to the Authentik theme, and bridges it with Patternfly
- Adds Z-Index to the Authentik theme, and bridges it with Patternfly
- Adds Typography to the Authentik theme, and bridges it with Patternfly
- Adds Breakpoints to the Authentik theme, and bridges it with Patternfly
2026-08-25 10:47:37 -07:00
Ken Sternberg
23bfbc0c64 Starting the bridge. 2026-08-21 10:20:17 -07:00
Ken Sternberg
3fb48045c5 Merge branch 'slice/theme-package' into web/testing/snapshots
* slice/theme-package:
  Fix grouping.
  Fix spelling.
  Heal lockfile.
  web/theme: add a demo page for the theme tokens
  packages/theme: add @goauthentik/theme design-system package
  packages/fonts: add @goauthentik/fonts package
2026-08-14 15:29:26 -07:00
Ken Sternberg
e70ce645da Of course prettier had opinions. 2026-08-13 16:59:37 -07:00
Ken Sternberg
1d1c4d1670 web/testing/snapshots: enable visual comparisons
As an experiment, I have added three visual comparisons:

- dashboard
- event notification rules table
- new prompt form

… which provides a wide variety of controls that I can see and compare. As we move toward a more robust testing scheme *and* toward a more dispersed repository of artifacts (theme, elements, etc), I wanted a way to ensure that our upgrades to Patternfly and components didn’t break anything. I spent the day learning much more about Playwright and the snapshot tests.

I don’t think @BeryJu’s concern for snapshot size isn’t wholly warranted. I’ve manually restricted the viewport to 1280x800, so each snapshot pair (“light” and “dark”) is about 220Kb. The current project repo is 795Mb in size; it would take 40 tests to increase the size of the repository by 1%. If we have half that many snapshot pairs by next year, I’ll be delighted.

One challenge these tests present is that they should be run on a completely fresh database with no modifications; the dashboard and notifications page should reflect only the default status of an authentik instance when it comes up. The purpose of the snapshots isn’t to record the utility of the front-end; it’s to record and preserve the appearance of select elements in the page.
2026-08-13 16:54:46 -07:00
Ken Sternberg
50b6035583 Merge branch 'main' into dev
* main:
  web: Auto focus password field after login error. (#25026)
2026-08-12 14:29:46 -07:00
Teffen Ellis
a77075f3fc web: Auto focus password field after login error. (#25026) 2026-08-12 16:50:54 +01:00
Ken Sternberg
5e0879e08f Merge branch 'main' into dev
* main: (103 commits)
  sources/saml: add audience override field for SAML sources (#25029)
  endpoints: handle error in facts (#25028)
  web: Fix content_left/right layouts. (#25025)
  enterprise/stages/source: configurable failure action (#24963)
  translate: Updates for project authentik and language th_TH (#25015)
  core: bump github.com/grafana/pyroscope-go from 1.4.1 to 1.4.2 (#25016)
  core: bump axllent/mailpit from v1.30.6 to v1.30.7 in /tests/e2e (#25017)
  core: bump packaging from 26.2 to 26.3 (#25018)
  core: bump django-tenants from 3.12.0 to 3.13.0 (#25019)
  core: bump thiserror from 2.0.19 to 2.0.20 (#25020)
  core: bump pem from 3.0.6 to 4.0.0 (#25021)
  ci: bump taiki-e/install-action from 2.85.10 to 2.85.11 in /.github/actions/setup (#25022)
  core, web: update translations (#25011)
  website/docs: document the hexworld event map (#24258)
  website/integrations: cisco-fmc: Added step for launch URL (#25009)
  tasks: aggregate status from logs instead of legacy field (#24792)
  website/docs: preserve host and port in proxy provider nginx redirects (#24991)
  enterprise/endpoints/connectors/fleet: decrease page size (#24995)
  web/elements: fix prioritization in form serialization for dotted input-fields (#24987)
  web: Add path-router primitives. (#23990)
  ...
2026-08-12 08:42:23 -07:00
Emil Burzo
3ff7cd65e2 sources/saml: add audience override field for SAML sources (#25029) 2026-08-12 15:41:02 +00:00
Jens L.
e88592b6fa endpoints: handle error in facts (#25028)
* endpoints: handle error in facts

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix ui

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2026-08-12 16:29:25 +01:00
Teffen Ellis
22d5336146 Fix grouping. 2026-08-12 16:17:28 +01:00
Teffen Ellis
975d2896fa Fix spelling. 2026-08-12 16:15:44 +01:00
Teffen Ellis
e2a7060f3c Heal lockfile. 2026-08-12 16:13:56 +01:00
Teffen Ellis
9166175652 web/theme: add a demo page for the theme tokens
Add a self-contained demo page, built by build-demo.mjs, that renders
every theme token — colors, typography, spacing, shape, shadow, motion —
so the design system can be eyeballed in isolation while it evolves.

Co-Authored-By: Ken Sternberg <ken@goauthentik.io>
2026-08-12 16:13:55 +01:00
Teffen Ellis
8baeaf6648 packages/theme: add @goauthentik/theme design-system package
Add @goauthentik/theme, which defines authentik's design tokens (color,
typography, fonts, spacing, shape, shadow, motion, z-index) in TypeScript
and builds them into CSS via styleframe.

Token names carry a distinct separator per category so the token type is
recoverable from the name alone. That is worth the verbosity: it keeps
the DX legible and leaves room for automatic theme management and future
tooling built on top of the token set.

Co-Authored-By: Ken Sternberg <ken@goauthentik.io>
2026-08-12 16:13:55 +01:00
Teffen Ellis
200c634f46 packages/fonts: add @goauthentik/fonts package
Extract the bundled web fonts out of web/ into a dedicated
@goauthentik/fonts workspace package: the RedHat variable faces, the
PatternFly pficon icon face, and the FontAwesome Free solid face, each
with its upstream license recorded under licenses/.

web/ now pulls the faces and icons from the package's
@goauthentik/fonts/faces.css and @goauthentik/fonts/icons.css entry
points instead of the old #fonts/* import and the inlined pficon.scss
vendor sheet.

Anchor esbuild's [dir] at the monorepo root via outbase so assets pulled
from the out-of-web package no longer resolve to a "_.._" segment, which
Go's //go:embed silently drops from the embedded outpost build.

Co-Authored-By: Ken Sternberg <ken@goauthentik.io>
2026-08-12 16:13:55 +01:00
Teffen Ellis
fd1cddb784 web: Fix content_left/right layouts. (#25025) 2026-08-12 16:12:18 +01:00
Jens L.
e5336c757f enterprise/stages/source: configurable failure action (#24963)
* enterprise/stages/source: configurable failure action

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* rework to exception

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* Revert "rework to exception"

This reverts commit 6b18fb6f10.

* Reapply "rework to exception"

This reverts commit 6f6ae67f99.

* actually nah fix it

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* Revert "actually nah fix it"

This reverts commit a8e1d0e83d.

* Revert "Reapply "rework to exception""

This reverts commit 70d001a255.

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2026-08-12 12:56:30 +01:00
transifex-integration[bot]
395d8b1207 translate: Updates for project authentik and language th_TH (#25015)
translate: Translate django.po in th_TH

100% translated source file: 'django.po'
on 'th_TH'.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-08-12 11:39:27 +01:00
dependabot[bot]
f7237d1810 core: bump github.com/grafana/pyroscope-go from 1.4.1 to 1.4.2 (#25016)
Bumps [github.com/grafana/pyroscope-go](https://github.com/grafana/pyroscope-go) from 1.4.1 to 1.4.2.
- [Release notes](https://github.com/grafana/pyroscope-go/releases)
- [Commits](https://github.com/grafana/pyroscope-go/compare/v1.4.1...v1.4.2)

---
updated-dependencies:
- dependency-name: github.com/grafana/pyroscope-go
  dependency-version: 1.4.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-12 11:39:22 +01:00
dependabot[bot]
2cf902158b core: bump axllent/mailpit from v1.30.6 to v1.30.7 in /tests/e2e (#25017)
Bumps axllent/mailpit from v1.30.6 to v1.30.7.

---
updated-dependencies:
- dependency-name: axllent/mailpit
  dependency-version: v1.30.7
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-12 11:39:18 +01:00
dependabot[bot]
9db15e79da core: bump packaging from 26.2 to 26.3 (#25018)
Bumps [packaging](https://github.com/pypa/packaging) from 26.2 to 26.3.
- [Release notes](https://github.com/pypa/packaging/releases)
- [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pypa/packaging/compare/26.2...26.3)

---
updated-dependencies:
- dependency-name: packaging
  dependency-version: '26.3'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-12 11:39:14 +01:00
dependabot[bot]
32e9c2d16e core: bump django-tenants from 3.12.0 to 3.13.0 (#25019)
Bumps [django-tenants](https://github.com/django-tenants/django-tenants) from 3.12.0 to 3.13.0.
- [Release notes](https://github.com/django-tenants/django-tenants/releases)
- [Changelog](https://github.com/django-tenants/django-tenants/blob/master/CHANGES.rst)
- [Commits](https://github.com/django-tenants/django-tenants/compare/v3.12.0...v3.13.0)

---
updated-dependencies:
- dependency-name: django-tenants
  dependency-version: 3.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-12 11:39:09 +01:00
dependabot[bot]
746cd66442 core: bump thiserror from 2.0.19 to 2.0.20 (#25020)
Bumps [thiserror](https://github.com/dtolnay/thiserror) from 2.0.19 to 2.0.20.
- [Release notes](https://github.com/dtolnay/thiserror/releases)
- [Commits](https://github.com/dtolnay/thiserror/compare/2.0.19...2.0.20)

---
updated-dependencies:
- dependency-name: thiserror
  dependency-version: 2.0.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-12 11:39:05 +01:00
dependabot[bot]
90adc4aedd core: bump pem from 3.0.6 to 4.0.0 (#25021)
Bumps [pem](https://github.com/jcreekmore/pem-rs) from 3.0.6 to 4.0.0.
- [Changelog](https://github.com/jcreekmore/pem-rs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jcreekmore/pem-rs/compare/v3.0.6...v4.0.0)

---
updated-dependencies:
- dependency-name: pem
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-12 11:39:00 +01:00
dependabot[bot]
6be0cbd6e5 ci: bump taiki-e/install-action from 2.85.10 to 2.85.11 in /.github/actions/setup (#25022)
ci: bump taiki-e/install-action in /.github/actions/setup

Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.85.10 to 2.85.11.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](6c6fd71fe4...7f4eb89902)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.85.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-12 11:38:56 +01:00
authentik-automation[bot]
f46bbb30cd core, web: update translations (#25011)
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: authentik-automation[bot] <135050075+authentik-automation[bot]@users.noreply.github.com>
2026-08-12 06:09:18 +01:00
Teffen Ellis
8224f02b6f website/docs: document the hexworld event map (#24258)
* website/docs: document the hexworld event map

* website/docs: drop the OSM tile server from the air-gapped outbound list

The events map no longer reaches tile.openstreetmap.org — the bundled
basemap makes no outbound connections. Note the one way it can reach out
again: a custom basemap configured on a brand.

---------

Co-authored-by: Teffen Ellis <teffen@Teffens-MacBook-Pro.local>
2026-08-12 05:45:50 +01:00
Jeff
243ab69987 website/integrations: cisco-fmc: Added step for launch URL (#25009)
Added step for launch URL

Signed-off-by: Jeff <riversdev0@users.noreply.github.com>
Co-authored-by: Dominic Roy <dominic@goauthentik.io>
2026-08-12 00:01:20 +00:00
Marcelo Elizeche Landó
3cb4b9953e tasks: aggregate status from logs instead of legacy field (#24792)
* aggregate task status from logs instead of legacy field

* remove comment

* remove backfill of tasks
2026-08-11 20:03:36 +00:00
rowan kavanagh
fa9cce2cd6 website/docs: preserve host and port in proxy provider nginx redirects (#24991)
* website: use $host instead of $http_host for proxy provider redirects.

The Proxy Provider nginx recipes set the upstream Host header from
$host but built X-Original-URL and the sign-in redirect (rd=) from
$http_host, the raw client-supplied Host header. authentik's outpost
parses that value directly (getNginxForwardUrl), so an unvalidated
Host header flows into its own redirect construction. Use $host
consistently, matching what the same files already do for Host.

X-Forwarded-Host in the ingress-nginx snippet is left as $http_host;
that's a different, informational header, not authentik's own
redirect construction.

* Update to deal with non-standard ports

* WIP

---------

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Dominic Roy <dominic@goauthentik.io>
2026-08-11 17:45:10 +00:00
Jens L.
01e935d0f9 enterprise/endpoints/connectors/fleet: decrease page size (#24995)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2026-08-11 17:01:36 +01:00
Jens L.
f52ab527f5 web/elements: fix prioritization in form serialization for dotted input-fields (#24987)
* web/elements: fix prioritization in form serialization for dotted-input fields

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* Tidy.

* Fix import.

* Fix spelling.

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: Teffen Ellis <592134+GirlBossRush@users.noreply.github.com>
2026-08-11 17:01:26 +01:00
Teffen Ellis
9de6209d2f web: Add path-router primitives. (#23990)
* web: Add router-core pattern constants.

* web: Add router-core parameter serialization.

* web: Add router-core configuration injection.

* web: Add router-core Route class.

* web: Add router-core route matcher.

* web: Harden router primitives from branch review.

getRouterConfig returns a copy so callers cannot mutate the stored
config; numeric deserialization only coerces digit strings that
round-trip safely (leading zeros and unsafe integers stay strings);
the matcher documents its leading-slash pathname contract.

* web: Format router primitives.
2026-08-11 14:47:05 +01:00
Jens L.
9e9912db19 enterprise/requests: optimize db for requestable apps (#24984) 2026-08-11 13:44:13 +01:00
Jens L.
fa9d78ac3b web/admin: fix missing preview banner for object attributes (#24982)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2026-08-11 12:18:58 +01:00
Jens L.
eef03b6679 providers/oauth2: fix dcr missing csrf_exempt (#24983)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2026-08-11 12:18:44 +01:00
Dewi Roberts
491cfa253e website/docs: add object attributes doc (#24437)
* Initial push

* Update object-attributes.mdx

Signed-off-by: Dewi Roberts <dewi@goauthentik.io>

* Apply suggestions from code review

Co-authored-by: Dominic Roy <dominic@goauthentik.io>
Signed-off-by: Dewi Roberts <dewi@goauthentik.io>

* Update object-attributes.mdx

Signed-off-by: Dewi Roberts <dewi@goauthentik.io>

* Apply suggestions from Jens

---------

Signed-off-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Dominic Roy <dominic@goauthentik.io>
2026-08-11 11:04:56 +00:00
Dewi Roberts
cc0547e994 website/docs: oauth: add DCR doc (#24566)
* First push. WIP

* Remove scope

* Update request example

* Apply suggestions from code review

Co-authored-by: Dominic Roy <dominic@goauthentik.io>
Signed-off-by: Dewi Roberts <dewi@goauthentik.io>

* Apply suggestions

---------

Signed-off-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Dominic Roy <dominic@goauthentik.io>
2026-08-11 10:54:17 +00:00
authentik-automation[bot]
d0ed1649f2 core, web: update translations (#24970)
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: authentik-automation[bot] <135050075+authentik-automation[bot]@users.noreply.github.com>
2026-08-11 11:48:21 +01:00
Abhishek Sharma
da1d219e41 blueprints: emit draft-07 definitions instead of $defs (#24981)
* blueprints: emit draft-07 `definitions` instead of `$defs`

The generated blueprint schema declares draft-07:

    "$schema": "http://json-schema.org/draft-07/schema"

but stored every model definition under `$defs` and referenced them as
`#/$defs/...`. `$defs` is 2020-12 vocabulary; draft-07 spells it `definitions`.

A validator honouring the declared dialect therefore cannot resolve any of
those references, so nothing consuming the published schema.json can validate
a blueprint at all — which is what #24248 reports.

Switching the declared dialect to 2020-12 instead is not a drop-in: the schema
also uses draft-07-style plain-fragment `$id` values (`#/properties/version`),
which 2020-12 does not permit — it uses `$anchor` for that. Renaming the
keyword keeps the schema internally consistent with what it already claims to
be, and is the smaller change.

Adds a regression test that validates the schema the way a consumer does:
serialized through `json_default`, exactly as `build_schema` writes it, since
the in-memory dict still holds gettext_lazy proxies. It asserts the schema
passes `Draft7Validator.check_schema` and that every `$ref` resolves to a real
definition.

Verified:
  manage.py test authentik.blueprints.tests.test_schema.TestSchema -> 5 passed
  reverting schema.py                                              -> 3 failed
  ruff check / ruff format                                         -> clean

Note: authentik.blueprints.tests.test_v1.TestBlueprintsV1.test_import_yaml_tags
fails identically with and without this change on current main.

closes #24248

* re-gen

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: Jens Langhammer <jens@goauthentik.io>
2026-08-11 11:47:55 +01:00
Marcelo Elizeche Landó
e61d74375f web: bump dompurify from 3.4.12 to v3.4.13 (#24962)
bump dompurify from 3.4.12 to v3.4.13
2026-08-11 11:18:30 +01:00
dependabot[bot]
b3e5d5c59b core: bump openid/conformance-suite from release-v5.2.1 to release-v5.2.2 in /tests/openid_conformance (#24973)
core: bump openid/conformance-suite in /tests/openid_conformance

Bumps openid/conformance-suite from release-v5.2.1 to release-v5.2.2.

---
updated-dependencies:
- dependency-name: openid/conformance-suite
  dependency-version: release-v5.2.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-11 11:18:26 +01:00
dependabot[bot]
aa9f2a5e16 core: bump openid/conformance-suite/nginx from release-v5.2.1 to release-v5.2.2 in /tests/openid_conformance (#24974)
core: bump openid/conformance-suite/nginx in /tests/openid_conformance

Bumps openid/conformance-suite/nginx from release-v5.2.1 to release-v5.2.2.

---
updated-dependencies:
- dependency-name: openid/conformance-suite/nginx
  dependency-version: release-v5.2.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-11 11:18:22 +01:00
dependabot[bot]
54e9e3866c core: bump astral-sh/uv from 0.12.2 to 0.12.3 in /lifecycle/container (#24975)
Bumps [astral-sh/uv](https://github.com/astral-sh/uv) from 0.12.2 to 0.12.3.
- [Release notes](https://github.com/astral-sh/uv/releases)
- [Changelog](https://github.com/astral-sh/uv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/uv/compare/0.12.2...0.12.3)

---
updated-dependencies:
- dependency-name: astral-sh/uv
  dependency-version: 0.12.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-11 11:18:18 +01:00