Skip to main content

Collectives Todos - Releases

← App details

Nextcloud 35

Collectives Todos 0.2.1
Release Details
UpdatedOct. 11, 2026, 2:41 p.m.
Changelog

Added

  • The admin settings screenshot as the sixth app store screenshot (<screenshot> entry in appinfo/info.xml), shown on the product page next to the last walkthrough step and in the README.

  • Prominent "Get it from the Nextcloud app store" call to action on the product page hero (plus a footer link), pointing at https://apps.nextcloud.com/apps/collectives_todos.

Changed

  • The README installation section now points to the app store (the app is published there) with the manual deployment kept as an alternative.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureedvRvIjx/6LToXBwB+QHid0lEDz+peoI2WFIXXJJjwV7xFHjVnXMFrpxxh16/dIoh8fEGehpMnxkY0f1mHRems9HhMVUORmNk3OYj4S+sStM0SlWurEpNXxPOjAHAGDMLiURYlrKbvml+vtzHl6RGrxhYUKG3csuw05EnnRE06AVNwXg4Hcq4fh2hyqkHlT92bjByc+/c2RPxKU8PROs8IdelKEE7HLpBZa3hTAMccqh8QgzEIZa32HAOk51sF5pOIbAf+X8TKh4yUkMMB3lY1KzP2AR3fpnCtpEE6oaBq+f0N9HELhjNCYemuw15SK+gVSoUwTz+JniVF6o5VML9bupl+l6Jn6WG2WRQ/keCJJof1CCTDXfmzg5mkWCHezyXT03V/zQ7WWkiF8/MjyRFKTRzG76YcRXRHrhwtdxe8gDnjQVWRYaDoAXeVxTlqlcOpImy5ZlFrt9CeVmnVxzM6x6woNgWIA8M7TVlflWHbeAZC27gM4S7mxCuJ7FNhw/GhRDSujdVD3LFgYrEgT5XeEKuasutl0nxIUOq3CQxMquHIetZ6pm9MPSLHyzhxpqaMKPmY6UvRTVYkAY/uhmOQDug6BfwRUeM2BemFz2tDFbYzpLixpC2UGuBj4hIc2LwEJ3eSO19Fz46XiqBfqaH7Yd659PnQ+096Jj2m0DKDs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.2.0
Release Details
UpdatedOct. 11, 2026, 2:17 p.m.
Changelog

Added

  • Support for Nextcloud 35: the supported range is now Nextcloud 27–35, and the functional test test rig boots nextcloud:35-apache by default.

  • One-command local verification: tests/functional/test-rig.sh verify boots the newest supported Nextcloud, installs Collectives and the local working tree, seeds the fixture collective, runs the smoke checks and the PHPUnit suite, and leaves the server running at http://127.0.0.1:8080 (admin/admin) for manual verification when everything is green. When reusing an already-running container, it redeploys the current working tree and re-applies the English language defaults first.

  • The functional test rig now defaults to English (default_language/default_locale set to en/en_US, likewise for the admin user) and seeds every fixture page with a fitting emoji via the Collectives setEmoji API; the smoke checks assert those emojis and the Todos page emoji.

  • Continuous integration: .github/workflows/tests.yml runs the test rig smoke checks and the PHPUnit suite against the newest supported Nextcloud on every PR and push to main.

Changed

  • The default Todos page emoji is now 📝 (previously none). Existing instances without a stored setting pick it up on the next regeneration of a Todos page; the emoji stays configurable instance-wide and per collective, and empty still means no emoji.

  • tests/run.sh downloads phpunit.phar (pinned to 13.4.1, sha256-verified) into the container automatically when it is missing, instead of aborting.

  • The app store and product page screenshots are now a five-part step-by-step walkthrough of the flow (Todos page, source page, tick, synced regeneration), replacing the four earlier screenshots, and the product page (www/) embeds a demo video (www/screenshots/demo.mp4) that plays as you scroll.

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureJzuRSTWBNn8sqEbuJPy6xtam9PkpPFHvAHU1QL5B0jrqG5F2xcOjPqkOv1V5YP5IWO5LmlAbSPueMkDjFumlq30WYtbdxUbIAyqz9XFDXXNUuSPgRay03u8pPxaiy6rzeTlSTJJ9L3Wt+Nk14111OSVTNkwNMQQsbvARIdieBwMw/9iwetigBdvdxnebPlVLDuWNVOeyC4NT5l/POp1S8ZhF9JWxQ27PDSY3GH3z7KsHtAfCo0XJEk8WAGgXF2/0RxLnBrNYLFUNJhYkh96QAE+0Xb1qq0e44yL+8Xw3Ym8SI6pCIo+Ula1EKJILprkpvr/YTR1uIiSCd1l5FylPuNfbohA60A7Y3LxvXR3bFY2d/BJzf8rh8FbdyS9vvcrC8WlhxaRTSM5UumzRwzFZ18Ng546N0nxZIfMApALDxGEC2kTGPX+ndikdToIb821ZkvOD3Dr7DY0C/89WHasQX1ddHEVNNrY7ED/c0LruVUXxNHHN64ojMseJbAZvBdqm//g9mA8JZWgY0AA7XA95Q3kDvUxZCi9rY6f5Hlxmfy+YfgwmmUHN/F0Agfdpyb1N0akNb3r4c8nbgUF1xAUyrLYWhB0/55H4C3SLKfZmgK2PiD6iHabO07FgTrmVSkwBM34V3RnDeP+VjZ1BRpOd9bnd7lfulNAyzcbbMU2WDXM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32

Nextcloud 34

Collectives Todos 0.2.1
Release Details
UpdatedOct. 11, 2026, 2:41 p.m.
Changelog

Added

  • The admin settings screenshot as the sixth app store screenshot (<screenshot> entry in appinfo/info.xml), shown on the product page next to the last walkthrough step and in the README.

  • Prominent "Get it from the Nextcloud app store" call to action on the product page hero (plus a footer link), pointing at https://apps.nextcloud.com/apps/collectives_todos.

Changed

  • The README installation section now points to the app store (the app is published there) with the manual deployment kept as an alternative.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureedvRvIjx/6LToXBwB+QHid0lEDz+peoI2WFIXXJJjwV7xFHjVnXMFrpxxh16/dIoh8fEGehpMnxkY0f1mHRems9HhMVUORmNk3OYj4S+sStM0SlWurEpNXxPOjAHAGDMLiURYlrKbvml+vtzHl6RGrxhYUKG3csuw05EnnRE06AVNwXg4Hcq4fh2hyqkHlT92bjByc+/c2RPxKU8PROs8IdelKEE7HLpBZa3hTAMccqh8QgzEIZa32HAOk51sF5pOIbAf+X8TKh4yUkMMB3lY1KzP2AR3fpnCtpEE6oaBq+f0N9HELhjNCYemuw15SK+gVSoUwTz+JniVF6o5VML9bupl+l6Jn6WG2WRQ/keCJJof1CCTDXfmzg5mkWCHezyXT03V/zQ7WWkiF8/MjyRFKTRzG76YcRXRHrhwtdxe8gDnjQVWRYaDoAXeVxTlqlcOpImy5ZlFrt9CeVmnVxzM6x6woNgWIA8M7TVlflWHbeAZC27gM4S7mxCuJ7FNhw/GhRDSujdVD3LFgYrEgT5XeEKuasutl0nxIUOq3CQxMquHIetZ6pm9MPSLHyzhxpqaMKPmY6UvRTVYkAY/uhmOQDug6BfwRUeM2BemFz2tDFbYzpLixpC2UGuBj4hIc2LwEJ3eSO19Fz46XiqBfqaH7Yd659PnQ+096Jj2m0DKDs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.2.0
Release Details
UpdatedOct. 11, 2026, 2:17 p.m.
Changelog

Added

  • Support for Nextcloud 35: the supported range is now Nextcloud 27–35, and the functional test test rig boots nextcloud:35-apache by default.

  • One-command local verification: tests/functional/test-rig.sh verify boots the newest supported Nextcloud, installs Collectives and the local working tree, seeds the fixture collective, runs the smoke checks and the PHPUnit suite, and leaves the server running at http://127.0.0.1:8080 (admin/admin) for manual verification when everything is green. When reusing an already-running container, it redeploys the current working tree and re-applies the English language defaults first.

  • The functional test rig now defaults to English (default_language/default_locale set to en/en_US, likewise for the admin user) and seeds every fixture page with a fitting emoji via the Collectives setEmoji API; the smoke checks assert those emojis and the Todos page emoji.

  • Continuous integration: .github/workflows/tests.yml runs the test rig smoke checks and the PHPUnit suite against the newest supported Nextcloud on every PR and push to main.

Changed

  • The default Todos page emoji is now 📝 (previously none). Existing instances without a stored setting pick it up on the next regeneration of a Todos page; the emoji stays configurable instance-wide and per collective, and empty still means no emoji.

  • tests/run.sh downloads phpunit.phar (pinned to 13.4.1, sha256-verified) into the container automatically when it is missing, instead of aborting.

  • The app store and product page screenshots are now a five-part step-by-step walkthrough of the flow (Todos page, source page, tick, synced regeneration), replacing the four earlier screenshots, and the product page (www/) embeds a demo video (www/screenshots/demo.mp4) that plays as you scroll.

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureJzuRSTWBNn8sqEbuJPy6xtam9PkpPFHvAHU1QL5B0jrqG5F2xcOjPqkOv1V5YP5IWO5LmlAbSPueMkDjFumlq30WYtbdxUbIAyqz9XFDXXNUuSPgRay03u8pPxaiy6rzeTlSTJJ9L3Wt+Nk14111OSVTNkwNMQQsbvARIdieBwMw/9iwetigBdvdxnebPlVLDuWNVOeyC4NT5l/POp1S8ZhF9JWxQ27PDSY3GH3z7KsHtAfCo0XJEk8WAGgXF2/0RxLnBrNYLFUNJhYkh96QAE+0Xb1qq0e44yL+8Xw3Ym8SI6pCIo+Ula1EKJILprkpvr/YTR1uIiSCd1l5FylPuNfbohA60A7Y3LxvXR3bFY2d/BJzf8rh8FbdyS9vvcrC8WlhxaRTSM5UumzRwzFZ18Ng546N0nxZIfMApALDxGEC2kTGPX+ndikdToIb821ZkvOD3Dr7DY0C/89WHasQX1ddHEVNNrY7ED/c0LruVUXxNHHN64ojMseJbAZvBdqm//g9mA8JZWgY0AA7XA95Q3kDvUxZCi9rY6f5Hlxmfy+YfgwmmUHN/F0Agfdpyb1N0akNb3r4c8nbgUF1xAUyrLYWhB0/55H4C3SLKfZmgK2PiD6iHabO07FgTrmVSkwBM34V3RnDeP+VjZ1BRpOd9bnd7lfulNAyzcbbMU2WDXM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.1.1
Release Details
UpdatedOct. 10, 2026, 4:24 p.m.
Changelog

Added

  • App store screenshots: four screenshots of the Todos page (committed under screenshots/) are published to the Nextcloud app store via <screenshot> entries in appinfo/info.xml and shown in the README.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureX6hXrUQappIKfeUJ6GkiJtl2ppUFX1UlIti3j/FKOaiCJznrqgJO/8jx2/ndDGWEsONVQObbwhK7G7nPxVejfx/nJ2Y2wnoLd+kzBXF86KyOuEz/1uhNZPf0VK38QtAOeSknBu5vRQ0sCWOTkC+lOSumWPjksH3jjK6GkxM0RwbWz3TmxxMPzbYJho9nXmhNK6n+sKsGvEf83OCAd4ishrJnoqWqpp3P6Tnwhw/HyUQww1X+kPykcmibFSyWpSgfHY/A4ojqrIMVE13r0O0T4odCttEo0fOat5O9uJLSrjZezlzKxOydANssKcbuIbcth3hJZa7H2q3FsdYB8LaClrMaizc/dLvACKfh1jK3qPWEfAWcj6nLLAv16v6FeZX88JklWibGPUpHgLurjfjp3pF8gnmbFjNFdDbLavsrFFXwNClb8wxf7NCFqATcxaCApVp/iS+5vnwIRag4+mIWw+phDHgo3+PNJD4Nt2ungW7YMJa41DXk1Bkrwbc8ylCuvdVKdBP3XrnNJeS1LpUnLf3/zXOtCNmK+KAcEJ2ClEoYKPvnoUN2SO0nXBcpGk7U38eumPeIps6ZE2dkeQ/NiiDQEMsxOrjF+N5sWyXGR58+5qDAIKGb919jjAVbO1p0T9wCkRXtMNDyq4z3WzlJHKCwEUk926aFgwKf5svT0K8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32
Collectives Todos 0.1.0
Release Details
UpdatedOct. 7, 2026, 6:31 p.m.
Changelog

Added

  • Initial release of Collectives Todos: event-driven aggregation of markdown checkboxes across all pages of a Collectives into an auto-maintained Todos page, using Nextcloud core file events, a JSON cache for efficient updates and a CLI command (occ collectives_todos:init <collectives-id>) to build the page for existing collectives. Unit tests cover all core services and listeners.

  • App store release packaging: a GitHub Action (.github/workflows/release.yml) builds a store-conformant collectives_todos-vX.Y.Z.tar.gz (single top-level folder named after the app id, dev files excluded) on every v* tag, signs it with the app certificate and attaches archive and signature to the GitHub release. Tag and app version must match, and appinfo/info.xml is validated against the app store schema. With the APPSTORE_TOKEN secret set, the release is also published to the Nextcloud app store automatically.

  • Per-collective Enable/Disable button in the settings page's per-collective table. Disabling deletes the collective's Todos page (to trash) and stops generating or reverse-syncing it; the checkbox cache keeps being maintained, so enabling regenerates a consistent page immediately. Enabled is the default.
  • Global Enable/Disable button in the settings page's Defaults section: flips the instance-wide default. Enabling resets every collective to enabled - it clears all per-collective enabled opt-outs and regenerates their Todos pages, since opting into the app means wanting it everywhere; disabling single collectives stays the manual choice. Disabling globally deletes the Todos page of every collective that is not already opted out.
  • The per-collective Enable button clears the collective's enabled override instead of writing a sticky enabled value: a sticky override would shield the collective from the global default toggle forever, so a global disable reliably deletes every Todos page of collectives that were not explicitly disabled. The per-row Enable buttons render as inactive while the global default is disabled. Deleting the Todos page on disable now also removes its collectives_pages row (the delete is a hard delete on the appdata path, which the Collectives trash does not handle; the managed page's content is fully derived, so nothing of value is lost). The row is resolved untrashed and deleted directly: Collectives' PageMapper::deleteByFileId only removes rows that were moved to trash and silently ignored the hard-deleted page's row, leaking one on every disable cycle.
  • Todos page emoji config item (default none, per-collective override): the emoji is written to the Todos page's collectives_pages row like the emoji of any other Collectives page and rendered in the page tree. Validated with the Collectives app's own emoji validation; the settings page ships a curated emoji picker built with plain HTML/JS (no new dependencies), and any emoji can be pasted directly. The emoji is enforced on every Todos page regeneration and on settings save.
  • Admin settings page (Settings → Admin → Collectives Todos) with instance-wide defaults and per-collective overrides for three config items: the Todos page name (default Todos), the position of the Todos page in the Collectives page tree (always on top / always on bottom / alphabetically, default always on top) and the maximum number of cached checkboxes per collective (0 = unlimited, default 0). An empty override field uses the default. Invalid input is rejected without storing anything.
  • The tree position is enforced by writing the landing page's collectives_pages.subpage_order (the Collectives frontend sorts listed pages by array order, unlisted pages alphabetically), on every Todos page regeneration and on settings save. Manual ordering of the other pages is preserved; an already-open Collectives tab needs a reload to pick up the new order.
  • Changing the Todos page name renames the existing Todos page file; if a page with the new name already exists in a collective, the rename is skipped and reported on the settings page.
  • When the checkbox limit is reached, further checkboxes are not cached and the Todos page renders a *(list truncated by the settings limit)* note under the affected page's section.
  • Bidirectional checkbox sync: ticking or unticking a checkbox on the Todos page now also updates the checkbox on the source page it was aggregated from. Sections of the Todos page are resolved to source pages by the page file id in the heading link URL (title as fallback), and checkboxes are matched by text within a section. Only checked-state changes are synced; text edits on the Todos page are discarded with the next regeneration. If the cached line number of a checkbox has drifted, the checkbox is located by a unique text match, otherwise the change is skipped and a warning is logged.
  • Page headings on the Todos page are now links to the corresponding page, in the same URL format the Collectives app itself uses (/apps/collectives/<collectives>/<slug>-<pageId>, with a ?fileId= fallback for pages without a slug). If the URL cannot be resolved, the plain heading is kept.
  • Regenerating the Todos page while the Text editor had it open caused stale content to be shown and "Error saving the document" on manual saves: the Text app keeps per-file session state (etag, checksum, editor steps) that our background write invalidated. The Text document state of the Todos page is now reset on every regeneration, so open editors reload the fresh content. Unsaved manual edits to the Todos page are discarded by design.

Changed

  • Minimum Nextcloud version raised from 25 to 27 (the admin settings controller uses the AuthorizedAdminSetting attribute introduced in 27).
  • appinfo/info.xml brought into the form the Nextcloud app store validates: added the required <summary>, renamed <license> to <licence> and <depends> to <dependencies>, and dropped the <app>collectives</app> element (not part of the store or server schema, so it was never read; the Collectives dependency is enforced at runtime via IAppManager). No runtime behavior changes on servers already running the app.

Fixed

  • Reverse-syncing a tick made in the Collectives editor: the Text editor strips trailing whitespace on save, so a Todos page checkbox whose source line ends in spaces no longer matched the cached source text and the tick was silently dropped. Checkbox texts are now trimmed when parsed, and the reverse sync also tolerates untrimmed legacy cache entries.
  • Deleting the Todos page recreates it immediately. Collectives moves deleted pages to trash; the trash move is complete before the delete event fires and collectives paths are never locked, so no delayed recreation is needed.
  • The emoji of a freshly (re)created Todos page is now really written: inserting the missing collectives_pages row failed because its last_user_id column is NOT NULL. The app-created row now carries an empty user id (the frontend hides the "last edited" info for such pages), like untouched pages.
  • Deleting a page did not clean up the Todos page: the deleted page's section and checkboxes stayed listed. A Collectives page is a folder (the index page is its Readme.md, subpages are further files in it), and deleting it only emits a filesystem event for the folder itself - the markdown files inside vanish without their own events. A new listener for BeforeNodeDeletedEvent now collects the markdown pages under a folder before it is deleted, removes them from the cache and regenerates the Todos page. Plain .md file deletes keep their previous cleanup path. Restoring a page from the Collectives trash does not re-add it to the Todos page until the page is saved again or collectives_todos:init runs.
  • After ticking a checkbox on the Todos page, the source page briefly showed the tick and then reverted to its old content, with the editor refusing saves ("File changed in the meantime from outside"): the Text app keeps per-file session state (etag, checksum, steps) also for source pages, and the reverse sync's external write desynced it. The Text document state of a source page is now reset when the reverse sync writes it, so the page loads with the synced state and saves work. Unsaved keystrokes in an editing session open on that page at that moment are discarded (same contract the Todos page already has).
  • Checking a checkbox on the Todos page and saving broke the editing session: the reverse sync's regeneration of the Todos page ran nested inside the save and rewrote the page with a fresh "Last updated" timestamp, changing the etag under the open editor ("Error saving the document", conflict diff prompts). The Todos page is now only rewritten when its content actually changes (checkbox states, pages, titles); an update that would only refresh the "Last updated" timestamp leaves the file - and open editing sessions - untouched.
  • App bootstrap was silently skipped: info.xml declared the full namespace (OCA\CollectiveTodos), which Nextcloud prefixes with OCA\ itself, so no class of the app was autoloadable. The namespace is now CollectiveTodos.
  • Application.php moved from appinfo/ to lib/AppInfo/ (PSR-4 location that the bootstrap looks up).
  • CLI command is now registered via info.xml <commands> (previously the occ command never showed up).
  • Todos page is now written to the collectives root folder (previously it was written next to the edited page).
  • Page titles for Readme.md pages now use the page folder name (Collectives stores a page as folder with a Readme.md inside).
  • The listener skips its own Todos.md writes to avoid an infinite write-event loop, and logs failures instead of breaking saves.
  • collectives_todos:init now scans all pages of a collectives and accepts the collectives id as used by the Collectives app.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignaturetOPFL+uJkvXf4IYYON0b0T+MahYmk+Sga4NLaCPjTbv+nUklqi4DBjxNPKZEFLSHW+e7b6A2wR+uL+ugBCy9IWjJHfe35JVt1g/06s28dnXkm6nrod3AtPk4DgrZ2HHrDgPo86K4iIW2KIeW+IMbT1iKhYLQ9mGq3YcBPPtDgWzNjbpLid+PcGtxcPn8+E6GuOkrN6YbKuNkkdhL6UGuuqlHFYw7bVzDN41shzSaMYrUBmZUXXl/5ZnbnewEgiGZf6wsobuxQZ6uLqNjl9yKBvA85quuhBcnEHL0L+aFZn0xTuX8YFxvVmrx9iO8m24luzzSys35L/PL9W2l7m+w4MOX5zTIKkx+q8ExR8PtZBYOZqhaUPcZZwYLHFvJUlGL80LOPil51hn0qrsOUdJCd5yZqcoLoZxbBFKj1njokd7cTb8ZNPbw/lYsMnp8JCp4ldTTVLE/+P3U4p7aG1lbOIP33zMzOz6R+oF3w3xuNlT6QFRjvztbXzLohaj2fuTx3rVuraaztowQk9tLSqFiuRbMh5KHv3n9BFAuijyR9mfaPwJpEnKD0u0nKJmb2oIAkrwviHjYJR1xUbNsiZHbEQOpW2UMy0+5wvE++zGGCX+c3p9lRFqN00+KO1RNosmEOnmd/st12hZowjR+oayERlBKLUBXXxgO7h4/MIUHqYs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32

Nextcloud 33

Collectives Todos 0.2.1
Release Details
UpdatedOct. 11, 2026, 2:41 p.m.
Changelog

Added

  • The admin settings screenshot as the sixth app store screenshot (<screenshot> entry in appinfo/info.xml), shown on the product page next to the last walkthrough step and in the README.

  • Prominent "Get it from the Nextcloud app store" call to action on the product page hero (plus a footer link), pointing at https://apps.nextcloud.com/apps/collectives_todos.

Changed

  • The README installation section now points to the app store (the app is published there) with the manual deployment kept as an alternative.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureedvRvIjx/6LToXBwB+QHid0lEDz+peoI2WFIXXJJjwV7xFHjVnXMFrpxxh16/dIoh8fEGehpMnxkY0f1mHRems9HhMVUORmNk3OYj4S+sStM0SlWurEpNXxPOjAHAGDMLiURYlrKbvml+vtzHl6RGrxhYUKG3csuw05EnnRE06AVNwXg4Hcq4fh2hyqkHlT92bjByc+/c2RPxKU8PROs8IdelKEE7HLpBZa3hTAMccqh8QgzEIZa32HAOk51sF5pOIbAf+X8TKh4yUkMMB3lY1KzP2AR3fpnCtpEE6oaBq+f0N9HELhjNCYemuw15SK+gVSoUwTz+JniVF6o5VML9bupl+l6Jn6WG2WRQ/keCJJof1CCTDXfmzg5mkWCHezyXT03V/zQ7WWkiF8/MjyRFKTRzG76YcRXRHrhwtdxe8gDnjQVWRYaDoAXeVxTlqlcOpImy5ZlFrt9CeVmnVxzM6x6woNgWIA8M7TVlflWHbeAZC27gM4S7mxCuJ7FNhw/GhRDSujdVD3LFgYrEgT5XeEKuasutl0nxIUOq3CQxMquHIetZ6pm9MPSLHyzhxpqaMKPmY6UvRTVYkAY/uhmOQDug6BfwRUeM2BemFz2tDFbYzpLixpC2UGuBj4hIc2LwEJ3eSO19Fz46XiqBfqaH7Yd659PnQ+096Jj2m0DKDs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.2.0
Release Details
UpdatedOct. 11, 2026, 2:17 p.m.
Changelog

Added

  • Support for Nextcloud 35: the supported range is now Nextcloud 27–35, and the functional test test rig boots nextcloud:35-apache by default.

  • One-command local verification: tests/functional/test-rig.sh verify boots the newest supported Nextcloud, installs Collectives and the local working tree, seeds the fixture collective, runs the smoke checks and the PHPUnit suite, and leaves the server running at http://127.0.0.1:8080 (admin/admin) for manual verification when everything is green. When reusing an already-running container, it redeploys the current working tree and re-applies the English language defaults first.

  • The functional test rig now defaults to English (default_language/default_locale set to en/en_US, likewise for the admin user) and seeds every fixture page with a fitting emoji via the Collectives setEmoji API; the smoke checks assert those emojis and the Todos page emoji.

  • Continuous integration: .github/workflows/tests.yml runs the test rig smoke checks and the PHPUnit suite against the newest supported Nextcloud on every PR and push to main.

Changed

  • The default Todos page emoji is now 📝 (previously none). Existing instances without a stored setting pick it up on the next regeneration of a Todos page; the emoji stays configurable instance-wide and per collective, and empty still means no emoji.

  • tests/run.sh downloads phpunit.phar (pinned to 13.4.1, sha256-verified) into the container automatically when it is missing, instead of aborting.

  • The app store and product page screenshots are now a five-part step-by-step walkthrough of the flow (Todos page, source page, tick, synced regeneration), replacing the four earlier screenshots, and the product page (www/) embeds a demo video (www/screenshots/demo.mp4) that plays as you scroll.

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureJzuRSTWBNn8sqEbuJPy6xtam9PkpPFHvAHU1QL5B0jrqG5F2xcOjPqkOv1V5YP5IWO5LmlAbSPueMkDjFumlq30WYtbdxUbIAyqz9XFDXXNUuSPgRay03u8pPxaiy6rzeTlSTJJ9L3Wt+Nk14111OSVTNkwNMQQsbvARIdieBwMw/9iwetigBdvdxnebPlVLDuWNVOeyC4NT5l/POp1S8ZhF9JWxQ27PDSY3GH3z7KsHtAfCo0XJEk8WAGgXF2/0RxLnBrNYLFUNJhYkh96QAE+0Xb1qq0e44yL+8Xw3Ym8SI6pCIo+Ula1EKJILprkpvr/YTR1uIiSCd1l5FylPuNfbohA60A7Y3LxvXR3bFY2d/BJzf8rh8FbdyS9vvcrC8WlhxaRTSM5UumzRwzFZ18Ng546N0nxZIfMApALDxGEC2kTGPX+ndikdToIb821ZkvOD3Dr7DY0C/89WHasQX1ddHEVNNrY7ED/c0LruVUXxNHHN64ojMseJbAZvBdqm//g9mA8JZWgY0AA7XA95Q3kDvUxZCi9rY6f5Hlxmfy+YfgwmmUHN/F0Agfdpyb1N0akNb3r4c8nbgUF1xAUyrLYWhB0/55H4C3SLKfZmgK2PiD6iHabO07FgTrmVSkwBM34V3RnDeP+VjZ1BRpOd9bnd7lfulNAyzcbbMU2WDXM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.1.1
Release Details
UpdatedOct. 10, 2026, 4:24 p.m.
Changelog

Added

  • App store screenshots: four screenshots of the Todos page (committed under screenshots/) are published to the Nextcloud app store via <screenshot> entries in appinfo/info.xml and shown in the README.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureX6hXrUQappIKfeUJ6GkiJtl2ppUFX1UlIti3j/FKOaiCJznrqgJO/8jx2/ndDGWEsONVQObbwhK7G7nPxVejfx/nJ2Y2wnoLd+kzBXF86KyOuEz/1uhNZPf0VK38QtAOeSknBu5vRQ0sCWOTkC+lOSumWPjksH3jjK6GkxM0RwbWz3TmxxMPzbYJho9nXmhNK6n+sKsGvEf83OCAd4ishrJnoqWqpp3P6Tnwhw/HyUQww1X+kPykcmibFSyWpSgfHY/A4ojqrIMVE13r0O0T4odCttEo0fOat5O9uJLSrjZezlzKxOydANssKcbuIbcth3hJZa7H2q3FsdYB8LaClrMaizc/dLvACKfh1jK3qPWEfAWcj6nLLAv16v6FeZX88JklWibGPUpHgLurjfjp3pF8gnmbFjNFdDbLavsrFFXwNClb8wxf7NCFqATcxaCApVp/iS+5vnwIRag4+mIWw+phDHgo3+PNJD4Nt2ungW7YMJa41DXk1Bkrwbc8ylCuvdVKdBP3XrnNJeS1LpUnLf3/zXOtCNmK+KAcEJ2ClEoYKPvnoUN2SO0nXBcpGk7U38eumPeIps6ZE2dkeQ/NiiDQEMsxOrjF+N5sWyXGR58+5qDAIKGb919jjAVbO1p0T9wCkRXtMNDyq4z3WzlJHKCwEUk926aFgwKf5svT0K8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32
Collectives Todos 0.1.0
Release Details
UpdatedOct. 7, 2026, 6:31 p.m.
Changelog

Added

  • Initial release of Collectives Todos: event-driven aggregation of markdown checkboxes across all pages of a Collectives into an auto-maintained Todos page, using Nextcloud core file events, a JSON cache for efficient updates and a CLI command (occ collectives_todos:init <collectives-id>) to build the page for existing collectives. Unit tests cover all core services and listeners.

  • App store release packaging: a GitHub Action (.github/workflows/release.yml) builds a store-conformant collectives_todos-vX.Y.Z.tar.gz (single top-level folder named after the app id, dev files excluded) on every v* tag, signs it with the app certificate and attaches archive and signature to the GitHub release. Tag and app version must match, and appinfo/info.xml is validated against the app store schema. With the APPSTORE_TOKEN secret set, the release is also published to the Nextcloud app store automatically.

  • Per-collective Enable/Disable button in the settings page's per-collective table. Disabling deletes the collective's Todos page (to trash) and stops generating or reverse-syncing it; the checkbox cache keeps being maintained, so enabling regenerates a consistent page immediately. Enabled is the default.
  • Global Enable/Disable button in the settings page's Defaults section: flips the instance-wide default. Enabling resets every collective to enabled - it clears all per-collective enabled opt-outs and regenerates their Todos pages, since opting into the app means wanting it everywhere; disabling single collectives stays the manual choice. Disabling globally deletes the Todos page of every collective that is not already opted out.
  • The per-collective Enable button clears the collective's enabled override instead of writing a sticky enabled value: a sticky override would shield the collective from the global default toggle forever, so a global disable reliably deletes every Todos page of collectives that were not explicitly disabled. The per-row Enable buttons render as inactive while the global default is disabled. Deleting the Todos page on disable now also removes its collectives_pages row (the delete is a hard delete on the appdata path, which the Collectives trash does not handle; the managed page's content is fully derived, so nothing of value is lost). The row is resolved untrashed and deleted directly: Collectives' PageMapper::deleteByFileId only removes rows that were moved to trash and silently ignored the hard-deleted page's row, leaking one on every disable cycle.
  • Todos page emoji config item (default none, per-collective override): the emoji is written to the Todos page's collectives_pages row like the emoji of any other Collectives page and rendered in the page tree. Validated with the Collectives app's own emoji validation; the settings page ships a curated emoji picker built with plain HTML/JS (no new dependencies), and any emoji can be pasted directly. The emoji is enforced on every Todos page regeneration and on settings save.
  • Admin settings page (Settings → Admin → Collectives Todos) with instance-wide defaults and per-collective overrides for three config items: the Todos page name (default Todos), the position of the Todos page in the Collectives page tree (always on top / always on bottom / alphabetically, default always on top) and the maximum number of cached checkboxes per collective (0 = unlimited, default 0). An empty override field uses the default. Invalid input is rejected without storing anything.
  • The tree position is enforced by writing the landing page's collectives_pages.subpage_order (the Collectives frontend sorts listed pages by array order, unlisted pages alphabetically), on every Todos page regeneration and on settings save. Manual ordering of the other pages is preserved; an already-open Collectives tab needs a reload to pick up the new order.
  • Changing the Todos page name renames the existing Todos page file; if a page with the new name already exists in a collective, the rename is skipped and reported on the settings page.
  • When the checkbox limit is reached, further checkboxes are not cached and the Todos page renders a *(list truncated by the settings limit)* note under the affected page's section.
  • Bidirectional checkbox sync: ticking or unticking a checkbox on the Todos page now also updates the checkbox on the source page it was aggregated from. Sections of the Todos page are resolved to source pages by the page file id in the heading link URL (title as fallback), and checkboxes are matched by text within a section. Only checked-state changes are synced; text edits on the Todos page are discarded with the next regeneration. If the cached line number of a checkbox has drifted, the checkbox is located by a unique text match, otherwise the change is skipped and a warning is logged.
  • Page headings on the Todos page are now links to the corresponding page, in the same URL format the Collectives app itself uses (/apps/collectives/<collectives>/<slug>-<pageId>, with a ?fileId= fallback for pages without a slug). If the URL cannot be resolved, the plain heading is kept.
  • Regenerating the Todos page while the Text editor had it open caused stale content to be shown and "Error saving the document" on manual saves: the Text app keeps per-file session state (etag, checksum, editor steps) that our background write invalidated. The Text document state of the Todos page is now reset on every regeneration, so open editors reload the fresh content. Unsaved manual edits to the Todos page are discarded by design.

Changed

  • Minimum Nextcloud version raised from 25 to 27 (the admin settings controller uses the AuthorizedAdminSetting attribute introduced in 27).
  • appinfo/info.xml brought into the form the Nextcloud app store validates: added the required <summary>, renamed <license> to <licence> and <depends> to <dependencies>, and dropped the <app>collectives</app> element (not part of the store or server schema, so it was never read; the Collectives dependency is enforced at runtime via IAppManager). No runtime behavior changes on servers already running the app.

Fixed

  • Reverse-syncing a tick made in the Collectives editor: the Text editor strips trailing whitespace on save, so a Todos page checkbox whose source line ends in spaces no longer matched the cached source text and the tick was silently dropped. Checkbox texts are now trimmed when parsed, and the reverse sync also tolerates untrimmed legacy cache entries.
  • Deleting the Todos page recreates it immediately. Collectives moves deleted pages to trash; the trash move is complete before the delete event fires and collectives paths are never locked, so no delayed recreation is needed.
  • The emoji of a freshly (re)created Todos page is now really written: inserting the missing collectives_pages row failed because its last_user_id column is NOT NULL. The app-created row now carries an empty user id (the frontend hides the "last edited" info for such pages), like untouched pages.
  • Deleting a page did not clean up the Todos page: the deleted page's section and checkboxes stayed listed. A Collectives page is a folder (the index page is its Readme.md, subpages are further files in it), and deleting it only emits a filesystem event for the folder itself - the markdown files inside vanish without their own events. A new listener for BeforeNodeDeletedEvent now collects the markdown pages under a folder before it is deleted, removes them from the cache and regenerates the Todos page. Plain .md file deletes keep their previous cleanup path. Restoring a page from the Collectives trash does not re-add it to the Todos page until the page is saved again or collectives_todos:init runs.
  • After ticking a checkbox on the Todos page, the source page briefly showed the tick and then reverted to its old content, with the editor refusing saves ("File changed in the meantime from outside"): the Text app keeps per-file session state (etag, checksum, steps) also for source pages, and the reverse sync's external write desynced it. The Text document state of a source page is now reset when the reverse sync writes it, so the page loads with the synced state and saves work. Unsaved keystrokes in an editing session open on that page at that moment are discarded (same contract the Todos page already has).
  • Checking a checkbox on the Todos page and saving broke the editing session: the reverse sync's regeneration of the Todos page ran nested inside the save and rewrote the page with a fresh "Last updated" timestamp, changing the etag under the open editor ("Error saving the document", conflict diff prompts). The Todos page is now only rewritten when its content actually changes (checkbox states, pages, titles); an update that would only refresh the "Last updated" timestamp leaves the file - and open editing sessions - untouched.
  • App bootstrap was silently skipped: info.xml declared the full namespace (OCA\CollectiveTodos), which Nextcloud prefixes with OCA\ itself, so no class of the app was autoloadable. The namespace is now CollectiveTodos.
  • Application.php moved from appinfo/ to lib/AppInfo/ (PSR-4 location that the bootstrap looks up).
  • CLI command is now registered via info.xml <commands> (previously the occ command never showed up).
  • Todos page is now written to the collectives root folder (previously it was written next to the edited page).
  • Page titles for Readme.md pages now use the page folder name (Collectives stores a page as folder with a Readme.md inside).
  • The listener skips its own Todos.md writes to avoid an infinite write-event loop, and logs failures instead of breaking saves.
  • collectives_todos:init now scans all pages of a collectives and accepts the collectives id as used by the Collectives app.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignaturetOPFL+uJkvXf4IYYON0b0T+MahYmk+Sga4NLaCPjTbv+nUklqi4DBjxNPKZEFLSHW+e7b6A2wR+uL+ugBCy9IWjJHfe35JVt1g/06s28dnXkm6nrod3AtPk4DgrZ2HHrDgPo86K4iIW2KIeW+IMbT1iKhYLQ9mGq3YcBPPtDgWzNjbpLid+PcGtxcPn8+E6GuOkrN6YbKuNkkdhL6UGuuqlHFYw7bVzDN41shzSaMYrUBmZUXXl/5ZnbnewEgiGZf6wsobuxQZ6uLqNjl9yKBvA85quuhBcnEHL0L+aFZn0xTuX8YFxvVmrx9iO8m24luzzSys35L/PL9W2l7m+w4MOX5zTIKkx+q8ExR8PtZBYOZqhaUPcZZwYLHFvJUlGL80LOPil51hn0qrsOUdJCd5yZqcoLoZxbBFKj1njokd7cTb8ZNPbw/lYsMnp8JCp4ldTTVLE/+P3U4p7aG1lbOIP33zMzOz6R+oF3w3xuNlT6QFRjvztbXzLohaj2fuTx3rVuraaztowQk9tLSqFiuRbMh5KHv3n9BFAuijyR9mfaPwJpEnKD0u0nKJmb2oIAkrwviHjYJR1xUbNsiZHbEQOpW2UMy0+5wvE++zGGCX+c3p9lRFqN00+KO1RNosmEOnmd/st12hZowjR+oayERlBKLUBXXxgO7h4/MIUHqYs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32

Nextcloud 32

Collectives Todos 0.2.1
Release Details
UpdatedOct. 11, 2026, 2:41 p.m.
Changelog

Added

  • The admin settings screenshot as the sixth app store screenshot (<screenshot> entry in appinfo/info.xml), shown on the product page next to the last walkthrough step and in the README.

  • Prominent "Get it from the Nextcloud app store" call to action on the product page hero (plus a footer link), pointing at https://apps.nextcloud.com/apps/collectives_todos.

Changed

  • The README installation section now points to the app store (the app is published there) with the manual deployment kept as an alternative.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureedvRvIjx/6LToXBwB+QHid0lEDz+peoI2WFIXXJJjwV7xFHjVnXMFrpxxh16/dIoh8fEGehpMnxkY0f1mHRems9HhMVUORmNk3OYj4S+sStM0SlWurEpNXxPOjAHAGDMLiURYlrKbvml+vtzHl6RGrxhYUKG3csuw05EnnRE06AVNwXg4Hcq4fh2hyqkHlT92bjByc+/c2RPxKU8PROs8IdelKEE7HLpBZa3hTAMccqh8QgzEIZa32HAOk51sF5pOIbAf+X8TKh4yUkMMB3lY1KzP2AR3fpnCtpEE6oaBq+f0N9HELhjNCYemuw15SK+gVSoUwTz+JniVF6o5VML9bupl+l6Jn6WG2WRQ/keCJJof1CCTDXfmzg5mkWCHezyXT03V/zQ7WWkiF8/MjyRFKTRzG76YcRXRHrhwtdxe8gDnjQVWRYaDoAXeVxTlqlcOpImy5ZlFrt9CeVmnVxzM6x6woNgWIA8M7TVlflWHbeAZC27gM4S7mxCuJ7FNhw/GhRDSujdVD3LFgYrEgT5XeEKuasutl0nxIUOq3CQxMquHIetZ6pm9MPSLHyzhxpqaMKPmY6UvRTVYkAY/uhmOQDug6BfwRUeM2BemFz2tDFbYzpLixpC2UGuBj4hIc2LwEJ3eSO19Fz46XiqBfqaH7Yd659PnQ+096Jj2m0DKDs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.2.0
Release Details
UpdatedOct. 11, 2026, 2:17 p.m.
Changelog

Added

  • Support for Nextcloud 35: the supported range is now Nextcloud 27–35, and the functional test test rig boots nextcloud:35-apache by default.

  • One-command local verification: tests/functional/test-rig.sh verify boots the newest supported Nextcloud, installs Collectives and the local working tree, seeds the fixture collective, runs the smoke checks and the PHPUnit suite, and leaves the server running at http://127.0.0.1:8080 (admin/admin) for manual verification when everything is green. When reusing an already-running container, it redeploys the current working tree and re-applies the English language defaults first.

  • The functional test rig now defaults to English (default_language/default_locale set to en/en_US, likewise for the admin user) and seeds every fixture page with a fitting emoji via the Collectives setEmoji API; the smoke checks assert those emojis and the Todos page emoji.

  • Continuous integration: .github/workflows/tests.yml runs the test rig smoke checks and the PHPUnit suite against the newest supported Nextcloud on every PR and push to main.

Changed

  • The default Todos page emoji is now 📝 (previously none). Existing instances without a stored setting pick it up on the next regeneration of a Todos page; the emoji stays configurable instance-wide and per collective, and empty still means no emoji.

  • tests/run.sh downloads phpunit.phar (pinned to 13.4.1, sha256-verified) into the container automatically when it is missing, instead of aborting.

  • The app store and product page screenshots are now a five-part step-by-step walkthrough of the flow (Todos page, source page, tick, synced regeneration), replacing the four earlier screenshots, and the product page (www/) embeds a demo video (www/screenshots/demo.mp4) that plays as you scroll.

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureJzuRSTWBNn8sqEbuJPy6xtam9PkpPFHvAHU1QL5B0jrqG5F2xcOjPqkOv1V5YP5IWO5LmlAbSPueMkDjFumlq30WYtbdxUbIAyqz9XFDXXNUuSPgRay03u8pPxaiy6rzeTlSTJJ9L3Wt+Nk14111OSVTNkwNMQQsbvARIdieBwMw/9iwetigBdvdxnebPlVLDuWNVOeyC4NT5l/POp1S8ZhF9JWxQ27PDSY3GH3z7KsHtAfCo0XJEk8WAGgXF2/0RxLnBrNYLFUNJhYkh96QAE+0Xb1qq0e44yL+8Xw3Ym8SI6pCIo+Ula1EKJILprkpvr/YTR1uIiSCd1l5FylPuNfbohA60A7Y3LxvXR3bFY2d/BJzf8rh8FbdyS9vvcrC8WlhxaRTSM5UumzRwzFZ18Ng546N0nxZIfMApALDxGEC2kTGPX+ndikdToIb821ZkvOD3Dr7DY0C/89WHasQX1ddHEVNNrY7ED/c0LruVUXxNHHN64ojMseJbAZvBdqm//g9mA8JZWgY0AA7XA95Q3kDvUxZCi9rY6f5Hlxmfy+YfgwmmUHN/F0Agfdpyb1N0akNb3r4c8nbgUF1xAUyrLYWhB0/55H4C3SLKfZmgK2PiD6iHabO07FgTrmVSkwBM34V3RnDeP+VjZ1BRpOd9bnd7lfulNAyzcbbMU2WDXM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.1.1
Release Details
UpdatedOct. 10, 2026, 4:24 p.m.
Changelog

Added

  • App store screenshots: four screenshots of the Todos page (committed under screenshots/) are published to the Nextcloud app store via <screenshot> entries in appinfo/info.xml and shown in the README.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureX6hXrUQappIKfeUJ6GkiJtl2ppUFX1UlIti3j/FKOaiCJznrqgJO/8jx2/ndDGWEsONVQObbwhK7G7nPxVejfx/nJ2Y2wnoLd+kzBXF86KyOuEz/1uhNZPf0VK38QtAOeSknBu5vRQ0sCWOTkC+lOSumWPjksH3jjK6GkxM0RwbWz3TmxxMPzbYJho9nXmhNK6n+sKsGvEf83OCAd4ishrJnoqWqpp3P6Tnwhw/HyUQww1X+kPykcmibFSyWpSgfHY/A4ojqrIMVE13r0O0T4odCttEo0fOat5O9uJLSrjZezlzKxOydANssKcbuIbcth3hJZa7H2q3FsdYB8LaClrMaizc/dLvACKfh1jK3qPWEfAWcj6nLLAv16v6FeZX88JklWibGPUpHgLurjfjp3pF8gnmbFjNFdDbLavsrFFXwNClb8wxf7NCFqATcxaCApVp/iS+5vnwIRag4+mIWw+phDHgo3+PNJD4Nt2ungW7YMJa41DXk1Bkrwbc8ylCuvdVKdBP3XrnNJeS1LpUnLf3/zXOtCNmK+KAcEJ2ClEoYKPvnoUN2SO0nXBcpGk7U38eumPeIps6ZE2dkeQ/NiiDQEMsxOrjF+N5sWyXGR58+5qDAIKGb919jjAVbO1p0T9wCkRXtMNDyq4z3WzlJHKCwEUk926aFgwKf5svT0K8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32
Collectives Todos 0.1.0
Release Details
UpdatedOct. 7, 2026, 6:31 p.m.
Changelog

Added

  • Initial release of Collectives Todos: event-driven aggregation of markdown checkboxes across all pages of a Collectives into an auto-maintained Todos page, using Nextcloud core file events, a JSON cache for efficient updates and a CLI command (occ collectives_todos:init <collectives-id>) to build the page for existing collectives. Unit tests cover all core services and listeners.

  • App store release packaging: a GitHub Action (.github/workflows/release.yml) builds a store-conformant collectives_todos-vX.Y.Z.tar.gz (single top-level folder named after the app id, dev files excluded) on every v* tag, signs it with the app certificate and attaches archive and signature to the GitHub release. Tag and app version must match, and appinfo/info.xml is validated against the app store schema. With the APPSTORE_TOKEN secret set, the release is also published to the Nextcloud app store automatically.

  • Per-collective Enable/Disable button in the settings page's per-collective table. Disabling deletes the collective's Todos page (to trash) and stops generating or reverse-syncing it; the checkbox cache keeps being maintained, so enabling regenerates a consistent page immediately. Enabled is the default.
  • Global Enable/Disable button in the settings page's Defaults section: flips the instance-wide default. Enabling resets every collective to enabled - it clears all per-collective enabled opt-outs and regenerates their Todos pages, since opting into the app means wanting it everywhere; disabling single collectives stays the manual choice. Disabling globally deletes the Todos page of every collective that is not already opted out.
  • The per-collective Enable button clears the collective's enabled override instead of writing a sticky enabled value: a sticky override would shield the collective from the global default toggle forever, so a global disable reliably deletes every Todos page of collectives that were not explicitly disabled. The per-row Enable buttons render as inactive while the global default is disabled. Deleting the Todos page on disable now also removes its collectives_pages row (the delete is a hard delete on the appdata path, which the Collectives trash does not handle; the managed page's content is fully derived, so nothing of value is lost). The row is resolved untrashed and deleted directly: Collectives' PageMapper::deleteByFileId only removes rows that were moved to trash and silently ignored the hard-deleted page's row, leaking one on every disable cycle.
  • Todos page emoji config item (default none, per-collective override): the emoji is written to the Todos page's collectives_pages row like the emoji of any other Collectives page and rendered in the page tree. Validated with the Collectives app's own emoji validation; the settings page ships a curated emoji picker built with plain HTML/JS (no new dependencies), and any emoji can be pasted directly. The emoji is enforced on every Todos page regeneration and on settings save.
  • Admin settings page (Settings → Admin → Collectives Todos) with instance-wide defaults and per-collective overrides for three config items: the Todos page name (default Todos), the position of the Todos page in the Collectives page tree (always on top / always on bottom / alphabetically, default always on top) and the maximum number of cached checkboxes per collective (0 = unlimited, default 0). An empty override field uses the default. Invalid input is rejected without storing anything.
  • The tree position is enforced by writing the landing page's collectives_pages.subpage_order (the Collectives frontend sorts listed pages by array order, unlisted pages alphabetically), on every Todos page regeneration and on settings save. Manual ordering of the other pages is preserved; an already-open Collectives tab needs a reload to pick up the new order.
  • Changing the Todos page name renames the existing Todos page file; if a page with the new name already exists in a collective, the rename is skipped and reported on the settings page.
  • When the checkbox limit is reached, further checkboxes are not cached and the Todos page renders a *(list truncated by the settings limit)* note under the affected page's section.
  • Bidirectional checkbox sync: ticking or unticking a checkbox on the Todos page now also updates the checkbox on the source page it was aggregated from. Sections of the Todos page are resolved to source pages by the page file id in the heading link URL (title as fallback), and checkboxes are matched by text within a section. Only checked-state changes are synced; text edits on the Todos page are discarded with the next regeneration. If the cached line number of a checkbox has drifted, the checkbox is located by a unique text match, otherwise the change is skipped and a warning is logged.
  • Page headings on the Todos page are now links to the corresponding page, in the same URL format the Collectives app itself uses (/apps/collectives/<collectives>/<slug>-<pageId>, with a ?fileId= fallback for pages without a slug). If the URL cannot be resolved, the plain heading is kept.
  • Regenerating the Todos page while the Text editor had it open caused stale content to be shown and "Error saving the document" on manual saves: the Text app keeps per-file session state (etag, checksum, editor steps) that our background write invalidated. The Text document state of the Todos page is now reset on every regeneration, so open editors reload the fresh content. Unsaved manual edits to the Todos page are discarded by design.

Changed

  • Minimum Nextcloud version raised from 25 to 27 (the admin settings controller uses the AuthorizedAdminSetting attribute introduced in 27).
  • appinfo/info.xml brought into the form the Nextcloud app store validates: added the required <summary>, renamed <license> to <licence> and <depends> to <dependencies>, and dropped the <app>collectives</app> element (not part of the store or server schema, so it was never read; the Collectives dependency is enforced at runtime via IAppManager). No runtime behavior changes on servers already running the app.

Fixed

  • Reverse-syncing a tick made in the Collectives editor: the Text editor strips trailing whitespace on save, so a Todos page checkbox whose source line ends in spaces no longer matched the cached source text and the tick was silently dropped. Checkbox texts are now trimmed when parsed, and the reverse sync also tolerates untrimmed legacy cache entries.
  • Deleting the Todos page recreates it immediately. Collectives moves deleted pages to trash; the trash move is complete before the delete event fires and collectives paths are never locked, so no delayed recreation is needed.
  • The emoji of a freshly (re)created Todos page is now really written: inserting the missing collectives_pages row failed because its last_user_id column is NOT NULL. The app-created row now carries an empty user id (the frontend hides the "last edited" info for such pages), like untouched pages.
  • Deleting a page did not clean up the Todos page: the deleted page's section and checkboxes stayed listed. A Collectives page is a folder (the index page is its Readme.md, subpages are further files in it), and deleting it only emits a filesystem event for the folder itself - the markdown files inside vanish without their own events. A new listener for BeforeNodeDeletedEvent now collects the markdown pages under a folder before it is deleted, removes them from the cache and regenerates the Todos page. Plain .md file deletes keep their previous cleanup path. Restoring a page from the Collectives trash does not re-add it to the Todos page until the page is saved again or collectives_todos:init runs.
  • After ticking a checkbox on the Todos page, the source page briefly showed the tick and then reverted to its old content, with the editor refusing saves ("File changed in the meantime from outside"): the Text app keeps per-file session state (etag, checksum, steps) also for source pages, and the reverse sync's external write desynced it. The Text document state of a source page is now reset when the reverse sync writes it, so the page loads with the synced state and saves work. Unsaved keystrokes in an editing session open on that page at that moment are discarded (same contract the Todos page already has).
  • Checking a checkbox on the Todos page and saving broke the editing session: the reverse sync's regeneration of the Todos page ran nested inside the save and rewrote the page with a fresh "Last updated" timestamp, changing the etag under the open editor ("Error saving the document", conflict diff prompts). The Todos page is now only rewritten when its content actually changes (checkbox states, pages, titles); an update that would only refresh the "Last updated" timestamp leaves the file - and open editing sessions - untouched.
  • App bootstrap was silently skipped: info.xml declared the full namespace (OCA\CollectiveTodos), which Nextcloud prefixes with OCA\ itself, so no class of the app was autoloadable. The namespace is now CollectiveTodos.
  • Application.php moved from appinfo/ to lib/AppInfo/ (PSR-4 location that the bootstrap looks up).
  • CLI command is now registered via info.xml <commands> (previously the occ command never showed up).
  • Todos page is now written to the collectives root folder (previously it was written next to the edited page).
  • Page titles for Readme.md pages now use the page folder name (Collectives stores a page as folder with a Readme.md inside).
  • The listener skips its own Todos.md writes to avoid an infinite write-event loop, and logs failures instead of breaking saves.
  • collectives_todos:init now scans all pages of a collectives and accepts the collectives id as used by the Collectives app.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignaturetOPFL+uJkvXf4IYYON0b0T+MahYmk+Sga4NLaCPjTbv+nUklqi4DBjxNPKZEFLSHW+e7b6A2wR+uL+ugBCy9IWjJHfe35JVt1g/06s28dnXkm6nrod3AtPk4DgrZ2HHrDgPo86K4iIW2KIeW+IMbT1iKhYLQ9mGq3YcBPPtDgWzNjbpLid+PcGtxcPn8+E6GuOkrN6YbKuNkkdhL6UGuuqlHFYw7bVzDN41shzSaMYrUBmZUXXl/5ZnbnewEgiGZf6wsobuxQZ6uLqNjl9yKBvA85quuhBcnEHL0L+aFZn0xTuX8YFxvVmrx9iO8m24luzzSys35L/PL9W2l7m+w4MOX5zTIKkx+q8ExR8PtZBYOZqhaUPcZZwYLHFvJUlGL80LOPil51hn0qrsOUdJCd5yZqcoLoZxbBFKj1njokd7cTb8ZNPbw/lYsMnp8JCp4ldTTVLE/+P3U4p7aG1lbOIP33zMzOz6R+oF3w3xuNlT6QFRjvztbXzLohaj2fuTx3rVuraaztowQk9tLSqFiuRbMh5KHv3n9BFAuijyR9mfaPwJpEnKD0u0nKJmb2oIAkrwviHjYJR1xUbNsiZHbEQOpW2UMy0+5wvE++zGGCX+c3p9lRFqN00+KO1RNosmEOnmd/st12hZowjR+oayERlBKLUBXXxgO7h4/MIUHqYs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32

Nextcloud 31

Collectives Todos 0.2.1
Release Details
UpdatedOct. 11, 2026, 2:41 p.m.
Changelog

Added

  • The admin settings screenshot as the sixth app store screenshot (<screenshot> entry in appinfo/info.xml), shown on the product page next to the last walkthrough step and in the README.

  • Prominent "Get it from the Nextcloud app store" call to action on the product page hero (plus a footer link), pointing at https://apps.nextcloud.com/apps/collectives_todos.

Changed

  • The README installation section now points to the app store (the app is published there) with the manual deployment kept as an alternative.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureedvRvIjx/6LToXBwB+QHid0lEDz+peoI2WFIXXJJjwV7xFHjVnXMFrpxxh16/dIoh8fEGehpMnxkY0f1mHRems9HhMVUORmNk3OYj4S+sStM0SlWurEpNXxPOjAHAGDMLiURYlrKbvml+vtzHl6RGrxhYUKG3csuw05EnnRE06AVNwXg4Hcq4fh2hyqkHlT92bjByc+/c2RPxKU8PROs8IdelKEE7HLpBZa3hTAMccqh8QgzEIZa32HAOk51sF5pOIbAf+X8TKh4yUkMMB3lY1KzP2AR3fpnCtpEE6oaBq+f0N9HELhjNCYemuw15SK+gVSoUwTz+JniVF6o5VML9bupl+l6Jn6WG2WRQ/keCJJof1CCTDXfmzg5mkWCHezyXT03V/zQ7WWkiF8/MjyRFKTRzG76YcRXRHrhwtdxe8gDnjQVWRYaDoAXeVxTlqlcOpImy5ZlFrt9CeVmnVxzM6x6woNgWIA8M7TVlflWHbeAZC27gM4S7mxCuJ7FNhw/GhRDSujdVD3LFgYrEgT5XeEKuasutl0nxIUOq3CQxMquHIetZ6pm9MPSLHyzhxpqaMKPmY6UvRTVYkAY/uhmOQDug6BfwRUeM2BemFz2tDFbYzpLixpC2UGuBj4hIc2LwEJ3eSO19Fz46XiqBfqaH7Yd659PnQ+096Jj2m0DKDs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.2.0
Release Details
UpdatedOct. 11, 2026, 2:17 p.m.
Changelog

Added

  • Support for Nextcloud 35: the supported range is now Nextcloud 27–35, and the functional test test rig boots nextcloud:35-apache by default.

  • One-command local verification: tests/functional/test-rig.sh verify boots the newest supported Nextcloud, installs Collectives and the local working tree, seeds the fixture collective, runs the smoke checks and the PHPUnit suite, and leaves the server running at http://127.0.0.1:8080 (admin/admin) for manual verification when everything is green. When reusing an already-running container, it redeploys the current working tree and re-applies the English language defaults first.

  • The functional test rig now defaults to English (default_language/default_locale set to en/en_US, likewise for the admin user) and seeds every fixture page with a fitting emoji via the Collectives setEmoji API; the smoke checks assert those emojis and the Todos page emoji.

  • Continuous integration: .github/workflows/tests.yml runs the test rig smoke checks and the PHPUnit suite against the newest supported Nextcloud on every PR and push to main.

Changed

  • The default Todos page emoji is now 📝 (previously none). Existing instances without a stored setting pick it up on the next regeneration of a Todos page; the emoji stays configurable instance-wide and per collective, and empty still means no emoji.

  • tests/run.sh downloads phpunit.phar (pinned to 13.4.1, sha256-verified) into the container automatically when it is missing, instead of aborting.

  • The app store and product page screenshots are now a five-part step-by-step walkthrough of the flow (Todos page, source page, tick, synced regeneration), replacing the four earlier screenshots, and the product page (www/) embeds a demo video (www/screenshots/demo.mp4) that plays as you scroll.

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureJzuRSTWBNn8sqEbuJPy6xtam9PkpPFHvAHU1QL5B0jrqG5F2xcOjPqkOv1V5YP5IWO5LmlAbSPueMkDjFumlq30WYtbdxUbIAyqz9XFDXXNUuSPgRay03u8pPxaiy6rzeTlSTJJ9L3Wt+Nk14111OSVTNkwNMQQsbvARIdieBwMw/9iwetigBdvdxnebPlVLDuWNVOeyC4NT5l/POp1S8ZhF9JWxQ27PDSY3GH3z7KsHtAfCo0XJEk8WAGgXF2/0RxLnBrNYLFUNJhYkh96QAE+0Xb1qq0e44yL+8Xw3Ym8SI6pCIo+Ula1EKJILprkpvr/YTR1uIiSCd1l5FylPuNfbohA60A7Y3LxvXR3bFY2d/BJzf8rh8FbdyS9vvcrC8WlhxaRTSM5UumzRwzFZ18Ng546N0nxZIfMApALDxGEC2kTGPX+ndikdToIb821ZkvOD3Dr7DY0C/89WHasQX1ddHEVNNrY7ED/c0LruVUXxNHHN64ojMseJbAZvBdqm//g9mA8JZWgY0AA7XA95Q3kDvUxZCi9rY6f5Hlxmfy+YfgwmmUHN/F0Agfdpyb1N0akNb3r4c8nbgUF1xAUyrLYWhB0/55H4C3SLKfZmgK2PiD6iHabO07FgTrmVSkwBM34V3RnDeP+VjZ1BRpOd9bnd7lfulNAyzcbbMU2WDXM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.1.1
Release Details
UpdatedOct. 10, 2026, 4:24 p.m.
Changelog

Added

  • App store screenshots: four screenshots of the Todos page (committed under screenshots/) are published to the Nextcloud app store via <screenshot> entries in appinfo/info.xml and shown in the README.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureX6hXrUQappIKfeUJ6GkiJtl2ppUFX1UlIti3j/FKOaiCJznrqgJO/8jx2/ndDGWEsONVQObbwhK7G7nPxVejfx/nJ2Y2wnoLd+kzBXF86KyOuEz/1uhNZPf0VK38QtAOeSknBu5vRQ0sCWOTkC+lOSumWPjksH3jjK6GkxM0RwbWz3TmxxMPzbYJho9nXmhNK6n+sKsGvEf83OCAd4ishrJnoqWqpp3P6Tnwhw/HyUQww1X+kPykcmibFSyWpSgfHY/A4ojqrIMVE13r0O0T4odCttEo0fOat5O9uJLSrjZezlzKxOydANssKcbuIbcth3hJZa7H2q3FsdYB8LaClrMaizc/dLvACKfh1jK3qPWEfAWcj6nLLAv16v6FeZX88JklWibGPUpHgLurjfjp3pF8gnmbFjNFdDbLavsrFFXwNClb8wxf7NCFqATcxaCApVp/iS+5vnwIRag4+mIWw+phDHgo3+PNJD4Nt2ungW7YMJa41DXk1Bkrwbc8ylCuvdVKdBP3XrnNJeS1LpUnLf3/zXOtCNmK+KAcEJ2ClEoYKPvnoUN2SO0nXBcpGk7U38eumPeIps6ZE2dkeQ/NiiDQEMsxOrjF+N5sWyXGR58+5qDAIKGb919jjAVbO1p0T9wCkRXtMNDyq4z3WzlJHKCwEUk926aFgwKf5svT0K8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32
Collectives Todos 0.1.0
Release Details
UpdatedOct. 7, 2026, 6:31 p.m.
Changelog

Added

  • Initial release of Collectives Todos: event-driven aggregation of markdown checkboxes across all pages of a Collectives into an auto-maintained Todos page, using Nextcloud core file events, a JSON cache for efficient updates and a CLI command (occ collectives_todos:init <collectives-id>) to build the page for existing collectives. Unit tests cover all core services and listeners.

  • App store release packaging: a GitHub Action (.github/workflows/release.yml) builds a store-conformant collectives_todos-vX.Y.Z.tar.gz (single top-level folder named after the app id, dev files excluded) on every v* tag, signs it with the app certificate and attaches archive and signature to the GitHub release. Tag and app version must match, and appinfo/info.xml is validated against the app store schema. With the APPSTORE_TOKEN secret set, the release is also published to the Nextcloud app store automatically.

  • Per-collective Enable/Disable button in the settings page's per-collective table. Disabling deletes the collective's Todos page (to trash) and stops generating or reverse-syncing it; the checkbox cache keeps being maintained, so enabling regenerates a consistent page immediately. Enabled is the default.
  • Global Enable/Disable button in the settings page's Defaults section: flips the instance-wide default. Enabling resets every collective to enabled - it clears all per-collective enabled opt-outs and regenerates their Todos pages, since opting into the app means wanting it everywhere; disabling single collectives stays the manual choice. Disabling globally deletes the Todos page of every collective that is not already opted out.
  • The per-collective Enable button clears the collective's enabled override instead of writing a sticky enabled value: a sticky override would shield the collective from the global default toggle forever, so a global disable reliably deletes every Todos page of collectives that were not explicitly disabled. The per-row Enable buttons render as inactive while the global default is disabled. Deleting the Todos page on disable now also removes its collectives_pages row (the delete is a hard delete on the appdata path, which the Collectives trash does not handle; the managed page's content is fully derived, so nothing of value is lost). The row is resolved untrashed and deleted directly: Collectives' PageMapper::deleteByFileId only removes rows that were moved to trash and silently ignored the hard-deleted page's row, leaking one on every disable cycle.
  • Todos page emoji config item (default none, per-collective override): the emoji is written to the Todos page's collectives_pages row like the emoji of any other Collectives page and rendered in the page tree. Validated with the Collectives app's own emoji validation; the settings page ships a curated emoji picker built with plain HTML/JS (no new dependencies), and any emoji can be pasted directly. The emoji is enforced on every Todos page regeneration and on settings save.
  • Admin settings page (Settings → Admin → Collectives Todos) with instance-wide defaults and per-collective overrides for three config items: the Todos page name (default Todos), the position of the Todos page in the Collectives page tree (always on top / always on bottom / alphabetically, default always on top) and the maximum number of cached checkboxes per collective (0 = unlimited, default 0). An empty override field uses the default. Invalid input is rejected without storing anything.
  • The tree position is enforced by writing the landing page's collectives_pages.subpage_order (the Collectives frontend sorts listed pages by array order, unlisted pages alphabetically), on every Todos page regeneration and on settings save. Manual ordering of the other pages is preserved; an already-open Collectives tab needs a reload to pick up the new order.
  • Changing the Todos page name renames the existing Todos page file; if a page with the new name already exists in a collective, the rename is skipped and reported on the settings page.
  • When the checkbox limit is reached, further checkboxes are not cached and the Todos page renders a *(list truncated by the settings limit)* note under the affected page's section.
  • Bidirectional checkbox sync: ticking or unticking a checkbox on the Todos page now also updates the checkbox on the source page it was aggregated from. Sections of the Todos page are resolved to source pages by the page file id in the heading link URL (title as fallback), and checkboxes are matched by text within a section. Only checked-state changes are synced; text edits on the Todos page are discarded with the next regeneration. If the cached line number of a checkbox has drifted, the checkbox is located by a unique text match, otherwise the change is skipped and a warning is logged.
  • Page headings on the Todos page are now links to the corresponding page, in the same URL format the Collectives app itself uses (/apps/collectives/<collectives>/<slug>-<pageId>, with a ?fileId= fallback for pages without a slug). If the URL cannot be resolved, the plain heading is kept.
  • Regenerating the Todos page while the Text editor had it open caused stale content to be shown and "Error saving the document" on manual saves: the Text app keeps per-file session state (etag, checksum, editor steps) that our background write invalidated. The Text document state of the Todos page is now reset on every regeneration, so open editors reload the fresh content. Unsaved manual edits to the Todos page are discarded by design.

Changed

  • Minimum Nextcloud version raised from 25 to 27 (the admin settings controller uses the AuthorizedAdminSetting attribute introduced in 27).
  • appinfo/info.xml brought into the form the Nextcloud app store validates: added the required <summary>, renamed <license> to <licence> and <depends> to <dependencies>, and dropped the <app>collectives</app> element (not part of the store or server schema, so it was never read; the Collectives dependency is enforced at runtime via IAppManager). No runtime behavior changes on servers already running the app.

Fixed

  • Reverse-syncing a tick made in the Collectives editor: the Text editor strips trailing whitespace on save, so a Todos page checkbox whose source line ends in spaces no longer matched the cached source text and the tick was silently dropped. Checkbox texts are now trimmed when parsed, and the reverse sync also tolerates untrimmed legacy cache entries.
  • Deleting the Todos page recreates it immediately. Collectives moves deleted pages to trash; the trash move is complete before the delete event fires and collectives paths are never locked, so no delayed recreation is needed.
  • The emoji of a freshly (re)created Todos page is now really written: inserting the missing collectives_pages row failed because its last_user_id column is NOT NULL. The app-created row now carries an empty user id (the frontend hides the "last edited" info for such pages), like untouched pages.
  • Deleting a page did not clean up the Todos page: the deleted page's section and checkboxes stayed listed. A Collectives page is a folder (the index page is its Readme.md, subpages are further files in it), and deleting it only emits a filesystem event for the folder itself - the markdown files inside vanish without their own events. A new listener for BeforeNodeDeletedEvent now collects the markdown pages under a folder before it is deleted, removes them from the cache and regenerates the Todos page. Plain .md file deletes keep their previous cleanup path. Restoring a page from the Collectives trash does not re-add it to the Todos page until the page is saved again or collectives_todos:init runs.
  • After ticking a checkbox on the Todos page, the source page briefly showed the tick and then reverted to its old content, with the editor refusing saves ("File changed in the meantime from outside"): the Text app keeps per-file session state (etag, checksum, steps) also for source pages, and the reverse sync's external write desynced it. The Text document state of a source page is now reset when the reverse sync writes it, so the page loads with the synced state and saves work. Unsaved keystrokes in an editing session open on that page at that moment are discarded (same contract the Todos page already has).
  • Checking a checkbox on the Todos page and saving broke the editing session: the reverse sync's regeneration of the Todos page ran nested inside the save and rewrote the page with a fresh "Last updated" timestamp, changing the etag under the open editor ("Error saving the document", conflict diff prompts). The Todos page is now only rewritten when its content actually changes (checkbox states, pages, titles); an update that would only refresh the "Last updated" timestamp leaves the file - and open editing sessions - untouched.
  • App bootstrap was silently skipped: info.xml declared the full namespace (OCA\CollectiveTodos), which Nextcloud prefixes with OCA\ itself, so no class of the app was autoloadable. The namespace is now CollectiveTodos.
  • Application.php moved from appinfo/ to lib/AppInfo/ (PSR-4 location that the bootstrap looks up).
  • CLI command is now registered via info.xml <commands> (previously the occ command never showed up).
  • Todos page is now written to the collectives root folder (previously it was written next to the edited page).
  • Page titles for Readme.md pages now use the page folder name (Collectives stores a page as folder with a Readme.md inside).
  • The listener skips its own Todos.md writes to avoid an infinite write-event loop, and logs failures instead of breaking saves.
  • collectives_todos:init now scans all pages of a collectives and accepts the collectives id as used by the Collectives app.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignaturetOPFL+uJkvXf4IYYON0b0T+MahYmk+Sga4NLaCPjTbv+nUklqi4DBjxNPKZEFLSHW+e7b6A2wR+uL+ugBCy9IWjJHfe35JVt1g/06s28dnXkm6nrod3AtPk4DgrZ2HHrDgPo86K4iIW2KIeW+IMbT1iKhYLQ9mGq3YcBPPtDgWzNjbpLid+PcGtxcPn8+E6GuOkrN6YbKuNkkdhL6UGuuqlHFYw7bVzDN41shzSaMYrUBmZUXXl/5ZnbnewEgiGZf6wsobuxQZ6uLqNjl9yKBvA85quuhBcnEHL0L+aFZn0xTuX8YFxvVmrx9iO8m24luzzSys35L/PL9W2l7m+w4MOX5zTIKkx+q8ExR8PtZBYOZqhaUPcZZwYLHFvJUlGL80LOPil51hn0qrsOUdJCd5yZqcoLoZxbBFKj1njokd7cTb8ZNPbw/lYsMnp8JCp4ldTTVLE/+P3U4p7aG1lbOIP33zMzOz6R+oF3w3xuNlT6QFRjvztbXzLohaj2fuTx3rVuraaztowQk9tLSqFiuRbMh5KHv3n9BFAuijyR9mfaPwJpEnKD0u0nKJmb2oIAkrwviHjYJR1xUbNsiZHbEQOpW2UMy0+5wvE++zGGCX+c3p9lRFqN00+KO1RNosmEOnmd/st12hZowjR+oayERlBKLUBXXxgO7h4/MIUHqYs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32

Nextcloud 30

Collectives Todos 0.2.1
Release Details
UpdatedOct. 11, 2026, 2:41 p.m.
Changelog

Added

  • The admin settings screenshot as the sixth app store screenshot (<screenshot> entry in appinfo/info.xml), shown on the product page next to the last walkthrough step and in the README.

  • Prominent "Get it from the Nextcloud app store" call to action on the product page hero (plus a footer link), pointing at https://apps.nextcloud.com/apps/collectives_todos.

Changed

  • The README installation section now points to the app store (the app is published there) with the manual deployment kept as an alternative.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureedvRvIjx/6LToXBwB+QHid0lEDz+peoI2WFIXXJJjwV7xFHjVnXMFrpxxh16/dIoh8fEGehpMnxkY0f1mHRems9HhMVUORmNk3OYj4S+sStM0SlWurEpNXxPOjAHAGDMLiURYlrKbvml+vtzHl6RGrxhYUKG3csuw05EnnRE06AVNwXg4Hcq4fh2hyqkHlT92bjByc+/c2RPxKU8PROs8IdelKEE7HLpBZa3hTAMccqh8QgzEIZa32HAOk51sF5pOIbAf+X8TKh4yUkMMB3lY1KzP2AR3fpnCtpEE6oaBq+f0N9HELhjNCYemuw15SK+gVSoUwTz+JniVF6o5VML9bupl+l6Jn6WG2WRQ/keCJJof1CCTDXfmzg5mkWCHezyXT03V/zQ7WWkiF8/MjyRFKTRzG76YcRXRHrhwtdxe8gDnjQVWRYaDoAXeVxTlqlcOpImy5ZlFrt9CeVmnVxzM6x6woNgWIA8M7TVlflWHbeAZC27gM4S7mxCuJ7FNhw/GhRDSujdVD3LFgYrEgT5XeEKuasutl0nxIUOq3CQxMquHIetZ6pm9MPSLHyzhxpqaMKPmY6UvRTVYkAY/uhmOQDug6BfwRUeM2BemFz2tDFbYzpLixpC2UGuBj4hIc2LwEJ3eSO19Fz46XiqBfqaH7Yd659PnQ+096Jj2m0DKDs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.2.0
Release Details
UpdatedOct. 11, 2026, 2:17 p.m.
Changelog

Added

  • Support for Nextcloud 35: the supported range is now Nextcloud 27–35, and the functional test test rig boots nextcloud:35-apache by default.

  • One-command local verification: tests/functional/test-rig.sh verify boots the newest supported Nextcloud, installs Collectives and the local working tree, seeds the fixture collective, runs the smoke checks and the PHPUnit suite, and leaves the server running at http://127.0.0.1:8080 (admin/admin) for manual verification when everything is green. When reusing an already-running container, it redeploys the current working tree and re-applies the English language defaults first.

  • The functional test rig now defaults to English (default_language/default_locale set to en/en_US, likewise for the admin user) and seeds every fixture page with a fitting emoji via the Collectives setEmoji API; the smoke checks assert those emojis and the Todos page emoji.

  • Continuous integration: .github/workflows/tests.yml runs the test rig smoke checks and the PHPUnit suite against the newest supported Nextcloud on every PR and push to main.

Changed

  • The default Todos page emoji is now 📝 (previously none). Existing instances without a stored setting pick it up on the next regeneration of a Todos page; the emoji stays configurable instance-wide and per collective, and empty still means no emoji.

  • tests/run.sh downloads phpunit.phar (pinned to 13.4.1, sha256-verified) into the container automatically when it is missing, instead of aborting.

  • The app store and product page screenshots are now a five-part step-by-step walkthrough of the flow (Todos page, source page, tick, synced regeneration), replacing the four earlier screenshots, and the product page (www/) embeds a demo video (www/screenshots/demo.mp4) that plays as you scroll.

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureJzuRSTWBNn8sqEbuJPy6xtam9PkpPFHvAHU1QL5B0jrqG5F2xcOjPqkOv1V5YP5IWO5LmlAbSPueMkDjFumlq30WYtbdxUbIAyqz9XFDXXNUuSPgRay03u8pPxaiy6rzeTlSTJJ9L3Wt+Nk14111OSVTNkwNMQQsbvARIdieBwMw/9iwetigBdvdxnebPlVLDuWNVOeyC4NT5l/POp1S8ZhF9JWxQ27PDSY3GH3z7KsHtAfCo0XJEk8WAGgXF2/0RxLnBrNYLFUNJhYkh96QAE+0Xb1qq0e44yL+8Xw3Ym8SI6pCIo+Ula1EKJILprkpvr/YTR1uIiSCd1l5FylPuNfbohA60A7Y3LxvXR3bFY2d/BJzf8rh8FbdyS9vvcrC8WlhxaRTSM5UumzRwzFZ18Ng546N0nxZIfMApALDxGEC2kTGPX+ndikdToIb821ZkvOD3Dr7DY0C/89WHasQX1ddHEVNNrY7ED/c0LruVUXxNHHN64ojMseJbAZvBdqm//g9mA8JZWgY0AA7XA95Q3kDvUxZCi9rY6f5Hlxmfy+YfgwmmUHN/F0Agfdpyb1N0akNb3r4c8nbgUF1xAUyrLYWhB0/55H4C3SLKfZmgK2PiD6iHabO07FgTrmVSkwBM34V3RnDeP+VjZ1BRpOd9bnd7lfulNAyzcbbMU2WDXM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.1.1
Release Details
UpdatedOct. 10, 2026, 4:24 p.m.
Changelog

Added

  • App store screenshots: four screenshots of the Todos page (committed under screenshots/) are published to the Nextcloud app store via <screenshot> entries in appinfo/info.xml and shown in the README.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureX6hXrUQappIKfeUJ6GkiJtl2ppUFX1UlIti3j/FKOaiCJznrqgJO/8jx2/ndDGWEsONVQObbwhK7G7nPxVejfx/nJ2Y2wnoLd+kzBXF86KyOuEz/1uhNZPf0VK38QtAOeSknBu5vRQ0sCWOTkC+lOSumWPjksH3jjK6GkxM0RwbWz3TmxxMPzbYJho9nXmhNK6n+sKsGvEf83OCAd4ishrJnoqWqpp3P6Tnwhw/HyUQww1X+kPykcmibFSyWpSgfHY/A4ojqrIMVE13r0O0T4odCttEo0fOat5O9uJLSrjZezlzKxOydANssKcbuIbcth3hJZa7H2q3FsdYB8LaClrMaizc/dLvACKfh1jK3qPWEfAWcj6nLLAv16v6FeZX88JklWibGPUpHgLurjfjp3pF8gnmbFjNFdDbLavsrFFXwNClb8wxf7NCFqATcxaCApVp/iS+5vnwIRag4+mIWw+phDHgo3+PNJD4Nt2ungW7YMJa41DXk1Bkrwbc8ylCuvdVKdBP3XrnNJeS1LpUnLf3/zXOtCNmK+KAcEJ2ClEoYKPvnoUN2SO0nXBcpGk7U38eumPeIps6ZE2dkeQ/NiiDQEMsxOrjF+N5sWyXGR58+5qDAIKGb919jjAVbO1p0T9wCkRXtMNDyq4z3WzlJHKCwEUk926aFgwKf5svT0K8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32
Collectives Todos 0.1.0
Release Details
UpdatedOct. 7, 2026, 6:31 p.m.
Changelog

Added

  • Initial release of Collectives Todos: event-driven aggregation of markdown checkboxes across all pages of a Collectives into an auto-maintained Todos page, using Nextcloud core file events, a JSON cache for efficient updates and a CLI command (occ collectives_todos:init <collectives-id>) to build the page for existing collectives. Unit tests cover all core services and listeners.

  • App store release packaging: a GitHub Action (.github/workflows/release.yml) builds a store-conformant collectives_todos-vX.Y.Z.tar.gz (single top-level folder named after the app id, dev files excluded) on every v* tag, signs it with the app certificate and attaches archive and signature to the GitHub release. Tag and app version must match, and appinfo/info.xml is validated against the app store schema. With the APPSTORE_TOKEN secret set, the release is also published to the Nextcloud app store automatically.

  • Per-collective Enable/Disable button in the settings page's per-collective table. Disabling deletes the collective's Todos page (to trash) and stops generating or reverse-syncing it; the checkbox cache keeps being maintained, so enabling regenerates a consistent page immediately. Enabled is the default.
  • Global Enable/Disable button in the settings page's Defaults section: flips the instance-wide default. Enabling resets every collective to enabled - it clears all per-collective enabled opt-outs and regenerates their Todos pages, since opting into the app means wanting it everywhere; disabling single collectives stays the manual choice. Disabling globally deletes the Todos page of every collective that is not already opted out.
  • The per-collective Enable button clears the collective's enabled override instead of writing a sticky enabled value: a sticky override would shield the collective from the global default toggle forever, so a global disable reliably deletes every Todos page of collectives that were not explicitly disabled. The per-row Enable buttons render as inactive while the global default is disabled. Deleting the Todos page on disable now also removes its collectives_pages row (the delete is a hard delete on the appdata path, which the Collectives trash does not handle; the managed page's content is fully derived, so nothing of value is lost). The row is resolved untrashed and deleted directly: Collectives' PageMapper::deleteByFileId only removes rows that were moved to trash and silently ignored the hard-deleted page's row, leaking one on every disable cycle.
  • Todos page emoji config item (default none, per-collective override): the emoji is written to the Todos page's collectives_pages row like the emoji of any other Collectives page and rendered in the page tree. Validated with the Collectives app's own emoji validation; the settings page ships a curated emoji picker built with plain HTML/JS (no new dependencies), and any emoji can be pasted directly. The emoji is enforced on every Todos page regeneration and on settings save.
  • Admin settings page (Settings → Admin → Collectives Todos) with instance-wide defaults and per-collective overrides for three config items: the Todos page name (default Todos), the position of the Todos page in the Collectives page tree (always on top / always on bottom / alphabetically, default always on top) and the maximum number of cached checkboxes per collective (0 = unlimited, default 0). An empty override field uses the default. Invalid input is rejected without storing anything.
  • The tree position is enforced by writing the landing page's collectives_pages.subpage_order (the Collectives frontend sorts listed pages by array order, unlisted pages alphabetically), on every Todos page regeneration and on settings save. Manual ordering of the other pages is preserved; an already-open Collectives tab needs a reload to pick up the new order.
  • Changing the Todos page name renames the existing Todos page file; if a page with the new name already exists in a collective, the rename is skipped and reported on the settings page.
  • When the checkbox limit is reached, further checkboxes are not cached and the Todos page renders a *(list truncated by the settings limit)* note under the affected page's section.
  • Bidirectional checkbox sync: ticking or unticking a checkbox on the Todos page now also updates the checkbox on the source page it was aggregated from. Sections of the Todos page are resolved to source pages by the page file id in the heading link URL (title as fallback), and checkboxes are matched by text within a section. Only checked-state changes are synced; text edits on the Todos page are discarded with the next regeneration. If the cached line number of a checkbox has drifted, the checkbox is located by a unique text match, otherwise the change is skipped and a warning is logged.
  • Page headings on the Todos page are now links to the corresponding page, in the same URL format the Collectives app itself uses (/apps/collectives/<collectives>/<slug>-<pageId>, with a ?fileId= fallback for pages without a slug). If the URL cannot be resolved, the plain heading is kept.
  • Regenerating the Todos page while the Text editor had it open caused stale content to be shown and "Error saving the document" on manual saves: the Text app keeps per-file session state (etag, checksum, editor steps) that our background write invalidated. The Text document state of the Todos page is now reset on every regeneration, so open editors reload the fresh content. Unsaved manual edits to the Todos page are discarded by design.

Changed

  • Minimum Nextcloud version raised from 25 to 27 (the admin settings controller uses the AuthorizedAdminSetting attribute introduced in 27).
  • appinfo/info.xml brought into the form the Nextcloud app store validates: added the required <summary>, renamed <license> to <licence> and <depends> to <dependencies>, and dropped the <app>collectives</app> element (not part of the store or server schema, so it was never read; the Collectives dependency is enforced at runtime via IAppManager). No runtime behavior changes on servers already running the app.

Fixed

  • Reverse-syncing a tick made in the Collectives editor: the Text editor strips trailing whitespace on save, so a Todos page checkbox whose source line ends in spaces no longer matched the cached source text and the tick was silently dropped. Checkbox texts are now trimmed when parsed, and the reverse sync also tolerates untrimmed legacy cache entries.
  • Deleting the Todos page recreates it immediately. Collectives moves deleted pages to trash; the trash move is complete before the delete event fires and collectives paths are never locked, so no delayed recreation is needed.
  • The emoji of a freshly (re)created Todos page is now really written: inserting the missing collectives_pages row failed because its last_user_id column is NOT NULL. The app-created row now carries an empty user id (the frontend hides the "last edited" info for such pages), like untouched pages.
  • Deleting a page did not clean up the Todos page: the deleted page's section and checkboxes stayed listed. A Collectives page is a folder (the index page is its Readme.md, subpages are further files in it), and deleting it only emits a filesystem event for the folder itself - the markdown files inside vanish without their own events. A new listener for BeforeNodeDeletedEvent now collects the markdown pages under a folder before it is deleted, removes them from the cache and regenerates the Todos page. Plain .md file deletes keep their previous cleanup path. Restoring a page from the Collectives trash does not re-add it to the Todos page until the page is saved again or collectives_todos:init runs.
  • After ticking a checkbox on the Todos page, the source page briefly showed the tick and then reverted to its old content, with the editor refusing saves ("File changed in the meantime from outside"): the Text app keeps per-file session state (etag, checksum, steps) also for source pages, and the reverse sync's external write desynced it. The Text document state of a source page is now reset when the reverse sync writes it, so the page loads with the synced state and saves work. Unsaved keystrokes in an editing session open on that page at that moment are discarded (same contract the Todos page already has).
  • Checking a checkbox on the Todos page and saving broke the editing session: the reverse sync's regeneration of the Todos page ran nested inside the save and rewrote the page with a fresh "Last updated" timestamp, changing the etag under the open editor ("Error saving the document", conflict diff prompts). The Todos page is now only rewritten when its content actually changes (checkbox states, pages, titles); an update that would only refresh the "Last updated" timestamp leaves the file - and open editing sessions - untouched.
  • App bootstrap was silently skipped: info.xml declared the full namespace (OCA\CollectiveTodos), which Nextcloud prefixes with OCA\ itself, so no class of the app was autoloadable. The namespace is now CollectiveTodos.
  • Application.php moved from appinfo/ to lib/AppInfo/ (PSR-4 location that the bootstrap looks up).
  • CLI command is now registered via info.xml <commands> (previously the occ command never showed up).
  • Todos page is now written to the collectives root folder (previously it was written next to the edited page).
  • Page titles for Readme.md pages now use the page folder name (Collectives stores a page as folder with a Readme.md inside).
  • The listener skips its own Todos.md writes to avoid an infinite write-event loop, and logs failures instead of breaking saves.
  • collectives_todos:init now scans all pages of a collectives and accepts the collectives id as used by the Collectives app.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignaturetOPFL+uJkvXf4IYYON0b0T+MahYmk+Sga4NLaCPjTbv+nUklqi4DBjxNPKZEFLSHW+e7b6A2wR+uL+ugBCy9IWjJHfe35JVt1g/06s28dnXkm6nrod3AtPk4DgrZ2HHrDgPo86K4iIW2KIeW+IMbT1iKhYLQ9mGq3YcBPPtDgWzNjbpLid+PcGtxcPn8+E6GuOkrN6YbKuNkkdhL6UGuuqlHFYw7bVzDN41shzSaMYrUBmZUXXl/5ZnbnewEgiGZf6wsobuxQZ6uLqNjl9yKBvA85quuhBcnEHL0L+aFZn0xTuX8YFxvVmrx9iO8m24luzzSys35L/PL9W2l7m+w4MOX5zTIKkx+q8ExR8PtZBYOZqhaUPcZZwYLHFvJUlGL80LOPil51hn0qrsOUdJCd5yZqcoLoZxbBFKj1njokd7cTb8ZNPbw/lYsMnp8JCp4ldTTVLE/+P3U4p7aG1lbOIP33zMzOz6R+oF3w3xuNlT6QFRjvztbXzLohaj2fuTx3rVuraaztowQk9tLSqFiuRbMh5KHv3n9BFAuijyR9mfaPwJpEnKD0u0nKJmb2oIAkrwviHjYJR1xUbNsiZHbEQOpW2UMy0+5wvE++zGGCX+c3p9lRFqN00+KO1RNosmEOnmd/st12hZowjR+oayERlBKLUBXXxgO7h4/MIUHqYs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32

Nextcloud 29

Collectives Todos 0.2.1
Release Details
UpdatedOct. 11, 2026, 2:41 p.m.
Changelog

Added

  • The admin settings screenshot as the sixth app store screenshot (<screenshot> entry in appinfo/info.xml), shown on the product page next to the last walkthrough step and in the README.

  • Prominent "Get it from the Nextcloud app store" call to action on the product page hero (plus a footer link), pointing at https://apps.nextcloud.com/apps/collectives_todos.

Changed

  • The README installation section now points to the app store (the app is published there) with the manual deployment kept as an alternative.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureedvRvIjx/6LToXBwB+QHid0lEDz+peoI2WFIXXJJjwV7xFHjVnXMFrpxxh16/dIoh8fEGehpMnxkY0f1mHRems9HhMVUORmNk3OYj4S+sStM0SlWurEpNXxPOjAHAGDMLiURYlrKbvml+vtzHl6RGrxhYUKG3csuw05EnnRE06AVNwXg4Hcq4fh2hyqkHlT92bjByc+/c2RPxKU8PROs8IdelKEE7HLpBZa3hTAMccqh8QgzEIZa32HAOk51sF5pOIbAf+X8TKh4yUkMMB3lY1KzP2AR3fpnCtpEE6oaBq+f0N9HELhjNCYemuw15SK+gVSoUwTz+JniVF6o5VML9bupl+l6Jn6WG2WRQ/keCJJof1CCTDXfmzg5mkWCHezyXT03V/zQ7WWkiF8/MjyRFKTRzG76YcRXRHrhwtdxe8gDnjQVWRYaDoAXeVxTlqlcOpImy5ZlFrt9CeVmnVxzM6x6woNgWIA8M7TVlflWHbeAZC27gM4S7mxCuJ7FNhw/GhRDSujdVD3LFgYrEgT5XeEKuasutl0nxIUOq3CQxMquHIetZ6pm9MPSLHyzhxpqaMKPmY6UvRTVYkAY/uhmOQDug6BfwRUeM2BemFz2tDFbYzpLixpC2UGuBj4hIc2LwEJ3eSO19Fz46XiqBfqaH7Yd659PnQ+096Jj2m0DKDs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.2.0
Release Details
UpdatedOct. 11, 2026, 2:17 p.m.
Changelog

Added

  • Support for Nextcloud 35: the supported range is now Nextcloud 27–35, and the functional test test rig boots nextcloud:35-apache by default.

  • One-command local verification: tests/functional/test-rig.sh verify boots the newest supported Nextcloud, installs Collectives and the local working tree, seeds the fixture collective, runs the smoke checks and the PHPUnit suite, and leaves the server running at http://127.0.0.1:8080 (admin/admin) for manual verification when everything is green. When reusing an already-running container, it redeploys the current working tree and re-applies the English language defaults first.

  • The functional test rig now defaults to English (default_language/default_locale set to en/en_US, likewise for the admin user) and seeds every fixture page with a fitting emoji via the Collectives setEmoji API; the smoke checks assert those emojis and the Todos page emoji.

  • Continuous integration: .github/workflows/tests.yml runs the test rig smoke checks and the PHPUnit suite against the newest supported Nextcloud on every PR and push to main.

Changed

  • The default Todos page emoji is now 📝 (previously none). Existing instances without a stored setting pick it up on the next regeneration of a Todos page; the emoji stays configurable instance-wide and per collective, and empty still means no emoji.

  • tests/run.sh downloads phpunit.phar (pinned to 13.4.1, sha256-verified) into the container automatically when it is missing, instead of aborting.

  • The app store and product page screenshots are now a five-part step-by-step walkthrough of the flow (Todos page, source page, tick, synced regeneration), replacing the four earlier screenshots, and the product page (www/) embeds a demo video (www/screenshots/demo.mp4) that plays as you scroll.

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureJzuRSTWBNn8sqEbuJPy6xtam9PkpPFHvAHU1QL5B0jrqG5F2xcOjPqkOv1V5YP5IWO5LmlAbSPueMkDjFumlq30WYtbdxUbIAyqz9XFDXXNUuSPgRay03u8pPxaiy6rzeTlSTJJ9L3Wt+Nk14111OSVTNkwNMQQsbvARIdieBwMw/9iwetigBdvdxnebPlVLDuWNVOeyC4NT5l/POp1S8ZhF9JWxQ27PDSY3GH3z7KsHtAfCo0XJEk8WAGgXF2/0RxLnBrNYLFUNJhYkh96QAE+0Xb1qq0e44yL+8Xw3Ym8SI6pCIo+Ula1EKJILprkpvr/YTR1uIiSCd1l5FylPuNfbohA60A7Y3LxvXR3bFY2d/BJzf8rh8FbdyS9vvcrC8WlhxaRTSM5UumzRwzFZ18Ng546N0nxZIfMApALDxGEC2kTGPX+ndikdToIb821ZkvOD3Dr7DY0C/89WHasQX1ddHEVNNrY7ED/c0LruVUXxNHHN64ojMseJbAZvBdqm//g9mA8JZWgY0AA7XA95Q3kDvUxZCi9rY6f5Hlxmfy+YfgwmmUHN/F0Agfdpyb1N0akNb3r4c8nbgUF1xAUyrLYWhB0/55H4C3SLKfZmgK2PiD6iHabO07FgTrmVSkwBM34V3RnDeP+VjZ1BRpOd9bnd7lfulNAyzcbbMU2WDXM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.1.1
Release Details
UpdatedOct. 10, 2026, 4:24 p.m.
Changelog

Added

  • App store screenshots: four screenshots of the Todos page (committed under screenshots/) are published to the Nextcloud app store via <screenshot> entries in appinfo/info.xml and shown in the README.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureX6hXrUQappIKfeUJ6GkiJtl2ppUFX1UlIti3j/FKOaiCJznrqgJO/8jx2/ndDGWEsONVQObbwhK7G7nPxVejfx/nJ2Y2wnoLd+kzBXF86KyOuEz/1uhNZPf0VK38QtAOeSknBu5vRQ0sCWOTkC+lOSumWPjksH3jjK6GkxM0RwbWz3TmxxMPzbYJho9nXmhNK6n+sKsGvEf83OCAd4ishrJnoqWqpp3P6Tnwhw/HyUQww1X+kPykcmibFSyWpSgfHY/A4ojqrIMVE13r0O0T4odCttEo0fOat5O9uJLSrjZezlzKxOydANssKcbuIbcth3hJZa7H2q3FsdYB8LaClrMaizc/dLvACKfh1jK3qPWEfAWcj6nLLAv16v6FeZX88JklWibGPUpHgLurjfjp3pF8gnmbFjNFdDbLavsrFFXwNClb8wxf7NCFqATcxaCApVp/iS+5vnwIRag4+mIWw+phDHgo3+PNJD4Nt2ungW7YMJa41DXk1Bkrwbc8ylCuvdVKdBP3XrnNJeS1LpUnLf3/zXOtCNmK+KAcEJ2ClEoYKPvnoUN2SO0nXBcpGk7U38eumPeIps6ZE2dkeQ/NiiDQEMsxOrjF+N5sWyXGR58+5qDAIKGb919jjAVbO1p0T9wCkRXtMNDyq4z3WzlJHKCwEUk926aFgwKf5svT0K8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32
Collectives Todos 0.1.0
Release Details
UpdatedOct. 7, 2026, 6:31 p.m.
Changelog

Added

  • Initial release of Collectives Todos: event-driven aggregation of markdown checkboxes across all pages of a Collectives into an auto-maintained Todos page, using Nextcloud core file events, a JSON cache for efficient updates and a CLI command (occ collectives_todos:init <collectives-id>) to build the page for existing collectives. Unit tests cover all core services and listeners.

  • App store release packaging: a GitHub Action (.github/workflows/release.yml) builds a store-conformant collectives_todos-vX.Y.Z.tar.gz (single top-level folder named after the app id, dev files excluded) on every v* tag, signs it with the app certificate and attaches archive and signature to the GitHub release. Tag and app version must match, and appinfo/info.xml is validated against the app store schema. With the APPSTORE_TOKEN secret set, the release is also published to the Nextcloud app store automatically.

  • Per-collective Enable/Disable button in the settings page's per-collective table. Disabling deletes the collective's Todos page (to trash) and stops generating or reverse-syncing it; the checkbox cache keeps being maintained, so enabling regenerates a consistent page immediately. Enabled is the default.
  • Global Enable/Disable button in the settings page's Defaults section: flips the instance-wide default. Enabling resets every collective to enabled - it clears all per-collective enabled opt-outs and regenerates their Todos pages, since opting into the app means wanting it everywhere; disabling single collectives stays the manual choice. Disabling globally deletes the Todos page of every collective that is not already opted out.
  • The per-collective Enable button clears the collective's enabled override instead of writing a sticky enabled value: a sticky override would shield the collective from the global default toggle forever, so a global disable reliably deletes every Todos page of collectives that were not explicitly disabled. The per-row Enable buttons render as inactive while the global default is disabled. Deleting the Todos page on disable now also removes its collectives_pages row (the delete is a hard delete on the appdata path, which the Collectives trash does not handle; the managed page's content is fully derived, so nothing of value is lost). The row is resolved untrashed and deleted directly: Collectives' PageMapper::deleteByFileId only removes rows that were moved to trash and silently ignored the hard-deleted page's row, leaking one on every disable cycle.
  • Todos page emoji config item (default none, per-collective override): the emoji is written to the Todos page's collectives_pages row like the emoji of any other Collectives page and rendered in the page tree. Validated with the Collectives app's own emoji validation; the settings page ships a curated emoji picker built with plain HTML/JS (no new dependencies), and any emoji can be pasted directly. The emoji is enforced on every Todos page regeneration and on settings save.
  • Admin settings page (Settings → Admin → Collectives Todos) with instance-wide defaults and per-collective overrides for three config items: the Todos page name (default Todos), the position of the Todos page in the Collectives page tree (always on top / always on bottom / alphabetically, default always on top) and the maximum number of cached checkboxes per collective (0 = unlimited, default 0). An empty override field uses the default. Invalid input is rejected without storing anything.
  • The tree position is enforced by writing the landing page's collectives_pages.subpage_order (the Collectives frontend sorts listed pages by array order, unlisted pages alphabetically), on every Todos page regeneration and on settings save. Manual ordering of the other pages is preserved; an already-open Collectives tab needs a reload to pick up the new order.
  • Changing the Todos page name renames the existing Todos page file; if a page with the new name already exists in a collective, the rename is skipped and reported on the settings page.
  • When the checkbox limit is reached, further checkboxes are not cached and the Todos page renders a *(list truncated by the settings limit)* note under the affected page's section.
  • Bidirectional checkbox sync: ticking or unticking a checkbox on the Todos page now also updates the checkbox on the source page it was aggregated from. Sections of the Todos page are resolved to source pages by the page file id in the heading link URL (title as fallback), and checkboxes are matched by text within a section. Only checked-state changes are synced; text edits on the Todos page are discarded with the next regeneration. If the cached line number of a checkbox has drifted, the checkbox is located by a unique text match, otherwise the change is skipped and a warning is logged.
  • Page headings on the Todos page are now links to the corresponding page, in the same URL format the Collectives app itself uses (/apps/collectives/<collectives>/<slug>-<pageId>, with a ?fileId= fallback for pages without a slug). If the URL cannot be resolved, the plain heading is kept.
  • Regenerating the Todos page while the Text editor had it open caused stale content to be shown and "Error saving the document" on manual saves: the Text app keeps per-file session state (etag, checksum, editor steps) that our background write invalidated. The Text document state of the Todos page is now reset on every regeneration, so open editors reload the fresh content. Unsaved manual edits to the Todos page are discarded by design.

Changed

  • Minimum Nextcloud version raised from 25 to 27 (the admin settings controller uses the AuthorizedAdminSetting attribute introduced in 27).
  • appinfo/info.xml brought into the form the Nextcloud app store validates: added the required <summary>, renamed <license> to <licence> and <depends> to <dependencies>, and dropped the <app>collectives</app> element (not part of the store or server schema, so it was never read; the Collectives dependency is enforced at runtime via IAppManager). No runtime behavior changes on servers already running the app.

Fixed

  • Reverse-syncing a tick made in the Collectives editor: the Text editor strips trailing whitespace on save, so a Todos page checkbox whose source line ends in spaces no longer matched the cached source text and the tick was silently dropped. Checkbox texts are now trimmed when parsed, and the reverse sync also tolerates untrimmed legacy cache entries.
  • Deleting the Todos page recreates it immediately. Collectives moves deleted pages to trash; the trash move is complete before the delete event fires and collectives paths are never locked, so no delayed recreation is needed.
  • The emoji of a freshly (re)created Todos page is now really written: inserting the missing collectives_pages row failed because its last_user_id column is NOT NULL. The app-created row now carries an empty user id (the frontend hides the "last edited" info for such pages), like untouched pages.
  • Deleting a page did not clean up the Todos page: the deleted page's section and checkboxes stayed listed. A Collectives page is a folder (the index page is its Readme.md, subpages are further files in it), and deleting it only emits a filesystem event for the folder itself - the markdown files inside vanish without their own events. A new listener for BeforeNodeDeletedEvent now collects the markdown pages under a folder before it is deleted, removes them from the cache and regenerates the Todos page. Plain .md file deletes keep their previous cleanup path. Restoring a page from the Collectives trash does not re-add it to the Todos page until the page is saved again or collectives_todos:init runs.
  • After ticking a checkbox on the Todos page, the source page briefly showed the tick and then reverted to its old content, with the editor refusing saves ("File changed in the meantime from outside"): the Text app keeps per-file session state (etag, checksum, steps) also for source pages, and the reverse sync's external write desynced it. The Text document state of a source page is now reset when the reverse sync writes it, so the page loads with the synced state and saves work. Unsaved keystrokes in an editing session open on that page at that moment are discarded (same contract the Todos page already has).
  • Checking a checkbox on the Todos page and saving broke the editing session: the reverse sync's regeneration of the Todos page ran nested inside the save and rewrote the page with a fresh "Last updated" timestamp, changing the etag under the open editor ("Error saving the document", conflict diff prompts). The Todos page is now only rewritten when its content actually changes (checkbox states, pages, titles); an update that would only refresh the "Last updated" timestamp leaves the file - and open editing sessions - untouched.
  • App bootstrap was silently skipped: info.xml declared the full namespace (OCA\CollectiveTodos), which Nextcloud prefixes with OCA\ itself, so no class of the app was autoloadable. The namespace is now CollectiveTodos.
  • Application.php moved from appinfo/ to lib/AppInfo/ (PSR-4 location that the bootstrap looks up).
  • CLI command is now registered via info.xml <commands> (previously the occ command never showed up).
  • Todos page is now written to the collectives root folder (previously it was written next to the edited page).
  • Page titles for Readme.md pages now use the page folder name (Collectives stores a page as folder with a Readme.md inside).
  • The listener skips its own Todos.md writes to avoid an infinite write-event loop, and logs failures instead of breaking saves.
  • collectives_todos:init now scans all pages of a collectives and accepts the collectives id as used by the Collectives app.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignaturetOPFL+uJkvXf4IYYON0b0T+MahYmk+Sga4NLaCPjTbv+nUklqi4DBjxNPKZEFLSHW+e7b6A2wR+uL+ugBCy9IWjJHfe35JVt1g/06s28dnXkm6nrod3AtPk4DgrZ2HHrDgPo86K4iIW2KIeW+IMbT1iKhYLQ9mGq3YcBPPtDgWzNjbpLid+PcGtxcPn8+E6GuOkrN6YbKuNkkdhL6UGuuqlHFYw7bVzDN41shzSaMYrUBmZUXXl/5ZnbnewEgiGZf6wsobuxQZ6uLqNjl9yKBvA85quuhBcnEHL0L+aFZn0xTuX8YFxvVmrx9iO8m24luzzSys35L/PL9W2l7m+w4MOX5zTIKkx+q8ExR8PtZBYOZqhaUPcZZwYLHFvJUlGL80LOPil51hn0qrsOUdJCd5yZqcoLoZxbBFKj1njokd7cTb8ZNPbw/lYsMnp8JCp4ldTTVLE/+P3U4p7aG1lbOIP33zMzOz6R+oF3w3xuNlT6QFRjvztbXzLohaj2fuTx3rVuraaztowQk9tLSqFiuRbMh5KHv3n9BFAuijyR9mfaPwJpEnKD0u0nKJmb2oIAkrwviHjYJR1xUbNsiZHbEQOpW2UMy0+5wvE++zGGCX+c3p9lRFqN00+KO1RNosmEOnmd/st12hZowjR+oayERlBKLUBXXxgO7h4/MIUHqYs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32

Nextcloud 28

Collectives Todos 0.2.1
Release Details
UpdatedOct. 11, 2026, 2:41 p.m.
Changelog

Added

  • The admin settings screenshot as the sixth app store screenshot (<screenshot> entry in appinfo/info.xml), shown on the product page next to the last walkthrough step and in the README.

  • Prominent "Get it from the Nextcloud app store" call to action on the product page hero (plus a footer link), pointing at https://apps.nextcloud.com/apps/collectives_todos.

Changed

  • The README installation section now points to the app store (the app is published there) with the manual deployment kept as an alternative.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureedvRvIjx/6LToXBwB+QHid0lEDz+peoI2WFIXXJJjwV7xFHjVnXMFrpxxh16/dIoh8fEGehpMnxkY0f1mHRems9HhMVUORmNk3OYj4S+sStM0SlWurEpNXxPOjAHAGDMLiURYlrKbvml+vtzHl6RGrxhYUKG3csuw05EnnRE06AVNwXg4Hcq4fh2hyqkHlT92bjByc+/c2RPxKU8PROs8IdelKEE7HLpBZa3hTAMccqh8QgzEIZa32HAOk51sF5pOIbAf+X8TKh4yUkMMB3lY1KzP2AR3fpnCtpEE6oaBq+f0N9HELhjNCYemuw15SK+gVSoUwTz+JniVF6o5VML9bupl+l6Jn6WG2WRQ/keCJJof1CCTDXfmzg5mkWCHezyXT03V/zQ7WWkiF8/MjyRFKTRzG76YcRXRHrhwtdxe8gDnjQVWRYaDoAXeVxTlqlcOpImy5ZlFrt9CeVmnVxzM6x6woNgWIA8M7TVlflWHbeAZC27gM4S7mxCuJ7FNhw/GhRDSujdVD3LFgYrEgT5XeEKuasutl0nxIUOq3CQxMquHIetZ6pm9MPSLHyzhxpqaMKPmY6UvRTVYkAY/uhmOQDug6BfwRUeM2BemFz2tDFbYzpLixpC2UGuBj4hIc2LwEJ3eSO19Fz46XiqBfqaH7Yd659PnQ+096Jj2m0DKDs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.2.0
Release Details
UpdatedOct. 11, 2026, 2:17 p.m.
Changelog

Added

  • Support for Nextcloud 35: the supported range is now Nextcloud 27–35, and the functional test test rig boots nextcloud:35-apache by default.

  • One-command local verification: tests/functional/test-rig.sh verify boots the newest supported Nextcloud, installs Collectives and the local working tree, seeds the fixture collective, runs the smoke checks and the PHPUnit suite, and leaves the server running at http://127.0.0.1:8080 (admin/admin) for manual verification when everything is green. When reusing an already-running container, it redeploys the current working tree and re-applies the English language defaults first.

  • The functional test rig now defaults to English (default_language/default_locale set to en/en_US, likewise for the admin user) and seeds every fixture page with a fitting emoji via the Collectives setEmoji API; the smoke checks assert those emojis and the Todos page emoji.

  • Continuous integration: .github/workflows/tests.yml runs the test rig smoke checks and the PHPUnit suite against the newest supported Nextcloud on every PR and push to main.

Changed

  • The default Todos page emoji is now 📝 (previously none). Existing instances without a stored setting pick it up on the next regeneration of a Todos page; the emoji stays configurable instance-wide and per collective, and empty still means no emoji.

  • tests/run.sh downloads phpunit.phar (pinned to 13.4.1, sha256-verified) into the container automatically when it is missing, instead of aborting.

  • The app store and product page screenshots are now a five-part step-by-step walkthrough of the flow (Todos page, source page, tick, synced regeneration), replacing the four earlier screenshots, and the product page (www/) embeds a demo video (www/screenshots/demo.mp4) that plays as you scroll.

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureJzuRSTWBNn8sqEbuJPy6xtam9PkpPFHvAHU1QL5B0jrqG5F2xcOjPqkOv1V5YP5IWO5LmlAbSPueMkDjFumlq30WYtbdxUbIAyqz9XFDXXNUuSPgRay03u8pPxaiy6rzeTlSTJJ9L3Wt+Nk14111OSVTNkwNMQQsbvARIdieBwMw/9iwetigBdvdxnebPlVLDuWNVOeyC4NT5l/POp1S8ZhF9JWxQ27PDSY3GH3z7KsHtAfCo0XJEk8WAGgXF2/0RxLnBrNYLFUNJhYkh96QAE+0Xb1qq0e44yL+8Xw3Ym8SI6pCIo+Ula1EKJILprkpvr/YTR1uIiSCd1l5FylPuNfbohA60A7Y3LxvXR3bFY2d/BJzf8rh8FbdyS9vvcrC8WlhxaRTSM5UumzRwzFZ18Ng546N0nxZIfMApALDxGEC2kTGPX+ndikdToIb821ZkvOD3Dr7DY0C/89WHasQX1ddHEVNNrY7ED/c0LruVUXxNHHN64ojMseJbAZvBdqm//g9mA8JZWgY0AA7XA95Q3kDvUxZCi9rY6f5Hlxmfy+YfgwmmUHN/F0Agfdpyb1N0akNb3r4c8nbgUF1xAUyrLYWhB0/55H4C3SLKfZmgK2PiD6iHabO07FgTrmVSkwBM34V3RnDeP+VjZ1BRpOd9bnd7lfulNAyzcbbMU2WDXM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.1.1
Release Details
UpdatedOct. 10, 2026, 4:24 p.m.
Changelog

Added

  • App store screenshots: four screenshots of the Todos page (committed under screenshots/) are published to the Nextcloud app store via <screenshot> entries in appinfo/info.xml and shown in the README.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureX6hXrUQappIKfeUJ6GkiJtl2ppUFX1UlIti3j/FKOaiCJznrqgJO/8jx2/ndDGWEsONVQObbwhK7G7nPxVejfx/nJ2Y2wnoLd+kzBXF86KyOuEz/1uhNZPf0VK38QtAOeSknBu5vRQ0sCWOTkC+lOSumWPjksH3jjK6GkxM0RwbWz3TmxxMPzbYJho9nXmhNK6n+sKsGvEf83OCAd4ishrJnoqWqpp3P6Tnwhw/HyUQww1X+kPykcmibFSyWpSgfHY/A4ojqrIMVE13r0O0T4odCttEo0fOat5O9uJLSrjZezlzKxOydANssKcbuIbcth3hJZa7H2q3FsdYB8LaClrMaizc/dLvACKfh1jK3qPWEfAWcj6nLLAv16v6FeZX88JklWibGPUpHgLurjfjp3pF8gnmbFjNFdDbLavsrFFXwNClb8wxf7NCFqATcxaCApVp/iS+5vnwIRag4+mIWw+phDHgo3+PNJD4Nt2ungW7YMJa41DXk1Bkrwbc8ylCuvdVKdBP3XrnNJeS1LpUnLf3/zXOtCNmK+KAcEJ2ClEoYKPvnoUN2SO0nXBcpGk7U38eumPeIps6ZE2dkeQ/NiiDQEMsxOrjF+N5sWyXGR58+5qDAIKGb919jjAVbO1p0T9wCkRXtMNDyq4z3WzlJHKCwEUk926aFgwKf5svT0K8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32
Collectives Todos 0.1.0
Release Details
UpdatedOct. 7, 2026, 6:31 p.m.
Changelog

Added

  • Initial release of Collectives Todos: event-driven aggregation of markdown checkboxes across all pages of a Collectives into an auto-maintained Todos page, using Nextcloud core file events, a JSON cache for efficient updates and a CLI command (occ collectives_todos:init <collectives-id>) to build the page for existing collectives. Unit tests cover all core services and listeners.

  • App store release packaging: a GitHub Action (.github/workflows/release.yml) builds a store-conformant collectives_todos-vX.Y.Z.tar.gz (single top-level folder named after the app id, dev files excluded) on every v* tag, signs it with the app certificate and attaches archive and signature to the GitHub release. Tag and app version must match, and appinfo/info.xml is validated against the app store schema. With the APPSTORE_TOKEN secret set, the release is also published to the Nextcloud app store automatically.

  • Per-collective Enable/Disable button in the settings page's per-collective table. Disabling deletes the collective's Todos page (to trash) and stops generating or reverse-syncing it; the checkbox cache keeps being maintained, so enabling regenerates a consistent page immediately. Enabled is the default.
  • Global Enable/Disable button in the settings page's Defaults section: flips the instance-wide default. Enabling resets every collective to enabled - it clears all per-collective enabled opt-outs and regenerates their Todos pages, since opting into the app means wanting it everywhere; disabling single collectives stays the manual choice. Disabling globally deletes the Todos page of every collective that is not already opted out.
  • The per-collective Enable button clears the collective's enabled override instead of writing a sticky enabled value: a sticky override would shield the collective from the global default toggle forever, so a global disable reliably deletes every Todos page of collectives that were not explicitly disabled. The per-row Enable buttons render as inactive while the global default is disabled. Deleting the Todos page on disable now also removes its collectives_pages row (the delete is a hard delete on the appdata path, which the Collectives trash does not handle; the managed page's content is fully derived, so nothing of value is lost). The row is resolved untrashed and deleted directly: Collectives' PageMapper::deleteByFileId only removes rows that were moved to trash and silently ignored the hard-deleted page's row, leaking one on every disable cycle.
  • Todos page emoji config item (default none, per-collective override): the emoji is written to the Todos page's collectives_pages row like the emoji of any other Collectives page and rendered in the page tree. Validated with the Collectives app's own emoji validation; the settings page ships a curated emoji picker built with plain HTML/JS (no new dependencies), and any emoji can be pasted directly. The emoji is enforced on every Todos page regeneration and on settings save.
  • Admin settings page (Settings → Admin → Collectives Todos) with instance-wide defaults and per-collective overrides for three config items: the Todos page name (default Todos), the position of the Todos page in the Collectives page tree (always on top / always on bottom / alphabetically, default always on top) and the maximum number of cached checkboxes per collective (0 = unlimited, default 0). An empty override field uses the default. Invalid input is rejected without storing anything.
  • The tree position is enforced by writing the landing page's collectives_pages.subpage_order (the Collectives frontend sorts listed pages by array order, unlisted pages alphabetically), on every Todos page regeneration and on settings save. Manual ordering of the other pages is preserved; an already-open Collectives tab needs a reload to pick up the new order.
  • Changing the Todos page name renames the existing Todos page file; if a page with the new name already exists in a collective, the rename is skipped and reported on the settings page.
  • When the checkbox limit is reached, further checkboxes are not cached and the Todos page renders a *(list truncated by the settings limit)* note under the affected page's section.
  • Bidirectional checkbox sync: ticking or unticking a checkbox on the Todos page now also updates the checkbox on the source page it was aggregated from. Sections of the Todos page are resolved to source pages by the page file id in the heading link URL (title as fallback), and checkboxes are matched by text within a section. Only checked-state changes are synced; text edits on the Todos page are discarded with the next regeneration. If the cached line number of a checkbox has drifted, the checkbox is located by a unique text match, otherwise the change is skipped and a warning is logged.
  • Page headings on the Todos page are now links to the corresponding page, in the same URL format the Collectives app itself uses (/apps/collectives/<collectives>/<slug>-<pageId>, with a ?fileId= fallback for pages without a slug). If the URL cannot be resolved, the plain heading is kept.
  • Regenerating the Todos page while the Text editor had it open caused stale content to be shown and "Error saving the document" on manual saves: the Text app keeps per-file session state (etag, checksum, editor steps) that our background write invalidated. The Text document state of the Todos page is now reset on every regeneration, so open editors reload the fresh content. Unsaved manual edits to the Todos page are discarded by design.

Changed

  • Minimum Nextcloud version raised from 25 to 27 (the admin settings controller uses the AuthorizedAdminSetting attribute introduced in 27).
  • appinfo/info.xml brought into the form the Nextcloud app store validates: added the required <summary>, renamed <license> to <licence> and <depends> to <dependencies>, and dropped the <app>collectives</app> element (not part of the store or server schema, so it was never read; the Collectives dependency is enforced at runtime via IAppManager). No runtime behavior changes on servers already running the app.

Fixed

  • Reverse-syncing a tick made in the Collectives editor: the Text editor strips trailing whitespace on save, so a Todos page checkbox whose source line ends in spaces no longer matched the cached source text and the tick was silently dropped. Checkbox texts are now trimmed when parsed, and the reverse sync also tolerates untrimmed legacy cache entries.
  • Deleting the Todos page recreates it immediately. Collectives moves deleted pages to trash; the trash move is complete before the delete event fires and collectives paths are never locked, so no delayed recreation is needed.
  • The emoji of a freshly (re)created Todos page is now really written: inserting the missing collectives_pages row failed because its last_user_id column is NOT NULL. The app-created row now carries an empty user id (the frontend hides the "last edited" info for such pages), like untouched pages.
  • Deleting a page did not clean up the Todos page: the deleted page's section and checkboxes stayed listed. A Collectives page is a folder (the index page is its Readme.md, subpages are further files in it), and deleting it only emits a filesystem event for the folder itself - the markdown files inside vanish without their own events. A new listener for BeforeNodeDeletedEvent now collects the markdown pages under a folder before it is deleted, removes them from the cache and regenerates the Todos page. Plain .md file deletes keep their previous cleanup path. Restoring a page from the Collectives trash does not re-add it to the Todos page until the page is saved again or collectives_todos:init runs.
  • After ticking a checkbox on the Todos page, the source page briefly showed the tick and then reverted to its old content, with the editor refusing saves ("File changed in the meantime from outside"): the Text app keeps per-file session state (etag, checksum, steps) also for source pages, and the reverse sync's external write desynced it. The Text document state of a source page is now reset when the reverse sync writes it, so the page loads with the synced state and saves work. Unsaved keystrokes in an editing session open on that page at that moment are discarded (same contract the Todos page already has).
  • Checking a checkbox on the Todos page and saving broke the editing session: the reverse sync's regeneration of the Todos page ran nested inside the save and rewrote the page with a fresh "Last updated" timestamp, changing the etag under the open editor ("Error saving the document", conflict diff prompts). The Todos page is now only rewritten when its content actually changes (checkbox states, pages, titles); an update that would only refresh the "Last updated" timestamp leaves the file - and open editing sessions - untouched.
  • App bootstrap was silently skipped: info.xml declared the full namespace (OCA\CollectiveTodos), which Nextcloud prefixes with OCA\ itself, so no class of the app was autoloadable. The namespace is now CollectiveTodos.
  • Application.php moved from appinfo/ to lib/AppInfo/ (PSR-4 location that the bootstrap looks up).
  • CLI command is now registered via info.xml <commands> (previously the occ command never showed up).
  • Todos page is now written to the collectives root folder (previously it was written next to the edited page).
  • Page titles for Readme.md pages now use the page folder name (Collectives stores a page as folder with a Readme.md inside).
  • The listener skips its own Todos.md writes to avoid an infinite write-event loop, and logs failures instead of breaking saves.
  • collectives_todos:init now scans all pages of a collectives and accepts the collectives id as used by the Collectives app.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignaturetOPFL+uJkvXf4IYYON0b0T+MahYmk+Sga4NLaCPjTbv+nUklqi4DBjxNPKZEFLSHW+e7b6A2wR+uL+ugBCy9IWjJHfe35JVt1g/06s28dnXkm6nrod3AtPk4DgrZ2HHrDgPo86K4iIW2KIeW+IMbT1iKhYLQ9mGq3YcBPPtDgWzNjbpLid+PcGtxcPn8+E6GuOkrN6YbKuNkkdhL6UGuuqlHFYw7bVzDN41shzSaMYrUBmZUXXl/5ZnbnewEgiGZf6wsobuxQZ6uLqNjl9yKBvA85quuhBcnEHL0L+aFZn0xTuX8YFxvVmrx9iO8m24luzzSys35L/PL9W2l7m+w4MOX5zTIKkx+q8ExR8PtZBYOZqhaUPcZZwYLHFvJUlGL80LOPil51hn0qrsOUdJCd5yZqcoLoZxbBFKj1njokd7cTb8ZNPbw/lYsMnp8JCp4ldTTVLE/+P3U4p7aG1lbOIP33zMzOz6R+oF3w3xuNlT6QFRjvztbXzLohaj2fuTx3rVuraaztowQk9tLSqFiuRbMh5KHv3n9BFAuijyR9mfaPwJpEnKD0u0nKJmb2oIAkrwviHjYJR1xUbNsiZHbEQOpW2UMy0+5wvE++zGGCX+c3p9lRFqN00+KO1RNosmEOnmd/st12hZowjR+oayERlBKLUBXXxgO7h4/MIUHqYs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32

Nextcloud 27

Collectives Todos 0.2.1
Release Details
UpdatedOct. 11, 2026, 2:41 p.m.
Changelog

Added

  • The admin settings screenshot as the sixth app store screenshot (<screenshot> entry in appinfo/info.xml), shown on the product page next to the last walkthrough step and in the README.

  • Prominent "Get it from the Nextcloud app store" call to action on the product page hero (plus a footer link), pointing at https://apps.nextcloud.com/apps/collectives_todos.

Changed

  • The README installation section now points to the app store (the app is published there) with the manual deployment kept as an alternative.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureedvRvIjx/6LToXBwB+QHid0lEDz+peoI2WFIXXJJjwV7xFHjVnXMFrpxxh16/dIoh8fEGehpMnxkY0f1mHRems9HhMVUORmNk3OYj4S+sStM0SlWurEpNXxPOjAHAGDMLiURYlrKbvml+vtzHl6RGrxhYUKG3csuw05EnnRE06AVNwXg4Hcq4fh2hyqkHlT92bjByc+/c2RPxKU8PROs8IdelKEE7HLpBZa3hTAMccqh8QgzEIZa32HAOk51sF5pOIbAf+X8TKh4yUkMMB3lY1KzP2AR3fpnCtpEE6oaBq+f0N9HELhjNCYemuw15SK+gVSoUwTz+JniVF6o5VML9bupl+l6Jn6WG2WRQ/keCJJof1CCTDXfmzg5mkWCHezyXT03V/zQ7WWkiF8/MjyRFKTRzG76YcRXRHrhwtdxe8gDnjQVWRYaDoAXeVxTlqlcOpImy5ZlFrt9CeVmnVxzM6x6woNgWIA8M7TVlflWHbeAZC27gM4S7mxCuJ7FNhw/GhRDSujdVD3LFgYrEgT5XeEKuasutl0nxIUOq3CQxMquHIetZ6pm9MPSLHyzhxpqaMKPmY6UvRTVYkAY/uhmOQDug6BfwRUeM2BemFz2tDFbYzpLixpC2UGuBj4hIc2LwEJ3eSO19Fz46XiqBfqaH7Yd659PnQ+096Jj2m0DKDs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.2.0
Release Details
UpdatedOct. 11, 2026, 2:17 p.m.
Changelog

Added

  • Support for Nextcloud 35: the supported range is now Nextcloud 27–35, and the functional test test rig boots nextcloud:35-apache by default.

  • One-command local verification: tests/functional/test-rig.sh verify boots the newest supported Nextcloud, installs Collectives and the local working tree, seeds the fixture collective, runs the smoke checks and the PHPUnit suite, and leaves the server running at http://127.0.0.1:8080 (admin/admin) for manual verification when everything is green. When reusing an already-running container, it redeploys the current working tree and re-applies the English language defaults first.

  • The functional test rig now defaults to English (default_language/default_locale set to en/en_US, likewise for the admin user) and seeds every fixture page with a fitting emoji via the Collectives setEmoji API; the smoke checks assert those emojis and the Todos page emoji.

  • Continuous integration: .github/workflows/tests.yml runs the test rig smoke checks and the PHPUnit suite against the newest supported Nextcloud on every PR and push to main.

Changed

  • The default Todos page emoji is now 📝 (previously none). Existing instances without a stored setting pick it up on the next regeneration of a Todos page; the emoji stays configurable instance-wide and per collective, and empty still means no emoji.

  • tests/run.sh downloads phpunit.phar (pinned to 13.4.1, sha256-verified) into the container automatically when it is missing, instead of aborting.

  • The app store and product page screenshots are now a five-part step-by-step walkthrough of the flow (Todos page, source page, tick, synced regeneration), replacing the four earlier screenshots, and the product page (www/) embeds a demo video (www/screenshots/demo.mp4) that plays as you scroll.

Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureJzuRSTWBNn8sqEbuJPy6xtam9PkpPFHvAHU1QL5B0jrqG5F2xcOjPqkOv1V5YP5IWO5LmlAbSPueMkDjFumlq30WYtbdxUbIAyqz9XFDXXNUuSPgRay03u8pPxaiy6rzeTlSTJJ9L3Wt+Nk14111OSVTNkwNMQQsbvARIdieBwMw/9iwetigBdvdxnebPlVLDuWNVOeyC4NT5l/POp1S8ZhF9JWxQ27PDSY3GH3z7KsHtAfCo0XJEk8WAGgXF2/0RxLnBrNYLFUNJhYkh96QAE+0Xb1qq0e44yL+8Xw3Ym8SI6pCIo+Ula1EKJILprkpvr/YTR1uIiSCd1l5FylPuNfbohA60A7Y3LxvXR3bFY2d/BJzf8rh8FbdyS9vvcrC8WlhxaRTSM5UumzRwzFZ18Ng546N0nxZIfMApALDxGEC2kTGPX+ndikdToIb821ZkvOD3Dr7DY0C/89WHasQX1ddHEVNNrY7ED/c0LruVUXxNHHN64ojMseJbAZvBdqm//g9mA8JZWgY0AA7XA95Q3kDvUxZCi9rY6f5Hlxmfy+YfgwmmUHN/F0Agfdpyb1N0akNb3r4c8nbgUF1xAUyrLYWhB0/55H4C3SLKfZmgK2PiD6iHabO07FgTrmVSkwBM34V3RnDeP+VjZ1BRpOd9bnd7lfulNAyzcbbMU2WDXM=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<36.0.0
Minimum Integer bits32
Collectives Todos 0.1.1
Release Details
UpdatedOct. 10, 2026, 4:24 p.m.
Changelog

Added

  • App store screenshots: four screenshots of the Todos page (committed under screenshots/) are published to the Nextcloud app store via <screenshot> entries in appinfo/info.xml and shown in the README.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignatureX6hXrUQappIKfeUJ6GkiJtl2ppUFX1UlIti3j/FKOaiCJznrqgJO/8jx2/ndDGWEsONVQObbwhK7G7nPxVejfx/nJ2Y2wnoLd+kzBXF86KyOuEz/1uhNZPf0VK38QtAOeSknBu5vRQ0sCWOTkC+lOSumWPjksH3jjK6GkxM0RwbWz3TmxxMPzbYJho9nXmhNK6n+sKsGvEf83OCAd4ishrJnoqWqpp3P6Tnwhw/HyUQww1X+kPykcmibFSyWpSgfHY/A4ojqrIMVE13r0O0T4odCttEo0fOat5O9uJLSrjZezlzKxOydANssKcbuIbcth3hJZa7H2q3FsdYB8LaClrMaizc/dLvACKfh1jK3qPWEfAWcj6nLLAv16v6FeZX88JklWibGPUpHgLurjfjp3pF8gnmbFjNFdDbLavsrFFXwNClb8wxf7NCFqATcxaCApVp/iS+5vnwIRag4+mIWw+phDHgo3+PNJD4Nt2ungW7YMJa41DXk1Bkrwbc8ylCuvdVKdBP3XrnNJeS1LpUnLf3/zXOtCNmK+KAcEJ2ClEoYKPvnoUN2SO0nXBcpGk7U38eumPeIps6ZE2dkeQ/NiiDQEMsxOrjF+N5sWyXGR58+5qDAIKGb919jjAVbO1p0T9wCkRXtMNDyq4z3WzlJHKCwEUk926aFgwKf5svT0K8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32
Collectives Todos 0.1.0
Release Details
UpdatedOct. 7, 2026, 6:31 p.m.
Changelog

Added

  • Initial release of Collectives Todos: event-driven aggregation of markdown checkboxes across all pages of a Collectives into an auto-maintained Todos page, using Nextcloud core file events, a JSON cache for efficient updates and a CLI command (occ collectives_todos:init <collectives-id>) to build the page for existing collectives. Unit tests cover all core services and listeners.

  • App store release packaging: a GitHub Action (.github/workflows/release.yml) builds a store-conformant collectives_todos-vX.Y.Z.tar.gz (single top-level folder named after the app id, dev files excluded) on every v* tag, signs it with the app certificate and attaches archive and signature to the GitHub release. Tag and app version must match, and appinfo/info.xml is validated against the app store schema. With the APPSTORE_TOKEN secret set, the release is also published to the Nextcloud app store automatically.

  • Per-collective Enable/Disable button in the settings page's per-collective table. Disabling deletes the collective's Todos page (to trash) and stops generating or reverse-syncing it; the checkbox cache keeps being maintained, so enabling regenerates a consistent page immediately. Enabled is the default.
  • Global Enable/Disable button in the settings page's Defaults section: flips the instance-wide default. Enabling resets every collective to enabled - it clears all per-collective enabled opt-outs and regenerates their Todos pages, since opting into the app means wanting it everywhere; disabling single collectives stays the manual choice. Disabling globally deletes the Todos page of every collective that is not already opted out.
  • The per-collective Enable button clears the collective's enabled override instead of writing a sticky enabled value: a sticky override would shield the collective from the global default toggle forever, so a global disable reliably deletes every Todos page of collectives that were not explicitly disabled. The per-row Enable buttons render as inactive while the global default is disabled. Deleting the Todos page on disable now also removes its collectives_pages row (the delete is a hard delete on the appdata path, which the Collectives trash does not handle; the managed page's content is fully derived, so nothing of value is lost). The row is resolved untrashed and deleted directly: Collectives' PageMapper::deleteByFileId only removes rows that were moved to trash and silently ignored the hard-deleted page's row, leaking one on every disable cycle.
  • Todos page emoji config item (default none, per-collective override): the emoji is written to the Todos page's collectives_pages row like the emoji of any other Collectives page and rendered in the page tree. Validated with the Collectives app's own emoji validation; the settings page ships a curated emoji picker built with plain HTML/JS (no new dependencies), and any emoji can be pasted directly. The emoji is enforced on every Todos page regeneration and on settings save.
  • Admin settings page (Settings → Admin → Collectives Todos) with instance-wide defaults and per-collective overrides for three config items: the Todos page name (default Todos), the position of the Todos page in the Collectives page tree (always on top / always on bottom / alphabetically, default always on top) and the maximum number of cached checkboxes per collective (0 = unlimited, default 0). An empty override field uses the default. Invalid input is rejected without storing anything.
  • The tree position is enforced by writing the landing page's collectives_pages.subpage_order (the Collectives frontend sorts listed pages by array order, unlisted pages alphabetically), on every Todos page regeneration and on settings save. Manual ordering of the other pages is preserved; an already-open Collectives tab needs a reload to pick up the new order.
  • Changing the Todos page name renames the existing Todos page file; if a page with the new name already exists in a collective, the rename is skipped and reported on the settings page.
  • When the checkbox limit is reached, further checkboxes are not cached and the Todos page renders a *(list truncated by the settings limit)* note under the affected page's section.
  • Bidirectional checkbox sync: ticking or unticking a checkbox on the Todos page now also updates the checkbox on the source page it was aggregated from. Sections of the Todos page are resolved to source pages by the page file id in the heading link URL (title as fallback), and checkboxes are matched by text within a section. Only checked-state changes are synced; text edits on the Todos page are discarded with the next regeneration. If the cached line number of a checkbox has drifted, the checkbox is located by a unique text match, otherwise the change is skipped and a warning is logged.
  • Page headings on the Todos page are now links to the corresponding page, in the same URL format the Collectives app itself uses (/apps/collectives/<collectives>/<slug>-<pageId>, with a ?fileId= fallback for pages without a slug). If the URL cannot be resolved, the plain heading is kept.
  • Regenerating the Todos page while the Text editor had it open caused stale content to be shown and "Error saving the document" on manual saves: the Text app keeps per-file session state (etag, checksum, editor steps) that our background write invalidated. The Text document state of the Todos page is now reset on every regeneration, so open editors reload the fresh content. Unsaved manual edits to the Todos page are discarded by design.

Changed

  • Minimum Nextcloud version raised from 25 to 27 (the admin settings controller uses the AuthorizedAdminSetting attribute introduced in 27).
  • appinfo/info.xml brought into the form the Nextcloud app store validates: added the required <summary>, renamed <license> to <licence> and <depends> to <dependencies>, and dropped the <app>collectives</app> element (not part of the store or server schema, so it was never read; the Collectives dependency is enforced at runtime via IAppManager). No runtime behavior changes on servers already running the app.

Fixed

  • Reverse-syncing a tick made in the Collectives editor: the Text editor strips trailing whitespace on save, so a Todos page checkbox whose source line ends in spaces no longer matched the cached source text and the tick was silently dropped. Checkbox texts are now trimmed when parsed, and the reverse sync also tolerates untrimmed legacy cache entries.
  • Deleting the Todos page recreates it immediately. Collectives moves deleted pages to trash; the trash move is complete before the delete event fires and collectives paths are never locked, so no delayed recreation is needed.
  • The emoji of a freshly (re)created Todos page is now really written: inserting the missing collectives_pages row failed because its last_user_id column is NOT NULL. The app-created row now carries an empty user id (the frontend hides the "last edited" info for such pages), like untouched pages.
  • Deleting a page did not clean up the Todos page: the deleted page's section and checkboxes stayed listed. A Collectives page is a folder (the index page is its Readme.md, subpages are further files in it), and deleting it only emits a filesystem event for the folder itself - the markdown files inside vanish without their own events. A new listener for BeforeNodeDeletedEvent now collects the markdown pages under a folder before it is deleted, removes them from the cache and regenerates the Todos page. Plain .md file deletes keep their previous cleanup path. Restoring a page from the Collectives trash does not re-add it to the Todos page until the page is saved again or collectives_todos:init runs.
  • After ticking a checkbox on the Todos page, the source page briefly showed the tick and then reverted to its old content, with the editor refusing saves ("File changed in the meantime from outside"): the Text app keeps per-file session state (etag, checksum, steps) also for source pages, and the reverse sync's external write desynced it. The Text document state of a source page is now reset when the reverse sync writes it, so the page loads with the synced state and saves work. Unsaved keystrokes in an editing session open on that page at that moment are discarded (same contract the Todos page already has).
  • Checking a checkbox on the Todos page and saving broke the editing session: the reverse sync's regeneration of the Todos page ran nested inside the save and rewrote the page with a fresh "Last updated" timestamp, changing the etag under the open editor ("Error saving the document", conflict diff prompts). The Todos page is now only rewritten when its content actually changes (checkbox states, pages, titles); an update that would only refresh the "Last updated" timestamp leaves the file - and open editing sessions - untouched.
  • App bootstrap was silently skipped: info.xml declared the full namespace (OCA\CollectiveTodos), which Nextcloud prefixes with OCA\ itself, so no class of the app was autoloadable. The namespace is now CollectiveTodos.
  • Application.php moved from appinfo/ to lib/AppInfo/ (PSR-4 location that the bootstrap looks up).
  • CLI command is now registered via info.xml <commands> (previously the occ command never showed up).
  • Todos page is now written to the collectives root folder (previously it was written next to the edited page).
  • Page titles for Readme.md pages now use the page folder name (Collectives stores a page as folder with a Readme.md inside).
  • The listener skips its own Todos.md writes to avoid an infinite write-event loop, and logs failures instead of breaking saves.
  • collectives_todos:init now scans all pages of a collectives and accepts the collectives id as used by the Collectives app.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEDDCCAvQCAhRDMA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYxMDA3MTQ0NDAwWhcNMzcwMTEyMTQ0NDAwWjAcMRowGAYD
VQQDDBFjb2xsZWN0aXZlc190b2RvczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
AgoCggIBALdQghokF+S+krqy/gMTVV+G7kw1vlwkBdVWroUoXrJk2U19znosxLwN
Hx/lOsSGjn9Ln0Y4/PF1aDCNITmzRKnUo3JcuC+dT6RPuG4XtGvcDPe2mBGmrY4J
wkqwWN5N1cic7crNXUqnI8cFUg+U8dAlkYah6Han5QkXf4ZuO/lH0cIRPsRaMw8j
5BDHAcdLvniw2Exa9y/atNe/7i1NDkgtpxN8yA2hoXUM4YUMcnlzUAiDx+fO556B
iMcSb8WJNblb/EpQjVKetk3h5N/oVopUR/Oo0st/tgWh/jiO7TMoCYx7ktFpQQJN
j9H7rLjsVswG3cn7xSTL3wfm0stFB1tSnTXP4zf0pp4d2QilI0GxgSdeAOPskFTN
pJGzSghDZ7/+tw4kZ5Y8gWj3aME9O10rXinBWaYV05cme569ZMXzbigLgNFTA/sT
0L/rHT3RZkrJ9cUIJCRm3yruqAQIml69onikKOl8XNM95GGAT/oF10ebhU0ITTNk
WafdGlqT2iPloHCvaRqR2BMPxR+My55IQ6+VI2nvgLztA524/Cud60PFhyrCXUZU
9O+c+5oz7MEZF0HPJfvg65PiXD/LvXi22Q17fY6fhlVQVYn8vQoMnoc0I6bkw8Al
PdK/d/kxNIpeWDNDh2gyEyBIiOxS7rOSyFmump1qliF8qf47PFEDAgMBAAEwDQYJ
KoZIhvcNAQELBQADggEBACh749xaQoj6Y4w24L7C4kiuYBMfo6JbAEqtijdZUQRC
XdV3pnonKnJ+mMV/803o41PxQ2xmRzvEaDWm2WKG2zzNssKwObcJg8TnpdPTcHjB
brU6pxkJXIHmgEjMHc5x6XJ3RR2uA9Wayaf5PFl+omfd52TzHQpMbGXM+u6TYckx
uEe0D9gnyg/Jw2ESnsOABk3n/Mkbv1IzUVs0Cxb3Je+dwJDMDBwW3DaSby/kKSjc
fSZBA9FsAJU77/yg7dnsFV3rhBXdJ5sQbVJNTH7gzcHhCiLffuEC0BmIPF+D5/80
yT7k9b7NAK212mhbleE90EiOwpPtKirDr+jKLL1zT1g=
-----END CERTIFICATE-----
SignaturetOPFL+uJkvXf4IYYON0b0T+MahYmk+Sga4NLaCPjTbv+nUklqi4DBjxNPKZEFLSHW+e7b6A2wR+uL+ugBCy9IWjJHfe35JVt1g/06s28dnXkm6nrod3AtPk4DgrZ2HHrDgPo86K4iIW2KIeW+IMbT1iKhYLQ9mGq3YcBPPtDgWzNjbpLid+PcGtxcPn8+E6GuOkrN6YbKuNkkdhL6UGuuqlHFYw7bVzDN41shzSaMYrUBmZUXXl/5ZnbnewEgiGZf6wsobuxQZ6uLqNjl9yKBvA85quuhBcnEHL0L+aFZn0xTuX8YFxvVmrx9iO8m24luzzSys35L/PL9W2l7m+w4MOX5zTIKkx+q8ExR8PtZBYOZqhaUPcZZwYLHFvJUlGL80LOPil51hn0qrsOUdJCd5yZqcoLoZxbBFKj1njokd7cTb8ZNPbw/lYsMnp8JCp4ldTTVLE/+P3U4p7aG1lbOIP33zMzOz6R+oF3w3xuNlT6QFRjvztbXzLohaj2fuTx3rVuraaztowQk9tLSqFiuRbMh5KHv3n9BFAuijyR9mfaPwJpEnKD0u0nKJmb2oIAkrwviHjYJR1xUbNsiZHbEQOpW2UMy0+5wvE++zGGCX+c3p9lRFqN00+KO1RNosmEOnmd/st12hZowjR+oayERlBKLUBXXxgO7h4/MIUHqYs=
Signature digestsha512
Dependencies
Required Nextcloud versions >=27.0.0,<35.0.0
Minimum Integer bits32