TeamHub - Releases

← App details

Nextcloud 34

TeamHub 3.74.8
Release Details
UpdatedJune 10, 2026, 5:33 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturedosUcnSDCPnIfdPQMImE1tA/3u7HScBdONLc0dqM6SNLRs/fmatvKrLyLBqyt9o8M+0L9htxkd9BLZlRyoorzSEBtM5Q2mt4e9VvTMUU3Qk/nWZPFu1UOJCMTWcGujPwGuBuO89cEpgmqU766ApX2df4fDrajuWVmKw1TNcmst7jBz0zWt/zvzruGkCZQp4xBmAoGd/WEXjk655ccLMhTJDvQiqKtDXMbuSTvewKm6uk5jUWQqIyBKj4B2jIlFv9YvnM5h4Vdwy77uO/xLHQ1VLWTR33T6EtlMJDuX9tFz8pu9hSEHy1Ntr6lkrOLQReyogrGQeBy3LP/pT67JaJ40hqvXAaBGVRntjzDISTN9uZ/hn0pBMDQr+v7Q73KuHWAXC+dNUpEpi0rD+6sX/GyHLdysgGtnds6dY7Fi77qp73GyRkDam2yQuzh1VU4iyJwJqdbpVqVtTcn+GP5dar9P3PuK5mnYhpcp3sdEEefNKWLXSNa7MOotGK33pT/DM8fJfFc0eTxq+/fWJBGCoUeaW5cFERyk26lWjb3sz5v3rsBqnB4ZYMitGMX/GG8Q4qabRsGDBd1y+FYwYEBvBSTxwG4MUViepZ3dprIPYqwOrMEdOpBVx+Eu2YQ29anjQYIStCc/TN45siD1FQPnUt7MDzWu33Cs234hWB1J8z0xo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.74.0
Release Details
UpdatedJune 9, 2026, 6:06 p.m.
Changelog

Added

  • Link Decision (Session C) — bidirectional decision ↔ decision linking with full UI in the detail panel.
  • New table teamhub_dec_links (17 chars ✓): one row per link with canonical ordering (decision_id_a < decision_id_b), unique index on the pair, indexes on team + both sides.
  • DecisionLink entity, DecisionLinkMapper (with findByDecisionId OR-query covering both sides), DecisionLinkService enforcing membership for read and decisions_action_min_level for create/delete.
  • 3 new endpoints: GET/POST/DELETE /api/v1/teams/{teamId}/decisions/{decisionId}/links[/{linkId}].
  • Detail-panel UI: linked-decisions section with peer title + level pill + status pill, click-to-jump navigation, gated "Link decision" button, search-as-you-type decision picker modal (reuses /decisions?q= endpoint with 250ms debounce, excludes self + already-linked peers).
  • Migration Version000373010Date20260609080000.
  • Audit events for task + decision link/unlink — 4 new transitions in DecisionAuditService::TRANSITIONS: task_linked, task_unlinked, decision_linked, decision_unlinked. Decision link/unlink events written to both decisions' audit trails.
  • Shared widget design tokens (src/styles/widget-tokens.css) — single source of truth loaded once from main.js. Defines hard-contrast brand palette (--th-color-{success,warning,error,neutral} + soft variants), typography scale (title 14/600, row primary 14/500, row meta 12/400, pill 10/700), spacing tokens (row padding 10px 14px, gap 12px), and shared utility classes: .th-widget__panel, .th-widget__title, .th-widget__rows, .th-widget__row (+ --clickable), .th-widget__row-icon, .th-widget__row-title, .th-widget__row-meta, .th-widget__state (+ --empty, --error), .th-widget__spinner, .th-widget__pill (+ --primary/--success/--warning/--error/--neutral, plus --outline variant).
  • peer_level field in decision-link list/create responses.

Changed

  • All 13 widgets refactored to consume the shared tokens — DecisionsWidget, DecisionsList, ActivityWidget, CalendarWidget, DeckWidget, FilesWidget, FilesFavoritesWidget, FilesRecentWidget, FilesSharedWidget, IntegrationWidget, IntravoxWidget, MembersWidget, MemberRow, MemberPresenceRow, ExternalWidgetItem. Loading/empty/error states unified to compact .th-widget__state rows with shared spinner. Hardcoded font-sizes replaced with tokens (kept only for genuinely widget-specific elements: calendar date badge, tab counter, action button). Soft NC colour vars (--color-success, --color-warning, --color-error and their text variants) replaced with hard-contrast --th-color-* tokens app-wide.
  • DecisionsList row simplified — impact and level pills removed from the meta line, category now rendered as plain text with small uppercase CATEGORY label prefix. Primary line uses size-driven hierarchy (14px medium) instead of bold.
  • Activity subject uses regular weight (400) — sentences read better unbolded; the rest of the app keeps medium weight on primary lines.
  • Detail-panel "Linked tasks", "Linked decisions", and "Source files" unified under one .th-dv__link-* row pattern — same border, hover, focus ring, spacing across all three. Solid-filled pills (no transparency / soft tints).
  • --th-color-warning darkened to #a05a00 for WCAG-AA 4.5:1 contrast against white pill text (was #c97a00, 3.34:1).
  • Removed dead deny-modal CSS (~70 lines) from DecisionsWidget — replaced by DecisionApprovalModal in Session B.
  • Link task button now uses LinkVariantIcon (matching Link decision) instead of PlusIcon.

Fixed

  • Focus indicators on .th-dv__link-row, .th-dv__link-remove, .th-dv__dec-picker-item-btn, and .th-widget__row--clickable — removed redundant outline: none that was followed by a re-set rule, then ensured each :focus-visible has a 2px primary-coloured outline visible (WCAG SC 2.4.7).
  • aria-live="polite" added to the linked-decisions list and decision-picker results so screen reader users hear async updates.

Security

  • New decision-link endpoints follow the membership + min-level pattern. listDecisionLinks requires team membership; createDecisionLink and deleteDecisionLink require decisions_action_min_level. Peer decisions must belong to the same team — cross-team linking rejected at the service boundary. All queries use OCP\DB\QueryBuilder with explicit PARAM_INT/PARAM_STR typing.
<hr />
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureTDim0CLEZfsAydY1VLm0k8FcVC0iVzhCWfdJr6K02pkRm5ZP4awSnXWlH/lg/9nIp/4eLtuBjhDSneW1uKN4sbnR0fGdlN+2aNcQOfjQMdBKt0sJ3KkzKx9krSwvQSV8+yL+wbIzwuHrLJ37jH2i6HdbAky3zemiCvahz1PS7XowNPXNOmEcv8VpbB6kGGaHBe2iobimS3FN55McetBQHvMQ9/7saeMf9tME0EHiW/gnNXwmJIAJLgpV2sFsijEsyHZCO49K2xBigfPBIZvN34FV98+fpO1f4mQDix6DyEEd+Q7qBhJcYAsmpIIUes3ll57yRVmrmcKazVH00zQTYNKChYLZ+2CARaUlWCf1EAwt5T1nibGNcenIiktIU9nmDAsgO4AGbQsw113E8/b+lgLk/6MZwFsE/nM1PzNn2GieDil1o1A6L3KYve7UxjQQ7vUW6QSvNdJQ9AouVe8+LTHEVnXGrmYAYH90K4ynbcQ/r9aIhzIOkHJrK/0hS5h0Ijh7+mv4CVkj6KAp6/5ShzmVWHXBbRiuIgzgkiuiT+oxGhQtvr7TAR0QhUIbEZKEAxI7esz+bMD4ilB66GpmntY+KzBXE8SBsvT2jXuhmv+1Hksxlz3Sz0hXY7lW5lJ4f3pOD+5nkP6uImk32DMm5QdJ9VW8+i7sBVqoVWyn4rc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.61.6
Release Details
UpdatedJune 1, 2026, 11:39 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatureq/68hJ4BHrU8556eubLlZeiw/qWj2F2wxFPx/ZUcryv70SSP+WtNyC1CLD6x7oNfzElWjF08FYQDxD7FuoRzFL6T1a0HzUVJQlL+XPlhW7zYIpS80INga7HQE2ddvmtsv1yw6YnvMER0UnSFtZYdtQwqTwD2kMkTBW0QdC/oqudRXRJpt65PG73yWQlQWU5snqzTvj+y8neHskKJu2kPnNOynBGhDPESlLzcD1lPz+sYnfA8ADONMsNDLEdzCGf5mK6qHlGX2tBu2HX7P+Y6j3/AhzFJWEdqtyR7YUztpwb1L/pdaX2aftzMjtpqeD5KCJ61WcZo3ZQZUb2LGSg0XYKZ8jKfHNaX3nmYcBuON2LR0H41RaqQ+Xo+2W7tO/sI2La/j9P2WG2QcgoEvB/lEQziNGdNrm772itYmOLb9WrN6Tr9t8EOp/SW1q8Jy1x3S5o0UZdu11gVabdUEm+du3IWs3Psud77lodkbcRsxu/9n6h8H417rA8kS+FCsSrXgI9wNjAGM8+WrtQ6SbI4+VGthMHWlUQaQhXzDMU4GE5+Fpt1B/3OjAbIXBbI937tnQwqmy09+/1xvGKJYqgMTWSOp0xl0pM2PeQia9DOmZY9DByJUBmwpV/4HKVgTp31yzc0GZXJCmDTodiVOds47VP2cqNo1uw/8CI/h9nXys4=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.61.0
Release Details
UpdatedMay 31, 2026, 1:32 p.m.
Changelog

Added

  • Message image cache. When a user inserts an image from their personal files, the new POST /api/v1/teams/{teamId}/messages/cache-image endpoint copies the file into .teamhub-cache/ inside the team folder. The cached copy is accessible to all team members via /core/preview (team folder is circle-shared). Survives if the posting user leaves the team.
  • Clear image cache. New DELETE /api/v1/teams/{teamId}/messages/image-cache endpoint (admin level). Exposed as a button in Manage Team → Messages tab with a count of files removed.
  • Attendees in AddEventModal. Team members can now be selected as attendees directly from the add-event modal. Server sends iTIP invitations identically to the meeting wizard. Self is excluded from the picker.
  • RoomVox room picker in AddEventModal. When RoomVox is installed and configured, the location field becomes a room picker; free-text fallback when no rooms are available.
  • Category field in AddEventModal. Comma-separated category tags, passed through to the calendar event.
  • Talk meeting toggle in AddEventModal.

Changed

  • AddEventModal consolidates ScheduleMeetingModal. Both modals used the same backend endpoint with minor field differences. Single modal now covers all simple event creation. ScheduleMeetingModal.vue is unused and can be removed.
  • @schedule-meeting event in TeamView now routes to showAddEvent (same consolidated modal).
  • Schedule Meeting action removed from the upcoming events calendar widget (desktop and tablet layouts).

Fixed

  • Images inserted from personal files were invisible to other team members. /core/preview?fileId=... enforces per-user ACL — other members got 404. Fixed by caching the file in the circle-shared team folder and using that copy's fileId.
  • Uploaded/attached images were invisible to other team members. Circle share was created correctly but the URL still used /core/preview. Fixed by using /apps/files_sharing/publicpreview?token=... (share-token-based, no per-user ACL check).
  • Pluralisation of "files removed" in cache clear confirmation now uses n() instead of a conditional string.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureBkg/1BS30q2A2ps/z2INdqmvkj94OGrfFXhTAEVFLP8V0w/yRX6Tfn7R73IlDfQBA+EN2I3Umj6Ctf0pTz1ZH3vZ5t7hlmQhmTfI/fZnXOesCax3pxx41doSGoWsI5ln5yk1GVq/gM8Py3KRpgG8Nq7i/ikk8w+ZXp7ollK8ZEBGoHtAZy6EISJZW27O3faprqbkwuqlX757DXgHHaAb7M9ZIT1c0xBdOZm1pCRNsqaMwLMe60RQQyLZxXVVq0J5oJk1JPHpgWzixtZodL4qzIlIpvbrPrIB5Bvo7buGi9yrBdVNuQzGFO08OWDlt2MpMbkWqbpIbFzT0lrdKYnSTBrXbyk60V+gyOl17J5774p28Gk5VLfsyzkEdHBwmbbUgWQUvbF+1XPxOqfFZ2Gmgj9RT7kZdnEkVOfxFQ5rtGdqBN+GjzH33cpxxy3TvaLjgcyzttzrn8KDoqFz5KGjo7BgfUnTMiX6c91B/T50JBNBA4tj7fj1l5HCbTf7ZuX80/W0qnMVhKfbnTwlVgYoq9GUkCnoz7eD/ufFHE12naxXmPCdkFgGbdP6GS3Ck8ddLMNhXLqcntF9WPc0SlUTxc/WE5A6wU52GyQ0euCatOx4ElETAeeJ4SD8qj81v6aB9rScThH82bed1fqlKeoYcaMybCx6kCMDtINkCo0+HeU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.57.2
Release Details
UpdatedMay 27, 2026, 6:50 a.m.
Changelog

Fixed

  • Admin settings: clicked tab no longer shows white-on-white. The active tab matched both the active-state override and the inactive-focus rule at equal CSS specificity; being later in source order, the inactive rule's white background won while the active rule's !important white text stayed — rendering an empty white box until focus moved elsewhere. The inactive-focus rule now excludes the active tab via :not(.teamhub-admin-tab--active).
  • Admin settings → Maintenance: team "Created" date no longer shows "Invalid Date". Two methods named formatDate existed in AdminSettings.vue; the second (expecting a Unix timestamp) silently overrode the first (for datetime strings), so the teams table's datetime-string creation value was multiplied as a number → NaN → "Invalid Date". Split into formatDate (datetime string, hardened to also accept ISO and numeric input) and formatUnixDate (Unix timestamp, used by the archive table).
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatureb6JwIPc5nZN1w4UIYKU60aB0c6m7HJ7CrbeOrvNBTEFSdAJeQcBKJvHd/6NAwvfWfZU53U4hW+vVOa/IN8eyTvee5aBGarefDPfiW/8OAAy3vJ7Ue2K/CDCqFP+dygfS5wTay0RCQ75X8LuXUkXS1i26iVR0PJOc8UbuyrQOnXu/P8WFHpWhReZWd8na9CDV11oZ8fCLGRtEPWcO5QczZbRFDI1plXQ/46lJhhqEGL8m8A7aV3ikjqzzTeugLoP1/RVR/dlIiYlRDfUKJUYpMvjWmcC920No72Nq06JKq5PjfSB4OPSFA54bI6rfv02Ipk6UixvOyqkAJA4/sH3Jxm72NATlxssHH8TGw7xZ0Nsfbp4LGR3c5kJmEhZ+Hkq2zHKtlGSlzOy3z2yoepGZgoNgg+gUb0VetnkfbhGDplW76F2lRePIwg9H3nJhFOma3AGQS4QnKR+t4V4Ec8gqlbnoIHGSuEPZMWpTicuU0ofvh/PHfiu8Dxk1v7jHYVtNdvrVkZPSFfzrx/IJX+HoGDq91KYoMJNrd8jRfFYWswalQ0cLzdCCw6iYHAxIyTpvGikEWlx1drtmQ3GJarvFT+qkpYhL7A+jBmCj1aUGSanGpozEn6eRk4BweOyAkld9h3cmM3Fvi1BujCbTT7Wnnvj5IJzmTB8CAGseaH/akdw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.48.0
Release Details
UpdatedMay 22, 2026, 2:02 p.m.
Changelog

Fixed

  • Presence module admin tab still visible when module is disabledtabs() computed in AdminSettings.vue now conditionally includes the Presence module tab only when form.presenceModuleEnabled is true. When the toggle is turned off, the tab is removed immediately and the active tab switches to Integrations if needed.
  • Team Info warning strip height and chevron — replaced "Open settings →" text with a ChevronRightIcon icon (consistent with DeckWidget unassigned-card nudge). Updated CSS to use line-height: 1.3 and icon-only button layout so the strip height matches the DeckWidget row exactly.

Added

  • docs/USER_GUIDE.md — comprehensive user guide covering: team navigation, tab bar, presence tab (team view), My Presence personal settings (weekly template + date overrides + calendar integration), team admin actions (members, settings, presence toggles, links, danger tab), and FAQ.

Changed

  • README.md — updated to include Presence module, Members widget presence dots, and updated admin settings section.
  • INSTALL.md — rewritten as a full NC Admin guide: installation, all admin settings tabs (including Presence module on/off, status types, locations, holidays), optional integrations table, background jobs table.
  • src/components/AdminSettings.vuetabs() gates presence tab on presenceModuleEnabled; toggle redirects away from presence tab when disabled.
  • src/components/TeamWidgetGrid.vue — warning button uses ChevronRightIcon; CSS tightened to match DeckWidget strip height.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturec1kXc8h5EzClzIXkf31zt8pGVXg3BuummH2w9N8T6IWSrfHpsBZuGYBqJcy0zwn/JXKRB5RkebdfuaE6LLwVOcqUlz15beSyi6Y6Fr+rkRXqQti8lzHYyJ9vtTzn963I4fEstaa8q0b9126Ts+UMTUe3rrS+/4kJV21dCiAui6GiPsdKzGp47QuNw0k9YiqSZ24NCu+6QsnoyrHvoQTwnrPHHIcZ/w7bG1VbtO9mob5Cq9bB0tS/zbNzzi9Jph3AZ3MtzGjx/4mZ4KR77DSC55OqDs9vfK0KW7+e45JbRFrtpHUldjgpXL/6MIsR3IYbif+/uVDTqghjUJtOLaQ4FsApnKesfqTchH4NE0jebUnpeToqGBGVERKvs9XrJ7F7Qnu5IsCqUhJ4B2xQmGADGWJUBlPOfKB+lH2lCtPSkDJzehylwrWOJtOtg9X7SARV+G0q379DtVbC2aHnj2DpN8BivVsZ8hsCgLDxiCcubqHVP1s3nAx0q00qMEdIZwIGA3IU/LRSp73V6ZqaL5JXYBtjVNBNqResl7Gr0IaFfe1++B6mVFY6L0iHgsTKVtZgBCPnudVXBDx+Y1inUuIGVtcm2YvsL+ed1QdCXkLxdyHa+Mvdu4zotE32LYzKyz6bsci3Uz/9xwvMWyD48nPc0UGtABCOw8UG16di/2NtzwE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.41.0
Release Details
UpdatedMay 18, 2026, 2:31 p.m.
Changelog

Added

  • Unassigned card nudge in Upcoming Tasks widget. Each connected Deck board now shows an amber row at the top of the widget listing the count of cards that have no assignee and are not yet overdue (no due date counts as not overdue). Clicking the row opens that board in the embedded Deck iframe — same behaviour as clicking the Deck tab. With multiple boards each board gets its own row, sorted by count descending.
  • Team-as-member support. One team can now be added as a sub-member of another team. A per-team toggle ("Prevent this team from being a member of another team") appears in Manage Team → Settings, using the same CFG_ROOT (8192) bit that Nextcloud Contacts uses — the two UIs are now in sync. Admins must enable the "Teams" invite type in Admin Settings → Invite Types before the invite picker shows teams. Teams with the prevention toggle checked are excluded from invite search results. The admin integrity check flags only the contradictory state (team is nested but also has prevention active).
  • Deck board activity in team activity widget. Deck board and card events now appear in the team activity feed. Includes board name and card title extracted from Nextcloud's own subjectparams JSON, producing descriptions like "Justin created card 'Fix login bug' — Sprint board".

Fixed

  • Critical: Deck activity was completely missing. ActivityService was checking $resources['deck']['board_id'] but deck became an array of board objects in 3.28.0, so this check silently failed for all installs. No Deck activity appeared in the widget regardless of how many boards were connected.
  • Critical: updateTeamConfig() used wrong bit mask. TeamService::updateTeamConfig() still had $MANAGED_BITS = 1|2|4|16|512 (pre-3.39.1 wrong values) as a local variable, overriding the canonical constant. Every toggle other than "Anyone can join" (CFG_OPEN=16 was in both old and new masks by coincidence) was silently discarded on save. Now uses CirclesConfig::MANAGED_BITS.
  • Critical: ManageTeamView config constants were the old pre-3.39.1 wrong values. Identical to the 3.39.1 bit-encoding bug: ManageTeamView.vue had its own local const CFG_OPEN = 1 block instead of importing from circlesConfig.js. Enabling "Anyone can join" was writing CFG_SINGLE (1) again, hiding the team from Contacts. Fixed by replacing the local constants with a proper import.
  • searchUsers() circle search used iLike() which does not exist on NC's QueryBuilder. The exception was caught silently, returning zero results for the circle type every time.
  • Deck board picker always opened the first board. Moving selectedDeckBoard to Vuex introduced a Vue 2 data/computed shadowing bug — the local data() property with value null won the name collision against the mapState computed getter, so deckUrl always fell back to resources.deck[0]. Fixed by removing the dead data declaration.
  • Integrity check falsely flagged all team-as-member relationships. The check now only flags nesting as an issue when the sub-team has CFG_ROOT set (prevention active) but is nested anyway — a genuinely contradictory state. Valid nesting (CFG_ROOT not set) is silently skipped.
  • PHP parse error in MemberService (3.40.1–3.40.3). The str_replace tool double-escaped backslashes when embedding PHP namespace separators, producing \\OCP\\DB\\... instead of \OCP\DB\.... Caused 500 on every MemberService-dependent endpoint.

Changed

  • "Prevent teams from being a member of another team" toggle now uses CFG_ROOT (8192) — the same bit Nextcloud Contacts uses — instead of CFG_CIRCLE_INVITE (16384). The two UIs now write the same bit with the same meaning and stay in sync.
  • fetchDeckTasks card-ID lookup changed from one OR clause per card to a single IN (board_ids) query + one IN (card_ids) clause in the main activity query. Scales better with many boards and large boards.
  • Activity formatSubject for Deck events now includes board name and card title when available (e.g. "Justin created card 'Fix login bug' — Sprint board").
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturep6LBsh++TW1EqF+MTvnOs6DGrDmygcM7b8y6mw+FEkpajSxEmmL3+PIaRlrp5whx0V+Oyxe5murZYLWDpbtVLsD76tLPJ4jk+CVpiCHlSbn6kBbERKaXDpf1UkCIir0wHxdRJ1btIsry1Hyv/0JhDzfrLKevuqicTRDpOY7zJ3gMd1Pl/PQgwjYlmiK/VApSyDVeniqEQN1iTwQjjPTq+gTo9NEtE0holECcKUEtU/FRZRHOtcNQQwUxJqtvqX3hieTg3ttDUt0wV2VK8NarlnGuuoXWwaF5YyyS/5BaLL1kYO+YAKy7SFHhAV/LeEkP/oLbcRUbBVbNRyno2vmcJgK+mPLczW88EqKblVkLfdiuvZGRLqP5nP1XtrPUhTzzLUvnPdWIBxNPz+FrcJN59NC8MTzR/SUgtU7sCRe8YNAAHf9JF3P/V0uxbYuICZUpS7+h+kPkTP0cblORVUSeQT/F+bC3Ys7fs8xwBs6dpvH77ye0bGAfXmwwB5UwfH8CwfJPGWtNDyti46QqXevr+nYd0cyWttpeU6znMFemtiPv7cgLHG97gdgedCEX0Rfw1UwyxwVECCQULMzn54atIpjSscewqBAUtSZT6Q1gOcfRQHgWEn8oC75mRdjz8/KAQrYiQU5pujdAWv4AEP1RfTJ1Zna+Zyc9SXsAXLFdXIo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.40.0
Release Details
UpdatedMay 17, 2026, 7:32 p.m.
Changelog

Fixed

Circles config bit encoding (was 3.39.1)

  • Critical: Circles config bit encoding. Every TeamHub release prior to 3.39.1 wrote the wrong Circles config bits when users toggled checkboxes in the Manage Team settings panel. Each TeamHub label was mapped to a bit that meant something completely different in Circles' real encoding. Consequences observed in production:
  • "Anyone can join" wrote bit 1 (real CFG_SINGLE) → Circles tagged the team as a personal identity circle → Contacts hid it.
  • "Visible to everyone" wrote bit 512 (real CFG_NO_OWNER) → Contacts refused config edits.
  • "Enforce password protection" wrote bit 16 (real CFG_OPEN) → team became open-join.
  • The always-on "Prevent sub-team membership" hint wrote bit 1024 (real CFG_HIDDEN) → team disappeared from listings.
  • Settings made via Contacts and TeamHub no longer round-tripped — each side read a different field of meaning from the same column.

This release corrects the bit encoding in both PHP and Vue, introduces canonical constants in lib/Constants/CirclesConfig.php (mirrored in src/constants/circlesConfig.js) so the drift cannot recur, and ships a one-shot migration (Version000339001) that decodes admin intent from the old (wrong) encoding and re-encodes with correct Circles bit values. Admin sees the same checkbox states before and after — only the underlying storage changes.

  • resolveUserSingleId() DB-join fallback was checking config & 2048 (which is CFG_BACKEND) thinking it was CFG_SINGLE. Now correctly uses config & 1.
  • browseAllTeams() CFG_VISIBLE filter was filtering on bit 512 (CFG_NO_OWNER) instead of bit 8 (real CFG_VISIBLE).
  • isOpen checks in browseAllTeams() and MemberService::requestJoinTeam() read bit 1 (CFG_SINGLE) instead of bit 16 (real CFG_OPEN).
  • Manage team → Settings tab now always reloads from the database when activated. Previously the checkboxes showed cached state and external changes (e.g. via Contacts) were not reflected until page refresh.

Unread message counter (was 3.39.2)

  • Unread message counter restored in sidebar. The NcCounterBubble badge next to team names was effectively dead: no polling caused team.unread to go stale immediately after page load, the counter was hardcoded to display "1" regardless of count, and team.unread was a boolean not a count. Fixed: backend returns a real per-team count, the badge displays the actual number, a 60-second background poll keeps badges current, and posting a message triggers an immediate refresh. Excludes own messages from the count.

Group invitations (was 3.39.6 → 3.39.14)

  • Inviting a group to a team now works correctly. Circles' addMember() was creating an Invited row with level=0 for non-user types (groups, circles), and Circles has no working notification path for group invitations — so groups stayed in permanent limbo and TeamHub's filters silently hid them. Fixed by auto-confirming group/circle membership immediately after addMember() succeeds (UPDATE to status='Member', level=1) and triggering a Circles membership cache rebuild so users in the group get immediate access to team resources.
  • @mention now works for indirect members (users added via a group). Multiple cascading bugs fixed:
  • getAllEffectiveMembers now correctly reads from circles_membership (Circles' denormalized cache) which contains every reachable user including those via groups, instead of attempting unreliable IGroupManager lookups by GID labels.
  • Frontend store correctly unwraps the {members: [...]} response shape (was treating it as a bare array and discarding the data).
  • Mention autocomplete supplements OCS results with team members that NC's user-enumeration privacy settings would normally hide.
  • Manage team → invite flow refreshes allEffectiveMembers in the store after adding a group so mentions work immediately.

Added

  • lib/Constants/CirclesConfig.php — single source of truth for Circles bit values, plus MANAGED_BITS, SYSTEM_BITS_FORBIDDEN_ON_USER_TEAMS, and the migrateLegacyConfig() decoder.
  • src/constants/circlesConfig.js — JS mirror of the same constants, imported by ManageTeamView.vue, CreateTeamView.vue, and TeamWidgetGrid.vue.
  • Reset config action (icon button) in admin settings → maintenance → per-team row. Clears all user-managed and forbidden-system bits to clean defaults. Confirmation dialog before applying.
  • Config bitmask integrity check in admin settings → maintenance. Scans every user-created team for forbidden system bits (CFG_SINGLE, CFG_SYSTEM, CFG_NO_OWNER, CFG_HIDDEN, CFG_BACKEND, CFG_APP). Per-team Repair button calls resetTeamConfig().
  • Three new API endpoints:
  • POST /api/v1/admin/maintenance/reset-team-config/{teamId} — clears user-managed and forbidden-system bits, returns { oldConfig, newConfig }. Logs to teamhub_audit_log.
  • GET /api/v1/admin/maintenance/config-check — returns array of teams with corrupted bits.
  • New Vuex state allEffectiveMembers + fetchAllEffectiveMembers action + UPDATE_UNREAD_COUNTS mutation + refreshUnreadCounts action.

Changed

  • repairMembershipCache() now strips every bit in SYSTEM_BITS_FORBIDDEN_ON_USER_TEAMS before rebuilding the cache.
  • updateTeamConfig() MANAGED_BITS mask updated to the correct Circles bit values (8 | 16 | 32 | 64 | 256 = 376).
  • TeamWidgetGrid.vue::teamLabels — labels now read from real Circles bits. The misleading "No nested teams" label removed.
  • CreateTeamView.vue — the "Prevent sub-team membership" checkbox removed entirely. It controlled nothing real and wrote CFG_HIDDEN.
  • Audit log event types: new team.config_reset, team.config_migrated_3_39_1, team.config_migrated_3_40_0.

Migration

  • Version000339001Date20260518000000 — one-shot data migration. For every source=16 team where any legacy-damage bit (1, 4, 512, 1024) is set, decodes admin intent from the old encoding and re-encodes with real Circles bits. Skips teams that have no legacy-damage bits. Logs every change to nextcloud.log and writes an audit log entry per team. Bursts Circles' APCu cache when done.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureGeQDw//MDpb0NtdSeSx4urPBtzDCZkP+xEB9nF5kRi3kZ2CigAJ/pJn2tgVVtjITIzJJJ37xowH4nueQhSZk5Y76gK/cHa3dPuGf0Usbwlr8BndOK6DdX1Z167TczCB13ZXU93YnfjVfUcfneTZJPyz/0iMbJs1tAF4nH0OzWDVmTYmiRtCFhHqtbFbFFkbSVOmoZjE1UNVPwDweNY0fPkusKS5beXTm0qaKXBhYXhakqhnxycweOfqH3JxjmCiz0aZbcdqdeNRCUw9bAJtK7Agp/xEwOv1PKTey4Q4i9VA7yDYg5lWhDKLalX72K0jdNUkXqbw2W1hawGzEOgcX2aFoV6MVaVPREoFng515ezHlpOWyC6xk7yOq8EsX40ypKOCdBJiHGPE82/GUnRLdeKkkkSrpygNdaH2FIS2STEIsswcyxXyUwJnVp3qZB6NrMZhjuoJ2eVQoqb5O+eM/UaiH+yEM4y5bt6rGsM9D5u4RbXZHdzd3iYo9Qnz6oidcb7NYZWYY7S3yYJqPWlpJ91ehgJ6+W/t5GL05ms++MrvmE+oxM6pBMXW/P+WSe9fb4ckW2aIGwdEUoyB2fsDMgPDg6ej7cHvWbB/EvvhSfUfXNJTjDteSH+W0TuL5Y5UNLUbXzJJiPHl1EbSPm3Cda3krOwRrIeJdRk/iCWlCIVc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.39.0
Release Details
UpdatedMay 15, 2026, 2:35 p.m.
Changelog

Added

  • Integrity check: nested team detection. Flags any circles_member row where a user-created team (source=16) is a member of another. Repair removes the offending row.
  • Integrity check: CFG_SINGLE corruption detection. Flags source=16 circles with bit 1024 set (causes Circles to hide the team from its own API). Excludes legitimate personal/system circles. Repair: clears the bit.
  • Integrity check: duplicate member detection. Flags circles where the same user_id appears more than once as a direct member. Repair: keeps highest-level row, deletes rest.
  • Integrity check: no-owner detection. Flags source=16 teams with no level=9 member row. Repair: promotes highest-level existing member, or inserts calling NC admin if team is empty.
  • Integrity check: wrong display_name detection. Flags circles where display_name ≠ sanitized_name — this causes Circles to misclassify user-created teams as personal circles. Repair: sets display_name = sanitized_name.
  • Link permissions. New linkMinLevel setting per team (member/moderator/admin, default admin). The + button in the tab bar is hidden for users below the required level. Configurable in Manage team → Permissions.
  • getTeamMemberUids() in MessageService. Direct DB member lookup for notifications — replaces Circles API getCircle() call in the message write path. Eliminates "Circle not found" 500 errors when posting to teams with config issues.

Changed

  • Manage team tab renamed: Messages → Permissions. Pin level, post level, and new link level settings consolidated here.
  • updateTeamConfig() no longer calls getCircle() for cache flush. The Circles API was triggering internal sync that re-applied CFG_SINGLE (1024) after every config write. Only APCu cache is flushed now.
  • CFG_SINGLE (1024) removed from MANAGED_BITS. This bit marks personal circles and must not be written to user-created teams. Frontend no longer sends it; backend no longer includes it in the write mask.
  • repairMembershipCache() auto-clears CFG_SINGLE before rebuilding the membership cache.
  • searchUsers() no longer returns teams/circles in invite search results. Inviting a team into another team corrupts Circles' visibility queries.
  • Orphaned teams query no longer requires app:circles: name prefix — compatible with NC33 which stores plain team names.
  • getAllTeams() deduplicates by unique_id — prevents duplicate rows when a circle has multiple level=9 member rows.
  • Ghost cleanup moved from its own tab into the Maintenance tab.

Fixed

  • PostgreSQL: backtick quoting in resolveUserSingleId() (c.\config`c.config`) caused syntax errors on PostgreSQL, breaking indirect member detection.
  • SQL HAVING clause for duplicate member detection used aliased COUNT() which MySQL rejects. Replaced with createFunction('COUNT(cm.id)').
  • InviteMemberModal no longer shows teams in search results (AccountMultiple icon removed, circle type branch removed).
  • ArchiveTeamModal displays resolved folder name instead of raw /f/{id} link.
  • Announcement banner (mohamedsakhri/nextcloud-announcementbanner) suppressed in iframes via .announcementbanner-stack CSS selector.
  • share_folder config.php respected when creating team folders (AIO and similar installations).

Added

  • Ghost member cleanup. New "Ghost cleanup" tab in Admin settings. Scans all team memberships for users whose NC account has been deleted, grouped by uid. Admin can remove a ghost from a single team or from all teams at once. Includes a live-account safety guard. Endpoint: GET /api/v1/admin/maintenance/ghost-members, DELETE /api/v1/admin/maintenance/ghost-members/{userId}.
  • share_folder config.php support. When an NC instance sets 'share_folder' => '/Shared' (or any path) in config.php (common in AIO installations), TeamHub creates the shared team folder inside that path. Falls back to the user root when the path is absent, missing, or not a folder.
  • Invite button in Manage team → Members tab. Team admins and owners now have an "Invite members" button directly on the Members tab, opening the existing InviteMemberModal. Member list refreshes after invite completes.
  • Archive location name resolution. The archive/delete confirmation modal now shows the human-readable folder name (e.g. "TeamHub Archives") instead of the raw /f/150770 file ID link. Resolved server-side in ArchiveService::getAdminSettings().
  • Announcement banner suppression in iframe. The CSS injected into embedded iframes now hides banners rendered by the announcementbanner app (mohamedsakhri/nextcloud-announcementbanner). The banner remains visible on the parent TeamHub page.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturepLfqcez5PHzBBt4uvQUuBGuVX2F+Ensw6x8TOu2G5BMwPa5XM/IPDpTKwYl5bruyA5CI7UWwW8Kb+NwEOdBR4nQMiMRxg5EJTQeg4mvsz+0P2LK/m28o6zA0D6a8NZThFpd6TRz6iOJybaNjqCZMClHlEHpwWLyuSy8Q+F485bD5TxQxLSWtuEAUFGX5gnj5S5plOx9dLLQKusc0j6guap2BM/rJboKisDS6rkYcMtfPS+/sKtHe9WceNvV6M3ulYWxFtpf4NPlr7XkYreTDYzXWt7m0aaNjxVBn7N4m6DasYvG1FA97K/qO6RdBPHg7GGh6DmoyRw+fE+GsM162FCFfnomewnYPH8yKt05DPueEIbgMkQXeGJ7E19CMan+CyUCv1GvdomrVoNHBazt3IXNH+AIHokIQnj8ScwKFScQ7gahdGkABoULK4fwV90DpxOuxN1uoGC/aDI6+fC1gAN0gUoHaGIgevjn7+jGPGeuAdrbZpnV4xnJBTM/P+mPu3Dc+Dop8irM63XP7dfy8v33NHoN5N2gdIHPGJsqhDpqNSg6T02esJehL42h0yTlaRZ40Qs4el13FxijnnVjk4Cz8m/Q1cPm5x1RSWYpDNQ7NhlQxsWIyLMiZFcfTVZh0rWuitR/NXMKzs3WKwSNdw/xQwgagUStk6O5hDJGM07s=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.38.1
Release Details
UpdatedMay 14, 2026, 8:01 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturep1xq5GU5FgnU+VBmRTq1YN5VobUyjICVQ1UEEoxNmz+9GoTiMzc4SHrb4aQDDAIA8VppLDpx4+z8TKLAi7OgGy6COZK/7CHQrdDt0Qk+q6ACl4AF3l+RgV0DWrHxbP6V/LkewhJHUl9scVJkfIBwoZXK2bITpo65RdDMVDfTiHR7Nf1/jm/nwjpi2ZMYf7Ct969eB7a+IDoydWoYBETd5mlLBp30cWFthnT3uEpPRJYCgKvOdO9iVjBBOP2VtudKYDkUmdKpHbQutIxQbCcnw5455wCS4byicyEfu6oLxN6VYNk+VSttFf+PQlC7TFYNyHW/XOpneBM/z5yA/e9UaipRtFFzG/ZTepEQL6LoU2UgaXm/cPF4rDtqh3t+7BPR1OerRej8cTXsut7zugiKW2lm98Z3yXixEtTe5b0TJajkVTFYXfVBDYFUR5PLsAczk5ipa8O9UgapijqQDYKvqFyHhrrobWdAHs/cUJMZE7UdLJhpvrEeYfQJTSurKXI4uqLx/PIMj7P2C+LYQn71gnxJStjhCxy5syvDt8EQbljl8tlUtGWmbtpojG0JF9k3j502osAoHz5S02c357aqCGmdaY3Q9PlVyG2C12v2AXB1k5dOKG4nJ8IbrKlBYMe8xiqEllgoc722ab4wtcXqQoeA+kWT9q41VyRt6qrByYU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.37.0
Release Details
UpdatedMay 14, 2026, 6:27 p.m.
Changelog

Added

  • Message @mentions. PostMessageForm and MessageCard edit mode use NcRichContenteditable with the NC core OCS autocomplete API (/ocs/v2.php/core/autocomplete/get), scoped to team members. Mentions render as styled highlight pills in the message body. Backend sends a message_mention NC notification to each mentioned team member (on create and edit).
  • Message pagination. 5 messages per page with prev/next controls in the message stream. Page resets to 1 on team switch and after posting. MessageMapper::countByTeamId() added. listMessages now returns total, page, and limit alongside messages.
  • Per-team message settings. New Messages tab in Manage team for team admins. Configures minimum role to pin messages and minimum role to post messages, stored as per-team IConfig keys. Post Message button hidden (not just disabled) when the user lacks the post role.
  • Calendar view dropdown. Embed bar now has a native select for Month / Week / Day / List variants; selecting reloads the iframe with the chosen view in the URL.
  • Calendar embed auto-reload. After adding or deleting events, the calendar iframe reloads automatically so changes appear immediately.
  • NC-relative team links. Custom team links now accept apps/... or /apps/... paths (e.g. apps/collectives/s5) and open in an iframe tab, just like built-in app tabs. External https:// links continue to open in a new browser tab.
  • VitePress documentation site in docs/. Covers Nextcloud admins, Team management, Developers, and Users — 20 pages total.
  • New migration Version000336200 — remediates auto-generated primary key name on oc_teamhub_team_app_resources for existing PostgreSQL installs.
  • message_mention notifier subject in Notifier.php.
  • getMessageSettings / saveMessageSettings endpoints (GET/POST /api/v1/teams/{teamId}/messages/settings).
  • getCalendarEventsForWeek endpoint (GET /api/v1/teams/{teamId}/calendar/events/week).
  • deleteCalendarEvents endpoint (DELETE /api/v1/teams/{teamId}/calendar/events).

Changed

  • Calendar iframe URL now uses the public share token path /apps/calendar/p/{token}/{view}/now (team-calendar-only, no personal calendars). Falls back to full app when no token available.
  • Calendar connect error handling in ManageTeamView no longer logs the full HTML 500 response body to the console.
  • getPinMinLevel reads per-team IConfig key first, falls back to global key. Admin settings Messages tab removed (settings are now entirely per-team).
  • activeFilesIsGf / activeFilesIsShared in ManageTeamView use .some() across all active files rows so the GF connect buttons correctly hide when a GF is active even if a shared folder row appears first.
  • dav_shares access filter in getRealCalendarIds broadened from IN (1,2) to IN (1,2,3) for compatibility with NC Calendar 5.x circle shares.
  • resumeCalendarAccess corrected from access=1 (read-only) to access=2 (read-write).
  • Select dropdowns in AppEmbed bar and Manage team Messages tab have no background color (theme-transparent).

Fixed

  • MariaDB migration failure on NC 32.0.9: Version000328200 now uses explicit 'th_tar_pk' for setPrimaryKey() — auto-generated name was 31 chars, one over the 30-char DBAL limit.
  • Calendar connectExistingCalendar TypeErrorResourceService was passing $resourceId as string to a method expecting int; cast to (int) at the call site.
  • GF connect buttons visible when GF already activeactiveFilesIsGf now uses .some() instead of .find() so ordering of rows doesn't affect the result.

Added

  • Strict 1:1 enforcement for files resources. ResourceDiscoveryService::reconcileApp now snapshots the team's active files state and routes newly discovered rows accordingly: active shared + incoming GF → pending (with isDualFolderPending flag); active GF + anything → ignored (GF precedence); active shared + another shared → ignored. acceptResource and unignoreResource apply the same guard. All refusals write resource.suppressed_duplicate audit entries with reason codes.
  • Group folder takes precedence in getTeamResources. When both shared and GF rows are active (dual state during manual migration), the loop explicitly picks the gf: row so widgets and the team home always read from the group folder.
  • Dual-folder informational notice in Manage Team → Settings → Team Apps. When a GF is discovered alongside an active shared folder, a blue panel explains the situation and directs the admin to connect the group folder via the existing buttons and migrate files manually.
  • Resource-type badge ("Group folder" / "Shared folder") on each active files row in the settings panel.
  • Picker filtering by active files type. GET /api/v1/pickers/files now accepts activeFilesType=shared|gf|none. Shared folders are suppressed when one is already active; both types hidden when a GF is active.
  • isDualFolderPending flag on panel data rows.
  • normalPendingResources, dualFolderPendingRow, dualFolderSharedRow, activeFilesRow, activeFilesIsShared, activeFilesIsGf computed properties in ManageTeamView.vue.
  • Create New button for Talk — shown in empty state alongside Connect existing.
  • Create New group folder button for Files — shown only when Group Folders is installed; switches label to "+ Create new group folder" when a shared folder is active (signals the workflow).
  • Both 1:1 buttons hidden once a resource is connected, except when a shared folder is active and Group Folders is available — then the GF buttons remain so admin can attach a GF for manual migration.

Changed

  • ResourceService::upsertResourceRow() — now promotes pending/ignored rows to active on explicit connect instead of skipping. Fixes silent failure when the discovery reconciler had already inserted the resource as pending.
  • ResourceService::getTeamResources() — files block prefers gf: row when multiple active rows exist.
  • ResourceDiscoveryService::getSettingsPanelData() — adds dual-folder detection and tagging.
  • ResourceDiscoveryService::resolveFileName() — falls back to basename(path) when filecache.name is empty (some storage backends).
  • FilesService::listConnectableFileFolders() — accepts activeFilesType parameter, filters output accordingly. Also falls back to basename(path) for shared folder names.
  • ResourceStateController::getPanelData() — now triggers reconcileTeam before returning panel data, so externally added GF resources appear immediately.
  • ManageTeamView::connectExisting() — empty catch block replaced with showError().

Fixed

  • Critical pre-existing bug in ArchiveService.php: stray extra } (line ~2770) caused ParseError: unexpected token "try" on every admin archive request. Removed. Archive settings save works again.
  • AdminSettings.vue archive form: archiveBeforeDelete was missing from the data() default and from loadArchiveSettings — the toggle had no reactive backing. Both fixed.

Removed

  • The auto-migration system (FolderMigrationService, FolderMigrationController, FolderMigrationModal.vue, two endpoints) was scoped, built, and removed per user direction. NcDialog wiring proved unreliable; manual file migration is the supported path. The dual-folder notice remains as an informational signal only.

Security

  • All new endpoints check team admin level (≥8) before any action.
  • No raw SQL anywhere; no \OC::$server; constructor DI throughout.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureNB4VEY/kY6IM6/q9rg1aZPixwOBTrNlZIbr9hGsb3TcGQ3kXe591A67Rez1U2FQO3FcRuoxZRNXGMJkziuhoaa9RkoGQuHxtueXomwk5UWjFSTbgf8+JFSFXag8NUNM7DqEnRjG3hLad6HdDwdv8t+t7CDhkih5s2rGI7G55B9uSNdY0LftIal9G2M4DBJmpZtJ+1RitAI/ZqqRCjA+lVc0V7AQFeCxVyrt9weLTdXuvzGTZhazmiYZELVrbpUwurxRgmE6itg5pWp+T4FC1ilm7zyz/v6LOSmRBqgNExbS5lbEutYBoKLSKEPfvjAO2emcj54Ng9PwvRlP1iTvGr7jrZ15DZa0mBL6sXMvDpEdR2yvoAsVDvlroHW0aILMDnc3HruzKkmB8ykRyrkOAwVmCRQUPN5pjr6Qre/hCgYWZR0d+YHFopsJ/VDiH6+PH8aYia/92Z6z21kbvT4wUrqwqARyI510Dcq9TLx+O6CeNqYmBiPYkpAUoX1ck+q3fZAH3cqTXH7N5ezRctAnM3CvctmxMG7Gpd9BmLj0wF1p69qGQ4FvpcVSsFoFt3sc8qxfARDRm0fu+avD47k4YvKfR1NFbUhHe+RMYivFWlmCAhwbaObsGt2mCbyfIwxLFM/S4N2+ji8lwYT2wC9cPTHYTL1+dZNwTCCdaTEZIVSE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.36.8
Release Details
UpdatedMay 13, 2026, 7:15 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturelhEnGI/fAC8OFXF2pnGBIlqEN6Bw4EurQEVPeTeuGc+O+1NHT6t7rYfX5gBJinYOJScN0dXIys+FHOvzY/QGT02MbHUDXMqtwzYoegOZBlRE/TXUXp0LKCx+3m+rHjKd9dCtBJi++X2ZUJUqGzsU4Km1WNRKqv6gubdCYUAMjXZmrXtfuEtdOqc5yAgnaA7CxKx+TPcc8bpU+SPkiFeuC9EB+iwnM+3NJThjc6RIQWiCwc9F5i1FsXikkYe9gYENyaraXhZrqj1eeC2hHwBRB5aXYMO9FghzzjvQ2VZo/psiiGWukii17WqKSofNN5N6yeh0Va2q/dT3RRmtRNhZ16D9eCeVLF+w6rUaP3bz3lNZIeksbIkV5E3d3F/FXc51QdNIlQ5D1LdB4ghhVYtvTBFzf5WbB5yzM6uSA/zcR5g02p4iMzLdVoILfkXoMRV7VNISvQfPP9ExuQnw15dpA7nSzIEC2dtLCNoA1xUPTCVCOpz3CMHILjL5F4l8HJtQKx5D9IV8l5Sakf7uqp7SJcx8CWh03/iX6Eibp5HRRS4PsdKyZVKiWgOyG6iXkTktCruXQKGXi5MSwkpPZvYUz8//klH2Bn87PSHJ+q9rtca0j4w/o0QBqnJr03gHcKPh3Y5vD0aaca57svcZPbhr+dwT4WXmEBNkxRlNKwmI0v8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.36.5
Release Details
UpdatedMay 11, 2026, 7:29 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatures016TbppM9kULPOeWRGdKsV9pcTR+YBhPBA2cPZPRtKPLKxUpr80YJrCOj2+VxmxQrrr0cwaFgQTjtCTw8Uw1ush4zPNdfXfX2HFqsvmP2JYDEFQwk6ftJLwiDfeUk4kDnarODZ2WAJ6Ol22Sq8w4cxdgADyVDii0sRaHyyEnghCuyttUccXzr/1uf1MzlzuH0xhbLSKALpnQVnTKz0jMNgGifh/ug5nh+tmz/nwLSUGJ/n+iyWp8qQhzWtlKQpSSTAW3COCOQvleVoprDWkU9LyOKmQvYXExEmsf9C21olxxEkHygVhDEKKN+2eNmH1XsTyuBmi9SVDOP5uruPsiZs7bnmO9ToBI8oTCtRa6jmu2pJpPjTjIdGW7Mr5US/NEbjljWFdC0KJZ4y0Y5+z6oKExqXb13D/bMndP5uNNZI/0SwLTCCpfd6DYYp9TCESagMG6zARVbIu69ReMWlmvEL2Uhq0hKqlBfhKrHwyrtYRXXzLpn+riNO2WafrOrVmMMT8t1+0aXUdqYBRKz6jpuwRag29IutxSsYwNA9oSlCmjhylald0jhu6AAK9Zi5fg0HuKudr7RBhk4wPY+HrgHtVwvl9h5dJ0ADJmsJEE77CKaT8xdV0SgpRU/JZCMw9qHFnkz7qDR/f/fmshi0L9qaDVOB0hWOKP7Td1BvlC3g=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.32.2
Release Details
UpdatedMay 10, 2026, 11:50 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureaqlS5xLgAtQMFnFSjAjXnjfpSSV5UCZpVyKef4AdzzktPWmKamnaJ/o9bl/knf5Ccxcaac5gNFKSZcycZ4yrXj+BKTne63Wt+G4a/W3uhVV+jEz0aXacH4jwhVJuxDExsQUp83WA/JxrlFp38nEXc3fSMhAPZsP829eID9w6AbRSujgEzOfNCsduJ0Isrw+m60fR8R7LsX0CSC3XzGwLVwoJhbXJ52Ri8JRxLziVP/If/TAJR+pqg25hjGoYRqoPTacmdoFbNxcaZOeAxJSR0VRMwFS7rJJakiZ95w54KztDRvMwJAIMBr4BDtAiqedj3GCj8AtsPmvh3dEh3OPw4xMjQlTRAqW6yL1t4AhvL5dy5dmlQyRZiKwTkSC/9+/SXwR+e+1vfaB5ffmA3JAt9LIZ+24gP7O989Ed6yIo8Rh9//c6HwXky+L1MDOU9onZU3mwWBvI2xujyIhYu9uXMV6q587FsyptGaAoeBVtbtmY6DxiodLmgE5no1Gm0OBt7vy2ZUEhE9ToktSetWQPLtpjptRUBbAyomUGpEiaLSQP7y08h1ulPHoMjM3MelrxfGqSytHakG/M8bImdS7dO46kRG4gEf9C1LaaXH3KkfiNu0F5FPEbf0qidxDY5XePKUiAPirG5nSXLjYCu6f8hDktPh/U70EIWKuO4AAi4qw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.28.0
Release Details
UpdatedMay 7, 2026, 7:47 p.m.
Changelog

Added

  • Connect existing app resources to a team. Team owners can now choose, per app, to connect a Calendar / Files folder / Deck board / Talk room they already own instead of creating a new one. Available in the Create-team wizard step 4 and in Manage Team → Settings → Apps.
  • Resource pickers (GET /api/v1/pickers/{calendar|deck|talk}) listing the current user's owned resources, scoped to the caller's UID.
  • Connect endpoint POST /api/v1/teams/{teamId}/resources/{app}/connect (team-admin required) that inserts the share/ACL row granting the team's circle access to the selected resource.
  • ResourcePicker.vue — unified picker component used by both the wizard and the manage-team dialog. Files mode opens NC's standard getFilePickerBuilder dialog; the other three apps render a populated <select> populated from the picker endpoint.
  • Connected-resource warning under "Delete team" in Manage Team → Maintenance, explaining that connected resources are deleted with the team and how to preserve them.
  • Archive-before-delete admin toggle. New checkbox in Archive Policy controls whether team deletion produces an archive ZIP first or skips archiving entirely. Default OFF for new and existing installs. Same three deletion modes (hard / soft30 / soft60) apply to both archive-on and archive-off paths.
  • POST /api/v1/teams/{teamId}/soft-delete endpoint for soft-delete without archive — creates a pending-deletion row and suspends connected app resources but skips archive production.
  • Owner-side delete dialog when archive-before-delete is OFF, with description and confirmation text adapted to the chosen deletion mode (immediate hard delete vs 30/60 day grace period without archive).

Changed

  • The Delete-team button in Manage Team → Maintenance now branches based on admin policy: archive ON opens the existing archive modal; archive OFF opens a plain NcDialog confirmation.
  • Description text for the Delete-team row dynamically reflects the active archive policy and deletion mode.

Fixed

  • PostgreSQL SQLSTATE[22P02]: invalid input syntax for type smallint: "f" on team creation. The enabled (in teamhub_team_apps) and is_builtin (in teamhub_integ_registry) columns are SMALLINT (per the v3.9.0 cross-database fix), but their bind parameters were still using IQueryBuilder::PARAM_BOOL. PostgreSQL refuses the boolean-to-smallint coercion at the wire-protocol level; MySQL accepted it silently. Fixed by casting to int and binding as PARAM_INT in TeamAppMapper::upsert() and IntegrationRegistryMapper::register().

Security

  • Every connect endpoint re-verifies that the user owns the specified resource (WHERE owner = currentUid or IRootFolder::getById() for Files), preventing forged-resourceId attacks across the four supported apps.
  • Each app refuses to connect a second resource if one is already linked to the team (one-resource-per-team invariant).
  • Picker endpoints scope listing to the caller's UID — never accept a UID from request parameters.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureADlRyz4GyYgl8rljgx6Xw5Yq+hXjFnDGsT/M68SMUIu0PyMV0qJzbt+63EO5ij0SJrNYsf0ggbHaHct97ckYFzxrkFf7+B2O9l5YWdatd+dmtt0FQEMKBReJBSb93ZSRU65JXVlE0/43ikwK+RW9DiQI7QS3/DWSvRf83C43vI57g3PKs0dovrU5BwXWIb0bh7OvzXSfq7guF3JnFxlSeBTsrA9KUDTwQY03n1Wqi6tDYwLvTIQu8tKnPCMmzVQJlAc4d2krRVgEDGn+hNXN8+0sq8YSAq2ZCc2ckBXlMTyzLRrqwkZz7LpgljadbYATQe/GhS+ax5AFKL9efbXx0ny5S553N6Clgaq9vn5AyT5JASVo22Sf/Yxs/bT+EVYxKmwSd7XW9PDvXYwtG9aojqkQnEgZdas2MCeZw3e4yAsh1pd6KpFf3LuQ9U7nxzDSoABLZSDPYctIIZoVVQTPM35Bd/poEbOYl5f60bOYHEmeQkFP/MCVuqM9/XuJ1hIw27U7GdDCAsC1ONdcmlIRYEJHdIQ+yxOjMMYm8F18OjHJYoDuk/GIjFmGCF5QzcE+vdK6z4SO5n6JtTTsM6T8ruv/FNUFtQYbIb4KrhzbUs4TOxV+MCAI0/lB7IJiWdogLEiVuABwSecEPzt/K2qCbK9VgzJV8h77Yg1Z72ic1Dg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.27.4
Release Details
UpdatedMay 7, 2026, 1:14 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureWsF4We8JALnZvd9ZxzvftUVv6y9bJoO2AK9e/PM7P3dJn/cu8zwy1WvJhJDwbFP8Z0Nzcpj/wmN2WjfT0+1nbLor4BJ8Ls7noGy6KZR+laWTW/UHwGcRgFK5FB53Yi7W/rUTcp1dyM05gyl8sZAmrQxA/sD/unJccyNHcQJPpw3s8tsEShXmsFlZJuO2Ria+a0bKRXSQl1Az5v9ORk/Bx0Wd8oTVD+x2yEBq70TMaA4UqHU0Q/qNrZn03XHCYA6bh3QExdWx8sV3dNJ9X8envbqwPG53VL8KIOZD31DsjkVZ73+/stHpj3xQgwoiQ7oQD+ggorUShI16nrkd/VTV+M7VtcZyPxacndnslzeZyS00p2o0U9SzRTiJB3d76gogX/7XdQpRmUIeUroB1UNGaLMoILC8LojcDQsDGgv0w6adCZ5f/BdEgUkZKSMcm++IN5cYtm+q6+Eth29bh7gq5RIpuKb0Ous5wjG9UVgLHi/KDhtj+vZoUkg8CQ3ctPttf+FkJtY/xTuoEzf0ygy8nlHYsBoGQmdjyUqvuB7MZKCL3y1F8mGwEI0FYFMhbRnRVbYQy1ae8RpQj/fKEAWwXEfGIBbQAySath1iBlILNeAreUWmJpiWnE+aSghtd//HPcKvwHW1nRLt4f/UuMYIjCm3u/7C/CrJ49X2ZbIJSyU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.24.0
Release Details
UpdatedMay 5, 2026, 8:48 a.m.
Changelog

Added

  • Mobile single-canvas layout for viewports ≤ 768px and tablet portrait (≤ 1024px portrait). New MobileWidgetView.vue: scrollable canvas, collapsible icon bar at bottom with one icon per accessible widget, FAB action button.
  • FAB widget actions — in-canvas action button rows removed; actions surfaced via FAB: single action fires directly, multiple actions open a slide-up sheet.
  • Tablet landscape layout for viewports ≤ 1200px landscape: 60/40 split with message stream left and collapsible widget column right. Widget cards have spacing and rounded borders.
  • NC sidebar auto-close on mobile/tablet-portrait — uses NcAppNavigation :open.sync prop to close reactively after selecting a team or action, instead of fragile DOM manipulation.

Changed

  • Embedded app iframe content height set to 100% (previously 90%).
  • Edit layout button hidden on both mobile and tablet layouts (editing not available in these modes).
  • Seven modals (ManageLinksModal, AddEventModal, AddTaskModal, AddPersonalTaskModal, InviteMemberModal, ScheduleMeetingModal, TeamMeetingModal) now set min-width: 0 on viewports ≤ 768px to prevent horizontal overflow on phones.
  • MessageStream accepts hide-header prop and exposes openPostForm() method for FAB integration.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureTvyr9L9P+H2RLIOYb8tFSJIV/1sH4rWC2RhttmVfB98kvezRU7Xa/tVV+MKE758D3cT3BKsvBz7e/OtKoPKuCan6HR0AmXNbMYx3F/ep+BoEQP3H/m8pOaYF2xyRAYmsdHxV9EPyyFEX6Trxiwy5aNJSK5S9RJdC+fm8p0gmvDlP1G3+GCerMXdi2lioEpoAnIlE+fd7JUIt48C1YYHKAqDlsaw3wlXiYC4j68I8vVD8GdXYmYgXvxW3IeE/iUbOZJ75bpqxv3ufHqEFPAYas5+SMUy8fGQQZjBvjIN4ztSRwAIZ4e1OFZj2WsYsfJZEi5upcwPoqg5SGo4Xw7vp5Dz3Zxx2hCEhCdO8jlGSinqNul6lPRZmaKXm0GY8v03ZaHu2uUdyNPvOfnVRUbe2ekUKhXe7C0u9umdSLmv2/+HhQRGFFZH6Tfu6Pc1IwWirW2EnhmKoGHnWO0mjq+VK1Ip1ZntyZ1znM9U6fdQaHTjMBq2nlXQWnZgu1tw90QWf1rj3+MGQW9vUyrN5uEx9xxxBVxXjCxCVvkOsqwTR7lqqsQfp/NCR0lRyognr7Hmd985l8nUYHCrg9KfPzOfFxLRauxh1UIiRS1nif3WmJzmaelxyyRNysvksjzsc5GJW9C0wjTPsYOuZv2H+a3GRH1RSzadDXVS11CCDpVMPXG0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.23.0
Release Details
UpdatedMay 4, 2026, 7:35 a.m.
Changelog

Added

  • DELETE /api/v1/comments/{commentId} — hard-delete a comment. Author may always delete their own; team admins (Circles level ≥ 8) may delete any comment. Audit event comment.deleted written with metadata { message_id, author_id, deleted_by_admin, cleared_solved }.
  • Solved-question revert on answer deletion. If the deleted comment is the marked answer to a question, the parent message is automatically reverted to unsolved (question_solved=0, solved_comment_id=NULL). The confirmation dialog warns the user before proceeding.
  • Delete button on comments. Visible to the comment author and team admins. Confirmation dialog; disabled/spinner during async delete. Error messages are HTTP-status-aware (403, 404, generic).
  • currentUserIsTeamAdmin Vuex getter (level ≥ 8) — derived from current_user_level now returned by GET /api/v1/teams/{teamId}/members.
  • Markdown formatting toolbar in PostMessageForm.vue (new messages) and CommentsSection.vue (comments): Bold, Italic, Inline code, Code block, Heading (H2), Bullet list, Link. @mousedown.prevent preserves contenteditable selection; execCommand('insertText') fires at cursor.
  • Markdown toolbar on edit message. Same seven buttons in MessageCard.vue edit mode. Uses native selectionStart/End + setSelectionRange (plain textarea — no execCommand needed).

Fixed

  • XSS via v-html in message and comment bodies. Both renderMarkdown functions now pass output through DOMPurify.sanitize() with an explicit ALLOWED_TAGS/ALLOWED_ATTR allowlist before binding to v-html.
  • Headings (## text) and bullet lists (- item) rendered as literal text. renderMarkdown was a flat .replace() chain ending with \n → <br>, so heading and list regexes (which need multiline anchors) never matched. Rewrote using a null-byte placeholder pattern: code blocks and inline code are stashed before block-level rules run; restored after <br> conversion. Applied to MessageCard.vue and CommentsSection.vue.
  • Deck boards created with permission_edit = 0. Deck's AclMapper does not mark entity fields dirty when set via __call magic, so setPermissionEdit(true) was a no-op. Added enforceAclEditPermissions(): one independent QB UPDATE per column (permission_edit, permission_share, permission_manage), each try/caught so a missing column throws silently without blocking the others. Schema confirmed from live DB.
  • All Deck boards and Calendars provisioned in the same blue colour. createTeamResources() now picks one random colour per team ($teamColour = self::randomTeamColour()) and passes the same value to both createCalendar() and createDeckBoard().
  • Provisioned resources (Talk, Files, Calendar, Deck) not deleted when a team is deleted. deleteTeam() now fetches the team's app list from teamhub_team_apps before destroying the circle, then calls deleteTeamResource() for each app. Resources are deleted before circleService->destroy() so CalDAV/Talk can still resolve the circle principal. All apps are cleaned regardless of their enabled flag.

Changed

  • GET /api/v1/teams/{teamId}/members response now includes current_user_level (integer) alongside is_direct_member.
  • DELETE /teams/{teamId} now deletes all provisioned Nextcloud app resources before destroying the circle.
  • ResourceService::TEAM_COLOUR_PALETTE — 12-colour curated palette for NC-friendly team colours.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureNB29XEJ4DYUSSXCP7cIFfzPYsJyAPHHQtoOtktawP03w3p9lKDvZ86l7WnrBkKcOxtIv7oCuXPh8oQqZkj/L4XmpXAVcvIUPrZPtG3CQ4+OhNvC3BXT4T41GNLAQcG2hyQ4MZX11OBP1F5IfBmGWoY7il1gDNjDTIBqM4J0cFcO/Eg5q4zVYI2x1ks6+SpmlNCLdjVujDfZLN3/wXIQJA4zY5EqUexwmKvz2RiNNESfifz3wwpY5KcYEHrF+gasTIj1ZaaZ5TDC/4tUH71zpn3PAYNRpWPB8d/WhZW8yt0eaRw+4+hLItkzvwsKesAEljUNUrYD8IUD5VIWgysH1IgdXR3tJX2deQK3UW2gVFGuwJvNTtVzDuPGUsZ2m1VdhMPZcsPLqPLH+rvjwrG4qQlaTpXj9v/6ypBBoCo059KU7C5qnITKvANLXgldhEIyV3VNlCjbvww8v2Ogu+FSkSPpQRCq2FWygTVQJNYVIzjNS8J4lGfloPU9lXkEW1UvtK7nzZoumi/H9xmhj3edmOP/MzaR7wrToziaf6cWhhgYfnLxS60TYOUFmY7BCarcQ6y2tlXfPsCHYSDupV2/39kINeZ55xp70YP21S2WyjkkmmsXO76YDImJJIfXJhSUKnfJ7j1gk06Z8QwjQlAxkN2hDHG0JhQVcjWLAri/2A4U=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.22.0
Release Details
UpdatedMay 1, 2026, 12:35 p.m.
Changelog

Fixed

  • Indirect members (added via NC group/sub-team) could not see built-in app tabs (Talk, Files, Calendar, Deck). ResourceService::getTeamResources() checked only for a direct circles_member row; indirect members have none, so the method threw and the controller returned all-null resources. Added isEffectiveTeamMember() helper in ResourceService that mirrors the two-step indirect-membership check (circles_member → circles_membership) used elsewhere, without introducing a circular dependency on MemberService.
  • Member count in members widget was inflated when groups or sub-teams were present. getEffectiveMemberCount() used COUNT(*) FROM circles_membership, which includes group-proxy and sub-team-proxy circles as rows alongside individual users. Replaced with a query that inner-joins circles_member on user_type=1, level=9 to isolate personal user circles, and uses COUNT(DISTINCT user_id) to deduplicate users who appear via multiple membership paths.
  • Pages widget hidden after team creation even when Intravox page was successfully created. create-resources did not write to teamhub_team_apps, so getTeamResources found no intravox row and returned resources.intravox = false.
  • Manage team → Settings → Team apps showed all apps enabled after creation, regardless of wizard selections. Same missing write: ManageTeamView fell back to defaultEnabled = true for every app when no rows existed. The wizard now sends a complete appStates payload (all apps, enabled and disabled) with create-resources; the backend validates and persists these via updateTeamApps().
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureaF+aB3FIewjvx0eqVweCVBEI9ipOSyJoOcNoEC9XKXKaYsVdnElwJwRyq9so1vwmCMkRE2kmmlkqeK+kDc+cDrFhnwG/2NuzoTbG/BQViG1UqASNTodIVMWT3YfFcpVgWYwmY4ebBlHYFmDzpXmozDw74hodGwtZIXiSavfzJhtXhPYvhi/e+Q7v7qICbytjO9C1JFzEEcsGZNNEhkUlSiuO9SMt+yjkG6iWaCzcNjPMPmS7OROieXzAJ/Xxb5vG3aZocJfl2IezIR7sZ1XFrhvRy8+HB0r1EBunJa4YwgM86MaGzlIB2PdMH6OrN6ly6DZwl98oJTMCAjHT95/U/vuzzuwOrsg8P6Y7y+j0mH5nf/ZbSl0FeJk5tfv2GQe2XFXvRw7aKi/K+Y9B0dYReMPmwsBlPvx3mqEj543CaEP/Qzs4xmCJ/V1V0qzGfUkU0UvoDCPh7JLiDED8+O598KEFaxGSOOOqg9hhOLGszJG4jIFyTGsnBLvDFvR4bPFuA5HFjnPH6WdTWnfRhZFhtNojz3LQcsPP5Em9Y7x13KmW8h0HfJ92jzXyY13+4oK8jm9k/TNWyzqz7WYfb83tsia8cUw6PF4yA7fgBs8F4221Ko+19QtZIijE53M2txRNODZ/XsXLdM3ifatbgGi65T0tAzAw3BmWdMtWmHHrvPk=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.21.0
Release Details
UpdatedMay 1, 2026, 9:10 a.m.
Changelog

Added

  • WCAG 2.2 accessibility audit and remediation (Sessions 1–3). Full codebase reviewed against all A and AA criteria. The following fixes were applied:

1.1.1 Non-text content

  • AppEmbed.vue: <iframe> now carries :title="label" so screen readers identify embedded apps (Chat, Files, Calendar, Deck).
  • MessageCard.vue: poll options now carry role="button", aria-pressed, aria-label, tabindex, and @keydown.enter/space handlers — keyboard and AT users can vote in polls.

1.3.1 Info and relationships

  • TeamWidgetGrid.vue: all 11 widget title <span> elements replaced with <h2> (margin/padding reset added to prevent browser defaults from breaking layout). Screen reader users can now navigate widgets by heading.
  • MessageCard.vue edit mode: bare <input> and <textarea> now have associated <label> elements linked by unique per-message id.

1.4.1 Use of color

  • MessageCard.vue: voted poll option now shows a CheckCircleOutline icon alongside the background highlight — vote state is no longer conveyed by colour alone.

1.4.3 Contrast — hardcoded colours

  • DeckWidget.vue: #0e7490 teal replaced with var(--color-info-text, var(--color-main-text)).
  • FilesFavoritesWidget.vue: #f6c342 gold replaced with var(--color-warning, #f6c342).
  • TeamWidgetGrid.vue: #1a1a1a on success/warning badges replaced with var(--color-success-text, #1a1a1a) and var(--color-warning-text, #1a1a1a).

2.1.1 / 2.4.7 Keyboard access and focus visible

  • All 10 components with outline: none on :focus migrated to :focus-visible with 2px solid var(--color-primary-element) ring. Mouse/touch users are unaffected; keyboard users now see focus indicators.
  • App.vue: duplicate :focus-visible blocks consolidated; outline: none removed.
  • TeamTabBar.vue: role="tablist", role="tab", and aria-selected added to all tab buttons. Tab/Shift+Tab moves focus; Left/Right arrow reorders the focused tab and restores focus after re-render via $nextTick.
  • TeamWidgetGrid.vue (edit mode): all 11 drag handles gain tabindex="0" and @keydown handlers for ↑ ↓ ← → to move widgets on the grid. moveWidget() swaps positions with the neighbour in sorted order (fixes vue-grid-layout vertical compaction cancelling y ± 1 nudges).

2.4.6 Headings and labels

  • Same as 1.3.1 widget <h2> and edit input <label> changes above.

2.5.7 Dragging movements

  • Tab bar: Left/Right arrow keys on focused tab provide a keyboard alternative to drag-to-reorder (WCAG requires a pointer/keyboard alternative).
  • Widget grid: ↑ ↓ ← → on focused drag handle provide a keyboard alternative to grid drag-and-drop.

4.1.2 Name, role, value

  • TeamTabBar.vue: role="tablist" + aria-label="Team navigation" on wrapper; role="tab" + aria-selected on each button tab; web link tabs correctly excluded from tab role.
  • TeamWidgetGrid.vue: all 11 collapse/expand buttons now include the widget name in their aria-label (e.g. "Collapse Team Messages" instead of "Collapse").
  • AppEmbed.vue: <iframe title> fix (see 1.1.1).

4.1.3 Status messages

  • PostMessageForm.vue: attachment list wrapped in aria-live="polite" aria-atomic="false" — upload status changes (Uploading…, ✓, error) are now announced to screen readers. Checkmark symbol given :aria-label="Upload complete".

Security

  • renderMarkdown (pre-existing): v-html binding in MessageCard.vue and CommentsSection.vue renders user content without HTML sanitization. Logged as open issue for a dedicated security session — fix requires DOMPurify.sanitize() before return.

Removed

  • Debug console.log calls in TeamWidgetGrid.vue (moveWidget) and TeamTabBar.vue (moveTabLeft, moveTabRight).

Fixed

  • Double margin-top gap below NC top bar. NC page frame and NcContent both applied margin-top: var(--header-height) to the same element. Added #content-vue.app-teamhub { margin-top: 0 } to zero the page-frame copy only.
  • TypeError: e.n is not a function on team pages. translatePlural imported at module scope is invisible to Vue 2 templates — added n to methods: { t, n } in all five affected components; AdminSettings gets an inline n() method matching its existing t() pattern.

Changed

  • All error messages use {error} named placeholder instead of string concatenation. Allows translators to reposition the error detail within the sentence (22 call sites across 10 components).
  • All count-bearing strings converted to n() plural forms (14 strings across 5 components). Translators can now supply correct plural rules per language.

Added

  • Transifex plumbing. .tx/config and .l10nignore added. Stale l10n/en.js / l10n/en.json removed. Ready for NC community bot once @nextcloud-bot is invited to the repo.
  • TRANSLATORS: hints on ambiguous strings: Comment, Leave, Join (team vs. meeting), poll vote labels.
  • Translation standards added to SKILLS.md — every string written in future sessions must be translation-ready immediately.

Removed

  • Debug logging purged. 23 JS (console.log / console.error) and 15 PHP (error_log) calls removed across App.vue, FeedbackModal.vue, FilesSharedWidget.vue, TeamView.vue, FeedbackController.php, FeedbackService.php, TeamService.php, TelemetryService.php. The console.warn in TeamView.menuItemUrl() is intentionally kept as a security signal.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturenE6/JanHZPI2gJOiWJZMk28BvA/IenxP9ttZTLP8ukJhVHLtgEHDouOj6MlHhkol7j765YIdplWXD0snC26zoEjqGIeATPoVLA5C4s72+scF+8yA+ABvUZqoI0objebJsNj9vv4e35pMiFRYFjyxcqsepO9SZUd1h6OjJvd9HhLb+FGQ3XWUfhby3fASPzXUHADRgTSFALVT8uKoKBIT6N6RNsmtwZugGGt9sRJclHoFjYtjuw3taOU7IFSU0nzMeY0knJWJQqOiFHqPK02qA6+y1FSqROoxdmh5DzfXT2Lq82tep8PWNaIjy+eZnSPzZ7yMftzsUuw7Op2dt8IhIoeWlcBML4h4voLwnfSBvv4Y1iupF5NupORVXYQbCRwmGBNfpMV3giQAYLitqCBpEzshO22fwTas7ipF9ERzl8Xjnr+kC/FHRwsGaq86iE9uSeEbebDTRS0S1iQJ2QO3uefGq0ak/+D3fbeaEHEZTkmSZ+IHWsrPoPCj+hDThe812ymYqyN6AoCS688N60mHIGUETeN69fCDXFHWylumRxkdCIS9y9g5OtQTVXrKNNfui75jlQcjhQp8DH6aSWBZNIUSFEUw4D+TiXlOfwCJVHEQUxG0mIHvXMyMGS1HUmj0u5/5U3RFxjZeELbUxBdUE6Y39z7mWcI82aLrAf7PHFY=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.20.1
Release Details
UpdatedApril 30, 2026, 11:36 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureQ76CfO42b16YE6NfBvItjvR78K1DPxanhH91XK8A7vyu03DdXe7OUTFmHfzDd0Rrd0V3K8d+/ss0K8d3VUxJ8awlTx0OPmbQ46R+Q4Ar7SiQPOFhn+pi2JFJmQ/okVKIt1ltSZFY+rinZvOy7IrbONsPxD7EWiiE+3ES9wvNVBwvV0vByOQjLvZcMuOekOJmuqGQxAkiGMr/hYPCG9hYUUjjM140GgbKxpy5AR5zEEARvY1E8up0BNapKTdTEaxHq5kYuv708iGtmpuqQ74W0kXi39e0e3q5Ct3iaWo7ZTv3fVMa9UPxM919JoFSw41MDxReeILrujP/mfdgDJc870Heoi74URx8KM7lq1k8Oq2137OVmJFdmaZb1X6GFBozBOFQBWfIAuWg3b8PD7qxy49Qv8bFruv45eAsMtopCjOqrWICqteqyGNkZx1+VLB0yhzXvvkCRRD3ug4tgVwQ7G3gaLhWW1nrt/N1xrCRXaTk0XumsrprLn0ky1aK+i7mKyUsY4HA1C+C21pJ8lgwL8wjmo4Dm3OA5bZ/Fht2lO0YBKJGrt81BshzPYICFVb4pa8F5ESVyN6iaI3UmzvUHrSKYaOlfhhMWs1GsCo3ayDJ7I/iTmTHhltY6uicMp609IA6RTYQ9xVZ3bpaX3gkEGvvyTUY0dUFJdt5bnJP9iE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.18.3
Release Details
UpdatedApril 29, 2026, 12:15 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureBbSeggogNn0JPG7UmMXVzr1S9eGLRgtmaNwEg6Yo8UenbN4JWPjazn+m78aXajFSeh6jbmkpYR5WS7siW2o1xYVqqWTT4/ollugaFrvcDLi9moShgbqcFpi345PSRshFSaFNgIFCcdy4BBGhkVq17dkZRF9vRELuwtsHE+EsAtC4cg0K1x7fhDZ8AbrVUcWthvCAU7mqq/CDbI5QLMHFH/niUjZfxld01piActRQW51/eiXx7RvpY1XIUUd1JJtZjkcLEUpIojQb5Y6vFWnManLZHJ14Y0FC5WJyFvNXszE9twaUCI0ZtnurdSIogtJenXpPCGE397gx0r1KXwDnlXKJIHTNP81xiYQrxsLp6TjDabK9JIz1I6Mv6WVRZbk8O/fZNntQFJDKc+Lwp8d2WD8gEmOXRpvVsOjAuE1WqClJYJZi6MFY0y4H9/iLE7qi2cNj4kP4wdzGupaUWW6J4VprIRNAzSOqERdCLna82JvkMxU1tLiG6hFVmYc5F5QagWPEQlta7IWVmR4/07gZnu029Ec45hrrDyq96wiD5WAA0uqAcL2kir82l8vLeT/4a3uxAWf6YwMF7KldyJZhfoh1gA+uE8vEvKfUFBCDesKclXPsH+Wg4CP0eILT/h2LZ0J3lAd8HmdJnH6hmXp9wx7CxHrGRZYUdixix+59c5Y=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.15.0
Release Details
UpdatedApril 28, 2026, 2:21 p.m.
Changelog

Fixed

  • Calendar widget now reloads automatically after adding an event, scheduling a meeting, or creating a team meeting — all three modal close handlers now call refreshCalendar() via the widget grid ref.
  • Meeting notes public share link now grants read+write access (was read-only), so attendees can edit the notes file directly from the shared link.
  • @nextcloud/vue no longer logs "missing appName / appVersion" console errors — webpack.DefinePlugin now injects appName and appVersion as compile-time bare globals, which is what the library reads at module evaluation time.
  • Members widget: removed redundant border-top from .teamhub-memberships-list; Show all button width set to 90%; left-side padding unified to 12px across avatar stack, membership rows, and show-all button.
  • Removed redundant "Team Messages" heading from the message stream body (the accordion header already shows this label).
  • Removed duplicate "Post First Message" button from the empty-state — the header-level "+ Post Message" button already handles this.
  • All semantic color text uses (--color-error, --color-success, --color-warning) replaced with their high-contrast -text variants across 21 components, improving readability. Backgrounds and borders retain the base variables.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatureo9VGOkozPXYywaP2ZC3o2UICAIdsFUEdehNKJF0GKdgPgzMvL1Slkyeg9XI0ZiY+cw/Uu6rccUulLDeKWR+2iLRpDQb7iNg2ZCL8QgXYi5AjuO9diTPAqrywyowNNXV8gfFpJXJQ3DqEvkXQVptMXM1A5wNXjybgKAQAnTNSlrF+r4HvT/MJHomrojrDn2yCaHyhI5ER47B2YevI+CqWkKC2RFPwrcptBKVi62tk8VGVarMy9/Vrrp7zLbx8M5oZbVcLhdB7zIUerujkchkr2olx+SKYdNmdQ92tkw3kW584WiCqY6fsfLMD3PSRwHqiH3ScVFIXEHYIMeEphCnXukTwik9c4Vd3C/gAjV08K7Ii8ll9Yh4gt7uIMOfRx1o0HYDyMXqnFHlCnAalzN8UIkq+EXJ/i56lETuFvx0gnW8sxVmziuHpn76pjs9ZG1bVsPDSdwMKA1MwdnIt+pkaY7w9nB+25r7Nz7NMVgv9SvDxhMTo9zUGc1ncpnQ+xIqeEm2uCj+OPxjuYkAJ/vlSuzrdcxALAmzpecxR9J4CwZ+cnq9yJZoXIUMSnt694gd58/KsVAaHlI+cSVaPPZz/M26BwF5DJoWBdl+0fTVQ25WzciKzJ+pvmJAvH3KD3TxJKT0W2XTOWeoUfhzsv+nt47eDgDxvD8LUK1WxAtE0axw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.13.0
Release Details
UpdatedApril 24, 2026, 10:02 a.m.
Changelog

Added

  • Group and team members are now fully recognised. When a Nextcloud group or another team is added to a team, its users count towards the team's member total and gain access to the team. The members widget shows direct users as avatars (up to 16, sorted by role then last activity), followed by a flat list of added groups and teams with a GROUP or TEAM pill and their user count. A "Show all N members" link opens a searchable modal listing every effective user, deduplicated.
  • Manage Team → Members tab displays three buckets: Direct Members, Groups & Teams (with name and effective user count), and Pending Join Requests. Admins can remove whole groups or teams, which also clears their users' indirect access.
  • Invite modal can now search for and add other user-created teams (circles) in addition to users, groups, email invites, and federated contacts.
  • New GET /api/v1/teams/{teamId}/members/all endpoint — returns the flat deduplicated list of all effective users (direct plus expanded from groups and sub-teams) for the Show All modal. Requires member-level access.
  • New GET /api/v1/teams/{teamId}/members/manage endpoint — structured response (direct, groups, circles, effective_count) for the Manage Team members tab. Requires admin-level access.
  • BrowseTeamsView teams now return an isDirectMember flag so indirect members see a disabled Leave button with an explanatory tooltip rather than being allowed to "leave" a team they were never directly added to.
  • leaveTeam now detects indirect membership and returns a 403 with an indirect_member sentinel so the UI can show the tooltip explanation.

Changed

  • The GET /api/v1/teams/{teamId}/members response shape changed from a flat array to {members, memberships, effective_count, has_more, is_direct_member}. members is limited to the top 16 direct users (sorted by role then last login), memberships is the flat list of added groups and teams for the widget.
  • Admin Settings → Maintenance team member count column now reflects effective membership (direct users plus users from added groups and sub-teams) instead of only the three top-level rows in circles_member.
  • removeMember() now correctly handles groups (user_type=2) and teams (user_type=16) by using single_id as the delete key. It also calls MembershipService::onUpdate() after deletion so removed indirect users actually disappear from share pickers.
  • Pending Join Requests in Manage Team has extra top padding to separate it from the membership summary.
  • Group and Team icons/pills use the primary-element (blue) and warning (amber) tones respectively — the previous success-green was too low-contrast.

Fixed

  • Integrity check in Admin Settings → Maintenance no longer flags teams as mismatched just because they have a group or sub-team as a member. It now flags only teams whose circles_membership cache is genuinely empty while direct members exist.
  • getTeamMembers no longer fails on the u.last_login column (which does not exist on oc_users); last-login sorting now reads from oc_user_preferences / oc_preferences.
  • browseAllTeams correctly detects membership via groups or sub-teams in addition to direct rows.

Security

  • getTeamMembers now enforces requireMemberLevel — previously any authenticated user could enumerate any team's member list by guessing a circle ID.
  • lastLogin timestamps (used internally for sort order) are stripped from the members response so they are never exposed to the client.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturea3Sq1npOxTnT7aLDRXv66RWwUdOWvy5yXVlPPHePce9JRxddfqvN4FS4p+bnjFEdkKQmlFNDNzZ97aJmEZb1Kfzb+xpX6WzgDfJe1gTYUhE3XYHBchxclwCzPC/fwdymmrjwwP9b/1q9fH26FRdFciFUmHQO9Z24g696GnkGwApfohzX2U0jd4v55cx1e+vs86SZRWY26tkUm/FXD5+d+bl4FAkDhiK+Z06hFOuuocBhqyt2obf/gohkgTnEZpaHzkaAdgJFvvvRo+azlxGzODk4mqtyZIEDUWbAXQ99vRXZAokuwRrizBbXqbVk5sn3ntgG5rq0NWoYJ3htqhdhqqMh7w6SW/XBD5cGvLZu7BZpfvFLThabB7aZktNZhmVWz3U81C+WjYVhlcKcXPxEeQXXwo+LjSpGNmjkBg2bOsNEnVcYx3LhWsmbqRNf6JH8B0kcERqJcBWRbpthg/ytseDLsFHDX76QmHMb7/r6IKwq3EjaJSpLcuMgYAE0/ad8BtR54j/rWN1AsPD3oj3UfElHO5A27R/Xdu5qwzTd9zpWDRDgp3NE+2a6ler1WpgJtuTXEv+TGCURUK9srKLcpB+QGO/J26pFhqQovLEP72uL3kW8zXDlNW51++6uJJsrE1212s6JzPLSV1jntOrB+exnyQMV9sbNEVVzwyaqonA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.12.0
Release Details
UpdatedApril 23, 2026, 6:50 a.m.
Changelog

Added

  • Shared Files widget — new dashboard widget showing files and folders that team members have shared directly with the team circle (e.g. from Nextcloud Notes or Files). Displays item name, type icon (including a dedicated note icon for .md files), sharer display name with avatar, and share date. Paginated at 10 items per page, sorted newest first.
  • New GET /api/v1/teams/{teamId}/files/shared endpoint — returns paginated list of files/folders shared with the team circle, excluding the team folder itself. Accepts page and limit query parameters.
  • New shared_files app toggle in the Team Apps section of Manage Team — defaults to off; team owners enable it explicitly. Independent of the Files (team folder) toggle.

Fixed

  • Fixed team folder query in ResourceService incorrectly picking up individual file shares (e.g. Notes shares) as the team folder when no folder was configured — query now filters on item_type = 'folder'.
  • Fixed shared_files toggle defaulting to on in Manage Team UI for teams that had no saved state yet — default is now off.

Added

  • Upcoming Tasks widget now shows personal tasks alongside Deck tasks. When the NC Tasks app is installed and the team has a calendar, VTODO tasks from the team calendar are fetched server-side (Sabre/VObject, direct DB query on calendarobjects) and merged with Deck cards into a single sorted list. Each task row shows a source pill — blue "Deck" or teal "Personal task" — so users can distinguish at a glance. The two task types also use different badge icons.
  • New GET /api/v1/teams/{teamId}/tasks endpoint — returns upcoming (≤14 days, non-completed) VTODO tasks from the team calendar.
  • New POST /api/v1/teams/{teamId}/tasks endpoint — creates a VTODO in the team calendar via CalDavBackend (QB fallback if unavailable).
  • New Create personal task action in the Upcoming Tasks widget header, which opens a modal (title, optional description, optional due date/time). Shown only when Tasks app is installed and team has a calendar.
  • The existing Add task action renamed to Create Deck task to distinguish it from personal tasks. Shown only when team has a Deck board.
  • resources payload from GET /teams/{teamId}/resources now includes a tasks: bool flag indicating whether the NC Tasks app is installed.
  • New AddPersonalTaskModal.vue component.
  • New lib/Service/TaskService.php service.
  • New migration Version000310001 — ensures teamhub_integ_registry exists and drops the legacy teamhub_integration_registry table if it survived an NC uninstall. Fixes a scenario where NC's "delete all data" uninstall keeps migration history, causing the new-name table to never be created on reinstall.

Fixed

  • Fixed oc_teamhub_integ_registry does not exist error on installs where NC's uninstall-with-delete-data flow preserved migration history, causing migration 000209000 to be skipped on reinstall while the old teamhub_integration_registry table survived.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureSgfXebprj3dl8qsJCiO/pE+phwLvcTd5NcSGL2buF71GuT7a/fqkQWJ0XTwULl70Dw7D4/wJbMX9+fLnwXK/VvfRS1S1UNa8VUtCiuUJU4f4hjrnxYWuBT6oledtiXpb8fVeB46bTzwVJXTc57HHMm4Fz6L/rjutbeu07fLe5dNIAVXUL8niOfGyeMhBLijQDAsvlcOgBvpFXSqHscgF7IwOYTJdRqoyvAJQZgoxdlffHLnL5isK+GnjJCQXt6WzIxhiHbkMQlr+SwjPdvqo5UcvRCAHoiMS6sVQFmt1TJAHzygxHBK2g58Gv4NRvm/HszdMxCbkJVpgZFeqTO/WOrNTQaIiWIHGlK2XWoVVZetF0vvSlOynOXQqS9SVHmvOhfdH594EN1kwALAckCSdIvaeIdJpA3AgeS5er9GPMQI6lRWX6gP9H6WLAFGSFLjY6HpJvcr8mXBUGLzZWjnqd2w/WzDyGf/SfwMvf7NrgrmkEbkxEkRXYtUxkjJhlIX/g6vQicisTwHViMbO1orUbP6DvXcoXWGcu9iwlnumGSrMFbBwDsP/163U7kO52RjXg4tRxpZ2G0UOzKKx5Nc7TUA87bkxLO3SjC5yL536poI+22uNYSoWsxQpk9KGsVi0xiaLLms53Kp4KnXU7LPMQ+ZAlpb3U63sBLVkRHQhstg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.11.0
Release Details
UpdatedApril 22, 2026, 9:04 a.m.
Changelog

Added

  • Upcoming Tasks widget now shows personal tasks alongside Deck tasks. When the NC Tasks app is installed and the team has a calendar, VTODO tasks from the team calendar are fetched server-side (Sabre/VObject, direct DB query on calendarobjects) and merged with Deck cards into a single sorted list. Each task row shows a source pill — blue "Deck" or teal "Personal task" — so users can distinguish at a glance. The two task types also use different badge icons.
  • New GET /api/v1/teams/{teamId}/tasks endpoint — returns upcoming (≤14 days, non-completed) VTODO tasks from the team calendar.
  • New POST /api/v1/teams/{teamId}/tasks endpoint — creates a VTODO in the team calendar via CalDavBackend (QB fallback if unavailable).
  • New Create personal task action in the Upcoming Tasks widget header, which opens a modal (title, optional description, optional due date/time). Shown only when Tasks app is installed and team has a calendar.
  • The existing Add task action renamed to Create Deck task to distinguish it from personal tasks. Shown only when team has a Deck board.
  • resources payload from GET /teams/{teamId}/resources now includes a tasks: bool flag indicating whether the NC Tasks app is installed.
  • New AddPersonalTaskModal.vue component.
  • New lib/Service/TaskService.php service.
  • New migration Version000310001 — ensures teamhub_integ_registry exists and drops the legacy teamhub_integration_registry table if it survived an NC uninstall. Fixes a scenario where NC's "delete all data" uninstall keeps migration history, causing the new-name table to never be created on reinstall.

Fixed

  • Fixed oc_teamhub_integ_registry does not exist error on installs where NC's uninstall-with-delete-data flow preserved migration history, causing migration 000209000 to be skipped on reinstall while the old teamhub_integration_registry table survived.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureP+5/blvdXpd4uoReE5CvW4k1/WbnStC9vXXjXI3Tvi8B47QV8Dej4K2Wi+1wXxFQ8zQw/i+nuz4/ZzQSwSPnjzzpbQaNRo12s/x+9pb+MsBprGSUENMK3s8vwutV5QoiD5QLM/rxq7+ysdw47AwQbM+4+VGK/a2tAhuO2H7Q3x8nqRmJCSIZewc9D6ihBpQ5Sue3ywJIKFv8X73guc8LPSxhY+YnmW3Mc2bBdsxbUamsF9EZfkSVA9zebC455uSwufPZKLaWlBltydLWyZrhFZOU8aC4QeirMYCXovzThRQNk8hwkdppc4Gb737JqrVrC4uL/AMIPrTsJ4PcAuLDsmM0E/ZHbmpPBZ8wWDfMZKS3tHZM5K/2My3Sv7W3NhkQIzMuh2yNDAcw5r2B20mu34nSvATXTm3qacGBRmbLq9dfdMkEWMenTHtBzjWlVm0s0A03+gv68lasrzv7moyzlrjk1V6i3UuEo5XAGZCJSITQb0+RJAaIHmGqOBCu0UggevHuOqOMUwFl9aa4MbGa3BwxamSt5rfii22L0bWVHtFeiCaWZGfrhTJNM1WhRd134ha+puHWKpMWv8cxTxWA6FyycE4i+H+KR6yyvLpL3viVGPm+24BzSk3GPHdfEetvu2/H7WX1vnTR8NBzKt8dHxAj0YSegXYFaPF+0EO0fEo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.10.1
Release Details
UpdatedApril 21, 2026, 1:22 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureSxVjtNOVjWRSbm2YIc1M9cvaHIgVbVJbMJcD6FMStLGHteX8VzmSeEq+gpTZTER2VsyukDvVKRWOW3TXPTyzWF3UuC8mZSpEaK4bGHi83B3natM149njVrYyxy0BawErj4YH3VlvPzl4ok8z5hwAFWKGyFNJ2CulO2lsUfwDnhhLsvRAIjZzX+KZ2C99byqV3qFRnWo3kI+JT5PpE5+ug8T3KImQYKwGuMDq6+zFF2Qi+edECt+5TiO/rr3MFCZvSwwlwaNOEnCUjpA5wcwreGKqP2IpDJi+TwzjcJ5Mlmh6/qNjdTTkZ1tRvH5zKrZRHxAqSH0T40TMQM/N3huouEQE+fqHfJXgJXy3t99UrpWUfY9SX/rLWPQCkzgco353IBY1YTacz/cCH2yVlrTMty+EmU4iTOo2876PutuV43kDSytBtGzinCY78vrZ6D99fl/UkU5fsdVFVh91FZiPyd/JnCgTl59rm32K6rEhUmaMeXvKjl8CTuWKc6Z0TZ6qS/GPjeAVxHlpzRMIkhbjMOGnlWAKAlabDRIxZf+SSNazjnI8SFkOUOo5yCIoxMF9GjboNA81NkIg6PYdEaiooPTXiGbOd7cmuh4FNPWiniG06hn+BXX9jpO3zJNTKbmxP4g4dyWMm2923/miX93CtmyhsYWn2OcjX+YLLf78TgQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.9.2
Release Details
UpdatedApril 21, 2026, 11:15 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureVqSPboP020ssz+waXZIgJ+LTvo3hMESzHvMEKUi5BrRSPiplINi3X1Etr3zo/IQIgyv7BvaMYyjNs33q4jz8Y5oaawenqkCDw6XrV8F34rYPZbW0AabIGOAw1Ghy7Qg3mlbkq+GydCzfAMiEHro9sfi1C6kffOdijPwNm3EWPGurR7ERfDa19qeEfqoEU3Ni+//+AnwrL+rP+jf9pYM+q+/49CxT1zs53TqMTZyihHnVNbxOLCR7sgJtTVHR9NBR2HjEhFt73nxFBFn3b3j6OwoIgUX2l2lQR254lB/mgs4uD510an48qHLsYbE72Ph+LM+x8g7NtsLKbzyM24dA2+mL8PiwJhZUCfTFpbPVuiSX6OESUBbml7pgqFFv0dA8FD4gtqxKErPvD7CMaXR4mGrkit8bkkfReObVjBQZyCVl1S9q9Sj1ckfJpUlR5jmBfY39QzY3Bv/+V0cvqxxC+P25xmbvh6VHbnBMcJ9uxs4XW1lhjqvvJFTHS3nJJeQX/tm/q9k2qjnvLEe8nliMc7k0NtZxXdJI4pBPawvBaM5T91AKvzpKWrzmzIxTOWYT0HmgSm6cPPT/EBZl/YaXTO4a5xSNmCljGn0uo7bDiWtwcFNUuzCXG7FirlkyxiOkNv6DaZMXczzv89o0vMubHotd/OzddrXphSIrvkfA+Xg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.9.1
Release Details
UpdatedApril 21, 2026, 9:46 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturemX7RsaWak2BPhu44QNActtv1oaoiKlo5vmrzmf+iPPoJPMw0cAXoq2UcPpHnsrPme+mCOiDv+yETlWFSPdesr9U3ffdI56rxQMRqkgAv5QErwwE/jqqyte15iT2wHFrEF6aCn8NnF9bIElrCfmdL8kPwEKbgcrUBom/cQRFlWbqnmd6QRzqY+bevPIx6fXaA4ZTQbuGaR1PikE2Tskm0ETCtHf05Axg6eJ+fjgHAdR/bgsl2/2+giwe3fmoyPaC0GVsuoTmGjduMSPaUINC1hA7NPKM2aHBLvXYcGqNzKF6Wtr+la8VqOq4akwYoSlGvWOQ5uw3gTCubRhDRmMrxb6t1QABD7CseBzMKjTv/Z+ib62hrEj5IoP/qRdiovYZVJQ+VQHw8pqBJqS+a014t5m1+h3nPpZTT1heoyR0qA44AXmGhqcCVCGcMuVAtw7trENCY17FbHradrLmEofCLxoGuCAuviFXQo+03kxTL3dc4pgUm6G1+/RoX5hM3jtYmi5tBmFmXLBT8qsr1ZEStRin8aLwKBr92oeejMhLvyPN4wryntUpq8FL3n+SERCsovIvuwmMw/MOuBrL16xEL0FRa/EKlqN5F5z9gtR+ckjap8/SLQDYu7jbZUD3CGjKJbsaCeKv/Lbsw/tDqe/ZXeg7cZaq2tlPTN3g2kFah/Ek=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.9.0
Release Details
UpdatedApril 21, 2026, 8:24 a.m.
Changelog

Fixed

  • Fixed fresh-install failure: teamhub_team_apps.enabled was declared BOOLEAN NOT NULL which Doctrine rejects when storing false on MySQL/MariaDB; changed to SMALLINT NOT NULL DEFAULT 1.
  • Fixed same BOOLEAN/NOT NULL issue on teamhub_integration_registry.is_builtin; changed to SMALLINT NOT NULL DEFAULT 0.
  • Added migration Version000300801 to apply both column type fixes to existing installations.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureVWWGR5wGqe3Eax5KKz+AQ9nvFxwwNzPj4Zsqen4x72T9rHc242F+i+eaIMt/ae1/SelQGyv18ckoH5xA+eZEF+PzJj5vmcq2Zwx+PwlLTD+ieyRfaFcVc0kkYXTqMKa6/laXrNrwHuBHRsG+5wyJLkXm78H2OG0HMCIm71b7x06pIxU/eN2i6pEcTaTajyUbxPd37FsGv591XzyRKZGK+Z1DZXdMI81aE1g68xGeQLpnkKLPjURMzw3NnqZkcJiiU+fhDggu4O32obgcc2MOgrOo+ciHNX+RKFxkdYLs/qZzbS/RDdjxvnE9U5eESH7hAXU/ww8k/vSdtxEU6vrSd94Mg3GDHhjjS9jj/tLJYCk0J3MQp6EJMVRIInhgNIJJf1VkoCJk2MkTdpgF/GWheW9SBVFD6+IbzR55Ss2OYQK42gXtuNItWBm9ZCvShB5bxnmL4JtZ5I9ZfmmxD6BuZFwAkvnDIe6bt7wnVt8rZ0F0X5f7PrEzFoNq5TnagELFx0Z7HM/8OxRXwOLJtblMZeEI+tFRKxlgSOcI4EBroGwsGQ6sHELNWbqD0XvQBxmjVGjAEXfjx5yp+xwmc5433StzDcu6ItEt8wJQYKQ91quGR1MjEKwwVqmzjtNX77lt2aSKzvy4ibb8g1Xa3uHCUd9PmtdzN9FiBK2G6Gj4flA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.8.0
Release Details
UpdatedApril 20, 2026, 7:08 p.m.
Changelog

Added

  • Telemetry payload expanded with six new anonymous metrics: nc_version, user_count, member_total, message_count, builtin_integrations (per-builtin-app team counts), and link_domains (custom-link hostname frequency map).
  • link_domains aggregates custom web-link URLs down to their bare lowercase hostname before sending — no paths, query strings, ports, fragments, localhost entries, or numeric IPs leave the instance.

Changed

  • GET /api/v1/admin/telemetry preview object now includes all new fields; admin UI automatically renders them via the existing JSON preview.
  • TelemetryService now depends on IUserManager for user counting.

Security

  • All new collection paths are read-only DB queries using QueryBuilder with named parameters — no new user-input surface.
  • No new endpoints; existing telemetry endpoint remains #[AuthorizedAdminSetting]-guarded.
<hr />

TeamHub v3.5 — Changes

Admin Maintenance tab — full teams grid

Replaced the old "Orphaned teams" section with a full teams management grid covering every user-created team on the NC instance. What it does: Paginated table with search by name, "orphans only" toggle, and per-page selector (10/20/50/100). Each row shows team name, description, member count, owner (display name + uid), and creation date. Two icon-only action buttons per row: set owner and delete.

<hr />

Set owner

Admin can assign any NC user as owner of any team — whether or not that user is currently a member.

Delete team (admin)

Admin can delete any team regardless of ownership. Cleans up all associated data before destroying the circle.

TeamHub v3.6 — Changes

Activity widget

Deck activity now scoped to the team's board only — card events (deck_card) and board events (deck_board) handled separately Talk activity scoped to the team's room via numeric room ID — eliminates cross-team bleed Calendar/DAV activity subject strings corrected to match real oc_activity values Friendly human-readable labels for all Deck, Calendar, and Circles activity subjects

Manage Team — Maintenance tab

"Danger Zone" tab renamed to "Maintenance" Transfer ownership added — team owner can promote any current team member to owner Ownership transfer requires two-step confirmation and demotes the current owner to admin Leave team now shows the real server error message (e.g. "Transfer ownership before leaving")

Admin Settings — Membership cache integrity

New section in the Maintenance tab: scan all teams for stale membership cache Compares circles_member (source of truth) against circles_membership (share picker cache) Per-team Repair button rebuilds the cache — fixes teams invisible to Files, Calendar and Deck share pickers

Files

Re-enabling the Files app for a team now works correctly Favourite Files and Recently Modified widgets no longer appear on teams without a connected Files resource

Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturegblBv20FJFNq/Q3H9jPQvNSRrs/neT76/CRFwCF6dL2UmGY2TAsKmh06rLTNssVtnttoSuD1vlgANctX1gukwUMRAAXpjp6tHRg8u0II0g9C6sdwaLRstUJGExDUxRr5sbbgVwvRDY2GducpZRWSAyNlTSanLLJl9Eb6YAviLXr5AUAmczvdNRCa40GrHhytUe2O+oMfPtQJliOtotxL47VWvOynucGMWlj6j5ZghCx6gkTazlmWTFQQ/5VOe3EqPZyel9YSGJ4TtXwLOgQHMrBo087M34nxklShndZR12uYeZJ72n81ycvpByC10YfhDwaife+W+TeZBVtTrvo4wmqD8wqbkFsrNdp8DvMSvlVBKtibdZleX89LUG5RTsFQelFaOQjz+4A0h/xp2AhsTUtRef3vRCZCcmARieLz+g2ZaYn5EWnYDCkIPjLe/Kl9KCamL24QaSFyjBfVKcYX6DbTRCUG5xBrsEuEDWnZ9HHTUWZJO5UiqVsfvvHIzWuZ9j2vmRbsPBbKs0dRkaqO/04pDqdZaL5GLqHWjkv4wz+wiOnnMDnNKOtpubvW2HHmRSf8/TGQdzmdvr5ha+tjbOYqCKj+YMYI1jR2PWfIzxWSqzUbUrPDN6r7uEm4/r+f9ydI706wPr/f6BQlPDjq8DOIBTUC3Pc9Xdyjx2xOEio=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.7.2
Release Details
UpdatedApril 20, 2026, 5:58 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureRbq64iwUhPtTjRur8beQ5RgKG0BP0V5/7JaxZYTvBH/PFPcDmjy7EILWhL6IHsowijr6XTZWQlFbL4YZKdPQyW0PJxIm65ECq7IbqNLYK24hL8O/N1HweSZhVd5Dls+3pj9uvvR7ysrfxEt/cYDtHMxn0Ts7HcEdPFX3ONUpithodHeI9dfmNZgz6Fxk9cn+l/Pczp+JuqFa2L2h6YBJzQszsjGlVd1PlUE031Dj/6kYqRC8mQy3qpje7Xm3l6AHU2JrqAD4f4/dsSst7Cojx1sB43sy5yHnO5dSYMoYOVrxKciNrbwk7jW3CoX6XJWhBwJzLN8QKBoLOlrYpEyjYJXj+SeOim39vOvq8dsL2DpeOAhoxUNAuKQC+A0Gv4XhdeSX1FYZXmC20tgXXDln//qXChvYbE6usUmFz0iH0jP2yxqKbj48TZDID7wOyGGX0WHzHmD+zMY/alrx2+jZBqm7+BaFHT9UvDrmY6uIDAWtdbMJO3EhK2Sdn+k5DqenejwYO0yF+o5mU+itgx2pmyNWTF9/B8FcoeZIJExjZBv9/AnW0nP0WgkwqR8JmpaaFObbBWhYLXpIskLmXAfkqvfnYA7yli2bf48LR6yCkARYV2T85lkndOgH6oH51quzNvF2J7o/QcSzC83r2QIln7n4BW/X9hR/yweUkZLDU5Q=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.7.1
Release Details
UpdatedApril 20, 2026, 5:20 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureoWjRFEQ/K3TmpTN0v0cyubM8gFWkzxa8wTKg+A4SGZYjJD4rQHOYb5JacVYVkzMAWM20Gso1z5774wa06Tlh4sShGxSvN76lBZIFQSgOwt2sCXOAnc+Ng+aCCQIxvZOqxSbD7qU1u4A6eDsOOAf3TNXof7N2w1WpzgaD38u0O3qP4F/qNYIbtOelWQ4bHwjrEo1Vx/ubytlASypuqY4rvX6vK0G+vqIsJ2fo13Vyl+s+G0kOhHvtbUgw0VCuk1tlqYU5ORW2XLxsLmGwOWL/cqBRKGmvp2+GJhCd0edluHSxdBTM//Eis/WwfMImT/X5IZ8zuysnXmsX4AeXb8S2wszrIJH+mPkDbWICAr+Et06lJP++vxM0VhWirUYIzkXjL6U6qtA7Z/SC1U3iWhUQwIuAfxRjxcWkyKtIcjUpCgPZX9lLVJGWDP6MtGoKaSJ1nIzyOOLnRdTIqoiDdd9ObMxEC5QpfY1m9wGCyZMahwYO/jkmPWRO9aJSJhmP4+TEIyGabGiKuRSpv/3BDSa6MdD5GPTxu9ST5j04fzXHq/XFPMT/oq1jZMiLou+Y/vdEN3azm2BK16+F5LGCN5+sY5oxDNk5TSftF0TGfrPklgjFPqcK2QVGISZatkwwFfILCVJ9ckpju9jkwMXAnejZmffq0ott5qbn0T8g++E9TAw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0

Nextcloud 33

TeamHub 3.74.8
Release Details
UpdatedJune 10, 2026, 5:33 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturedosUcnSDCPnIfdPQMImE1tA/3u7HScBdONLc0dqM6SNLRs/fmatvKrLyLBqyt9o8M+0L9htxkd9BLZlRyoorzSEBtM5Q2mt4e9VvTMUU3Qk/nWZPFu1UOJCMTWcGujPwGuBuO89cEpgmqU766ApX2df4fDrajuWVmKw1TNcmst7jBz0zWt/zvzruGkCZQp4xBmAoGd/WEXjk655ccLMhTJDvQiqKtDXMbuSTvewKm6uk5jUWQqIyBKj4B2jIlFv9YvnM5h4Vdwy77uO/xLHQ1VLWTR33T6EtlMJDuX9tFz8pu9hSEHy1Ntr6lkrOLQReyogrGQeBy3LP/pT67JaJ40hqvXAaBGVRntjzDISTN9uZ/hn0pBMDQr+v7Q73KuHWAXC+dNUpEpi0rD+6sX/GyHLdysgGtnds6dY7Fi77qp73GyRkDam2yQuzh1VU4iyJwJqdbpVqVtTcn+GP5dar9P3PuK5mnYhpcp3sdEEefNKWLXSNa7MOotGK33pT/DM8fJfFc0eTxq+/fWJBGCoUeaW5cFERyk26lWjb3sz5v3rsBqnB4ZYMitGMX/GG8Q4qabRsGDBd1y+FYwYEBvBSTxwG4MUViepZ3dprIPYqwOrMEdOpBVx+Eu2YQ29anjQYIStCc/TN45siD1FQPnUt7MDzWu33Cs234hWB1J8z0xo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.74.0
Release Details
UpdatedJune 9, 2026, 6:06 p.m.
Changelog

Added

  • Link Decision (Session C) — bidirectional decision ↔ decision linking with full UI in the detail panel.
  • New table teamhub_dec_links (17 chars ✓): one row per link with canonical ordering (decision_id_a < decision_id_b), unique index on the pair, indexes on team + both sides.
  • DecisionLink entity, DecisionLinkMapper (with findByDecisionId OR-query covering both sides), DecisionLinkService enforcing membership for read and decisions_action_min_level for create/delete.
  • 3 new endpoints: GET/POST/DELETE /api/v1/teams/{teamId}/decisions/{decisionId}/links[/{linkId}].
  • Detail-panel UI: linked-decisions section with peer title + level pill + status pill, click-to-jump navigation, gated "Link decision" button, search-as-you-type decision picker modal (reuses /decisions?q= endpoint with 250ms debounce, excludes self + already-linked peers).
  • Migration Version000373010Date20260609080000.
  • Audit events for task + decision link/unlink — 4 new transitions in DecisionAuditService::TRANSITIONS: task_linked, task_unlinked, decision_linked, decision_unlinked. Decision link/unlink events written to both decisions' audit trails.
  • Shared widget design tokens (src/styles/widget-tokens.css) — single source of truth loaded once from main.js. Defines hard-contrast brand palette (--th-color-{success,warning,error,neutral} + soft variants), typography scale (title 14/600, row primary 14/500, row meta 12/400, pill 10/700), spacing tokens (row padding 10px 14px, gap 12px), and shared utility classes: .th-widget__panel, .th-widget__title, .th-widget__rows, .th-widget__row (+ --clickable), .th-widget__row-icon, .th-widget__row-title, .th-widget__row-meta, .th-widget__state (+ --empty, --error), .th-widget__spinner, .th-widget__pill (+ --primary/--success/--warning/--error/--neutral, plus --outline variant).
  • peer_level field in decision-link list/create responses.

Changed

  • All 13 widgets refactored to consume the shared tokens — DecisionsWidget, DecisionsList, ActivityWidget, CalendarWidget, DeckWidget, FilesWidget, FilesFavoritesWidget, FilesRecentWidget, FilesSharedWidget, IntegrationWidget, IntravoxWidget, MembersWidget, MemberRow, MemberPresenceRow, ExternalWidgetItem. Loading/empty/error states unified to compact .th-widget__state rows with shared spinner. Hardcoded font-sizes replaced with tokens (kept only for genuinely widget-specific elements: calendar date badge, tab counter, action button). Soft NC colour vars (--color-success, --color-warning, --color-error and their text variants) replaced with hard-contrast --th-color-* tokens app-wide.
  • DecisionsList row simplified — impact and level pills removed from the meta line, category now rendered as plain text with small uppercase CATEGORY label prefix. Primary line uses size-driven hierarchy (14px medium) instead of bold.
  • Activity subject uses regular weight (400) — sentences read better unbolded; the rest of the app keeps medium weight on primary lines.
  • Detail-panel "Linked tasks", "Linked decisions", and "Source files" unified under one .th-dv__link-* row pattern — same border, hover, focus ring, spacing across all three. Solid-filled pills (no transparency / soft tints).
  • --th-color-warning darkened to #a05a00 for WCAG-AA 4.5:1 contrast against white pill text (was #c97a00, 3.34:1).
  • Removed dead deny-modal CSS (~70 lines) from DecisionsWidget — replaced by DecisionApprovalModal in Session B.
  • Link task button now uses LinkVariantIcon (matching Link decision) instead of PlusIcon.

Fixed

  • Focus indicators on .th-dv__link-row, .th-dv__link-remove, .th-dv__dec-picker-item-btn, and .th-widget__row--clickable — removed redundant outline: none that was followed by a re-set rule, then ensured each :focus-visible has a 2px primary-coloured outline visible (WCAG SC 2.4.7).
  • aria-live="polite" added to the linked-decisions list and decision-picker results so screen reader users hear async updates.

Security

  • New decision-link endpoints follow the membership + min-level pattern. listDecisionLinks requires team membership; createDecisionLink and deleteDecisionLink require decisions_action_min_level. Peer decisions must belong to the same team — cross-team linking rejected at the service boundary. All queries use OCP\DB\QueryBuilder with explicit PARAM_INT/PARAM_STR typing.
<hr />
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureTDim0CLEZfsAydY1VLm0k8FcVC0iVzhCWfdJr6K02pkRm5ZP4awSnXWlH/lg/9nIp/4eLtuBjhDSneW1uKN4sbnR0fGdlN+2aNcQOfjQMdBKt0sJ3KkzKx9krSwvQSV8+yL+wbIzwuHrLJ37jH2i6HdbAky3zemiCvahz1PS7XowNPXNOmEcv8VpbB6kGGaHBe2iobimS3FN55McetBQHvMQ9/7saeMf9tME0EHiW/gnNXwmJIAJLgpV2sFsijEsyHZCO49K2xBigfPBIZvN34FV98+fpO1f4mQDix6DyEEd+Q7qBhJcYAsmpIIUes3ll57yRVmrmcKazVH00zQTYNKChYLZ+2CARaUlWCf1EAwt5T1nibGNcenIiktIU9nmDAsgO4AGbQsw113E8/b+lgLk/6MZwFsE/nM1PzNn2GieDil1o1A6L3KYve7UxjQQ7vUW6QSvNdJQ9AouVe8+LTHEVnXGrmYAYH90K4ynbcQ/r9aIhzIOkHJrK/0hS5h0Ijh7+mv4CVkj6KAp6/5ShzmVWHXBbRiuIgzgkiuiT+oxGhQtvr7TAR0QhUIbEZKEAxI7esz+bMD4ilB66GpmntY+KzBXE8SBsvT2jXuhmv+1Hksxlz3Sz0hXY7lW5lJ4f3pOD+5nkP6uImk32DMm5QdJ9VW8+i7sBVqoVWyn4rc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.61.6
Release Details
UpdatedJune 1, 2026, 11:39 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatureq/68hJ4BHrU8556eubLlZeiw/qWj2F2wxFPx/ZUcryv70SSP+WtNyC1CLD6x7oNfzElWjF08FYQDxD7FuoRzFL6T1a0HzUVJQlL+XPlhW7zYIpS80INga7HQE2ddvmtsv1yw6YnvMER0UnSFtZYdtQwqTwD2kMkTBW0QdC/oqudRXRJpt65PG73yWQlQWU5snqzTvj+y8neHskKJu2kPnNOynBGhDPESlLzcD1lPz+sYnfA8ADONMsNDLEdzCGf5mK6qHlGX2tBu2HX7P+Y6j3/AhzFJWEdqtyR7YUztpwb1L/pdaX2aftzMjtpqeD5KCJ61WcZo3ZQZUb2LGSg0XYKZ8jKfHNaX3nmYcBuON2LR0H41RaqQ+Xo+2W7tO/sI2La/j9P2WG2QcgoEvB/lEQziNGdNrm772itYmOLb9WrN6Tr9t8EOp/SW1q8Jy1x3S5o0UZdu11gVabdUEm+du3IWs3Psud77lodkbcRsxu/9n6h8H417rA8kS+FCsSrXgI9wNjAGM8+WrtQ6SbI4+VGthMHWlUQaQhXzDMU4GE5+Fpt1B/3OjAbIXBbI937tnQwqmy09+/1xvGKJYqgMTWSOp0xl0pM2PeQia9DOmZY9DByJUBmwpV/4HKVgTp31yzc0GZXJCmDTodiVOds47VP2cqNo1uw/8CI/h9nXys4=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.61.0
Release Details
UpdatedMay 31, 2026, 1:32 p.m.
Changelog

Added

  • Message image cache. When a user inserts an image from their personal files, the new POST /api/v1/teams/{teamId}/messages/cache-image endpoint copies the file into .teamhub-cache/ inside the team folder. The cached copy is accessible to all team members via /core/preview (team folder is circle-shared). Survives if the posting user leaves the team.
  • Clear image cache. New DELETE /api/v1/teams/{teamId}/messages/image-cache endpoint (admin level). Exposed as a button in Manage Team → Messages tab with a count of files removed.
  • Attendees in AddEventModal. Team members can now be selected as attendees directly from the add-event modal. Server sends iTIP invitations identically to the meeting wizard. Self is excluded from the picker.
  • RoomVox room picker in AddEventModal. When RoomVox is installed and configured, the location field becomes a room picker; free-text fallback when no rooms are available.
  • Category field in AddEventModal. Comma-separated category tags, passed through to the calendar event.
  • Talk meeting toggle in AddEventModal.

Changed

  • AddEventModal consolidates ScheduleMeetingModal. Both modals used the same backend endpoint with minor field differences. Single modal now covers all simple event creation. ScheduleMeetingModal.vue is unused and can be removed.
  • @schedule-meeting event in TeamView now routes to showAddEvent (same consolidated modal).
  • Schedule Meeting action removed from the upcoming events calendar widget (desktop and tablet layouts).

Fixed

  • Images inserted from personal files were invisible to other team members. /core/preview?fileId=... enforces per-user ACL — other members got 404. Fixed by caching the file in the circle-shared team folder and using that copy's fileId.
  • Uploaded/attached images were invisible to other team members. Circle share was created correctly but the URL still used /core/preview. Fixed by using /apps/files_sharing/publicpreview?token=... (share-token-based, no per-user ACL check).
  • Pluralisation of "files removed" in cache clear confirmation now uses n() instead of a conditional string.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureBkg/1BS30q2A2ps/z2INdqmvkj94OGrfFXhTAEVFLP8V0w/yRX6Tfn7R73IlDfQBA+EN2I3Umj6Ctf0pTz1ZH3vZ5t7hlmQhmTfI/fZnXOesCax3pxx41doSGoWsI5ln5yk1GVq/gM8Py3KRpgG8Nq7i/ikk8w+ZXp7ollK8ZEBGoHtAZy6EISJZW27O3faprqbkwuqlX757DXgHHaAb7M9ZIT1c0xBdOZm1pCRNsqaMwLMe60RQQyLZxXVVq0J5oJk1JPHpgWzixtZodL4qzIlIpvbrPrIB5Bvo7buGi9yrBdVNuQzGFO08OWDlt2MpMbkWqbpIbFzT0lrdKYnSTBrXbyk60V+gyOl17J5774p28Gk5VLfsyzkEdHBwmbbUgWQUvbF+1XPxOqfFZ2Gmgj9RT7kZdnEkVOfxFQ5rtGdqBN+GjzH33cpxxy3TvaLjgcyzttzrn8KDoqFz5KGjo7BgfUnTMiX6c91B/T50JBNBA4tj7fj1l5HCbTf7ZuX80/W0qnMVhKfbnTwlVgYoq9GUkCnoz7eD/ufFHE12naxXmPCdkFgGbdP6GS3Ck8ddLMNhXLqcntF9WPc0SlUTxc/WE5A6wU52GyQ0euCatOx4ElETAeeJ4SD8qj81v6aB9rScThH82bed1fqlKeoYcaMybCx6kCMDtINkCo0+HeU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.57.2
Release Details
UpdatedMay 27, 2026, 6:50 a.m.
Changelog

Fixed

  • Admin settings: clicked tab no longer shows white-on-white. The active tab matched both the active-state override and the inactive-focus rule at equal CSS specificity; being later in source order, the inactive rule's white background won while the active rule's !important white text stayed — rendering an empty white box until focus moved elsewhere. The inactive-focus rule now excludes the active tab via :not(.teamhub-admin-tab--active).
  • Admin settings → Maintenance: team "Created" date no longer shows "Invalid Date". Two methods named formatDate existed in AdminSettings.vue; the second (expecting a Unix timestamp) silently overrode the first (for datetime strings), so the teams table's datetime-string creation value was multiplied as a number → NaN → "Invalid Date". Split into formatDate (datetime string, hardened to also accept ISO and numeric input) and formatUnixDate (Unix timestamp, used by the archive table).
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatureb6JwIPc5nZN1w4UIYKU60aB0c6m7HJ7CrbeOrvNBTEFSdAJeQcBKJvHd/6NAwvfWfZU53U4hW+vVOa/IN8eyTvee5aBGarefDPfiW/8OAAy3vJ7Ue2K/CDCqFP+dygfS5wTay0RCQ75X8LuXUkXS1i26iVR0PJOc8UbuyrQOnXu/P8WFHpWhReZWd8na9CDV11oZ8fCLGRtEPWcO5QczZbRFDI1plXQ/46lJhhqEGL8m8A7aV3ikjqzzTeugLoP1/RVR/dlIiYlRDfUKJUYpMvjWmcC920No72Nq06JKq5PjfSB4OPSFA54bI6rfv02Ipk6UixvOyqkAJA4/sH3Jxm72NATlxssHH8TGw7xZ0Nsfbp4LGR3c5kJmEhZ+Hkq2zHKtlGSlzOy3z2yoepGZgoNgg+gUb0VetnkfbhGDplW76F2lRePIwg9H3nJhFOma3AGQS4QnKR+t4V4Ec8gqlbnoIHGSuEPZMWpTicuU0ofvh/PHfiu8Dxk1v7jHYVtNdvrVkZPSFfzrx/IJX+HoGDq91KYoMJNrd8jRfFYWswalQ0cLzdCCw6iYHAxIyTpvGikEWlx1drtmQ3GJarvFT+qkpYhL7A+jBmCj1aUGSanGpozEn6eRk4BweOyAkld9h3cmM3Fvi1BujCbTT7Wnnvj5IJzmTB8CAGseaH/akdw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.48.0
Release Details
UpdatedMay 22, 2026, 2:02 p.m.
Changelog

Fixed

  • Presence module admin tab still visible when module is disabledtabs() computed in AdminSettings.vue now conditionally includes the Presence module tab only when form.presenceModuleEnabled is true. When the toggle is turned off, the tab is removed immediately and the active tab switches to Integrations if needed.
  • Team Info warning strip height and chevron — replaced "Open settings →" text with a ChevronRightIcon icon (consistent with DeckWidget unassigned-card nudge). Updated CSS to use line-height: 1.3 and icon-only button layout so the strip height matches the DeckWidget row exactly.

Added

  • docs/USER_GUIDE.md — comprehensive user guide covering: team navigation, tab bar, presence tab (team view), My Presence personal settings (weekly template + date overrides + calendar integration), team admin actions (members, settings, presence toggles, links, danger tab), and FAQ.

Changed

  • README.md — updated to include Presence module, Members widget presence dots, and updated admin settings section.
  • INSTALL.md — rewritten as a full NC Admin guide: installation, all admin settings tabs (including Presence module on/off, status types, locations, holidays), optional integrations table, background jobs table.
  • src/components/AdminSettings.vuetabs() gates presence tab on presenceModuleEnabled; toggle redirects away from presence tab when disabled.
  • src/components/TeamWidgetGrid.vue — warning button uses ChevronRightIcon; CSS tightened to match DeckWidget strip height.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturec1kXc8h5EzClzIXkf31zt8pGVXg3BuummH2w9N8T6IWSrfHpsBZuGYBqJcy0zwn/JXKRB5RkebdfuaE6LLwVOcqUlz15beSyi6Y6Fr+rkRXqQti8lzHYyJ9vtTzn963I4fEstaa8q0b9126Ts+UMTUe3rrS+/4kJV21dCiAui6GiPsdKzGp47QuNw0k9YiqSZ24NCu+6QsnoyrHvoQTwnrPHHIcZ/w7bG1VbtO9mob5Cq9bB0tS/zbNzzi9Jph3AZ3MtzGjx/4mZ4KR77DSC55OqDs9vfK0KW7+e45JbRFrtpHUldjgpXL/6MIsR3IYbif+/uVDTqghjUJtOLaQ4FsApnKesfqTchH4NE0jebUnpeToqGBGVERKvs9XrJ7F7Qnu5IsCqUhJ4B2xQmGADGWJUBlPOfKB+lH2lCtPSkDJzehylwrWOJtOtg9X7SARV+G0q379DtVbC2aHnj2DpN8BivVsZ8hsCgLDxiCcubqHVP1s3nAx0q00qMEdIZwIGA3IU/LRSp73V6ZqaL5JXYBtjVNBNqResl7Gr0IaFfe1++B6mVFY6L0iHgsTKVtZgBCPnudVXBDx+Y1inUuIGVtcm2YvsL+ed1QdCXkLxdyHa+Mvdu4zotE32LYzKyz6bsci3Uz/9xwvMWyD48nPc0UGtABCOw8UG16di/2NtzwE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.41.0
Release Details
UpdatedMay 18, 2026, 2:31 p.m.
Changelog

Added

  • Unassigned card nudge in Upcoming Tasks widget. Each connected Deck board now shows an amber row at the top of the widget listing the count of cards that have no assignee and are not yet overdue (no due date counts as not overdue). Clicking the row opens that board in the embedded Deck iframe — same behaviour as clicking the Deck tab. With multiple boards each board gets its own row, sorted by count descending.
  • Team-as-member support. One team can now be added as a sub-member of another team. A per-team toggle ("Prevent this team from being a member of another team") appears in Manage Team → Settings, using the same CFG_ROOT (8192) bit that Nextcloud Contacts uses — the two UIs are now in sync. Admins must enable the "Teams" invite type in Admin Settings → Invite Types before the invite picker shows teams. Teams with the prevention toggle checked are excluded from invite search results. The admin integrity check flags only the contradictory state (team is nested but also has prevention active).
  • Deck board activity in team activity widget. Deck board and card events now appear in the team activity feed. Includes board name and card title extracted from Nextcloud's own subjectparams JSON, producing descriptions like "Justin created card 'Fix login bug' — Sprint board".

Fixed

  • Critical: Deck activity was completely missing. ActivityService was checking $resources['deck']['board_id'] but deck became an array of board objects in 3.28.0, so this check silently failed for all installs. No Deck activity appeared in the widget regardless of how many boards were connected.
  • Critical: updateTeamConfig() used wrong bit mask. TeamService::updateTeamConfig() still had $MANAGED_BITS = 1|2|4|16|512 (pre-3.39.1 wrong values) as a local variable, overriding the canonical constant. Every toggle other than "Anyone can join" (CFG_OPEN=16 was in both old and new masks by coincidence) was silently discarded on save. Now uses CirclesConfig::MANAGED_BITS.
  • Critical: ManageTeamView config constants were the old pre-3.39.1 wrong values. Identical to the 3.39.1 bit-encoding bug: ManageTeamView.vue had its own local const CFG_OPEN = 1 block instead of importing from circlesConfig.js. Enabling "Anyone can join" was writing CFG_SINGLE (1) again, hiding the team from Contacts. Fixed by replacing the local constants with a proper import.
  • searchUsers() circle search used iLike() which does not exist on NC's QueryBuilder. The exception was caught silently, returning zero results for the circle type every time.
  • Deck board picker always opened the first board. Moving selectedDeckBoard to Vuex introduced a Vue 2 data/computed shadowing bug — the local data() property with value null won the name collision against the mapState computed getter, so deckUrl always fell back to resources.deck[0]. Fixed by removing the dead data declaration.
  • Integrity check falsely flagged all team-as-member relationships. The check now only flags nesting as an issue when the sub-team has CFG_ROOT set (prevention active) but is nested anyway — a genuinely contradictory state. Valid nesting (CFG_ROOT not set) is silently skipped.
  • PHP parse error in MemberService (3.40.1–3.40.3). The str_replace tool double-escaped backslashes when embedding PHP namespace separators, producing \\OCP\\DB\\... instead of \OCP\DB\.... Caused 500 on every MemberService-dependent endpoint.

Changed

  • "Prevent teams from being a member of another team" toggle now uses CFG_ROOT (8192) — the same bit Nextcloud Contacts uses — instead of CFG_CIRCLE_INVITE (16384). The two UIs now write the same bit with the same meaning and stay in sync.
  • fetchDeckTasks card-ID lookup changed from one OR clause per card to a single IN (board_ids) query + one IN (card_ids) clause in the main activity query. Scales better with many boards and large boards.
  • Activity formatSubject for Deck events now includes board name and card title when available (e.g. "Justin created card 'Fix login bug' — Sprint board").
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturep6LBsh++TW1EqF+MTvnOs6DGrDmygcM7b8y6mw+FEkpajSxEmmL3+PIaRlrp5whx0V+Oyxe5murZYLWDpbtVLsD76tLPJ4jk+CVpiCHlSbn6kBbERKaXDpf1UkCIir0wHxdRJ1btIsry1Hyv/0JhDzfrLKevuqicTRDpOY7zJ3gMd1Pl/PQgwjYlmiK/VApSyDVeniqEQN1iTwQjjPTq+gTo9NEtE0holECcKUEtU/FRZRHOtcNQQwUxJqtvqX3hieTg3ttDUt0wV2VK8NarlnGuuoXWwaF5YyyS/5BaLL1kYO+YAKy7SFHhAV/LeEkP/oLbcRUbBVbNRyno2vmcJgK+mPLczW88EqKblVkLfdiuvZGRLqP5nP1XtrPUhTzzLUvnPdWIBxNPz+FrcJN59NC8MTzR/SUgtU7sCRe8YNAAHf9JF3P/V0uxbYuICZUpS7+h+kPkTP0cblORVUSeQT/F+bC3Ys7fs8xwBs6dpvH77ye0bGAfXmwwB5UwfH8CwfJPGWtNDyti46QqXevr+nYd0cyWttpeU6znMFemtiPv7cgLHG97gdgedCEX0Rfw1UwyxwVECCQULMzn54atIpjSscewqBAUtSZT6Q1gOcfRQHgWEn8oC75mRdjz8/KAQrYiQU5pujdAWv4AEP1RfTJ1Zna+Zyc9SXsAXLFdXIo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.40.0
Release Details
UpdatedMay 17, 2026, 7:32 p.m.
Changelog

Fixed

Circles config bit encoding (was 3.39.1)

  • Critical: Circles config bit encoding. Every TeamHub release prior to 3.39.1 wrote the wrong Circles config bits when users toggled checkboxes in the Manage Team settings panel. Each TeamHub label was mapped to a bit that meant something completely different in Circles' real encoding. Consequences observed in production:
  • "Anyone can join" wrote bit 1 (real CFG_SINGLE) → Circles tagged the team as a personal identity circle → Contacts hid it.
  • "Visible to everyone" wrote bit 512 (real CFG_NO_OWNER) → Contacts refused config edits.
  • "Enforce password protection" wrote bit 16 (real CFG_OPEN) → team became open-join.
  • The always-on "Prevent sub-team membership" hint wrote bit 1024 (real CFG_HIDDEN) → team disappeared from listings.
  • Settings made via Contacts and TeamHub no longer round-tripped — each side read a different field of meaning from the same column.

This release corrects the bit encoding in both PHP and Vue, introduces canonical constants in lib/Constants/CirclesConfig.php (mirrored in src/constants/circlesConfig.js) so the drift cannot recur, and ships a one-shot migration (Version000339001) that decodes admin intent from the old (wrong) encoding and re-encodes with correct Circles bit values. Admin sees the same checkbox states before and after — only the underlying storage changes.

  • resolveUserSingleId() DB-join fallback was checking config & 2048 (which is CFG_BACKEND) thinking it was CFG_SINGLE. Now correctly uses config & 1.
  • browseAllTeams() CFG_VISIBLE filter was filtering on bit 512 (CFG_NO_OWNER) instead of bit 8 (real CFG_VISIBLE).
  • isOpen checks in browseAllTeams() and MemberService::requestJoinTeam() read bit 1 (CFG_SINGLE) instead of bit 16 (real CFG_OPEN).
  • Manage team → Settings tab now always reloads from the database when activated. Previously the checkboxes showed cached state and external changes (e.g. via Contacts) were not reflected until page refresh.

Unread message counter (was 3.39.2)

  • Unread message counter restored in sidebar. The NcCounterBubble badge next to team names was effectively dead: no polling caused team.unread to go stale immediately after page load, the counter was hardcoded to display "1" regardless of count, and team.unread was a boolean not a count. Fixed: backend returns a real per-team count, the badge displays the actual number, a 60-second background poll keeps badges current, and posting a message triggers an immediate refresh. Excludes own messages from the count.

Group invitations (was 3.39.6 → 3.39.14)

  • Inviting a group to a team now works correctly. Circles' addMember() was creating an Invited row with level=0 for non-user types (groups, circles), and Circles has no working notification path for group invitations — so groups stayed in permanent limbo and TeamHub's filters silently hid them. Fixed by auto-confirming group/circle membership immediately after addMember() succeeds (UPDATE to status='Member', level=1) and triggering a Circles membership cache rebuild so users in the group get immediate access to team resources.
  • @mention now works for indirect members (users added via a group). Multiple cascading bugs fixed:
  • getAllEffectiveMembers now correctly reads from circles_membership (Circles' denormalized cache) which contains every reachable user including those via groups, instead of attempting unreliable IGroupManager lookups by GID labels.
  • Frontend store correctly unwraps the {members: [...]} response shape (was treating it as a bare array and discarding the data).
  • Mention autocomplete supplements OCS results with team members that NC's user-enumeration privacy settings would normally hide.
  • Manage team → invite flow refreshes allEffectiveMembers in the store after adding a group so mentions work immediately.

Added

  • lib/Constants/CirclesConfig.php — single source of truth for Circles bit values, plus MANAGED_BITS, SYSTEM_BITS_FORBIDDEN_ON_USER_TEAMS, and the migrateLegacyConfig() decoder.
  • src/constants/circlesConfig.js — JS mirror of the same constants, imported by ManageTeamView.vue, CreateTeamView.vue, and TeamWidgetGrid.vue.
  • Reset config action (icon button) in admin settings → maintenance → per-team row. Clears all user-managed and forbidden-system bits to clean defaults. Confirmation dialog before applying.
  • Config bitmask integrity check in admin settings → maintenance. Scans every user-created team for forbidden system bits (CFG_SINGLE, CFG_SYSTEM, CFG_NO_OWNER, CFG_HIDDEN, CFG_BACKEND, CFG_APP). Per-team Repair button calls resetTeamConfig().
  • Three new API endpoints:
  • POST /api/v1/admin/maintenance/reset-team-config/{teamId} — clears user-managed and forbidden-system bits, returns { oldConfig, newConfig }. Logs to teamhub_audit_log.
  • GET /api/v1/admin/maintenance/config-check — returns array of teams with corrupted bits.
  • New Vuex state allEffectiveMembers + fetchAllEffectiveMembers action + UPDATE_UNREAD_COUNTS mutation + refreshUnreadCounts action.

Changed

  • repairMembershipCache() now strips every bit in SYSTEM_BITS_FORBIDDEN_ON_USER_TEAMS before rebuilding the cache.
  • updateTeamConfig() MANAGED_BITS mask updated to the correct Circles bit values (8 | 16 | 32 | 64 | 256 = 376).
  • TeamWidgetGrid.vue::teamLabels — labels now read from real Circles bits. The misleading "No nested teams" label removed.
  • CreateTeamView.vue — the "Prevent sub-team membership" checkbox removed entirely. It controlled nothing real and wrote CFG_HIDDEN.
  • Audit log event types: new team.config_reset, team.config_migrated_3_39_1, team.config_migrated_3_40_0.

Migration

  • Version000339001Date20260518000000 — one-shot data migration. For every source=16 team where any legacy-damage bit (1, 4, 512, 1024) is set, decodes admin intent from the old encoding and re-encodes with real Circles bits. Skips teams that have no legacy-damage bits. Logs every change to nextcloud.log and writes an audit log entry per team. Bursts Circles' APCu cache when done.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureGeQDw//MDpb0NtdSeSx4urPBtzDCZkP+xEB9nF5kRi3kZ2CigAJ/pJn2tgVVtjITIzJJJ37xowH4nueQhSZk5Y76gK/cHa3dPuGf0Usbwlr8BndOK6DdX1Z167TczCB13ZXU93YnfjVfUcfneTZJPyz/0iMbJs1tAF4nH0OzWDVmTYmiRtCFhHqtbFbFFkbSVOmoZjE1UNVPwDweNY0fPkusKS5beXTm0qaKXBhYXhakqhnxycweOfqH3JxjmCiz0aZbcdqdeNRCUw9bAJtK7Agp/xEwOv1PKTey4Q4i9VA7yDYg5lWhDKLalX72K0jdNUkXqbw2W1hawGzEOgcX2aFoV6MVaVPREoFng515ezHlpOWyC6xk7yOq8EsX40ypKOCdBJiHGPE82/GUnRLdeKkkkSrpygNdaH2FIS2STEIsswcyxXyUwJnVp3qZB6NrMZhjuoJ2eVQoqb5O+eM/UaiH+yEM4y5bt6rGsM9D5u4RbXZHdzd3iYo9Qnz6oidcb7NYZWYY7S3yYJqPWlpJ91ehgJ6+W/t5GL05ms++MrvmE+oxM6pBMXW/P+WSe9fb4ckW2aIGwdEUoyB2fsDMgPDg6ej7cHvWbB/EvvhSfUfXNJTjDteSH+W0TuL5Y5UNLUbXzJJiPHl1EbSPm3Cda3krOwRrIeJdRk/iCWlCIVc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.39.0
Release Details
UpdatedMay 15, 2026, 2:35 p.m.
Changelog

Added

  • Integrity check: nested team detection. Flags any circles_member row where a user-created team (source=16) is a member of another. Repair removes the offending row.
  • Integrity check: CFG_SINGLE corruption detection. Flags source=16 circles with bit 1024 set (causes Circles to hide the team from its own API). Excludes legitimate personal/system circles. Repair: clears the bit.
  • Integrity check: duplicate member detection. Flags circles where the same user_id appears more than once as a direct member. Repair: keeps highest-level row, deletes rest.
  • Integrity check: no-owner detection. Flags source=16 teams with no level=9 member row. Repair: promotes highest-level existing member, or inserts calling NC admin if team is empty.
  • Integrity check: wrong display_name detection. Flags circles where display_name ≠ sanitized_name — this causes Circles to misclassify user-created teams as personal circles. Repair: sets display_name = sanitized_name.
  • Link permissions. New linkMinLevel setting per team (member/moderator/admin, default admin). The + button in the tab bar is hidden for users below the required level. Configurable in Manage team → Permissions.
  • getTeamMemberUids() in MessageService. Direct DB member lookup for notifications — replaces Circles API getCircle() call in the message write path. Eliminates "Circle not found" 500 errors when posting to teams with config issues.

Changed

  • Manage team tab renamed: Messages → Permissions. Pin level, post level, and new link level settings consolidated here.
  • updateTeamConfig() no longer calls getCircle() for cache flush. The Circles API was triggering internal sync that re-applied CFG_SINGLE (1024) after every config write. Only APCu cache is flushed now.
  • CFG_SINGLE (1024) removed from MANAGED_BITS. This bit marks personal circles and must not be written to user-created teams. Frontend no longer sends it; backend no longer includes it in the write mask.
  • repairMembershipCache() auto-clears CFG_SINGLE before rebuilding the membership cache.
  • searchUsers() no longer returns teams/circles in invite search results. Inviting a team into another team corrupts Circles' visibility queries.
  • Orphaned teams query no longer requires app:circles: name prefix — compatible with NC33 which stores plain team names.
  • getAllTeams() deduplicates by unique_id — prevents duplicate rows when a circle has multiple level=9 member rows.
  • Ghost cleanup moved from its own tab into the Maintenance tab.

Fixed

  • PostgreSQL: backtick quoting in resolveUserSingleId() (c.\config`c.config`) caused syntax errors on PostgreSQL, breaking indirect member detection.
  • SQL HAVING clause for duplicate member detection used aliased COUNT() which MySQL rejects. Replaced with createFunction('COUNT(cm.id)').
  • InviteMemberModal no longer shows teams in search results (AccountMultiple icon removed, circle type branch removed).
  • ArchiveTeamModal displays resolved folder name instead of raw /f/{id} link.
  • Announcement banner (mohamedsakhri/nextcloud-announcementbanner) suppressed in iframes via .announcementbanner-stack CSS selector.
  • share_folder config.php respected when creating team folders (AIO and similar installations).

Added

  • Ghost member cleanup. New "Ghost cleanup" tab in Admin settings. Scans all team memberships for users whose NC account has been deleted, grouped by uid. Admin can remove a ghost from a single team or from all teams at once. Includes a live-account safety guard. Endpoint: GET /api/v1/admin/maintenance/ghost-members, DELETE /api/v1/admin/maintenance/ghost-members/{userId}.
  • share_folder config.php support. When an NC instance sets 'share_folder' => '/Shared' (or any path) in config.php (common in AIO installations), TeamHub creates the shared team folder inside that path. Falls back to the user root when the path is absent, missing, or not a folder.
  • Invite button in Manage team → Members tab. Team admins and owners now have an "Invite members" button directly on the Members tab, opening the existing InviteMemberModal. Member list refreshes after invite completes.
  • Archive location name resolution. The archive/delete confirmation modal now shows the human-readable folder name (e.g. "TeamHub Archives") instead of the raw /f/150770 file ID link. Resolved server-side in ArchiveService::getAdminSettings().
  • Announcement banner suppression in iframe. The CSS injected into embedded iframes now hides banners rendered by the announcementbanner app (mohamedsakhri/nextcloud-announcementbanner). The banner remains visible on the parent TeamHub page.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturepLfqcez5PHzBBt4uvQUuBGuVX2F+Ensw6x8TOu2G5BMwPa5XM/IPDpTKwYl5bruyA5CI7UWwW8Kb+NwEOdBR4nQMiMRxg5EJTQeg4mvsz+0P2LK/m28o6zA0D6a8NZThFpd6TRz6iOJybaNjqCZMClHlEHpwWLyuSy8Q+F485bD5TxQxLSWtuEAUFGX5gnj5S5plOx9dLLQKusc0j6guap2BM/rJboKisDS6rkYcMtfPS+/sKtHe9WceNvV6M3ulYWxFtpf4NPlr7XkYreTDYzXWt7m0aaNjxVBn7N4m6DasYvG1FA97K/qO6RdBPHg7GGh6DmoyRw+fE+GsM162FCFfnomewnYPH8yKt05DPueEIbgMkQXeGJ7E19CMan+CyUCv1GvdomrVoNHBazt3IXNH+AIHokIQnj8ScwKFScQ7gahdGkABoULK4fwV90DpxOuxN1uoGC/aDI6+fC1gAN0gUoHaGIgevjn7+jGPGeuAdrbZpnV4xnJBTM/P+mPu3Dc+Dop8irM63XP7dfy8v33NHoN5N2gdIHPGJsqhDpqNSg6T02esJehL42h0yTlaRZ40Qs4el13FxijnnVjk4Cz8m/Q1cPm5x1RSWYpDNQ7NhlQxsWIyLMiZFcfTVZh0rWuitR/NXMKzs3WKwSNdw/xQwgagUStk6O5hDJGM07s=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.38.1
Release Details
UpdatedMay 14, 2026, 8:01 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturep1xq5GU5FgnU+VBmRTq1YN5VobUyjICVQ1UEEoxNmz+9GoTiMzc4SHrb4aQDDAIA8VppLDpx4+z8TKLAi7OgGy6COZK/7CHQrdDt0Qk+q6ACl4AF3l+RgV0DWrHxbP6V/LkewhJHUl9scVJkfIBwoZXK2bITpo65RdDMVDfTiHR7Nf1/jm/nwjpi2ZMYf7Ct969eB7a+IDoydWoYBETd5mlLBp30cWFthnT3uEpPRJYCgKvOdO9iVjBBOP2VtudKYDkUmdKpHbQutIxQbCcnw5455wCS4byicyEfu6oLxN6VYNk+VSttFf+PQlC7TFYNyHW/XOpneBM/z5yA/e9UaipRtFFzG/ZTepEQL6LoU2UgaXm/cPF4rDtqh3t+7BPR1OerRej8cTXsut7zugiKW2lm98Z3yXixEtTe5b0TJajkVTFYXfVBDYFUR5PLsAczk5ipa8O9UgapijqQDYKvqFyHhrrobWdAHs/cUJMZE7UdLJhpvrEeYfQJTSurKXI4uqLx/PIMj7P2C+LYQn71gnxJStjhCxy5syvDt8EQbljl8tlUtGWmbtpojG0JF9k3j502osAoHz5S02c357aqCGmdaY3Q9PlVyG2C12v2AXB1k5dOKG4nJ8IbrKlBYMe8xiqEllgoc722ab4wtcXqQoeA+kWT9q41VyRt6qrByYU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.37.0
Release Details
UpdatedMay 14, 2026, 6:27 p.m.
Changelog

Added

  • Message @mentions. PostMessageForm and MessageCard edit mode use NcRichContenteditable with the NC core OCS autocomplete API (/ocs/v2.php/core/autocomplete/get), scoped to team members. Mentions render as styled highlight pills in the message body. Backend sends a message_mention NC notification to each mentioned team member (on create and edit).
  • Message pagination. 5 messages per page with prev/next controls in the message stream. Page resets to 1 on team switch and after posting. MessageMapper::countByTeamId() added. listMessages now returns total, page, and limit alongside messages.
  • Per-team message settings. New Messages tab in Manage team for team admins. Configures minimum role to pin messages and minimum role to post messages, stored as per-team IConfig keys. Post Message button hidden (not just disabled) when the user lacks the post role.
  • Calendar view dropdown. Embed bar now has a native select for Month / Week / Day / List variants; selecting reloads the iframe with the chosen view in the URL.
  • Calendar embed auto-reload. After adding or deleting events, the calendar iframe reloads automatically so changes appear immediately.
  • NC-relative team links. Custom team links now accept apps/... or /apps/... paths (e.g. apps/collectives/s5) and open in an iframe tab, just like built-in app tabs. External https:// links continue to open in a new browser tab.
  • VitePress documentation site in docs/. Covers Nextcloud admins, Team management, Developers, and Users — 20 pages total.
  • New migration Version000336200 — remediates auto-generated primary key name on oc_teamhub_team_app_resources for existing PostgreSQL installs.
  • message_mention notifier subject in Notifier.php.
  • getMessageSettings / saveMessageSettings endpoints (GET/POST /api/v1/teams/{teamId}/messages/settings).
  • getCalendarEventsForWeek endpoint (GET /api/v1/teams/{teamId}/calendar/events/week).
  • deleteCalendarEvents endpoint (DELETE /api/v1/teams/{teamId}/calendar/events).

Changed

  • Calendar iframe URL now uses the public share token path /apps/calendar/p/{token}/{view}/now (team-calendar-only, no personal calendars). Falls back to full app when no token available.
  • Calendar connect error handling in ManageTeamView no longer logs the full HTML 500 response body to the console.
  • getPinMinLevel reads per-team IConfig key first, falls back to global key. Admin settings Messages tab removed (settings are now entirely per-team).
  • activeFilesIsGf / activeFilesIsShared in ManageTeamView use .some() across all active files rows so the GF connect buttons correctly hide when a GF is active even if a shared folder row appears first.
  • dav_shares access filter in getRealCalendarIds broadened from IN (1,2) to IN (1,2,3) for compatibility with NC Calendar 5.x circle shares.
  • resumeCalendarAccess corrected from access=1 (read-only) to access=2 (read-write).
  • Select dropdowns in AppEmbed bar and Manage team Messages tab have no background color (theme-transparent).

Fixed

  • MariaDB migration failure on NC 32.0.9: Version000328200 now uses explicit 'th_tar_pk' for setPrimaryKey() — auto-generated name was 31 chars, one over the 30-char DBAL limit.
  • Calendar connectExistingCalendar TypeErrorResourceService was passing $resourceId as string to a method expecting int; cast to (int) at the call site.
  • GF connect buttons visible when GF already activeactiveFilesIsGf now uses .some() instead of .find() so ordering of rows doesn't affect the result.

Added

  • Strict 1:1 enforcement for files resources. ResourceDiscoveryService::reconcileApp now snapshots the team's active files state and routes newly discovered rows accordingly: active shared + incoming GF → pending (with isDualFolderPending flag); active GF + anything → ignored (GF precedence); active shared + another shared → ignored. acceptResource and unignoreResource apply the same guard. All refusals write resource.suppressed_duplicate audit entries with reason codes.
  • Group folder takes precedence in getTeamResources. When both shared and GF rows are active (dual state during manual migration), the loop explicitly picks the gf: row so widgets and the team home always read from the group folder.
  • Dual-folder informational notice in Manage Team → Settings → Team Apps. When a GF is discovered alongside an active shared folder, a blue panel explains the situation and directs the admin to connect the group folder via the existing buttons and migrate files manually.
  • Resource-type badge ("Group folder" / "Shared folder") on each active files row in the settings panel.
  • Picker filtering by active files type. GET /api/v1/pickers/files now accepts activeFilesType=shared|gf|none. Shared folders are suppressed when one is already active; both types hidden when a GF is active.
  • isDualFolderPending flag on panel data rows.
  • normalPendingResources, dualFolderPendingRow, dualFolderSharedRow, activeFilesRow, activeFilesIsShared, activeFilesIsGf computed properties in ManageTeamView.vue.
  • Create New button for Talk — shown in empty state alongside Connect existing.
  • Create New group folder button for Files — shown only when Group Folders is installed; switches label to "+ Create new group folder" when a shared folder is active (signals the workflow).
  • Both 1:1 buttons hidden once a resource is connected, except when a shared folder is active and Group Folders is available — then the GF buttons remain so admin can attach a GF for manual migration.

Changed

  • ResourceService::upsertResourceRow() — now promotes pending/ignored rows to active on explicit connect instead of skipping. Fixes silent failure when the discovery reconciler had already inserted the resource as pending.
  • ResourceService::getTeamResources() — files block prefers gf: row when multiple active rows exist.
  • ResourceDiscoveryService::getSettingsPanelData() — adds dual-folder detection and tagging.
  • ResourceDiscoveryService::resolveFileName() — falls back to basename(path) when filecache.name is empty (some storage backends).
  • FilesService::listConnectableFileFolders() — accepts activeFilesType parameter, filters output accordingly. Also falls back to basename(path) for shared folder names.
  • ResourceStateController::getPanelData() — now triggers reconcileTeam before returning panel data, so externally added GF resources appear immediately.
  • ManageTeamView::connectExisting() — empty catch block replaced with showError().

Fixed

  • Critical pre-existing bug in ArchiveService.php: stray extra } (line ~2770) caused ParseError: unexpected token "try" on every admin archive request. Removed. Archive settings save works again.
  • AdminSettings.vue archive form: archiveBeforeDelete was missing from the data() default and from loadArchiveSettings — the toggle had no reactive backing. Both fixed.

Removed

  • The auto-migration system (FolderMigrationService, FolderMigrationController, FolderMigrationModal.vue, two endpoints) was scoped, built, and removed per user direction. NcDialog wiring proved unreliable; manual file migration is the supported path. The dual-folder notice remains as an informational signal only.

Security

  • All new endpoints check team admin level (≥8) before any action.
  • No raw SQL anywhere; no \OC::$server; constructor DI throughout.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureNB4VEY/kY6IM6/q9rg1aZPixwOBTrNlZIbr9hGsb3TcGQ3kXe591A67Rez1U2FQO3FcRuoxZRNXGMJkziuhoaa9RkoGQuHxtueXomwk5UWjFSTbgf8+JFSFXag8NUNM7DqEnRjG3hLad6HdDwdv8t+t7CDhkih5s2rGI7G55B9uSNdY0LftIal9G2M4DBJmpZtJ+1RitAI/ZqqRCjA+lVc0V7AQFeCxVyrt9weLTdXuvzGTZhazmiYZELVrbpUwurxRgmE6itg5pWp+T4FC1ilm7zyz/v6LOSmRBqgNExbS5lbEutYBoKLSKEPfvjAO2emcj54Ng9PwvRlP1iTvGr7jrZ15DZa0mBL6sXMvDpEdR2yvoAsVDvlroHW0aILMDnc3HruzKkmB8ykRyrkOAwVmCRQUPN5pjr6Qre/hCgYWZR0d+YHFopsJ/VDiH6+PH8aYia/92Z6z21kbvT4wUrqwqARyI510Dcq9TLx+O6CeNqYmBiPYkpAUoX1ck+q3fZAH3cqTXH7N5ezRctAnM3CvctmxMG7Gpd9BmLj0wF1p69qGQ4FvpcVSsFoFt3sc8qxfARDRm0fu+avD47k4YvKfR1NFbUhHe+RMYivFWlmCAhwbaObsGt2mCbyfIwxLFM/S4N2+ji8lwYT2wC9cPTHYTL1+dZNwTCCdaTEZIVSE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.36.8
Release Details
UpdatedMay 13, 2026, 7:15 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturelhEnGI/fAC8OFXF2pnGBIlqEN6Bw4EurQEVPeTeuGc+O+1NHT6t7rYfX5gBJinYOJScN0dXIys+FHOvzY/QGT02MbHUDXMqtwzYoegOZBlRE/TXUXp0LKCx+3m+rHjKd9dCtBJi++X2ZUJUqGzsU4Km1WNRKqv6gubdCYUAMjXZmrXtfuEtdOqc5yAgnaA7CxKx+TPcc8bpU+SPkiFeuC9EB+iwnM+3NJThjc6RIQWiCwc9F5i1FsXikkYe9gYENyaraXhZrqj1eeC2hHwBRB5aXYMO9FghzzjvQ2VZo/psiiGWukii17WqKSofNN5N6yeh0Va2q/dT3RRmtRNhZ16D9eCeVLF+w6rUaP3bz3lNZIeksbIkV5E3d3F/FXc51QdNIlQ5D1LdB4ghhVYtvTBFzf5WbB5yzM6uSA/zcR5g02p4iMzLdVoILfkXoMRV7VNISvQfPP9ExuQnw15dpA7nSzIEC2dtLCNoA1xUPTCVCOpz3CMHILjL5F4l8HJtQKx5D9IV8l5Sakf7uqp7SJcx8CWh03/iX6Eibp5HRRS4PsdKyZVKiWgOyG6iXkTktCruXQKGXi5MSwkpPZvYUz8//klH2Bn87PSHJ+q9rtca0j4w/o0QBqnJr03gHcKPh3Y5vD0aaca57svcZPbhr+dwT4WXmEBNkxRlNKwmI0v8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.36.5
Release Details
UpdatedMay 11, 2026, 7:29 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatures016TbppM9kULPOeWRGdKsV9pcTR+YBhPBA2cPZPRtKPLKxUpr80YJrCOj2+VxmxQrrr0cwaFgQTjtCTw8Uw1ush4zPNdfXfX2HFqsvmP2JYDEFQwk6ftJLwiDfeUk4kDnarODZ2WAJ6Ol22Sq8w4cxdgADyVDii0sRaHyyEnghCuyttUccXzr/1uf1MzlzuH0xhbLSKALpnQVnTKz0jMNgGifh/ug5nh+tmz/nwLSUGJ/n+iyWp8qQhzWtlKQpSSTAW3COCOQvleVoprDWkU9LyOKmQvYXExEmsf9C21olxxEkHygVhDEKKN+2eNmH1XsTyuBmi9SVDOP5uruPsiZs7bnmO9ToBI8oTCtRa6jmu2pJpPjTjIdGW7Mr5US/NEbjljWFdC0KJZ4y0Y5+z6oKExqXb13D/bMndP5uNNZI/0SwLTCCpfd6DYYp9TCESagMG6zARVbIu69ReMWlmvEL2Uhq0hKqlBfhKrHwyrtYRXXzLpn+riNO2WafrOrVmMMT8t1+0aXUdqYBRKz6jpuwRag29IutxSsYwNA9oSlCmjhylald0jhu6AAK9Zi5fg0HuKudr7RBhk4wPY+HrgHtVwvl9h5dJ0ADJmsJEE77CKaT8xdV0SgpRU/JZCMw9qHFnkz7qDR/f/fmshi0L9qaDVOB0hWOKP7Td1BvlC3g=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.32.2
Release Details
UpdatedMay 10, 2026, 11:50 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureaqlS5xLgAtQMFnFSjAjXnjfpSSV5UCZpVyKef4AdzzktPWmKamnaJ/o9bl/knf5Ccxcaac5gNFKSZcycZ4yrXj+BKTne63Wt+G4a/W3uhVV+jEz0aXacH4jwhVJuxDExsQUp83WA/JxrlFp38nEXc3fSMhAPZsP829eID9w6AbRSujgEzOfNCsduJ0Isrw+m60fR8R7LsX0CSC3XzGwLVwoJhbXJ52Ri8JRxLziVP/If/TAJR+pqg25hjGoYRqoPTacmdoFbNxcaZOeAxJSR0VRMwFS7rJJakiZ95w54KztDRvMwJAIMBr4BDtAiqedj3GCj8AtsPmvh3dEh3OPw4xMjQlTRAqW6yL1t4AhvL5dy5dmlQyRZiKwTkSC/9+/SXwR+e+1vfaB5ffmA3JAt9LIZ+24gP7O989Ed6yIo8Rh9//c6HwXky+L1MDOU9onZU3mwWBvI2xujyIhYu9uXMV6q587FsyptGaAoeBVtbtmY6DxiodLmgE5no1Gm0OBt7vy2ZUEhE9ToktSetWQPLtpjptRUBbAyomUGpEiaLSQP7y08h1ulPHoMjM3MelrxfGqSytHakG/M8bImdS7dO46kRG4gEf9C1LaaXH3KkfiNu0F5FPEbf0qidxDY5XePKUiAPirG5nSXLjYCu6f8hDktPh/U70EIWKuO4AAi4qw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.28.0
Release Details
UpdatedMay 7, 2026, 7:47 p.m.
Changelog

Added

  • Connect existing app resources to a team. Team owners can now choose, per app, to connect a Calendar / Files folder / Deck board / Talk room they already own instead of creating a new one. Available in the Create-team wizard step 4 and in Manage Team → Settings → Apps.
  • Resource pickers (GET /api/v1/pickers/{calendar|deck|talk}) listing the current user's owned resources, scoped to the caller's UID.
  • Connect endpoint POST /api/v1/teams/{teamId}/resources/{app}/connect (team-admin required) that inserts the share/ACL row granting the team's circle access to the selected resource.
  • ResourcePicker.vue — unified picker component used by both the wizard and the manage-team dialog. Files mode opens NC's standard getFilePickerBuilder dialog; the other three apps render a populated <select> populated from the picker endpoint.
  • Connected-resource warning under "Delete team" in Manage Team → Maintenance, explaining that connected resources are deleted with the team and how to preserve them.
  • Archive-before-delete admin toggle. New checkbox in Archive Policy controls whether team deletion produces an archive ZIP first or skips archiving entirely. Default OFF for new and existing installs. Same three deletion modes (hard / soft30 / soft60) apply to both archive-on and archive-off paths.
  • POST /api/v1/teams/{teamId}/soft-delete endpoint for soft-delete without archive — creates a pending-deletion row and suspends connected app resources but skips archive production.
  • Owner-side delete dialog when archive-before-delete is OFF, with description and confirmation text adapted to the chosen deletion mode (immediate hard delete vs 30/60 day grace period without archive).

Changed

  • The Delete-team button in Manage Team → Maintenance now branches based on admin policy: archive ON opens the existing archive modal; archive OFF opens a plain NcDialog confirmation.
  • Description text for the Delete-team row dynamically reflects the active archive policy and deletion mode.

Fixed

  • PostgreSQL SQLSTATE[22P02]: invalid input syntax for type smallint: "f" on team creation. The enabled (in teamhub_team_apps) and is_builtin (in teamhub_integ_registry) columns are SMALLINT (per the v3.9.0 cross-database fix), but their bind parameters were still using IQueryBuilder::PARAM_BOOL. PostgreSQL refuses the boolean-to-smallint coercion at the wire-protocol level; MySQL accepted it silently. Fixed by casting to int and binding as PARAM_INT in TeamAppMapper::upsert() and IntegrationRegistryMapper::register().

Security

  • Every connect endpoint re-verifies that the user owns the specified resource (WHERE owner = currentUid or IRootFolder::getById() for Files), preventing forged-resourceId attacks across the four supported apps.
  • Each app refuses to connect a second resource if one is already linked to the team (one-resource-per-team invariant).
  • Picker endpoints scope listing to the caller's UID — never accept a UID from request parameters.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureADlRyz4GyYgl8rljgx6Xw5Yq+hXjFnDGsT/M68SMUIu0PyMV0qJzbt+63EO5ij0SJrNYsf0ggbHaHct97ckYFzxrkFf7+B2O9l5YWdatd+dmtt0FQEMKBReJBSb93ZSRU65JXVlE0/43ikwK+RW9DiQI7QS3/DWSvRf83C43vI57g3PKs0dovrU5BwXWIb0bh7OvzXSfq7guF3JnFxlSeBTsrA9KUDTwQY03n1Wqi6tDYwLvTIQu8tKnPCMmzVQJlAc4d2krRVgEDGn+hNXN8+0sq8YSAq2ZCc2ckBXlMTyzLRrqwkZz7LpgljadbYATQe/GhS+ax5AFKL9efbXx0ny5S553N6Clgaq9vn5AyT5JASVo22Sf/Yxs/bT+EVYxKmwSd7XW9PDvXYwtG9aojqkQnEgZdas2MCeZw3e4yAsh1pd6KpFf3LuQ9U7nxzDSoABLZSDPYctIIZoVVQTPM35Bd/poEbOYl5f60bOYHEmeQkFP/MCVuqM9/XuJ1hIw27U7GdDCAsC1ONdcmlIRYEJHdIQ+yxOjMMYm8F18OjHJYoDuk/GIjFmGCF5QzcE+vdK6z4SO5n6JtTTsM6T8ruv/FNUFtQYbIb4KrhzbUs4TOxV+MCAI0/lB7IJiWdogLEiVuABwSecEPzt/K2qCbK9VgzJV8h77Yg1Z72ic1Dg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.27.4
Release Details
UpdatedMay 7, 2026, 1:14 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureWsF4We8JALnZvd9ZxzvftUVv6y9bJoO2AK9e/PM7P3dJn/cu8zwy1WvJhJDwbFP8Z0Nzcpj/wmN2WjfT0+1nbLor4BJ8Ls7noGy6KZR+laWTW/UHwGcRgFK5FB53Yi7W/rUTcp1dyM05gyl8sZAmrQxA/sD/unJccyNHcQJPpw3s8tsEShXmsFlZJuO2Ria+a0bKRXSQl1Az5v9ORk/Bx0Wd8oTVD+x2yEBq70TMaA4UqHU0Q/qNrZn03XHCYA6bh3QExdWx8sV3dNJ9X8envbqwPG53VL8KIOZD31DsjkVZ73+/stHpj3xQgwoiQ7oQD+ggorUShI16nrkd/VTV+M7VtcZyPxacndnslzeZyS00p2o0U9SzRTiJB3d76gogX/7XdQpRmUIeUroB1UNGaLMoILC8LojcDQsDGgv0w6adCZ5f/BdEgUkZKSMcm++IN5cYtm+q6+Eth29bh7gq5RIpuKb0Ous5wjG9UVgLHi/KDhtj+vZoUkg8CQ3ctPttf+FkJtY/xTuoEzf0ygy8nlHYsBoGQmdjyUqvuB7MZKCL3y1F8mGwEI0FYFMhbRnRVbYQy1ae8RpQj/fKEAWwXEfGIBbQAySath1iBlILNeAreUWmJpiWnE+aSghtd//HPcKvwHW1nRLt4f/UuMYIjCm3u/7C/CrJ49X2ZbIJSyU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.24.0
Release Details
UpdatedMay 5, 2026, 8:48 a.m.
Changelog

Added

  • Mobile single-canvas layout for viewports ≤ 768px and tablet portrait (≤ 1024px portrait). New MobileWidgetView.vue: scrollable canvas, collapsible icon bar at bottom with one icon per accessible widget, FAB action button.
  • FAB widget actions — in-canvas action button rows removed; actions surfaced via FAB: single action fires directly, multiple actions open a slide-up sheet.
  • Tablet landscape layout for viewports ≤ 1200px landscape: 60/40 split with message stream left and collapsible widget column right. Widget cards have spacing and rounded borders.
  • NC sidebar auto-close on mobile/tablet-portrait — uses NcAppNavigation :open.sync prop to close reactively after selecting a team or action, instead of fragile DOM manipulation.

Changed

  • Embedded app iframe content height set to 100% (previously 90%).
  • Edit layout button hidden on both mobile and tablet layouts (editing not available in these modes).
  • Seven modals (ManageLinksModal, AddEventModal, AddTaskModal, AddPersonalTaskModal, InviteMemberModal, ScheduleMeetingModal, TeamMeetingModal) now set min-width: 0 on viewports ≤ 768px to prevent horizontal overflow on phones.
  • MessageStream accepts hide-header prop and exposes openPostForm() method for FAB integration.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureTvyr9L9P+H2RLIOYb8tFSJIV/1sH4rWC2RhttmVfB98kvezRU7Xa/tVV+MKE758D3cT3BKsvBz7e/OtKoPKuCan6HR0AmXNbMYx3F/ep+BoEQP3H/m8pOaYF2xyRAYmsdHxV9EPyyFEX6Trxiwy5aNJSK5S9RJdC+fm8p0gmvDlP1G3+GCerMXdi2lioEpoAnIlE+fd7JUIt48C1YYHKAqDlsaw3wlXiYC4j68I8vVD8GdXYmYgXvxW3IeE/iUbOZJ75bpqxv3ufHqEFPAYas5+SMUy8fGQQZjBvjIN4ztSRwAIZ4e1OFZj2WsYsfJZEi5upcwPoqg5SGo4Xw7vp5Dz3Zxx2hCEhCdO8jlGSinqNul6lPRZmaKXm0GY8v03ZaHu2uUdyNPvOfnVRUbe2ekUKhXe7C0u9umdSLmv2/+HhQRGFFZH6Tfu6Pc1IwWirW2EnhmKoGHnWO0mjq+VK1Ip1ZntyZ1znM9U6fdQaHTjMBq2nlXQWnZgu1tw90QWf1rj3+MGQW9vUyrN5uEx9xxxBVxXjCxCVvkOsqwTR7lqqsQfp/NCR0lRyognr7Hmd985l8nUYHCrg9KfPzOfFxLRauxh1UIiRS1nif3WmJzmaelxyyRNysvksjzsc5GJW9C0wjTPsYOuZv2H+a3GRH1RSzadDXVS11CCDpVMPXG0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.23.0
Release Details
UpdatedMay 4, 2026, 7:35 a.m.
Changelog

Added

  • DELETE /api/v1/comments/{commentId} — hard-delete a comment. Author may always delete their own; team admins (Circles level ≥ 8) may delete any comment. Audit event comment.deleted written with metadata { message_id, author_id, deleted_by_admin, cleared_solved }.
  • Solved-question revert on answer deletion. If the deleted comment is the marked answer to a question, the parent message is automatically reverted to unsolved (question_solved=0, solved_comment_id=NULL). The confirmation dialog warns the user before proceeding.
  • Delete button on comments. Visible to the comment author and team admins. Confirmation dialog; disabled/spinner during async delete. Error messages are HTTP-status-aware (403, 404, generic).
  • currentUserIsTeamAdmin Vuex getter (level ≥ 8) — derived from current_user_level now returned by GET /api/v1/teams/{teamId}/members.
  • Markdown formatting toolbar in PostMessageForm.vue (new messages) and CommentsSection.vue (comments): Bold, Italic, Inline code, Code block, Heading (H2), Bullet list, Link. @mousedown.prevent preserves contenteditable selection; execCommand('insertText') fires at cursor.
  • Markdown toolbar on edit message. Same seven buttons in MessageCard.vue edit mode. Uses native selectionStart/End + setSelectionRange (plain textarea — no execCommand needed).

Fixed

  • XSS via v-html in message and comment bodies. Both renderMarkdown functions now pass output through DOMPurify.sanitize() with an explicit ALLOWED_TAGS/ALLOWED_ATTR allowlist before binding to v-html.
  • Headings (## text) and bullet lists (- item) rendered as literal text. renderMarkdown was a flat .replace() chain ending with \n → <br>, so heading and list regexes (which need multiline anchors) never matched. Rewrote using a null-byte placeholder pattern: code blocks and inline code are stashed before block-level rules run; restored after <br> conversion. Applied to MessageCard.vue and CommentsSection.vue.
  • Deck boards created with permission_edit = 0. Deck's AclMapper does not mark entity fields dirty when set via __call magic, so setPermissionEdit(true) was a no-op. Added enforceAclEditPermissions(): one independent QB UPDATE per column (permission_edit, permission_share, permission_manage), each try/caught so a missing column throws silently without blocking the others. Schema confirmed from live DB.
  • All Deck boards and Calendars provisioned in the same blue colour. createTeamResources() now picks one random colour per team ($teamColour = self::randomTeamColour()) and passes the same value to both createCalendar() and createDeckBoard().
  • Provisioned resources (Talk, Files, Calendar, Deck) not deleted when a team is deleted. deleteTeam() now fetches the team's app list from teamhub_team_apps before destroying the circle, then calls deleteTeamResource() for each app. Resources are deleted before circleService->destroy() so CalDAV/Talk can still resolve the circle principal. All apps are cleaned regardless of their enabled flag.

Changed

  • GET /api/v1/teams/{teamId}/members response now includes current_user_level (integer) alongside is_direct_member.
  • DELETE /teams/{teamId} now deletes all provisioned Nextcloud app resources before destroying the circle.
  • ResourceService::TEAM_COLOUR_PALETTE — 12-colour curated palette for NC-friendly team colours.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureNB29XEJ4DYUSSXCP7cIFfzPYsJyAPHHQtoOtktawP03w3p9lKDvZ86l7WnrBkKcOxtIv7oCuXPh8oQqZkj/L4XmpXAVcvIUPrZPtG3CQ4+OhNvC3BXT4T41GNLAQcG2hyQ4MZX11OBP1F5IfBmGWoY7il1gDNjDTIBqM4J0cFcO/Eg5q4zVYI2x1ks6+SpmlNCLdjVujDfZLN3/wXIQJA4zY5EqUexwmKvz2RiNNESfifz3wwpY5KcYEHrF+gasTIj1ZaaZ5TDC/4tUH71zpn3PAYNRpWPB8d/WhZW8yt0eaRw+4+hLItkzvwsKesAEljUNUrYD8IUD5VIWgysH1IgdXR3tJX2deQK3UW2gVFGuwJvNTtVzDuPGUsZ2m1VdhMPZcsPLqPLH+rvjwrG4qQlaTpXj9v/6ypBBoCo059KU7C5qnITKvANLXgldhEIyV3VNlCjbvww8v2Ogu+FSkSPpQRCq2FWygTVQJNYVIzjNS8J4lGfloPU9lXkEW1UvtK7nzZoumi/H9xmhj3edmOP/MzaR7wrToziaf6cWhhgYfnLxS60TYOUFmY7BCarcQ6y2tlXfPsCHYSDupV2/39kINeZ55xp70YP21S2WyjkkmmsXO76YDImJJIfXJhSUKnfJ7j1gk06Z8QwjQlAxkN2hDHG0JhQVcjWLAri/2A4U=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.22.0
Release Details
UpdatedMay 1, 2026, 12:35 p.m.
Changelog

Fixed

  • Indirect members (added via NC group/sub-team) could not see built-in app tabs (Talk, Files, Calendar, Deck). ResourceService::getTeamResources() checked only for a direct circles_member row; indirect members have none, so the method threw and the controller returned all-null resources. Added isEffectiveTeamMember() helper in ResourceService that mirrors the two-step indirect-membership check (circles_member → circles_membership) used elsewhere, without introducing a circular dependency on MemberService.
  • Member count in members widget was inflated when groups or sub-teams were present. getEffectiveMemberCount() used COUNT(*) FROM circles_membership, which includes group-proxy and sub-team-proxy circles as rows alongside individual users. Replaced with a query that inner-joins circles_member on user_type=1, level=9 to isolate personal user circles, and uses COUNT(DISTINCT user_id) to deduplicate users who appear via multiple membership paths.
  • Pages widget hidden after team creation even when Intravox page was successfully created. create-resources did not write to teamhub_team_apps, so getTeamResources found no intravox row and returned resources.intravox = false.
  • Manage team → Settings → Team apps showed all apps enabled after creation, regardless of wizard selections. Same missing write: ManageTeamView fell back to defaultEnabled = true for every app when no rows existed. The wizard now sends a complete appStates payload (all apps, enabled and disabled) with create-resources; the backend validates and persists these via updateTeamApps().
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureaF+aB3FIewjvx0eqVweCVBEI9ipOSyJoOcNoEC9XKXKaYsVdnElwJwRyq9so1vwmCMkRE2kmmlkqeK+kDc+cDrFhnwG/2NuzoTbG/BQViG1UqASNTodIVMWT3YfFcpVgWYwmY4ebBlHYFmDzpXmozDw74hodGwtZIXiSavfzJhtXhPYvhi/e+Q7v7qICbytjO9C1JFzEEcsGZNNEhkUlSiuO9SMt+yjkG6iWaCzcNjPMPmS7OROieXzAJ/Xxb5vG3aZocJfl2IezIR7sZ1XFrhvRy8+HB0r1EBunJa4YwgM86MaGzlIB2PdMH6OrN6ly6DZwl98oJTMCAjHT95/U/vuzzuwOrsg8P6Y7y+j0mH5nf/ZbSl0FeJk5tfv2GQe2XFXvRw7aKi/K+Y9B0dYReMPmwsBlPvx3mqEj543CaEP/Qzs4xmCJ/V1V0qzGfUkU0UvoDCPh7JLiDED8+O598KEFaxGSOOOqg9hhOLGszJG4jIFyTGsnBLvDFvR4bPFuA5HFjnPH6WdTWnfRhZFhtNojz3LQcsPP5Em9Y7x13KmW8h0HfJ92jzXyY13+4oK8jm9k/TNWyzqz7WYfb83tsia8cUw6PF4yA7fgBs8F4221Ko+19QtZIijE53M2txRNODZ/XsXLdM3ifatbgGi65T0tAzAw3BmWdMtWmHHrvPk=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.21.0
Release Details
UpdatedMay 1, 2026, 9:10 a.m.
Changelog

Added

  • WCAG 2.2 accessibility audit and remediation (Sessions 1–3). Full codebase reviewed against all A and AA criteria. The following fixes were applied:

1.1.1 Non-text content

  • AppEmbed.vue: <iframe> now carries :title="label" so screen readers identify embedded apps (Chat, Files, Calendar, Deck).
  • MessageCard.vue: poll options now carry role="button", aria-pressed, aria-label, tabindex, and @keydown.enter/space handlers — keyboard and AT users can vote in polls.

1.3.1 Info and relationships

  • TeamWidgetGrid.vue: all 11 widget title <span> elements replaced with <h2> (margin/padding reset added to prevent browser defaults from breaking layout). Screen reader users can now navigate widgets by heading.
  • MessageCard.vue edit mode: bare <input> and <textarea> now have associated <label> elements linked by unique per-message id.

1.4.1 Use of color

  • MessageCard.vue: voted poll option now shows a CheckCircleOutline icon alongside the background highlight — vote state is no longer conveyed by colour alone.

1.4.3 Contrast — hardcoded colours

  • DeckWidget.vue: #0e7490 teal replaced with var(--color-info-text, var(--color-main-text)).
  • FilesFavoritesWidget.vue: #f6c342 gold replaced with var(--color-warning, #f6c342).
  • TeamWidgetGrid.vue: #1a1a1a on success/warning badges replaced with var(--color-success-text, #1a1a1a) and var(--color-warning-text, #1a1a1a).

2.1.1 / 2.4.7 Keyboard access and focus visible

  • All 10 components with outline: none on :focus migrated to :focus-visible with 2px solid var(--color-primary-element) ring. Mouse/touch users are unaffected; keyboard users now see focus indicators.
  • App.vue: duplicate :focus-visible blocks consolidated; outline: none removed.
  • TeamTabBar.vue: role="tablist", role="tab", and aria-selected added to all tab buttons. Tab/Shift+Tab moves focus; Left/Right arrow reorders the focused tab and restores focus after re-render via $nextTick.
  • TeamWidgetGrid.vue (edit mode): all 11 drag handles gain tabindex="0" and @keydown handlers for ↑ ↓ ← → to move widgets on the grid. moveWidget() swaps positions with the neighbour in sorted order (fixes vue-grid-layout vertical compaction cancelling y ± 1 nudges).

2.4.6 Headings and labels

  • Same as 1.3.1 widget <h2> and edit input <label> changes above.

2.5.7 Dragging movements

  • Tab bar: Left/Right arrow keys on focused tab provide a keyboard alternative to drag-to-reorder (WCAG requires a pointer/keyboard alternative).
  • Widget grid: ↑ ↓ ← → on focused drag handle provide a keyboard alternative to grid drag-and-drop.

4.1.2 Name, role, value

  • TeamTabBar.vue: role="tablist" + aria-label="Team navigation" on wrapper; role="tab" + aria-selected on each button tab; web link tabs correctly excluded from tab role.
  • TeamWidgetGrid.vue: all 11 collapse/expand buttons now include the widget name in their aria-label (e.g. "Collapse Team Messages" instead of "Collapse").
  • AppEmbed.vue: <iframe title> fix (see 1.1.1).

4.1.3 Status messages

  • PostMessageForm.vue: attachment list wrapped in aria-live="polite" aria-atomic="false" — upload status changes (Uploading…, ✓, error) are now announced to screen readers. Checkmark symbol given :aria-label="Upload complete".

Security

  • renderMarkdown (pre-existing): v-html binding in MessageCard.vue and CommentsSection.vue renders user content without HTML sanitization. Logged as open issue for a dedicated security session — fix requires DOMPurify.sanitize() before return.

Removed

  • Debug console.log calls in TeamWidgetGrid.vue (moveWidget) and TeamTabBar.vue (moveTabLeft, moveTabRight).

Fixed

  • Double margin-top gap below NC top bar. NC page frame and NcContent both applied margin-top: var(--header-height) to the same element. Added #content-vue.app-teamhub { margin-top: 0 } to zero the page-frame copy only.
  • TypeError: e.n is not a function on team pages. translatePlural imported at module scope is invisible to Vue 2 templates — added n to methods: { t, n } in all five affected components; AdminSettings gets an inline n() method matching its existing t() pattern.

Changed

  • All error messages use {error} named placeholder instead of string concatenation. Allows translators to reposition the error detail within the sentence (22 call sites across 10 components).
  • All count-bearing strings converted to n() plural forms (14 strings across 5 components). Translators can now supply correct plural rules per language.

Added

  • Transifex plumbing. .tx/config and .l10nignore added. Stale l10n/en.js / l10n/en.json removed. Ready for NC community bot once @nextcloud-bot is invited to the repo.
  • TRANSLATORS: hints on ambiguous strings: Comment, Leave, Join (team vs. meeting), poll vote labels.
  • Translation standards added to SKILLS.md — every string written in future sessions must be translation-ready immediately.

Removed

  • Debug logging purged. 23 JS (console.log / console.error) and 15 PHP (error_log) calls removed across App.vue, FeedbackModal.vue, FilesSharedWidget.vue, TeamView.vue, FeedbackController.php, FeedbackService.php, TeamService.php, TelemetryService.php. The console.warn in TeamView.menuItemUrl() is intentionally kept as a security signal.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturenE6/JanHZPI2gJOiWJZMk28BvA/IenxP9ttZTLP8ukJhVHLtgEHDouOj6MlHhkol7j765YIdplWXD0snC26zoEjqGIeATPoVLA5C4s72+scF+8yA+ABvUZqoI0objebJsNj9vv4e35pMiFRYFjyxcqsepO9SZUd1h6OjJvd9HhLb+FGQ3XWUfhby3fASPzXUHADRgTSFALVT8uKoKBIT6N6RNsmtwZugGGt9sRJclHoFjYtjuw3taOU7IFSU0nzMeY0knJWJQqOiFHqPK02qA6+y1FSqROoxdmh5DzfXT2Lq82tep8PWNaIjy+eZnSPzZ7yMftzsUuw7Op2dt8IhIoeWlcBML4h4voLwnfSBvv4Y1iupF5NupORVXYQbCRwmGBNfpMV3giQAYLitqCBpEzshO22fwTas7ipF9ERzl8Xjnr+kC/FHRwsGaq86iE9uSeEbebDTRS0S1iQJ2QO3uefGq0ak/+D3fbeaEHEZTkmSZ+IHWsrPoPCj+hDThe812ymYqyN6AoCS688N60mHIGUETeN69fCDXFHWylumRxkdCIS9y9g5OtQTVXrKNNfui75jlQcjhQp8DH6aSWBZNIUSFEUw4D+TiXlOfwCJVHEQUxG0mIHvXMyMGS1HUmj0u5/5U3RFxjZeELbUxBdUE6Y39z7mWcI82aLrAf7PHFY=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.20.1
Release Details
UpdatedApril 30, 2026, 11:36 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureQ76CfO42b16YE6NfBvItjvR78K1DPxanhH91XK8A7vyu03DdXe7OUTFmHfzDd0Rrd0V3K8d+/ss0K8d3VUxJ8awlTx0OPmbQ46R+Q4Ar7SiQPOFhn+pi2JFJmQ/okVKIt1ltSZFY+rinZvOy7IrbONsPxD7EWiiE+3ES9wvNVBwvV0vByOQjLvZcMuOekOJmuqGQxAkiGMr/hYPCG9hYUUjjM140GgbKxpy5AR5zEEARvY1E8up0BNapKTdTEaxHq5kYuv708iGtmpuqQ74W0kXi39e0e3q5Ct3iaWo7ZTv3fVMa9UPxM919JoFSw41MDxReeILrujP/mfdgDJc870Heoi74URx8KM7lq1k8Oq2137OVmJFdmaZb1X6GFBozBOFQBWfIAuWg3b8PD7qxy49Qv8bFruv45eAsMtopCjOqrWICqteqyGNkZx1+VLB0yhzXvvkCRRD3ug4tgVwQ7G3gaLhWW1nrt/N1xrCRXaTk0XumsrprLn0ky1aK+i7mKyUsY4HA1C+C21pJ8lgwL8wjmo4Dm3OA5bZ/Fht2lO0YBKJGrt81BshzPYICFVb4pa8F5ESVyN6iaI3UmzvUHrSKYaOlfhhMWs1GsCo3ayDJ7I/iTmTHhltY6uicMp609IA6RTYQ9xVZ3bpaX3gkEGvvyTUY0dUFJdt5bnJP9iE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.18.3
Release Details
UpdatedApril 29, 2026, 12:15 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureBbSeggogNn0JPG7UmMXVzr1S9eGLRgtmaNwEg6Yo8UenbN4JWPjazn+m78aXajFSeh6jbmkpYR5WS7siW2o1xYVqqWTT4/ollugaFrvcDLi9moShgbqcFpi345PSRshFSaFNgIFCcdy4BBGhkVq17dkZRF9vRELuwtsHE+EsAtC4cg0K1x7fhDZ8AbrVUcWthvCAU7mqq/CDbI5QLMHFH/niUjZfxld01piActRQW51/eiXx7RvpY1XIUUd1JJtZjkcLEUpIojQb5Y6vFWnManLZHJ14Y0FC5WJyFvNXszE9twaUCI0ZtnurdSIogtJenXpPCGE397gx0r1KXwDnlXKJIHTNP81xiYQrxsLp6TjDabK9JIz1I6Mv6WVRZbk8O/fZNntQFJDKc+Lwp8d2WD8gEmOXRpvVsOjAuE1WqClJYJZi6MFY0y4H9/iLE7qi2cNj4kP4wdzGupaUWW6J4VprIRNAzSOqERdCLna82JvkMxU1tLiG6hFVmYc5F5QagWPEQlta7IWVmR4/07gZnu029Ec45hrrDyq96wiD5WAA0uqAcL2kir82l8vLeT/4a3uxAWf6YwMF7KldyJZhfoh1gA+uE8vEvKfUFBCDesKclXPsH+Wg4CP0eILT/h2LZ0J3lAd8HmdJnH6hmXp9wx7CxHrGRZYUdixix+59c5Y=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.15.0
Release Details
UpdatedApril 28, 2026, 2:21 p.m.
Changelog

Fixed

  • Calendar widget now reloads automatically after adding an event, scheduling a meeting, or creating a team meeting — all three modal close handlers now call refreshCalendar() via the widget grid ref.
  • Meeting notes public share link now grants read+write access (was read-only), so attendees can edit the notes file directly from the shared link.
  • @nextcloud/vue no longer logs "missing appName / appVersion" console errors — webpack.DefinePlugin now injects appName and appVersion as compile-time bare globals, which is what the library reads at module evaluation time.
  • Members widget: removed redundant border-top from .teamhub-memberships-list; Show all button width set to 90%; left-side padding unified to 12px across avatar stack, membership rows, and show-all button.
  • Removed redundant "Team Messages" heading from the message stream body (the accordion header already shows this label).
  • Removed duplicate "Post First Message" button from the empty-state — the header-level "+ Post Message" button already handles this.
  • All semantic color text uses (--color-error, --color-success, --color-warning) replaced with their high-contrast -text variants across 21 components, improving readability. Backgrounds and borders retain the base variables.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatureo9VGOkozPXYywaP2ZC3o2UICAIdsFUEdehNKJF0GKdgPgzMvL1Slkyeg9XI0ZiY+cw/Uu6rccUulLDeKWR+2iLRpDQb7iNg2ZCL8QgXYi5AjuO9diTPAqrywyowNNXV8gfFpJXJQ3DqEvkXQVptMXM1A5wNXjybgKAQAnTNSlrF+r4HvT/MJHomrojrDn2yCaHyhI5ER47B2YevI+CqWkKC2RFPwrcptBKVi62tk8VGVarMy9/Vrrp7zLbx8M5oZbVcLhdB7zIUerujkchkr2olx+SKYdNmdQ92tkw3kW584WiCqY6fsfLMD3PSRwHqiH3ScVFIXEHYIMeEphCnXukTwik9c4Vd3C/gAjV08K7Ii8ll9Yh4gt7uIMOfRx1o0HYDyMXqnFHlCnAalzN8UIkq+EXJ/i56lETuFvx0gnW8sxVmziuHpn76pjs9ZG1bVsPDSdwMKA1MwdnIt+pkaY7w9nB+25r7Nz7NMVgv9SvDxhMTo9zUGc1ncpnQ+xIqeEm2uCj+OPxjuYkAJ/vlSuzrdcxALAmzpecxR9J4CwZ+cnq9yJZoXIUMSnt694gd58/KsVAaHlI+cSVaPPZz/M26BwF5DJoWBdl+0fTVQ25WzciKzJ+pvmJAvH3KD3TxJKT0W2XTOWeoUfhzsv+nt47eDgDxvD8LUK1WxAtE0axw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.13.0
Release Details
UpdatedApril 24, 2026, 10:02 a.m.
Changelog

Added

  • Group and team members are now fully recognised. When a Nextcloud group or another team is added to a team, its users count towards the team's member total and gain access to the team. The members widget shows direct users as avatars (up to 16, sorted by role then last activity), followed by a flat list of added groups and teams with a GROUP or TEAM pill and their user count. A "Show all N members" link opens a searchable modal listing every effective user, deduplicated.
  • Manage Team → Members tab displays three buckets: Direct Members, Groups & Teams (with name and effective user count), and Pending Join Requests. Admins can remove whole groups or teams, which also clears their users' indirect access.
  • Invite modal can now search for and add other user-created teams (circles) in addition to users, groups, email invites, and federated contacts.
  • New GET /api/v1/teams/{teamId}/members/all endpoint — returns the flat deduplicated list of all effective users (direct plus expanded from groups and sub-teams) for the Show All modal. Requires member-level access.
  • New GET /api/v1/teams/{teamId}/members/manage endpoint — structured response (direct, groups, circles, effective_count) for the Manage Team members tab. Requires admin-level access.
  • BrowseTeamsView teams now return an isDirectMember flag so indirect members see a disabled Leave button with an explanatory tooltip rather than being allowed to "leave" a team they were never directly added to.
  • leaveTeam now detects indirect membership and returns a 403 with an indirect_member sentinel so the UI can show the tooltip explanation.

Changed

  • The GET /api/v1/teams/{teamId}/members response shape changed from a flat array to {members, memberships, effective_count, has_more, is_direct_member}. members is limited to the top 16 direct users (sorted by role then last login), memberships is the flat list of added groups and teams for the widget.
  • Admin Settings → Maintenance team member count column now reflects effective membership (direct users plus users from added groups and sub-teams) instead of only the three top-level rows in circles_member.
  • removeMember() now correctly handles groups (user_type=2) and teams (user_type=16) by using single_id as the delete key. It also calls MembershipService::onUpdate() after deletion so removed indirect users actually disappear from share pickers.
  • Pending Join Requests in Manage Team has extra top padding to separate it from the membership summary.
  • Group and Team icons/pills use the primary-element (blue) and warning (amber) tones respectively — the previous success-green was too low-contrast.

Fixed

  • Integrity check in Admin Settings → Maintenance no longer flags teams as mismatched just because they have a group or sub-team as a member. It now flags only teams whose circles_membership cache is genuinely empty while direct members exist.
  • getTeamMembers no longer fails on the u.last_login column (which does not exist on oc_users); last-login sorting now reads from oc_user_preferences / oc_preferences.
  • browseAllTeams correctly detects membership via groups or sub-teams in addition to direct rows.

Security

  • getTeamMembers now enforces requireMemberLevel — previously any authenticated user could enumerate any team's member list by guessing a circle ID.
  • lastLogin timestamps (used internally for sort order) are stripped from the members response so they are never exposed to the client.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturea3Sq1npOxTnT7aLDRXv66RWwUdOWvy5yXVlPPHePce9JRxddfqvN4FS4p+bnjFEdkKQmlFNDNzZ97aJmEZb1Kfzb+xpX6WzgDfJe1gTYUhE3XYHBchxclwCzPC/fwdymmrjwwP9b/1q9fH26FRdFciFUmHQO9Z24g696GnkGwApfohzX2U0jd4v55cx1e+vs86SZRWY26tkUm/FXD5+d+bl4FAkDhiK+Z06hFOuuocBhqyt2obf/gohkgTnEZpaHzkaAdgJFvvvRo+azlxGzODk4mqtyZIEDUWbAXQ99vRXZAokuwRrizBbXqbVk5sn3ntgG5rq0NWoYJ3htqhdhqqMh7w6SW/XBD5cGvLZu7BZpfvFLThabB7aZktNZhmVWz3U81C+WjYVhlcKcXPxEeQXXwo+LjSpGNmjkBg2bOsNEnVcYx3LhWsmbqRNf6JH8B0kcERqJcBWRbpthg/ytseDLsFHDX76QmHMb7/r6IKwq3EjaJSpLcuMgYAE0/ad8BtR54j/rWN1AsPD3oj3UfElHO5A27R/Xdu5qwzTd9zpWDRDgp3NE+2a6ler1WpgJtuTXEv+TGCURUK9srKLcpB+QGO/J26pFhqQovLEP72uL3kW8zXDlNW51++6uJJsrE1212s6JzPLSV1jntOrB+exnyQMV9sbNEVVzwyaqonA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.12.0
Release Details
UpdatedApril 23, 2026, 6:50 a.m.
Changelog

Added

  • Shared Files widget — new dashboard widget showing files and folders that team members have shared directly with the team circle (e.g. from Nextcloud Notes or Files). Displays item name, type icon (including a dedicated note icon for .md files), sharer display name with avatar, and share date. Paginated at 10 items per page, sorted newest first.
  • New GET /api/v1/teams/{teamId}/files/shared endpoint — returns paginated list of files/folders shared with the team circle, excluding the team folder itself. Accepts page and limit query parameters.
  • New shared_files app toggle in the Team Apps section of Manage Team — defaults to off; team owners enable it explicitly. Independent of the Files (team folder) toggle.

Fixed

  • Fixed team folder query in ResourceService incorrectly picking up individual file shares (e.g. Notes shares) as the team folder when no folder was configured — query now filters on item_type = 'folder'.
  • Fixed shared_files toggle defaulting to on in Manage Team UI for teams that had no saved state yet — default is now off.

Added

  • Upcoming Tasks widget now shows personal tasks alongside Deck tasks. When the NC Tasks app is installed and the team has a calendar, VTODO tasks from the team calendar are fetched server-side (Sabre/VObject, direct DB query on calendarobjects) and merged with Deck cards into a single sorted list. Each task row shows a source pill — blue "Deck" or teal "Personal task" — so users can distinguish at a glance. The two task types also use different badge icons.
  • New GET /api/v1/teams/{teamId}/tasks endpoint — returns upcoming (≤14 days, non-completed) VTODO tasks from the team calendar.
  • New POST /api/v1/teams/{teamId}/tasks endpoint — creates a VTODO in the team calendar via CalDavBackend (QB fallback if unavailable).
  • New Create personal task action in the Upcoming Tasks widget header, which opens a modal (title, optional description, optional due date/time). Shown only when Tasks app is installed and team has a calendar.
  • The existing Add task action renamed to Create Deck task to distinguish it from personal tasks. Shown only when team has a Deck board.
  • resources payload from GET /teams/{teamId}/resources now includes a tasks: bool flag indicating whether the NC Tasks app is installed.
  • New AddPersonalTaskModal.vue component.
  • New lib/Service/TaskService.php service.
  • New migration Version000310001 — ensures teamhub_integ_registry exists and drops the legacy teamhub_integration_registry table if it survived an NC uninstall. Fixes a scenario where NC's "delete all data" uninstall keeps migration history, causing the new-name table to never be created on reinstall.

Fixed

  • Fixed oc_teamhub_integ_registry does not exist error on installs where NC's uninstall-with-delete-data flow preserved migration history, causing migration 000209000 to be skipped on reinstall while the old teamhub_integration_registry table survived.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureSgfXebprj3dl8qsJCiO/pE+phwLvcTd5NcSGL2buF71GuT7a/fqkQWJ0XTwULl70Dw7D4/wJbMX9+fLnwXK/VvfRS1S1UNa8VUtCiuUJU4f4hjrnxYWuBT6oledtiXpb8fVeB46bTzwVJXTc57HHMm4Fz6L/rjutbeu07fLe5dNIAVXUL8niOfGyeMhBLijQDAsvlcOgBvpFXSqHscgF7IwOYTJdRqoyvAJQZgoxdlffHLnL5isK+GnjJCQXt6WzIxhiHbkMQlr+SwjPdvqo5UcvRCAHoiMS6sVQFmt1TJAHzygxHBK2g58Gv4NRvm/HszdMxCbkJVpgZFeqTO/WOrNTQaIiWIHGlK2XWoVVZetF0vvSlOynOXQqS9SVHmvOhfdH594EN1kwALAckCSdIvaeIdJpA3AgeS5er9GPMQI6lRWX6gP9H6WLAFGSFLjY6HpJvcr8mXBUGLzZWjnqd2w/WzDyGf/SfwMvf7NrgrmkEbkxEkRXYtUxkjJhlIX/g6vQicisTwHViMbO1orUbP6DvXcoXWGcu9iwlnumGSrMFbBwDsP/163U7kO52RjXg4tRxpZ2G0UOzKKx5Nc7TUA87bkxLO3SjC5yL536poI+22uNYSoWsxQpk9KGsVi0xiaLLms53Kp4KnXU7LPMQ+ZAlpb3U63sBLVkRHQhstg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.11.0
Release Details
UpdatedApril 22, 2026, 9:04 a.m.
Changelog

Added

  • Upcoming Tasks widget now shows personal tasks alongside Deck tasks. When the NC Tasks app is installed and the team has a calendar, VTODO tasks from the team calendar are fetched server-side (Sabre/VObject, direct DB query on calendarobjects) and merged with Deck cards into a single sorted list. Each task row shows a source pill — blue "Deck" or teal "Personal task" — so users can distinguish at a glance. The two task types also use different badge icons.
  • New GET /api/v1/teams/{teamId}/tasks endpoint — returns upcoming (≤14 days, non-completed) VTODO tasks from the team calendar.
  • New POST /api/v1/teams/{teamId}/tasks endpoint — creates a VTODO in the team calendar via CalDavBackend (QB fallback if unavailable).
  • New Create personal task action in the Upcoming Tasks widget header, which opens a modal (title, optional description, optional due date/time). Shown only when Tasks app is installed and team has a calendar.
  • The existing Add task action renamed to Create Deck task to distinguish it from personal tasks. Shown only when team has a Deck board.
  • resources payload from GET /teams/{teamId}/resources now includes a tasks: bool flag indicating whether the NC Tasks app is installed.
  • New AddPersonalTaskModal.vue component.
  • New lib/Service/TaskService.php service.
  • New migration Version000310001 — ensures teamhub_integ_registry exists and drops the legacy teamhub_integration_registry table if it survived an NC uninstall. Fixes a scenario where NC's "delete all data" uninstall keeps migration history, causing the new-name table to never be created on reinstall.

Fixed

  • Fixed oc_teamhub_integ_registry does not exist error on installs where NC's uninstall-with-delete-data flow preserved migration history, causing migration 000209000 to be skipped on reinstall while the old teamhub_integration_registry table survived.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureP+5/blvdXpd4uoReE5CvW4k1/WbnStC9vXXjXI3Tvi8B47QV8Dej4K2Wi+1wXxFQ8zQw/i+nuz4/ZzQSwSPnjzzpbQaNRo12s/x+9pb+MsBprGSUENMK3s8vwutV5QoiD5QLM/rxq7+ysdw47AwQbM+4+VGK/a2tAhuO2H7Q3x8nqRmJCSIZewc9D6ihBpQ5Sue3ywJIKFv8X73guc8LPSxhY+YnmW3Mc2bBdsxbUamsF9EZfkSVA9zebC455uSwufPZKLaWlBltydLWyZrhFZOU8aC4QeirMYCXovzThRQNk8hwkdppc4Gb737JqrVrC4uL/AMIPrTsJ4PcAuLDsmM0E/ZHbmpPBZ8wWDfMZKS3tHZM5K/2My3Sv7W3NhkQIzMuh2yNDAcw5r2B20mu34nSvATXTm3qacGBRmbLq9dfdMkEWMenTHtBzjWlVm0s0A03+gv68lasrzv7moyzlrjk1V6i3UuEo5XAGZCJSITQb0+RJAaIHmGqOBCu0UggevHuOqOMUwFl9aa4MbGa3BwxamSt5rfii22L0bWVHtFeiCaWZGfrhTJNM1WhRd134ha+puHWKpMWv8cxTxWA6FyycE4i+H+KR6yyvLpL3viVGPm+24BzSk3GPHdfEetvu2/H7WX1vnTR8NBzKt8dHxAj0YSegXYFaPF+0EO0fEo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.10.1
Release Details
UpdatedApril 21, 2026, 1:22 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureSxVjtNOVjWRSbm2YIc1M9cvaHIgVbVJbMJcD6FMStLGHteX8VzmSeEq+gpTZTER2VsyukDvVKRWOW3TXPTyzWF3UuC8mZSpEaK4bGHi83B3natM149njVrYyxy0BawErj4YH3VlvPzl4ok8z5hwAFWKGyFNJ2CulO2lsUfwDnhhLsvRAIjZzX+KZ2C99byqV3qFRnWo3kI+JT5PpE5+ug8T3KImQYKwGuMDq6+zFF2Qi+edECt+5TiO/rr3MFCZvSwwlwaNOEnCUjpA5wcwreGKqP2IpDJi+TwzjcJ5Mlmh6/qNjdTTkZ1tRvH5zKrZRHxAqSH0T40TMQM/N3huouEQE+fqHfJXgJXy3t99UrpWUfY9SX/rLWPQCkzgco353IBY1YTacz/cCH2yVlrTMty+EmU4iTOo2876PutuV43kDSytBtGzinCY78vrZ6D99fl/UkU5fsdVFVh91FZiPyd/JnCgTl59rm32K6rEhUmaMeXvKjl8CTuWKc6Z0TZ6qS/GPjeAVxHlpzRMIkhbjMOGnlWAKAlabDRIxZf+SSNazjnI8SFkOUOo5yCIoxMF9GjboNA81NkIg6PYdEaiooPTXiGbOd7cmuh4FNPWiniG06hn+BXX9jpO3zJNTKbmxP4g4dyWMm2923/miX93CtmyhsYWn2OcjX+YLLf78TgQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.9.2
Release Details
UpdatedApril 21, 2026, 11:15 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureVqSPboP020ssz+waXZIgJ+LTvo3hMESzHvMEKUi5BrRSPiplINi3X1Etr3zo/IQIgyv7BvaMYyjNs33q4jz8Y5oaawenqkCDw6XrV8F34rYPZbW0AabIGOAw1Ghy7Qg3mlbkq+GydCzfAMiEHro9sfi1C6kffOdijPwNm3EWPGurR7ERfDa19qeEfqoEU3Ni+//+AnwrL+rP+jf9pYM+q+/49CxT1zs53TqMTZyihHnVNbxOLCR7sgJtTVHR9NBR2HjEhFt73nxFBFn3b3j6OwoIgUX2l2lQR254lB/mgs4uD510an48qHLsYbE72Ph+LM+x8g7NtsLKbzyM24dA2+mL8PiwJhZUCfTFpbPVuiSX6OESUBbml7pgqFFv0dA8FD4gtqxKErPvD7CMaXR4mGrkit8bkkfReObVjBQZyCVl1S9q9Sj1ckfJpUlR5jmBfY39QzY3Bv/+V0cvqxxC+P25xmbvh6VHbnBMcJ9uxs4XW1lhjqvvJFTHS3nJJeQX/tm/q9k2qjnvLEe8nliMc7k0NtZxXdJI4pBPawvBaM5T91AKvzpKWrzmzIxTOWYT0HmgSm6cPPT/EBZl/YaXTO4a5xSNmCljGn0uo7bDiWtwcFNUuzCXG7FirlkyxiOkNv6DaZMXczzv89o0vMubHotd/OzddrXphSIrvkfA+Xg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.9.1
Release Details
UpdatedApril 21, 2026, 9:46 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturemX7RsaWak2BPhu44QNActtv1oaoiKlo5vmrzmf+iPPoJPMw0cAXoq2UcPpHnsrPme+mCOiDv+yETlWFSPdesr9U3ffdI56rxQMRqkgAv5QErwwE/jqqyte15iT2wHFrEF6aCn8NnF9bIElrCfmdL8kPwEKbgcrUBom/cQRFlWbqnmd6QRzqY+bevPIx6fXaA4ZTQbuGaR1PikE2Tskm0ETCtHf05Axg6eJ+fjgHAdR/bgsl2/2+giwe3fmoyPaC0GVsuoTmGjduMSPaUINC1hA7NPKM2aHBLvXYcGqNzKF6Wtr+la8VqOq4akwYoSlGvWOQ5uw3gTCubRhDRmMrxb6t1QABD7CseBzMKjTv/Z+ib62hrEj5IoP/qRdiovYZVJQ+VQHw8pqBJqS+a014t5m1+h3nPpZTT1heoyR0qA44AXmGhqcCVCGcMuVAtw7trENCY17FbHradrLmEofCLxoGuCAuviFXQo+03kxTL3dc4pgUm6G1+/RoX5hM3jtYmi5tBmFmXLBT8qsr1ZEStRin8aLwKBr92oeejMhLvyPN4wryntUpq8FL3n+SERCsovIvuwmMw/MOuBrL16xEL0FRa/EKlqN5F5z9gtR+ckjap8/SLQDYu7jbZUD3CGjKJbsaCeKv/Lbsw/tDqe/ZXeg7cZaq2tlPTN3g2kFah/Ek=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.9.0
Release Details
UpdatedApril 21, 2026, 8:24 a.m.
Changelog

Fixed

  • Fixed fresh-install failure: teamhub_team_apps.enabled was declared BOOLEAN NOT NULL which Doctrine rejects when storing false on MySQL/MariaDB; changed to SMALLINT NOT NULL DEFAULT 1.
  • Fixed same BOOLEAN/NOT NULL issue on teamhub_integration_registry.is_builtin; changed to SMALLINT NOT NULL DEFAULT 0.
  • Added migration Version000300801 to apply both column type fixes to existing installations.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureVWWGR5wGqe3Eax5KKz+AQ9nvFxwwNzPj4Zsqen4x72T9rHc242F+i+eaIMt/ae1/SelQGyv18ckoH5xA+eZEF+PzJj5vmcq2Zwx+PwlLTD+ieyRfaFcVc0kkYXTqMKa6/laXrNrwHuBHRsG+5wyJLkXm78H2OG0HMCIm71b7x06pIxU/eN2i6pEcTaTajyUbxPd37FsGv591XzyRKZGK+Z1DZXdMI81aE1g68xGeQLpnkKLPjURMzw3NnqZkcJiiU+fhDggu4O32obgcc2MOgrOo+ciHNX+RKFxkdYLs/qZzbS/RDdjxvnE9U5eESH7hAXU/ww8k/vSdtxEU6vrSd94Mg3GDHhjjS9jj/tLJYCk0J3MQp6EJMVRIInhgNIJJf1VkoCJk2MkTdpgF/GWheW9SBVFD6+IbzR55Ss2OYQK42gXtuNItWBm9ZCvShB5bxnmL4JtZ5I9ZfmmxD6BuZFwAkvnDIe6bt7wnVt8rZ0F0X5f7PrEzFoNq5TnagELFx0Z7HM/8OxRXwOLJtblMZeEI+tFRKxlgSOcI4EBroGwsGQ6sHELNWbqD0XvQBxmjVGjAEXfjx5yp+xwmc5433StzDcu6ItEt8wJQYKQ91quGR1MjEKwwVqmzjtNX77lt2aSKzvy4ibb8g1Xa3uHCUd9PmtdzN9FiBK2G6Gj4flA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.8.0
Release Details
UpdatedApril 20, 2026, 7:08 p.m.
Changelog

Added

  • Telemetry payload expanded with six new anonymous metrics: nc_version, user_count, member_total, message_count, builtin_integrations (per-builtin-app team counts), and link_domains (custom-link hostname frequency map).
  • link_domains aggregates custom web-link URLs down to their bare lowercase hostname before sending — no paths, query strings, ports, fragments, localhost entries, or numeric IPs leave the instance.

Changed

  • GET /api/v1/admin/telemetry preview object now includes all new fields; admin UI automatically renders them via the existing JSON preview.
  • TelemetryService now depends on IUserManager for user counting.

Security

  • All new collection paths are read-only DB queries using QueryBuilder with named parameters — no new user-input surface.
  • No new endpoints; existing telemetry endpoint remains #[AuthorizedAdminSetting]-guarded.
<hr />

TeamHub v3.5 — Changes

Admin Maintenance tab — full teams grid

Replaced the old "Orphaned teams" section with a full teams management grid covering every user-created team on the NC instance. What it does: Paginated table with search by name, "orphans only" toggle, and per-page selector (10/20/50/100). Each row shows team name, description, member count, owner (display name + uid), and creation date. Two icon-only action buttons per row: set owner and delete.

<hr />

Set owner

Admin can assign any NC user as owner of any team — whether or not that user is currently a member.

Delete team (admin)

Admin can delete any team regardless of ownership. Cleans up all associated data before destroying the circle.

TeamHub v3.6 — Changes

Activity widget

Deck activity now scoped to the team's board only — card events (deck_card) and board events (deck_board) handled separately Talk activity scoped to the team's room via numeric room ID — eliminates cross-team bleed Calendar/DAV activity subject strings corrected to match real oc_activity values Friendly human-readable labels for all Deck, Calendar, and Circles activity subjects

Manage Team — Maintenance tab

"Danger Zone" tab renamed to "Maintenance" Transfer ownership added — team owner can promote any current team member to owner Ownership transfer requires two-step confirmation and demotes the current owner to admin Leave team now shows the real server error message (e.g. "Transfer ownership before leaving")

Admin Settings — Membership cache integrity

New section in the Maintenance tab: scan all teams for stale membership cache Compares circles_member (source of truth) against circles_membership (share picker cache) Per-team Repair button rebuilds the cache — fixes teams invisible to Files, Calendar and Deck share pickers

Files

Re-enabling the Files app for a team now works correctly Favourite Files and Recently Modified widgets no longer appear on teams without a connected Files resource

Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturegblBv20FJFNq/Q3H9jPQvNSRrs/neT76/CRFwCF6dL2UmGY2TAsKmh06rLTNssVtnttoSuD1vlgANctX1gukwUMRAAXpjp6tHRg8u0II0g9C6sdwaLRstUJGExDUxRr5sbbgVwvRDY2GducpZRWSAyNlTSanLLJl9Eb6YAviLXr5AUAmczvdNRCa40GrHhytUe2O+oMfPtQJliOtotxL47VWvOynucGMWlj6j5ZghCx6gkTazlmWTFQQ/5VOe3EqPZyel9YSGJ4TtXwLOgQHMrBo087M34nxklShndZR12uYeZJ72n81ycvpByC10YfhDwaife+W+TeZBVtTrvo4wmqD8wqbkFsrNdp8DvMSvlVBKtibdZleX89LUG5RTsFQelFaOQjz+4A0h/xp2AhsTUtRef3vRCZCcmARieLz+g2ZaYn5EWnYDCkIPjLe/Kl9KCamL24QaSFyjBfVKcYX6DbTRCUG5xBrsEuEDWnZ9HHTUWZJO5UiqVsfvvHIzWuZ9j2vmRbsPBbKs0dRkaqO/04pDqdZaL5GLqHWjkv4wz+wiOnnMDnNKOtpubvW2HHmRSf8/TGQdzmdvr5ha+tjbOYqCKj+YMYI1jR2PWfIzxWSqzUbUrPDN6r7uEm4/r+f9ydI706wPr/f6BQlPDjq8DOIBTUC3Pc9Xdyjx2xOEio=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.7.2
Release Details
UpdatedApril 20, 2026, 5:58 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureRbq64iwUhPtTjRur8beQ5RgKG0BP0V5/7JaxZYTvBH/PFPcDmjy7EILWhL6IHsowijr6XTZWQlFbL4YZKdPQyW0PJxIm65ECq7IbqNLYK24hL8O/N1HweSZhVd5Dls+3pj9uvvR7ysrfxEt/cYDtHMxn0Ts7HcEdPFX3ONUpithodHeI9dfmNZgz6Fxk9cn+l/Pczp+JuqFa2L2h6YBJzQszsjGlVd1PlUE031Dj/6kYqRC8mQy3qpje7Xm3l6AHU2JrqAD4f4/dsSst7Cojx1sB43sy5yHnO5dSYMoYOVrxKciNrbwk7jW3CoX6XJWhBwJzLN8QKBoLOlrYpEyjYJXj+SeOim39vOvq8dsL2DpeOAhoxUNAuKQC+A0Gv4XhdeSX1FYZXmC20tgXXDln//qXChvYbE6usUmFz0iH0jP2yxqKbj48TZDID7wOyGGX0WHzHmD+zMY/alrx2+jZBqm7+BaFHT9UvDrmY6uIDAWtdbMJO3EhK2Sdn+k5DqenejwYO0yF+o5mU+itgx2pmyNWTF9/B8FcoeZIJExjZBv9/AnW0nP0WgkwqR8JmpaaFObbBWhYLXpIskLmXAfkqvfnYA7yli2bf48LR6yCkARYV2T85lkndOgH6oH51quzNvF2J7o/QcSzC83r2QIln7n4BW/X9hR/yweUkZLDU5Q=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.7.1
Release Details
UpdatedApril 20, 2026, 5:20 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureoWjRFEQ/K3TmpTN0v0cyubM8gFWkzxa8wTKg+A4SGZYjJD4rQHOYb5JacVYVkzMAWM20Gso1z5774wa06Tlh4sShGxSvN76lBZIFQSgOwt2sCXOAnc+Ng+aCCQIxvZOqxSbD7qU1u4A6eDsOOAf3TNXof7N2w1WpzgaD38u0O3qP4F/qNYIbtOelWQ4bHwjrEo1Vx/ubytlASypuqY4rvX6vK0G+vqIsJ2fo13Vyl+s+G0kOhHvtbUgw0VCuk1tlqYU5ORW2XLxsLmGwOWL/cqBRKGmvp2+GJhCd0edluHSxdBTM//Eis/WwfMImT/X5IZ8zuysnXmsX4AeXb8S2wszrIJH+mPkDbWICAr+Et06lJP++vxM0VhWirUYIzkXjL6U6qtA7Z/SC1U3iWhUQwIuAfxRjxcWkyKtIcjUpCgPZX9lLVJGWDP6MtGoKaSJ1nIzyOOLnRdTIqoiDdd9ObMxEC5QpfY1m9wGCyZMahwYO/jkmPWRO9aJSJhmP4+TEIyGabGiKuRSpv/3BDSa6MdD5GPTxu9ST5j04fzXHq/XFPMT/oq1jZMiLou+Y/vdEN3azm2BK16+F5LGCN5+sY5oxDNk5TSftF0TGfrPklgjFPqcK2QVGISZatkwwFfILCVJ9ckpju9jkwMXAnejZmffq0ott5qbn0T8g++E9TAw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0

Nextcloud 32

TeamHub 3.74.8
Release Details
UpdatedJune 10, 2026, 5:33 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturedosUcnSDCPnIfdPQMImE1tA/3u7HScBdONLc0dqM6SNLRs/fmatvKrLyLBqyt9o8M+0L9htxkd9BLZlRyoorzSEBtM5Q2mt4e9VvTMUU3Qk/nWZPFu1UOJCMTWcGujPwGuBuO89cEpgmqU766ApX2df4fDrajuWVmKw1TNcmst7jBz0zWt/zvzruGkCZQp4xBmAoGd/WEXjk655ccLMhTJDvQiqKtDXMbuSTvewKm6uk5jUWQqIyBKj4B2jIlFv9YvnM5h4Vdwy77uO/xLHQ1VLWTR33T6EtlMJDuX9tFz8pu9hSEHy1Ntr6lkrOLQReyogrGQeBy3LP/pT67JaJ40hqvXAaBGVRntjzDISTN9uZ/hn0pBMDQr+v7Q73KuHWAXC+dNUpEpi0rD+6sX/GyHLdysgGtnds6dY7Fi77qp73GyRkDam2yQuzh1VU4iyJwJqdbpVqVtTcn+GP5dar9P3PuK5mnYhpcp3sdEEefNKWLXSNa7MOotGK33pT/DM8fJfFc0eTxq+/fWJBGCoUeaW5cFERyk26lWjb3sz5v3rsBqnB4ZYMitGMX/GG8Q4qabRsGDBd1y+FYwYEBvBSTxwG4MUViepZ3dprIPYqwOrMEdOpBVx+Eu2YQ29anjQYIStCc/TN45siD1FQPnUt7MDzWu33Cs234hWB1J8z0xo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.74.0
Release Details
UpdatedJune 9, 2026, 6:06 p.m.
Changelog

Added

  • Link Decision (Session C) — bidirectional decision ↔ decision linking with full UI in the detail panel.
  • New table teamhub_dec_links (17 chars ✓): one row per link with canonical ordering (decision_id_a < decision_id_b), unique index on the pair, indexes on team + both sides.
  • DecisionLink entity, DecisionLinkMapper (with findByDecisionId OR-query covering both sides), DecisionLinkService enforcing membership for read and decisions_action_min_level for create/delete.
  • 3 new endpoints: GET/POST/DELETE /api/v1/teams/{teamId}/decisions/{decisionId}/links[/{linkId}].
  • Detail-panel UI: linked-decisions section with peer title + level pill + status pill, click-to-jump navigation, gated "Link decision" button, search-as-you-type decision picker modal (reuses /decisions?q= endpoint with 250ms debounce, excludes self + already-linked peers).
  • Migration Version000373010Date20260609080000.
  • Audit events for task + decision link/unlink — 4 new transitions in DecisionAuditService::TRANSITIONS: task_linked, task_unlinked, decision_linked, decision_unlinked. Decision link/unlink events written to both decisions' audit trails.
  • Shared widget design tokens (src/styles/widget-tokens.css) — single source of truth loaded once from main.js. Defines hard-contrast brand palette (--th-color-{success,warning,error,neutral} + soft variants), typography scale (title 14/600, row primary 14/500, row meta 12/400, pill 10/700), spacing tokens (row padding 10px 14px, gap 12px), and shared utility classes: .th-widget__panel, .th-widget__title, .th-widget__rows, .th-widget__row (+ --clickable), .th-widget__row-icon, .th-widget__row-title, .th-widget__row-meta, .th-widget__state (+ --empty, --error), .th-widget__spinner, .th-widget__pill (+ --primary/--success/--warning/--error/--neutral, plus --outline variant).
  • peer_level field in decision-link list/create responses.

Changed

  • All 13 widgets refactored to consume the shared tokens — DecisionsWidget, DecisionsList, ActivityWidget, CalendarWidget, DeckWidget, FilesWidget, FilesFavoritesWidget, FilesRecentWidget, FilesSharedWidget, IntegrationWidget, IntravoxWidget, MembersWidget, MemberRow, MemberPresenceRow, ExternalWidgetItem. Loading/empty/error states unified to compact .th-widget__state rows with shared spinner. Hardcoded font-sizes replaced with tokens (kept only for genuinely widget-specific elements: calendar date badge, tab counter, action button). Soft NC colour vars (--color-success, --color-warning, --color-error and their text variants) replaced with hard-contrast --th-color-* tokens app-wide.
  • DecisionsList row simplified — impact and level pills removed from the meta line, category now rendered as plain text with small uppercase CATEGORY label prefix. Primary line uses size-driven hierarchy (14px medium) instead of bold.
  • Activity subject uses regular weight (400) — sentences read better unbolded; the rest of the app keeps medium weight on primary lines.
  • Detail-panel "Linked tasks", "Linked decisions", and "Source files" unified under one .th-dv__link-* row pattern — same border, hover, focus ring, spacing across all three. Solid-filled pills (no transparency / soft tints).
  • --th-color-warning darkened to #a05a00 for WCAG-AA 4.5:1 contrast against white pill text (was #c97a00, 3.34:1).
  • Removed dead deny-modal CSS (~70 lines) from DecisionsWidget — replaced by DecisionApprovalModal in Session B.
  • Link task button now uses LinkVariantIcon (matching Link decision) instead of PlusIcon.

Fixed

  • Focus indicators on .th-dv__link-row, .th-dv__link-remove, .th-dv__dec-picker-item-btn, and .th-widget__row--clickable — removed redundant outline: none that was followed by a re-set rule, then ensured each :focus-visible has a 2px primary-coloured outline visible (WCAG SC 2.4.7).
  • aria-live="polite" added to the linked-decisions list and decision-picker results so screen reader users hear async updates.

Security

  • New decision-link endpoints follow the membership + min-level pattern. listDecisionLinks requires team membership; createDecisionLink and deleteDecisionLink require decisions_action_min_level. Peer decisions must belong to the same team — cross-team linking rejected at the service boundary. All queries use OCP\DB\QueryBuilder with explicit PARAM_INT/PARAM_STR typing.
<hr />
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureTDim0CLEZfsAydY1VLm0k8FcVC0iVzhCWfdJr6K02pkRm5ZP4awSnXWlH/lg/9nIp/4eLtuBjhDSneW1uKN4sbnR0fGdlN+2aNcQOfjQMdBKt0sJ3KkzKx9krSwvQSV8+yL+wbIzwuHrLJ37jH2i6HdbAky3zemiCvahz1PS7XowNPXNOmEcv8VpbB6kGGaHBe2iobimS3FN55McetBQHvMQ9/7saeMf9tME0EHiW/gnNXwmJIAJLgpV2sFsijEsyHZCO49K2xBigfPBIZvN34FV98+fpO1f4mQDix6DyEEd+Q7qBhJcYAsmpIIUes3ll57yRVmrmcKazVH00zQTYNKChYLZ+2CARaUlWCf1EAwt5T1nibGNcenIiktIU9nmDAsgO4AGbQsw113E8/b+lgLk/6MZwFsE/nM1PzNn2GieDil1o1A6L3KYve7UxjQQ7vUW6QSvNdJQ9AouVe8+LTHEVnXGrmYAYH90K4ynbcQ/r9aIhzIOkHJrK/0hS5h0Ijh7+mv4CVkj6KAp6/5ShzmVWHXBbRiuIgzgkiuiT+oxGhQtvr7TAR0QhUIbEZKEAxI7esz+bMD4ilB66GpmntY+KzBXE8SBsvT2jXuhmv+1Hksxlz3Sz0hXY7lW5lJ4f3pOD+5nkP6uImk32DMm5QdJ9VW8+i7sBVqoVWyn4rc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.61.6
Release Details
UpdatedJune 1, 2026, 11:39 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatureq/68hJ4BHrU8556eubLlZeiw/qWj2F2wxFPx/ZUcryv70SSP+WtNyC1CLD6x7oNfzElWjF08FYQDxD7FuoRzFL6T1a0HzUVJQlL+XPlhW7zYIpS80INga7HQE2ddvmtsv1yw6YnvMER0UnSFtZYdtQwqTwD2kMkTBW0QdC/oqudRXRJpt65PG73yWQlQWU5snqzTvj+y8neHskKJu2kPnNOynBGhDPESlLzcD1lPz+sYnfA8ADONMsNDLEdzCGf5mK6qHlGX2tBu2HX7P+Y6j3/AhzFJWEdqtyR7YUztpwb1L/pdaX2aftzMjtpqeD5KCJ61WcZo3ZQZUb2LGSg0XYKZ8jKfHNaX3nmYcBuON2LR0H41RaqQ+Xo+2W7tO/sI2La/j9P2WG2QcgoEvB/lEQziNGdNrm772itYmOLb9WrN6Tr9t8EOp/SW1q8Jy1x3S5o0UZdu11gVabdUEm+du3IWs3Psud77lodkbcRsxu/9n6h8H417rA8kS+FCsSrXgI9wNjAGM8+WrtQ6SbI4+VGthMHWlUQaQhXzDMU4GE5+Fpt1B/3OjAbIXBbI937tnQwqmy09+/1xvGKJYqgMTWSOp0xl0pM2PeQia9DOmZY9DByJUBmwpV/4HKVgTp31yzc0GZXJCmDTodiVOds47VP2cqNo1uw/8CI/h9nXys4=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.61.0
Release Details
UpdatedMay 31, 2026, 1:32 p.m.
Changelog

Added

  • Message image cache. When a user inserts an image from their personal files, the new POST /api/v1/teams/{teamId}/messages/cache-image endpoint copies the file into .teamhub-cache/ inside the team folder. The cached copy is accessible to all team members via /core/preview (team folder is circle-shared). Survives if the posting user leaves the team.
  • Clear image cache. New DELETE /api/v1/teams/{teamId}/messages/image-cache endpoint (admin level). Exposed as a button in Manage Team → Messages tab with a count of files removed.
  • Attendees in AddEventModal. Team members can now be selected as attendees directly from the add-event modal. Server sends iTIP invitations identically to the meeting wizard. Self is excluded from the picker.
  • RoomVox room picker in AddEventModal. When RoomVox is installed and configured, the location field becomes a room picker; free-text fallback when no rooms are available.
  • Category field in AddEventModal. Comma-separated category tags, passed through to the calendar event.
  • Talk meeting toggle in AddEventModal.

Changed

  • AddEventModal consolidates ScheduleMeetingModal. Both modals used the same backend endpoint with minor field differences. Single modal now covers all simple event creation. ScheduleMeetingModal.vue is unused and can be removed.
  • @schedule-meeting event in TeamView now routes to showAddEvent (same consolidated modal).
  • Schedule Meeting action removed from the upcoming events calendar widget (desktop and tablet layouts).

Fixed

  • Images inserted from personal files were invisible to other team members. /core/preview?fileId=... enforces per-user ACL — other members got 404. Fixed by caching the file in the circle-shared team folder and using that copy's fileId.
  • Uploaded/attached images were invisible to other team members. Circle share was created correctly but the URL still used /core/preview. Fixed by using /apps/files_sharing/publicpreview?token=... (share-token-based, no per-user ACL check).
  • Pluralisation of "files removed" in cache clear confirmation now uses n() instead of a conditional string.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureBkg/1BS30q2A2ps/z2INdqmvkj94OGrfFXhTAEVFLP8V0w/yRX6Tfn7R73IlDfQBA+EN2I3Umj6Ctf0pTz1ZH3vZ5t7hlmQhmTfI/fZnXOesCax3pxx41doSGoWsI5ln5yk1GVq/gM8Py3KRpgG8Nq7i/ikk8w+ZXp7ollK8ZEBGoHtAZy6EISJZW27O3faprqbkwuqlX757DXgHHaAb7M9ZIT1c0xBdOZm1pCRNsqaMwLMe60RQQyLZxXVVq0J5oJk1JPHpgWzixtZodL4qzIlIpvbrPrIB5Bvo7buGi9yrBdVNuQzGFO08OWDlt2MpMbkWqbpIbFzT0lrdKYnSTBrXbyk60V+gyOl17J5774p28Gk5VLfsyzkEdHBwmbbUgWQUvbF+1XPxOqfFZ2Gmgj9RT7kZdnEkVOfxFQ5rtGdqBN+GjzH33cpxxy3TvaLjgcyzttzrn8KDoqFz5KGjo7BgfUnTMiX6c91B/T50JBNBA4tj7fj1l5HCbTf7ZuX80/W0qnMVhKfbnTwlVgYoq9GUkCnoz7eD/ufFHE12naxXmPCdkFgGbdP6GS3Ck8ddLMNhXLqcntF9WPc0SlUTxc/WE5A6wU52GyQ0euCatOx4ElETAeeJ4SD8qj81v6aB9rScThH82bed1fqlKeoYcaMybCx6kCMDtINkCo0+HeU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.57.2
Release Details
UpdatedMay 27, 2026, 6:50 a.m.
Changelog

Fixed

  • Admin settings: clicked tab no longer shows white-on-white. The active tab matched both the active-state override and the inactive-focus rule at equal CSS specificity; being later in source order, the inactive rule's white background won while the active rule's !important white text stayed — rendering an empty white box until focus moved elsewhere. The inactive-focus rule now excludes the active tab via :not(.teamhub-admin-tab--active).
  • Admin settings → Maintenance: team "Created" date no longer shows "Invalid Date". Two methods named formatDate existed in AdminSettings.vue; the second (expecting a Unix timestamp) silently overrode the first (for datetime strings), so the teams table's datetime-string creation value was multiplied as a number → NaN → "Invalid Date". Split into formatDate (datetime string, hardened to also accept ISO and numeric input) and formatUnixDate (Unix timestamp, used by the archive table).
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatureb6JwIPc5nZN1w4UIYKU60aB0c6m7HJ7CrbeOrvNBTEFSdAJeQcBKJvHd/6NAwvfWfZU53U4hW+vVOa/IN8eyTvee5aBGarefDPfiW/8OAAy3vJ7Ue2K/CDCqFP+dygfS5wTay0RCQ75X8LuXUkXS1i26iVR0PJOc8UbuyrQOnXu/P8WFHpWhReZWd8na9CDV11oZ8fCLGRtEPWcO5QczZbRFDI1plXQ/46lJhhqEGL8m8A7aV3ikjqzzTeugLoP1/RVR/dlIiYlRDfUKJUYpMvjWmcC920No72Nq06JKq5PjfSB4OPSFA54bI6rfv02Ipk6UixvOyqkAJA4/sH3Jxm72NATlxssHH8TGw7xZ0Nsfbp4LGR3c5kJmEhZ+Hkq2zHKtlGSlzOy3z2yoepGZgoNgg+gUb0VetnkfbhGDplW76F2lRePIwg9H3nJhFOma3AGQS4QnKR+t4V4Ec8gqlbnoIHGSuEPZMWpTicuU0ofvh/PHfiu8Dxk1v7jHYVtNdvrVkZPSFfzrx/IJX+HoGDq91KYoMJNrd8jRfFYWswalQ0cLzdCCw6iYHAxIyTpvGikEWlx1drtmQ3GJarvFT+qkpYhL7A+jBmCj1aUGSanGpozEn6eRk4BweOyAkld9h3cmM3Fvi1BujCbTT7Wnnvj5IJzmTB8CAGseaH/akdw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.48.0
Release Details
UpdatedMay 22, 2026, 2:02 p.m.
Changelog

Fixed

  • Presence module admin tab still visible when module is disabledtabs() computed in AdminSettings.vue now conditionally includes the Presence module tab only when form.presenceModuleEnabled is true. When the toggle is turned off, the tab is removed immediately and the active tab switches to Integrations if needed.
  • Team Info warning strip height and chevron — replaced "Open settings →" text with a ChevronRightIcon icon (consistent with DeckWidget unassigned-card nudge). Updated CSS to use line-height: 1.3 and icon-only button layout so the strip height matches the DeckWidget row exactly.

Added

  • docs/USER_GUIDE.md — comprehensive user guide covering: team navigation, tab bar, presence tab (team view), My Presence personal settings (weekly template + date overrides + calendar integration), team admin actions (members, settings, presence toggles, links, danger tab), and FAQ.

Changed

  • README.md — updated to include Presence module, Members widget presence dots, and updated admin settings section.
  • INSTALL.md — rewritten as a full NC Admin guide: installation, all admin settings tabs (including Presence module on/off, status types, locations, holidays), optional integrations table, background jobs table.
  • src/components/AdminSettings.vuetabs() gates presence tab on presenceModuleEnabled; toggle redirects away from presence tab when disabled.
  • src/components/TeamWidgetGrid.vue — warning button uses ChevronRightIcon; CSS tightened to match DeckWidget strip height.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturec1kXc8h5EzClzIXkf31zt8pGVXg3BuummH2w9N8T6IWSrfHpsBZuGYBqJcy0zwn/JXKRB5RkebdfuaE6LLwVOcqUlz15beSyi6Y6Fr+rkRXqQti8lzHYyJ9vtTzn963I4fEstaa8q0b9126Ts+UMTUe3rrS+/4kJV21dCiAui6GiPsdKzGp47QuNw0k9YiqSZ24NCu+6QsnoyrHvoQTwnrPHHIcZ/w7bG1VbtO9mob5Cq9bB0tS/zbNzzi9Jph3AZ3MtzGjx/4mZ4KR77DSC55OqDs9vfK0KW7+e45JbRFrtpHUldjgpXL/6MIsR3IYbif+/uVDTqghjUJtOLaQ4FsApnKesfqTchH4NE0jebUnpeToqGBGVERKvs9XrJ7F7Qnu5IsCqUhJ4B2xQmGADGWJUBlPOfKB+lH2lCtPSkDJzehylwrWOJtOtg9X7SARV+G0q379DtVbC2aHnj2DpN8BivVsZ8hsCgLDxiCcubqHVP1s3nAx0q00qMEdIZwIGA3IU/LRSp73V6ZqaL5JXYBtjVNBNqResl7Gr0IaFfe1++B6mVFY6L0iHgsTKVtZgBCPnudVXBDx+Y1inUuIGVtcm2YvsL+ed1QdCXkLxdyHa+Mvdu4zotE32LYzKyz6bsci3Uz/9xwvMWyD48nPc0UGtABCOw8UG16di/2NtzwE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.41.0
Release Details
UpdatedMay 18, 2026, 2:31 p.m.
Changelog

Added

  • Unassigned card nudge in Upcoming Tasks widget. Each connected Deck board now shows an amber row at the top of the widget listing the count of cards that have no assignee and are not yet overdue (no due date counts as not overdue). Clicking the row opens that board in the embedded Deck iframe — same behaviour as clicking the Deck tab. With multiple boards each board gets its own row, sorted by count descending.
  • Team-as-member support. One team can now be added as a sub-member of another team. A per-team toggle ("Prevent this team from being a member of another team") appears in Manage Team → Settings, using the same CFG_ROOT (8192) bit that Nextcloud Contacts uses — the two UIs are now in sync. Admins must enable the "Teams" invite type in Admin Settings → Invite Types before the invite picker shows teams. Teams with the prevention toggle checked are excluded from invite search results. The admin integrity check flags only the contradictory state (team is nested but also has prevention active).
  • Deck board activity in team activity widget. Deck board and card events now appear in the team activity feed. Includes board name and card title extracted from Nextcloud's own subjectparams JSON, producing descriptions like "Justin created card 'Fix login bug' — Sprint board".

Fixed

  • Critical: Deck activity was completely missing. ActivityService was checking $resources['deck']['board_id'] but deck became an array of board objects in 3.28.0, so this check silently failed for all installs. No Deck activity appeared in the widget regardless of how many boards were connected.
  • Critical: updateTeamConfig() used wrong bit mask. TeamService::updateTeamConfig() still had $MANAGED_BITS = 1|2|4|16|512 (pre-3.39.1 wrong values) as a local variable, overriding the canonical constant. Every toggle other than "Anyone can join" (CFG_OPEN=16 was in both old and new masks by coincidence) was silently discarded on save. Now uses CirclesConfig::MANAGED_BITS.
  • Critical: ManageTeamView config constants were the old pre-3.39.1 wrong values. Identical to the 3.39.1 bit-encoding bug: ManageTeamView.vue had its own local const CFG_OPEN = 1 block instead of importing from circlesConfig.js. Enabling "Anyone can join" was writing CFG_SINGLE (1) again, hiding the team from Contacts. Fixed by replacing the local constants with a proper import.
  • searchUsers() circle search used iLike() which does not exist on NC's QueryBuilder. The exception was caught silently, returning zero results for the circle type every time.
  • Deck board picker always opened the first board. Moving selectedDeckBoard to Vuex introduced a Vue 2 data/computed shadowing bug — the local data() property with value null won the name collision against the mapState computed getter, so deckUrl always fell back to resources.deck[0]. Fixed by removing the dead data declaration.
  • Integrity check falsely flagged all team-as-member relationships. The check now only flags nesting as an issue when the sub-team has CFG_ROOT set (prevention active) but is nested anyway — a genuinely contradictory state. Valid nesting (CFG_ROOT not set) is silently skipped.
  • PHP parse error in MemberService (3.40.1–3.40.3). The str_replace tool double-escaped backslashes when embedding PHP namespace separators, producing \\OCP\\DB\\... instead of \OCP\DB\.... Caused 500 on every MemberService-dependent endpoint.

Changed

  • "Prevent teams from being a member of another team" toggle now uses CFG_ROOT (8192) — the same bit Nextcloud Contacts uses — instead of CFG_CIRCLE_INVITE (16384). The two UIs now write the same bit with the same meaning and stay in sync.
  • fetchDeckTasks card-ID lookup changed from one OR clause per card to a single IN (board_ids) query + one IN (card_ids) clause in the main activity query. Scales better with many boards and large boards.
  • Activity formatSubject for Deck events now includes board name and card title when available (e.g. "Justin created card 'Fix login bug' — Sprint board").
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturep6LBsh++TW1EqF+MTvnOs6DGrDmygcM7b8y6mw+FEkpajSxEmmL3+PIaRlrp5whx0V+Oyxe5murZYLWDpbtVLsD76tLPJ4jk+CVpiCHlSbn6kBbERKaXDpf1UkCIir0wHxdRJ1btIsry1Hyv/0JhDzfrLKevuqicTRDpOY7zJ3gMd1Pl/PQgwjYlmiK/VApSyDVeniqEQN1iTwQjjPTq+gTo9NEtE0holECcKUEtU/FRZRHOtcNQQwUxJqtvqX3hieTg3ttDUt0wV2VK8NarlnGuuoXWwaF5YyyS/5BaLL1kYO+YAKy7SFHhAV/LeEkP/oLbcRUbBVbNRyno2vmcJgK+mPLczW88EqKblVkLfdiuvZGRLqP5nP1XtrPUhTzzLUvnPdWIBxNPz+FrcJN59NC8MTzR/SUgtU7sCRe8YNAAHf9JF3P/V0uxbYuICZUpS7+h+kPkTP0cblORVUSeQT/F+bC3Ys7fs8xwBs6dpvH77ye0bGAfXmwwB5UwfH8CwfJPGWtNDyti46QqXevr+nYd0cyWttpeU6znMFemtiPv7cgLHG97gdgedCEX0Rfw1UwyxwVECCQULMzn54atIpjSscewqBAUtSZT6Q1gOcfRQHgWEn8oC75mRdjz8/KAQrYiQU5pujdAWv4AEP1RfTJ1Zna+Zyc9SXsAXLFdXIo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.40.0
Release Details
UpdatedMay 17, 2026, 7:32 p.m.
Changelog

Fixed

Circles config bit encoding (was 3.39.1)

  • Critical: Circles config bit encoding. Every TeamHub release prior to 3.39.1 wrote the wrong Circles config bits when users toggled checkboxes in the Manage Team settings panel. Each TeamHub label was mapped to a bit that meant something completely different in Circles' real encoding. Consequences observed in production:
  • "Anyone can join" wrote bit 1 (real CFG_SINGLE) → Circles tagged the team as a personal identity circle → Contacts hid it.
  • "Visible to everyone" wrote bit 512 (real CFG_NO_OWNER) → Contacts refused config edits.
  • "Enforce password protection" wrote bit 16 (real CFG_OPEN) → team became open-join.
  • The always-on "Prevent sub-team membership" hint wrote bit 1024 (real CFG_HIDDEN) → team disappeared from listings.
  • Settings made via Contacts and TeamHub no longer round-tripped — each side read a different field of meaning from the same column.

This release corrects the bit encoding in both PHP and Vue, introduces canonical constants in lib/Constants/CirclesConfig.php (mirrored in src/constants/circlesConfig.js) so the drift cannot recur, and ships a one-shot migration (Version000339001) that decodes admin intent from the old (wrong) encoding and re-encodes with correct Circles bit values. Admin sees the same checkbox states before and after — only the underlying storage changes.

  • resolveUserSingleId() DB-join fallback was checking config & 2048 (which is CFG_BACKEND) thinking it was CFG_SINGLE. Now correctly uses config & 1.
  • browseAllTeams() CFG_VISIBLE filter was filtering on bit 512 (CFG_NO_OWNER) instead of bit 8 (real CFG_VISIBLE).
  • isOpen checks in browseAllTeams() and MemberService::requestJoinTeam() read bit 1 (CFG_SINGLE) instead of bit 16 (real CFG_OPEN).
  • Manage team → Settings tab now always reloads from the database when activated. Previously the checkboxes showed cached state and external changes (e.g. via Contacts) were not reflected until page refresh.

Unread message counter (was 3.39.2)

  • Unread message counter restored in sidebar. The NcCounterBubble badge next to team names was effectively dead: no polling caused team.unread to go stale immediately after page load, the counter was hardcoded to display "1" regardless of count, and team.unread was a boolean not a count. Fixed: backend returns a real per-team count, the badge displays the actual number, a 60-second background poll keeps badges current, and posting a message triggers an immediate refresh. Excludes own messages from the count.

Group invitations (was 3.39.6 → 3.39.14)

  • Inviting a group to a team now works correctly. Circles' addMember() was creating an Invited row with level=0 for non-user types (groups, circles), and Circles has no working notification path for group invitations — so groups stayed in permanent limbo and TeamHub's filters silently hid them. Fixed by auto-confirming group/circle membership immediately after addMember() succeeds (UPDATE to status='Member', level=1) and triggering a Circles membership cache rebuild so users in the group get immediate access to team resources.
  • @mention now works for indirect members (users added via a group). Multiple cascading bugs fixed:
  • getAllEffectiveMembers now correctly reads from circles_membership (Circles' denormalized cache) which contains every reachable user including those via groups, instead of attempting unreliable IGroupManager lookups by GID labels.
  • Frontend store correctly unwraps the {members: [...]} response shape (was treating it as a bare array and discarding the data).
  • Mention autocomplete supplements OCS results with team members that NC's user-enumeration privacy settings would normally hide.
  • Manage team → invite flow refreshes allEffectiveMembers in the store after adding a group so mentions work immediately.

Added

  • lib/Constants/CirclesConfig.php — single source of truth for Circles bit values, plus MANAGED_BITS, SYSTEM_BITS_FORBIDDEN_ON_USER_TEAMS, and the migrateLegacyConfig() decoder.
  • src/constants/circlesConfig.js — JS mirror of the same constants, imported by ManageTeamView.vue, CreateTeamView.vue, and TeamWidgetGrid.vue.
  • Reset config action (icon button) in admin settings → maintenance → per-team row. Clears all user-managed and forbidden-system bits to clean defaults. Confirmation dialog before applying.
  • Config bitmask integrity check in admin settings → maintenance. Scans every user-created team for forbidden system bits (CFG_SINGLE, CFG_SYSTEM, CFG_NO_OWNER, CFG_HIDDEN, CFG_BACKEND, CFG_APP). Per-team Repair button calls resetTeamConfig().
  • Three new API endpoints:
  • POST /api/v1/admin/maintenance/reset-team-config/{teamId} — clears user-managed and forbidden-system bits, returns { oldConfig, newConfig }. Logs to teamhub_audit_log.
  • GET /api/v1/admin/maintenance/config-check — returns array of teams with corrupted bits.
  • New Vuex state allEffectiveMembers + fetchAllEffectiveMembers action + UPDATE_UNREAD_COUNTS mutation + refreshUnreadCounts action.

Changed

  • repairMembershipCache() now strips every bit in SYSTEM_BITS_FORBIDDEN_ON_USER_TEAMS before rebuilding the cache.
  • updateTeamConfig() MANAGED_BITS mask updated to the correct Circles bit values (8 | 16 | 32 | 64 | 256 = 376).
  • TeamWidgetGrid.vue::teamLabels — labels now read from real Circles bits. The misleading "No nested teams" label removed.
  • CreateTeamView.vue — the "Prevent sub-team membership" checkbox removed entirely. It controlled nothing real and wrote CFG_HIDDEN.
  • Audit log event types: new team.config_reset, team.config_migrated_3_39_1, team.config_migrated_3_40_0.

Migration

  • Version000339001Date20260518000000 — one-shot data migration. For every source=16 team where any legacy-damage bit (1, 4, 512, 1024) is set, decodes admin intent from the old encoding and re-encodes with real Circles bits. Skips teams that have no legacy-damage bits. Logs every change to nextcloud.log and writes an audit log entry per team. Bursts Circles' APCu cache when done.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureGeQDw//MDpb0NtdSeSx4urPBtzDCZkP+xEB9nF5kRi3kZ2CigAJ/pJn2tgVVtjITIzJJJ37xowH4nueQhSZk5Y76gK/cHa3dPuGf0Usbwlr8BndOK6DdX1Z167TczCB13ZXU93YnfjVfUcfneTZJPyz/0iMbJs1tAF4nH0OzWDVmTYmiRtCFhHqtbFbFFkbSVOmoZjE1UNVPwDweNY0fPkusKS5beXTm0qaKXBhYXhakqhnxycweOfqH3JxjmCiz0aZbcdqdeNRCUw9bAJtK7Agp/xEwOv1PKTey4Q4i9VA7yDYg5lWhDKLalX72K0jdNUkXqbw2W1hawGzEOgcX2aFoV6MVaVPREoFng515ezHlpOWyC6xk7yOq8EsX40ypKOCdBJiHGPE82/GUnRLdeKkkkSrpygNdaH2FIS2STEIsswcyxXyUwJnVp3qZB6NrMZhjuoJ2eVQoqb5O+eM/UaiH+yEM4y5bt6rGsM9D5u4RbXZHdzd3iYo9Qnz6oidcb7NYZWYY7S3yYJqPWlpJ91ehgJ6+W/t5GL05ms++MrvmE+oxM6pBMXW/P+WSe9fb4ckW2aIGwdEUoyB2fsDMgPDg6ej7cHvWbB/EvvhSfUfXNJTjDteSH+W0TuL5Y5UNLUbXzJJiPHl1EbSPm3Cda3krOwRrIeJdRk/iCWlCIVc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.39.0
Release Details
UpdatedMay 15, 2026, 2:35 p.m.
Changelog

Added

  • Integrity check: nested team detection. Flags any circles_member row where a user-created team (source=16) is a member of another. Repair removes the offending row.
  • Integrity check: CFG_SINGLE corruption detection. Flags source=16 circles with bit 1024 set (causes Circles to hide the team from its own API). Excludes legitimate personal/system circles. Repair: clears the bit.
  • Integrity check: duplicate member detection. Flags circles where the same user_id appears more than once as a direct member. Repair: keeps highest-level row, deletes rest.
  • Integrity check: no-owner detection. Flags source=16 teams with no level=9 member row. Repair: promotes highest-level existing member, or inserts calling NC admin if team is empty.
  • Integrity check: wrong display_name detection. Flags circles where display_name ≠ sanitized_name — this causes Circles to misclassify user-created teams as personal circles. Repair: sets display_name = sanitized_name.
  • Link permissions. New linkMinLevel setting per team (member/moderator/admin, default admin). The + button in the tab bar is hidden for users below the required level. Configurable in Manage team → Permissions.
  • getTeamMemberUids() in MessageService. Direct DB member lookup for notifications — replaces Circles API getCircle() call in the message write path. Eliminates "Circle not found" 500 errors when posting to teams with config issues.

Changed

  • Manage team tab renamed: Messages → Permissions. Pin level, post level, and new link level settings consolidated here.
  • updateTeamConfig() no longer calls getCircle() for cache flush. The Circles API was triggering internal sync that re-applied CFG_SINGLE (1024) after every config write. Only APCu cache is flushed now.
  • CFG_SINGLE (1024) removed from MANAGED_BITS. This bit marks personal circles and must not be written to user-created teams. Frontend no longer sends it; backend no longer includes it in the write mask.
  • repairMembershipCache() auto-clears CFG_SINGLE before rebuilding the membership cache.
  • searchUsers() no longer returns teams/circles in invite search results. Inviting a team into another team corrupts Circles' visibility queries.
  • Orphaned teams query no longer requires app:circles: name prefix — compatible with NC33 which stores plain team names.
  • getAllTeams() deduplicates by unique_id — prevents duplicate rows when a circle has multiple level=9 member rows.
  • Ghost cleanup moved from its own tab into the Maintenance tab.

Fixed

  • PostgreSQL: backtick quoting in resolveUserSingleId() (c.\config`c.config`) caused syntax errors on PostgreSQL, breaking indirect member detection.
  • SQL HAVING clause for duplicate member detection used aliased COUNT() which MySQL rejects. Replaced with createFunction('COUNT(cm.id)').
  • InviteMemberModal no longer shows teams in search results (AccountMultiple icon removed, circle type branch removed).
  • ArchiveTeamModal displays resolved folder name instead of raw /f/{id} link.
  • Announcement banner (mohamedsakhri/nextcloud-announcementbanner) suppressed in iframes via .announcementbanner-stack CSS selector.
  • share_folder config.php respected when creating team folders (AIO and similar installations).

Added

  • Ghost member cleanup. New "Ghost cleanup" tab in Admin settings. Scans all team memberships for users whose NC account has been deleted, grouped by uid. Admin can remove a ghost from a single team or from all teams at once. Includes a live-account safety guard. Endpoint: GET /api/v1/admin/maintenance/ghost-members, DELETE /api/v1/admin/maintenance/ghost-members/{userId}.
  • share_folder config.php support. When an NC instance sets 'share_folder' => '/Shared' (or any path) in config.php (common in AIO installations), TeamHub creates the shared team folder inside that path. Falls back to the user root when the path is absent, missing, or not a folder.
  • Invite button in Manage team → Members tab. Team admins and owners now have an "Invite members" button directly on the Members tab, opening the existing InviteMemberModal. Member list refreshes after invite completes.
  • Archive location name resolution. The archive/delete confirmation modal now shows the human-readable folder name (e.g. "TeamHub Archives") instead of the raw /f/150770 file ID link. Resolved server-side in ArchiveService::getAdminSettings().
  • Announcement banner suppression in iframe. The CSS injected into embedded iframes now hides banners rendered by the announcementbanner app (mohamedsakhri/nextcloud-announcementbanner). The banner remains visible on the parent TeamHub page.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturepLfqcez5PHzBBt4uvQUuBGuVX2F+Ensw6x8TOu2G5BMwPa5XM/IPDpTKwYl5bruyA5CI7UWwW8Kb+NwEOdBR4nQMiMRxg5EJTQeg4mvsz+0P2LK/m28o6zA0D6a8NZThFpd6TRz6iOJybaNjqCZMClHlEHpwWLyuSy8Q+F485bD5TxQxLSWtuEAUFGX5gnj5S5plOx9dLLQKusc0j6guap2BM/rJboKisDS6rkYcMtfPS+/sKtHe9WceNvV6M3ulYWxFtpf4NPlr7XkYreTDYzXWt7m0aaNjxVBn7N4m6DasYvG1FA97K/qO6RdBPHg7GGh6DmoyRw+fE+GsM162FCFfnomewnYPH8yKt05DPueEIbgMkQXeGJ7E19CMan+CyUCv1GvdomrVoNHBazt3IXNH+AIHokIQnj8ScwKFScQ7gahdGkABoULK4fwV90DpxOuxN1uoGC/aDI6+fC1gAN0gUoHaGIgevjn7+jGPGeuAdrbZpnV4xnJBTM/P+mPu3Dc+Dop8irM63XP7dfy8v33NHoN5N2gdIHPGJsqhDpqNSg6T02esJehL42h0yTlaRZ40Qs4el13FxijnnVjk4Cz8m/Q1cPm5x1RSWYpDNQ7NhlQxsWIyLMiZFcfTVZh0rWuitR/NXMKzs3WKwSNdw/xQwgagUStk6O5hDJGM07s=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.38.1
Release Details
UpdatedMay 14, 2026, 8:01 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturep1xq5GU5FgnU+VBmRTq1YN5VobUyjICVQ1UEEoxNmz+9GoTiMzc4SHrb4aQDDAIA8VppLDpx4+z8TKLAi7OgGy6COZK/7CHQrdDt0Qk+q6ACl4AF3l+RgV0DWrHxbP6V/LkewhJHUl9scVJkfIBwoZXK2bITpo65RdDMVDfTiHR7Nf1/jm/nwjpi2ZMYf7Ct969eB7a+IDoydWoYBETd5mlLBp30cWFthnT3uEpPRJYCgKvOdO9iVjBBOP2VtudKYDkUmdKpHbQutIxQbCcnw5455wCS4byicyEfu6oLxN6VYNk+VSttFf+PQlC7TFYNyHW/XOpneBM/z5yA/e9UaipRtFFzG/ZTepEQL6LoU2UgaXm/cPF4rDtqh3t+7BPR1OerRej8cTXsut7zugiKW2lm98Z3yXixEtTe5b0TJajkVTFYXfVBDYFUR5PLsAczk5ipa8O9UgapijqQDYKvqFyHhrrobWdAHs/cUJMZE7UdLJhpvrEeYfQJTSurKXI4uqLx/PIMj7P2C+LYQn71gnxJStjhCxy5syvDt8EQbljl8tlUtGWmbtpojG0JF9k3j502osAoHz5S02c357aqCGmdaY3Q9PlVyG2C12v2AXB1k5dOKG4nJ8IbrKlBYMe8xiqEllgoc722ab4wtcXqQoeA+kWT9q41VyRt6qrByYU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.37.0
Release Details
UpdatedMay 14, 2026, 6:27 p.m.
Changelog

Added

  • Message @mentions. PostMessageForm and MessageCard edit mode use NcRichContenteditable with the NC core OCS autocomplete API (/ocs/v2.php/core/autocomplete/get), scoped to team members. Mentions render as styled highlight pills in the message body. Backend sends a message_mention NC notification to each mentioned team member (on create and edit).
  • Message pagination. 5 messages per page with prev/next controls in the message stream. Page resets to 1 on team switch and after posting. MessageMapper::countByTeamId() added. listMessages now returns total, page, and limit alongside messages.
  • Per-team message settings. New Messages tab in Manage team for team admins. Configures minimum role to pin messages and minimum role to post messages, stored as per-team IConfig keys. Post Message button hidden (not just disabled) when the user lacks the post role.
  • Calendar view dropdown. Embed bar now has a native select for Month / Week / Day / List variants; selecting reloads the iframe with the chosen view in the URL.
  • Calendar embed auto-reload. After adding or deleting events, the calendar iframe reloads automatically so changes appear immediately.
  • NC-relative team links. Custom team links now accept apps/... or /apps/... paths (e.g. apps/collectives/s5) and open in an iframe tab, just like built-in app tabs. External https:// links continue to open in a new browser tab.
  • VitePress documentation site in docs/. Covers Nextcloud admins, Team management, Developers, and Users — 20 pages total.
  • New migration Version000336200 — remediates auto-generated primary key name on oc_teamhub_team_app_resources for existing PostgreSQL installs.
  • message_mention notifier subject in Notifier.php.
  • getMessageSettings / saveMessageSettings endpoints (GET/POST /api/v1/teams/{teamId}/messages/settings).
  • getCalendarEventsForWeek endpoint (GET /api/v1/teams/{teamId}/calendar/events/week).
  • deleteCalendarEvents endpoint (DELETE /api/v1/teams/{teamId}/calendar/events).

Changed

  • Calendar iframe URL now uses the public share token path /apps/calendar/p/{token}/{view}/now (team-calendar-only, no personal calendars). Falls back to full app when no token available.
  • Calendar connect error handling in ManageTeamView no longer logs the full HTML 500 response body to the console.
  • getPinMinLevel reads per-team IConfig key first, falls back to global key. Admin settings Messages tab removed (settings are now entirely per-team).
  • activeFilesIsGf / activeFilesIsShared in ManageTeamView use .some() across all active files rows so the GF connect buttons correctly hide when a GF is active even if a shared folder row appears first.
  • dav_shares access filter in getRealCalendarIds broadened from IN (1,2) to IN (1,2,3) for compatibility with NC Calendar 5.x circle shares.
  • resumeCalendarAccess corrected from access=1 (read-only) to access=2 (read-write).
  • Select dropdowns in AppEmbed bar and Manage team Messages tab have no background color (theme-transparent).

Fixed

  • MariaDB migration failure on NC 32.0.9: Version000328200 now uses explicit 'th_tar_pk' for setPrimaryKey() — auto-generated name was 31 chars, one over the 30-char DBAL limit.
  • Calendar connectExistingCalendar TypeErrorResourceService was passing $resourceId as string to a method expecting int; cast to (int) at the call site.
  • GF connect buttons visible when GF already activeactiveFilesIsGf now uses .some() instead of .find() so ordering of rows doesn't affect the result.

Added

  • Strict 1:1 enforcement for files resources. ResourceDiscoveryService::reconcileApp now snapshots the team's active files state and routes newly discovered rows accordingly: active shared + incoming GF → pending (with isDualFolderPending flag); active GF + anything → ignored (GF precedence); active shared + another shared → ignored. acceptResource and unignoreResource apply the same guard. All refusals write resource.suppressed_duplicate audit entries with reason codes.
  • Group folder takes precedence in getTeamResources. When both shared and GF rows are active (dual state during manual migration), the loop explicitly picks the gf: row so widgets and the team home always read from the group folder.
  • Dual-folder informational notice in Manage Team → Settings → Team Apps. When a GF is discovered alongside an active shared folder, a blue panel explains the situation and directs the admin to connect the group folder via the existing buttons and migrate files manually.
  • Resource-type badge ("Group folder" / "Shared folder") on each active files row in the settings panel.
  • Picker filtering by active files type. GET /api/v1/pickers/files now accepts activeFilesType=shared|gf|none. Shared folders are suppressed when one is already active; both types hidden when a GF is active.
  • isDualFolderPending flag on panel data rows.
  • normalPendingResources, dualFolderPendingRow, dualFolderSharedRow, activeFilesRow, activeFilesIsShared, activeFilesIsGf computed properties in ManageTeamView.vue.
  • Create New button for Talk — shown in empty state alongside Connect existing.
  • Create New group folder button for Files — shown only when Group Folders is installed; switches label to "+ Create new group folder" when a shared folder is active (signals the workflow).
  • Both 1:1 buttons hidden once a resource is connected, except when a shared folder is active and Group Folders is available — then the GF buttons remain so admin can attach a GF for manual migration.

Changed

  • ResourceService::upsertResourceRow() — now promotes pending/ignored rows to active on explicit connect instead of skipping. Fixes silent failure when the discovery reconciler had already inserted the resource as pending.
  • ResourceService::getTeamResources() — files block prefers gf: row when multiple active rows exist.
  • ResourceDiscoveryService::getSettingsPanelData() — adds dual-folder detection and tagging.
  • ResourceDiscoveryService::resolveFileName() — falls back to basename(path) when filecache.name is empty (some storage backends).
  • FilesService::listConnectableFileFolders() — accepts activeFilesType parameter, filters output accordingly. Also falls back to basename(path) for shared folder names.
  • ResourceStateController::getPanelData() — now triggers reconcileTeam before returning panel data, so externally added GF resources appear immediately.
  • ManageTeamView::connectExisting() — empty catch block replaced with showError().

Fixed

  • Critical pre-existing bug in ArchiveService.php: stray extra } (line ~2770) caused ParseError: unexpected token "try" on every admin archive request. Removed. Archive settings save works again.
  • AdminSettings.vue archive form: archiveBeforeDelete was missing from the data() default and from loadArchiveSettings — the toggle had no reactive backing. Both fixed.

Removed

  • The auto-migration system (FolderMigrationService, FolderMigrationController, FolderMigrationModal.vue, two endpoints) was scoped, built, and removed per user direction. NcDialog wiring proved unreliable; manual file migration is the supported path. The dual-folder notice remains as an informational signal only.

Security

  • All new endpoints check team admin level (≥8) before any action.
  • No raw SQL anywhere; no \OC::$server; constructor DI throughout.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureNB4VEY/kY6IM6/q9rg1aZPixwOBTrNlZIbr9hGsb3TcGQ3kXe591A67Rez1U2FQO3FcRuoxZRNXGMJkziuhoaa9RkoGQuHxtueXomwk5UWjFSTbgf8+JFSFXag8NUNM7DqEnRjG3hLad6HdDwdv8t+t7CDhkih5s2rGI7G55B9uSNdY0LftIal9G2M4DBJmpZtJ+1RitAI/ZqqRCjA+lVc0V7AQFeCxVyrt9weLTdXuvzGTZhazmiYZELVrbpUwurxRgmE6itg5pWp+T4FC1ilm7zyz/v6LOSmRBqgNExbS5lbEutYBoKLSKEPfvjAO2emcj54Ng9PwvRlP1iTvGr7jrZ15DZa0mBL6sXMvDpEdR2yvoAsVDvlroHW0aILMDnc3HruzKkmB8ykRyrkOAwVmCRQUPN5pjr6Qre/hCgYWZR0d+YHFopsJ/VDiH6+PH8aYia/92Z6z21kbvT4wUrqwqARyI510Dcq9TLx+O6CeNqYmBiPYkpAUoX1ck+q3fZAH3cqTXH7N5ezRctAnM3CvctmxMG7Gpd9BmLj0wF1p69qGQ4FvpcVSsFoFt3sc8qxfARDRm0fu+avD47k4YvKfR1NFbUhHe+RMYivFWlmCAhwbaObsGt2mCbyfIwxLFM/S4N2+ji8lwYT2wC9cPTHYTL1+dZNwTCCdaTEZIVSE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.36.8
Release Details
UpdatedMay 13, 2026, 7:15 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturelhEnGI/fAC8OFXF2pnGBIlqEN6Bw4EurQEVPeTeuGc+O+1NHT6t7rYfX5gBJinYOJScN0dXIys+FHOvzY/QGT02MbHUDXMqtwzYoegOZBlRE/TXUXp0LKCx+3m+rHjKd9dCtBJi++X2ZUJUqGzsU4Km1WNRKqv6gubdCYUAMjXZmrXtfuEtdOqc5yAgnaA7CxKx+TPcc8bpU+SPkiFeuC9EB+iwnM+3NJThjc6RIQWiCwc9F5i1FsXikkYe9gYENyaraXhZrqj1eeC2hHwBRB5aXYMO9FghzzjvQ2VZo/psiiGWukii17WqKSofNN5N6yeh0Va2q/dT3RRmtRNhZ16D9eCeVLF+w6rUaP3bz3lNZIeksbIkV5E3d3F/FXc51QdNIlQ5D1LdB4ghhVYtvTBFzf5WbB5yzM6uSA/zcR5g02p4iMzLdVoILfkXoMRV7VNISvQfPP9ExuQnw15dpA7nSzIEC2dtLCNoA1xUPTCVCOpz3CMHILjL5F4l8HJtQKx5D9IV8l5Sakf7uqp7SJcx8CWh03/iX6Eibp5HRRS4PsdKyZVKiWgOyG6iXkTktCruXQKGXi5MSwkpPZvYUz8//klH2Bn87PSHJ+q9rtca0j4w/o0QBqnJr03gHcKPh3Y5vD0aaca57svcZPbhr+dwT4WXmEBNkxRlNKwmI0v8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.36.5
Release Details
UpdatedMay 11, 2026, 7:29 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatures016TbppM9kULPOeWRGdKsV9pcTR+YBhPBA2cPZPRtKPLKxUpr80YJrCOj2+VxmxQrrr0cwaFgQTjtCTw8Uw1ush4zPNdfXfX2HFqsvmP2JYDEFQwk6ftJLwiDfeUk4kDnarODZ2WAJ6Ol22Sq8w4cxdgADyVDii0sRaHyyEnghCuyttUccXzr/1uf1MzlzuH0xhbLSKALpnQVnTKz0jMNgGifh/ug5nh+tmz/nwLSUGJ/n+iyWp8qQhzWtlKQpSSTAW3COCOQvleVoprDWkU9LyOKmQvYXExEmsf9C21olxxEkHygVhDEKKN+2eNmH1XsTyuBmi9SVDOP5uruPsiZs7bnmO9ToBI8oTCtRa6jmu2pJpPjTjIdGW7Mr5US/NEbjljWFdC0KJZ4y0Y5+z6oKExqXb13D/bMndP5uNNZI/0SwLTCCpfd6DYYp9TCESagMG6zARVbIu69ReMWlmvEL2Uhq0hKqlBfhKrHwyrtYRXXzLpn+riNO2WafrOrVmMMT8t1+0aXUdqYBRKz6jpuwRag29IutxSsYwNA9oSlCmjhylald0jhu6AAK9Zi5fg0HuKudr7RBhk4wPY+HrgHtVwvl9h5dJ0ADJmsJEE77CKaT8xdV0SgpRU/JZCMw9qHFnkz7qDR/f/fmshi0L9qaDVOB0hWOKP7Td1BvlC3g=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.32.2
Release Details
UpdatedMay 10, 2026, 11:50 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureaqlS5xLgAtQMFnFSjAjXnjfpSSV5UCZpVyKef4AdzzktPWmKamnaJ/o9bl/knf5Ccxcaac5gNFKSZcycZ4yrXj+BKTne63Wt+G4a/W3uhVV+jEz0aXacH4jwhVJuxDExsQUp83WA/JxrlFp38nEXc3fSMhAPZsP829eID9w6AbRSujgEzOfNCsduJ0Isrw+m60fR8R7LsX0CSC3XzGwLVwoJhbXJ52Ri8JRxLziVP/If/TAJR+pqg25hjGoYRqoPTacmdoFbNxcaZOeAxJSR0VRMwFS7rJJakiZ95w54KztDRvMwJAIMBr4BDtAiqedj3GCj8AtsPmvh3dEh3OPw4xMjQlTRAqW6yL1t4AhvL5dy5dmlQyRZiKwTkSC/9+/SXwR+e+1vfaB5ffmA3JAt9LIZ+24gP7O989Ed6yIo8Rh9//c6HwXky+L1MDOU9onZU3mwWBvI2xujyIhYu9uXMV6q587FsyptGaAoeBVtbtmY6DxiodLmgE5no1Gm0OBt7vy2ZUEhE9ToktSetWQPLtpjptRUBbAyomUGpEiaLSQP7y08h1ulPHoMjM3MelrxfGqSytHakG/M8bImdS7dO46kRG4gEf9C1LaaXH3KkfiNu0F5FPEbf0qidxDY5XePKUiAPirG5nSXLjYCu6f8hDktPh/U70EIWKuO4AAi4qw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.28.0
Release Details
UpdatedMay 7, 2026, 7:47 p.m.
Changelog

Added

  • Connect existing app resources to a team. Team owners can now choose, per app, to connect a Calendar / Files folder / Deck board / Talk room they already own instead of creating a new one. Available in the Create-team wizard step 4 and in Manage Team → Settings → Apps.
  • Resource pickers (GET /api/v1/pickers/{calendar|deck|talk}) listing the current user's owned resources, scoped to the caller's UID.
  • Connect endpoint POST /api/v1/teams/{teamId}/resources/{app}/connect (team-admin required) that inserts the share/ACL row granting the team's circle access to the selected resource.
  • ResourcePicker.vue — unified picker component used by both the wizard and the manage-team dialog. Files mode opens NC's standard getFilePickerBuilder dialog; the other three apps render a populated <select> populated from the picker endpoint.
  • Connected-resource warning under "Delete team" in Manage Team → Maintenance, explaining that connected resources are deleted with the team and how to preserve them.
  • Archive-before-delete admin toggle. New checkbox in Archive Policy controls whether team deletion produces an archive ZIP first or skips archiving entirely. Default OFF for new and existing installs. Same three deletion modes (hard / soft30 / soft60) apply to both archive-on and archive-off paths.
  • POST /api/v1/teams/{teamId}/soft-delete endpoint for soft-delete without archive — creates a pending-deletion row and suspends connected app resources but skips archive production.
  • Owner-side delete dialog when archive-before-delete is OFF, with description and confirmation text adapted to the chosen deletion mode (immediate hard delete vs 30/60 day grace period without archive).

Changed

  • The Delete-team button in Manage Team → Maintenance now branches based on admin policy: archive ON opens the existing archive modal; archive OFF opens a plain NcDialog confirmation.
  • Description text for the Delete-team row dynamically reflects the active archive policy and deletion mode.

Fixed

  • PostgreSQL SQLSTATE[22P02]: invalid input syntax for type smallint: "f" on team creation. The enabled (in teamhub_team_apps) and is_builtin (in teamhub_integ_registry) columns are SMALLINT (per the v3.9.0 cross-database fix), but their bind parameters were still using IQueryBuilder::PARAM_BOOL. PostgreSQL refuses the boolean-to-smallint coercion at the wire-protocol level; MySQL accepted it silently. Fixed by casting to int and binding as PARAM_INT in TeamAppMapper::upsert() and IntegrationRegistryMapper::register().

Security

  • Every connect endpoint re-verifies that the user owns the specified resource (WHERE owner = currentUid or IRootFolder::getById() for Files), preventing forged-resourceId attacks across the four supported apps.
  • Each app refuses to connect a second resource if one is already linked to the team (one-resource-per-team invariant).
  • Picker endpoints scope listing to the caller's UID — never accept a UID from request parameters.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureADlRyz4GyYgl8rljgx6Xw5Yq+hXjFnDGsT/M68SMUIu0PyMV0qJzbt+63EO5ij0SJrNYsf0ggbHaHct97ckYFzxrkFf7+B2O9l5YWdatd+dmtt0FQEMKBReJBSb93ZSRU65JXVlE0/43ikwK+RW9DiQI7QS3/DWSvRf83C43vI57g3PKs0dovrU5BwXWIb0bh7OvzXSfq7guF3JnFxlSeBTsrA9KUDTwQY03n1Wqi6tDYwLvTIQu8tKnPCMmzVQJlAc4d2krRVgEDGn+hNXN8+0sq8YSAq2ZCc2ckBXlMTyzLRrqwkZz7LpgljadbYATQe/GhS+ax5AFKL9efbXx0ny5S553N6Clgaq9vn5AyT5JASVo22Sf/Yxs/bT+EVYxKmwSd7XW9PDvXYwtG9aojqkQnEgZdas2MCeZw3e4yAsh1pd6KpFf3LuQ9U7nxzDSoABLZSDPYctIIZoVVQTPM35Bd/poEbOYl5f60bOYHEmeQkFP/MCVuqM9/XuJ1hIw27U7GdDCAsC1ONdcmlIRYEJHdIQ+yxOjMMYm8F18OjHJYoDuk/GIjFmGCF5QzcE+vdK6z4SO5n6JtTTsM6T8ruv/FNUFtQYbIb4KrhzbUs4TOxV+MCAI0/lB7IJiWdogLEiVuABwSecEPzt/K2qCbK9VgzJV8h77Yg1Z72ic1Dg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.27.4
Release Details
UpdatedMay 7, 2026, 1:14 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureWsF4We8JALnZvd9ZxzvftUVv6y9bJoO2AK9e/PM7P3dJn/cu8zwy1WvJhJDwbFP8Z0Nzcpj/wmN2WjfT0+1nbLor4BJ8Ls7noGy6KZR+laWTW/UHwGcRgFK5FB53Yi7W/rUTcp1dyM05gyl8sZAmrQxA/sD/unJccyNHcQJPpw3s8tsEShXmsFlZJuO2Ria+a0bKRXSQl1Az5v9ORk/Bx0Wd8oTVD+x2yEBq70TMaA4UqHU0Q/qNrZn03XHCYA6bh3QExdWx8sV3dNJ9X8envbqwPG53VL8KIOZD31DsjkVZ73+/stHpj3xQgwoiQ7oQD+ggorUShI16nrkd/VTV+M7VtcZyPxacndnslzeZyS00p2o0U9SzRTiJB3d76gogX/7XdQpRmUIeUroB1UNGaLMoILC8LojcDQsDGgv0w6adCZ5f/BdEgUkZKSMcm++IN5cYtm+q6+Eth29bh7gq5RIpuKb0Ous5wjG9UVgLHi/KDhtj+vZoUkg8CQ3ctPttf+FkJtY/xTuoEzf0ygy8nlHYsBoGQmdjyUqvuB7MZKCL3y1F8mGwEI0FYFMhbRnRVbYQy1ae8RpQj/fKEAWwXEfGIBbQAySath1iBlILNeAreUWmJpiWnE+aSghtd//HPcKvwHW1nRLt4f/UuMYIjCm3u/7C/CrJ49X2ZbIJSyU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.24.0
Release Details
UpdatedMay 5, 2026, 8:48 a.m.
Changelog

Added

  • Mobile single-canvas layout for viewports ≤ 768px and tablet portrait (≤ 1024px portrait). New MobileWidgetView.vue: scrollable canvas, collapsible icon bar at bottom with one icon per accessible widget, FAB action button.
  • FAB widget actions — in-canvas action button rows removed; actions surfaced via FAB: single action fires directly, multiple actions open a slide-up sheet.
  • Tablet landscape layout for viewports ≤ 1200px landscape: 60/40 split with message stream left and collapsible widget column right. Widget cards have spacing and rounded borders.
  • NC sidebar auto-close on mobile/tablet-portrait — uses NcAppNavigation :open.sync prop to close reactively after selecting a team or action, instead of fragile DOM manipulation.

Changed

  • Embedded app iframe content height set to 100% (previously 90%).
  • Edit layout button hidden on both mobile and tablet layouts (editing not available in these modes).
  • Seven modals (ManageLinksModal, AddEventModal, AddTaskModal, AddPersonalTaskModal, InviteMemberModal, ScheduleMeetingModal, TeamMeetingModal) now set min-width: 0 on viewports ≤ 768px to prevent horizontal overflow on phones.
  • MessageStream accepts hide-header prop and exposes openPostForm() method for FAB integration.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureTvyr9L9P+H2RLIOYb8tFSJIV/1sH4rWC2RhttmVfB98kvezRU7Xa/tVV+MKE758D3cT3BKsvBz7e/OtKoPKuCan6HR0AmXNbMYx3F/ep+BoEQP3H/m8pOaYF2xyRAYmsdHxV9EPyyFEX6Trxiwy5aNJSK5S9RJdC+fm8p0gmvDlP1G3+GCerMXdi2lioEpoAnIlE+fd7JUIt48C1YYHKAqDlsaw3wlXiYC4j68I8vVD8GdXYmYgXvxW3IeE/iUbOZJ75bpqxv3ufHqEFPAYas5+SMUy8fGQQZjBvjIN4ztSRwAIZ4e1OFZj2WsYsfJZEi5upcwPoqg5SGo4Xw7vp5Dz3Zxx2hCEhCdO8jlGSinqNul6lPRZmaKXm0GY8v03ZaHu2uUdyNPvOfnVRUbe2ekUKhXe7C0u9umdSLmv2/+HhQRGFFZH6Tfu6Pc1IwWirW2EnhmKoGHnWO0mjq+VK1Ip1ZntyZ1znM9U6fdQaHTjMBq2nlXQWnZgu1tw90QWf1rj3+MGQW9vUyrN5uEx9xxxBVxXjCxCVvkOsqwTR7lqqsQfp/NCR0lRyognr7Hmd985l8nUYHCrg9KfPzOfFxLRauxh1UIiRS1nif3WmJzmaelxyyRNysvksjzsc5GJW9C0wjTPsYOuZv2H+a3GRH1RSzadDXVS11CCDpVMPXG0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.23.0
Release Details
UpdatedMay 4, 2026, 7:35 a.m.
Changelog

Added

  • DELETE /api/v1/comments/{commentId} — hard-delete a comment. Author may always delete their own; team admins (Circles level ≥ 8) may delete any comment. Audit event comment.deleted written with metadata { message_id, author_id, deleted_by_admin, cleared_solved }.
  • Solved-question revert on answer deletion. If the deleted comment is the marked answer to a question, the parent message is automatically reverted to unsolved (question_solved=0, solved_comment_id=NULL). The confirmation dialog warns the user before proceeding.
  • Delete button on comments. Visible to the comment author and team admins. Confirmation dialog; disabled/spinner during async delete. Error messages are HTTP-status-aware (403, 404, generic).
  • currentUserIsTeamAdmin Vuex getter (level ≥ 8) — derived from current_user_level now returned by GET /api/v1/teams/{teamId}/members.
  • Markdown formatting toolbar in PostMessageForm.vue (new messages) and CommentsSection.vue (comments): Bold, Italic, Inline code, Code block, Heading (H2), Bullet list, Link. @mousedown.prevent preserves contenteditable selection; execCommand('insertText') fires at cursor.
  • Markdown toolbar on edit message. Same seven buttons in MessageCard.vue edit mode. Uses native selectionStart/End + setSelectionRange (plain textarea — no execCommand needed).

Fixed

  • XSS via v-html in message and comment bodies. Both renderMarkdown functions now pass output through DOMPurify.sanitize() with an explicit ALLOWED_TAGS/ALLOWED_ATTR allowlist before binding to v-html.
  • Headings (## text) and bullet lists (- item) rendered as literal text. renderMarkdown was a flat .replace() chain ending with \n → <br>, so heading and list regexes (which need multiline anchors) never matched. Rewrote using a null-byte placeholder pattern: code blocks and inline code are stashed before block-level rules run; restored after <br> conversion. Applied to MessageCard.vue and CommentsSection.vue.
  • Deck boards created with permission_edit = 0. Deck's AclMapper does not mark entity fields dirty when set via __call magic, so setPermissionEdit(true) was a no-op. Added enforceAclEditPermissions(): one independent QB UPDATE per column (permission_edit, permission_share, permission_manage), each try/caught so a missing column throws silently without blocking the others. Schema confirmed from live DB.
  • All Deck boards and Calendars provisioned in the same blue colour. createTeamResources() now picks one random colour per team ($teamColour = self::randomTeamColour()) and passes the same value to both createCalendar() and createDeckBoard().
  • Provisioned resources (Talk, Files, Calendar, Deck) not deleted when a team is deleted. deleteTeam() now fetches the team's app list from teamhub_team_apps before destroying the circle, then calls deleteTeamResource() for each app. Resources are deleted before circleService->destroy() so CalDAV/Talk can still resolve the circle principal. All apps are cleaned regardless of their enabled flag.

Changed

  • GET /api/v1/teams/{teamId}/members response now includes current_user_level (integer) alongside is_direct_member.
  • DELETE /teams/{teamId} now deletes all provisioned Nextcloud app resources before destroying the circle.
  • ResourceService::TEAM_COLOUR_PALETTE — 12-colour curated palette for NC-friendly team colours.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureNB29XEJ4DYUSSXCP7cIFfzPYsJyAPHHQtoOtktawP03w3p9lKDvZ86l7WnrBkKcOxtIv7oCuXPh8oQqZkj/L4XmpXAVcvIUPrZPtG3CQ4+OhNvC3BXT4T41GNLAQcG2hyQ4MZX11OBP1F5IfBmGWoY7il1gDNjDTIBqM4J0cFcO/Eg5q4zVYI2x1ks6+SpmlNCLdjVujDfZLN3/wXIQJA4zY5EqUexwmKvz2RiNNESfifz3wwpY5KcYEHrF+gasTIj1ZaaZ5TDC/4tUH71zpn3PAYNRpWPB8d/WhZW8yt0eaRw+4+hLItkzvwsKesAEljUNUrYD8IUD5VIWgysH1IgdXR3tJX2deQK3UW2gVFGuwJvNTtVzDuPGUsZ2m1VdhMPZcsPLqPLH+rvjwrG4qQlaTpXj9v/6ypBBoCo059KU7C5qnITKvANLXgldhEIyV3VNlCjbvww8v2Ogu+FSkSPpQRCq2FWygTVQJNYVIzjNS8J4lGfloPU9lXkEW1UvtK7nzZoumi/H9xmhj3edmOP/MzaR7wrToziaf6cWhhgYfnLxS60TYOUFmY7BCarcQ6y2tlXfPsCHYSDupV2/39kINeZ55xp70YP21S2WyjkkmmsXO76YDImJJIfXJhSUKnfJ7j1gk06Z8QwjQlAxkN2hDHG0JhQVcjWLAri/2A4U=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.22.0
Release Details
UpdatedMay 1, 2026, 12:35 p.m.
Changelog

Fixed

  • Indirect members (added via NC group/sub-team) could not see built-in app tabs (Talk, Files, Calendar, Deck). ResourceService::getTeamResources() checked only for a direct circles_member row; indirect members have none, so the method threw and the controller returned all-null resources. Added isEffectiveTeamMember() helper in ResourceService that mirrors the two-step indirect-membership check (circles_member → circles_membership) used elsewhere, without introducing a circular dependency on MemberService.
  • Member count in members widget was inflated when groups or sub-teams were present. getEffectiveMemberCount() used COUNT(*) FROM circles_membership, which includes group-proxy and sub-team-proxy circles as rows alongside individual users. Replaced with a query that inner-joins circles_member on user_type=1, level=9 to isolate personal user circles, and uses COUNT(DISTINCT user_id) to deduplicate users who appear via multiple membership paths.
  • Pages widget hidden after team creation even when Intravox page was successfully created. create-resources did not write to teamhub_team_apps, so getTeamResources found no intravox row and returned resources.intravox = false.
  • Manage team → Settings → Team apps showed all apps enabled after creation, regardless of wizard selections. Same missing write: ManageTeamView fell back to defaultEnabled = true for every app when no rows existed. The wizard now sends a complete appStates payload (all apps, enabled and disabled) with create-resources; the backend validates and persists these via updateTeamApps().
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureaF+aB3FIewjvx0eqVweCVBEI9ipOSyJoOcNoEC9XKXKaYsVdnElwJwRyq9so1vwmCMkRE2kmmlkqeK+kDc+cDrFhnwG/2NuzoTbG/BQViG1UqASNTodIVMWT3YfFcpVgWYwmY4ebBlHYFmDzpXmozDw74hodGwtZIXiSavfzJhtXhPYvhi/e+Q7v7qICbytjO9C1JFzEEcsGZNNEhkUlSiuO9SMt+yjkG6iWaCzcNjPMPmS7OROieXzAJ/Xxb5vG3aZocJfl2IezIR7sZ1XFrhvRy8+HB0r1EBunJa4YwgM86MaGzlIB2PdMH6OrN6ly6DZwl98oJTMCAjHT95/U/vuzzuwOrsg8P6Y7y+j0mH5nf/ZbSl0FeJk5tfv2GQe2XFXvRw7aKi/K+Y9B0dYReMPmwsBlPvx3mqEj543CaEP/Qzs4xmCJ/V1V0qzGfUkU0UvoDCPh7JLiDED8+O598KEFaxGSOOOqg9hhOLGszJG4jIFyTGsnBLvDFvR4bPFuA5HFjnPH6WdTWnfRhZFhtNojz3LQcsPP5Em9Y7x13KmW8h0HfJ92jzXyY13+4oK8jm9k/TNWyzqz7WYfb83tsia8cUw6PF4yA7fgBs8F4221Ko+19QtZIijE53M2txRNODZ/XsXLdM3ifatbgGi65T0tAzAw3BmWdMtWmHHrvPk=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.21.0
Release Details
UpdatedMay 1, 2026, 9:10 a.m.
Changelog

Added

  • WCAG 2.2 accessibility audit and remediation (Sessions 1–3). Full codebase reviewed against all A and AA criteria. The following fixes were applied:

1.1.1 Non-text content

  • AppEmbed.vue: <iframe> now carries :title="label" so screen readers identify embedded apps (Chat, Files, Calendar, Deck).
  • MessageCard.vue: poll options now carry role="button", aria-pressed, aria-label, tabindex, and @keydown.enter/space handlers — keyboard and AT users can vote in polls.

1.3.1 Info and relationships

  • TeamWidgetGrid.vue: all 11 widget title <span> elements replaced with <h2> (margin/padding reset added to prevent browser defaults from breaking layout). Screen reader users can now navigate widgets by heading.
  • MessageCard.vue edit mode: bare <input> and <textarea> now have associated <label> elements linked by unique per-message id.

1.4.1 Use of color

  • MessageCard.vue: voted poll option now shows a CheckCircleOutline icon alongside the background highlight — vote state is no longer conveyed by colour alone.

1.4.3 Contrast — hardcoded colours

  • DeckWidget.vue: #0e7490 teal replaced with var(--color-info-text, var(--color-main-text)).
  • FilesFavoritesWidget.vue: #f6c342 gold replaced with var(--color-warning, #f6c342).
  • TeamWidgetGrid.vue: #1a1a1a on success/warning badges replaced with var(--color-success-text, #1a1a1a) and var(--color-warning-text, #1a1a1a).

2.1.1 / 2.4.7 Keyboard access and focus visible

  • All 10 components with outline: none on :focus migrated to :focus-visible with 2px solid var(--color-primary-element) ring. Mouse/touch users are unaffected; keyboard users now see focus indicators.
  • App.vue: duplicate :focus-visible blocks consolidated; outline: none removed.
  • TeamTabBar.vue: role="tablist", role="tab", and aria-selected added to all tab buttons. Tab/Shift+Tab moves focus; Left/Right arrow reorders the focused tab and restores focus after re-render via $nextTick.
  • TeamWidgetGrid.vue (edit mode): all 11 drag handles gain tabindex="0" and @keydown handlers for ↑ ↓ ← → to move widgets on the grid. moveWidget() swaps positions with the neighbour in sorted order (fixes vue-grid-layout vertical compaction cancelling y ± 1 nudges).

2.4.6 Headings and labels

  • Same as 1.3.1 widget <h2> and edit input <label> changes above.

2.5.7 Dragging movements

  • Tab bar: Left/Right arrow keys on focused tab provide a keyboard alternative to drag-to-reorder (WCAG requires a pointer/keyboard alternative).
  • Widget grid: ↑ ↓ ← → on focused drag handle provide a keyboard alternative to grid drag-and-drop.

4.1.2 Name, role, value

  • TeamTabBar.vue: role="tablist" + aria-label="Team navigation" on wrapper; role="tab" + aria-selected on each button tab; web link tabs correctly excluded from tab role.
  • TeamWidgetGrid.vue: all 11 collapse/expand buttons now include the widget name in their aria-label (e.g. "Collapse Team Messages" instead of "Collapse").
  • AppEmbed.vue: <iframe title> fix (see 1.1.1).

4.1.3 Status messages

  • PostMessageForm.vue: attachment list wrapped in aria-live="polite" aria-atomic="false" — upload status changes (Uploading…, ✓, error) are now announced to screen readers. Checkmark symbol given :aria-label="Upload complete".

Security

  • renderMarkdown (pre-existing): v-html binding in MessageCard.vue and CommentsSection.vue renders user content without HTML sanitization. Logged as open issue for a dedicated security session — fix requires DOMPurify.sanitize() before return.

Removed

  • Debug console.log calls in TeamWidgetGrid.vue (moveWidget) and TeamTabBar.vue (moveTabLeft, moveTabRight).

Fixed

  • Double margin-top gap below NC top bar. NC page frame and NcContent both applied margin-top: var(--header-height) to the same element. Added #content-vue.app-teamhub { margin-top: 0 } to zero the page-frame copy only.
  • TypeError: e.n is not a function on team pages. translatePlural imported at module scope is invisible to Vue 2 templates — added n to methods: { t, n } in all five affected components; AdminSettings gets an inline n() method matching its existing t() pattern.

Changed

  • All error messages use {error} named placeholder instead of string concatenation. Allows translators to reposition the error detail within the sentence (22 call sites across 10 components).
  • All count-bearing strings converted to n() plural forms (14 strings across 5 components). Translators can now supply correct plural rules per language.

Added

  • Transifex plumbing. .tx/config and .l10nignore added. Stale l10n/en.js / l10n/en.json removed. Ready for NC community bot once @nextcloud-bot is invited to the repo.
  • TRANSLATORS: hints on ambiguous strings: Comment, Leave, Join (team vs. meeting), poll vote labels.
  • Translation standards added to SKILLS.md — every string written in future sessions must be translation-ready immediately.

Removed

  • Debug logging purged. 23 JS (console.log / console.error) and 15 PHP (error_log) calls removed across App.vue, FeedbackModal.vue, FilesSharedWidget.vue, TeamView.vue, FeedbackController.php, FeedbackService.php, TeamService.php, TelemetryService.php. The console.warn in TeamView.menuItemUrl() is intentionally kept as a security signal.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturenE6/JanHZPI2gJOiWJZMk28BvA/IenxP9ttZTLP8ukJhVHLtgEHDouOj6MlHhkol7j765YIdplWXD0snC26zoEjqGIeATPoVLA5C4s72+scF+8yA+ABvUZqoI0objebJsNj9vv4e35pMiFRYFjyxcqsepO9SZUd1h6OjJvd9HhLb+FGQ3XWUfhby3fASPzXUHADRgTSFALVT8uKoKBIT6N6RNsmtwZugGGt9sRJclHoFjYtjuw3taOU7IFSU0nzMeY0knJWJQqOiFHqPK02qA6+y1FSqROoxdmh5DzfXT2Lq82tep8PWNaIjy+eZnSPzZ7yMftzsUuw7Op2dt8IhIoeWlcBML4h4voLwnfSBvv4Y1iupF5NupORVXYQbCRwmGBNfpMV3giQAYLitqCBpEzshO22fwTas7ipF9ERzl8Xjnr+kC/FHRwsGaq86iE9uSeEbebDTRS0S1iQJ2QO3uefGq0ak/+D3fbeaEHEZTkmSZ+IHWsrPoPCj+hDThe812ymYqyN6AoCS688N60mHIGUETeN69fCDXFHWylumRxkdCIS9y9g5OtQTVXrKNNfui75jlQcjhQp8DH6aSWBZNIUSFEUw4D+TiXlOfwCJVHEQUxG0mIHvXMyMGS1HUmj0u5/5U3RFxjZeELbUxBdUE6Y39z7mWcI82aLrAf7PHFY=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.20.1
Release Details
UpdatedApril 30, 2026, 11:36 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureQ76CfO42b16YE6NfBvItjvR78K1DPxanhH91XK8A7vyu03DdXe7OUTFmHfzDd0Rrd0V3K8d+/ss0K8d3VUxJ8awlTx0OPmbQ46R+Q4Ar7SiQPOFhn+pi2JFJmQ/okVKIt1ltSZFY+rinZvOy7IrbONsPxD7EWiiE+3ES9wvNVBwvV0vByOQjLvZcMuOekOJmuqGQxAkiGMr/hYPCG9hYUUjjM140GgbKxpy5AR5zEEARvY1E8up0BNapKTdTEaxHq5kYuv708iGtmpuqQ74W0kXi39e0e3q5Ct3iaWo7ZTv3fVMa9UPxM919JoFSw41MDxReeILrujP/mfdgDJc870Heoi74URx8KM7lq1k8Oq2137OVmJFdmaZb1X6GFBozBOFQBWfIAuWg3b8PD7qxy49Qv8bFruv45eAsMtopCjOqrWICqteqyGNkZx1+VLB0yhzXvvkCRRD3ug4tgVwQ7G3gaLhWW1nrt/N1xrCRXaTk0XumsrprLn0ky1aK+i7mKyUsY4HA1C+C21pJ8lgwL8wjmo4Dm3OA5bZ/Fht2lO0YBKJGrt81BshzPYICFVb4pa8F5ESVyN6iaI3UmzvUHrSKYaOlfhhMWs1GsCo3ayDJ7I/iTmTHhltY6uicMp609IA6RTYQ9xVZ3bpaX3gkEGvvyTUY0dUFJdt5bnJP9iE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.18.3
Release Details
UpdatedApril 29, 2026, 12:15 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureBbSeggogNn0JPG7UmMXVzr1S9eGLRgtmaNwEg6Yo8UenbN4JWPjazn+m78aXajFSeh6jbmkpYR5WS7siW2o1xYVqqWTT4/ollugaFrvcDLi9moShgbqcFpi345PSRshFSaFNgIFCcdy4BBGhkVq17dkZRF9vRELuwtsHE+EsAtC4cg0K1x7fhDZ8AbrVUcWthvCAU7mqq/CDbI5QLMHFH/niUjZfxld01piActRQW51/eiXx7RvpY1XIUUd1JJtZjkcLEUpIojQb5Y6vFWnManLZHJ14Y0FC5WJyFvNXszE9twaUCI0ZtnurdSIogtJenXpPCGE397gx0r1KXwDnlXKJIHTNP81xiYQrxsLp6TjDabK9JIz1I6Mv6WVRZbk8O/fZNntQFJDKc+Lwp8d2WD8gEmOXRpvVsOjAuE1WqClJYJZi6MFY0y4H9/iLE7qi2cNj4kP4wdzGupaUWW6J4VprIRNAzSOqERdCLna82JvkMxU1tLiG6hFVmYc5F5QagWPEQlta7IWVmR4/07gZnu029Ec45hrrDyq96wiD5WAA0uqAcL2kir82l8vLeT/4a3uxAWf6YwMF7KldyJZhfoh1gA+uE8vEvKfUFBCDesKclXPsH+Wg4CP0eILT/h2LZ0J3lAd8HmdJnH6hmXp9wx7CxHrGRZYUdixix+59c5Y=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.15.0
Release Details
UpdatedApril 28, 2026, 2:21 p.m.
Changelog

Fixed

  • Calendar widget now reloads automatically after adding an event, scheduling a meeting, or creating a team meeting — all three modal close handlers now call refreshCalendar() via the widget grid ref.
  • Meeting notes public share link now grants read+write access (was read-only), so attendees can edit the notes file directly from the shared link.
  • @nextcloud/vue no longer logs "missing appName / appVersion" console errors — webpack.DefinePlugin now injects appName and appVersion as compile-time bare globals, which is what the library reads at module evaluation time.
  • Members widget: removed redundant border-top from .teamhub-memberships-list; Show all button width set to 90%; left-side padding unified to 12px across avatar stack, membership rows, and show-all button.
  • Removed redundant "Team Messages" heading from the message stream body (the accordion header already shows this label).
  • Removed duplicate "Post First Message" button from the empty-state — the header-level "+ Post Message" button already handles this.
  • All semantic color text uses (--color-error, --color-success, --color-warning) replaced with their high-contrast -text variants across 21 components, improving readability. Backgrounds and borders retain the base variables.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatureo9VGOkozPXYywaP2ZC3o2UICAIdsFUEdehNKJF0GKdgPgzMvL1Slkyeg9XI0ZiY+cw/Uu6rccUulLDeKWR+2iLRpDQb7iNg2ZCL8QgXYi5AjuO9diTPAqrywyowNNXV8gfFpJXJQ3DqEvkXQVptMXM1A5wNXjybgKAQAnTNSlrF+r4HvT/MJHomrojrDn2yCaHyhI5ER47B2YevI+CqWkKC2RFPwrcptBKVi62tk8VGVarMy9/Vrrp7zLbx8M5oZbVcLhdB7zIUerujkchkr2olx+SKYdNmdQ92tkw3kW584WiCqY6fsfLMD3PSRwHqiH3ScVFIXEHYIMeEphCnXukTwik9c4Vd3C/gAjV08K7Ii8ll9Yh4gt7uIMOfRx1o0HYDyMXqnFHlCnAalzN8UIkq+EXJ/i56lETuFvx0gnW8sxVmziuHpn76pjs9ZG1bVsPDSdwMKA1MwdnIt+pkaY7w9nB+25r7Nz7NMVgv9SvDxhMTo9zUGc1ncpnQ+xIqeEm2uCj+OPxjuYkAJ/vlSuzrdcxALAmzpecxR9J4CwZ+cnq9yJZoXIUMSnt694gd58/KsVAaHlI+cSVaPPZz/M26BwF5DJoWBdl+0fTVQ25WzciKzJ+pvmJAvH3KD3TxJKT0W2XTOWeoUfhzsv+nt47eDgDxvD8LUK1WxAtE0axw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.13.0
Release Details
UpdatedApril 24, 2026, 10:02 a.m.
Changelog

Added

  • Group and team members are now fully recognised. When a Nextcloud group or another team is added to a team, its users count towards the team's member total and gain access to the team. The members widget shows direct users as avatars (up to 16, sorted by role then last activity), followed by a flat list of added groups and teams with a GROUP or TEAM pill and their user count. A "Show all N members" link opens a searchable modal listing every effective user, deduplicated.
  • Manage Team → Members tab displays three buckets: Direct Members, Groups & Teams (with name and effective user count), and Pending Join Requests. Admins can remove whole groups or teams, which also clears their users' indirect access.
  • Invite modal can now search for and add other user-created teams (circles) in addition to users, groups, email invites, and federated contacts.
  • New GET /api/v1/teams/{teamId}/members/all endpoint — returns the flat deduplicated list of all effective users (direct plus expanded from groups and sub-teams) for the Show All modal. Requires member-level access.
  • New GET /api/v1/teams/{teamId}/members/manage endpoint — structured response (direct, groups, circles, effective_count) for the Manage Team members tab. Requires admin-level access.
  • BrowseTeamsView teams now return an isDirectMember flag so indirect members see a disabled Leave button with an explanatory tooltip rather than being allowed to "leave" a team they were never directly added to.
  • leaveTeam now detects indirect membership and returns a 403 with an indirect_member sentinel so the UI can show the tooltip explanation.

Changed

  • The GET /api/v1/teams/{teamId}/members response shape changed from a flat array to {members, memberships, effective_count, has_more, is_direct_member}. members is limited to the top 16 direct users (sorted by role then last login), memberships is the flat list of added groups and teams for the widget.
  • Admin Settings → Maintenance team member count column now reflects effective membership (direct users plus users from added groups and sub-teams) instead of only the three top-level rows in circles_member.
  • removeMember() now correctly handles groups (user_type=2) and teams (user_type=16) by using single_id as the delete key. It also calls MembershipService::onUpdate() after deletion so removed indirect users actually disappear from share pickers.
  • Pending Join Requests in Manage Team has extra top padding to separate it from the membership summary.
  • Group and Team icons/pills use the primary-element (blue) and warning (amber) tones respectively — the previous success-green was too low-contrast.

Fixed

  • Integrity check in Admin Settings → Maintenance no longer flags teams as mismatched just because they have a group or sub-team as a member. It now flags only teams whose circles_membership cache is genuinely empty while direct members exist.
  • getTeamMembers no longer fails on the u.last_login column (which does not exist on oc_users); last-login sorting now reads from oc_user_preferences / oc_preferences.
  • browseAllTeams correctly detects membership via groups or sub-teams in addition to direct rows.

Security

  • getTeamMembers now enforces requireMemberLevel — previously any authenticated user could enumerate any team's member list by guessing a circle ID.
  • lastLogin timestamps (used internally for sort order) are stripped from the members response so they are never exposed to the client.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturea3Sq1npOxTnT7aLDRXv66RWwUdOWvy5yXVlPPHePce9JRxddfqvN4FS4p+bnjFEdkKQmlFNDNzZ97aJmEZb1Kfzb+xpX6WzgDfJe1gTYUhE3XYHBchxclwCzPC/fwdymmrjwwP9b/1q9fH26FRdFciFUmHQO9Z24g696GnkGwApfohzX2U0jd4v55cx1e+vs86SZRWY26tkUm/FXD5+d+bl4FAkDhiK+Z06hFOuuocBhqyt2obf/gohkgTnEZpaHzkaAdgJFvvvRo+azlxGzODk4mqtyZIEDUWbAXQ99vRXZAokuwRrizBbXqbVk5sn3ntgG5rq0NWoYJ3htqhdhqqMh7w6SW/XBD5cGvLZu7BZpfvFLThabB7aZktNZhmVWz3U81C+WjYVhlcKcXPxEeQXXwo+LjSpGNmjkBg2bOsNEnVcYx3LhWsmbqRNf6JH8B0kcERqJcBWRbpthg/ytseDLsFHDX76QmHMb7/r6IKwq3EjaJSpLcuMgYAE0/ad8BtR54j/rWN1AsPD3oj3UfElHO5A27R/Xdu5qwzTd9zpWDRDgp3NE+2a6ler1WpgJtuTXEv+TGCURUK9srKLcpB+QGO/J26pFhqQovLEP72uL3kW8zXDlNW51++6uJJsrE1212s6JzPLSV1jntOrB+exnyQMV9sbNEVVzwyaqonA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.12.0
Release Details
UpdatedApril 23, 2026, 6:50 a.m.
Changelog

Added

  • Shared Files widget — new dashboard widget showing files and folders that team members have shared directly with the team circle (e.g. from Nextcloud Notes or Files). Displays item name, type icon (including a dedicated note icon for .md files), sharer display name with avatar, and share date. Paginated at 10 items per page, sorted newest first.
  • New GET /api/v1/teams/{teamId}/files/shared endpoint — returns paginated list of files/folders shared with the team circle, excluding the team folder itself. Accepts page and limit query parameters.
  • New shared_files app toggle in the Team Apps section of Manage Team — defaults to off; team owners enable it explicitly. Independent of the Files (team folder) toggle.

Fixed

  • Fixed team folder query in ResourceService incorrectly picking up individual file shares (e.g. Notes shares) as the team folder when no folder was configured — query now filters on item_type = 'folder'.
  • Fixed shared_files toggle defaulting to on in Manage Team UI for teams that had no saved state yet — default is now off.

Added

  • Upcoming Tasks widget now shows personal tasks alongside Deck tasks. When the NC Tasks app is installed and the team has a calendar, VTODO tasks from the team calendar are fetched server-side (Sabre/VObject, direct DB query on calendarobjects) and merged with Deck cards into a single sorted list. Each task row shows a source pill — blue "Deck" or teal "Personal task" — so users can distinguish at a glance. The two task types also use different badge icons.
  • New GET /api/v1/teams/{teamId}/tasks endpoint — returns upcoming (≤14 days, non-completed) VTODO tasks from the team calendar.
  • New POST /api/v1/teams/{teamId}/tasks endpoint — creates a VTODO in the team calendar via CalDavBackend (QB fallback if unavailable).
  • New Create personal task action in the Upcoming Tasks widget header, which opens a modal (title, optional description, optional due date/time). Shown only when Tasks app is installed and team has a calendar.
  • The existing Add task action renamed to Create Deck task to distinguish it from personal tasks. Shown only when team has a Deck board.
  • resources payload from GET /teams/{teamId}/resources now includes a tasks: bool flag indicating whether the NC Tasks app is installed.
  • New AddPersonalTaskModal.vue component.
  • New lib/Service/TaskService.php service.
  • New migration Version000310001 — ensures teamhub_integ_registry exists and drops the legacy teamhub_integration_registry table if it survived an NC uninstall. Fixes a scenario where NC's "delete all data" uninstall keeps migration history, causing the new-name table to never be created on reinstall.

Fixed

  • Fixed oc_teamhub_integ_registry does not exist error on installs where NC's uninstall-with-delete-data flow preserved migration history, causing migration 000209000 to be skipped on reinstall while the old teamhub_integration_registry table survived.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureSgfXebprj3dl8qsJCiO/pE+phwLvcTd5NcSGL2buF71GuT7a/fqkQWJ0XTwULl70Dw7D4/wJbMX9+fLnwXK/VvfRS1S1UNa8VUtCiuUJU4f4hjrnxYWuBT6oledtiXpb8fVeB46bTzwVJXTc57HHMm4Fz6L/rjutbeu07fLe5dNIAVXUL8niOfGyeMhBLijQDAsvlcOgBvpFXSqHscgF7IwOYTJdRqoyvAJQZgoxdlffHLnL5isK+GnjJCQXt6WzIxhiHbkMQlr+SwjPdvqo5UcvRCAHoiMS6sVQFmt1TJAHzygxHBK2g58Gv4NRvm/HszdMxCbkJVpgZFeqTO/WOrNTQaIiWIHGlK2XWoVVZetF0vvSlOynOXQqS9SVHmvOhfdH594EN1kwALAckCSdIvaeIdJpA3AgeS5er9GPMQI6lRWX6gP9H6WLAFGSFLjY6HpJvcr8mXBUGLzZWjnqd2w/WzDyGf/SfwMvf7NrgrmkEbkxEkRXYtUxkjJhlIX/g6vQicisTwHViMbO1orUbP6DvXcoXWGcu9iwlnumGSrMFbBwDsP/163U7kO52RjXg4tRxpZ2G0UOzKKx5Nc7TUA87bkxLO3SjC5yL536poI+22uNYSoWsxQpk9KGsVi0xiaLLms53Kp4KnXU7LPMQ+ZAlpb3U63sBLVkRHQhstg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.11.0
Release Details
UpdatedApril 22, 2026, 9:04 a.m.
Changelog

Added

  • Upcoming Tasks widget now shows personal tasks alongside Deck tasks. When the NC Tasks app is installed and the team has a calendar, VTODO tasks from the team calendar are fetched server-side (Sabre/VObject, direct DB query on calendarobjects) and merged with Deck cards into a single sorted list. Each task row shows a source pill — blue "Deck" or teal "Personal task" — so users can distinguish at a glance. The two task types also use different badge icons.
  • New GET /api/v1/teams/{teamId}/tasks endpoint — returns upcoming (≤14 days, non-completed) VTODO tasks from the team calendar.
  • New POST /api/v1/teams/{teamId}/tasks endpoint — creates a VTODO in the team calendar via CalDavBackend (QB fallback if unavailable).
  • New Create personal task action in the Upcoming Tasks widget header, which opens a modal (title, optional description, optional due date/time). Shown only when Tasks app is installed and team has a calendar.
  • The existing Add task action renamed to Create Deck task to distinguish it from personal tasks. Shown only when team has a Deck board.
  • resources payload from GET /teams/{teamId}/resources now includes a tasks: bool flag indicating whether the NC Tasks app is installed.
  • New AddPersonalTaskModal.vue component.
  • New lib/Service/TaskService.php service.
  • New migration Version000310001 — ensures teamhub_integ_registry exists and drops the legacy teamhub_integration_registry table if it survived an NC uninstall. Fixes a scenario where NC's "delete all data" uninstall keeps migration history, causing the new-name table to never be created on reinstall.

Fixed

  • Fixed oc_teamhub_integ_registry does not exist error on installs where NC's uninstall-with-delete-data flow preserved migration history, causing migration 000209000 to be skipped on reinstall while the old teamhub_integration_registry table survived.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureP+5/blvdXpd4uoReE5CvW4k1/WbnStC9vXXjXI3Tvi8B47QV8Dej4K2Wi+1wXxFQ8zQw/i+nuz4/ZzQSwSPnjzzpbQaNRo12s/x+9pb+MsBprGSUENMK3s8vwutV5QoiD5QLM/rxq7+ysdw47AwQbM+4+VGK/a2tAhuO2H7Q3x8nqRmJCSIZewc9D6ihBpQ5Sue3ywJIKFv8X73guc8LPSxhY+YnmW3Mc2bBdsxbUamsF9EZfkSVA9zebC455uSwufPZKLaWlBltydLWyZrhFZOU8aC4QeirMYCXovzThRQNk8hwkdppc4Gb737JqrVrC4uL/AMIPrTsJ4PcAuLDsmM0E/ZHbmpPBZ8wWDfMZKS3tHZM5K/2My3Sv7W3NhkQIzMuh2yNDAcw5r2B20mu34nSvATXTm3qacGBRmbLq9dfdMkEWMenTHtBzjWlVm0s0A03+gv68lasrzv7moyzlrjk1V6i3UuEo5XAGZCJSITQb0+RJAaIHmGqOBCu0UggevHuOqOMUwFl9aa4MbGa3BwxamSt5rfii22L0bWVHtFeiCaWZGfrhTJNM1WhRd134ha+puHWKpMWv8cxTxWA6FyycE4i+H+KR6yyvLpL3viVGPm+24BzSk3GPHdfEetvu2/H7WX1vnTR8NBzKt8dHxAj0YSegXYFaPF+0EO0fEo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.10.1
Release Details
UpdatedApril 21, 2026, 1:22 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureSxVjtNOVjWRSbm2YIc1M9cvaHIgVbVJbMJcD6FMStLGHteX8VzmSeEq+gpTZTER2VsyukDvVKRWOW3TXPTyzWF3UuC8mZSpEaK4bGHi83B3natM149njVrYyxy0BawErj4YH3VlvPzl4ok8z5hwAFWKGyFNJ2CulO2lsUfwDnhhLsvRAIjZzX+KZ2C99byqV3qFRnWo3kI+JT5PpE5+ug8T3KImQYKwGuMDq6+zFF2Qi+edECt+5TiO/rr3MFCZvSwwlwaNOEnCUjpA5wcwreGKqP2IpDJi+TwzjcJ5Mlmh6/qNjdTTkZ1tRvH5zKrZRHxAqSH0T40TMQM/N3huouEQE+fqHfJXgJXy3t99UrpWUfY9SX/rLWPQCkzgco353IBY1YTacz/cCH2yVlrTMty+EmU4iTOo2876PutuV43kDSytBtGzinCY78vrZ6D99fl/UkU5fsdVFVh91FZiPyd/JnCgTl59rm32K6rEhUmaMeXvKjl8CTuWKc6Z0TZ6qS/GPjeAVxHlpzRMIkhbjMOGnlWAKAlabDRIxZf+SSNazjnI8SFkOUOo5yCIoxMF9GjboNA81NkIg6PYdEaiooPTXiGbOd7cmuh4FNPWiniG06hn+BXX9jpO3zJNTKbmxP4g4dyWMm2923/miX93CtmyhsYWn2OcjX+YLLf78TgQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.9.2
Release Details
UpdatedApril 21, 2026, 11:15 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureVqSPboP020ssz+waXZIgJ+LTvo3hMESzHvMEKUi5BrRSPiplINi3X1Etr3zo/IQIgyv7BvaMYyjNs33q4jz8Y5oaawenqkCDw6XrV8F34rYPZbW0AabIGOAw1Ghy7Qg3mlbkq+GydCzfAMiEHro9sfi1C6kffOdijPwNm3EWPGurR7ERfDa19qeEfqoEU3Ni+//+AnwrL+rP+jf9pYM+q+/49CxT1zs53TqMTZyihHnVNbxOLCR7sgJtTVHR9NBR2HjEhFt73nxFBFn3b3j6OwoIgUX2l2lQR254lB/mgs4uD510an48qHLsYbE72Ph+LM+x8g7NtsLKbzyM24dA2+mL8PiwJhZUCfTFpbPVuiSX6OESUBbml7pgqFFv0dA8FD4gtqxKErPvD7CMaXR4mGrkit8bkkfReObVjBQZyCVl1S9q9Sj1ckfJpUlR5jmBfY39QzY3Bv/+V0cvqxxC+P25xmbvh6VHbnBMcJ9uxs4XW1lhjqvvJFTHS3nJJeQX/tm/q9k2qjnvLEe8nliMc7k0NtZxXdJI4pBPawvBaM5T91AKvzpKWrzmzIxTOWYT0HmgSm6cPPT/EBZl/YaXTO4a5xSNmCljGn0uo7bDiWtwcFNUuzCXG7FirlkyxiOkNv6DaZMXczzv89o0vMubHotd/OzddrXphSIrvkfA+Xg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.9.1
Release Details
UpdatedApril 21, 2026, 9:46 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturemX7RsaWak2BPhu44QNActtv1oaoiKlo5vmrzmf+iPPoJPMw0cAXoq2UcPpHnsrPme+mCOiDv+yETlWFSPdesr9U3ffdI56rxQMRqkgAv5QErwwE/jqqyte15iT2wHFrEF6aCn8NnF9bIElrCfmdL8kPwEKbgcrUBom/cQRFlWbqnmd6QRzqY+bevPIx6fXaA4ZTQbuGaR1PikE2Tskm0ETCtHf05Axg6eJ+fjgHAdR/bgsl2/2+giwe3fmoyPaC0GVsuoTmGjduMSPaUINC1hA7NPKM2aHBLvXYcGqNzKF6Wtr+la8VqOq4akwYoSlGvWOQ5uw3gTCubRhDRmMrxb6t1QABD7CseBzMKjTv/Z+ib62hrEj5IoP/qRdiovYZVJQ+VQHw8pqBJqS+a014t5m1+h3nPpZTT1heoyR0qA44AXmGhqcCVCGcMuVAtw7trENCY17FbHradrLmEofCLxoGuCAuviFXQo+03kxTL3dc4pgUm6G1+/RoX5hM3jtYmi5tBmFmXLBT8qsr1ZEStRin8aLwKBr92oeejMhLvyPN4wryntUpq8FL3n+SERCsovIvuwmMw/MOuBrL16xEL0FRa/EKlqN5F5z9gtR+ckjap8/SLQDYu7jbZUD3CGjKJbsaCeKv/Lbsw/tDqe/ZXeg7cZaq2tlPTN3g2kFah/Ek=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.9.0
Release Details
UpdatedApril 21, 2026, 8:24 a.m.
Changelog

Fixed

  • Fixed fresh-install failure: teamhub_team_apps.enabled was declared BOOLEAN NOT NULL which Doctrine rejects when storing false on MySQL/MariaDB; changed to SMALLINT NOT NULL DEFAULT 1.
  • Fixed same BOOLEAN/NOT NULL issue on teamhub_integration_registry.is_builtin; changed to SMALLINT NOT NULL DEFAULT 0.
  • Added migration Version000300801 to apply both column type fixes to existing installations.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureVWWGR5wGqe3Eax5KKz+AQ9nvFxwwNzPj4Zsqen4x72T9rHc242F+i+eaIMt/ae1/SelQGyv18ckoH5xA+eZEF+PzJj5vmcq2Zwx+PwlLTD+ieyRfaFcVc0kkYXTqMKa6/laXrNrwHuBHRsG+5wyJLkXm78H2OG0HMCIm71b7x06pIxU/eN2i6pEcTaTajyUbxPd37FsGv591XzyRKZGK+Z1DZXdMI81aE1g68xGeQLpnkKLPjURMzw3NnqZkcJiiU+fhDggu4O32obgcc2MOgrOo+ciHNX+RKFxkdYLs/qZzbS/RDdjxvnE9U5eESH7hAXU/ww8k/vSdtxEU6vrSd94Mg3GDHhjjS9jj/tLJYCk0J3MQp6EJMVRIInhgNIJJf1VkoCJk2MkTdpgF/GWheW9SBVFD6+IbzR55Ss2OYQK42gXtuNItWBm9ZCvShB5bxnmL4JtZ5I9ZfmmxD6BuZFwAkvnDIe6bt7wnVt8rZ0F0X5f7PrEzFoNq5TnagELFx0Z7HM/8OxRXwOLJtblMZeEI+tFRKxlgSOcI4EBroGwsGQ6sHELNWbqD0XvQBxmjVGjAEXfjx5yp+xwmc5433StzDcu6ItEt8wJQYKQ91quGR1MjEKwwVqmzjtNX77lt2aSKzvy4ibb8g1Xa3uHCUd9PmtdzN9FiBK2G6Gj4flA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.8.0
Release Details
UpdatedApril 20, 2026, 7:08 p.m.
Changelog

Added

  • Telemetry payload expanded with six new anonymous metrics: nc_version, user_count, member_total, message_count, builtin_integrations (per-builtin-app team counts), and link_domains (custom-link hostname frequency map).
  • link_domains aggregates custom web-link URLs down to their bare lowercase hostname before sending — no paths, query strings, ports, fragments, localhost entries, or numeric IPs leave the instance.

Changed

  • GET /api/v1/admin/telemetry preview object now includes all new fields; admin UI automatically renders them via the existing JSON preview.
  • TelemetryService now depends on IUserManager for user counting.

Security

  • All new collection paths are read-only DB queries using QueryBuilder with named parameters — no new user-input surface.
  • No new endpoints; existing telemetry endpoint remains #[AuthorizedAdminSetting]-guarded.
<hr />

TeamHub v3.5 — Changes

Admin Maintenance tab — full teams grid

Replaced the old "Orphaned teams" section with a full teams management grid covering every user-created team on the NC instance. What it does: Paginated table with search by name, "orphans only" toggle, and per-page selector (10/20/50/100). Each row shows team name, description, member count, owner (display name + uid), and creation date. Two icon-only action buttons per row: set owner and delete.

<hr />

Set owner

Admin can assign any NC user as owner of any team — whether or not that user is currently a member.

Delete team (admin)

Admin can delete any team regardless of ownership. Cleans up all associated data before destroying the circle.

TeamHub v3.6 — Changes

Activity widget

Deck activity now scoped to the team's board only — card events (deck_card) and board events (deck_board) handled separately Talk activity scoped to the team's room via numeric room ID — eliminates cross-team bleed Calendar/DAV activity subject strings corrected to match real oc_activity values Friendly human-readable labels for all Deck, Calendar, and Circles activity subjects

Manage Team — Maintenance tab

"Danger Zone" tab renamed to "Maintenance" Transfer ownership added — team owner can promote any current team member to owner Ownership transfer requires two-step confirmation and demotes the current owner to admin Leave team now shows the real server error message (e.g. "Transfer ownership before leaving")

Admin Settings — Membership cache integrity

New section in the Maintenance tab: scan all teams for stale membership cache Compares circles_member (source of truth) against circles_membership (share picker cache) Per-team Repair button rebuilds the cache — fixes teams invisible to Files, Calendar and Deck share pickers

Files

Re-enabling the Files app for a team now works correctly Favourite Files and Recently Modified widgets no longer appear on teams without a connected Files resource

Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturegblBv20FJFNq/Q3H9jPQvNSRrs/neT76/CRFwCF6dL2UmGY2TAsKmh06rLTNssVtnttoSuD1vlgANctX1gukwUMRAAXpjp6tHRg8u0II0g9C6sdwaLRstUJGExDUxRr5sbbgVwvRDY2GducpZRWSAyNlTSanLLJl9Eb6YAviLXr5AUAmczvdNRCa40GrHhytUe2O+oMfPtQJliOtotxL47VWvOynucGMWlj6j5ZghCx6gkTazlmWTFQQ/5VOe3EqPZyel9YSGJ4TtXwLOgQHMrBo087M34nxklShndZR12uYeZJ72n81ycvpByC10YfhDwaife+W+TeZBVtTrvo4wmqD8wqbkFsrNdp8DvMSvlVBKtibdZleX89LUG5RTsFQelFaOQjz+4A0h/xp2AhsTUtRef3vRCZCcmARieLz+g2ZaYn5EWnYDCkIPjLe/Kl9KCamL24QaSFyjBfVKcYX6DbTRCUG5xBrsEuEDWnZ9HHTUWZJO5UiqVsfvvHIzWuZ9j2vmRbsPBbKs0dRkaqO/04pDqdZaL5GLqHWjkv4wz+wiOnnMDnNKOtpubvW2HHmRSf8/TGQdzmdvr5ha+tjbOYqCKj+YMYI1jR2PWfIzxWSqzUbUrPDN6r7uEm4/r+f9ydI706wPr/f6BQlPDjq8DOIBTUC3Pc9Xdyjx2xOEio=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.7.2
Release Details
UpdatedApril 20, 2026, 5:58 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureRbq64iwUhPtTjRur8beQ5RgKG0BP0V5/7JaxZYTvBH/PFPcDmjy7EILWhL6IHsowijr6XTZWQlFbL4YZKdPQyW0PJxIm65ECq7IbqNLYK24hL8O/N1HweSZhVd5Dls+3pj9uvvR7ysrfxEt/cYDtHMxn0Ts7HcEdPFX3ONUpithodHeI9dfmNZgz6Fxk9cn+l/Pczp+JuqFa2L2h6YBJzQszsjGlVd1PlUE031Dj/6kYqRC8mQy3qpje7Xm3l6AHU2JrqAD4f4/dsSst7Cojx1sB43sy5yHnO5dSYMoYOVrxKciNrbwk7jW3CoX6XJWhBwJzLN8QKBoLOlrYpEyjYJXj+SeOim39vOvq8dsL2DpeOAhoxUNAuKQC+A0Gv4XhdeSX1FYZXmC20tgXXDln//qXChvYbE6usUmFz0iH0jP2yxqKbj48TZDID7wOyGGX0WHzHmD+zMY/alrx2+jZBqm7+BaFHT9UvDrmY6uIDAWtdbMJO3EhK2Sdn+k5DqenejwYO0yF+o5mU+itgx2pmyNWTF9/B8FcoeZIJExjZBv9/AnW0nP0WgkwqR8JmpaaFObbBWhYLXpIskLmXAfkqvfnYA7yli2bf48LR6yCkARYV2T85lkndOgH6oH51quzNvF2J7o/QcSzC83r2QIln7n4BW/X9hR/yweUkZLDU5Q=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.7.1
Release Details
UpdatedApril 20, 2026, 5:20 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureoWjRFEQ/K3TmpTN0v0cyubM8gFWkzxa8wTKg+A4SGZYjJD4rQHOYb5JacVYVkzMAWM20Gso1z5774wa06Tlh4sShGxSvN76lBZIFQSgOwt2sCXOAnc+Ng+aCCQIxvZOqxSbD7qU1u4A6eDsOOAf3TNXof7N2w1WpzgaD38u0O3qP4F/qNYIbtOelWQ4bHwjrEo1Vx/ubytlASypuqY4rvX6vK0G+vqIsJ2fo13Vyl+s+G0kOhHvtbUgw0VCuk1tlqYU5ORW2XLxsLmGwOWL/cqBRKGmvp2+GJhCd0edluHSxdBTM//Eis/WwfMImT/X5IZ8zuysnXmsX4AeXb8S2wszrIJH+mPkDbWICAr+Et06lJP++vxM0VhWirUYIzkXjL6U6qtA7Z/SC1U3iWhUQwIuAfxRjxcWkyKtIcjUpCgPZX9lLVJGWDP6MtGoKaSJ1nIzyOOLnRdTIqoiDdd9ObMxEC5QpfY1m9wGCyZMahwYO/jkmPWRO9aJSJhmP4+TEIyGabGiKuRSpv/3BDSa6MdD5GPTxu9ST5j04fzXHq/XFPMT/oq1jZMiLou+Y/vdEN3azm2BK16+F5LGCN5+sY5oxDNk5TSftF0TGfrPklgjFPqcK2QVGISZatkwwFfILCVJ9ckpju9jkwMXAnejZmffq0ott5qbn0T8g++E9TAw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=32.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0

Nextcloud 31

TeamHub 3.48.0
Release Details
UpdatedMay 22, 2026, 2:02 p.m.
Changelog

Fixed

  • Presence module admin tab still visible when module is disabledtabs() computed in AdminSettings.vue now conditionally includes the Presence module tab only when form.presenceModuleEnabled is true. When the toggle is turned off, the tab is removed immediately and the active tab switches to Integrations if needed.
  • Team Info warning strip height and chevron — replaced "Open settings →" text with a ChevronRightIcon icon (consistent with DeckWidget unassigned-card nudge). Updated CSS to use line-height: 1.3 and icon-only button layout so the strip height matches the DeckWidget row exactly.

Added

  • docs/USER_GUIDE.md — comprehensive user guide covering: team navigation, tab bar, presence tab (team view), My Presence personal settings (weekly template + date overrides + calendar integration), team admin actions (members, settings, presence toggles, links, danger tab), and FAQ.

Changed

  • README.md — updated to include Presence module, Members widget presence dots, and updated admin settings section.
  • INSTALL.md — rewritten as a full NC Admin guide: installation, all admin settings tabs (including Presence module on/off, status types, locations, holidays), optional integrations table, background jobs table.
  • src/components/AdminSettings.vuetabs() gates presence tab on presenceModuleEnabled; toggle redirects away from presence tab when disabled.
  • src/components/TeamWidgetGrid.vue — warning button uses ChevronRightIcon; CSS tightened to match DeckWidget strip height.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturec1kXc8h5EzClzIXkf31zt8pGVXg3BuummH2w9N8T6IWSrfHpsBZuGYBqJcy0zwn/JXKRB5RkebdfuaE6LLwVOcqUlz15beSyi6Y6Fr+rkRXqQti8lzHYyJ9vtTzn963I4fEstaa8q0b9126Ts+UMTUe3rrS+/4kJV21dCiAui6GiPsdKzGp47QuNw0k9YiqSZ24NCu+6QsnoyrHvoQTwnrPHHIcZ/w7bG1VbtO9mob5Cq9bB0tS/zbNzzi9Jph3AZ3MtzGjx/4mZ4KR77DSC55OqDs9vfK0KW7+e45JbRFrtpHUldjgpXL/6MIsR3IYbif+/uVDTqghjUJtOLaQ4FsApnKesfqTchH4NE0jebUnpeToqGBGVERKvs9XrJ7F7Qnu5IsCqUhJ4B2xQmGADGWJUBlPOfKB+lH2lCtPSkDJzehylwrWOJtOtg9X7SARV+G0q379DtVbC2aHnj2DpN8BivVsZ8hsCgLDxiCcubqHVP1s3nAx0q00qMEdIZwIGA3IU/LRSp73V6ZqaL5JXYBtjVNBNqResl7Gr0IaFfe1++B6mVFY6L0iHgsTKVtZgBCPnudVXBDx+Y1inUuIGVtcm2YvsL+ed1QdCXkLxdyHa+Mvdu4zotE32LYzKyz6bsci3Uz/9xwvMWyD48nPc0UGtABCOw8UG16di/2NtzwE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.41.0
Release Details
UpdatedMay 18, 2026, 2:31 p.m.
Changelog

Added

  • Unassigned card nudge in Upcoming Tasks widget. Each connected Deck board now shows an amber row at the top of the widget listing the count of cards that have no assignee and are not yet overdue (no due date counts as not overdue). Clicking the row opens that board in the embedded Deck iframe — same behaviour as clicking the Deck tab. With multiple boards each board gets its own row, sorted by count descending.
  • Team-as-member support. One team can now be added as a sub-member of another team. A per-team toggle ("Prevent this team from being a member of another team") appears in Manage Team → Settings, using the same CFG_ROOT (8192) bit that Nextcloud Contacts uses — the two UIs are now in sync. Admins must enable the "Teams" invite type in Admin Settings → Invite Types before the invite picker shows teams. Teams with the prevention toggle checked are excluded from invite search results. The admin integrity check flags only the contradictory state (team is nested but also has prevention active).
  • Deck board activity in team activity widget. Deck board and card events now appear in the team activity feed. Includes board name and card title extracted from Nextcloud's own subjectparams JSON, producing descriptions like "Justin created card 'Fix login bug' — Sprint board".

Fixed

  • Critical: Deck activity was completely missing. ActivityService was checking $resources['deck']['board_id'] but deck became an array of board objects in 3.28.0, so this check silently failed for all installs. No Deck activity appeared in the widget regardless of how many boards were connected.
  • Critical: updateTeamConfig() used wrong bit mask. TeamService::updateTeamConfig() still had $MANAGED_BITS = 1|2|4|16|512 (pre-3.39.1 wrong values) as a local variable, overriding the canonical constant. Every toggle other than "Anyone can join" (CFG_OPEN=16 was in both old and new masks by coincidence) was silently discarded on save. Now uses CirclesConfig::MANAGED_BITS.
  • Critical: ManageTeamView config constants were the old pre-3.39.1 wrong values. Identical to the 3.39.1 bit-encoding bug: ManageTeamView.vue had its own local const CFG_OPEN = 1 block instead of importing from circlesConfig.js. Enabling "Anyone can join" was writing CFG_SINGLE (1) again, hiding the team from Contacts. Fixed by replacing the local constants with a proper import.
  • searchUsers() circle search used iLike() which does not exist on NC's QueryBuilder. The exception was caught silently, returning zero results for the circle type every time.
  • Deck board picker always opened the first board. Moving selectedDeckBoard to Vuex introduced a Vue 2 data/computed shadowing bug — the local data() property with value null won the name collision against the mapState computed getter, so deckUrl always fell back to resources.deck[0]. Fixed by removing the dead data declaration.
  • Integrity check falsely flagged all team-as-member relationships. The check now only flags nesting as an issue when the sub-team has CFG_ROOT set (prevention active) but is nested anyway — a genuinely contradictory state. Valid nesting (CFG_ROOT not set) is silently skipped.
  • PHP parse error in MemberService (3.40.1–3.40.3). The str_replace tool double-escaped backslashes when embedding PHP namespace separators, producing \\OCP\\DB\\... instead of \OCP\DB\.... Caused 500 on every MemberService-dependent endpoint.

Changed

  • "Prevent teams from being a member of another team" toggle now uses CFG_ROOT (8192) — the same bit Nextcloud Contacts uses — instead of CFG_CIRCLE_INVITE (16384). The two UIs now write the same bit with the same meaning and stay in sync.
  • fetchDeckTasks card-ID lookup changed from one OR clause per card to a single IN (board_ids) query + one IN (card_ids) clause in the main activity query. Scales better with many boards and large boards.
  • Activity formatSubject for Deck events now includes board name and card title when available (e.g. "Justin created card 'Fix login bug' — Sprint board").
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturep6LBsh++TW1EqF+MTvnOs6DGrDmygcM7b8y6mw+FEkpajSxEmmL3+PIaRlrp5whx0V+Oyxe5murZYLWDpbtVLsD76tLPJ4jk+CVpiCHlSbn6kBbERKaXDpf1UkCIir0wHxdRJ1btIsry1Hyv/0JhDzfrLKevuqicTRDpOY7zJ3gMd1Pl/PQgwjYlmiK/VApSyDVeniqEQN1iTwQjjPTq+gTo9NEtE0holECcKUEtU/FRZRHOtcNQQwUxJqtvqX3hieTg3ttDUt0wV2VK8NarlnGuuoXWwaF5YyyS/5BaLL1kYO+YAKy7SFHhAV/LeEkP/oLbcRUbBVbNRyno2vmcJgK+mPLczW88EqKblVkLfdiuvZGRLqP5nP1XtrPUhTzzLUvnPdWIBxNPz+FrcJN59NC8MTzR/SUgtU7sCRe8YNAAHf9JF3P/V0uxbYuICZUpS7+h+kPkTP0cblORVUSeQT/F+bC3Ys7fs8xwBs6dpvH77ye0bGAfXmwwB5UwfH8CwfJPGWtNDyti46QqXevr+nYd0cyWttpeU6znMFemtiPv7cgLHG97gdgedCEX0Rfw1UwyxwVECCQULMzn54atIpjSscewqBAUtSZT6Q1gOcfRQHgWEn8oC75mRdjz8/KAQrYiQU5pujdAWv4AEP1RfTJ1Zna+Zyc9SXsAXLFdXIo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.40.0
Release Details
UpdatedMay 17, 2026, 7:32 p.m.
Changelog

Fixed

Circles config bit encoding (was 3.39.1)

  • Critical: Circles config bit encoding. Every TeamHub release prior to 3.39.1 wrote the wrong Circles config bits when users toggled checkboxes in the Manage Team settings panel. Each TeamHub label was mapped to a bit that meant something completely different in Circles' real encoding. Consequences observed in production:
  • "Anyone can join" wrote bit 1 (real CFG_SINGLE) → Circles tagged the team as a personal identity circle → Contacts hid it.
  • "Visible to everyone" wrote bit 512 (real CFG_NO_OWNER) → Contacts refused config edits.
  • "Enforce password protection" wrote bit 16 (real CFG_OPEN) → team became open-join.
  • The always-on "Prevent sub-team membership" hint wrote bit 1024 (real CFG_HIDDEN) → team disappeared from listings.
  • Settings made via Contacts and TeamHub no longer round-tripped — each side read a different field of meaning from the same column.

This release corrects the bit encoding in both PHP and Vue, introduces canonical constants in lib/Constants/CirclesConfig.php (mirrored in src/constants/circlesConfig.js) so the drift cannot recur, and ships a one-shot migration (Version000339001) that decodes admin intent from the old (wrong) encoding and re-encodes with correct Circles bit values. Admin sees the same checkbox states before and after — only the underlying storage changes.

  • resolveUserSingleId() DB-join fallback was checking config & 2048 (which is CFG_BACKEND) thinking it was CFG_SINGLE. Now correctly uses config & 1.
  • browseAllTeams() CFG_VISIBLE filter was filtering on bit 512 (CFG_NO_OWNER) instead of bit 8 (real CFG_VISIBLE).
  • isOpen checks in browseAllTeams() and MemberService::requestJoinTeam() read bit 1 (CFG_SINGLE) instead of bit 16 (real CFG_OPEN).
  • Manage team → Settings tab now always reloads from the database when activated. Previously the checkboxes showed cached state and external changes (e.g. via Contacts) were not reflected until page refresh.

Unread message counter (was 3.39.2)

  • Unread message counter restored in sidebar. The NcCounterBubble badge next to team names was effectively dead: no polling caused team.unread to go stale immediately after page load, the counter was hardcoded to display "1" regardless of count, and team.unread was a boolean not a count. Fixed: backend returns a real per-team count, the badge displays the actual number, a 60-second background poll keeps badges current, and posting a message triggers an immediate refresh. Excludes own messages from the count.

Group invitations (was 3.39.6 → 3.39.14)

  • Inviting a group to a team now works correctly. Circles' addMember() was creating an Invited row with level=0 for non-user types (groups, circles), and Circles has no working notification path for group invitations — so groups stayed in permanent limbo and TeamHub's filters silently hid them. Fixed by auto-confirming group/circle membership immediately after addMember() succeeds (UPDATE to status='Member', level=1) and triggering a Circles membership cache rebuild so users in the group get immediate access to team resources.
  • @mention now works for indirect members (users added via a group). Multiple cascading bugs fixed:
  • getAllEffectiveMembers now correctly reads from circles_membership (Circles' denormalized cache) which contains every reachable user including those via groups, instead of attempting unreliable IGroupManager lookups by GID labels.
  • Frontend store correctly unwraps the {members: [...]} response shape (was treating it as a bare array and discarding the data).
  • Mention autocomplete supplements OCS results with team members that NC's user-enumeration privacy settings would normally hide.
  • Manage team → invite flow refreshes allEffectiveMembers in the store after adding a group so mentions work immediately.

Added

  • lib/Constants/CirclesConfig.php — single source of truth for Circles bit values, plus MANAGED_BITS, SYSTEM_BITS_FORBIDDEN_ON_USER_TEAMS, and the migrateLegacyConfig() decoder.
  • src/constants/circlesConfig.js — JS mirror of the same constants, imported by ManageTeamView.vue, CreateTeamView.vue, and TeamWidgetGrid.vue.
  • Reset config action (icon button) in admin settings → maintenance → per-team row. Clears all user-managed and forbidden-system bits to clean defaults. Confirmation dialog before applying.
  • Config bitmask integrity check in admin settings → maintenance. Scans every user-created team for forbidden system bits (CFG_SINGLE, CFG_SYSTEM, CFG_NO_OWNER, CFG_HIDDEN, CFG_BACKEND, CFG_APP). Per-team Repair button calls resetTeamConfig().
  • Three new API endpoints:
  • POST /api/v1/admin/maintenance/reset-team-config/{teamId} — clears user-managed and forbidden-system bits, returns { oldConfig, newConfig }. Logs to teamhub_audit_log.
  • GET /api/v1/admin/maintenance/config-check — returns array of teams with corrupted bits.
  • New Vuex state allEffectiveMembers + fetchAllEffectiveMembers action + UPDATE_UNREAD_COUNTS mutation + refreshUnreadCounts action.

Changed

  • repairMembershipCache() now strips every bit in SYSTEM_BITS_FORBIDDEN_ON_USER_TEAMS before rebuilding the cache.
  • updateTeamConfig() MANAGED_BITS mask updated to the correct Circles bit values (8 | 16 | 32 | 64 | 256 = 376).
  • TeamWidgetGrid.vue::teamLabels — labels now read from real Circles bits. The misleading "No nested teams" label removed.
  • CreateTeamView.vue — the "Prevent sub-team membership" checkbox removed entirely. It controlled nothing real and wrote CFG_HIDDEN.
  • Audit log event types: new team.config_reset, team.config_migrated_3_39_1, team.config_migrated_3_40_0.

Migration

  • Version000339001Date20260518000000 — one-shot data migration. For every source=16 team where any legacy-damage bit (1, 4, 512, 1024) is set, decodes admin intent from the old encoding and re-encodes with real Circles bits. Skips teams that have no legacy-damage bits. Logs every change to nextcloud.log and writes an audit log entry per team. Bursts Circles' APCu cache when done.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureGeQDw//MDpb0NtdSeSx4urPBtzDCZkP+xEB9nF5kRi3kZ2CigAJ/pJn2tgVVtjITIzJJJ37xowH4nueQhSZk5Y76gK/cHa3dPuGf0Usbwlr8BndOK6DdX1Z167TczCB13ZXU93YnfjVfUcfneTZJPyz/0iMbJs1tAF4nH0OzWDVmTYmiRtCFhHqtbFbFFkbSVOmoZjE1UNVPwDweNY0fPkusKS5beXTm0qaKXBhYXhakqhnxycweOfqH3JxjmCiz0aZbcdqdeNRCUw9bAJtK7Agp/xEwOv1PKTey4Q4i9VA7yDYg5lWhDKLalX72K0jdNUkXqbw2W1hawGzEOgcX2aFoV6MVaVPREoFng515ezHlpOWyC6xk7yOq8EsX40ypKOCdBJiHGPE82/GUnRLdeKkkkSrpygNdaH2FIS2STEIsswcyxXyUwJnVp3qZB6NrMZhjuoJ2eVQoqb5O+eM/UaiH+yEM4y5bt6rGsM9D5u4RbXZHdzd3iYo9Qnz6oidcb7NYZWYY7S3yYJqPWlpJ91ehgJ6+W/t5GL05ms++MrvmE+oxM6pBMXW/P+WSe9fb4ckW2aIGwdEUoyB2fsDMgPDg6ej7cHvWbB/EvvhSfUfXNJTjDteSH+W0TuL5Y5UNLUbXzJJiPHl1EbSPm3Cda3krOwRrIeJdRk/iCWlCIVc=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.39.0
Release Details
UpdatedMay 15, 2026, 2:35 p.m.
Changelog

Added

  • Integrity check: nested team detection. Flags any circles_member row where a user-created team (source=16) is a member of another. Repair removes the offending row.
  • Integrity check: CFG_SINGLE corruption detection. Flags source=16 circles with bit 1024 set (causes Circles to hide the team from its own API). Excludes legitimate personal/system circles. Repair: clears the bit.
  • Integrity check: duplicate member detection. Flags circles where the same user_id appears more than once as a direct member. Repair: keeps highest-level row, deletes rest.
  • Integrity check: no-owner detection. Flags source=16 teams with no level=9 member row. Repair: promotes highest-level existing member, or inserts calling NC admin if team is empty.
  • Integrity check: wrong display_name detection. Flags circles where display_name ≠ sanitized_name — this causes Circles to misclassify user-created teams as personal circles. Repair: sets display_name = sanitized_name.
  • Link permissions. New linkMinLevel setting per team (member/moderator/admin, default admin). The + button in the tab bar is hidden for users below the required level. Configurable in Manage team → Permissions.
  • getTeamMemberUids() in MessageService. Direct DB member lookup for notifications — replaces Circles API getCircle() call in the message write path. Eliminates "Circle not found" 500 errors when posting to teams with config issues.

Changed

  • Manage team tab renamed: Messages → Permissions. Pin level, post level, and new link level settings consolidated here.
  • updateTeamConfig() no longer calls getCircle() for cache flush. The Circles API was triggering internal sync that re-applied CFG_SINGLE (1024) after every config write. Only APCu cache is flushed now.
  • CFG_SINGLE (1024) removed from MANAGED_BITS. This bit marks personal circles and must not be written to user-created teams. Frontend no longer sends it; backend no longer includes it in the write mask.
  • repairMembershipCache() auto-clears CFG_SINGLE before rebuilding the membership cache.
  • searchUsers() no longer returns teams/circles in invite search results. Inviting a team into another team corrupts Circles' visibility queries.
  • Orphaned teams query no longer requires app:circles: name prefix — compatible with NC33 which stores plain team names.
  • getAllTeams() deduplicates by unique_id — prevents duplicate rows when a circle has multiple level=9 member rows.
  • Ghost cleanup moved from its own tab into the Maintenance tab.

Fixed

  • PostgreSQL: backtick quoting in resolveUserSingleId() (c.\config`c.config`) caused syntax errors on PostgreSQL, breaking indirect member detection.
  • SQL HAVING clause for duplicate member detection used aliased COUNT() which MySQL rejects. Replaced with createFunction('COUNT(cm.id)').
  • InviteMemberModal no longer shows teams in search results (AccountMultiple icon removed, circle type branch removed).
  • ArchiveTeamModal displays resolved folder name instead of raw /f/{id} link.
  • Announcement banner (mohamedsakhri/nextcloud-announcementbanner) suppressed in iframes via .announcementbanner-stack CSS selector.
  • share_folder config.php respected when creating team folders (AIO and similar installations).

Added

  • Ghost member cleanup. New "Ghost cleanup" tab in Admin settings. Scans all team memberships for users whose NC account has been deleted, grouped by uid. Admin can remove a ghost from a single team or from all teams at once. Includes a live-account safety guard. Endpoint: GET /api/v1/admin/maintenance/ghost-members, DELETE /api/v1/admin/maintenance/ghost-members/{userId}.
  • share_folder config.php support. When an NC instance sets 'share_folder' => '/Shared' (or any path) in config.php (common in AIO installations), TeamHub creates the shared team folder inside that path. Falls back to the user root when the path is absent, missing, or not a folder.
  • Invite button in Manage team → Members tab. Team admins and owners now have an "Invite members" button directly on the Members tab, opening the existing InviteMemberModal. Member list refreshes after invite completes.
  • Archive location name resolution. The archive/delete confirmation modal now shows the human-readable folder name (e.g. "TeamHub Archives") instead of the raw /f/150770 file ID link. Resolved server-side in ArchiveService::getAdminSettings().
  • Announcement banner suppression in iframe. The CSS injected into embedded iframes now hides banners rendered by the announcementbanner app (mohamedsakhri/nextcloud-announcementbanner). The banner remains visible on the parent TeamHub page.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturepLfqcez5PHzBBt4uvQUuBGuVX2F+Ensw6x8TOu2G5BMwPa5XM/IPDpTKwYl5bruyA5CI7UWwW8Kb+NwEOdBR4nQMiMRxg5EJTQeg4mvsz+0P2LK/m28o6zA0D6a8NZThFpd6TRz6iOJybaNjqCZMClHlEHpwWLyuSy8Q+F485bD5TxQxLSWtuEAUFGX5gnj5S5plOx9dLLQKusc0j6guap2BM/rJboKisDS6rkYcMtfPS+/sKtHe9WceNvV6M3ulYWxFtpf4NPlr7XkYreTDYzXWt7m0aaNjxVBn7N4m6DasYvG1FA97K/qO6RdBPHg7GGh6DmoyRw+fE+GsM162FCFfnomewnYPH8yKt05DPueEIbgMkQXeGJ7E19CMan+CyUCv1GvdomrVoNHBazt3IXNH+AIHokIQnj8ScwKFScQ7gahdGkABoULK4fwV90DpxOuxN1uoGC/aDI6+fC1gAN0gUoHaGIgevjn7+jGPGeuAdrbZpnV4xnJBTM/P+mPu3Dc+Dop8irM63XP7dfy8v33NHoN5N2gdIHPGJsqhDpqNSg6T02esJehL42h0yTlaRZ40Qs4el13FxijnnVjk4Cz8m/Q1cPm5x1RSWYpDNQ7NhlQxsWIyLMiZFcfTVZh0rWuitR/NXMKzs3WKwSNdw/xQwgagUStk6O5hDJGM07s=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.38.1
Release Details
UpdatedMay 14, 2026, 8:01 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturep1xq5GU5FgnU+VBmRTq1YN5VobUyjICVQ1UEEoxNmz+9GoTiMzc4SHrb4aQDDAIA8VppLDpx4+z8TKLAi7OgGy6COZK/7CHQrdDt0Qk+q6ACl4AF3l+RgV0DWrHxbP6V/LkewhJHUl9scVJkfIBwoZXK2bITpo65RdDMVDfTiHR7Nf1/jm/nwjpi2ZMYf7Ct969eB7a+IDoydWoYBETd5mlLBp30cWFthnT3uEpPRJYCgKvOdO9iVjBBOP2VtudKYDkUmdKpHbQutIxQbCcnw5455wCS4byicyEfu6oLxN6VYNk+VSttFf+PQlC7TFYNyHW/XOpneBM/z5yA/e9UaipRtFFzG/ZTepEQL6LoU2UgaXm/cPF4rDtqh3t+7BPR1OerRej8cTXsut7zugiKW2lm98Z3yXixEtTe5b0TJajkVTFYXfVBDYFUR5PLsAczk5ipa8O9UgapijqQDYKvqFyHhrrobWdAHs/cUJMZE7UdLJhpvrEeYfQJTSurKXI4uqLx/PIMj7P2C+LYQn71gnxJStjhCxy5syvDt8EQbljl8tlUtGWmbtpojG0JF9k3j502osAoHz5S02c357aqCGmdaY3Q9PlVyG2C12v2AXB1k5dOKG4nJ8IbrKlBYMe8xiqEllgoc722ab4wtcXqQoeA+kWT9q41VyRt6qrByYU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.37.0
Release Details
UpdatedMay 14, 2026, 6:27 p.m.
Changelog

Added

  • Message @mentions. PostMessageForm and MessageCard edit mode use NcRichContenteditable with the NC core OCS autocomplete API (/ocs/v2.php/core/autocomplete/get), scoped to team members. Mentions render as styled highlight pills in the message body. Backend sends a message_mention NC notification to each mentioned team member (on create and edit).
  • Message pagination. 5 messages per page with prev/next controls in the message stream. Page resets to 1 on team switch and after posting. MessageMapper::countByTeamId() added. listMessages now returns total, page, and limit alongside messages.
  • Per-team message settings. New Messages tab in Manage team for team admins. Configures minimum role to pin messages and minimum role to post messages, stored as per-team IConfig keys. Post Message button hidden (not just disabled) when the user lacks the post role.
  • Calendar view dropdown. Embed bar now has a native select for Month / Week / Day / List variants; selecting reloads the iframe with the chosen view in the URL.
  • Calendar embed auto-reload. After adding or deleting events, the calendar iframe reloads automatically so changes appear immediately.
  • NC-relative team links. Custom team links now accept apps/... or /apps/... paths (e.g. apps/collectives/s5) and open in an iframe tab, just like built-in app tabs. External https:// links continue to open in a new browser tab.
  • VitePress documentation site in docs/. Covers Nextcloud admins, Team management, Developers, and Users — 20 pages total.
  • New migration Version000336200 — remediates auto-generated primary key name on oc_teamhub_team_app_resources for existing PostgreSQL installs.
  • message_mention notifier subject in Notifier.php.
  • getMessageSettings / saveMessageSettings endpoints (GET/POST /api/v1/teams/{teamId}/messages/settings).
  • getCalendarEventsForWeek endpoint (GET /api/v1/teams/{teamId}/calendar/events/week).
  • deleteCalendarEvents endpoint (DELETE /api/v1/teams/{teamId}/calendar/events).

Changed

  • Calendar iframe URL now uses the public share token path /apps/calendar/p/{token}/{view}/now (team-calendar-only, no personal calendars). Falls back to full app when no token available.
  • Calendar connect error handling in ManageTeamView no longer logs the full HTML 500 response body to the console.
  • getPinMinLevel reads per-team IConfig key first, falls back to global key. Admin settings Messages tab removed (settings are now entirely per-team).
  • activeFilesIsGf / activeFilesIsShared in ManageTeamView use .some() across all active files rows so the GF connect buttons correctly hide when a GF is active even if a shared folder row appears first.
  • dav_shares access filter in getRealCalendarIds broadened from IN (1,2) to IN (1,2,3) for compatibility with NC Calendar 5.x circle shares.
  • resumeCalendarAccess corrected from access=1 (read-only) to access=2 (read-write).
  • Select dropdowns in AppEmbed bar and Manage team Messages tab have no background color (theme-transparent).

Fixed

  • MariaDB migration failure on NC 32.0.9: Version000328200 now uses explicit 'th_tar_pk' for setPrimaryKey() — auto-generated name was 31 chars, one over the 30-char DBAL limit.
  • Calendar connectExistingCalendar TypeErrorResourceService was passing $resourceId as string to a method expecting int; cast to (int) at the call site.
  • GF connect buttons visible when GF already activeactiveFilesIsGf now uses .some() instead of .find() so ordering of rows doesn't affect the result.

Added

  • Strict 1:1 enforcement for files resources. ResourceDiscoveryService::reconcileApp now snapshots the team's active files state and routes newly discovered rows accordingly: active shared + incoming GF → pending (with isDualFolderPending flag); active GF + anything → ignored (GF precedence); active shared + another shared → ignored. acceptResource and unignoreResource apply the same guard. All refusals write resource.suppressed_duplicate audit entries with reason codes.
  • Group folder takes precedence in getTeamResources. When both shared and GF rows are active (dual state during manual migration), the loop explicitly picks the gf: row so widgets and the team home always read from the group folder.
  • Dual-folder informational notice in Manage Team → Settings → Team Apps. When a GF is discovered alongside an active shared folder, a blue panel explains the situation and directs the admin to connect the group folder via the existing buttons and migrate files manually.
  • Resource-type badge ("Group folder" / "Shared folder") on each active files row in the settings panel.
  • Picker filtering by active files type. GET /api/v1/pickers/files now accepts activeFilesType=shared|gf|none. Shared folders are suppressed when one is already active; both types hidden when a GF is active.
  • isDualFolderPending flag on panel data rows.
  • normalPendingResources, dualFolderPendingRow, dualFolderSharedRow, activeFilesRow, activeFilesIsShared, activeFilesIsGf computed properties in ManageTeamView.vue.
  • Create New button for Talk — shown in empty state alongside Connect existing.
  • Create New group folder button for Files — shown only when Group Folders is installed; switches label to "+ Create new group folder" when a shared folder is active (signals the workflow).
  • Both 1:1 buttons hidden once a resource is connected, except when a shared folder is active and Group Folders is available — then the GF buttons remain so admin can attach a GF for manual migration.

Changed

  • ResourceService::upsertResourceRow() — now promotes pending/ignored rows to active on explicit connect instead of skipping. Fixes silent failure when the discovery reconciler had already inserted the resource as pending.
  • ResourceService::getTeamResources() — files block prefers gf: row when multiple active rows exist.
  • ResourceDiscoveryService::getSettingsPanelData() — adds dual-folder detection and tagging.
  • ResourceDiscoveryService::resolveFileName() — falls back to basename(path) when filecache.name is empty (some storage backends).
  • FilesService::listConnectableFileFolders() — accepts activeFilesType parameter, filters output accordingly. Also falls back to basename(path) for shared folder names.
  • ResourceStateController::getPanelData() — now triggers reconcileTeam before returning panel data, so externally added GF resources appear immediately.
  • ManageTeamView::connectExisting() — empty catch block replaced with showError().

Fixed

  • Critical pre-existing bug in ArchiveService.php: stray extra } (line ~2770) caused ParseError: unexpected token "try" on every admin archive request. Removed. Archive settings save works again.
  • AdminSettings.vue archive form: archiveBeforeDelete was missing from the data() default and from loadArchiveSettings — the toggle had no reactive backing. Both fixed.

Removed

  • The auto-migration system (FolderMigrationService, FolderMigrationController, FolderMigrationModal.vue, two endpoints) was scoped, built, and removed per user direction. NcDialog wiring proved unreliable; manual file migration is the supported path. The dual-folder notice remains as an informational signal only.

Security

  • All new endpoints check team admin level (≥8) before any action.
  • No raw SQL anywhere; no \OC::$server; constructor DI throughout.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureNB4VEY/kY6IM6/q9rg1aZPixwOBTrNlZIbr9hGsb3TcGQ3kXe591A67Rez1U2FQO3FcRuoxZRNXGMJkziuhoaa9RkoGQuHxtueXomwk5UWjFSTbgf8+JFSFXag8NUNM7DqEnRjG3hLad6HdDwdv8t+t7CDhkih5s2rGI7G55B9uSNdY0LftIal9G2M4DBJmpZtJ+1RitAI/ZqqRCjA+lVc0V7AQFeCxVyrt9weLTdXuvzGTZhazmiYZELVrbpUwurxRgmE6itg5pWp+T4FC1ilm7zyz/v6LOSmRBqgNExbS5lbEutYBoKLSKEPfvjAO2emcj54Ng9PwvRlP1iTvGr7jrZ15DZa0mBL6sXMvDpEdR2yvoAsVDvlroHW0aILMDnc3HruzKkmB8ykRyrkOAwVmCRQUPN5pjr6Qre/hCgYWZR0d+YHFopsJ/VDiH6+PH8aYia/92Z6z21kbvT4wUrqwqARyI510Dcq9TLx+O6CeNqYmBiPYkpAUoX1ck+q3fZAH3cqTXH7N5ezRctAnM3CvctmxMG7Gpd9BmLj0wF1p69qGQ4FvpcVSsFoFt3sc8qxfARDRm0fu+avD47k4YvKfR1NFbUhHe+RMYivFWlmCAhwbaObsGt2mCbyfIwxLFM/S4N2+ji8lwYT2wC9cPTHYTL1+dZNwTCCdaTEZIVSE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.36.8
Release Details
UpdatedMay 13, 2026, 7:15 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturelhEnGI/fAC8OFXF2pnGBIlqEN6Bw4EurQEVPeTeuGc+O+1NHT6t7rYfX5gBJinYOJScN0dXIys+FHOvzY/QGT02MbHUDXMqtwzYoegOZBlRE/TXUXp0LKCx+3m+rHjKd9dCtBJi++X2ZUJUqGzsU4Km1WNRKqv6gubdCYUAMjXZmrXtfuEtdOqc5yAgnaA7CxKx+TPcc8bpU+SPkiFeuC9EB+iwnM+3NJThjc6RIQWiCwc9F5i1FsXikkYe9gYENyaraXhZrqj1eeC2hHwBRB5aXYMO9FghzzjvQ2VZo/psiiGWukii17WqKSofNN5N6yeh0Va2q/dT3RRmtRNhZ16D9eCeVLF+w6rUaP3bz3lNZIeksbIkV5E3d3F/FXc51QdNIlQ5D1LdB4ghhVYtvTBFzf5WbB5yzM6uSA/zcR5g02p4iMzLdVoILfkXoMRV7VNISvQfPP9ExuQnw15dpA7nSzIEC2dtLCNoA1xUPTCVCOpz3CMHILjL5F4l8HJtQKx5D9IV8l5Sakf7uqp7SJcx8CWh03/iX6Eibp5HRRS4PsdKyZVKiWgOyG6iXkTktCruXQKGXi5MSwkpPZvYUz8//klH2Bn87PSHJ+q9rtca0j4w/o0QBqnJr03gHcKPh3Y5vD0aaca57svcZPbhr+dwT4WXmEBNkxRlNKwmI0v8=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.36.5
Release Details
UpdatedMay 11, 2026, 7:29 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatures016TbppM9kULPOeWRGdKsV9pcTR+YBhPBA2cPZPRtKPLKxUpr80YJrCOj2+VxmxQrrr0cwaFgQTjtCTw8Uw1ush4zPNdfXfX2HFqsvmP2JYDEFQwk6ftJLwiDfeUk4kDnarODZ2WAJ6Ol22Sq8w4cxdgADyVDii0sRaHyyEnghCuyttUccXzr/1uf1MzlzuH0xhbLSKALpnQVnTKz0jMNgGifh/ug5nh+tmz/nwLSUGJ/n+iyWp8qQhzWtlKQpSSTAW3COCOQvleVoprDWkU9LyOKmQvYXExEmsf9C21olxxEkHygVhDEKKN+2eNmH1XsTyuBmi9SVDOP5uruPsiZs7bnmO9ToBI8oTCtRa6jmu2pJpPjTjIdGW7Mr5US/NEbjljWFdC0KJZ4y0Y5+z6oKExqXb13D/bMndP5uNNZI/0SwLTCCpfd6DYYp9TCESagMG6zARVbIu69ReMWlmvEL2Uhq0hKqlBfhKrHwyrtYRXXzLpn+riNO2WafrOrVmMMT8t1+0aXUdqYBRKz6jpuwRag29IutxSsYwNA9oSlCmjhylald0jhu6AAK9Zi5fg0HuKudr7RBhk4wPY+HrgHtVwvl9h5dJ0ADJmsJEE77CKaT8xdV0SgpRU/JZCMw9qHFnkz7qDR/f/fmshi0L9qaDVOB0hWOKP7Td1BvlC3g=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.32.2
Release Details
UpdatedMay 10, 2026, 11:50 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureaqlS5xLgAtQMFnFSjAjXnjfpSSV5UCZpVyKef4AdzzktPWmKamnaJ/o9bl/knf5Ccxcaac5gNFKSZcycZ4yrXj+BKTne63Wt+G4a/W3uhVV+jEz0aXacH4jwhVJuxDExsQUp83WA/JxrlFp38nEXc3fSMhAPZsP829eID9w6AbRSujgEzOfNCsduJ0Isrw+m60fR8R7LsX0CSC3XzGwLVwoJhbXJ52Ri8JRxLziVP/If/TAJR+pqg25hjGoYRqoPTacmdoFbNxcaZOeAxJSR0VRMwFS7rJJakiZ95w54KztDRvMwJAIMBr4BDtAiqedj3GCj8AtsPmvh3dEh3OPw4xMjQlTRAqW6yL1t4AhvL5dy5dmlQyRZiKwTkSC/9+/SXwR+e+1vfaB5ffmA3JAt9LIZ+24gP7O989Ed6yIo8Rh9//c6HwXky+L1MDOU9onZU3mwWBvI2xujyIhYu9uXMV6q587FsyptGaAoeBVtbtmY6DxiodLmgE5no1Gm0OBt7vy2ZUEhE9ToktSetWQPLtpjptRUBbAyomUGpEiaLSQP7y08h1ulPHoMjM3MelrxfGqSytHakG/M8bImdS7dO46kRG4gEf9C1LaaXH3KkfiNu0F5FPEbf0qidxDY5XePKUiAPirG5nSXLjYCu6f8hDktPh/U70EIWKuO4AAi4qw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.28.0
Release Details
UpdatedMay 7, 2026, 7:47 p.m.
Changelog

Added

  • Connect existing app resources to a team. Team owners can now choose, per app, to connect a Calendar / Files folder / Deck board / Talk room they already own instead of creating a new one. Available in the Create-team wizard step 4 and in Manage Team → Settings → Apps.
  • Resource pickers (GET /api/v1/pickers/{calendar|deck|talk}) listing the current user's owned resources, scoped to the caller's UID.
  • Connect endpoint POST /api/v1/teams/{teamId}/resources/{app}/connect (team-admin required) that inserts the share/ACL row granting the team's circle access to the selected resource.
  • ResourcePicker.vue — unified picker component used by both the wizard and the manage-team dialog. Files mode opens NC's standard getFilePickerBuilder dialog; the other three apps render a populated <select> populated from the picker endpoint.
  • Connected-resource warning under "Delete team" in Manage Team → Maintenance, explaining that connected resources are deleted with the team and how to preserve them.
  • Archive-before-delete admin toggle. New checkbox in Archive Policy controls whether team deletion produces an archive ZIP first or skips archiving entirely. Default OFF for new and existing installs. Same three deletion modes (hard / soft30 / soft60) apply to both archive-on and archive-off paths.
  • POST /api/v1/teams/{teamId}/soft-delete endpoint for soft-delete without archive — creates a pending-deletion row and suspends connected app resources but skips archive production.
  • Owner-side delete dialog when archive-before-delete is OFF, with description and confirmation text adapted to the chosen deletion mode (immediate hard delete vs 30/60 day grace period without archive).

Changed

  • The Delete-team button in Manage Team → Maintenance now branches based on admin policy: archive ON opens the existing archive modal; archive OFF opens a plain NcDialog confirmation.
  • Description text for the Delete-team row dynamically reflects the active archive policy and deletion mode.

Fixed

  • PostgreSQL SQLSTATE[22P02]: invalid input syntax for type smallint: "f" on team creation. The enabled (in teamhub_team_apps) and is_builtin (in teamhub_integ_registry) columns are SMALLINT (per the v3.9.0 cross-database fix), but their bind parameters were still using IQueryBuilder::PARAM_BOOL. PostgreSQL refuses the boolean-to-smallint coercion at the wire-protocol level; MySQL accepted it silently. Fixed by casting to int and binding as PARAM_INT in TeamAppMapper::upsert() and IntegrationRegistryMapper::register().

Security

  • Every connect endpoint re-verifies that the user owns the specified resource (WHERE owner = currentUid or IRootFolder::getById() for Files), preventing forged-resourceId attacks across the four supported apps.
  • Each app refuses to connect a second resource if one is already linked to the team (one-resource-per-team invariant).
  • Picker endpoints scope listing to the caller's UID — never accept a UID from request parameters.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureADlRyz4GyYgl8rljgx6Xw5Yq+hXjFnDGsT/M68SMUIu0PyMV0qJzbt+63EO5ij0SJrNYsf0ggbHaHct97ckYFzxrkFf7+B2O9l5YWdatd+dmtt0FQEMKBReJBSb93ZSRU65JXVlE0/43ikwK+RW9DiQI7QS3/DWSvRf83C43vI57g3PKs0dovrU5BwXWIb0bh7OvzXSfq7guF3JnFxlSeBTsrA9KUDTwQY03n1Wqi6tDYwLvTIQu8tKnPCMmzVQJlAc4d2krRVgEDGn+hNXN8+0sq8YSAq2ZCc2ckBXlMTyzLRrqwkZz7LpgljadbYATQe/GhS+ax5AFKL9efbXx0ny5S553N6Clgaq9vn5AyT5JASVo22Sf/Yxs/bT+EVYxKmwSd7XW9PDvXYwtG9aojqkQnEgZdas2MCeZw3e4yAsh1pd6KpFf3LuQ9U7nxzDSoABLZSDPYctIIZoVVQTPM35Bd/poEbOYl5f60bOYHEmeQkFP/MCVuqM9/XuJ1hIw27U7GdDCAsC1ONdcmlIRYEJHdIQ+yxOjMMYm8F18OjHJYoDuk/GIjFmGCF5QzcE+vdK6z4SO5n6JtTTsM6T8ruv/FNUFtQYbIb4KrhzbUs4TOxV+MCAI0/lB7IJiWdogLEiVuABwSecEPzt/K2qCbK9VgzJV8h77Yg1Z72ic1Dg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.27.4
Release Details
UpdatedMay 7, 2026, 1:14 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureWsF4We8JALnZvd9ZxzvftUVv6y9bJoO2AK9e/PM7P3dJn/cu8zwy1WvJhJDwbFP8Z0Nzcpj/wmN2WjfT0+1nbLor4BJ8Ls7noGy6KZR+laWTW/UHwGcRgFK5FB53Yi7W/rUTcp1dyM05gyl8sZAmrQxA/sD/unJccyNHcQJPpw3s8tsEShXmsFlZJuO2Ria+a0bKRXSQl1Az5v9ORk/Bx0Wd8oTVD+x2yEBq70TMaA4UqHU0Q/qNrZn03XHCYA6bh3QExdWx8sV3dNJ9X8envbqwPG53VL8KIOZD31DsjkVZ73+/stHpj3xQgwoiQ7oQD+ggorUShI16nrkd/VTV+M7VtcZyPxacndnslzeZyS00p2o0U9SzRTiJB3d76gogX/7XdQpRmUIeUroB1UNGaLMoILC8LojcDQsDGgv0w6adCZ5f/BdEgUkZKSMcm++IN5cYtm+q6+Eth29bh7gq5RIpuKb0Ous5wjG9UVgLHi/KDhtj+vZoUkg8CQ3ctPttf+FkJtY/xTuoEzf0ygy8nlHYsBoGQmdjyUqvuB7MZKCL3y1F8mGwEI0FYFMhbRnRVbYQy1ae8RpQj/fKEAWwXEfGIBbQAySath1iBlILNeAreUWmJpiWnE+aSghtd//HPcKvwHW1nRLt4f/UuMYIjCm3u/7C/CrJ49X2ZbIJSyU=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.24.0
Release Details
UpdatedMay 5, 2026, 8:48 a.m.
Changelog

Added

  • Mobile single-canvas layout for viewports ≤ 768px and tablet portrait (≤ 1024px portrait). New MobileWidgetView.vue: scrollable canvas, collapsible icon bar at bottom with one icon per accessible widget, FAB action button.
  • FAB widget actions — in-canvas action button rows removed; actions surfaced via FAB: single action fires directly, multiple actions open a slide-up sheet.
  • Tablet landscape layout for viewports ≤ 1200px landscape: 60/40 split with message stream left and collapsible widget column right. Widget cards have spacing and rounded borders.
  • NC sidebar auto-close on mobile/tablet-portrait — uses NcAppNavigation :open.sync prop to close reactively after selecting a team or action, instead of fragile DOM manipulation.

Changed

  • Embedded app iframe content height set to 100% (previously 90%).
  • Edit layout button hidden on both mobile and tablet layouts (editing not available in these modes).
  • Seven modals (ManageLinksModal, AddEventModal, AddTaskModal, AddPersonalTaskModal, InviteMemberModal, ScheduleMeetingModal, TeamMeetingModal) now set min-width: 0 on viewports ≤ 768px to prevent horizontal overflow on phones.
  • MessageStream accepts hide-header prop and exposes openPostForm() method for FAB integration.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureTvyr9L9P+H2RLIOYb8tFSJIV/1sH4rWC2RhttmVfB98kvezRU7Xa/tVV+MKE758D3cT3BKsvBz7e/OtKoPKuCan6HR0AmXNbMYx3F/ep+BoEQP3H/m8pOaYF2xyRAYmsdHxV9EPyyFEX6Trxiwy5aNJSK5S9RJdC+fm8p0gmvDlP1G3+GCerMXdi2lioEpoAnIlE+fd7JUIt48C1YYHKAqDlsaw3wlXiYC4j68I8vVD8GdXYmYgXvxW3IeE/iUbOZJ75bpqxv3ufHqEFPAYas5+SMUy8fGQQZjBvjIN4ztSRwAIZ4e1OFZj2WsYsfJZEi5upcwPoqg5SGo4Xw7vp5Dz3Zxx2hCEhCdO8jlGSinqNul6lPRZmaKXm0GY8v03ZaHu2uUdyNPvOfnVRUbe2ekUKhXe7C0u9umdSLmv2/+HhQRGFFZH6Tfu6Pc1IwWirW2EnhmKoGHnWO0mjq+VK1Ip1ZntyZ1znM9U6fdQaHTjMBq2nlXQWnZgu1tw90QWf1rj3+MGQW9vUyrN5uEx9xxxBVxXjCxCVvkOsqwTR7lqqsQfp/NCR0lRyognr7Hmd985l8nUYHCrg9KfPzOfFxLRauxh1UIiRS1nif3WmJzmaelxyyRNysvksjzsc5GJW9C0wjTPsYOuZv2H+a3GRH1RSzadDXVS11CCDpVMPXG0=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.23.0
Release Details
UpdatedMay 4, 2026, 7:35 a.m.
Changelog

Added

  • DELETE /api/v1/comments/{commentId} — hard-delete a comment. Author may always delete their own; team admins (Circles level ≥ 8) may delete any comment. Audit event comment.deleted written with metadata { message_id, author_id, deleted_by_admin, cleared_solved }.
  • Solved-question revert on answer deletion. If the deleted comment is the marked answer to a question, the parent message is automatically reverted to unsolved (question_solved=0, solved_comment_id=NULL). The confirmation dialog warns the user before proceeding.
  • Delete button on comments. Visible to the comment author and team admins. Confirmation dialog; disabled/spinner during async delete. Error messages are HTTP-status-aware (403, 404, generic).
  • currentUserIsTeamAdmin Vuex getter (level ≥ 8) — derived from current_user_level now returned by GET /api/v1/teams/{teamId}/members.
  • Markdown formatting toolbar in PostMessageForm.vue (new messages) and CommentsSection.vue (comments): Bold, Italic, Inline code, Code block, Heading (H2), Bullet list, Link. @mousedown.prevent preserves contenteditable selection; execCommand('insertText') fires at cursor.
  • Markdown toolbar on edit message. Same seven buttons in MessageCard.vue edit mode. Uses native selectionStart/End + setSelectionRange (plain textarea — no execCommand needed).

Fixed

  • XSS via v-html in message and comment bodies. Both renderMarkdown functions now pass output through DOMPurify.sanitize() with an explicit ALLOWED_TAGS/ALLOWED_ATTR allowlist before binding to v-html.
  • Headings (## text) and bullet lists (- item) rendered as literal text. renderMarkdown was a flat .replace() chain ending with \n → <br>, so heading and list regexes (which need multiline anchors) never matched. Rewrote using a null-byte placeholder pattern: code blocks and inline code are stashed before block-level rules run; restored after <br> conversion. Applied to MessageCard.vue and CommentsSection.vue.
  • Deck boards created with permission_edit = 0. Deck's AclMapper does not mark entity fields dirty when set via __call magic, so setPermissionEdit(true) was a no-op. Added enforceAclEditPermissions(): one independent QB UPDATE per column (permission_edit, permission_share, permission_manage), each try/caught so a missing column throws silently without blocking the others. Schema confirmed from live DB.
  • All Deck boards and Calendars provisioned in the same blue colour. createTeamResources() now picks one random colour per team ($teamColour = self::randomTeamColour()) and passes the same value to both createCalendar() and createDeckBoard().
  • Provisioned resources (Talk, Files, Calendar, Deck) not deleted when a team is deleted. deleteTeam() now fetches the team's app list from teamhub_team_apps before destroying the circle, then calls deleteTeamResource() for each app. Resources are deleted before circleService->destroy() so CalDAV/Talk can still resolve the circle principal. All apps are cleaned regardless of their enabled flag.

Changed

  • GET /api/v1/teams/{teamId}/members response now includes current_user_level (integer) alongside is_direct_member.
  • DELETE /teams/{teamId} now deletes all provisioned Nextcloud app resources before destroying the circle.
  • ResourceService::TEAM_COLOUR_PALETTE — 12-colour curated palette for NC-friendly team colours.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureNB29XEJ4DYUSSXCP7cIFfzPYsJyAPHHQtoOtktawP03w3p9lKDvZ86l7WnrBkKcOxtIv7oCuXPh8oQqZkj/L4XmpXAVcvIUPrZPtG3CQ4+OhNvC3BXT4T41GNLAQcG2hyQ4MZX11OBP1F5IfBmGWoY7il1gDNjDTIBqM4J0cFcO/Eg5q4zVYI2x1ks6+SpmlNCLdjVujDfZLN3/wXIQJA4zY5EqUexwmKvz2RiNNESfifz3wwpY5KcYEHrF+gasTIj1ZaaZ5TDC/4tUH71zpn3PAYNRpWPB8d/WhZW8yt0eaRw+4+hLItkzvwsKesAEljUNUrYD8IUD5VIWgysH1IgdXR3tJX2deQK3UW2gVFGuwJvNTtVzDuPGUsZ2m1VdhMPZcsPLqPLH+rvjwrG4qQlaTpXj9v/6ypBBoCo059KU7C5qnITKvANLXgldhEIyV3VNlCjbvww8v2Ogu+FSkSPpQRCq2FWygTVQJNYVIzjNS8J4lGfloPU9lXkEW1UvtK7nzZoumi/H9xmhj3edmOP/MzaR7wrToziaf6cWhhgYfnLxS60TYOUFmY7BCarcQ6y2tlXfPsCHYSDupV2/39kINeZ55xp70YP21S2WyjkkmmsXO76YDImJJIfXJhSUKnfJ7j1gk06Z8QwjQlAxkN2hDHG0JhQVcjWLAri/2A4U=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.22.0
Release Details
UpdatedMay 1, 2026, 12:35 p.m.
Changelog

Fixed

  • Indirect members (added via NC group/sub-team) could not see built-in app tabs (Talk, Files, Calendar, Deck). ResourceService::getTeamResources() checked only for a direct circles_member row; indirect members have none, so the method threw and the controller returned all-null resources. Added isEffectiveTeamMember() helper in ResourceService that mirrors the two-step indirect-membership check (circles_member → circles_membership) used elsewhere, without introducing a circular dependency on MemberService.
  • Member count in members widget was inflated when groups or sub-teams were present. getEffectiveMemberCount() used COUNT(*) FROM circles_membership, which includes group-proxy and sub-team-proxy circles as rows alongside individual users. Replaced with a query that inner-joins circles_member on user_type=1, level=9 to isolate personal user circles, and uses COUNT(DISTINCT user_id) to deduplicate users who appear via multiple membership paths.
  • Pages widget hidden after team creation even when Intravox page was successfully created. create-resources did not write to teamhub_team_apps, so getTeamResources found no intravox row and returned resources.intravox = false.
  • Manage team → Settings → Team apps showed all apps enabled after creation, regardless of wizard selections. Same missing write: ManageTeamView fell back to defaultEnabled = true for every app when no rows existed. The wizard now sends a complete appStates payload (all apps, enabled and disabled) with create-resources; the backend validates and persists these via updateTeamApps().
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureaF+aB3FIewjvx0eqVweCVBEI9ipOSyJoOcNoEC9XKXKaYsVdnElwJwRyq9so1vwmCMkRE2kmmlkqeK+kDc+cDrFhnwG/2NuzoTbG/BQViG1UqASNTodIVMWT3YfFcpVgWYwmY4ebBlHYFmDzpXmozDw74hodGwtZIXiSavfzJhtXhPYvhi/e+Q7v7qICbytjO9C1JFzEEcsGZNNEhkUlSiuO9SMt+yjkG6iWaCzcNjPMPmS7OROieXzAJ/Xxb5vG3aZocJfl2IezIR7sZ1XFrhvRy8+HB0r1EBunJa4YwgM86MaGzlIB2PdMH6OrN6ly6DZwl98oJTMCAjHT95/U/vuzzuwOrsg8P6Y7y+j0mH5nf/ZbSl0FeJk5tfv2GQe2XFXvRw7aKi/K+Y9B0dYReMPmwsBlPvx3mqEj543CaEP/Qzs4xmCJ/V1V0qzGfUkU0UvoDCPh7JLiDED8+O598KEFaxGSOOOqg9hhOLGszJG4jIFyTGsnBLvDFvR4bPFuA5HFjnPH6WdTWnfRhZFhtNojz3LQcsPP5Em9Y7x13KmW8h0HfJ92jzXyY13+4oK8jm9k/TNWyzqz7WYfb83tsia8cUw6PF4yA7fgBs8F4221Ko+19QtZIijE53M2txRNODZ/XsXLdM3ifatbgGi65T0tAzAw3BmWdMtWmHHrvPk=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.21.0
Release Details
UpdatedMay 1, 2026, 9:10 a.m.
Changelog

Added

  • WCAG 2.2 accessibility audit and remediation (Sessions 1–3). Full codebase reviewed against all A and AA criteria. The following fixes were applied:

1.1.1 Non-text content

  • AppEmbed.vue: <iframe> now carries :title="label" so screen readers identify embedded apps (Chat, Files, Calendar, Deck).
  • MessageCard.vue: poll options now carry role="button", aria-pressed, aria-label, tabindex, and @keydown.enter/space handlers — keyboard and AT users can vote in polls.

1.3.1 Info and relationships

  • TeamWidgetGrid.vue: all 11 widget title <span> elements replaced with <h2> (margin/padding reset added to prevent browser defaults from breaking layout). Screen reader users can now navigate widgets by heading.
  • MessageCard.vue edit mode: bare <input> and <textarea> now have associated <label> elements linked by unique per-message id.

1.4.1 Use of color

  • MessageCard.vue: voted poll option now shows a CheckCircleOutline icon alongside the background highlight — vote state is no longer conveyed by colour alone.

1.4.3 Contrast — hardcoded colours

  • DeckWidget.vue: #0e7490 teal replaced with var(--color-info-text, var(--color-main-text)).
  • FilesFavoritesWidget.vue: #f6c342 gold replaced with var(--color-warning, #f6c342).
  • TeamWidgetGrid.vue: #1a1a1a on success/warning badges replaced with var(--color-success-text, #1a1a1a) and var(--color-warning-text, #1a1a1a).

2.1.1 / 2.4.7 Keyboard access and focus visible

  • All 10 components with outline: none on :focus migrated to :focus-visible with 2px solid var(--color-primary-element) ring. Mouse/touch users are unaffected; keyboard users now see focus indicators.
  • App.vue: duplicate :focus-visible blocks consolidated; outline: none removed.
  • TeamTabBar.vue: role="tablist", role="tab", and aria-selected added to all tab buttons. Tab/Shift+Tab moves focus; Left/Right arrow reorders the focused tab and restores focus after re-render via $nextTick.
  • TeamWidgetGrid.vue (edit mode): all 11 drag handles gain tabindex="0" and @keydown handlers for ↑ ↓ ← → to move widgets on the grid. moveWidget() swaps positions with the neighbour in sorted order (fixes vue-grid-layout vertical compaction cancelling y ± 1 nudges).

2.4.6 Headings and labels

  • Same as 1.3.1 widget <h2> and edit input <label> changes above.

2.5.7 Dragging movements

  • Tab bar: Left/Right arrow keys on focused tab provide a keyboard alternative to drag-to-reorder (WCAG requires a pointer/keyboard alternative).
  • Widget grid: ↑ ↓ ← → on focused drag handle provide a keyboard alternative to grid drag-and-drop.

4.1.2 Name, role, value

  • TeamTabBar.vue: role="tablist" + aria-label="Team navigation" on wrapper; role="tab" + aria-selected on each button tab; web link tabs correctly excluded from tab role.
  • TeamWidgetGrid.vue: all 11 collapse/expand buttons now include the widget name in their aria-label (e.g. "Collapse Team Messages" instead of "Collapse").
  • AppEmbed.vue: <iframe title> fix (see 1.1.1).

4.1.3 Status messages

  • PostMessageForm.vue: attachment list wrapped in aria-live="polite" aria-atomic="false" — upload status changes (Uploading…, ✓, error) are now announced to screen readers. Checkmark symbol given :aria-label="Upload complete".

Security

  • renderMarkdown (pre-existing): v-html binding in MessageCard.vue and CommentsSection.vue renders user content without HTML sanitization. Logged as open issue for a dedicated security session — fix requires DOMPurify.sanitize() before return.

Removed

  • Debug console.log calls in TeamWidgetGrid.vue (moveWidget) and TeamTabBar.vue (moveTabLeft, moveTabRight).

Fixed

  • Double margin-top gap below NC top bar. NC page frame and NcContent both applied margin-top: var(--header-height) to the same element. Added #content-vue.app-teamhub { margin-top: 0 } to zero the page-frame copy only.
  • TypeError: e.n is not a function on team pages. translatePlural imported at module scope is invisible to Vue 2 templates — added n to methods: { t, n } in all five affected components; AdminSettings gets an inline n() method matching its existing t() pattern.

Changed

  • All error messages use {error} named placeholder instead of string concatenation. Allows translators to reposition the error detail within the sentence (22 call sites across 10 components).
  • All count-bearing strings converted to n() plural forms (14 strings across 5 components). Translators can now supply correct plural rules per language.

Added

  • Transifex plumbing. .tx/config and .l10nignore added. Stale l10n/en.js / l10n/en.json removed. Ready for NC community bot once @nextcloud-bot is invited to the repo.
  • TRANSLATORS: hints on ambiguous strings: Comment, Leave, Join (team vs. meeting), poll vote labels.
  • Translation standards added to SKILLS.md — every string written in future sessions must be translation-ready immediately.

Removed

  • Debug logging purged. 23 JS (console.log / console.error) and 15 PHP (error_log) calls removed across App.vue, FeedbackModal.vue, FilesSharedWidget.vue, TeamView.vue, FeedbackController.php, FeedbackService.php, TeamService.php, TelemetryService.php. The console.warn in TeamView.menuItemUrl() is intentionally kept as a security signal.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturenE6/JanHZPI2gJOiWJZMk28BvA/IenxP9ttZTLP8ukJhVHLtgEHDouOj6MlHhkol7j765YIdplWXD0snC26zoEjqGIeATPoVLA5C4s72+scF+8yA+ABvUZqoI0objebJsNj9vv4e35pMiFRYFjyxcqsepO9SZUd1h6OjJvd9HhLb+FGQ3XWUfhby3fASPzXUHADRgTSFALVT8uKoKBIT6N6RNsmtwZugGGt9sRJclHoFjYtjuw3taOU7IFSU0nzMeY0knJWJQqOiFHqPK02qA6+y1FSqROoxdmh5DzfXT2Lq82tep8PWNaIjy+eZnSPzZ7yMftzsUuw7Op2dt8IhIoeWlcBML4h4voLwnfSBvv4Y1iupF5NupORVXYQbCRwmGBNfpMV3giQAYLitqCBpEzshO22fwTas7ipF9ERzl8Xjnr+kC/FHRwsGaq86iE9uSeEbebDTRS0S1iQJ2QO3uefGq0ak/+D3fbeaEHEZTkmSZ+IHWsrPoPCj+hDThe812ymYqyN6AoCS688N60mHIGUETeN69fCDXFHWylumRxkdCIS9y9g5OtQTVXrKNNfui75jlQcjhQp8DH6aSWBZNIUSFEUw4D+TiXlOfwCJVHEQUxG0mIHvXMyMGS1HUmj0u5/5U3RFxjZeELbUxBdUE6Y39z7mWcI82aLrAf7PHFY=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.20.1
Release Details
UpdatedApril 30, 2026, 11:36 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureQ76CfO42b16YE6NfBvItjvR78K1DPxanhH91XK8A7vyu03DdXe7OUTFmHfzDd0Rrd0V3K8d+/ss0K8d3VUxJ8awlTx0OPmbQ46R+Q4Ar7SiQPOFhn+pi2JFJmQ/okVKIt1ltSZFY+rinZvOy7IrbONsPxD7EWiiE+3ES9wvNVBwvV0vByOQjLvZcMuOekOJmuqGQxAkiGMr/hYPCG9hYUUjjM140GgbKxpy5AR5zEEARvY1E8up0BNapKTdTEaxHq5kYuv708iGtmpuqQ74W0kXi39e0e3q5Ct3iaWo7ZTv3fVMa9UPxM919JoFSw41MDxReeILrujP/mfdgDJc870Heoi74URx8KM7lq1k8Oq2137OVmJFdmaZb1X6GFBozBOFQBWfIAuWg3b8PD7qxy49Qv8bFruv45eAsMtopCjOqrWICqteqyGNkZx1+VLB0yhzXvvkCRRD3ug4tgVwQ7G3gaLhWW1nrt/N1xrCRXaTk0XumsrprLn0ky1aK+i7mKyUsY4HA1C+C21pJ8lgwL8wjmo4Dm3OA5bZ/Fht2lO0YBKJGrt81BshzPYICFVb4pa8F5ESVyN6iaI3UmzvUHrSKYaOlfhhMWs1GsCo3ayDJ7I/iTmTHhltY6uicMp609IA6RTYQ9xVZ3bpaX3gkEGvvyTUY0dUFJdt5bnJP9iE=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.18.3
Release Details
UpdatedApril 29, 2026, 12:15 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureBbSeggogNn0JPG7UmMXVzr1S9eGLRgtmaNwEg6Yo8UenbN4JWPjazn+m78aXajFSeh6jbmkpYR5WS7siW2o1xYVqqWTT4/ollugaFrvcDLi9moShgbqcFpi345PSRshFSaFNgIFCcdy4BBGhkVq17dkZRF9vRELuwtsHE+EsAtC4cg0K1x7fhDZ8AbrVUcWthvCAU7mqq/CDbI5QLMHFH/niUjZfxld01piActRQW51/eiXx7RvpY1XIUUd1JJtZjkcLEUpIojQb5Y6vFWnManLZHJ14Y0FC5WJyFvNXszE9twaUCI0ZtnurdSIogtJenXpPCGE397gx0r1KXwDnlXKJIHTNP81xiYQrxsLp6TjDabK9JIz1I6Mv6WVRZbk8O/fZNntQFJDKc+Lwp8d2WD8gEmOXRpvVsOjAuE1WqClJYJZi6MFY0y4H9/iLE7qi2cNj4kP4wdzGupaUWW6J4VprIRNAzSOqERdCLna82JvkMxU1tLiG6hFVmYc5F5QagWPEQlta7IWVmR4/07gZnu029Ec45hrrDyq96wiD5WAA0uqAcL2kir82l8vLeT/4a3uxAWf6YwMF7KldyJZhfoh1gA+uE8vEvKfUFBCDesKclXPsH+Wg4CP0eILT/h2LZ0J3lAd8HmdJnH6hmXp9wx7CxHrGRZYUdixix+59c5Y=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.15.0
Release Details
UpdatedApril 28, 2026, 2:21 p.m.
Changelog

Fixed

  • Calendar widget now reloads automatically after adding an event, scheduling a meeting, or creating a team meeting — all three modal close handlers now call refreshCalendar() via the widget grid ref.
  • Meeting notes public share link now grants read+write access (was read-only), so attendees can edit the notes file directly from the shared link.
  • @nextcloud/vue no longer logs "missing appName / appVersion" console errors — webpack.DefinePlugin now injects appName and appVersion as compile-time bare globals, which is what the library reads at module evaluation time.
  • Members widget: removed redundant border-top from .teamhub-memberships-list; Show all button width set to 90%; left-side padding unified to 12px across avatar stack, membership rows, and show-all button.
  • Removed redundant "Team Messages" heading from the message stream body (the accordion header already shows this label).
  • Removed duplicate "Post First Message" button from the empty-state — the header-level "+ Post Message" button already handles this.
  • All semantic color text uses (--color-error, --color-success, --color-warning) replaced with their high-contrast -text variants across 21 components, improving readability. Backgrounds and borders retain the base variables.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signatureo9VGOkozPXYywaP2ZC3o2UICAIdsFUEdehNKJF0GKdgPgzMvL1Slkyeg9XI0ZiY+cw/Uu6rccUulLDeKWR+2iLRpDQb7iNg2ZCL8QgXYi5AjuO9diTPAqrywyowNNXV8gfFpJXJQ3DqEvkXQVptMXM1A5wNXjybgKAQAnTNSlrF+r4HvT/MJHomrojrDn2yCaHyhI5ER47B2YevI+CqWkKC2RFPwrcptBKVi62tk8VGVarMy9/Vrrp7zLbx8M5oZbVcLhdB7zIUerujkchkr2olx+SKYdNmdQ92tkw3kW584WiCqY6fsfLMD3PSRwHqiH3ScVFIXEHYIMeEphCnXukTwik9c4Vd3C/gAjV08K7Ii8ll9Yh4gt7uIMOfRx1o0HYDyMXqnFHlCnAalzN8UIkq+EXJ/i56lETuFvx0gnW8sxVmziuHpn76pjs9ZG1bVsPDSdwMKA1MwdnIt+pkaY7w9nB+25r7Nz7NMVgv9SvDxhMTo9zUGc1ncpnQ+xIqeEm2uCj+OPxjuYkAJ/vlSuzrdcxALAmzpecxR9J4CwZ+cnq9yJZoXIUMSnt694gd58/KsVAaHlI+cSVaPPZz/M26BwF5DJoWBdl+0fTVQ25WzciKzJ+pvmJAvH3KD3TxJKT0W2XTOWeoUfhzsv+nt47eDgDxvD8LUK1WxAtE0axw=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.13.0
Release Details
UpdatedApril 24, 2026, 10:02 a.m.
Changelog

Added

  • Group and team members are now fully recognised. When a Nextcloud group or another team is added to a team, its users count towards the team's member total and gain access to the team. The members widget shows direct users as avatars (up to 16, sorted by role then last activity), followed by a flat list of added groups and teams with a GROUP or TEAM pill and their user count. A "Show all N members" link opens a searchable modal listing every effective user, deduplicated.
  • Manage Team → Members tab displays three buckets: Direct Members, Groups & Teams (with name and effective user count), and Pending Join Requests. Admins can remove whole groups or teams, which also clears their users' indirect access.
  • Invite modal can now search for and add other user-created teams (circles) in addition to users, groups, email invites, and federated contacts.
  • New GET /api/v1/teams/{teamId}/members/all endpoint — returns the flat deduplicated list of all effective users (direct plus expanded from groups and sub-teams) for the Show All modal. Requires member-level access.
  • New GET /api/v1/teams/{teamId}/members/manage endpoint — structured response (direct, groups, circles, effective_count) for the Manage Team members tab. Requires admin-level access.
  • BrowseTeamsView teams now return an isDirectMember flag so indirect members see a disabled Leave button with an explanatory tooltip rather than being allowed to "leave" a team they were never directly added to.
  • leaveTeam now detects indirect membership and returns a 403 with an indirect_member sentinel so the UI can show the tooltip explanation.

Changed

  • The GET /api/v1/teams/{teamId}/members response shape changed from a flat array to {members, memberships, effective_count, has_more, is_direct_member}. members is limited to the top 16 direct users (sorted by role then last login), memberships is the flat list of added groups and teams for the widget.
  • Admin Settings → Maintenance team member count column now reflects effective membership (direct users plus users from added groups and sub-teams) instead of only the three top-level rows in circles_member.
  • removeMember() now correctly handles groups (user_type=2) and teams (user_type=16) by using single_id as the delete key. It also calls MembershipService::onUpdate() after deletion so removed indirect users actually disappear from share pickers.
  • Pending Join Requests in Manage Team has extra top padding to separate it from the membership summary.
  • Group and Team icons/pills use the primary-element (blue) and warning (amber) tones respectively — the previous success-green was too low-contrast.

Fixed

  • Integrity check in Admin Settings → Maintenance no longer flags teams as mismatched just because they have a group or sub-team as a member. It now flags only teams whose circles_membership cache is genuinely empty while direct members exist.
  • getTeamMembers no longer fails on the u.last_login column (which does not exist on oc_users); last-login sorting now reads from oc_user_preferences / oc_preferences.
  • browseAllTeams correctly detects membership via groups or sub-teams in addition to direct rows.

Security

  • getTeamMembers now enforces requireMemberLevel — previously any authenticated user could enumerate any team's member list by guessing a circle ID.
  • lastLogin timestamps (used internally for sort order) are stripped from the members response so they are never exposed to the client.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
Signaturea3Sq1npOxTnT7aLDRXv66RWwUdOWvy5yXVlPPHePce9JRxddfqvN4FS4p+bnjFEdkKQmlFNDNzZ97aJmEZb1Kfzb+xpX6WzgDfJe1gTYUhE3XYHBchxclwCzPC/fwdymmrjwwP9b/1q9fH26FRdFciFUmHQO9Z24g696GnkGwApfohzX2U0jd4v55cx1e+vs86SZRWY26tkUm/FXD5+d+bl4FAkDhiK+Z06hFOuuocBhqyt2obf/gohkgTnEZpaHzkaAdgJFvvvRo+azlxGzODk4mqtyZIEDUWbAXQ99vRXZAokuwRrizBbXqbVk5sn3ntgG5rq0NWoYJ3htqhdhqqMh7w6SW/XBD5cGvLZu7BZpfvFLThabB7aZktNZhmVWz3U81C+WjYVhlcKcXPxEeQXXwo+LjSpGNmjkBg2bOsNEnVcYx3LhWsmbqRNf6JH8B0kcERqJcBWRbpthg/ytseDLsFHDX76QmHMb7/r6IKwq3EjaJSpLcuMgYAE0/ad8BtR54j/rWN1AsPD3oj3UfElHO5A27R/Xdu5qwzTd9zpWDRDgp3NE+2a6ler1WpgJtuTXEv+TGCURUK9srKLcpB+QGO/J26pFhqQovLEP72uL3kW8zXDlNW51++6uJJsrE1212s6JzPLSV1jntOrB+exnyQMV9sbNEVVzwyaqonA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.12.0
Release Details
UpdatedApril 23, 2026, 6:50 a.m.
Changelog

Added

  • Shared Files widget — new dashboard widget showing files and folders that team members have shared directly with the team circle (e.g. from Nextcloud Notes or Files). Displays item name, type icon (including a dedicated note icon for .md files), sharer display name with avatar, and share date. Paginated at 10 items per page, sorted newest first.
  • New GET /api/v1/teams/{teamId}/files/shared endpoint — returns paginated list of files/folders shared with the team circle, excluding the team folder itself. Accepts page and limit query parameters.
  • New shared_files app toggle in the Team Apps section of Manage Team — defaults to off; team owners enable it explicitly. Independent of the Files (team folder) toggle.

Fixed

  • Fixed team folder query in ResourceService incorrectly picking up individual file shares (e.g. Notes shares) as the team folder when no folder was configured — query now filters on item_type = 'folder'.
  • Fixed shared_files toggle defaulting to on in Manage Team UI for teams that had no saved state yet — default is now off.

Added

  • Upcoming Tasks widget now shows personal tasks alongside Deck tasks. When the NC Tasks app is installed and the team has a calendar, VTODO tasks from the team calendar are fetched server-side (Sabre/VObject, direct DB query on calendarobjects) and merged with Deck cards into a single sorted list. Each task row shows a source pill — blue "Deck" or teal "Personal task" — so users can distinguish at a glance. The two task types also use different badge icons.
  • New GET /api/v1/teams/{teamId}/tasks endpoint — returns upcoming (≤14 days, non-completed) VTODO tasks from the team calendar.
  • New POST /api/v1/teams/{teamId}/tasks endpoint — creates a VTODO in the team calendar via CalDavBackend (QB fallback if unavailable).
  • New Create personal task action in the Upcoming Tasks widget header, which opens a modal (title, optional description, optional due date/time). Shown only when Tasks app is installed and team has a calendar.
  • The existing Add task action renamed to Create Deck task to distinguish it from personal tasks. Shown only when team has a Deck board.
  • resources payload from GET /teams/{teamId}/resources now includes a tasks: bool flag indicating whether the NC Tasks app is installed.
  • New AddPersonalTaskModal.vue component.
  • New lib/Service/TaskService.php service.
  • New migration Version000310001 — ensures teamhub_integ_registry exists and drops the legacy teamhub_integration_registry table if it survived an NC uninstall. Fixes a scenario where NC's "delete all data" uninstall keeps migration history, causing the new-name table to never be created on reinstall.

Fixed

  • Fixed oc_teamhub_integ_registry does not exist error on installs where NC's uninstall-with-delete-data flow preserved migration history, causing migration 000209000 to be skipped on reinstall while the old teamhub_integration_registry table survived.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureSgfXebprj3dl8qsJCiO/pE+phwLvcTd5NcSGL2buF71GuT7a/fqkQWJ0XTwULl70Dw7D4/wJbMX9+fLnwXK/VvfRS1S1UNa8VUtCiuUJU4f4hjrnxYWuBT6oledtiXpb8fVeB46bTzwVJXTc57HHMm4Fz6L/rjutbeu07fLe5dNIAVXUL8niOfGyeMhBLijQDAsvlcOgBvpFXSqHscgF7IwOYTJdRqoyvAJQZgoxdlffHLnL5isK+GnjJCQXt6WzIxhiHbkMQlr+SwjPdvqo5UcvRCAHoiMS6sVQFmt1TJAHzygxHBK2g58Gv4NRvm/HszdMxCbkJVpgZFeqTO/WOrNTQaIiWIHGlK2XWoVVZetF0vvSlOynOXQqS9SVHmvOhfdH594EN1kwALAckCSdIvaeIdJpA3AgeS5er9GPMQI6lRWX6gP9H6WLAFGSFLjY6HpJvcr8mXBUGLzZWjnqd2w/WzDyGf/SfwMvf7NrgrmkEbkxEkRXYtUxkjJhlIX/g6vQicisTwHViMbO1orUbP6DvXcoXWGcu9iwlnumGSrMFbBwDsP/163U7kO52RjXg4tRxpZ2G0UOzKKx5Nc7TUA87bkxLO3SjC5yL536poI+22uNYSoWsxQpk9KGsVi0xiaLLms53Kp4KnXU7LPMQ+ZAlpb3U63sBLVkRHQhstg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.11.0
Release Details
UpdatedApril 22, 2026, 9:04 a.m.
Changelog

Added

  • Upcoming Tasks widget now shows personal tasks alongside Deck tasks. When the NC Tasks app is installed and the team has a calendar, VTODO tasks from the team calendar are fetched server-side (Sabre/VObject, direct DB query on calendarobjects) and merged with Deck cards into a single sorted list. Each task row shows a source pill — blue "Deck" or teal "Personal task" — so users can distinguish at a glance. The two task types also use different badge icons.
  • New GET /api/v1/teams/{teamId}/tasks endpoint — returns upcoming (≤14 days, non-completed) VTODO tasks from the team calendar.
  • New POST /api/v1/teams/{teamId}/tasks endpoint — creates a VTODO in the team calendar via CalDavBackend (QB fallback if unavailable).
  • New Create personal task action in the Upcoming Tasks widget header, which opens a modal (title, optional description, optional due date/time). Shown only when Tasks app is installed and team has a calendar.
  • The existing Add task action renamed to Create Deck task to distinguish it from personal tasks. Shown only when team has a Deck board.
  • resources payload from GET /teams/{teamId}/resources now includes a tasks: bool flag indicating whether the NC Tasks app is installed.
  • New AddPersonalTaskModal.vue component.
  • New lib/Service/TaskService.php service.
  • New migration Version000310001 — ensures teamhub_integ_registry exists and drops the legacy teamhub_integration_registry table if it survived an NC uninstall. Fixes a scenario where NC's "delete all data" uninstall keeps migration history, causing the new-name table to never be created on reinstall.

Fixed

  • Fixed oc_teamhub_integ_registry does not exist error on installs where NC's uninstall-with-delete-data flow preserved migration history, causing migration 000209000 to be skipped on reinstall while the old teamhub_integration_registry table survived.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureP+5/blvdXpd4uoReE5CvW4k1/WbnStC9vXXjXI3Tvi8B47QV8Dej4K2Wi+1wXxFQ8zQw/i+nuz4/ZzQSwSPnjzzpbQaNRo12s/x+9pb+MsBprGSUENMK3s8vwutV5QoiD5QLM/rxq7+ysdw47AwQbM+4+VGK/a2tAhuO2H7Q3x8nqRmJCSIZewc9D6ihBpQ5Sue3ywJIKFv8X73guc8LPSxhY+YnmW3Mc2bBdsxbUamsF9EZfkSVA9zebC455uSwufPZKLaWlBltydLWyZrhFZOU8aC4QeirMYCXovzThRQNk8hwkdppc4Gb737JqrVrC4uL/AMIPrTsJ4PcAuLDsmM0E/ZHbmpPBZ8wWDfMZKS3tHZM5K/2My3Sv7W3NhkQIzMuh2yNDAcw5r2B20mu34nSvATXTm3qacGBRmbLq9dfdMkEWMenTHtBzjWlVm0s0A03+gv68lasrzv7moyzlrjk1V6i3UuEo5XAGZCJSITQb0+RJAaIHmGqOBCu0UggevHuOqOMUwFl9aa4MbGa3BwxamSt5rfii22L0bWVHtFeiCaWZGfrhTJNM1WhRd134ha+puHWKpMWv8cxTxWA6FyycE4i+H+KR6yyvLpL3viVGPm+24BzSk3GPHdfEetvu2/H7WX1vnTR8NBzKt8dHxAj0YSegXYFaPF+0EO0fEo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.10.1
Release Details
UpdatedApril 21, 2026, 1:22 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureSxVjtNOVjWRSbm2YIc1M9cvaHIgVbVJbMJcD6FMStLGHteX8VzmSeEq+gpTZTER2VsyukDvVKRWOW3TXPTyzWF3UuC8mZSpEaK4bGHi83B3natM149njVrYyxy0BawErj4YH3VlvPzl4ok8z5hwAFWKGyFNJ2CulO2lsUfwDnhhLsvRAIjZzX+KZ2C99byqV3qFRnWo3kI+JT5PpE5+ug8T3KImQYKwGuMDq6+zFF2Qi+edECt+5TiO/rr3MFCZvSwwlwaNOEnCUjpA5wcwreGKqP2IpDJi+TwzjcJ5Mlmh6/qNjdTTkZ1tRvH5zKrZRHxAqSH0T40TMQM/N3huouEQE+fqHfJXgJXy3t99UrpWUfY9SX/rLWPQCkzgco353IBY1YTacz/cCH2yVlrTMty+EmU4iTOo2876PutuV43kDSytBtGzinCY78vrZ6D99fl/UkU5fsdVFVh91FZiPyd/JnCgTl59rm32K6rEhUmaMeXvKjl8CTuWKc6Z0TZ6qS/GPjeAVxHlpzRMIkhbjMOGnlWAKAlabDRIxZf+SSNazjnI8SFkOUOo5yCIoxMF9GjboNA81NkIg6PYdEaiooPTXiGbOd7cmuh4FNPWiniG06hn+BXX9jpO3zJNTKbmxP4g4dyWMm2923/miX93CtmyhsYWn2OcjX+YLLf78TgQ=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.9.2
Release Details
UpdatedApril 21, 2026, 11:15 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureVqSPboP020ssz+waXZIgJ+LTvo3hMESzHvMEKUi5BrRSPiplINi3X1Etr3zo/IQIgyv7BvaMYyjNs33q4jz8Y5oaawenqkCDw6XrV8F34rYPZbW0AabIGOAw1Ghy7Qg3mlbkq+GydCzfAMiEHro9sfi1C6kffOdijPwNm3EWPGurR7ERfDa19qeEfqoEU3Ni+//+AnwrL+rP+jf9pYM+q+/49CxT1zs53TqMTZyihHnVNbxOLCR7sgJtTVHR9NBR2HjEhFt73nxFBFn3b3j6OwoIgUX2l2lQR254lB/mgs4uD510an48qHLsYbE72Ph+LM+x8g7NtsLKbzyM24dA2+mL8PiwJhZUCfTFpbPVuiSX6OESUBbml7pgqFFv0dA8FD4gtqxKErPvD7CMaXR4mGrkit8bkkfReObVjBQZyCVl1S9q9Sj1ckfJpUlR5jmBfY39QzY3Bv/+V0cvqxxC+P25xmbvh6VHbnBMcJ9uxs4XW1lhjqvvJFTHS3nJJeQX/tm/q9k2qjnvLEe8nliMc7k0NtZxXdJI4pBPawvBaM5T91AKvzpKWrzmzIxTOWYT0HmgSm6cPPT/EBZl/YaXTO4a5xSNmCljGn0uo7bDiWtwcFNUuzCXG7FirlkyxiOkNv6DaZMXczzv89o0vMubHotd/OzddrXphSIrvkfA+Xg=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.9.1
Release Details
UpdatedApril 21, 2026, 9:46 a.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturemX7RsaWak2BPhu44QNActtv1oaoiKlo5vmrzmf+iPPoJPMw0cAXoq2UcPpHnsrPme+mCOiDv+yETlWFSPdesr9U3ffdI56rxQMRqkgAv5QErwwE/jqqyte15iT2wHFrEF6aCn8NnF9bIElrCfmdL8kPwEKbgcrUBom/cQRFlWbqnmd6QRzqY+bevPIx6fXaA4ZTQbuGaR1PikE2Tskm0ETCtHf05Axg6eJ+fjgHAdR/bgsl2/2+giwe3fmoyPaC0GVsuoTmGjduMSPaUINC1hA7NPKM2aHBLvXYcGqNzKF6Wtr+la8VqOq4akwYoSlGvWOQ5uw3gTCubRhDRmMrxb6t1QABD7CseBzMKjTv/Z+ib62hrEj5IoP/qRdiovYZVJQ+VQHw8pqBJqS+a014t5m1+h3nPpZTT1heoyR0qA44AXmGhqcCVCGcMuVAtw7trENCY17FbHradrLmEofCLxoGuCAuviFXQo+03kxTL3dc4pgUm6G1+/RoX5hM3jtYmi5tBmFmXLBT8qsr1ZEStRin8aLwKBr92oeejMhLvyPN4wryntUpq8FL3n+SERCsovIvuwmMw/MOuBrL16xEL0FRa/EKlqN5F5z9gtR+ckjap8/SLQDYu7jbZUD3CGjKJbsaCeKv/Lbsw/tDqe/ZXeg7cZaq2tlPTN3g2kFah/Ek=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.9.0
Release Details
UpdatedApril 21, 2026, 8:24 a.m.
Changelog

Fixed

  • Fixed fresh-install failure: teamhub_team_apps.enabled was declared BOOLEAN NOT NULL which Doctrine rejects when storing false on MySQL/MariaDB; changed to SMALLINT NOT NULL DEFAULT 1.
  • Fixed same BOOLEAN/NOT NULL issue on teamhub_integration_registry.is_builtin; changed to SMALLINT NOT NULL DEFAULT 0.
  • Added migration Version000300801 to apply both column type fixes to existing installations.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureVWWGR5wGqe3Eax5KKz+AQ9nvFxwwNzPj4Zsqen4x72T9rHc242F+i+eaIMt/ae1/SelQGyv18ckoH5xA+eZEF+PzJj5vmcq2Zwx+PwlLTD+ieyRfaFcVc0kkYXTqMKa6/laXrNrwHuBHRsG+5wyJLkXm78H2OG0HMCIm71b7x06pIxU/eN2i6pEcTaTajyUbxPd37FsGv591XzyRKZGK+Z1DZXdMI81aE1g68xGeQLpnkKLPjURMzw3NnqZkcJiiU+fhDggu4O32obgcc2MOgrOo+ciHNX+RKFxkdYLs/qZzbS/RDdjxvnE9U5eESH7hAXU/ww8k/vSdtxEU6vrSd94Mg3GDHhjjS9jj/tLJYCk0J3MQp6EJMVRIInhgNIJJf1VkoCJk2MkTdpgF/GWheW9SBVFD6+IbzR55Ss2OYQK42gXtuNItWBm9ZCvShB5bxnmL4JtZ5I9ZfmmxD6BuZFwAkvnDIe6bt7wnVt8rZ0F0X5f7PrEzFoNq5TnagELFx0Z7HM/8OxRXwOLJtblMZeEI+tFRKxlgSOcI4EBroGwsGQ6sHELNWbqD0XvQBxmjVGjAEXfjx5yp+xwmc5433StzDcu6ItEt8wJQYKQ91quGR1MjEKwwVqmzjtNX77lt2aSKzvy4ibb8g1Xa3uHCUd9PmtdzN9FiBK2G6Gj4flA=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.8.0
Release Details
UpdatedApril 20, 2026, 7:08 p.m.
Changelog

Added

  • Telemetry payload expanded with six new anonymous metrics: nc_version, user_count, member_total, message_count, builtin_integrations (per-builtin-app team counts), and link_domains (custom-link hostname frequency map).
  • link_domains aggregates custom web-link URLs down to their bare lowercase hostname before sending — no paths, query strings, ports, fragments, localhost entries, or numeric IPs leave the instance.

Changed

  • GET /api/v1/admin/telemetry preview object now includes all new fields; admin UI automatically renders them via the existing JSON preview.
  • TelemetryService now depends on IUserManager for user counting.

Security

  • All new collection paths are read-only DB queries using QueryBuilder with named parameters — no new user-input surface.
  • No new endpoints; existing telemetry endpoint remains #[AuthorizedAdminSetting]-guarded.
<hr />

TeamHub v3.5 — Changes

Admin Maintenance tab — full teams grid

Replaced the old "Orphaned teams" section with a full teams management grid covering every user-created team on the NC instance. What it does: Paginated table with search by name, "orphans only" toggle, and per-page selector (10/20/50/100). Each row shows team name, description, member count, owner (display name + uid), and creation date. Two icon-only action buttons per row: set owner and delete.

<hr />

Set owner

Admin can assign any NC user as owner of any team — whether or not that user is currently a member.

Delete team (admin)

Admin can delete any team regardless of ownership. Cleans up all associated data before destroying the circle.

TeamHub v3.6 — Changes

Activity widget

Deck activity now scoped to the team's board only — card events (deck_card) and board events (deck_board) handled separately Talk activity scoped to the team's room via numeric room ID — eliminates cross-team bleed Calendar/DAV activity subject strings corrected to match real oc_activity values Friendly human-readable labels for all Deck, Calendar, and Circles activity subjects

Manage Team — Maintenance tab

"Danger Zone" tab renamed to "Maintenance" Transfer ownership added — team owner can promote any current team member to owner Ownership transfer requires two-step confirmation and demotes the current owner to admin Leave team now shows the real server error message (e.g. "Transfer ownership before leaving")

Admin Settings — Membership cache integrity

New section in the Maintenance tab: scan all teams for stale membership cache Compares circles_member (source of truth) against circles_membership (share picker cache) Per-team Repair button rebuilds the cache — fixes teams invisible to Files, Calendar and Deck share pickers

Files

Re-enabling the Files app for a team now works correctly Favourite Files and Recently Modified widgets no longer appear on teams without a connected Files resource

Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignaturegblBv20FJFNq/Q3H9jPQvNSRrs/neT76/CRFwCF6dL2UmGY2TAsKmh06rLTNssVtnttoSuD1vlgANctX1gukwUMRAAXpjp6tHRg8u0II0g9C6sdwaLRstUJGExDUxRr5sbbgVwvRDY2GducpZRWSAyNlTSanLLJl9Eb6YAviLXr5AUAmczvdNRCa40GrHhytUe2O+oMfPtQJliOtotxL47VWvOynucGMWlj6j5ZghCx6gkTazlmWTFQQ/5VOe3EqPZyel9YSGJ4TtXwLOgQHMrBo087M34nxklShndZR12uYeZJ72n81ycvpByC10YfhDwaife+W+TeZBVtTrvo4wmqD8wqbkFsrNdp8DvMSvlVBKtibdZleX89LUG5RTsFQelFaOQjz+4A0h/xp2AhsTUtRef3vRCZCcmARieLz+g2ZaYn5EWnYDCkIPjLe/Kl9KCamL24QaSFyjBfVKcYX6DbTRCUG5xBrsEuEDWnZ9HHTUWZJO5UiqVsfvvHIzWuZ9j2vmRbsPBbKs0dRkaqO/04pDqdZaL5GLqHWjkv4wz+wiOnnMDnNKOtpubvW2HHmRSf8/TGQdzmdvr5ha+tjbOYqCKj+YMYI1jR2PWfIzxWSqzUbUrPDN6r7uEm4/r+f9ydI706wPr/f6BQlPDjq8DOIBTUC3Pc9Xdyjx2xOEio=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0
TeamHub 3.7.2
Release Details
UpdatedApril 20, 2026, 5:58 p.m.
Licenses AGPLv3+
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhM1MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwNDE2MTY0NDUyWhcNMzYwNzIyMTY0NDUyWjASMRAwDgYD
VQQDDAd0ZWFtaHViMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtxex
F/UgRRSrha+3N7Foppb7DNqmBGJtJDBiENbaIubb8Po77IS10+KWsD8nCPkIMYUH
VNUTWC4MSB/gxhpvzI0mqakrRKSpJKoHpWjng+sLwmzCWU+3t2Z4tGlMmSIeacf0
nNI+OaHc8a8j1oxuTBL3lVZoVoSuzVodsjwhZnJbOyQQw5yd65RNFlWyRfQRuVuW
jr1els7IS/3qQSdXXCt35w/hxjjoPev3nP9hFjWKWkP/BNiACXbRK85HuCcjSs+C
Pr/G3q1sFLL5C0sPeheO8ncv89zrwHwnfSIrHQKMN468yryt1Veyc30HDoIBW0ss
7h8ewN7h+nJH4sqS4PaGAHg9+L1VRBNBTHxMSBtOFbCNSAIDYGcae19onAcQxrRE
fCs1rzDiraNG1m+keJddPF59XS7X4VFzRbZG5/EsTkDp1/ZKzXgdOo1aRdH4az5N
BgvztML2OQiJJ1Z+1R29QKVTotbtUEVp5BCC6fPNYF+uLEduiEGeKoN16YNPN1Ra
GwnXhv49WyE2FQpoCI6ZpdZMXjg4spyVJZdVpPyLCRmRaboJi7iq5lO1D9svsAVf
JQpaNZKrfrOUNtlm6UNPhObRxoRk7b7Fj0gCU+Dx+gsDrkTgoPEdUPqohvXTx/Vw
OSu507jOFPYSgI2xolVb+sswsbZk34G8kSMGICUCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAFwdX/tji8chWCh3yVRgMWJsi05Y13PNL/faqmoiVcGK8H+43cYCZTJSI
PaiW/GhDQ6FqblF5nJjgM/UYwvKDXuwuPHMrXUHS+h+l2IN4drJuqO6MwOtVw2Ev
5TqxA0PHlGBbhpPc6hflVmuWrgsvuf617+5vZRpBsPrgg+Zl66GCbOfobhRgPKfu
JXs4bUZsq2RIZ3yfqdjvm232QS4/CdQPItPcbdwnw7LLyHHX8O/90Re4/Jwfv+f4
5JnkTx7ganD0aA/3akES5rmQ45DOTTSFhvSv0r1GBdhpqcTV9jEZ/9tUdDWX/PK3
J+WLOE7bxReGnw1M1P60YKriBrCs1w==
-----END CERTIFICATE-----
SignatureRbq64iwUhPtTjRur8beQ5RgKG0BP0V5/7JaxZYTvBH/PFPcDmjy7EILWhL6IHsowijr6XTZWQlFbL4YZKdPQyW0PJxIm65ECq7IbqNLYK24hL8O/N1HweSZhVd5Dls+3pj9uvvR7ysrfxEt/cYDtHMxn0Ts7HcEdPFX3ONUpithodHeI9dfmNZgz6Fxk9cn+l/Pczp+JuqFa2L2h6YBJzQszsjGlVd1PlUE031Dj/6kYqRC8mQy3qpje7Xm3l6AHU2JrqAD4f4/dsSst7Cojx1sB43sy5yHnO5dSYMoYOVrxKciNrbwk7jW3CoX6XJWhBwJzLN8QKBoLOlrYpEyjYJXj+SeOim39vOvq8dsL2DpeOAhoxUNAuKQC+A0Gv4XhdeSX1FYZXmC20tgXXDln//qXChvYbE6usUmFz0iH0jP2yxqKbj48TZDID7wOyGGX0WHzHmD+zMY/alrx2+jZBqm7+BaFHT9UvDrmY6uIDAWtdbMJO3EhK2Sdn+k5DqenejwYO0yF+o5mU+itgx2pmyNWTF9/B8FcoeZIJExjZBv9/AnW0nP0WgkwqR8JmpaaFObbBWhYLXpIskLmXAfkqvfnYA7yli2bf48LR6yCkARYV2T85lkndOgH6oH51quzNvF2J7o/QcSzC83r2QIln7n4BW/X9hR/yweUkZLDU5Q=
Signature digestsha512
Dependencies
Required Nextcloud versions >=31.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.1.0,<8.5.0