Skip to main content

Folder Retention - Releases

← App details

Nextcloud 35

Folder Retention 0.9.0
Release Details
UpdatedOct. 7, 2026, 5:54 p.m.
Changelog

Preparation for the Nextcloud App Store.

Added

  • English is now the source language of the whole app (settings page, log, occ commands, background job messages); the German translation ships in l10n/de.json. npm run l10n builds the translation files and npm run l10n:check reports missing, orphaned or malformed translations.
  • Nextcloud 35 is supported (max-version="35"); the safety harness passes on Nextcloud 34.0.4 and 35.0.1.
  • App Store metadata: English name, summary and description with German variants, licence AGPL-3.0-or-later, website, issue tracker and repository.
  • README.md, SECURITY.md, this changelog, the LICENSE file and a CI workflow (bundle, JavaScript tests, translations, schema check of info.xml, test archive, PHPUnit on Nextcloud 34 and 35).
  • scripts/package.sh packs a reproducible release archive (fixed file times, sorted, owned by 0:0), checks versions, changelog, bundle and translations, leaves source maps out, and signs the release when the key and the certificate are present; scripts/certificate.sh creates the key and the certificate request.
  • Log retention: entries older than a selectable period (30 days to 5 years, default 1 year; app config log_retention_days) are removed after each daily cycle. Real deletions of files that still exist (in the trash bin or restored) stay, because a restored file starts its period from the restore. "First seen" entries of files that no longer exist are removed as well.
  • Deleting an account removes its log entries (its personal folder) and its work-space marking.
  • Optional deletion limit (emergency brake, app config deletion_limit, off by default): once a cycle has moved that many files to the trash bin, deletion halts until an admin resumes it on the settings page. Guards against a period set far too short on a large folder or a wrong server clock.
  • "Upcoming" tab next to the log: every file of every area that becomes due within 0, 7, 30, 90 or 365 days, by due day and folder (already due ones first), with rule, reference date and size – calculated live from the current rules, so a rule change shows at once. /api/preview takes folderId=all (at most 2000 files; the earliest are kept). The log stays the record of what the runs did; the last tab is remembered per browser.
  • Superseded simulated hits: a "would delete" entry that no longer applies is marked (new column superseded_at) and shown in a group of its own at the end of each day ("No longer applies"), with its own count and status filter. It is marked as soon as its rule is changed or removed, when a later run finds the file not due or deletes it for real, and after a cycle when the file is gone or only left in a trash bin. On update, entries whose rule has changed or been removed since are marked right away. The CSV export names them as well (status and column "Superseded").

Fixed

  • Error labels in the log were white on a light background and hard to read.
  • The check right before a deletion also compares size and etag, not only the modification time: a client can upload new content and keep the old mtime.
  • The same error or skip reason for a file is no longer added to the log on every nightly run; the existing entry moves to the latest occurrence.
  • The CSV export is streamed in blocks instead of being built in memory, so a large log no longer risks the PHP memory limit.
  • Log entries remember their area by a stable key (new column root_key): two Team folders with the same name, or a work-space account whose display name changes, no longer end up in one folder group of the log overview. /api/log/folders returns root per group and /api/log takes root together with folder. Entries written before keep grouping by path.
  • "Expand all" also opens the personal folders (their folder trees up to 50 accounts), and opens at least the first level of a folder too large to load at once.
  • The table of affected files no longer pushes the due date and size out of view when file paths are long.
  • When the preview has more matches than it lists, it lists the earliest due ones, not the first ones found.

Changed

  • Texts that are shared by the whole instance — system tag names, the log's rule labels and messages, lock reasons — are written in one fixed content language (app config tag_language). Existing installations keep German, so their tags keep their names; new installations use the instance's default_language if the app ships it (de_DE counts as de), or English. These texts come only from the app's own translation file, so forceLanguage and force_language cannot change them, and a broken translation falls back to English instead of failing. The settings page and occ follow the language of the user.
  • The log is grouped by day and, within a day, by folder, each with the number of files per status; a folder opens to its files. A status shown twice ("Would delete · Simulation") is shown once, the source of the reference date only when it is not the usual one, the date range sits behind "Date range", and the mode filter is gone (the status says it). New endpoints /api/log/days and /api/log/folders (needs from and to, at most 31 days apart), /api/log takes folder. The account that moved a file to the trash bin is shown under the file name.
  • Dates, sizes and sorting on the settings page follow the user's locale.
  • The rule objects in the API no longer carry label by themselves; the endpoints add it in the request language.
  • INSTALL.md is now an English administrator guide.
  • Author and links point to the public project on GitHub.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhRQMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTU1NzAwWhcNMzcwMTEyMTU1NzAwWjAbMRkwFwYD
VQQDDBBmb2xkZXJfcmV0ZW50aW9uMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEAnzLynpSEBJa06AAfp8xa4movJKc4Cw0VbgETT7M40WaPNaCcyfrbR/9b
x9TH5a9m/0FMLXtCITrkbwS9VCEo72IjgWL+hCTREhdSRbq6b6Br8XdPHXCCvkYx
5S7kwz56rGpkoaKlCfrFNxrJ5Tq2oU0xz4C+qP7Qj2wl8/emfkw2sYACN9vpkLG6
KqS5GV++jZ0nWeHNH29hhQ4H+UodJK0KS5Eby+YJ1vdmH//ESJqWIFVqVn1OF3en
1rfe1/Fsi+qooW5re10LSAVnC/XUBOfgwtuoDN9UmHzjvFVd61aZXAktj0vaiOgG
8aUs67xFx/ely6LmhaqUS1YGzwD2nMWD7DGoFb1j2Vm6oPt7gBsuVUCmG+WBM8R6
6xn39gomh2zzHEikt5zoWVvKPDtDut8t2fzD7Bv9yr4l/hVHf1f7rm6aWJYxVE5y
OEOMUD8buwSE6LTy8U+7KcWKia+qMGEf++rnSvZeZsZcoODnfbEvENAXy5sCpBTM
E/ORJ9zYWlIchuZkgS6wjSRFyQOhaFAGlMEO/4TGL8i0pcc7aANsp6hViujVo/+Z
0RIgpR3d26g9opCr2saDoOVA92XD26zqtvrC3L6z54NVsh3OGjC4BcyhaONFke/Z
Vf41+uSCOq9SNEqNawRau6SoK+K/L8UkPTH/mH5A+OUhh++JJd8CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAYpNHWANK+fhbAMvbjruDDPAgdp1S/Bfa7wLVCa7JG48x
g95TTiRS0WS8gtA1CNTYEqTlsQ+IV7Wo6l+Z2PIvbDlsbg4QE8X2Uhek+tbgJdGU
CUPGw66rRFsLhX0UflisngRekO0uqPg353odHgpmIe47pR2duJQSwmmTWfP6KHhJ
+oYRjdCMK6aXCPRNh4GgNpjE75xGcTEbqQHsoQqq6fJT5yKTJZG6ryKivU/mFVc/
Hr9aGr1nPvcQ6dU/1tLe9bjn4j8bFWko2cFKPtxwVEITwaUsS5HsLSOa/jNWd6s8
urvcctnECmSrFsbHXpbThsSZ87/40WaU40gsfngPxw==
-----END CERTIFICATE-----
SignatureWis/Vr+0GecGBItgAqfzeadVTO8EudcBAG0ljtp437eSC86wRNMPkNg4yuEBF8R1
tmHMRY4rDD8znXcVlVpMeUxFgLkNIlTKFzSuiq836BWzxCsvcKjURNaaY/bjXTAe
I86WaC9CRJT5g4GcxvkmA8Tj0fEMoBX1xp8SXoa/KG1392E/rikaZNF4U8LgTULs
5/cHvTvGTfCmhI2zS790hawAmBOM6Cfm36thxnU8ccbwQtcTnAdhE5oDX6bw8XgT
OI5IxQME919EGGMlT+GOTxZ4JL9f8uoq/F5nGPTisyAMYe2c3s1XDODftSe6y6xg
/PlHSsiPfS2Xpa0ZNll2V+//SGei96Cv8UwEYEzhVPfffY7VlISAN2TZS5EPVBxS
CfVLgbQ1GhUmnjDY90a/2A59e80ggNKo4sxdXmcDJ8S+aW6vxrShUmTlQ4FywCHy
pFF0o3EgthLcSx9SnQWMPlWXByggszKL4jxJmn8KYjegP2Csdgx27Ssc1kwFdyTM
BowrdDlACVlqzVpFAaPxLZPe7VMDL8R2aTumIXMeuMxLjmHpTO0biRROmt10YBbk
EY+aRFKXhsSyyI0F95+j6RaUZ7UT0kIJCQbVtyfU4zqOmzQvmIfPI/iMpEZx+M1T
bdVVysaD0BvmVpf287bC7GfzwY0YNlH4AVJtwuqin3o=
Signature digestsha512
Dependencies
Required Nextcloud versions >=34.0.0,<36.0.0
Minimum Integer bits32

Nextcloud 34

Folder Retention 0.9.0
Release Details
UpdatedOct. 7, 2026, 5:54 p.m.
Changelog

Preparation for the Nextcloud App Store.

Added

  • English is now the source language of the whole app (settings page, log, occ commands, background job messages); the German translation ships in l10n/de.json. npm run l10n builds the translation files and npm run l10n:check reports missing, orphaned or malformed translations.
  • Nextcloud 35 is supported (max-version="35"); the safety harness passes on Nextcloud 34.0.4 and 35.0.1.
  • App Store metadata: English name, summary and description with German variants, licence AGPL-3.0-or-later, website, issue tracker and repository.
  • README.md, SECURITY.md, this changelog, the LICENSE file and a CI workflow (bundle, JavaScript tests, translations, schema check of info.xml, test archive, PHPUnit on Nextcloud 34 and 35).
  • scripts/package.sh packs a reproducible release archive (fixed file times, sorted, owned by 0:0), checks versions, changelog, bundle and translations, leaves source maps out, and signs the release when the key and the certificate are present; scripts/certificate.sh creates the key and the certificate request.
  • Log retention: entries older than a selectable period (30 days to 5 years, default 1 year; app config log_retention_days) are removed after each daily cycle. Real deletions of files that still exist (in the trash bin or restored) stay, because a restored file starts its period from the restore. "First seen" entries of files that no longer exist are removed as well.
  • Deleting an account removes its log entries (its personal folder) and its work-space marking.
  • Optional deletion limit (emergency brake, app config deletion_limit, off by default): once a cycle has moved that many files to the trash bin, deletion halts until an admin resumes it on the settings page. Guards against a period set far too short on a large folder or a wrong server clock.
  • "Upcoming" tab next to the log: every file of every area that becomes due within 0, 7, 30, 90 or 365 days, by due day and folder (already due ones first), with rule, reference date and size – calculated live from the current rules, so a rule change shows at once. /api/preview takes folderId=all (at most 2000 files; the earliest are kept). The log stays the record of what the runs did; the last tab is remembered per browser.
  • Superseded simulated hits: a "would delete" entry that no longer applies is marked (new column superseded_at) and shown in a group of its own at the end of each day ("No longer applies"), with its own count and status filter. It is marked as soon as its rule is changed or removed, when a later run finds the file not due or deletes it for real, and after a cycle when the file is gone or only left in a trash bin. On update, entries whose rule has changed or been removed since are marked right away. The CSV export names them as well (status and column "Superseded").

Fixed

  • Error labels in the log were white on a light background and hard to read.
  • The check right before a deletion also compares size and etag, not only the modification time: a client can upload new content and keep the old mtime.
  • The same error or skip reason for a file is no longer added to the log on every nightly run; the existing entry moves to the latest occurrence.
  • The CSV export is streamed in blocks instead of being built in memory, so a large log no longer risks the PHP memory limit.
  • Log entries remember their area by a stable key (new column root_key): two Team folders with the same name, or a work-space account whose display name changes, no longer end up in one folder group of the log overview. /api/log/folders returns root per group and /api/log takes root together with folder. Entries written before keep grouping by path.
  • "Expand all" also opens the personal folders (their folder trees up to 50 accounts), and opens at least the first level of a folder too large to load at once.
  • The table of affected files no longer pushes the due date and size out of view when file paths are long.
  • When the preview has more matches than it lists, it lists the earliest due ones, not the first ones found.

Changed

  • Texts that are shared by the whole instance — system tag names, the log's rule labels and messages, lock reasons — are written in one fixed content language (app config tag_language). Existing installations keep German, so their tags keep their names; new installations use the instance's default_language if the app ships it (de_DE counts as de), or English. These texts come only from the app's own translation file, so forceLanguage and force_language cannot change them, and a broken translation falls back to English instead of failing. The settings page and occ follow the language of the user.
  • The log is grouped by day and, within a day, by folder, each with the number of files per status; a folder opens to its files. A status shown twice ("Would delete · Simulation") is shown once, the source of the reference date only when it is not the usual one, the date range sits behind "Date range", and the mode filter is gone (the status says it). New endpoints /api/log/days and /api/log/folders (needs from and to, at most 31 days apart), /api/log takes folder. The account that moved a file to the trash bin is shown under the file name.
  • Dates, sizes and sorting on the settings page follow the user's locale.
  • The rule objects in the API no longer carry label by themselves; the endpoints add it in the request language.
  • INSTALL.md is now an English administrator guide.
  • Author and links point to the public project on GitHub.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIECzCCAvMCAhRQMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTU1NzAwWhcNMzcwMTEyMTU1NzAwWjAbMRkwFwYD
VQQDDBBmb2xkZXJfcmV0ZW50aW9uMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEAnzLynpSEBJa06AAfp8xa4movJKc4Cw0VbgETT7M40WaPNaCcyfrbR/9b
x9TH5a9m/0FMLXtCITrkbwS9VCEo72IjgWL+hCTREhdSRbq6b6Br8XdPHXCCvkYx
5S7kwz56rGpkoaKlCfrFNxrJ5Tq2oU0xz4C+qP7Qj2wl8/emfkw2sYACN9vpkLG6
KqS5GV++jZ0nWeHNH29hhQ4H+UodJK0KS5Eby+YJ1vdmH//ESJqWIFVqVn1OF3en
1rfe1/Fsi+qooW5re10LSAVnC/XUBOfgwtuoDN9UmHzjvFVd61aZXAktj0vaiOgG
8aUs67xFx/ely6LmhaqUS1YGzwD2nMWD7DGoFb1j2Vm6oPt7gBsuVUCmG+WBM8R6
6xn39gomh2zzHEikt5zoWVvKPDtDut8t2fzD7Bv9yr4l/hVHf1f7rm6aWJYxVE5y
OEOMUD8buwSE6LTy8U+7KcWKia+qMGEf++rnSvZeZsZcoODnfbEvENAXy5sCpBTM
E/ORJ9zYWlIchuZkgS6wjSRFyQOhaFAGlMEO/4TGL8i0pcc7aANsp6hViujVo/+Z
0RIgpR3d26g9opCr2saDoOVA92XD26zqtvrC3L6z54NVsh3OGjC4BcyhaONFke/Z
Vf41+uSCOq9SNEqNawRau6SoK+K/L8UkPTH/mH5A+OUhh++JJd8CAwEAATANBgkq
hkiG9w0BAQsFAAOCAQEAYpNHWANK+fhbAMvbjruDDPAgdp1S/Bfa7wLVCa7JG48x
g95TTiRS0WS8gtA1CNTYEqTlsQ+IV7Wo6l+Z2PIvbDlsbg4QE8X2Uhek+tbgJdGU
CUPGw66rRFsLhX0UflisngRekO0uqPg353odHgpmIe47pR2duJQSwmmTWfP6KHhJ
+oYRjdCMK6aXCPRNh4GgNpjE75xGcTEbqQHsoQqq6fJT5yKTJZG6ryKivU/mFVc/
Hr9aGr1nPvcQ6dU/1tLe9bjn4j8bFWko2cFKPtxwVEITwaUsS5HsLSOa/jNWd6s8
urvcctnECmSrFsbHXpbThsSZ87/40WaU40gsfngPxw==
-----END CERTIFICATE-----
SignatureWis/Vr+0GecGBItgAqfzeadVTO8EudcBAG0ljtp437eSC86wRNMPkNg4yuEBF8R1
tmHMRY4rDD8znXcVlVpMeUxFgLkNIlTKFzSuiq836BWzxCsvcKjURNaaY/bjXTAe
I86WaC9CRJT5g4GcxvkmA8Tj0fEMoBX1xp8SXoa/KG1392E/rikaZNF4U8LgTULs
5/cHvTvGTfCmhI2zS790hawAmBOM6Cfm36thxnU8ccbwQtcTnAdhE5oDX6bw8XgT
OI5IxQME919EGGMlT+GOTxZ4JL9f8uoq/F5nGPTisyAMYe2c3s1XDODftSe6y6xg
/PlHSsiPfS2Xpa0ZNll2V+//SGei96Cv8UwEYEzhVPfffY7VlISAN2TZS5EPVBxS
CfVLgbQ1GhUmnjDY90a/2A59e80ggNKo4sxdXmcDJ8S+aW6vxrShUmTlQ4FywCHy
pFF0o3EgthLcSx9SnQWMPlWXByggszKL4jxJmn8KYjegP2Csdgx27Ssc1kwFdyTM
BowrdDlACVlqzVpFAaPxLZPe7VMDL8R2aTumIXMeuMxLjmHpTO0biRROmt10YBbk
EY+aRFKXhsSyyI0F95+j6RaUZ7UT0kIJCQbVtyfU4zqOmzQvmIfPI/iMpEZx+M1T
bdVVysaD0BvmVpf287bC7GfzwY0YNlH4AVJtwuqin3o=
Signature digestsha512
Dependencies
Required Nextcloud versions >=34.0.0,<36.0.0
Minimum Integer bits32