Skip to main content

DutyCheck - Releases

← App details

Nextcloud 35

DutyCheck 0.3.8
Release Details
UpdatedOct. 8, 2026, 10:57 a.m.
Changelog

Fixed

  • Pattern names stayed blocked after deleting a pattern: "deleting" only deactivates, and the deactivated row still held the unique (company_id, name) slot — re-creating a pattern with the same name failed with PATTERN_NAME_CONFLICT and no visible cause. Inactive holders are now renamed to <name> #<id> inside the transaction when the name is claimed again; names held by active patterns still conflict.
  • Generic toast instead of a real message for pattern errors: PATTERN_NAME_CONFLICT, PATTERN_NAME_INVALID, PATTERN_INACTIVE, and CYCLE_WEEKS_UNSUPPORTED now show clear, translated messages instead of "some entries could not be saved".
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureYKSLXeaU78tKSmrVSZ5oF7O5wJItPx0w5KAWzpIMNlXGUwIpq3XWej47kvTpzxLV+doTIrqmShQVLd3GJFDQu+sgANaFOoMoma0Z8qDYlPU1lAQfQg9Y4KJ0ZjRhRPZvSUk7nrenovllUKHiMerqn9V6k5DV7OV7GR8JkAaWeTl+D1avGLwt/5wXavsAwzrY+86rgDEHQW1Ku/vqgiggaxxUwdjJ7A6/WLJxq5HDAUtJfYnrK8zUIlfyysxpYkB2gm0J1Sodg7rG6aYGxX7FtIwAfbdlQKo0xvqvSDAVDkljo+I+K0llV5d94TQ3GqPa/7o+zbpqseEJFxi7HApjQgd0r1asyxULwTGGywb3pO8Y4Bl7MPkNrI6X7pHqzYfYMro03gs6TwOPLGFxEg25pzSBNeuj1CVtSGzkF6ZxzCt/6R/yLmK7AKDqcuoKHuNJcOo/o4GfS47fJ2l/hiwZjiHnF+PYvLJD35onKxotDl3LrtrZmCDR3yIu3jthA88J7g3ZqBE3p8kjDXyDQP1OqoJqoxXgrPKSkrEnWPzih5ELgFRy8incsxfrltS8QzQl6iHz9SazuSpjxaMnphJ6YdSx1J37uKQHd1yCD4LTwTiJn/TV4p2MCm8zSaI6Jd+XknBg2ZXg/N/itr6dzmAszgHWh0cRI2T+BlaQ7Fqi14E=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.7
Release Details
UpdatedOct. 7, 2026, 6:33 p.m.
Changelog

Fixed

  • “Assign pattern” always failed with a misleading overlap error: assignments left behind by deleted (deactivated) patterns still counted as overlapping — invisible in the UI and impossible to end. Only assignments on active patterns now block; rows on inactive or missing patterns are ignored, matching every other reader. The assign dialog also lists the employee’s existing assignments, auto-ticks “End previous overlapping assignment” when the start date collides, and ASSIGNMENT_OVERLAP now names the real cause instead of talking about shifts.
  • Orphan assignments for nonexistent employees: the employee check in POST …/assign only ran in multi-company installs — single-company setups accepted any employee id and wrote rows that could never resolve. The endpoint now always verifies the employee exists (EMPLOYEE_NOT_FOUND).

Changed

  • Rotation cycles up to 8 weeks: allowed cycleWeeks widened from 1–4 to 1–8 so non-week-aligned rhythms are representable (e.g. 4-on/2-off needs a 6-week cycle). A stored [1,2,3,4] — the old default that settings saves auto-persisted — now widens to the full range; explicitly narrowed lists are still honoured.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureKD5rMHAJXMGfjXybnv/huDlZiL6WR8LUbsPM3MH+QJ2W4evPTWcVTZ57rqDhErd/pz+ZWoUsNkKiHphkKppS0r1kqQLX/r8QbiTL/+MA0himUnHM7NXPXAtdsQaMyP5Dn1w81kUx32MBl4et+bBfc4vhevEteehIKM/GzmGMhRlaz9aayCVxKOxf9UuA2cAbvhDqPmiEGV55ktm1aNUaiml299Mdf6rh/DLHvrBB3Qcwghqc9sf501BROuh2HNfNroPHAiPNSnVR28eCwc+mPsR+n5yB7vVI/hhotJgOi0U+SaEhKk69e3xnkKxGXjzSONO9bfkgFz+EEEVNdbpaSwt+6TJYEXWHT8iBSr1kET82pG3lofObHvw0XK9T+AB9qWqCaWBbZoq4R3/nBMhQy/+pwD3TAapUdCwVSOFRVonZY6qKtHA+42eRxNWxtirKB8/4aKNH/WRnoSdxw1V2iJLD3Aq2avKZFTplU25nrPkITWDVIL4jIBLMfFT4tfMyAyUGP5iHivXSi3REivELo8Cfpg1j/kPekroL015laQ6vNhkE4dDfRyn8U+JcPTP17Z/l2xmPw2h72i9wiHbgljRQyVgulrGF3BYqoxzJOdwx5GPSBVFtDZ+tAzRieC4tZyvY8/zWqvEbH1swDqyCPVN1M4qXIMma3nUe/Yzo+Bc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.6
Release Details
UpdatedOct. 4, 2026, 7:10 p.m.
Changelog

Fixed

  • API hardening: stricter request validation and error paths.
  • Localization fixes.

Changed

  • Atlas v3.5.14 verification pass: expanded contract coverage; store screenshot URLs corrected.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureYk8RwxXmSzff+1RxaCplbAuvL7HNwNzwfEXFZ/9WLHYfusXZBJRENW8hx5nqktwM26XwNx8Yx/f3zdGvoih/CBxg6wUlLV0j+ScJFKIHvIGPU6WCSDFt3T8aTCca524stsZByY/RE77oZ/nFnVnxoX0Kk1v4a7ehbbvQQaW6V0tErvE+Sv1vMBEzTI8g9zGGsSJoGNSpY1/RxjGhk4inYCoPFA5qnqsRFhRHfMFHKW/A2dkB3CRxKsuOLx4Oe5uGTeuftlxntEYt6h+MzhjyPGmrI2T1UkZVvCCqXLaxl0bH6WDWvQf94Z/S33yLoj++ZwuxGYSlHu1lydHoYf6o2GiIXeEQHWAltX0S617Uy0ueHO++KUJeNBmT7gGQ4CPkAGot2yW9dWwH0qJhmU7f+7BLL1H5d5ILAhZg2naO2tjxNS+19Bct+UnbpAu70B2SOaA13+y2dmTNgk5WpSYbt6qdtQCLSkx4Kidg4unLvb90l6rEXjYOoB1O9kEuVjPKg02QOU3Tjbh8zWyrmHIeB2ZvRhgmsQ7JXioRqTIGEMMUX3uMeVgZNzYz66p6qe/BTzm0WGuhtzlZvVDMlmwk/Sk30kLwmrZilcy7v1RPHJzT+p1RqVtBqhBwsYvjJYCgu1dtwcvkommcKzavrRXMdjNPDJoOK6RTSDAC+U38vyc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.5
Release Details
UpdatedSept. 29, 2026, 6:59 p.m.
Changelog

Fixed

  • Shifts can be deleted from the edit dialog: opening a filled roster cell showed only “Save changes / Cancel” — the “Cancel shift” action that existed on the assignments table row is now also available inside the edit dialog (danger secondary action), so a manually entered shift can be removed from either surface.
  • Access page could not remove people: saving the app policy re-validated stored allowlist entries — a user or group deleted in Nextcloud meanwhile made every save fail, so removals never persisted and leaving the page always warned about unsaved changes. Stored entries that no longer resolve are now pruned (and reported back) while newly added entries are still strictly validated. Removing an entry also announces that “Save app policy” is still needed.
  • Roster error rows get a working Retry and an empty/failed roster grid no longer leaves a dead keyboard tab stop.
  • Pattern days corrupted on save: the web client posts urlencoded bodies, so an unchecked day arrived as the string "false" and PHP's (bool) cast stored every day as working. Strict boolean parsing (ApiMutationParams::boolValue*) now honours true/false/1/0/on/off/yes/no on every affected endpoint — patterns reopen with exactly the days you marked.
  • Duty & team settings flipped everything ON: the same "false" → true coercion is fixed for all toggles; ambiguous values now fail with INVALID_BOOLEAN instead of silently turning features on.
  • Patterns can now be deleted: new danger Delete action with confirmation; patterns are soft-deactivated (assignments keep their history) and no longer clutter the list.
  • Delete could still be refused after settings changes: deactivation no longer re-validates the stored cycle_weeks against the current allowed list and no longer requires the rotation feature flag — a pattern can always be deactivated. Unchanged stored values are only validated when actually changed.
  • Suggest fill filled nothing: the preview no longer inherits the “Add assignment” form’s location as a hidden filter, and location-filter drops are counted and shown (“Skipped (location filter): n”) instead of a misleading “nothing to fill”.
  • Open shifts could not be deleted: OpenShiftService::discardOpen() existed internally but no route exposed it — a posted open shift stayed forever. The roster now lists posted open shifts with a Delete action (DELETE /api/open-shifts/{id}); shifts with a pending or approved claim refuse deletion.
  • Location qualification requirements were permanent: requireForLocation had no inverse — DELETE /api/locations/{id}/qualifications/{qualificationId} (+ POST detach alias) removes a requirement, and each qualification chip now lists its required locations with a Remove action.
  • Swap requests could not be withdrawn: the requester had no way to take back a pending swap. New POST /api/my/swaps/{id}/withdraw (requester-only, race-safe) shows “Withdraw swap request” on My roster, with companion parity via /api/mobile/my/swaps + /api/mobile/swaps/{id}/withdraw.
  • Shift template active flag silently reset: ShiftTemplateService::update cast the flag via (int), turning "true" into 0 — now parsed strictly like every other boolean field.
  • Session CSRF guard: the web client no longer sends OCS-APIRequest (a header that tells Nextcloud to skip its CSRF check), and a new SessionCsrfMiddleware re-validates the request token server-side for every session-authenticated mutation regardless of that header — a forged or malformed request can no longer opt out by claiming to be an API client.
  • Release tarball shipped dev artifacts: make release packed vendor/ (all dev-deps — the app has zero runtime composer requirements), docs/atlas evidence files, phpunit.xml, playwright.config.js, and a stray .auth/ dir — ~27 MB of non-product content. The excludes now drop them and verify-release fails if they return; the archive is ~3 MB of product only.
  • Small-screen accessibility: the roster scroller is keyboard-focusable exactly while it actually scrolls (axe scrollable-region-focusable), and the access-state panel wraps instead of overflowing at 320 px.

Tests

  • Unit: strict-bool parser, urlencoded filterPatch/weekDays normalisation, stale-allowlist pruning on policy save; JS source contracts for the modal delete parity + removal cue; Playwright spec covering the pattern round-trip + delete, settings persistence, modal delete parity, and the suggest request contract.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturecqxZ0UG9RYphEpovO+kc7XaNcKrw0sQZdSeYGjQjI1NdfzufNjtRoU2BItSIKSDvJYG+765JJYMWEBHzp1Kls/Izt6rQgLcSILrw/dXqRBkOyqW+N+mBiyvF0s1l8mPbHOSwdKh99maI/qy7UdOs8pc7OTE4fj3FDqmluO9mG11lf+a8LAsdOLA5Jv5tRraCTjXJRxRGuhLOIFvm3bW6+QqgSujqZu+Wkk6s4/6j/pf5/Cab0ph8A94y0stAQv+FT6bzodUPvZ9m5H9v4JSRxWBiZH+gYEZg+zezh+WmGEvVNEglU7qHHoA7MXLjUGvEJGVifBqL1mW+KmXFIOjyBpiXX//FRksl2a99shAP/p4diFiUeKULRLsogZTFhQ//zmR9UHv94/HWUxLLmc9owRvYUka+C2ZVfLBu3KxX4CtLRS+CYGnIXhnoWqbxWRKWds9N06hv1VEU67qUh8lrZdOZybBSH917c9wRIL83ZDJ15wZvP3Djc0ysRbQCbZfME8Teyd3o2AJPjNPXW4n5V+X1wEP5QNeS/wPxV/JTN652q4QPebn2xG7g8wQ/JYF3BMslruRz4abQTXN81kvbc7b4+0xY1a0HRwMteGk3+B7Nd1VxzTRTSFHe9l7LbYgoIITYuST+2RjyvTOXoetUXW/hL8qntL6TiOCBM/LIQF0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.4
Release Details
UpdatedSept. 28, 2026, 2:34 p.m.
Changelog

Fixed

  • Conflict thresholds callout: “Apply to open periods” is shown only when open periods still use older caps (no grey dead button after Save when already in sync). Soft/hard HTML max aligned with server clamps.
  • Roster copy: “Apply copy” stays hidden until Preview reports something to copy (same omit-over-disable pattern).
  • Conflict rematerialize: After threshold save/apply, budget-dirty open periods rematerialize so stale hard caps do not linger; concurrent sibling writers get clear already-decided handling where applicable.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureQmC6cZt5OyjrDEU0YGkD3HEeUbinsOSqFKTAL3fZ4jeUsYpRZtN0sTt+97KG5O6QKdb6bkpp1caJBww/oTPnQBnDezgzd5z5Y2LMtnwj8P26UAe6MQ4FgM44MUm01G5X6pJ4b4fcIIa9s4TIu2w700ndEEAXgmWRH4vZvh9xXRs7fJx+yyqKOcF3iuRbsl+0pugBRSy1PwCMwRDJr5VJMR1wAlBwH3uPKG1zkWSDILKT0MhaeX9yvPk6Kb0+EdNcwZedP2kZ14yE7KsbJONNCJeBrH6UYLn/dMMzcSSQgNxISK6rkNrLKeE/AIY3FPEp1ZN8fTV04mxQQuylUI5Sybxu9voKaG2nsW0ie0ld7NBcVDL/eotkUZ6rQDyIUuLZYY6cLEsue2bFm3jkbO+/jeurUS/vzQkwusvR65egzMwxDvScnyI5wSMvMHF2h1JOWdigoVl/mDUWB+ZfrMbLb2DQeY2ncXPc1nZadSFnN71DzqKFaxIEKLtZPyurmL/gulCJNSzirL0wupyAKuNAxNwaV+CuHa5NZgXKs+IjnEuGezrQAfz2Vs9hRuh9IiNa196q13hQi+iOViOwDd7hVImPqDlDx03yOSJiDOJADLd9IuTQL9x5MoweatRY5adMVuviGKasaNrZWpo7EUZrF+oY2QQuKfFlyz8IKqFPjdA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.3
Release Details
UpdatedSept. 17, 2026, 4:37 p.m.
Changelog

Changed

  • App Store / GitHub release cut from the conflict-threshold source on master (correct v0.3.3 tag); packaging and App Store signature refreshed for upload.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureMDbHXeJkhKmOsuCU8D1SKyUUPWhUQ4GV/7wKHd/QvX2efTmyatkcl9VMzbUSsi2bWdDUrMg7XZSZzZ1MbXHX3XZPIR0GoENc1YuhLGZ355kXP8luNvsVjyMVK8dDVab6t321kLVlx4FVzLsrpgYovf5vyObAKczqq8ykzSdzvHe2ERJAz7gW6ppnMci4g8GICfkpbL7iWCXoptdEM3sJwRpPirlcvQblweWg/3xJuHm6p3na7gp5yn869yDPOaXyasqhtn8In9EDBl4Ic4yT5pgnOz9jgNJXr3AxYuB0sk1zWWXGNpj06IADR1dljCBx6PUwKZbS6Q5vXXb1a0yjlJNdDs9/ro5KfpFVWRWD3uDgaroM+bwjdrzDQbIGF9znE1u+Z4UWcHUEEmiMYP815U64cefa66ltMhrGdzMnBBBkkpi2Pl1lmPh1QyCFg7uSQKoDopTSytyesiOzKqzXQ4CdKLKMaDqCmNaVjnRdrOa02Tf7FRxRUwejOOYu4DQH3X0nlJmKsCsjol7QoM7H7cwXGne3O6kXHmq+fCgls9WL42OYNQ2YMoCqrEaK6d//qY0/nLR3vgrmS9OHoDSZLqzGdidY2flp3e9txwxX1mfokLlfE2tX1e5zOQgAmyB/BCB7U3fjms/seK0j9jdvIErkIJxXaYAHfGoz6r9Ia8g=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.2
Release Details
UpdatedSept. 17, 2026, 4:19 p.m.
Changelog

Added

  • Conflict thresholds → Apply to open periods: saving live caps no longer leaves planners stuck; app admins can re-freeze the current policy onto every open period in one click (published/closed stay unchanged; audit CONFLICT_THRESHOLDS_REAPPLIED).
  • Settings callout explains the create-time freeze; live ≈ hours hints next to minute fields; period/week dual-use of soft/hard caps is labelled plainly.
  • Dashboard planning status shows a freeze hint with a deep link when hard period/week hour caps are blocking publish.

Tests

  • Unit apply/status + settings/dashboard template contracts; integrity mutation asserts; Playwright axe on /settings/conflicts.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturekAEsgsiuxoAGtoG3S3yIx4UYTo+FtFAUp1u73Q0R5AH5maCb2JYUXB6OYDXY01aZuzYLW58f2SxKVCxe1HFsEQ9Vtq0XEOWIy3FKFHM9n9GzPMCla7dZ+s4QvL7FaUaYxoIF8+4OoLFcX1DZoSoeOQ6TRv6Lv5IWOkzNojTz77fzKV9DPwY8WLOk0woziW9UhQTapkMsf9EZ7LJyqDdW/yFQ7UpsNMw65DZgOOcKIcHi77vPOL7ZwJfnZ6BjiaMkA5bnFHuKakLqiJLmIpSGED4CtYoCV9Q6LpPuK0LyNtEjO4BMASZcz/KHoycF/KO6fQnqoVqtLHhZb/8ovUQQe/fvI3QozQRg7sJEIT7uBUjn/l4pvkYjcMOFNSwrbLw2hbDJQOQiFrPj/dB+s+/QVxo1Eki8A2XMup/LBPCoSJMasaGRGhRyqd1mbmJyji94QFplnU1Q2TYFbHS5qZBNqqXWlTp5A1d3gVZy7jcD4NRprqTRrPVjlx/gZ/RneeNadWpmGknSmWNiMARhYvabPFPj9T+mOCIlyfhcqw2ejeKxpLdY6TVELWIPJDHdH5NIoOxDWXB6E877MBCswK/LaoVaDFLkACWL3FtJcKUbw7wgEIE2c7iPQYIyBls0QgVFGyMgTCy1vjpHwnGzBPukAaqg1jPWojOzloIszU9OuV8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.1
Release Details
UpdatedSept. 13, 2026, 12:08 a.m.
Changelog

Fixed

  • Settings → Mobile license: tall license/seats page could not scroll to the bottom. #app-content is now the vertical scrollport; unpaired overflow-x: clip on the shell (CSS Overflow L3 y-axis clip) is removed so the seats table stays reachable.

Changed

  • Keep Nextcloud 32–35 (max-version 35).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureDG83bXnHvv34rctmFDzrPkDbrApHz7B27p94pBye86VaDepZQ0jBkLmJ2Dz88q64GxyRrfYTrZUzCBh+hYI2++bFRoNoRIAiNQ6bikGq69SQuZp7rQa3Vu0ygdpFv6Xp6RyQyij1YwW8B/U2sYLe3zPdn3TgIhSkQtPvNHedkdaj9BfWUrPUhmszkV3mU0fWv9HGIhFpdxlAEXabYBkn+ai0UfR0AeATnYFC5L4/dghCMf3pD/dTvR11JWWqeKx1+nL2k16k78HR8f1v8Uo+BB2rGv3D5Fdva7/uh89XdkYa+JNC/fsWnehDzxPh8dURTXX9+b3FM4Bmrqtztf7qgCCcTsV0RtIj9tpEXeVrSZc866PP4Nw5ZkKH4tuWBaY873mK9D234WDaieW5UsGh8goaxrxeJuSa6n/WjFUYDv1ljHP4e5lrVbs8oGzatxwnYMqupbu+jtErbPl/d9xCufXzmQVNomt+UHkkWWdXR5BIF/SqNa41EoQRrk7TkPHcdQla8youBuayG2UNEpwbdjV1VUybudlhROxaX/PFOYihkv+SLoKE54WJyEDcRRPxn1O8cl1DN7J9QSsMBoDENT256ikSBs8eXm/HafAgq40PArqrYwiSmMLxoeG9Nr7WmP0ei+IAOHWql3rM2hdqD8R/DI0MlaN0HBwZGyXDow8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.0
Release Details
UpdatedSept. 12, 2026, 8:25 p.m.
Changelog

Added — Roster Self-Service GA (DC-AZC-ROSTER-GA-1)

  • N-week rotation patterns (1–4): CRUD, per-employee assign, forward-only anchors, suggest-fill preview/confirm with period mutex
  • Soll facade (EffectiveTargetHoursFacade v1) for ArbeitszeitCheck opt-in; sealed months ignore live drift
  • Peer Team week (default off), bilateral swap path sharing planner CAS apply, preferences (Früh/Spät bands), hard blackouts
  • Today board (“Wer ist wo?”) planner-only; Dienst & Team settings section (Bachus first-paint toggles)
  • Push quiet hours with bounded queue (200/user, 24h TTL); legacy companies default off, new companies on
  • ICS Mobile create/copy/rotate + global IP spray rate limit; Duty Mobile Bachus tabs Heute · Woche · Team
  • Security: IDOR on peer/Today/blackouts/swaps; no preference free-text; ICS token never logged

Security / architecture

  • Swap/bilateral apply is a single Duty DB transaction + assignment version CAS
  • Suggest confirm all-or-nothing under dc_period_locks
  • Quiet push queue bounded (Zeus FM-QH-01)
  • Cross-app: read-only facade only — no shared transactions / no AZC SQL on dc_*
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureTfnAr0/PSUVWURk8XpU+ceR7Oc79xPUKEq4WdyRnZInXH9WziuG0j/VewRVASMBxJrvj3tYLe/CLyLps4Be1/lQU96pb7lj7BkGuTYKp9IgFrpTObkByrh2WSEMFcX1+nu435zalccB5m1ZHRubMrWS/cZhPE/v0AZSN5YDCyRbbK1q0JnMlv6WryZpQaxD4VB/UFEN9XZjQstbSL61niOa3Ktm42ZZTXwQfS5lQQmmMZTGsUxsDmUaitErQ4CUt91pCyiv0YFl4+2zvljwnUZhdnrF72ZtBPJdt6oYJOryx4ULyIgXl4Ta2CkTiMoklJQzTZ1XLYqBfpcuc5fDNMW6Joz33t/jLlhUnZbHbXJiPm0nxwC+Ezkjfjo9AnP1k8vQq1nJHwpaNX0+3XOmjnB8bzCUTbQI7gLvzoqcnf/mku/PZg96fbrd0YbUx+m/5F1AdqlssqpSQ+EUkm390kwugKm0QsIgDRh6d4aKuJeWCJhrYa/d4vVOpZWYJQln+sajjnyMOOMGlsg7KuCKhuVoIFVhs2vA2rtg8UWIQnlTuQolcwXfsI7E8EgotkWNFVCegwOlQVuN7uQPSLWLADg0C5Elv/LqatPfsjW9WJEN9jdugAiX4TcqZZEdG8jI+bxkcfApGI8Y9v/mKj+puIvGfLscpxvVthPDjxYBabsM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0

Nextcloud 34

DutyCheck 0.3.8
Release Details
UpdatedOct. 8, 2026, 10:57 a.m.
Changelog

Fixed

  • Pattern names stayed blocked after deleting a pattern: "deleting" only deactivates, and the deactivated row still held the unique (company_id, name) slot — re-creating a pattern with the same name failed with PATTERN_NAME_CONFLICT and no visible cause. Inactive holders are now renamed to <name> #<id> inside the transaction when the name is claimed again; names held by active patterns still conflict.
  • Generic toast instead of a real message for pattern errors: PATTERN_NAME_CONFLICT, PATTERN_NAME_INVALID, PATTERN_INACTIVE, and CYCLE_WEEKS_UNSUPPORTED now show clear, translated messages instead of "some entries could not be saved".
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureYKSLXeaU78tKSmrVSZ5oF7O5wJItPx0w5KAWzpIMNlXGUwIpq3XWej47kvTpzxLV+doTIrqmShQVLd3GJFDQu+sgANaFOoMoma0Z8qDYlPU1lAQfQg9Y4KJ0ZjRhRPZvSUk7nrenovllUKHiMerqn9V6k5DV7OV7GR8JkAaWeTl+D1avGLwt/5wXavsAwzrY+86rgDEHQW1Ku/vqgiggaxxUwdjJ7A6/WLJxq5HDAUtJfYnrK8zUIlfyysxpYkB2gm0J1Sodg7rG6aYGxX7FtIwAfbdlQKo0xvqvSDAVDkljo+I+K0llV5d94TQ3GqPa/7o+zbpqseEJFxi7HApjQgd0r1asyxULwTGGywb3pO8Y4Bl7MPkNrI6X7pHqzYfYMro03gs6TwOPLGFxEg25pzSBNeuj1CVtSGzkF6ZxzCt/6R/yLmK7AKDqcuoKHuNJcOo/o4GfS47fJ2l/hiwZjiHnF+PYvLJD35onKxotDl3LrtrZmCDR3yIu3jthA88J7g3ZqBE3p8kjDXyDQP1OqoJqoxXgrPKSkrEnWPzih5ELgFRy8incsxfrltS8QzQl6iHz9SazuSpjxaMnphJ6YdSx1J37uKQHd1yCD4LTwTiJn/TV4p2MCm8zSaI6Jd+XknBg2ZXg/N/itr6dzmAszgHWh0cRI2T+BlaQ7Fqi14E=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.7
Release Details
UpdatedOct. 7, 2026, 6:33 p.m.
Changelog

Fixed

  • “Assign pattern” always failed with a misleading overlap error: assignments left behind by deleted (deactivated) patterns still counted as overlapping — invisible in the UI and impossible to end. Only assignments on active patterns now block; rows on inactive or missing patterns are ignored, matching every other reader. The assign dialog also lists the employee’s existing assignments, auto-ticks “End previous overlapping assignment” when the start date collides, and ASSIGNMENT_OVERLAP now names the real cause instead of talking about shifts.
  • Orphan assignments for nonexistent employees: the employee check in POST …/assign only ran in multi-company installs — single-company setups accepted any employee id and wrote rows that could never resolve. The endpoint now always verifies the employee exists (EMPLOYEE_NOT_FOUND).

Changed

  • Rotation cycles up to 8 weeks: allowed cycleWeeks widened from 1–4 to 1–8 so non-week-aligned rhythms are representable (e.g. 4-on/2-off needs a 6-week cycle). A stored [1,2,3,4] — the old default that settings saves auto-persisted — now widens to the full range; explicitly narrowed lists are still honoured.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureKD5rMHAJXMGfjXybnv/huDlZiL6WR8LUbsPM3MH+QJ2W4evPTWcVTZ57rqDhErd/pz+ZWoUsNkKiHphkKppS0r1kqQLX/r8QbiTL/+MA0himUnHM7NXPXAtdsQaMyP5Dn1w81kUx32MBl4et+bBfc4vhevEteehIKM/GzmGMhRlaz9aayCVxKOxf9UuA2cAbvhDqPmiEGV55ktm1aNUaiml299Mdf6rh/DLHvrBB3Qcwghqc9sf501BROuh2HNfNroPHAiPNSnVR28eCwc+mPsR+n5yB7vVI/hhotJgOi0U+SaEhKk69e3xnkKxGXjzSONO9bfkgFz+EEEVNdbpaSwt+6TJYEXWHT8iBSr1kET82pG3lofObHvw0XK9T+AB9qWqCaWBbZoq4R3/nBMhQy/+pwD3TAapUdCwVSOFRVonZY6qKtHA+42eRxNWxtirKB8/4aKNH/WRnoSdxw1V2iJLD3Aq2avKZFTplU25nrPkITWDVIL4jIBLMfFT4tfMyAyUGP5iHivXSi3REivELo8Cfpg1j/kPekroL015laQ6vNhkE4dDfRyn8U+JcPTP17Z/l2xmPw2h72i9wiHbgljRQyVgulrGF3BYqoxzJOdwx5GPSBVFtDZ+tAzRieC4tZyvY8/zWqvEbH1swDqyCPVN1M4qXIMma3nUe/Yzo+Bc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.6
Release Details
UpdatedOct. 4, 2026, 7:10 p.m.
Changelog

Fixed

  • API hardening: stricter request validation and error paths.
  • Localization fixes.

Changed

  • Atlas v3.5.14 verification pass: expanded contract coverage; store screenshot URLs corrected.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureYk8RwxXmSzff+1RxaCplbAuvL7HNwNzwfEXFZ/9WLHYfusXZBJRENW8hx5nqktwM26XwNx8Yx/f3zdGvoih/CBxg6wUlLV0j+ScJFKIHvIGPU6WCSDFt3T8aTCca524stsZByY/RE77oZ/nFnVnxoX0Kk1v4a7ehbbvQQaW6V0tErvE+Sv1vMBEzTI8g9zGGsSJoGNSpY1/RxjGhk4inYCoPFA5qnqsRFhRHfMFHKW/A2dkB3CRxKsuOLx4Oe5uGTeuftlxntEYt6h+MzhjyPGmrI2T1UkZVvCCqXLaxl0bH6WDWvQf94Z/S33yLoj++ZwuxGYSlHu1lydHoYf6o2GiIXeEQHWAltX0S617Uy0ueHO++KUJeNBmT7gGQ4CPkAGot2yW9dWwH0qJhmU7f+7BLL1H5d5ILAhZg2naO2tjxNS+19Bct+UnbpAu70B2SOaA13+y2dmTNgk5WpSYbt6qdtQCLSkx4Kidg4unLvb90l6rEXjYOoB1O9kEuVjPKg02QOU3Tjbh8zWyrmHIeB2ZvRhgmsQ7JXioRqTIGEMMUX3uMeVgZNzYz66p6qe/BTzm0WGuhtzlZvVDMlmwk/Sk30kLwmrZilcy7v1RPHJzT+p1RqVtBqhBwsYvjJYCgu1dtwcvkommcKzavrRXMdjNPDJoOK6RTSDAC+U38vyc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.5
Release Details
UpdatedSept. 29, 2026, 6:59 p.m.
Changelog

Fixed

  • Shifts can be deleted from the edit dialog: opening a filled roster cell showed only “Save changes / Cancel” — the “Cancel shift” action that existed on the assignments table row is now also available inside the edit dialog (danger secondary action), so a manually entered shift can be removed from either surface.
  • Access page could not remove people: saving the app policy re-validated stored allowlist entries — a user or group deleted in Nextcloud meanwhile made every save fail, so removals never persisted and leaving the page always warned about unsaved changes. Stored entries that no longer resolve are now pruned (and reported back) while newly added entries are still strictly validated. Removing an entry also announces that “Save app policy” is still needed.
  • Roster error rows get a working Retry and an empty/failed roster grid no longer leaves a dead keyboard tab stop.
  • Pattern days corrupted on save: the web client posts urlencoded bodies, so an unchecked day arrived as the string "false" and PHP's (bool) cast stored every day as working. Strict boolean parsing (ApiMutationParams::boolValue*) now honours true/false/1/0/on/off/yes/no on every affected endpoint — patterns reopen with exactly the days you marked.
  • Duty & team settings flipped everything ON: the same "false" → true coercion is fixed for all toggles; ambiguous values now fail with INVALID_BOOLEAN instead of silently turning features on.
  • Patterns can now be deleted: new danger Delete action with confirmation; patterns are soft-deactivated (assignments keep their history) and no longer clutter the list.
  • Delete could still be refused after settings changes: deactivation no longer re-validates the stored cycle_weeks against the current allowed list and no longer requires the rotation feature flag — a pattern can always be deactivated. Unchanged stored values are only validated when actually changed.
  • Suggest fill filled nothing: the preview no longer inherits the “Add assignment” form’s location as a hidden filter, and location-filter drops are counted and shown (“Skipped (location filter): n”) instead of a misleading “nothing to fill”.
  • Open shifts could not be deleted: OpenShiftService::discardOpen() existed internally but no route exposed it — a posted open shift stayed forever. The roster now lists posted open shifts with a Delete action (DELETE /api/open-shifts/{id}); shifts with a pending or approved claim refuse deletion.
  • Location qualification requirements were permanent: requireForLocation had no inverse — DELETE /api/locations/{id}/qualifications/{qualificationId} (+ POST detach alias) removes a requirement, and each qualification chip now lists its required locations with a Remove action.
  • Swap requests could not be withdrawn: the requester had no way to take back a pending swap. New POST /api/my/swaps/{id}/withdraw (requester-only, race-safe) shows “Withdraw swap request” on My roster, with companion parity via /api/mobile/my/swaps + /api/mobile/swaps/{id}/withdraw.
  • Shift template active flag silently reset: ShiftTemplateService::update cast the flag via (int), turning "true" into 0 — now parsed strictly like every other boolean field.
  • Session CSRF guard: the web client no longer sends OCS-APIRequest (a header that tells Nextcloud to skip its CSRF check), and a new SessionCsrfMiddleware re-validates the request token server-side for every session-authenticated mutation regardless of that header — a forged or malformed request can no longer opt out by claiming to be an API client.
  • Release tarball shipped dev artifacts: make release packed vendor/ (all dev-deps — the app has zero runtime composer requirements), docs/atlas evidence files, phpunit.xml, playwright.config.js, and a stray .auth/ dir — ~27 MB of non-product content. The excludes now drop them and verify-release fails if they return; the archive is ~3 MB of product only.
  • Small-screen accessibility: the roster scroller is keyboard-focusable exactly while it actually scrolls (axe scrollable-region-focusable), and the access-state panel wraps instead of overflowing at 320 px.

Tests

  • Unit: strict-bool parser, urlencoded filterPatch/weekDays normalisation, stale-allowlist pruning on policy save; JS source contracts for the modal delete parity + removal cue; Playwright spec covering the pattern round-trip + delete, settings persistence, modal delete parity, and the suggest request contract.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturecqxZ0UG9RYphEpovO+kc7XaNcKrw0sQZdSeYGjQjI1NdfzufNjtRoU2BItSIKSDvJYG+765JJYMWEBHzp1Kls/Izt6rQgLcSILrw/dXqRBkOyqW+N+mBiyvF0s1l8mPbHOSwdKh99maI/qy7UdOs8pc7OTE4fj3FDqmluO9mG11lf+a8LAsdOLA5Jv5tRraCTjXJRxRGuhLOIFvm3bW6+QqgSujqZu+Wkk6s4/6j/pf5/Cab0ph8A94y0stAQv+FT6bzodUPvZ9m5H9v4JSRxWBiZH+gYEZg+zezh+WmGEvVNEglU7qHHoA7MXLjUGvEJGVifBqL1mW+KmXFIOjyBpiXX//FRksl2a99shAP/p4diFiUeKULRLsogZTFhQ//zmR9UHv94/HWUxLLmc9owRvYUka+C2ZVfLBu3KxX4CtLRS+CYGnIXhnoWqbxWRKWds9N06hv1VEU67qUh8lrZdOZybBSH917c9wRIL83ZDJ15wZvP3Djc0ysRbQCbZfME8Teyd3o2AJPjNPXW4n5V+X1wEP5QNeS/wPxV/JTN652q4QPebn2xG7g8wQ/JYF3BMslruRz4abQTXN81kvbc7b4+0xY1a0HRwMteGk3+B7Nd1VxzTRTSFHe9l7LbYgoIITYuST+2RjyvTOXoetUXW/hL8qntL6TiOCBM/LIQF0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.4
Release Details
UpdatedSept. 28, 2026, 2:34 p.m.
Changelog

Fixed

  • Conflict thresholds callout: “Apply to open periods” is shown only when open periods still use older caps (no grey dead button after Save when already in sync). Soft/hard HTML max aligned with server clamps.
  • Roster copy: “Apply copy” stays hidden until Preview reports something to copy (same omit-over-disable pattern).
  • Conflict rematerialize: After threshold save/apply, budget-dirty open periods rematerialize so stale hard caps do not linger; concurrent sibling writers get clear already-decided handling where applicable.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureQmC6cZt5OyjrDEU0YGkD3HEeUbinsOSqFKTAL3fZ4jeUsYpRZtN0sTt+97KG5O6QKdb6bkpp1caJBww/oTPnQBnDezgzd5z5Y2LMtnwj8P26UAe6MQ4FgM44MUm01G5X6pJ4b4fcIIa9s4TIu2w700ndEEAXgmWRH4vZvh9xXRs7fJx+yyqKOcF3iuRbsl+0pugBRSy1PwCMwRDJr5VJMR1wAlBwH3uPKG1zkWSDILKT0MhaeX9yvPk6Kb0+EdNcwZedP2kZ14yE7KsbJONNCJeBrH6UYLn/dMMzcSSQgNxISK6rkNrLKeE/AIY3FPEp1ZN8fTV04mxQQuylUI5Sybxu9voKaG2nsW0ie0ld7NBcVDL/eotkUZ6rQDyIUuLZYY6cLEsue2bFm3jkbO+/jeurUS/vzQkwusvR65egzMwxDvScnyI5wSMvMHF2h1JOWdigoVl/mDUWB+ZfrMbLb2DQeY2ncXPc1nZadSFnN71DzqKFaxIEKLtZPyurmL/gulCJNSzirL0wupyAKuNAxNwaV+CuHa5NZgXKs+IjnEuGezrQAfz2Vs9hRuh9IiNa196q13hQi+iOViOwDd7hVImPqDlDx03yOSJiDOJADLd9IuTQL9x5MoweatRY5adMVuviGKasaNrZWpo7EUZrF+oY2QQuKfFlyz8IKqFPjdA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.3
Release Details
UpdatedSept. 17, 2026, 4:37 p.m.
Changelog

Changed

  • App Store / GitHub release cut from the conflict-threshold source on master (correct v0.3.3 tag); packaging and App Store signature refreshed for upload.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureMDbHXeJkhKmOsuCU8D1SKyUUPWhUQ4GV/7wKHd/QvX2efTmyatkcl9VMzbUSsi2bWdDUrMg7XZSZzZ1MbXHX3XZPIR0GoENc1YuhLGZ355kXP8luNvsVjyMVK8dDVab6t321kLVlx4FVzLsrpgYovf5vyObAKczqq8ykzSdzvHe2ERJAz7gW6ppnMci4g8GICfkpbL7iWCXoptdEM3sJwRpPirlcvQblweWg/3xJuHm6p3na7gp5yn869yDPOaXyasqhtn8In9EDBl4Ic4yT5pgnOz9jgNJXr3AxYuB0sk1zWWXGNpj06IADR1dljCBx6PUwKZbS6Q5vXXb1a0yjlJNdDs9/ro5KfpFVWRWD3uDgaroM+bwjdrzDQbIGF9znE1u+Z4UWcHUEEmiMYP815U64cefa66ltMhrGdzMnBBBkkpi2Pl1lmPh1QyCFg7uSQKoDopTSytyesiOzKqzXQ4CdKLKMaDqCmNaVjnRdrOa02Tf7FRxRUwejOOYu4DQH3X0nlJmKsCsjol7QoM7H7cwXGne3O6kXHmq+fCgls9WL42OYNQ2YMoCqrEaK6d//qY0/nLR3vgrmS9OHoDSZLqzGdidY2flp3e9txwxX1mfokLlfE2tX1e5zOQgAmyB/BCB7U3fjms/seK0j9jdvIErkIJxXaYAHfGoz6r9Ia8g=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.2
Release Details
UpdatedSept. 17, 2026, 4:19 p.m.
Changelog

Added

  • Conflict thresholds → Apply to open periods: saving live caps no longer leaves planners stuck; app admins can re-freeze the current policy onto every open period in one click (published/closed stay unchanged; audit CONFLICT_THRESHOLDS_REAPPLIED).
  • Settings callout explains the create-time freeze; live ≈ hours hints next to minute fields; period/week dual-use of soft/hard caps is labelled plainly.
  • Dashboard planning status shows a freeze hint with a deep link when hard period/week hour caps are blocking publish.

Tests

  • Unit apply/status + settings/dashboard template contracts; integrity mutation asserts; Playwright axe on /settings/conflicts.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturekAEsgsiuxoAGtoG3S3yIx4UYTo+FtFAUp1u73Q0R5AH5maCb2JYUXB6OYDXY01aZuzYLW58f2SxKVCxe1HFsEQ9Vtq0XEOWIy3FKFHM9n9GzPMCla7dZ+s4QvL7FaUaYxoIF8+4OoLFcX1DZoSoeOQ6TRv6Lv5IWOkzNojTz77fzKV9DPwY8WLOk0woziW9UhQTapkMsf9EZ7LJyqDdW/yFQ7UpsNMw65DZgOOcKIcHi77vPOL7ZwJfnZ6BjiaMkA5bnFHuKakLqiJLmIpSGED4CtYoCV9Q6LpPuK0LyNtEjO4BMASZcz/KHoycF/KO6fQnqoVqtLHhZb/8ovUQQe/fvI3QozQRg7sJEIT7uBUjn/l4pvkYjcMOFNSwrbLw2hbDJQOQiFrPj/dB+s+/QVxo1Eki8A2XMup/LBPCoSJMasaGRGhRyqd1mbmJyji94QFplnU1Q2TYFbHS5qZBNqqXWlTp5A1d3gVZy7jcD4NRprqTRrPVjlx/gZ/RneeNadWpmGknSmWNiMARhYvabPFPj9T+mOCIlyfhcqw2ejeKxpLdY6TVELWIPJDHdH5NIoOxDWXB6E877MBCswK/LaoVaDFLkACWL3FtJcKUbw7wgEIE2c7iPQYIyBls0QgVFGyMgTCy1vjpHwnGzBPukAaqg1jPWojOzloIszU9OuV8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.1
Release Details
UpdatedSept. 13, 2026, 12:08 a.m.
Changelog

Fixed

  • Settings → Mobile license: tall license/seats page could not scroll to the bottom. #app-content is now the vertical scrollport; unpaired overflow-x: clip on the shell (CSS Overflow L3 y-axis clip) is removed so the seats table stays reachable.

Changed

  • Keep Nextcloud 32–35 (max-version 35).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureDG83bXnHvv34rctmFDzrPkDbrApHz7B27p94pBye86VaDepZQ0jBkLmJ2Dz88q64GxyRrfYTrZUzCBh+hYI2++bFRoNoRIAiNQ6bikGq69SQuZp7rQa3Vu0ygdpFv6Xp6RyQyij1YwW8B/U2sYLe3zPdn3TgIhSkQtPvNHedkdaj9BfWUrPUhmszkV3mU0fWv9HGIhFpdxlAEXabYBkn+ai0UfR0AeATnYFC5L4/dghCMf3pD/dTvR11JWWqeKx1+nL2k16k78HR8f1v8Uo+BB2rGv3D5Fdva7/uh89XdkYa+JNC/fsWnehDzxPh8dURTXX9+b3FM4Bmrqtztf7qgCCcTsV0RtIj9tpEXeVrSZc866PP4Nw5ZkKH4tuWBaY873mK9D234WDaieW5UsGh8goaxrxeJuSa6n/WjFUYDv1ljHP4e5lrVbs8oGzatxwnYMqupbu+jtErbPl/d9xCufXzmQVNomt+UHkkWWdXR5BIF/SqNa41EoQRrk7TkPHcdQla8youBuayG2UNEpwbdjV1VUybudlhROxaX/PFOYihkv+SLoKE54WJyEDcRRPxn1O8cl1DN7J9QSsMBoDENT256ikSBs8eXm/HafAgq40PArqrYwiSmMLxoeG9Nr7WmP0ei+IAOHWql3rM2hdqD8R/DI0MlaN0HBwZGyXDow8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.0
Release Details
UpdatedSept. 12, 2026, 8:25 p.m.
Changelog

Added — Roster Self-Service GA (DC-AZC-ROSTER-GA-1)

  • N-week rotation patterns (1–4): CRUD, per-employee assign, forward-only anchors, suggest-fill preview/confirm with period mutex
  • Soll facade (EffectiveTargetHoursFacade v1) for ArbeitszeitCheck opt-in; sealed months ignore live drift
  • Peer Team week (default off), bilateral swap path sharing planner CAS apply, preferences (Früh/Spät bands), hard blackouts
  • Today board (“Wer ist wo?”) planner-only; Dienst & Team settings section (Bachus first-paint toggles)
  • Push quiet hours with bounded queue (200/user, 24h TTL); legacy companies default off, new companies on
  • ICS Mobile create/copy/rotate + global IP spray rate limit; Duty Mobile Bachus tabs Heute · Woche · Team
  • Security: IDOR on peer/Today/blackouts/swaps; no preference free-text; ICS token never logged

Security / architecture

  • Swap/bilateral apply is a single Duty DB transaction + assignment version CAS
  • Suggest confirm all-or-nothing under dc_period_locks
  • Quiet push queue bounded (Zeus FM-QH-01)
  • Cross-app: read-only facade only — no shared transactions / no AZC SQL on dc_*
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureTfnAr0/PSUVWURk8XpU+ceR7Oc79xPUKEq4WdyRnZInXH9WziuG0j/VewRVASMBxJrvj3tYLe/CLyLps4Be1/lQU96pb7lj7BkGuTYKp9IgFrpTObkByrh2WSEMFcX1+nu435zalccB5m1ZHRubMrWS/cZhPE/v0AZSN5YDCyRbbK1q0JnMlv6WryZpQaxD4VB/UFEN9XZjQstbSL61niOa3Ktm42ZZTXwQfS5lQQmmMZTGsUxsDmUaitErQ4CUt91pCyiv0YFl4+2zvljwnUZhdnrF72ZtBPJdt6oYJOryx4ULyIgXl4Ta2CkTiMoklJQzTZ1XLYqBfpcuc5fDNMW6Joz33t/jLlhUnZbHbXJiPm0nxwC+Ezkjfjo9AnP1k8vQq1nJHwpaNX0+3XOmjnB8bzCUTbQI7gLvzoqcnf/mku/PZg96fbrd0YbUx+m/5F1AdqlssqpSQ+EUkm390kwugKm0QsIgDRh6d4aKuJeWCJhrYa/d4vVOpZWYJQln+sajjnyMOOMGlsg7KuCKhuVoIFVhs2vA2rtg8UWIQnlTuQolcwXfsI7E8EgotkWNFVCegwOlQVuN7uQPSLWLADg0C5Elv/LqatPfsjW9WJEN9jdugAiX4TcqZZEdG8jI+bxkcfApGI8Y9v/mKj+puIvGfLscpxvVthPDjxYBabsM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.43
Release Details
UpdatedAug. 19, 2026, 12:53 p.m.
Changelog

Fixed

  • Translations: roster/catalog window status lines and “(opens in a new tab)” are translated in every shipped locale (de/fr/es/da/nl/it/pl/sv/nb/pt_BR), not left as English identity leftovers. Placeholders {from}, {to}, and {total} stay in the same order as the msgid.
  • l10n glossary alignment: corrected wrong translations and standardised button labels across all shipped locales to match the cross-app glossary.

Changed

  • Help, Support & Us / Get the App: WCAG 2.1 AA hardening and translated footer copy for all website footer locales.
  • CI: collapsed GitHub Actions to a single PHP syntax-only smoke job; full test suites stay local.
  • Nextcloud: max-version remains 34 (current stable 34.0.3).

Tests

  • l10n catalog integrity PHPUnit + JS contract; CI runs check-l10n-placeholders.php (including pt_BR and regional variants) and run-l10n-catalog-mutations.php.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureHR7/HJ1qwZVc/emlMefPbyVwzLJ5hh9c2eplO49JhOtYCpXku1XlYM51veyU3kcnVgWsdnxl6mNIgCZCjV99qZFych6Rd0DReGHPtAIN/65hvVQK5MbHz/T5g8F6P45aPYAjGQm2oJ4Oo7lpzG4rwJ3WOGZMUcPWw8JbbWpvfd/L1qSmh0/2oqz86zQKfJfM/zBZ+LR+QW2J7Bzu4xE2cvVfj0elxWsebBcRmth8HmtkTtvAdknmDO8zM7VyS91iHwcSVZ4LNtPq5Mt0xqVzqHZc3UKn6YTA/pNjnk8mhOeprpeRI5+NfH8OfgMZFB5z/slbyPRc9VR8nGSOd9DhpFR3mIUXJDvRaA4uHdQaPrgdsTTT2HQir4fnAKzdL3pHKe12/cPfbyhobZrzs7zGKzYeLF7Rli6wSv4Vll9a/72JRNudfydeQN4RnRAiKxy8t5OW6a8KzKbYoYUlYt9uXd4mKHKcJXSJBpamd1usuCxmL6tQ4JPGF4cLiEDB6HNMU90vfD8Uc7J0V65pJin/JVtSRm6bslB58nK+ZODW8R2vVMWUNbvaMDqKhQtxRBXacMtxYBNPR+XDFmUvgYZbOIij0c1GFoRAqeEnajcRCHJlEQzgLy01+PTcpRaAkZdFMK97AYxSa39/rrUgEsaap/m+kjz8WixPhjZ1VepCl0k=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.42
Release Details
UpdatedAug. 14, 2026, 3:42 p.m.
Changelog

Fixed

  • Language vs locale: DutyCheck now honours Nextcloud Language for UI text (lang, relative time, weekday names) and Locale for date order and first day of week. English UI with a Dutch locale no longer presents the interface in Dutch. The header shows Start of week from Locale, named in Language.
  • Translations: planning “period” is no longer translated as menstruation (Dutch menstruatie, Swedish mens, French règles, Italian ciclo). Empty-state copy uses the time-range sense in nl/fr/it/sv/pl. Work “shift” is no longer translated as displacement/change (Dutch verschuiving, Italian spostamento, French changement, Danish Kravskifte, Spanish turno de reclamo).
  • Speed: Periods, Dashboard pulse, Absences, and Roster GET no longer load a full conflict recompute for a button click. GET publish-readiness and roster reads use persisted conflicts; overlap checks group by employee; absence collisions are batched. Writes (assign/publish/close) still refresh.

Changed

  • Version lockstep 0.1.42. Nextcloud max-version remains 34 (current stable 34.0.3).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureBgCv0IbAWSH0kBQZFvYHDUxNqe+dGXaVY7fbKW9Arz8FW+04G5VxHa8lRcUQS2vqb+z4YPl1kLoeYYBqOiXKJvh4Tm71CIhqmpsAiGcNiGVEAFQE/SzBle0XohKyEqJgn3yFXSSXsmYpNdDAXBCrWwQt12AUfuXKbLC0LhWxSWx6Dx/pnwM/XhbbDRGw1AJC/eKP3XNMz5SfSc93SUnrM1bY5j+eaTbMKWsh8RvtiKiM0/waY6hAvWqKBtcq8Gx6tsj1j8I3+JRLVrynsSTaLXk1wD1yZi214wE63vzOsv3yW4TvXPlIS3cTsTRp9F/qArJ2AUFTtqH5TKZR+02qCxamm0MgXo/AxlVp54gBw8lEIy805b7T84Zl1yme4LJ5IA0VhUHkta0qoqQl3sLyx2Y3+quC2PsT+xg9FNXGTAdpYxgcK6qTpsegWtdKj75Y0BKsVf4WYp4rWjmlQdxfHxLZHNLR2UKyK49lhcr3vKMoYX8VeIO50A/wI4jQN7WiI+EQUdz532xxpYSfpUyJ+jIApA23QNhSBzZtd2KDN6Ar6B0w0HxzZRBEj+rwc0RZjxOBkrP48ZAmzly8SOaAgQWM4iwk9NI4jHII2AoSBNXaN1NR0K174SF5ViYGFLpKFG3opQn0tOIcWzA+hZZzFPIK0u4m3ODQx7/GUN6tsFQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.41
Release Details
UpdatedAug. 13, 2026, 6:17 p.m.
Changelog

Added

  • Brazilian Portuguese (pt_BR): UI catalog (l10n/pt_BR.json / pt_BR.js).

Fixed

  • Activity provider (NC 34): unknown / foreign activity events throw OCP\Activity\Exceptions\UnknownActivityException instead of \InvalidArgumentException, matching the Activity API contract.

Changed

  • l10n: locale catalogs refreshed for parity; tooling accepts pt_BR.
  • Nextcloud: max-version remains 34 (current stable 34.0.3).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturedoQYPv7ZPUv2NTBeQkqQkCd+0NHDKdHEPcOX2TA4ewSC+3lCJ8UDV1ADDFxW1Q7AeyfJMY5qHOm0st/AW9Qk11UnEq6A2Fn6R6+qhtCOk09wDjfbc3iyzqXRnqHFama9/8NA4KJ9uA71hmlkDZpOmTVAxdQjC/VsxrJiFnU3DFGPWAUh7Lrj8csypDE+QtDxkoyCOlw2YQQchA8SlXyyAVGYq1AUJUUiCyTNFEm0h8kyQo0UmgvXz+7DBKsaZEzuvMgQRbn1egichPYS15C+nBluWkIuUH9YR0DhgXz4RsgW6lcACehx9yca7rFPTtaWoFXnIGicDfsrbTttDz3GNvjz34v5Z6YwJgt5bAgQpyhMZ69Qe4U6sYbynROkDqh2M5BCwqM/eZakP60xb3+GTTC2UtTWjLf2RDTRqD96RFywUyojZp5i7r1oQbHnpgQVYMQi50FJjW5Gb/5PJRSe3oZv3MJDo0BRaivXLZf2CJAFoIK/bKi6j4fxxYh/UMsO/Ugdve/tRlVSO8cly2iE3mB97WuOK5ruCm/xEJ0VZw6Ri7KBLgeFDSu1YYrbJOw5Yz59b9HHsa9Gbp3CQUkYmDsTmCKULyVhXijbWdb+sBR8rGUafQGS/xDIBZvS3ACAxs7kvrzDFQS4EVxbqjiBZis/wjnr7rEIahPAugovsGA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.40
Release Details
UpdatedAug. 8, 2026, 11:24 a.m.
Changelog

Fixed

  • ArbeitszeitCheck integration “Sync now”: per-admin rate-limiter config keys no longer exceed Nextcloud’s 64-character oc_appconfig.configkey limit (full SHA-256 digest was producing 89-character keys and HTTP 400). Manual sync works again; background reconcile was unaffected.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureaiE9Y5JC0l6KbTkUeYLnVdZAdig7zzo0c11EuKI1gtesU31pOeI2gdomHjjFubov8NbQMK7N5kHK+ML4gZcncS5i38tl1JCA2scepRuECgCPHkAsRGsxsi6SxT7QqIxFh5DYJ9amAR/8PvYFIR7g+vNSX45fL/N788VVCLwH3djWdJ4odexZWw9osQtf3tdSPrEB47NcE+Mg6YNn0g8yP2IZNupvbR+qFL80YHBjElGH8urir8nugmZ+u6Akazo/R1v0u/ml74+Kqbu53lVpfRZUVDPvh8ikbnfSuwiUfyivExNgOlcbTHT6bpSQQYTgiOJVlq4BpiNXy3muYl37NXoasIezmgbZxA0DCVK15+VTFA/Ka1lh55yAC6yW3QwknU6Gki2Z1FMp2BTW+qt62amJCHgcOyVIdp6WHBj6K1/ShmylEZvAdzu02MBBZbygTsOY+WZc76BgZiq8LrSDc5PYW38TVhsr2cu9eYm4YpfQOo59f5qckRlwgEYja7wVUeFhgZ3sD1VKxN6auyCmiFjd3wjQQQJz8xrfSBClFfMh0fy/XsfHtb/tptvHZMr+Aw07bE1JQqxSNglD/lVTfHXxZn4Xke/y83y99i/1q4ebRbW62idafqM1df3xeXf40OBL4OR1xJ7AwQg0NKEHtc4h74HL+fkNYq1EaPLCNaM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.39
Release Details
UpdatedAug. 2, 2026, 12:13 p.m.
Changelog

Changed

  • German locales (de / de_DE): formal Sie-address and clearer duty-planning, period, conflict, and license copy.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturebZuKD1IG0BBvQjjgHLgMjTSakm4mRt8pfzCdlFX2OMmVoP5riYqPa3430Fe40RY/bU+sNEvd1hryBzGUiaZa+wvMxJjAmaBnxaka+XgB2aAi1jjNd0+hRKl16jEXy+7XPyIze+KtftlTcLJ9IAb+UtjiKH0otZ7VbrZLH2XPAKxMX+uYXXDexPJ6FAnD+vvp8mTeqyIqtrZRbE91/ozAck7jrMNMcdwOZlNkSwY+JPvXZC+e2UnLBErjZaRubfHVGhyNKfXKV0b2Z1cA5dCj3vz10EWD4NWNiSXTBEmlzo0SFtMv6a3c6dp83QEZC+JfZ4HmLzpfZP+9knS1PD6YLDC+HjtSRk92JOm1S6fBkYv1j0LhLZCTUV6ivRPWyc3xBGgCVcmdj6i+PkUOwUpAPz4pN1LsbGPEJ9/3PibZMjaant732dLxSFzlyQ2Y9ZuGeti37MjlXiZm5V7JR6CYZhu696WGdS3f973qPW2A53MHuQAOnEKMSL2dfdWpUagwWWwi+xkL8f4kCrsLjDJdDqms4gR5eLHDZTFfJ1E7UFV4K/9q227GyV4nIcvWyx/XMkdaaU3yVmkD7QSqIhYeB26wdDA2AIsG2vjLcmzDojXOw9SHEx4KLwwCbsbHoZA8Y/0ZgkfVORV1Wlx919L4VtaCV+z4+8228ZSWRjcxsuM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.36
Release Details
UpdatedJuly 31, 2026, 12:17 p.m.
Changelog

Accessibility / UX

  • Setup progress WCAG fix (NC34). Done-step checkmarks no longer paint --color-primary-element-text (white) on --color-success. On Nextcloud 34, --color-success is a pale surface (#D8F3DA) — white-on-success measured ~1.18:1 (fails 1.4.11). Done status now uses --color-success-text on the success surface with an --color-element-success ring (same contract as status badges).
  • One next step. Setup checklist collapses done rows, highlights only the current gate, and shows a single primary CTA. Misleading “each item links” copy removed. Quick start is suppressed while setup gates remain so onboarding is not duplicated.
  • E2E fixture proves done-status contrast ≥ 4.5:1 under live theme tokens; JS + CSS contract tests lock the ink token.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureSipgA321iKrSDI4Dfy8wUA5dsfHe4bu1ecbSNKwlUtd4oUfxxYzRNvBSuaPzE/KnXHWE8OHm+uSNT2dCMuyB7gAlK+G4a7M00D8HDaKdTjtXSDpiCEkq+a2XyrMPwVZ+y93fu//3hEjEJY6rnNivc+o1rmmhiyFpiWkorAXIQiJfsaBj25kiLzIDDBSXijNg4enct7/rE2vSuvup9dsHlz4GppYyoQAjED0ofkY9Im1W5M/V/VwcnQHW/eXoMzgcqoVMuoxq+fvvZizSb/n32t5i8jNy12nY/f00txgCGdo1XDqF/fRfk5WgSZ3sLlrXifnxl+PbMacCsVTmWRiGNU7xOG8r7vim2NKZElyF4ne8dNR5gdQLSSZjSpV4rsZNCX25fHW0pUNtfs1TMzeyUJ0XwMNncSkE6T9vDwEdKHByHzPi+9HyKL3w03XtxiXJ9F+ky5w+xg2nZtuEdfJYtQ0rfCyh/9WpoGZkeTeQ/QP40usj+BTBOEmwgEYUWlZB+IyP4KImgFPHm1/hi0fgv34SvN/TxFPetJFB4DIQWSC7Q8Ph2ba+IPWbhmWHMkELFAdsXp+Sk0FM9Bnqg8+3eZOfarpTGpz+juDigCLETgyGfH7EWxf5Z5g0WOR+6dA4tPFArQmgI3Lj4uIWE1aHQMqcazzTbMokQbMMTvV7v0M=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.17
Release Details
UpdatedJune 12, 2026, 3:01 p.m.
Changelog

Fixed

  • Data loss after Nextcloud upgrade: UninstallDropTables preserves tables and settings on disable; full cleanup runs only on app removal.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureEJ33U4A6NO62F6uTNsGR5NcfKZfQSZWx+Nd9XPJJDPGyN0xrPkF0ManLdQMGFTBkVyD3lCvKQaEzXSzzNCzYSer47u+XoaU5lIkhzp9sZpyRqQB5fCZ8aGspjN5ef5q68b88PCroC47RFJ9KRx7HxRbzrohFIRGaY3SuTTwCvzAJzB7nR+ZqiLxWjh8Lky8rqYTdcHsrXREEoqbLNsmYzEv55a+UEsKNtKSEXMFeNJaLOGwQ1vTMn/YssNP9qKiUAxqHz/zNcbObm4LRNeMa8nP9wn4QafwZ18b4lT+cPf25dhx5LVo5yWiOUwI2NHlq3pQlO2TfP71X8ZK9ppCeVDJuwTNjPmVViisC4tuRkIBQImvGo4JyhuaWy7w3lPGgTZ/OmSXjcRQbWzQovNCKosbtjFUxLCxkIeCp90A2MFeVYQtYLKMcF+GtFbfCZgpBPh0PU7NS/lIzz7wr/9pGSIZBdNtEKsRaPxixNpkgtutFLlrjMisvTYDWW14DNVbXPFcykwPok6n7OaYLoh6XNSXRorHOtVBazq9jDHuZ+r7FNmrVi6xuBmVIIGL0+m88COs8YDiV4OzWruWzxdoqDUlDo3cAAX6eJ6AcPnTjkR8z7zreU6MBZo+2ERbzP3O27lCd4VBt6lqXbpIMgg2dFFdCgPRRFiylU30HEuWYUTo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0

Nextcloud 33

DutyCheck 0.3.8
Release Details
UpdatedOct. 8, 2026, 10:57 a.m.
Changelog

Fixed

  • Pattern names stayed blocked after deleting a pattern: "deleting" only deactivates, and the deactivated row still held the unique (company_id, name) slot — re-creating a pattern with the same name failed with PATTERN_NAME_CONFLICT and no visible cause. Inactive holders are now renamed to <name> #<id> inside the transaction when the name is claimed again; names held by active patterns still conflict.
  • Generic toast instead of a real message for pattern errors: PATTERN_NAME_CONFLICT, PATTERN_NAME_INVALID, PATTERN_INACTIVE, and CYCLE_WEEKS_UNSUPPORTED now show clear, translated messages instead of "some entries could not be saved".
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureYKSLXeaU78tKSmrVSZ5oF7O5wJItPx0w5KAWzpIMNlXGUwIpq3XWej47kvTpzxLV+doTIrqmShQVLd3GJFDQu+sgANaFOoMoma0Z8qDYlPU1lAQfQg9Y4KJ0ZjRhRPZvSUk7nrenovllUKHiMerqn9V6k5DV7OV7GR8JkAaWeTl+D1avGLwt/5wXavsAwzrY+86rgDEHQW1Ku/vqgiggaxxUwdjJ7A6/WLJxq5HDAUtJfYnrK8zUIlfyysxpYkB2gm0J1Sodg7rG6aYGxX7FtIwAfbdlQKo0xvqvSDAVDkljo+I+K0llV5d94TQ3GqPa/7o+zbpqseEJFxi7HApjQgd0r1asyxULwTGGywb3pO8Y4Bl7MPkNrI6X7pHqzYfYMro03gs6TwOPLGFxEg25pzSBNeuj1CVtSGzkF6ZxzCt/6R/yLmK7AKDqcuoKHuNJcOo/o4GfS47fJ2l/hiwZjiHnF+PYvLJD35onKxotDl3LrtrZmCDR3yIu3jthA88J7g3ZqBE3p8kjDXyDQP1OqoJqoxXgrPKSkrEnWPzih5ELgFRy8incsxfrltS8QzQl6iHz9SazuSpjxaMnphJ6YdSx1J37uKQHd1yCD4LTwTiJn/TV4p2MCm8zSaI6Jd+XknBg2ZXg/N/itr6dzmAszgHWh0cRI2T+BlaQ7Fqi14E=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.7
Release Details
UpdatedOct. 7, 2026, 6:33 p.m.
Changelog

Fixed

  • “Assign pattern” always failed with a misleading overlap error: assignments left behind by deleted (deactivated) patterns still counted as overlapping — invisible in the UI and impossible to end. Only assignments on active patterns now block; rows on inactive or missing patterns are ignored, matching every other reader. The assign dialog also lists the employee’s existing assignments, auto-ticks “End previous overlapping assignment” when the start date collides, and ASSIGNMENT_OVERLAP now names the real cause instead of talking about shifts.
  • Orphan assignments for nonexistent employees: the employee check in POST …/assign only ran in multi-company installs — single-company setups accepted any employee id and wrote rows that could never resolve. The endpoint now always verifies the employee exists (EMPLOYEE_NOT_FOUND).

Changed

  • Rotation cycles up to 8 weeks: allowed cycleWeeks widened from 1–4 to 1–8 so non-week-aligned rhythms are representable (e.g. 4-on/2-off needs a 6-week cycle). A stored [1,2,3,4] — the old default that settings saves auto-persisted — now widens to the full range; explicitly narrowed lists are still honoured.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureKD5rMHAJXMGfjXybnv/huDlZiL6WR8LUbsPM3MH+QJ2W4evPTWcVTZ57rqDhErd/pz+ZWoUsNkKiHphkKppS0r1kqQLX/r8QbiTL/+MA0himUnHM7NXPXAtdsQaMyP5Dn1w81kUx32MBl4et+bBfc4vhevEteehIKM/GzmGMhRlaz9aayCVxKOxf9UuA2cAbvhDqPmiEGV55ktm1aNUaiml299Mdf6rh/DLHvrBB3Qcwghqc9sf501BROuh2HNfNroPHAiPNSnVR28eCwc+mPsR+n5yB7vVI/hhotJgOi0U+SaEhKk69e3xnkKxGXjzSONO9bfkgFz+EEEVNdbpaSwt+6TJYEXWHT8iBSr1kET82pG3lofObHvw0XK9T+AB9qWqCaWBbZoq4R3/nBMhQy/+pwD3TAapUdCwVSOFRVonZY6qKtHA+42eRxNWxtirKB8/4aKNH/WRnoSdxw1V2iJLD3Aq2avKZFTplU25nrPkITWDVIL4jIBLMfFT4tfMyAyUGP5iHivXSi3REivELo8Cfpg1j/kPekroL015laQ6vNhkE4dDfRyn8U+JcPTP17Z/l2xmPw2h72i9wiHbgljRQyVgulrGF3BYqoxzJOdwx5GPSBVFtDZ+tAzRieC4tZyvY8/zWqvEbH1swDqyCPVN1M4qXIMma3nUe/Yzo+Bc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.6
Release Details
UpdatedOct. 4, 2026, 7:10 p.m.
Changelog

Fixed

  • API hardening: stricter request validation and error paths.
  • Localization fixes.

Changed

  • Atlas v3.5.14 verification pass: expanded contract coverage; store screenshot URLs corrected.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureYk8RwxXmSzff+1RxaCplbAuvL7HNwNzwfEXFZ/9WLHYfusXZBJRENW8hx5nqktwM26XwNx8Yx/f3zdGvoih/CBxg6wUlLV0j+ScJFKIHvIGPU6WCSDFt3T8aTCca524stsZByY/RE77oZ/nFnVnxoX0Kk1v4a7ehbbvQQaW6V0tErvE+Sv1vMBEzTI8g9zGGsSJoGNSpY1/RxjGhk4inYCoPFA5qnqsRFhRHfMFHKW/A2dkB3CRxKsuOLx4Oe5uGTeuftlxntEYt6h+MzhjyPGmrI2T1UkZVvCCqXLaxl0bH6WDWvQf94Z/S33yLoj++ZwuxGYSlHu1lydHoYf6o2GiIXeEQHWAltX0S617Uy0ueHO++KUJeNBmT7gGQ4CPkAGot2yW9dWwH0qJhmU7f+7BLL1H5d5ILAhZg2naO2tjxNS+19Bct+UnbpAu70B2SOaA13+y2dmTNgk5WpSYbt6qdtQCLSkx4Kidg4unLvb90l6rEXjYOoB1O9kEuVjPKg02QOU3Tjbh8zWyrmHIeB2ZvRhgmsQ7JXioRqTIGEMMUX3uMeVgZNzYz66p6qe/BTzm0WGuhtzlZvVDMlmwk/Sk30kLwmrZilcy7v1RPHJzT+p1RqVtBqhBwsYvjJYCgu1dtwcvkommcKzavrRXMdjNPDJoOK6RTSDAC+U38vyc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.5
Release Details
UpdatedSept. 29, 2026, 6:59 p.m.
Changelog

Fixed

  • Shifts can be deleted from the edit dialog: opening a filled roster cell showed only “Save changes / Cancel” — the “Cancel shift” action that existed on the assignments table row is now also available inside the edit dialog (danger secondary action), so a manually entered shift can be removed from either surface.
  • Access page could not remove people: saving the app policy re-validated stored allowlist entries — a user or group deleted in Nextcloud meanwhile made every save fail, so removals never persisted and leaving the page always warned about unsaved changes. Stored entries that no longer resolve are now pruned (and reported back) while newly added entries are still strictly validated. Removing an entry also announces that “Save app policy” is still needed.
  • Roster error rows get a working Retry and an empty/failed roster grid no longer leaves a dead keyboard tab stop.
  • Pattern days corrupted on save: the web client posts urlencoded bodies, so an unchecked day arrived as the string "false" and PHP's (bool) cast stored every day as working. Strict boolean parsing (ApiMutationParams::boolValue*) now honours true/false/1/0/on/off/yes/no on every affected endpoint — patterns reopen with exactly the days you marked.
  • Duty & team settings flipped everything ON: the same "false" → true coercion is fixed for all toggles; ambiguous values now fail with INVALID_BOOLEAN instead of silently turning features on.
  • Patterns can now be deleted: new danger Delete action with confirmation; patterns are soft-deactivated (assignments keep their history) and no longer clutter the list.
  • Delete could still be refused after settings changes: deactivation no longer re-validates the stored cycle_weeks against the current allowed list and no longer requires the rotation feature flag — a pattern can always be deactivated. Unchanged stored values are only validated when actually changed.
  • Suggest fill filled nothing: the preview no longer inherits the “Add assignment” form’s location as a hidden filter, and location-filter drops are counted and shown (“Skipped (location filter): n”) instead of a misleading “nothing to fill”.
  • Open shifts could not be deleted: OpenShiftService::discardOpen() existed internally but no route exposed it — a posted open shift stayed forever. The roster now lists posted open shifts with a Delete action (DELETE /api/open-shifts/{id}); shifts with a pending or approved claim refuse deletion.
  • Location qualification requirements were permanent: requireForLocation had no inverse — DELETE /api/locations/{id}/qualifications/{qualificationId} (+ POST detach alias) removes a requirement, and each qualification chip now lists its required locations with a Remove action.
  • Swap requests could not be withdrawn: the requester had no way to take back a pending swap. New POST /api/my/swaps/{id}/withdraw (requester-only, race-safe) shows “Withdraw swap request” on My roster, with companion parity via /api/mobile/my/swaps + /api/mobile/swaps/{id}/withdraw.
  • Shift template active flag silently reset: ShiftTemplateService::update cast the flag via (int), turning "true" into 0 — now parsed strictly like every other boolean field.
  • Session CSRF guard: the web client no longer sends OCS-APIRequest (a header that tells Nextcloud to skip its CSRF check), and a new SessionCsrfMiddleware re-validates the request token server-side for every session-authenticated mutation regardless of that header — a forged or malformed request can no longer opt out by claiming to be an API client.
  • Release tarball shipped dev artifacts: make release packed vendor/ (all dev-deps — the app has zero runtime composer requirements), docs/atlas evidence files, phpunit.xml, playwright.config.js, and a stray .auth/ dir — ~27 MB of non-product content. The excludes now drop them and verify-release fails if they return; the archive is ~3 MB of product only.
  • Small-screen accessibility: the roster scroller is keyboard-focusable exactly while it actually scrolls (axe scrollable-region-focusable), and the access-state panel wraps instead of overflowing at 320 px.

Tests

  • Unit: strict-bool parser, urlencoded filterPatch/weekDays normalisation, stale-allowlist pruning on policy save; JS source contracts for the modal delete parity + removal cue; Playwright spec covering the pattern round-trip + delete, settings persistence, modal delete parity, and the suggest request contract.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturecqxZ0UG9RYphEpovO+kc7XaNcKrw0sQZdSeYGjQjI1NdfzufNjtRoU2BItSIKSDvJYG+765JJYMWEBHzp1Kls/Izt6rQgLcSILrw/dXqRBkOyqW+N+mBiyvF0s1l8mPbHOSwdKh99maI/qy7UdOs8pc7OTE4fj3FDqmluO9mG11lf+a8LAsdOLA5Jv5tRraCTjXJRxRGuhLOIFvm3bW6+QqgSujqZu+Wkk6s4/6j/pf5/Cab0ph8A94y0stAQv+FT6bzodUPvZ9m5H9v4JSRxWBiZH+gYEZg+zezh+WmGEvVNEglU7qHHoA7MXLjUGvEJGVifBqL1mW+KmXFIOjyBpiXX//FRksl2a99shAP/p4diFiUeKULRLsogZTFhQ//zmR9UHv94/HWUxLLmc9owRvYUka+C2ZVfLBu3KxX4CtLRS+CYGnIXhnoWqbxWRKWds9N06hv1VEU67qUh8lrZdOZybBSH917c9wRIL83ZDJ15wZvP3Djc0ysRbQCbZfME8Teyd3o2AJPjNPXW4n5V+X1wEP5QNeS/wPxV/JTN652q4QPebn2xG7g8wQ/JYF3BMslruRz4abQTXN81kvbc7b4+0xY1a0HRwMteGk3+B7Nd1VxzTRTSFHe9l7LbYgoIITYuST+2RjyvTOXoetUXW/hL8qntL6TiOCBM/LIQF0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.4
Release Details
UpdatedSept. 28, 2026, 2:34 p.m.
Changelog

Fixed

  • Conflict thresholds callout: “Apply to open periods” is shown only when open periods still use older caps (no grey dead button after Save when already in sync). Soft/hard HTML max aligned with server clamps.
  • Roster copy: “Apply copy” stays hidden until Preview reports something to copy (same omit-over-disable pattern).
  • Conflict rematerialize: After threshold save/apply, budget-dirty open periods rematerialize so stale hard caps do not linger; concurrent sibling writers get clear already-decided handling where applicable.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureQmC6cZt5OyjrDEU0YGkD3HEeUbinsOSqFKTAL3fZ4jeUsYpRZtN0sTt+97KG5O6QKdb6bkpp1caJBww/oTPnQBnDezgzd5z5Y2LMtnwj8P26UAe6MQ4FgM44MUm01G5X6pJ4b4fcIIa9s4TIu2w700ndEEAXgmWRH4vZvh9xXRs7fJx+yyqKOcF3iuRbsl+0pugBRSy1PwCMwRDJr5VJMR1wAlBwH3uPKG1zkWSDILKT0MhaeX9yvPk6Kb0+EdNcwZedP2kZ14yE7KsbJONNCJeBrH6UYLn/dMMzcSSQgNxISK6rkNrLKeE/AIY3FPEp1ZN8fTV04mxQQuylUI5Sybxu9voKaG2nsW0ie0ld7NBcVDL/eotkUZ6rQDyIUuLZYY6cLEsue2bFm3jkbO+/jeurUS/vzQkwusvR65egzMwxDvScnyI5wSMvMHF2h1JOWdigoVl/mDUWB+ZfrMbLb2DQeY2ncXPc1nZadSFnN71DzqKFaxIEKLtZPyurmL/gulCJNSzirL0wupyAKuNAxNwaV+CuHa5NZgXKs+IjnEuGezrQAfz2Vs9hRuh9IiNa196q13hQi+iOViOwDd7hVImPqDlDx03yOSJiDOJADLd9IuTQL9x5MoweatRY5adMVuviGKasaNrZWpo7EUZrF+oY2QQuKfFlyz8IKqFPjdA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.3
Release Details
UpdatedSept. 17, 2026, 4:37 p.m.
Changelog

Changed

  • App Store / GitHub release cut from the conflict-threshold source on master (correct v0.3.3 tag); packaging and App Store signature refreshed for upload.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureMDbHXeJkhKmOsuCU8D1SKyUUPWhUQ4GV/7wKHd/QvX2efTmyatkcl9VMzbUSsi2bWdDUrMg7XZSZzZ1MbXHX3XZPIR0GoENc1YuhLGZ355kXP8luNvsVjyMVK8dDVab6t321kLVlx4FVzLsrpgYovf5vyObAKczqq8ykzSdzvHe2ERJAz7gW6ppnMci4g8GICfkpbL7iWCXoptdEM3sJwRpPirlcvQblweWg/3xJuHm6p3na7gp5yn869yDPOaXyasqhtn8In9EDBl4Ic4yT5pgnOz9jgNJXr3AxYuB0sk1zWWXGNpj06IADR1dljCBx6PUwKZbS6Q5vXXb1a0yjlJNdDs9/ro5KfpFVWRWD3uDgaroM+bwjdrzDQbIGF9znE1u+Z4UWcHUEEmiMYP815U64cefa66ltMhrGdzMnBBBkkpi2Pl1lmPh1QyCFg7uSQKoDopTSytyesiOzKqzXQ4CdKLKMaDqCmNaVjnRdrOa02Tf7FRxRUwejOOYu4DQH3X0nlJmKsCsjol7QoM7H7cwXGne3O6kXHmq+fCgls9WL42OYNQ2YMoCqrEaK6d//qY0/nLR3vgrmS9OHoDSZLqzGdidY2flp3e9txwxX1mfokLlfE2tX1e5zOQgAmyB/BCB7U3fjms/seK0j9jdvIErkIJxXaYAHfGoz6r9Ia8g=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.2
Release Details
UpdatedSept. 17, 2026, 4:19 p.m.
Changelog

Added

  • Conflict thresholds → Apply to open periods: saving live caps no longer leaves planners stuck; app admins can re-freeze the current policy onto every open period in one click (published/closed stay unchanged; audit CONFLICT_THRESHOLDS_REAPPLIED).
  • Settings callout explains the create-time freeze; live ≈ hours hints next to minute fields; period/week dual-use of soft/hard caps is labelled plainly.
  • Dashboard planning status shows a freeze hint with a deep link when hard period/week hour caps are blocking publish.

Tests

  • Unit apply/status + settings/dashboard template contracts; integrity mutation asserts; Playwright axe on /settings/conflicts.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturekAEsgsiuxoAGtoG3S3yIx4UYTo+FtFAUp1u73Q0R5AH5maCb2JYUXB6OYDXY01aZuzYLW58f2SxKVCxe1HFsEQ9Vtq0XEOWIy3FKFHM9n9GzPMCla7dZ+s4QvL7FaUaYxoIF8+4OoLFcX1DZoSoeOQ6TRv6Lv5IWOkzNojTz77fzKV9DPwY8WLOk0woziW9UhQTapkMsf9EZ7LJyqDdW/yFQ7UpsNMw65DZgOOcKIcHi77vPOL7ZwJfnZ6BjiaMkA5bnFHuKakLqiJLmIpSGED4CtYoCV9Q6LpPuK0LyNtEjO4BMASZcz/KHoycF/KO6fQnqoVqtLHhZb/8ovUQQe/fvI3QozQRg7sJEIT7uBUjn/l4pvkYjcMOFNSwrbLw2hbDJQOQiFrPj/dB+s+/QVxo1Eki8A2XMup/LBPCoSJMasaGRGhRyqd1mbmJyji94QFplnU1Q2TYFbHS5qZBNqqXWlTp5A1d3gVZy7jcD4NRprqTRrPVjlx/gZ/RneeNadWpmGknSmWNiMARhYvabPFPj9T+mOCIlyfhcqw2ejeKxpLdY6TVELWIPJDHdH5NIoOxDWXB6E877MBCswK/LaoVaDFLkACWL3FtJcKUbw7wgEIE2c7iPQYIyBls0QgVFGyMgTCy1vjpHwnGzBPukAaqg1jPWojOzloIszU9OuV8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.1
Release Details
UpdatedSept. 13, 2026, 12:08 a.m.
Changelog

Fixed

  • Settings → Mobile license: tall license/seats page could not scroll to the bottom. #app-content is now the vertical scrollport; unpaired overflow-x: clip on the shell (CSS Overflow L3 y-axis clip) is removed so the seats table stays reachable.

Changed

  • Keep Nextcloud 32–35 (max-version 35).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureDG83bXnHvv34rctmFDzrPkDbrApHz7B27p94pBye86VaDepZQ0jBkLmJ2Dz88q64GxyRrfYTrZUzCBh+hYI2++bFRoNoRIAiNQ6bikGq69SQuZp7rQa3Vu0ygdpFv6Xp6RyQyij1YwW8B/U2sYLe3zPdn3TgIhSkQtPvNHedkdaj9BfWUrPUhmszkV3mU0fWv9HGIhFpdxlAEXabYBkn+ai0UfR0AeATnYFC5L4/dghCMf3pD/dTvR11JWWqeKx1+nL2k16k78HR8f1v8Uo+BB2rGv3D5Fdva7/uh89XdkYa+JNC/fsWnehDzxPh8dURTXX9+b3FM4Bmrqtztf7qgCCcTsV0RtIj9tpEXeVrSZc866PP4Nw5ZkKH4tuWBaY873mK9D234WDaieW5UsGh8goaxrxeJuSa6n/WjFUYDv1ljHP4e5lrVbs8oGzatxwnYMqupbu+jtErbPl/d9xCufXzmQVNomt+UHkkWWdXR5BIF/SqNa41EoQRrk7TkPHcdQla8youBuayG2UNEpwbdjV1VUybudlhROxaX/PFOYihkv+SLoKE54WJyEDcRRPxn1O8cl1DN7J9QSsMBoDENT256ikSBs8eXm/HafAgq40PArqrYwiSmMLxoeG9Nr7WmP0ei+IAOHWql3rM2hdqD8R/DI0MlaN0HBwZGyXDow8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.0
Release Details
UpdatedSept. 12, 2026, 8:25 p.m.
Changelog

Added — Roster Self-Service GA (DC-AZC-ROSTER-GA-1)

  • N-week rotation patterns (1–4): CRUD, per-employee assign, forward-only anchors, suggest-fill preview/confirm with period mutex
  • Soll facade (EffectiveTargetHoursFacade v1) for ArbeitszeitCheck opt-in; sealed months ignore live drift
  • Peer Team week (default off), bilateral swap path sharing planner CAS apply, preferences (Früh/Spät bands), hard blackouts
  • Today board (“Wer ist wo?”) planner-only; Dienst & Team settings section (Bachus first-paint toggles)
  • Push quiet hours with bounded queue (200/user, 24h TTL); legacy companies default off, new companies on
  • ICS Mobile create/copy/rotate + global IP spray rate limit; Duty Mobile Bachus tabs Heute · Woche · Team
  • Security: IDOR on peer/Today/blackouts/swaps; no preference free-text; ICS token never logged

Security / architecture

  • Swap/bilateral apply is a single Duty DB transaction + assignment version CAS
  • Suggest confirm all-or-nothing under dc_period_locks
  • Quiet push queue bounded (Zeus FM-QH-01)
  • Cross-app: read-only facade only — no shared transactions / no AZC SQL on dc_*
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureTfnAr0/PSUVWURk8XpU+ceR7Oc79xPUKEq4WdyRnZInXH9WziuG0j/VewRVASMBxJrvj3tYLe/CLyLps4Be1/lQU96pb7lj7BkGuTYKp9IgFrpTObkByrh2WSEMFcX1+nu435zalccB5m1ZHRubMrWS/cZhPE/v0AZSN5YDCyRbbK1q0JnMlv6WryZpQaxD4VB/UFEN9XZjQstbSL61niOa3Ktm42ZZTXwQfS5lQQmmMZTGsUxsDmUaitErQ4CUt91pCyiv0YFl4+2zvljwnUZhdnrF72ZtBPJdt6oYJOryx4ULyIgXl4Ta2CkTiMoklJQzTZ1XLYqBfpcuc5fDNMW6Joz33t/jLlhUnZbHbXJiPm0nxwC+Ezkjfjo9AnP1k8vQq1nJHwpaNX0+3XOmjnB8bzCUTbQI7gLvzoqcnf/mku/PZg96fbrd0YbUx+m/5F1AdqlssqpSQ+EUkm390kwugKm0QsIgDRh6d4aKuJeWCJhrYa/d4vVOpZWYJQln+sajjnyMOOMGlsg7KuCKhuVoIFVhs2vA2rtg8UWIQnlTuQolcwXfsI7E8EgotkWNFVCegwOlQVuN7uQPSLWLADg0C5Elv/LqatPfsjW9WJEN9jdugAiX4TcqZZEdG8jI+bxkcfApGI8Y9v/mKj+puIvGfLscpxvVthPDjxYBabsM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.43
Release Details
UpdatedAug. 19, 2026, 12:53 p.m.
Changelog

Fixed

  • Translations: roster/catalog window status lines and “(opens in a new tab)” are translated in every shipped locale (de/fr/es/da/nl/it/pl/sv/nb/pt_BR), not left as English identity leftovers. Placeholders {from}, {to}, and {total} stay in the same order as the msgid.
  • l10n glossary alignment: corrected wrong translations and standardised button labels across all shipped locales to match the cross-app glossary.

Changed

  • Help, Support & Us / Get the App: WCAG 2.1 AA hardening and translated footer copy for all website footer locales.
  • CI: collapsed GitHub Actions to a single PHP syntax-only smoke job; full test suites stay local.
  • Nextcloud: max-version remains 34 (current stable 34.0.3).

Tests

  • l10n catalog integrity PHPUnit + JS contract; CI runs check-l10n-placeholders.php (including pt_BR and regional variants) and run-l10n-catalog-mutations.php.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureHR7/HJ1qwZVc/emlMefPbyVwzLJ5hh9c2eplO49JhOtYCpXku1XlYM51veyU3kcnVgWsdnxl6mNIgCZCjV99qZFych6Rd0DReGHPtAIN/65hvVQK5MbHz/T5g8F6P45aPYAjGQm2oJ4Oo7lpzG4rwJ3WOGZMUcPWw8JbbWpvfd/L1qSmh0/2oqz86zQKfJfM/zBZ+LR+QW2J7Bzu4xE2cvVfj0elxWsebBcRmth8HmtkTtvAdknmDO8zM7VyS91iHwcSVZ4LNtPq5Mt0xqVzqHZc3UKn6YTA/pNjnk8mhOeprpeRI5+NfH8OfgMZFB5z/slbyPRc9VR8nGSOd9DhpFR3mIUXJDvRaA4uHdQaPrgdsTTT2HQir4fnAKzdL3pHKe12/cPfbyhobZrzs7zGKzYeLF7Rli6wSv4Vll9a/72JRNudfydeQN4RnRAiKxy8t5OW6a8KzKbYoYUlYt9uXd4mKHKcJXSJBpamd1usuCxmL6tQ4JPGF4cLiEDB6HNMU90vfD8Uc7J0V65pJin/JVtSRm6bslB58nK+ZODW8R2vVMWUNbvaMDqKhQtxRBXacMtxYBNPR+XDFmUvgYZbOIij0c1GFoRAqeEnajcRCHJlEQzgLy01+PTcpRaAkZdFMK97AYxSa39/rrUgEsaap/m+kjz8WixPhjZ1VepCl0k=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.42
Release Details
UpdatedAug. 14, 2026, 3:42 p.m.
Changelog

Fixed

  • Language vs locale: DutyCheck now honours Nextcloud Language for UI text (lang, relative time, weekday names) and Locale for date order and first day of week. English UI with a Dutch locale no longer presents the interface in Dutch. The header shows Start of week from Locale, named in Language.
  • Translations: planning “period” is no longer translated as menstruation (Dutch menstruatie, Swedish mens, French règles, Italian ciclo). Empty-state copy uses the time-range sense in nl/fr/it/sv/pl. Work “shift” is no longer translated as displacement/change (Dutch verschuiving, Italian spostamento, French changement, Danish Kravskifte, Spanish turno de reclamo).
  • Speed: Periods, Dashboard pulse, Absences, and Roster GET no longer load a full conflict recompute for a button click. GET publish-readiness and roster reads use persisted conflicts; overlap checks group by employee; absence collisions are batched. Writes (assign/publish/close) still refresh.

Changed

  • Version lockstep 0.1.42. Nextcloud max-version remains 34 (current stable 34.0.3).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureBgCv0IbAWSH0kBQZFvYHDUxNqe+dGXaVY7fbKW9Arz8FW+04G5VxHa8lRcUQS2vqb+z4YPl1kLoeYYBqOiXKJvh4Tm71CIhqmpsAiGcNiGVEAFQE/SzBle0XohKyEqJgn3yFXSSXsmYpNdDAXBCrWwQt12AUfuXKbLC0LhWxSWx6Dx/pnwM/XhbbDRGw1AJC/eKP3XNMz5SfSc93SUnrM1bY5j+eaTbMKWsh8RvtiKiM0/waY6hAvWqKBtcq8Gx6tsj1j8I3+JRLVrynsSTaLXk1wD1yZi214wE63vzOsv3yW4TvXPlIS3cTsTRp9F/qArJ2AUFTtqH5TKZR+02qCxamm0MgXo/AxlVp54gBw8lEIy805b7T84Zl1yme4LJ5IA0VhUHkta0qoqQl3sLyx2Y3+quC2PsT+xg9FNXGTAdpYxgcK6qTpsegWtdKj75Y0BKsVf4WYp4rWjmlQdxfHxLZHNLR2UKyK49lhcr3vKMoYX8VeIO50A/wI4jQN7WiI+EQUdz532xxpYSfpUyJ+jIApA23QNhSBzZtd2KDN6Ar6B0w0HxzZRBEj+rwc0RZjxOBkrP48ZAmzly8SOaAgQWM4iwk9NI4jHII2AoSBNXaN1NR0K174SF5ViYGFLpKFG3opQn0tOIcWzA+hZZzFPIK0u4m3ODQx7/GUN6tsFQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.41
Release Details
UpdatedAug. 13, 2026, 6:17 p.m.
Changelog

Added

  • Brazilian Portuguese (pt_BR): UI catalog (l10n/pt_BR.json / pt_BR.js).

Fixed

  • Activity provider (NC 34): unknown / foreign activity events throw OCP\Activity\Exceptions\UnknownActivityException instead of \InvalidArgumentException, matching the Activity API contract.

Changed

  • l10n: locale catalogs refreshed for parity; tooling accepts pt_BR.
  • Nextcloud: max-version remains 34 (current stable 34.0.3).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturedoQYPv7ZPUv2NTBeQkqQkCd+0NHDKdHEPcOX2TA4ewSC+3lCJ8UDV1ADDFxW1Q7AeyfJMY5qHOm0st/AW9Qk11UnEq6A2Fn6R6+qhtCOk09wDjfbc3iyzqXRnqHFama9/8NA4KJ9uA71hmlkDZpOmTVAxdQjC/VsxrJiFnU3DFGPWAUh7Lrj8csypDE+QtDxkoyCOlw2YQQchA8SlXyyAVGYq1AUJUUiCyTNFEm0h8kyQo0UmgvXz+7DBKsaZEzuvMgQRbn1egichPYS15C+nBluWkIuUH9YR0DhgXz4RsgW6lcACehx9yca7rFPTtaWoFXnIGicDfsrbTttDz3GNvjz34v5Z6YwJgt5bAgQpyhMZ69Qe4U6sYbynROkDqh2M5BCwqM/eZakP60xb3+GTTC2UtTWjLf2RDTRqD96RFywUyojZp5i7r1oQbHnpgQVYMQi50FJjW5Gb/5PJRSe3oZv3MJDo0BRaivXLZf2CJAFoIK/bKi6j4fxxYh/UMsO/Ugdve/tRlVSO8cly2iE3mB97WuOK5ruCm/xEJ0VZw6Ri7KBLgeFDSu1YYrbJOw5Yz59b9HHsa9Gbp3CQUkYmDsTmCKULyVhXijbWdb+sBR8rGUafQGS/xDIBZvS3ACAxs7kvrzDFQS4EVxbqjiBZis/wjnr7rEIahPAugovsGA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.40
Release Details
UpdatedAug. 8, 2026, 11:24 a.m.
Changelog

Fixed

  • ArbeitszeitCheck integration “Sync now”: per-admin rate-limiter config keys no longer exceed Nextcloud’s 64-character oc_appconfig.configkey limit (full SHA-256 digest was producing 89-character keys and HTTP 400). Manual sync works again; background reconcile was unaffected.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureaiE9Y5JC0l6KbTkUeYLnVdZAdig7zzo0c11EuKI1gtesU31pOeI2gdomHjjFubov8NbQMK7N5kHK+ML4gZcncS5i38tl1JCA2scepRuECgCPHkAsRGsxsi6SxT7QqIxFh5DYJ9amAR/8PvYFIR7g+vNSX45fL/N788VVCLwH3djWdJ4odexZWw9osQtf3tdSPrEB47NcE+Mg6YNn0g8yP2IZNupvbR+qFL80YHBjElGH8urir8nugmZ+u6Akazo/R1v0u/ml74+Kqbu53lVpfRZUVDPvh8ikbnfSuwiUfyivExNgOlcbTHT6bpSQQYTgiOJVlq4BpiNXy3muYl37NXoasIezmgbZxA0DCVK15+VTFA/Ka1lh55yAC6yW3QwknU6Gki2Z1FMp2BTW+qt62amJCHgcOyVIdp6WHBj6K1/ShmylEZvAdzu02MBBZbygTsOY+WZc76BgZiq8LrSDc5PYW38TVhsr2cu9eYm4YpfQOo59f5qckRlwgEYja7wVUeFhgZ3sD1VKxN6auyCmiFjd3wjQQQJz8xrfSBClFfMh0fy/XsfHtb/tptvHZMr+Aw07bE1JQqxSNglD/lVTfHXxZn4Xke/y83y99i/1q4ebRbW62idafqM1df3xeXf40OBL4OR1xJ7AwQg0NKEHtc4h74HL+fkNYq1EaPLCNaM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.39
Release Details
UpdatedAug. 2, 2026, 12:13 p.m.
Changelog

Changed

  • German locales (de / de_DE): formal Sie-address and clearer duty-planning, period, conflict, and license copy.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturebZuKD1IG0BBvQjjgHLgMjTSakm4mRt8pfzCdlFX2OMmVoP5riYqPa3430Fe40RY/bU+sNEvd1hryBzGUiaZa+wvMxJjAmaBnxaka+XgB2aAi1jjNd0+hRKl16jEXy+7XPyIze+KtftlTcLJ9IAb+UtjiKH0otZ7VbrZLH2XPAKxMX+uYXXDexPJ6FAnD+vvp8mTeqyIqtrZRbE91/ozAck7jrMNMcdwOZlNkSwY+JPvXZC+e2UnLBErjZaRubfHVGhyNKfXKV0b2Z1cA5dCj3vz10EWD4NWNiSXTBEmlzo0SFtMv6a3c6dp83QEZC+JfZ4HmLzpfZP+9knS1PD6YLDC+HjtSRk92JOm1S6fBkYv1j0LhLZCTUV6ivRPWyc3xBGgCVcmdj6i+PkUOwUpAPz4pN1LsbGPEJ9/3PibZMjaant732dLxSFzlyQ2Y9ZuGeti37MjlXiZm5V7JR6CYZhu696WGdS3f973qPW2A53MHuQAOnEKMSL2dfdWpUagwWWwi+xkL8f4kCrsLjDJdDqms4gR5eLHDZTFfJ1E7UFV4K/9q227GyV4nIcvWyx/XMkdaaU3yVmkD7QSqIhYeB26wdDA2AIsG2vjLcmzDojXOw9SHEx4KLwwCbsbHoZA8Y/0ZgkfVORV1Wlx919L4VtaCV+z4+8228ZSWRjcxsuM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.36
Release Details
UpdatedJuly 31, 2026, 12:17 p.m.
Changelog

Accessibility / UX

  • Setup progress WCAG fix (NC34). Done-step checkmarks no longer paint --color-primary-element-text (white) on --color-success. On Nextcloud 34, --color-success is a pale surface (#D8F3DA) — white-on-success measured ~1.18:1 (fails 1.4.11). Done status now uses --color-success-text on the success surface with an --color-element-success ring (same contract as status badges).
  • One next step. Setup checklist collapses done rows, highlights only the current gate, and shows a single primary CTA. Misleading “each item links” copy removed. Quick start is suppressed while setup gates remain so onboarding is not duplicated.
  • E2E fixture proves done-status contrast ≥ 4.5:1 under live theme tokens; JS + CSS contract tests lock the ink token.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureSipgA321iKrSDI4Dfy8wUA5dsfHe4bu1ecbSNKwlUtd4oUfxxYzRNvBSuaPzE/KnXHWE8OHm+uSNT2dCMuyB7gAlK+G4a7M00D8HDaKdTjtXSDpiCEkq+a2XyrMPwVZ+y93fu//3hEjEJY6rnNivc+o1rmmhiyFpiWkorAXIQiJfsaBj25kiLzIDDBSXijNg4enct7/rE2vSuvup9dsHlz4GppYyoQAjED0ofkY9Im1W5M/V/VwcnQHW/eXoMzgcqoVMuoxq+fvvZizSb/n32t5i8jNy12nY/f00txgCGdo1XDqF/fRfk5WgSZ3sLlrXifnxl+PbMacCsVTmWRiGNU7xOG8r7vim2NKZElyF4ne8dNR5gdQLSSZjSpV4rsZNCX25fHW0pUNtfs1TMzeyUJ0XwMNncSkE6T9vDwEdKHByHzPi+9HyKL3w03XtxiXJ9F+ky5w+xg2nZtuEdfJYtQ0rfCyh/9WpoGZkeTeQ/QP40usj+BTBOEmwgEYUWlZB+IyP4KImgFPHm1/hi0fgv34SvN/TxFPetJFB4DIQWSC7Q8Ph2ba+IPWbhmWHMkELFAdsXp+Sk0FM9Bnqg8+3eZOfarpTGpz+juDigCLETgyGfH7EWxf5Z5g0WOR+6dA4tPFArQmgI3Lj4uIWE1aHQMqcazzTbMokQbMMTvV7v0M=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.17
Release Details
UpdatedJune 12, 2026, 3:01 p.m.
Changelog

Fixed

  • Data loss after Nextcloud upgrade: UninstallDropTables preserves tables and settings on disable; full cleanup runs only on app removal.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureEJ33U4A6NO62F6uTNsGR5NcfKZfQSZWx+Nd9XPJJDPGyN0xrPkF0ManLdQMGFTBkVyD3lCvKQaEzXSzzNCzYSer47u+XoaU5lIkhzp9sZpyRqQB5fCZ8aGspjN5ef5q68b88PCroC47RFJ9KRx7HxRbzrohFIRGaY3SuTTwCvzAJzB7nR+ZqiLxWjh8Lky8rqYTdcHsrXREEoqbLNsmYzEv55a+UEsKNtKSEXMFeNJaLOGwQ1vTMn/YssNP9qKiUAxqHz/zNcbObm4LRNeMa8nP9wn4QafwZ18b4lT+cPf25dhx5LVo5yWiOUwI2NHlq3pQlO2TfP71X8ZK9ppCeVDJuwTNjPmVViisC4tuRkIBQImvGo4JyhuaWy7w3lPGgTZ/OmSXjcRQbWzQovNCKosbtjFUxLCxkIeCp90A2MFeVYQtYLKMcF+GtFbfCZgpBPh0PU7NS/lIzz7wr/9pGSIZBdNtEKsRaPxixNpkgtutFLlrjMisvTYDWW14DNVbXPFcykwPok6n7OaYLoh6XNSXRorHOtVBazq9jDHuZ+r7FNmrVi6xuBmVIIGL0+m88COs8YDiV4OzWruWzxdoqDUlDo3cAAX6eJ6AcPnTjkR8z7zreU6MBZo+2ERbzP3O27lCd4VBt6lqXbpIMgg2dFFdCgPRRFiylU30HEuWYUTo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.16
Release Details
UpdatedJune 4, 2026, 12:15 p.m.
Changelog

Fixed

  • Employee and location saves no longer hit the wrong URL or silently empty the list. js/common/api.js now resolves every app-relative path through OC.generateUrl for GET, POST, PUT, and DELETE (mutations previously skipped this and could 404 on hosts that require /index.php/). After a successful save, the Employees and Locations pages reload the catalog from the server instead of trusting a stale empty data array.
  • Updates use POST as well as PUT (/api/employees/{id}, /api/locations/{id}) so reverse proxies that block PUT still persist edits.
  • Incomplete database schema returns SCHEMA_NOT_READY (503) with a clear message instead of a generic failure when dc_employees (or other tables) are missing.
  • German translations for the dashboard “Setup progress” checklist and related setup strings (were still showing English on de / de_DE locales).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureAHjSrt70wVjM3dAiRSZTqSO2OUVL5JRm6UI6gq9k7u3bX0snutVB3nduAjOvF86qcSZqqm6H3SGSg1HxdzPZiYEdUY+RieAs0tcPFEl7T+tAw96Avwhjtce21qpd43rbozUMlS7+YIAPOm4dE96cBWko2h4+bPZ/xJDULNEq7hdB4ToDyBD06AltqOPE/SB70PxNj9otkGqfHXs00MtFkw8PXNR+5U8L/cZEpYrdz8DTM3/pTqfikFQgUKg8xftahnNcMFznxgr1sm+BKiGr6+MIZqSFkxZj5EAjbd0mNHOfXOgfnMpW8lNQzyalraWlhtcy1ozZDnteIKacxfLvKL/HlMscc8Rkvw6wi8tocf09QmQdNEacjCdCgtYo2qa+8Pzj7jFvXVBgzE7XtORxdv66EMiFJejox10FYOOmXjTqBttZ5nyKgP2q3O3UNcazoEDpS0/CSwY56nlB2Z5cTFx1TXdw058lqTBSb8U3pGne3gtgUCZJ63cwGJo3HybwWDNF7H2uF8i/kfYomukizZ775uH7AZb1mFZjmBne2B7hK+OStkr4xosf8Bfy9i3cWiRqoInKsusgLw05fAN7p7FZM9IOHLtb5Dm/tcyvtxNXCjDo9beKKMova3yQV0hsWvi6/Co4JZy8GfJ/LCJ3REWx7HC080CpEXnRS6J9uFE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.5.0
DutyCheck 0.1.15
Release Details
UpdatedJune 4, 2026, 9:10 a.m.
Changelog

Fixed

  • Install and upgrade path hardened. appinfo/info.xml now declares MySQL/PostgreSQL under <dependencies> (required by MigrationService for correct schema checks), and EnsureDutyCheckSchema runs on install and post-migration to recreate any missing tables and fail loudly in occ upgrade logs instead of leaving a half-installed app with no UI feedback. Schema repair uses OC\DB\Connection for MigrationService, matching core occ upgrade.
  • Dashboard setup progress. Planners see a persistent “Setup progress” checklist (schema, employees, locations, open period) with direct links until planning is possible; incomplete database setup shows a critical alert and an audible error message.
  • Integration and policy errors use targeted messages in messaging.js (peer app missing/disabled/too old, sync throttled, legacy absences, access list required) instead of a generic “Something went wrong”.
  • Settings integration load failures now surface via the shared error handler (toast + live region), not only a silent banner.
  • Navigation boot failures are logged to nextcloud.log instead of being swallowed in Application::boot().

Added

  • tests/Integration/UpgradeRepairIntegrationTest.php and EnsureDutyCheckSchemaTest to guard the production upgrade container path.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureRfEt6FaCWAPF9cETGyjaa/+WHc32uEZfhSxTS01SQZ5iccsk+m6su5eUR3AupxCOhkwYqDLyfaJMb/pzcOAA3bvK02VJbcT1n2OBHpk908FBU+A0S3erzWRJ220dqwz4ejy2efKNiFYzBkw25ittQGGDP+1oXiNCSxeW9socMne2tJ+lfHDIyTShi8/FxVt7arFSUourAlvv7JTRvtgvMeKNiNwQjkEdRK3b2eJkT+9jyluz2ocSDtMpzJ9p8PEl0Il6k+gRZajTXvKw7w314y0MBqFHceqUZhiSjZTkB4GvLZ5si6dDIZYFW/o8YYc7rHVU39aEDe+X2jEoJ5D4euMziQm2/9DcTfKOYRBSB04ZEj6F1uehR6D0poOyaWgszkSFjHNQwUqXo0x9sgDNuExe9/YzTHWIvJL91BtfpTK5c3wiNJAKIfYKkiY4TLG149aAvlqtLr/zdSgESmVCXtsh5mFAPQ7nUO6hP8z61l93ibO2bds+X7Fy7F7/TUmo+2MmM0cPkw2Z81+cQBQbVb9CexHAjEwEg40P3DFcpKt7OPEqStI2l5UPngxBDYRG0yj97e/pt00PSsjnEGPCgzW+JLj+Z/qbc9GQkkyxWz9GuEx/y7plQQ5TuqKgNW+eBpcSNDnVy3G5M9+rh9LiXBTvAlQNrDCpQVjUwwLkfSo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.5.0
DutyCheck 0.1.14
Release Details
UpdatedJune 3, 2026, 7:34 a.m.
Changelog

Fixed

  • Roster "Create assignment" form layout. On the tablet/desktop grid the start- and end-time fields were placed in columns 2–3, leaving a gap in the first column and pushing the break field out of alignment. Start now sits in column 1 and end in column 2, so the day/time row lines up cleanly with the rest of the form.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureYeA5OgPzR8/D7JGtC54EhgrT0KX3UgH1bwepI+l1Er3X0d9vmuxOga0YVacp0LfHoi0iQu2lUSpwD3D3Bex5TMv+NJgs75IUD4QtnLiOlVxMPaMhjqa/E4pynp/Hez7td0ipFRlEx3jZK0wbpQCOc9PRT8jLy6v4UlDKtaLDTNpeUXlPS+sCLadlSxva1duZmpubYhK2lWRBMeu+D+jKKovjVlL9icw7IbyW9IAQvz0k1zooa44PNuLXXDf2J+YOMbdO69uLpX6I8kn753PIvwv0G35X8byig5ddC82KPDwRMpK4ioklZNV8DBj1tH9n/LqYMeCZaJd8ZQ2+jVupbDgVc2aAkVXuTKzw1rLDEJZPkHXQovr7Y4wTfRlmMkeMJ6k61RiSyB/17izd742jEpBwFCTESXC93yCrmQG8SV61jSjngmhrGaWuJ1z8U+KaKjHAjDydfQnm+BTRHm6k2Qq2DjeG89XZdcMVDSDKf2WhUcoX0bK5iYOT7N163PIU7p8F2tl9EmXu1YPtNKVHWq6KEuSXdJ6wiPL0Xqb259S3JnCuajnmeXJSzhsWY3SxVwE8HCyFP2hIqq5OK5j49c8PZ9STzBdCyj2/xmNbN4fpGkEry2t14VAc2S3tGUzbgO1Ofki1Nv82u+eahToMFMsNYPM5QZOKJJCUc3hioUg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0,<8.5.0
DutyCheck 0.1.12
Release Details
UpdatedJune 1, 2026, 1:15 p.m.
Changelog

Changed

  • Mobile-first responsive layout. The stylesheet now builds up from a small-screen base (min-width: 480px / 768px breakpoints) instead of patching a desktop layout downward. Shell, cards, page header, filter and form grids reflow cleanly from phone to desktop, and overflow-x: clip prevents the stray horizontal scrollbar on narrow viewports.
  • Tables collapse to cards on small screens. Data tables render as stacked, labelled cards below the tablet breakpoint (row headers and data-cell labels) and switch back to a normal table on wider screens, keeping rosters and lists readable on phones (WCAG 2.1 AA reflow).
  • Tighter page header with a smaller icon and a dedicated actions area so primary actions stay reachable on mobile.

Security

  • Hardened CI workflow and refreshed the Composer lock file to pull in the patched Symfony release (CVE fix), keeping bundled dependencies current.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureQ1wPRBYiz2D5QfEj5/DXGly92+wz5D9px20DL65AMfMTwZiLNLShMBvwwbFe3DPsCMR2sw2cquQhRc24kMhb9snVGE9Dn5liksrHK3p5N6TRk+O7tgFipSd7B/Wr58B1OjyTpGgRI6H7Ypb1SLfe7gNUz3ojIrBVMXGWJ4AGgHi7xeH4AqQQZPVBiAUhBVDAGm19s+tLwy4Xv8di3pkuBn3CuR0wZqBuLUlSmoSEWicS3tl8y5mEAaXvGPPu1VxQzCxz9aKt3VDqnq7LJecxPv78vmT5v9a0LNK8L3OaC9OEdtGN1K24DNgwEdUNo9bCRzb2hhM6Asxv58eIHtcVQ5ekqG3boSOwVN1/9yAvupZq3OXruMtvq66TqHUuFFMtqt6/Cq4f1ONOxlPIovjpty+mPhmytCCkLUsYYT4z/e39JE/3icDCwEQADfS23jB4NzVhl/5PtwZzBM3HJ+oeAjmtzV1sRi1hUI2HPE8jj8voivCfWJGnEDekvQaQCbW+l8USCt8ylgIZGt/mKaxM1VAJ42A9f2QhN+q1z0S3tFYNp5qb4/EZAS9ffxuoKL/wZ8a6cXKTs/C/VvOQWzCpZFHnGymcj9lSuYipUuq24X/m3Sx9xcNErYmeQ7iiauzQ++hcJKlv2N8JOTt3OOINrh6QBaJ7arqGkmOE6a4lVPM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0,<8.5.0
DutyCheck 0.1.9
Release Details
UpdatedMay 29, 2026, 7:44 a.m.
Changelog

Fixed

  • Mutations no longer fail with an opaque REQUEST_FAILED after the CSRF token rotates. The shared API client (js/common/api.js) now transparently refreshes the request token from /csrftoken and retries a write once on 412 — the same recovery @nextcloud/axios performs for the rest of the Nextcloud frontend. This fixes "Add employee" (and every other create/update) failing on long-lived or multi-tab sessions, where the failure left no entry in nextcloud.log (CSRF rejections are handled in middleware and are never logged). Retrying is safe because a 412 is rejected before any database write occurs.
  • Clear, localized error messages (js/common/messaging.js): expired tokens/sessions now tell the user to reload, and internal codes (REQUEST_FAILED, INTERNAL_ERROR, …) are never shown raw. German translations added.
  • Editing or deactivating an employee whose linked Nextcloud account was deleted no longer fails. RosterService::updateEmployee only re-validates the linked account when it actually changes; an unchanged, now-missing link stays manageable so the record is never frozen. A new (or changed) link to a missing account is still rejected.

Changed

  • App Store listing copy refreshed for broader appeal (appinfo/info.xml: summary + long description, EN + DE).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureOd6OfM2NKgnHuG3faFhhFiGXlAJpJZy1hCJUWl1rriIUlcpQDgZV4heD1U2APILsDX2QjkOspiJdZdqdZ6azbjUuNKt6Eza9rOJOoO6/RH7SC86d2y1IaZ/skXkF81o/RnnF8/EejM+YcDPmm7GgM09WJB7tz8yHAlUYmHj6I+BrBsXB701/eNUouo6Ii2su3fggJ9wzpvohFZ/X43nhA7tZXFJg5w2ojrC7Exo2ybagydf78yR/fkebdL/n3CxyEgg4kwBB9sEFpWsb+ODcIj1htRYE/2JAqsHgvgP+SzOOGKAkIeLdeswqIlSzMX/4UdQoCpLT/I+6tOwd1Qyb9qzSCXuO4tMt6wLJUkA3VMsDu/Rgsh8OboZurilDUFSKGq1cCwaqgUUeLUHUADDfcCphy3JJN35oeRQwlIjAUSibA3i68I87XxiJYsLYj0H1pJ2NvIPuHcDJW7+0hGheOew8CCW0jxhrNAjQTGO73w6Zil09H+ML3u5vOvWNhUKo64JwJUwo93kdioaSKFsK76HCleK8BjRnhYjicQYyxrK5WG6BenzMbiZ/AhI2xmIrB362RTPJj04Xf8k3IMs3Hg2l6I1FA6WJRJpcFK+zFengK56heplwJH2+aaUyTkiWi2jUBHDZYLFrc1T5Jo67EEH8slx4VQQ0Jv3CCHUElME=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0,<8.5.0
DutyCheck 0.1.8
Release Details
UpdatedMay 25, 2026, 8:06 p.m.
Changelog

Added

  • Searchable IANA timezone picker on the locations page: js/common/timezone-picker.js with keyboard navigation, live filtering, and accessible listbox semantics; backed by TimezoneCatalog and a new read-only catalog API (CatalogApiController).
  • OCA\DutyCheck\Repair\UninstallDropTables wired in appinfo/info.xml so disabling the app drops all dutycheck tables, migration rows, and app config.

Changed

  • TimezoneCatalog: expanded IANA coverage and unit tests (TimezoneCatalogTest); roster/location flows use the shared picker instead of a plain text field.
  • Locations UI: timezone field uses the new picker component; styling in css/app.css for the combobox pattern (WCAG-friendly focus and contrast).

Bumped

  • Nextcloud max-version: 33 (latest stable major).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureJkhkknrJb+VN8C5EL94UUUGVP4kDm1j4xHH1Q0rNkAop3Bsifm+kHrdFhh9o8DdoPQK24XUF1d9XwIUB11g9eUo6eHoU+rghg6gvvZPyBoCpiWXjxLxQb5gNoK8oTwQXT5HdE69yPIQLMhTtOySuHMP+hgnGOiWBzuQyCWgElCXWSBPJ293neBG1h+CjQXJR0Ib7fNTssCCqKeUtSbs7HvluAhrtbK/GUTeWVx3gtkm+4pDCjBJpK6OgLytW1rPjrSSRvNvAgIj+ZZM30laRbLH4S0l5qfNKFQPu9o0bQ9yUc8PF881qitxFOQxqeMSrzfKjrKSIraKXPJTbvQQg6UaxQszsDROaRW94W/K0Sy+nl53vJCBzzuQI1n9YwJwga0fwSWhdc/Q47rw8C0rTQOmph6Y09IKU20p3gwhkXt98xegZ3/+F//0ikeQIvN52fTd8UsScPqjIkfFh8HUn4mmZwJdF9pH63SCXdgzzHMUrDHuqyovdVBvdPvHI6zr3cuc/ha1O4NOyYNd4wljjxMwyFaBhRN+QUNAXovStP/9ahffo5gccLQudbzbzQQuFfqsFqCjBA1Sr7bV9pF7gmzHI29oQYCYXSKb+b5gSLsskeR6sN7C9jiM4ELEGA6rZSn89N76EQxr3JM59JXksMXuZnqQv9JrQgqzGQPl8Cwk=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0,<8.5.0
DutyCheck 0.1.7
Release Details
UpdatedMay 21, 2026, 6:35 p.m.
Changelog

Fixed

  • App Store info.xml: use https:// for author homepage, website, and donation URL (matches ProjectCheck; store schema requires https://.+).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureXo+WBT9sAMGzkChMgF/s5FMbZ8/MaoikA2ShzvLJP4qrvWQPlkz2VCHAbuAj3rNGdMmYL+oaPpSAqaiCC6Rc4Siq/uB2X9pucYJecy49zGF/5870lCZUI/0P8RpYqUnh7DMeqSaDNF1jvIo63tttYTeqWy+IwZ0kENobidjuNlJyhd3Pnhk0joWuDYBIzhbkY5numH0Bz8yxerzoBlbFz9gyt9RsIbCPbkfB+2WjhLqt4tWKZSrngf0sG2XkL3nQ4tjvCGm/DW2heNlnd8VhptJniYzbWHIqzaMswoAgSuojnkONCurK583Xp9MHTEBn12h4olgBspiD8JRjE4W3oW1Ms+j21A4aDAdEydSY0UXSLWDsvYL4VHa+zs+cGUGr5eywRR7Rp/PqUu1wCBWaEQYwQaItC6P1kcDOqktTFMJsEUbq1t17EjDTENOoStHdTtxgnmNwgrQsS/6qT0rR44Ioqbmn+fUk9cpzzpArxqHQCjGfOYt2f1sq00e96Em/jFKrkd6t5b6QBD4YyG2gON0mwqP3IzZdDdmBiXM9toiPOzKSUgO5YyPrjF4uJYGRlAKcaWHIUbeVeE8jFiDuU5WeYpeialaodpdPlhqrqK7ghdcqpXI8RHjkkkCEk8b7+m98qzxZC01oV19IMfNe9x5bRQGmvBxbcUguxb0zB34=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0,<8.5.0

Nextcloud 32

DutyCheck 0.3.8
Release Details
UpdatedOct. 8, 2026, 10:57 a.m.
Changelog

Fixed

  • Pattern names stayed blocked after deleting a pattern: "deleting" only deactivates, and the deactivated row still held the unique (company_id, name) slot — re-creating a pattern with the same name failed with PATTERN_NAME_CONFLICT and no visible cause. Inactive holders are now renamed to <name> #<id> inside the transaction when the name is claimed again; names held by active patterns still conflict.
  • Generic toast instead of a real message for pattern errors: PATTERN_NAME_CONFLICT, PATTERN_NAME_INVALID, PATTERN_INACTIVE, and CYCLE_WEEKS_UNSUPPORTED now show clear, translated messages instead of "some entries could not be saved".
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureYKSLXeaU78tKSmrVSZ5oF7O5wJItPx0w5KAWzpIMNlXGUwIpq3XWej47kvTpzxLV+doTIrqmShQVLd3GJFDQu+sgANaFOoMoma0Z8qDYlPU1lAQfQg9Y4KJ0ZjRhRPZvSUk7nrenovllUKHiMerqn9V6k5DV7OV7GR8JkAaWeTl+D1avGLwt/5wXavsAwzrY+86rgDEHQW1Ku/vqgiggaxxUwdjJ7A6/WLJxq5HDAUtJfYnrK8zUIlfyysxpYkB2gm0J1Sodg7rG6aYGxX7FtIwAfbdlQKo0xvqvSDAVDkljo+I+K0llV5d94TQ3GqPa/7o+zbpqseEJFxi7HApjQgd0r1asyxULwTGGywb3pO8Y4Bl7MPkNrI6X7pHqzYfYMro03gs6TwOPLGFxEg25pzSBNeuj1CVtSGzkF6ZxzCt/6R/yLmK7AKDqcuoKHuNJcOo/o4GfS47fJ2l/hiwZjiHnF+PYvLJD35onKxotDl3LrtrZmCDR3yIu3jthA88J7g3ZqBE3p8kjDXyDQP1OqoJqoxXgrPKSkrEnWPzih5ELgFRy8incsxfrltS8QzQl6iHz9SazuSpjxaMnphJ6YdSx1J37uKQHd1yCD4LTwTiJn/TV4p2MCm8zSaI6Jd+XknBg2ZXg/N/itr6dzmAszgHWh0cRI2T+BlaQ7Fqi14E=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.7
Release Details
UpdatedOct. 7, 2026, 6:33 p.m.
Changelog

Fixed

  • “Assign pattern” always failed with a misleading overlap error: assignments left behind by deleted (deactivated) patterns still counted as overlapping — invisible in the UI and impossible to end. Only assignments on active patterns now block; rows on inactive or missing patterns are ignored, matching every other reader. The assign dialog also lists the employee’s existing assignments, auto-ticks “End previous overlapping assignment” when the start date collides, and ASSIGNMENT_OVERLAP now names the real cause instead of talking about shifts.
  • Orphan assignments for nonexistent employees: the employee check in POST …/assign only ran in multi-company installs — single-company setups accepted any employee id and wrote rows that could never resolve. The endpoint now always verifies the employee exists (EMPLOYEE_NOT_FOUND).

Changed

  • Rotation cycles up to 8 weeks: allowed cycleWeeks widened from 1–4 to 1–8 so non-week-aligned rhythms are representable (e.g. 4-on/2-off needs a 6-week cycle). A stored [1,2,3,4] — the old default that settings saves auto-persisted — now widens to the full range; explicitly narrowed lists are still honoured.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureKD5rMHAJXMGfjXybnv/huDlZiL6WR8LUbsPM3MH+QJ2W4evPTWcVTZ57rqDhErd/pz+ZWoUsNkKiHphkKppS0r1kqQLX/r8QbiTL/+MA0himUnHM7NXPXAtdsQaMyP5Dn1w81kUx32MBl4et+bBfc4vhevEteehIKM/GzmGMhRlaz9aayCVxKOxf9UuA2cAbvhDqPmiEGV55ktm1aNUaiml299Mdf6rh/DLHvrBB3Qcwghqc9sf501BROuh2HNfNroPHAiPNSnVR28eCwc+mPsR+n5yB7vVI/hhotJgOi0U+SaEhKk69e3xnkKxGXjzSONO9bfkgFz+EEEVNdbpaSwt+6TJYEXWHT8iBSr1kET82pG3lofObHvw0XK9T+AB9qWqCaWBbZoq4R3/nBMhQy/+pwD3TAapUdCwVSOFRVonZY6qKtHA+42eRxNWxtirKB8/4aKNH/WRnoSdxw1V2iJLD3Aq2avKZFTplU25nrPkITWDVIL4jIBLMfFT4tfMyAyUGP5iHivXSi3REivELo8Cfpg1j/kPekroL015laQ6vNhkE4dDfRyn8U+JcPTP17Z/l2xmPw2h72i9wiHbgljRQyVgulrGF3BYqoxzJOdwx5GPSBVFtDZ+tAzRieC4tZyvY8/zWqvEbH1swDqyCPVN1M4qXIMma3nUe/Yzo+Bc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.6
Release Details
UpdatedOct. 4, 2026, 7:10 p.m.
Changelog

Fixed

  • API hardening: stricter request validation and error paths.
  • Localization fixes.

Changed

  • Atlas v3.5.14 verification pass: expanded contract coverage; store screenshot URLs corrected.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureYk8RwxXmSzff+1RxaCplbAuvL7HNwNzwfEXFZ/9WLHYfusXZBJRENW8hx5nqktwM26XwNx8Yx/f3zdGvoih/CBxg6wUlLV0j+ScJFKIHvIGPU6WCSDFt3T8aTCca524stsZByY/RE77oZ/nFnVnxoX0Kk1v4a7ehbbvQQaW6V0tErvE+Sv1vMBEzTI8g9zGGsSJoGNSpY1/RxjGhk4inYCoPFA5qnqsRFhRHfMFHKW/A2dkB3CRxKsuOLx4Oe5uGTeuftlxntEYt6h+MzhjyPGmrI2T1UkZVvCCqXLaxl0bH6WDWvQf94Z/S33yLoj++ZwuxGYSlHu1lydHoYf6o2GiIXeEQHWAltX0S617Uy0ueHO++KUJeNBmT7gGQ4CPkAGot2yW9dWwH0qJhmU7f+7BLL1H5d5ILAhZg2naO2tjxNS+19Bct+UnbpAu70B2SOaA13+y2dmTNgk5WpSYbt6qdtQCLSkx4Kidg4unLvb90l6rEXjYOoB1O9kEuVjPKg02QOU3Tjbh8zWyrmHIeB2ZvRhgmsQ7JXioRqTIGEMMUX3uMeVgZNzYz66p6qe/BTzm0WGuhtzlZvVDMlmwk/Sk30kLwmrZilcy7v1RPHJzT+p1RqVtBqhBwsYvjJYCgu1dtwcvkommcKzavrRXMdjNPDJoOK6RTSDAC+U38vyc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.5
Release Details
UpdatedSept. 29, 2026, 6:59 p.m.
Changelog

Fixed

  • Shifts can be deleted from the edit dialog: opening a filled roster cell showed only “Save changes / Cancel” — the “Cancel shift” action that existed on the assignments table row is now also available inside the edit dialog (danger secondary action), so a manually entered shift can be removed from either surface.
  • Access page could not remove people: saving the app policy re-validated stored allowlist entries — a user or group deleted in Nextcloud meanwhile made every save fail, so removals never persisted and leaving the page always warned about unsaved changes. Stored entries that no longer resolve are now pruned (and reported back) while newly added entries are still strictly validated. Removing an entry also announces that “Save app policy” is still needed.
  • Roster error rows get a working Retry and an empty/failed roster grid no longer leaves a dead keyboard tab stop.
  • Pattern days corrupted on save: the web client posts urlencoded bodies, so an unchecked day arrived as the string "false" and PHP's (bool) cast stored every day as working. Strict boolean parsing (ApiMutationParams::boolValue*) now honours true/false/1/0/on/off/yes/no on every affected endpoint — patterns reopen with exactly the days you marked.
  • Duty & team settings flipped everything ON: the same "false" → true coercion is fixed for all toggles; ambiguous values now fail with INVALID_BOOLEAN instead of silently turning features on.
  • Patterns can now be deleted: new danger Delete action with confirmation; patterns are soft-deactivated (assignments keep their history) and no longer clutter the list.
  • Delete could still be refused after settings changes: deactivation no longer re-validates the stored cycle_weeks against the current allowed list and no longer requires the rotation feature flag — a pattern can always be deactivated. Unchanged stored values are only validated when actually changed.
  • Suggest fill filled nothing: the preview no longer inherits the “Add assignment” form’s location as a hidden filter, and location-filter drops are counted and shown (“Skipped (location filter): n”) instead of a misleading “nothing to fill”.
  • Open shifts could not be deleted: OpenShiftService::discardOpen() existed internally but no route exposed it — a posted open shift stayed forever. The roster now lists posted open shifts with a Delete action (DELETE /api/open-shifts/{id}); shifts with a pending or approved claim refuse deletion.
  • Location qualification requirements were permanent: requireForLocation had no inverse — DELETE /api/locations/{id}/qualifications/{qualificationId} (+ POST detach alias) removes a requirement, and each qualification chip now lists its required locations with a Remove action.
  • Swap requests could not be withdrawn: the requester had no way to take back a pending swap. New POST /api/my/swaps/{id}/withdraw (requester-only, race-safe) shows “Withdraw swap request” on My roster, with companion parity via /api/mobile/my/swaps + /api/mobile/swaps/{id}/withdraw.
  • Shift template active flag silently reset: ShiftTemplateService::update cast the flag via (int), turning "true" into 0 — now parsed strictly like every other boolean field.
  • Session CSRF guard: the web client no longer sends OCS-APIRequest (a header that tells Nextcloud to skip its CSRF check), and a new SessionCsrfMiddleware re-validates the request token server-side for every session-authenticated mutation regardless of that header — a forged or malformed request can no longer opt out by claiming to be an API client.
  • Release tarball shipped dev artifacts: make release packed vendor/ (all dev-deps — the app has zero runtime composer requirements), docs/atlas evidence files, phpunit.xml, playwright.config.js, and a stray .auth/ dir — ~27 MB of non-product content. The excludes now drop them and verify-release fails if they return; the archive is ~3 MB of product only.
  • Small-screen accessibility: the roster scroller is keyboard-focusable exactly while it actually scrolls (axe scrollable-region-focusable), and the access-state panel wraps instead of overflowing at 320 px.

Tests

  • Unit: strict-bool parser, urlencoded filterPatch/weekDays normalisation, stale-allowlist pruning on policy save; JS source contracts for the modal delete parity + removal cue; Playwright spec covering the pattern round-trip + delete, settings persistence, modal delete parity, and the suggest request contract.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturecqxZ0UG9RYphEpovO+kc7XaNcKrw0sQZdSeYGjQjI1NdfzufNjtRoU2BItSIKSDvJYG+765JJYMWEBHzp1Kls/Izt6rQgLcSILrw/dXqRBkOyqW+N+mBiyvF0s1l8mPbHOSwdKh99maI/qy7UdOs8pc7OTE4fj3FDqmluO9mG11lf+a8LAsdOLA5Jv5tRraCTjXJRxRGuhLOIFvm3bW6+QqgSujqZu+Wkk6s4/6j/pf5/Cab0ph8A94y0stAQv+FT6bzodUPvZ9m5H9v4JSRxWBiZH+gYEZg+zezh+WmGEvVNEglU7qHHoA7MXLjUGvEJGVifBqL1mW+KmXFIOjyBpiXX//FRksl2a99shAP/p4diFiUeKULRLsogZTFhQ//zmR9UHv94/HWUxLLmc9owRvYUka+C2ZVfLBu3KxX4CtLRS+CYGnIXhnoWqbxWRKWds9N06hv1VEU67qUh8lrZdOZybBSH917c9wRIL83ZDJ15wZvP3Djc0ysRbQCbZfME8Teyd3o2AJPjNPXW4n5V+X1wEP5QNeS/wPxV/JTN652q4QPebn2xG7g8wQ/JYF3BMslruRz4abQTXN81kvbc7b4+0xY1a0HRwMteGk3+B7Nd1VxzTRTSFHe9l7LbYgoIITYuST+2RjyvTOXoetUXW/hL8qntL6TiOCBM/LIQF0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.4
Release Details
UpdatedSept. 28, 2026, 2:34 p.m.
Changelog

Fixed

  • Conflict thresholds callout: “Apply to open periods” is shown only when open periods still use older caps (no grey dead button after Save when already in sync). Soft/hard HTML max aligned with server clamps.
  • Roster copy: “Apply copy” stays hidden until Preview reports something to copy (same omit-over-disable pattern).
  • Conflict rematerialize: After threshold save/apply, budget-dirty open periods rematerialize so stale hard caps do not linger; concurrent sibling writers get clear already-decided handling where applicable.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureQmC6cZt5OyjrDEU0YGkD3HEeUbinsOSqFKTAL3fZ4jeUsYpRZtN0sTt+97KG5O6QKdb6bkpp1caJBww/oTPnQBnDezgzd5z5Y2LMtnwj8P26UAe6MQ4FgM44MUm01G5X6pJ4b4fcIIa9s4TIu2w700ndEEAXgmWRH4vZvh9xXRs7fJx+yyqKOcF3iuRbsl+0pugBRSy1PwCMwRDJr5VJMR1wAlBwH3uPKG1zkWSDILKT0MhaeX9yvPk6Kb0+EdNcwZedP2kZ14yE7KsbJONNCJeBrH6UYLn/dMMzcSSQgNxISK6rkNrLKeE/AIY3FPEp1ZN8fTV04mxQQuylUI5Sybxu9voKaG2nsW0ie0ld7NBcVDL/eotkUZ6rQDyIUuLZYY6cLEsue2bFm3jkbO+/jeurUS/vzQkwusvR65egzMwxDvScnyI5wSMvMHF2h1JOWdigoVl/mDUWB+ZfrMbLb2DQeY2ncXPc1nZadSFnN71DzqKFaxIEKLtZPyurmL/gulCJNSzirL0wupyAKuNAxNwaV+CuHa5NZgXKs+IjnEuGezrQAfz2Vs9hRuh9IiNa196q13hQi+iOViOwDd7hVImPqDlDx03yOSJiDOJADLd9IuTQL9x5MoweatRY5adMVuviGKasaNrZWpo7EUZrF+oY2QQuKfFlyz8IKqFPjdA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.3
Release Details
UpdatedSept. 17, 2026, 4:37 p.m.
Changelog

Changed

  • App Store / GitHub release cut from the conflict-threshold source on master (correct v0.3.3 tag); packaging and App Store signature refreshed for upload.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureMDbHXeJkhKmOsuCU8D1SKyUUPWhUQ4GV/7wKHd/QvX2efTmyatkcl9VMzbUSsi2bWdDUrMg7XZSZzZ1MbXHX3XZPIR0GoENc1YuhLGZ355kXP8luNvsVjyMVK8dDVab6t321kLVlx4FVzLsrpgYovf5vyObAKczqq8ykzSdzvHe2ERJAz7gW6ppnMci4g8GICfkpbL7iWCXoptdEM3sJwRpPirlcvQblweWg/3xJuHm6p3na7gp5yn869yDPOaXyasqhtn8In9EDBl4Ic4yT5pgnOz9jgNJXr3AxYuB0sk1zWWXGNpj06IADR1dljCBx6PUwKZbS6Q5vXXb1a0yjlJNdDs9/ro5KfpFVWRWD3uDgaroM+bwjdrzDQbIGF9znE1u+Z4UWcHUEEmiMYP815U64cefa66ltMhrGdzMnBBBkkpi2Pl1lmPh1QyCFg7uSQKoDopTSytyesiOzKqzXQ4CdKLKMaDqCmNaVjnRdrOa02Tf7FRxRUwejOOYu4DQH3X0nlJmKsCsjol7QoM7H7cwXGne3O6kXHmq+fCgls9WL42OYNQ2YMoCqrEaK6d//qY0/nLR3vgrmS9OHoDSZLqzGdidY2flp3e9txwxX1mfokLlfE2tX1e5zOQgAmyB/BCB7U3fjms/seK0j9jdvIErkIJxXaYAHfGoz6r9Ia8g=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.2
Release Details
UpdatedSept. 17, 2026, 4:19 p.m.
Changelog

Added

  • Conflict thresholds → Apply to open periods: saving live caps no longer leaves planners stuck; app admins can re-freeze the current policy onto every open period in one click (published/closed stay unchanged; audit CONFLICT_THRESHOLDS_REAPPLIED).
  • Settings callout explains the create-time freeze; live ≈ hours hints next to minute fields; period/week dual-use of soft/hard caps is labelled plainly.
  • Dashboard planning status shows a freeze hint with a deep link when hard period/week hour caps are blocking publish.

Tests

  • Unit apply/status + settings/dashboard template contracts; integrity mutation asserts; Playwright axe on /settings/conflicts.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturekAEsgsiuxoAGtoG3S3yIx4UYTo+FtFAUp1u73Q0R5AH5maCb2JYUXB6OYDXY01aZuzYLW58f2SxKVCxe1HFsEQ9Vtq0XEOWIy3FKFHM9n9GzPMCla7dZ+s4QvL7FaUaYxoIF8+4OoLFcX1DZoSoeOQ6TRv6Lv5IWOkzNojTz77fzKV9DPwY8WLOk0woziW9UhQTapkMsf9EZ7LJyqDdW/yFQ7UpsNMw65DZgOOcKIcHi77vPOL7ZwJfnZ6BjiaMkA5bnFHuKakLqiJLmIpSGED4CtYoCV9Q6LpPuK0LyNtEjO4BMASZcz/KHoycF/KO6fQnqoVqtLHhZb/8ovUQQe/fvI3QozQRg7sJEIT7uBUjn/l4pvkYjcMOFNSwrbLw2hbDJQOQiFrPj/dB+s+/QVxo1Eki8A2XMup/LBPCoSJMasaGRGhRyqd1mbmJyji94QFplnU1Q2TYFbHS5qZBNqqXWlTp5A1d3gVZy7jcD4NRprqTRrPVjlx/gZ/RneeNadWpmGknSmWNiMARhYvabPFPj9T+mOCIlyfhcqw2ejeKxpLdY6TVELWIPJDHdH5NIoOxDWXB6E877MBCswK/LaoVaDFLkACWL3FtJcKUbw7wgEIE2c7iPQYIyBls0QgVFGyMgTCy1vjpHwnGzBPukAaqg1jPWojOzloIszU9OuV8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.1
Release Details
UpdatedSept. 13, 2026, 12:08 a.m.
Changelog

Fixed

  • Settings → Mobile license: tall license/seats page could not scroll to the bottom. #app-content is now the vertical scrollport; unpaired overflow-x: clip on the shell (CSS Overflow L3 y-axis clip) is removed so the seats table stays reachable.

Changed

  • Keep Nextcloud 32–35 (max-version 35).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureDG83bXnHvv34rctmFDzrPkDbrApHz7B27p94pBye86VaDepZQ0jBkLmJ2Dz88q64GxyRrfYTrZUzCBh+hYI2++bFRoNoRIAiNQ6bikGq69SQuZp7rQa3Vu0ygdpFv6Xp6RyQyij1YwW8B/U2sYLe3zPdn3TgIhSkQtPvNHedkdaj9BfWUrPUhmszkV3mU0fWv9HGIhFpdxlAEXabYBkn+ai0UfR0AeATnYFC5L4/dghCMf3pD/dTvR11JWWqeKx1+nL2k16k78HR8f1v8Uo+BB2rGv3D5Fdva7/uh89XdkYa+JNC/fsWnehDzxPh8dURTXX9+b3FM4Bmrqtztf7qgCCcTsV0RtIj9tpEXeVrSZc866PP4Nw5ZkKH4tuWBaY873mK9D234WDaieW5UsGh8goaxrxeJuSa6n/WjFUYDv1ljHP4e5lrVbs8oGzatxwnYMqupbu+jtErbPl/d9xCufXzmQVNomt+UHkkWWdXR5BIF/SqNa41EoQRrk7TkPHcdQla8youBuayG2UNEpwbdjV1VUybudlhROxaX/PFOYihkv+SLoKE54WJyEDcRRPxn1O8cl1DN7J9QSsMBoDENT256ikSBs8eXm/HafAgq40PArqrYwiSmMLxoeG9Nr7WmP0ei+IAOHWql3rM2hdqD8R/DI0MlaN0HBwZGyXDow8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.3.0
Release Details
UpdatedSept. 12, 2026, 8:25 p.m.
Changelog

Added — Roster Self-Service GA (DC-AZC-ROSTER-GA-1)

  • N-week rotation patterns (1–4): CRUD, per-employee assign, forward-only anchors, suggest-fill preview/confirm with period mutex
  • Soll facade (EffectiveTargetHoursFacade v1) for ArbeitszeitCheck opt-in; sealed months ignore live drift
  • Peer Team week (default off), bilateral swap path sharing planner CAS apply, preferences (Früh/Spät bands), hard blackouts
  • Today board (“Wer ist wo?”) planner-only; Dienst & Team settings section (Bachus first-paint toggles)
  • Push quiet hours with bounded queue (200/user, 24h TTL); legacy companies default off, new companies on
  • ICS Mobile create/copy/rotate + global IP spray rate limit; Duty Mobile Bachus tabs Heute · Woche · Team
  • Security: IDOR on peer/Today/blackouts/swaps; no preference free-text; ICS token never logged

Security / architecture

  • Swap/bilateral apply is a single Duty DB transaction + assignment version CAS
  • Suggest confirm all-or-nothing under dc_period_locks
  • Quiet push queue bounded (Zeus FM-QH-01)
  • Cross-app: read-only facade only — no shared transactions / no AZC SQL on dc_*
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureTfnAr0/PSUVWURk8XpU+ceR7Oc79xPUKEq4WdyRnZInXH9WziuG0j/VewRVASMBxJrvj3tYLe/CLyLps4Be1/lQU96pb7lj7BkGuTYKp9IgFrpTObkByrh2WSEMFcX1+nu435zalccB5m1ZHRubMrWS/cZhPE/v0AZSN5YDCyRbbK1q0JnMlv6WryZpQaxD4VB/UFEN9XZjQstbSL61niOa3Ktm42ZZTXwQfS5lQQmmMZTGsUxsDmUaitErQ4CUt91pCyiv0YFl4+2zvljwnUZhdnrF72ZtBPJdt6oYJOryx4ULyIgXl4Ta2CkTiMoklJQzTZ1XLYqBfpcuc5fDNMW6Joz33t/jLlhUnZbHbXJiPm0nxwC+Ezkjfjo9AnP1k8vQq1nJHwpaNX0+3XOmjnB8bzCUTbQI7gLvzoqcnf/mku/PZg96fbrd0YbUx+m/5F1AdqlssqpSQ+EUkm390kwugKm0QsIgDRh6d4aKuJeWCJhrYa/d4vVOpZWYJQln+sajjnyMOOMGlsg7KuCKhuVoIFVhs2vA2rtg8UWIQnlTuQolcwXfsI7E8EgotkWNFVCegwOlQVuN7uQPSLWLADg0C5Elv/LqatPfsjW9WJEN9jdugAiX4TcqZZEdG8jI+bxkcfApGI8Y9v/mKj+puIvGfLscpxvVthPDjxYBabsM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<36.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.43
Release Details
UpdatedAug. 19, 2026, 12:53 p.m.
Changelog

Fixed

  • Translations: roster/catalog window status lines and “(opens in a new tab)” are translated in every shipped locale (de/fr/es/da/nl/it/pl/sv/nb/pt_BR), not left as English identity leftovers. Placeholders {from}, {to}, and {total} stay in the same order as the msgid.
  • l10n glossary alignment: corrected wrong translations and standardised button labels across all shipped locales to match the cross-app glossary.

Changed

  • Help, Support & Us / Get the App: WCAG 2.1 AA hardening and translated footer copy for all website footer locales.
  • CI: collapsed GitHub Actions to a single PHP syntax-only smoke job; full test suites stay local.
  • Nextcloud: max-version remains 34 (current stable 34.0.3).

Tests

  • l10n catalog integrity PHPUnit + JS contract; CI runs check-l10n-placeholders.php (including pt_BR and regional variants) and run-l10n-catalog-mutations.php.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureHR7/HJ1qwZVc/emlMefPbyVwzLJ5hh9c2eplO49JhOtYCpXku1XlYM51veyU3kcnVgWsdnxl6mNIgCZCjV99qZFych6Rd0DReGHPtAIN/65hvVQK5MbHz/T5g8F6P45aPYAjGQm2oJ4Oo7lpzG4rwJ3WOGZMUcPWw8JbbWpvfd/L1qSmh0/2oqz86zQKfJfM/zBZ+LR+QW2J7Bzu4xE2cvVfj0elxWsebBcRmth8HmtkTtvAdknmDO8zM7VyS91iHwcSVZ4LNtPq5Mt0xqVzqHZc3UKn6YTA/pNjnk8mhOeprpeRI5+NfH8OfgMZFB5z/slbyPRc9VR8nGSOd9DhpFR3mIUXJDvRaA4uHdQaPrgdsTTT2HQir4fnAKzdL3pHKe12/cPfbyhobZrzs7zGKzYeLF7Rli6wSv4Vll9a/72JRNudfydeQN4RnRAiKxy8t5OW6a8KzKbYoYUlYt9uXd4mKHKcJXSJBpamd1usuCxmL6tQ4JPGF4cLiEDB6HNMU90vfD8Uc7J0V65pJin/JVtSRm6bslB58nK+ZODW8R2vVMWUNbvaMDqKhQtxRBXacMtxYBNPR+XDFmUvgYZbOIij0c1GFoRAqeEnajcRCHJlEQzgLy01+PTcpRaAkZdFMK97AYxSa39/rrUgEsaap/m+kjz8WixPhjZ1VepCl0k=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.42
Release Details
UpdatedAug. 14, 2026, 3:42 p.m.
Changelog

Fixed

  • Language vs locale: DutyCheck now honours Nextcloud Language for UI text (lang, relative time, weekday names) and Locale for date order and first day of week. English UI with a Dutch locale no longer presents the interface in Dutch. The header shows Start of week from Locale, named in Language.
  • Translations: planning “period” is no longer translated as menstruation (Dutch menstruatie, Swedish mens, French règles, Italian ciclo). Empty-state copy uses the time-range sense in nl/fr/it/sv/pl. Work “shift” is no longer translated as displacement/change (Dutch verschuiving, Italian spostamento, French changement, Danish Kravskifte, Spanish turno de reclamo).
  • Speed: Periods, Dashboard pulse, Absences, and Roster GET no longer load a full conflict recompute for a button click. GET publish-readiness and roster reads use persisted conflicts; overlap checks group by employee; absence collisions are batched. Writes (assign/publish/close) still refresh.

Changed

  • Version lockstep 0.1.42. Nextcloud max-version remains 34 (current stable 34.0.3).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureBgCv0IbAWSH0kBQZFvYHDUxNqe+dGXaVY7fbKW9Arz8FW+04G5VxHa8lRcUQS2vqb+z4YPl1kLoeYYBqOiXKJvh4Tm71CIhqmpsAiGcNiGVEAFQE/SzBle0XohKyEqJgn3yFXSSXsmYpNdDAXBCrWwQt12AUfuXKbLC0LhWxSWx6Dx/pnwM/XhbbDRGw1AJC/eKP3XNMz5SfSc93SUnrM1bY5j+eaTbMKWsh8RvtiKiM0/waY6hAvWqKBtcq8Gx6tsj1j8I3+JRLVrynsSTaLXk1wD1yZi214wE63vzOsv3yW4TvXPlIS3cTsTRp9F/qArJ2AUFTtqH5TKZR+02qCxamm0MgXo/AxlVp54gBw8lEIy805b7T84Zl1yme4LJ5IA0VhUHkta0qoqQl3sLyx2Y3+quC2PsT+xg9FNXGTAdpYxgcK6qTpsegWtdKj75Y0BKsVf4WYp4rWjmlQdxfHxLZHNLR2UKyK49lhcr3vKMoYX8VeIO50A/wI4jQN7WiI+EQUdz532xxpYSfpUyJ+jIApA23QNhSBzZtd2KDN6Ar6B0w0HxzZRBEj+rwc0RZjxOBkrP48ZAmzly8SOaAgQWM4iwk9NI4jHII2AoSBNXaN1NR0K174SF5ViYGFLpKFG3opQn0tOIcWzA+hZZzFPIK0u4m3ODQx7/GUN6tsFQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.41
Release Details
UpdatedAug. 13, 2026, 6:17 p.m.
Changelog

Added

  • Brazilian Portuguese (pt_BR): UI catalog (l10n/pt_BR.json / pt_BR.js).

Fixed

  • Activity provider (NC 34): unknown / foreign activity events throw OCP\Activity\Exceptions\UnknownActivityException instead of \InvalidArgumentException, matching the Activity API contract.

Changed

  • l10n: locale catalogs refreshed for parity; tooling accepts pt_BR.
  • Nextcloud: max-version remains 34 (current stable 34.0.3).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturedoQYPv7ZPUv2NTBeQkqQkCd+0NHDKdHEPcOX2TA4ewSC+3lCJ8UDV1ADDFxW1Q7AeyfJMY5qHOm0st/AW9Qk11UnEq6A2Fn6R6+qhtCOk09wDjfbc3iyzqXRnqHFama9/8NA4KJ9uA71hmlkDZpOmTVAxdQjC/VsxrJiFnU3DFGPWAUh7Lrj8csypDE+QtDxkoyCOlw2YQQchA8SlXyyAVGYq1AUJUUiCyTNFEm0h8kyQo0UmgvXz+7DBKsaZEzuvMgQRbn1egichPYS15C+nBluWkIuUH9YR0DhgXz4RsgW6lcACehx9yca7rFPTtaWoFXnIGicDfsrbTttDz3GNvjz34v5Z6YwJgt5bAgQpyhMZ69Qe4U6sYbynROkDqh2M5BCwqM/eZakP60xb3+GTTC2UtTWjLf2RDTRqD96RFywUyojZp5i7r1oQbHnpgQVYMQi50FJjW5Gb/5PJRSe3oZv3MJDo0BRaivXLZf2CJAFoIK/bKi6j4fxxYh/UMsO/Ugdve/tRlVSO8cly2iE3mB97WuOK5ruCm/xEJ0VZw6Ri7KBLgeFDSu1YYrbJOw5Yz59b9HHsa9Gbp3CQUkYmDsTmCKULyVhXijbWdb+sBR8rGUafQGS/xDIBZvS3ACAxs7kvrzDFQS4EVxbqjiBZis/wjnr7rEIahPAugovsGA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.40
Release Details
UpdatedAug. 8, 2026, 11:24 a.m.
Changelog

Fixed

  • ArbeitszeitCheck integration “Sync now”: per-admin rate-limiter config keys no longer exceed Nextcloud’s 64-character oc_appconfig.configkey limit (full SHA-256 digest was producing 89-character keys and HTTP 400). Manual sync works again; background reconcile was unaffected.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureaiE9Y5JC0l6KbTkUeYLnVdZAdig7zzo0c11EuKI1gtesU31pOeI2gdomHjjFubov8NbQMK7N5kHK+ML4gZcncS5i38tl1JCA2scepRuECgCPHkAsRGsxsi6SxT7QqIxFh5DYJ9amAR/8PvYFIR7g+vNSX45fL/N788VVCLwH3djWdJ4odexZWw9osQtf3tdSPrEB47NcE+Mg6YNn0g8yP2IZNupvbR+qFL80YHBjElGH8urir8nugmZ+u6Akazo/R1v0u/ml74+Kqbu53lVpfRZUVDPvh8ikbnfSuwiUfyivExNgOlcbTHT6bpSQQYTgiOJVlq4BpiNXy3muYl37NXoasIezmgbZxA0DCVK15+VTFA/Ka1lh55yAC6yW3QwknU6Gki2Z1FMp2BTW+qt62amJCHgcOyVIdp6WHBj6K1/ShmylEZvAdzu02MBBZbygTsOY+WZc76BgZiq8LrSDc5PYW38TVhsr2cu9eYm4YpfQOo59f5qckRlwgEYja7wVUeFhgZ3sD1VKxN6auyCmiFjd3wjQQQJz8xrfSBClFfMh0fy/XsfHtb/tptvHZMr+Aw07bE1JQqxSNglD/lVTfHXxZn4Xke/y83y99i/1q4ebRbW62idafqM1df3xeXf40OBL4OR1xJ7AwQg0NKEHtc4h74HL+fkNYq1EaPLCNaM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.39
Release Details
UpdatedAug. 2, 2026, 12:13 p.m.
Changelog

Changed

  • German locales (de / de_DE): formal Sie-address and clearer duty-planning, period, conflict, and license copy.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignaturebZuKD1IG0BBvQjjgHLgMjTSakm4mRt8pfzCdlFX2OMmVoP5riYqPa3430Fe40RY/bU+sNEvd1hryBzGUiaZa+wvMxJjAmaBnxaka+XgB2aAi1jjNd0+hRKl16jEXy+7XPyIze+KtftlTcLJ9IAb+UtjiKH0otZ7VbrZLH2XPAKxMX+uYXXDexPJ6FAnD+vvp8mTeqyIqtrZRbE91/ozAck7jrMNMcdwOZlNkSwY+JPvXZC+e2UnLBErjZaRubfHVGhyNKfXKV0b2Z1cA5dCj3vz10EWD4NWNiSXTBEmlzo0SFtMv6a3c6dp83QEZC+JfZ4HmLzpfZP+9knS1PD6YLDC+HjtSRk92JOm1S6fBkYv1j0LhLZCTUV6ivRPWyc3xBGgCVcmdj6i+PkUOwUpAPz4pN1LsbGPEJ9/3PibZMjaant732dLxSFzlyQ2Y9ZuGeti37MjlXiZm5V7JR6CYZhu696WGdS3f973qPW2A53MHuQAOnEKMSL2dfdWpUagwWWwi+xkL8f4kCrsLjDJdDqms4gR5eLHDZTFfJ1E7UFV4K/9q227GyV4nIcvWyx/XMkdaaU3yVmkD7QSqIhYeB26wdDA2AIsG2vjLcmzDojXOw9SHEx4KLwwCbsbHoZA8Y/0ZgkfVORV1Wlx919L4VtaCV+z4+8228ZSWRjcxsuM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.36
Release Details
UpdatedJuly 31, 2026, 12:17 p.m.
Changelog

Accessibility / UX

  • Setup progress WCAG fix (NC34). Done-step checkmarks no longer paint --color-primary-element-text (white) on --color-success. On Nextcloud 34, --color-success is a pale surface (#D8F3DA) — white-on-success measured ~1.18:1 (fails 1.4.11). Done status now uses --color-success-text on the success surface with an --color-element-success ring (same contract as status badges).
  • One next step. Setup checklist collapses done rows, highlights only the current gate, and shows a single primary CTA. Misleading “each item links” copy removed. Quick start is suppressed while setup gates remain so onboarding is not duplicated.
  • E2E fixture proves done-status contrast ≥ 4.5:1 under live theme tokens; JS + CSS contract tests lock the ink token.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureSipgA321iKrSDI4Dfy8wUA5dsfHe4bu1ecbSNKwlUtd4oUfxxYzRNvBSuaPzE/KnXHWE8OHm+uSNT2dCMuyB7gAlK+G4a7M00D8HDaKdTjtXSDpiCEkq+a2XyrMPwVZ+y93fu//3hEjEJY6rnNivc+o1rmmhiyFpiWkorAXIQiJfsaBj25kiLzIDDBSXijNg4enct7/rE2vSuvup9dsHlz4GppYyoQAjED0ofkY9Im1W5M/V/VwcnQHW/eXoMzgcqoVMuoxq+fvvZizSb/n32t5i8jNy12nY/f00txgCGdo1XDqF/fRfk5WgSZ3sLlrXifnxl+PbMacCsVTmWRiGNU7xOG8r7vim2NKZElyF4ne8dNR5gdQLSSZjSpV4rsZNCX25fHW0pUNtfs1TMzeyUJ0XwMNncSkE6T9vDwEdKHByHzPi+9HyKL3w03XtxiXJ9F+ky5w+xg2nZtuEdfJYtQ0rfCyh/9WpoGZkeTeQ/QP40usj+BTBOEmwgEYUWlZB+IyP4KImgFPHm1/hi0fgv34SvN/TxFPetJFB4DIQWSC7Q8Ph2ba+IPWbhmWHMkELFAdsXp+Sk0FM9Bnqg8+3eZOfarpTGpz+juDigCLETgyGfH7EWxf5Z5g0WOR+6dA4tPFArQmgI3Lj4uIWE1aHQMqcazzTbMokQbMMTvV7v0M=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.17
Release Details
UpdatedJune 12, 2026, 3:01 p.m.
Changelog

Fixed

  • Data loss after Nextcloud upgrade: UninstallDropTables preserves tables and settings on disable; full cleanup runs only on app removal.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureEJ33U4A6NO62F6uTNsGR5NcfKZfQSZWx+Nd9XPJJDPGyN0xrPkF0ManLdQMGFTBkVyD3lCvKQaEzXSzzNCzYSer47u+XoaU5lIkhzp9sZpyRqQB5fCZ8aGspjN5ef5q68b88PCroC47RFJ9KRx7HxRbzrohFIRGaY3SuTTwCvzAJzB7nR+ZqiLxWjh8Lky8rqYTdcHsrXREEoqbLNsmYzEv55a+UEsKNtKSEXMFeNJaLOGwQ1vTMn/YssNP9qKiUAxqHz/zNcbObm4LRNeMa8nP9wn4QafwZ18b4lT+cPf25dhx5LVo5yWiOUwI2NHlq3pQlO2TfP71X8ZK9ppCeVDJuwTNjPmVViisC4tuRkIBQImvGo4JyhuaWy7w3lPGgTZ/OmSXjcRQbWzQovNCKosbtjFUxLCxkIeCp90A2MFeVYQtYLKMcF+GtFbfCZgpBPh0PU7NS/lIzz7wr/9pGSIZBdNtEKsRaPxixNpkgtutFLlrjMisvTYDWW14DNVbXPFcykwPok6n7OaYLoh6XNSXRorHOtVBazq9jDHuZ+r7FNmrVi6xuBmVIIGL0+m88COs8YDiV4OzWruWzxdoqDUlDo3cAAX6eJ6AcPnTjkR8z7zreU6MBZo+2ERbzP3O27lCd4VBt6lqXbpIMgg2dFFdCgPRRFiylU30HEuWYUTo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.6.0
DutyCheck 0.1.16
Release Details
UpdatedJune 4, 2026, 12:15 p.m.
Changelog

Fixed

  • Employee and location saves no longer hit the wrong URL or silently empty the list. js/common/api.js now resolves every app-relative path through OC.generateUrl for GET, POST, PUT, and DELETE (mutations previously skipped this and could 404 on hosts that require /index.php/). After a successful save, the Employees and Locations pages reload the catalog from the server instead of trusting a stale empty data array.
  • Updates use POST as well as PUT (/api/employees/{id}, /api/locations/{id}) so reverse proxies that block PUT still persist edits.
  • Incomplete database schema returns SCHEMA_NOT_READY (503) with a clear message instead of a generic failure when dc_employees (or other tables) are missing.
  • German translations for the dashboard “Setup progress” checklist and related setup strings (were still showing English on de / de_DE locales).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureAHjSrt70wVjM3dAiRSZTqSO2OUVL5JRm6UI6gq9k7u3bX0snutVB3nduAjOvF86qcSZqqm6H3SGSg1HxdzPZiYEdUY+RieAs0tcPFEl7T+tAw96Avwhjtce21qpd43rbozUMlS7+YIAPOm4dE96cBWko2h4+bPZ/xJDULNEq7hdB4ToDyBD06AltqOPE/SB70PxNj9otkGqfHXs00MtFkw8PXNR+5U8L/cZEpYrdz8DTM3/pTqfikFQgUKg8xftahnNcMFznxgr1sm+BKiGr6+MIZqSFkxZj5EAjbd0mNHOfXOgfnMpW8lNQzyalraWlhtcy1ozZDnteIKacxfLvKL/HlMscc8Rkvw6wi8tocf09QmQdNEacjCdCgtYo2qa+8Pzj7jFvXVBgzE7XtORxdv66EMiFJejox10FYOOmXjTqBttZ5nyKgP2q3O3UNcazoEDpS0/CSwY56nlB2Z5cTFx1TXdw058lqTBSb8U3pGne3gtgUCZJ63cwGJo3HybwWDNF7H2uF8i/kfYomukizZ775uH7AZb1mFZjmBne2B7hK+OStkr4xosf8Bfy9i3cWiRqoInKsusgLw05fAN7p7FZM9IOHLtb5Dm/tcyvtxNXCjDo9beKKMova3yQV0hsWvi6/Co4JZy8GfJ/LCJ3REWx7HC080CpEXnRS6J9uFE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.5.0
DutyCheck 0.1.15
Release Details
UpdatedJune 4, 2026, 9:10 a.m.
Changelog

Fixed

  • Install and upgrade path hardened. appinfo/info.xml now declares MySQL/PostgreSQL under <dependencies> (required by MigrationService for correct schema checks), and EnsureDutyCheckSchema runs on install and post-migration to recreate any missing tables and fail loudly in occ upgrade logs instead of leaving a half-installed app with no UI feedback. Schema repair uses OC\DB\Connection for MigrationService, matching core occ upgrade.
  • Dashboard setup progress. Planners see a persistent “Setup progress” checklist (schema, employees, locations, open period) with direct links until planning is possible; incomplete database setup shows a critical alert and an audible error message.
  • Integration and policy errors use targeted messages in messaging.js (peer app missing/disabled/too old, sync throttled, legacy absences, access list required) instead of a generic “Something went wrong”.
  • Settings integration load failures now surface via the shared error handler (toast + live region), not only a silent banner.
  • Navigation boot failures are logged to nextcloud.log instead of being swallowed in Application::boot().

Added

  • tests/Integration/UpgradeRepairIntegrationTest.php and EnsureDutyCheckSchemaTest to guard the production upgrade container path.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureRfEt6FaCWAPF9cETGyjaa/+WHc32uEZfhSxTS01SQZ5iccsk+m6su5eUR3AupxCOhkwYqDLyfaJMb/pzcOAA3bvK02VJbcT1n2OBHpk908FBU+A0S3erzWRJ220dqwz4ejy2efKNiFYzBkw25ittQGGDP+1oXiNCSxeW9socMne2tJ+lfHDIyTShi8/FxVt7arFSUourAlvv7JTRvtgvMeKNiNwQjkEdRK3b2eJkT+9jyluz2ocSDtMpzJ9p8PEl0Il6k+gRZajTXvKw7w314y0MBqFHceqUZhiSjZTkB4GvLZ5si6dDIZYFW/o8YYc7rHVU39aEDe+X2jEoJ5D4euMziQm2/9DcTfKOYRBSB04ZEj6F1uehR6D0poOyaWgszkSFjHNQwUqXo0x9sgDNuExe9/YzTHWIvJL91BtfpTK5c3wiNJAKIfYKkiY4TLG149aAvlqtLr/zdSgESmVCXtsh5mFAPQ7nUO6hP8z61l93ibO2bds+X7Fy7F7/TUmo+2MmM0cPkw2Z81+cQBQbVb9CexHAjEwEg40P3DFcpKt7OPEqStI2l5UPngxBDYRG0yj97e/pt00PSsjnEGPCgzW+JLj+Z/qbc9GQkkyxWz9GuEx/y7plQQ5TuqKgNW+eBpcSNDnVy3G5M9+rh9LiXBTvAlQNrDCpQVjUwwLkfSo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Databases MySQL
PostgreSQL
Minimum Integer bits32
PHP>=8.2.0,<8.5.0
DutyCheck 0.1.14
Release Details
UpdatedJune 3, 2026, 7:34 a.m.
Changelog

Fixed

  • Roster "Create assignment" form layout. On the tablet/desktop grid the start- and end-time fields were placed in columns 2–3, leaving a gap in the first column and pushing the break field out of alignment. Start now sits in column 1 and end in column 2, so the day/time row lines up cleanly with the rest of the form.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureYeA5OgPzR8/D7JGtC54EhgrT0KX3UgH1bwepI+l1Er3X0d9vmuxOga0YVacp0LfHoi0iQu2lUSpwD3D3Bex5TMv+NJgs75IUD4QtnLiOlVxMPaMhjqa/E4pynp/Hez7td0ipFRlEx3jZK0wbpQCOc9PRT8jLy6v4UlDKtaLDTNpeUXlPS+sCLadlSxva1duZmpubYhK2lWRBMeu+D+jKKovjVlL9icw7IbyW9IAQvz0k1zooa44PNuLXXDf2J+YOMbdO69uLpX6I8kn753PIvwv0G35X8byig5ddC82KPDwRMpK4ioklZNV8DBj1tH9n/LqYMeCZaJd8ZQ2+jVupbDgVc2aAkVXuTKzw1rLDEJZPkHXQovr7Y4wTfRlmMkeMJ6k61RiSyB/17izd742jEpBwFCTESXC93yCrmQG8SV61jSjngmhrGaWuJ1z8U+KaKjHAjDydfQnm+BTRHm6k2Qq2DjeG89XZdcMVDSDKf2WhUcoX0bK5iYOT7N163PIU7p8F2tl9EmXu1YPtNKVHWq6KEuSXdJ6wiPL0Xqb259S3JnCuajnmeXJSzhsWY3SxVwE8HCyFP2hIqq5OK5j49c8PZ9STzBdCyj2/xmNbN4fpGkEry2t14VAc2S3tGUzbgO1Ofki1Nv82u+eahToMFMsNYPM5QZOKJJCUc3hioUg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0,<8.5.0
DutyCheck 0.1.12
Release Details
UpdatedJune 1, 2026, 1:15 p.m.
Changelog

Changed

  • Mobile-first responsive layout. The stylesheet now builds up from a small-screen base (min-width: 480px / 768px breakpoints) instead of patching a desktop layout downward. Shell, cards, page header, filter and form grids reflow cleanly from phone to desktop, and overflow-x: clip prevents the stray horizontal scrollbar on narrow viewports.
  • Tables collapse to cards on small screens. Data tables render as stacked, labelled cards below the tablet breakpoint (row headers and data-cell labels) and switch back to a normal table on wider screens, keeping rosters and lists readable on phones (WCAG 2.1 AA reflow).
  • Tighter page header with a smaller icon and a dedicated actions area so primary actions stay reachable on mobile.

Security

  • Hardened CI workflow and refreshed the Composer lock file to pull in the patched Symfony release (CVE fix), keeping bundled dependencies current.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureQ1wPRBYiz2D5QfEj5/DXGly92+wz5D9px20DL65AMfMTwZiLNLShMBvwwbFe3DPsCMR2sw2cquQhRc24kMhb9snVGE9Dn5liksrHK3p5N6TRk+O7tgFipSd7B/Wr58B1OjyTpGgRI6H7Ypb1SLfe7gNUz3ojIrBVMXGWJ4AGgHi7xeH4AqQQZPVBiAUhBVDAGm19s+tLwy4Xv8di3pkuBn3CuR0wZqBuLUlSmoSEWicS3tl8y5mEAaXvGPPu1VxQzCxz9aKt3VDqnq7LJecxPv78vmT5v9a0LNK8L3OaC9OEdtGN1K24DNgwEdUNo9bCRzb2hhM6Asxv58eIHtcVQ5ekqG3boSOwVN1/9yAvupZq3OXruMtvq66TqHUuFFMtqt6/Cq4f1ONOxlPIovjpty+mPhmytCCkLUsYYT4z/e39JE/3icDCwEQADfS23jB4NzVhl/5PtwZzBM3HJ+oeAjmtzV1sRi1hUI2HPE8jj8voivCfWJGnEDekvQaQCbW+l8USCt8ylgIZGt/mKaxM1VAJ42A9f2QhN+q1z0S3tFYNp5qb4/EZAS9ffxuoKL/wZ8a6cXKTs/C/VvOQWzCpZFHnGymcj9lSuYipUuq24X/m3Sx9xcNErYmeQ7iiauzQ++hcJKlv2N8JOTt3OOINrh6QBaJ7arqGkmOE6a4lVPM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0,<8.5.0
DutyCheck 0.1.9
Release Details
UpdatedMay 29, 2026, 7:44 a.m.
Changelog

Fixed

  • Mutations no longer fail with an opaque REQUEST_FAILED after the CSRF token rotates. The shared API client (js/common/api.js) now transparently refreshes the request token from /csrftoken and retries a write once on 412 — the same recovery @nextcloud/axios performs for the rest of the Nextcloud frontend. This fixes "Add employee" (and every other create/update) failing on long-lived or multi-tab sessions, where the failure left no entry in nextcloud.log (CSRF rejections are handled in middleware and are never logged). Retrying is safe because a 412 is rejected before any database write occurs.
  • Clear, localized error messages (js/common/messaging.js): expired tokens/sessions now tell the user to reload, and internal codes (REQUEST_FAILED, INTERNAL_ERROR, …) are never shown raw. German translations added.
  • Editing or deactivating an employee whose linked Nextcloud account was deleted no longer fails. RosterService::updateEmployee only re-validates the linked account when it actually changes; an unchanged, now-missing link stays manageable so the record is never frozen. A new (or changed) link to a missing account is still rejected.

Changed

  • App Store listing copy refreshed for broader appeal (appinfo/info.xml: summary + long description, EN + DE).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureOd6OfM2NKgnHuG3faFhhFiGXlAJpJZy1hCJUWl1rriIUlcpQDgZV4heD1U2APILsDX2QjkOspiJdZdqdZ6azbjUuNKt6Eza9rOJOoO6/RH7SC86d2y1IaZ/skXkF81o/RnnF8/EejM+YcDPmm7GgM09WJB7tz8yHAlUYmHj6I+BrBsXB701/eNUouo6Ii2su3fggJ9wzpvohFZ/X43nhA7tZXFJg5w2ojrC7Exo2ybagydf78yR/fkebdL/n3CxyEgg4kwBB9sEFpWsb+ODcIj1htRYE/2JAqsHgvgP+SzOOGKAkIeLdeswqIlSzMX/4UdQoCpLT/I+6tOwd1Qyb9qzSCXuO4tMt6wLJUkA3VMsDu/Rgsh8OboZurilDUFSKGq1cCwaqgUUeLUHUADDfcCphy3JJN35oeRQwlIjAUSibA3i68I87XxiJYsLYj0H1pJ2NvIPuHcDJW7+0hGheOew8CCW0jxhrNAjQTGO73w6Zil09H+ML3u5vOvWNhUKo64JwJUwo93kdioaSKFsK76HCleK8BjRnhYjicQYyxrK5WG6BenzMbiZ/AhI2xmIrB362RTPJj04Xf8k3IMs3Hg2l6I1FA6WJRJpcFK+zFengK56heplwJH2+aaUyTkiWi2jUBHDZYLFrc1T5Jo67EEH8slx4VQQ0Jv3CCHUElME=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0,<8.5.0
DutyCheck 0.1.8
Release Details
UpdatedMay 25, 2026, 8:06 p.m.
Changelog

Added

  • Searchable IANA timezone picker on the locations page: js/common/timezone-picker.js with keyboard navigation, live filtering, and accessible listbox semantics; backed by TimezoneCatalog and a new read-only catalog API (CatalogApiController).
  • OCA\DutyCheck\Repair\UninstallDropTables wired in appinfo/info.xml so disabling the app drops all dutycheck tables, migration rows, and app config.

Changed

  • TimezoneCatalog: expanded IANA coverage and unit tests (TimezoneCatalogTest); roster/location flows use the shared picker instead of a plain text field.
  • Locations UI: timezone field uses the new picker component; styling in css/app.css for the combobox pattern (WCAG-friendly focus and contrast).

Bumped

  • Nextcloud max-version: 33 (latest stable major).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureJkhkknrJb+VN8C5EL94UUUGVP4kDm1j4xHH1Q0rNkAop3Bsifm+kHrdFhh9o8DdoPQK24XUF1d9XwIUB11g9eUo6eHoU+rghg6gvvZPyBoCpiWXjxLxQb5gNoK8oTwQXT5HdE69yPIQLMhTtOySuHMP+hgnGOiWBzuQyCWgElCXWSBPJ293neBG1h+CjQXJR0Ib7fNTssCCqKeUtSbs7HvluAhrtbK/GUTeWVx3gtkm+4pDCjBJpK6OgLytW1rPjrSSRvNvAgIj+ZZM30laRbLH4S0l5qfNKFQPu9o0bQ9yUc8PF881qitxFOQxqeMSrzfKjrKSIraKXPJTbvQQg6UaxQszsDROaRW94W/K0Sy+nl53vJCBzzuQI1n9YwJwga0fwSWhdc/Q47rw8C0rTQOmph6Y09IKU20p3gwhkXt98xegZ3/+F//0ikeQIvN52fTd8UsScPqjIkfFh8HUn4mmZwJdF9pH63SCXdgzzHMUrDHuqyovdVBvdPvHI6zr3cuc/ha1O4NOyYNd4wljjxMwyFaBhRN+QUNAXovStP/9ahffo5gccLQudbzbzQQuFfqsFqCjBA1Sr7bV9pF7gmzHI29oQYCYXSKb+b5gSLsskeR6sN7C9jiM4ELEGA6rZSn89N76EQxr3JM59JXksMXuZnqQv9JrQgqzGQPl8Cwk=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0,<8.5.0
DutyCheck 0.1.7
Release Details
UpdatedMay 21, 2026, 6:35 p.m.
Changelog

Fixed

  • App Store info.xml: use https:// for author homepage, website, and donation URL (matches ProjectCheck; store schema requires https://.+).
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEBDCCAuwCAhNHMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNTIxMTUxNTAxWhcNMzYwODI2MTUxNTAxWjAUMRIwEAYD
VQQDDAlkdXR5Y2hlY2swggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCn
WEE+B5fAWUDUcINdliOsuP7J3vd/roctHn3e0TBND7r6yrwLjxSQKYgNoWRAYJmC
jhDrZxv6kFyf09XtdABaEvKo4EZAUS3trqIlfBCbz3PLtVHiTB9NbuNhk4XssBAf
I2S3FXLj3Ygx88F/8I1T2n2XJ63uQBeYFjCf1uwx8wbaIv+mbfk3+uhkurCNTiav
3IsT8RM5rSkMApiShhPQOlgaM43d+TzxJG1dXwMTf3e8gZz5XH80fiKyP6gNfPLy
jbiNpG9WBCL/DsBWXL0pn+jUYO4lnyRrOS977Mqk1luOJGsPFWXaLSVOSvrdJDHd
R968uUoXtr8TcD9PxNE6fNd3Mhu28sGcn1V1QFtGTWonkYp8wDgnZPqJHw37Need
r442wrKbwmJqN6t+MSFklBLB/h0ExD1QBFNvRtpV+BVNseoK4spNszWvlXtfLFxx
3DwFPeg7dRqcHuD1BGLgG/LwD8dynwamKdNndbtF343vVVHKIfzcWpsua39MYO3W
SxwQBRN0lmlDGWYbypdNJzp+aSZzUDG/SxpqJDH7ylpBTaWtRiVJEiXY7/bZ+AXX
2CqYUad//oK5rvqkfODiPNBRVX7pniRpRb8Y7Y3lAJgE/4wpGzeYsfDVQCAjY76y
L/rg+w17xKDurZNOgawDQSzrkBbCizdj9RgaS+lVCwIDAQABMA0GCSqGSIb3DQEB
CwUAA4IBAQB4mchRZJvbcmIifarIimDO4nY+KO2F3/fE0Z21O27ppHqvk3dH6j6X
Gdy57dcmDrGYMOuFHRI5j+1Vlbn419xXqx2aG+cs/tojxdvaPyaRSC/IS7hhqz7B
oRagvxhPj46QRWyHmBA10OO+G9AWtlVlwezR+LbFiZ27oazTqNZKUNdlBMgmA/K2
T6lEw6/Zk+f3ipa0o9KSVukNOWGkhGJa324EQcgytizCyzSQeF+blffSsVDDVvcB
3z8x88iJSys4bmNqetVdiOnqysrCCr7DFMlSS2T1Ck8I6t2QkcBovoyrj6r20GtU
FH87CRYAmFQSgkEOElRTaAnCn6/CeBOl
-----END CERTIFICATE-----
SignatureXo+WBT9sAMGzkChMgF/s5FMbZ8/MaoikA2ShzvLJP4qrvWQPlkz2VCHAbuAj3rNGdMmYL+oaPpSAqaiCC6Rc4Siq/uB2X9pucYJecy49zGF/5870lCZUI/0P8RpYqUnh7DMeqSaDNF1jvIo63tttYTeqWy+IwZ0kENobidjuNlJyhd3Pnhk0joWuDYBIzhbkY5numH0Bz8yxerzoBlbFz9gyt9RsIbCPbkfB+2WjhLqt4tWKZSrngf0sG2XkL3nQ4tjvCGm/DW2heNlnd8VhptJniYzbWHIqzaMswoAgSuojnkONCurK583Xp9MHTEBn12h4olgBspiD8JRjE4W3oW1Ms+j21A4aDAdEydSY0UXSLWDsvYL4VHa+zs+cGUGr5eywRR7Rp/PqUu1wCBWaEQYwQaItC6P1kcDOqktTFMJsEUbq1t17EjDTENOoStHdTtxgnmNwgrQsS/6qT0rR44Ioqbmn+fUk9cpzzpArxqHQCjGfOYt2f1sq00e96Em/jFKrkd6t5b6QBD4YyG2gON0mwqP3IzZdDdmBiXM9toiPOzKSUgO5YyPrjF4uJYGRlAKcaWHIUbeVeE8jFiDuU5WeYpeialaodpdPlhqrqK7ghdcqpXI8RHjkkkCEk8b7+m98qzxZC01oV19IMfNe9x5bRQGmvBxbcUguxb0zB34=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<34.0.0
Minimum Integer bits32
PHP>=8.2.0,<8.5.0