Appearance
Presence module
The Presence module is an optional feature that lets team members publish their working schedule (office, home, vacation, non-working) and lets team admins surface that schedule as a team-level presence grid.
It is off by default. You must explicitly turn it on.
Enabling the module
NC Admin Settings → TeamHub → Integrations → Presence module
Toggle the Presence module switch to Enabled. This immediately:
- Shows the Presence module tab in your TeamHub admin settings (status types, locations, holidays).
- Allows team admins to enable the Presence tab per team (Manage Team → Settings).
- Shows the Personal → TeamHub section in each user's NC personal settings.
Toggle it back to Disabled to hide all presence UI across the entire instance. Existing schedule data is preserved — re-enabling restores everything.
Status types
TeamHub admin settings → Presence module → Status types
Status types are the catalogue of options users can choose for each half-day slot. Five are built in and cannot be deleted. You can customise their labels, colours, and icons, and change their display order:
| Slug | Default label | Busy / free | Notes |
|---|---|---|---|
office | Office | Free | Location-based; room picker available |
home | Home | Free | |
vacation | Vacation | Busy | |
non_working_day | Non-working day | Busy | |
holiday | Holiday | Busy | Admin-locked; applied via the Holidays panel |
Free types write TRANSP:TRANSPARENT to the user's calendar — they appear available in scheduling tools. Busy types write TRANSP:OPAQUE — their time is blocked.
You can add custom types with your own label, colour, icon, and busy/free flag. Custom types can be deleted as long as no user's template or slot currently references them. Built-in types cannot be deleted.
Use the ↑ / ↓ buttons to set the display order — this is the order shown in the status picker.
Locations
TeamHub admin settings → Presence module → Locations
Locations form a three-level hierarchy: Building → Floor → Room. Users can select a room when they set an Office (or other location-based) status.
- Add a building, then add floors within it, then add rooms within each floor.
- Deleting a building cascades — floors and rooms under it are also removed.
- A floor or room cannot be deleted if any user template or slot currently references it. The panel shows how many references exist before offering the delete button.
Locations are optional — users can set a status without picking a room.
Holidays
TeamHub admin settings → Presence module → Holidays
Holidays are admin-locked dates. When you add a holiday:
- Users who already have a slot on that date have it overwritten with the Holiday status.
- Users without a slot on that date get one created automatically (so the date appears as locked even before their schedule is materialised).
- Users cannot override holiday dates — the status picker shows a lock icon.
Adding a holiday:
- Enter the date (ISO format:
YYYY-MM-DD) and a name. - Click Preview — the panel shows how many existing user slots will be affected.
- Click Confirm to commit.
Removing a holiday:
- Removes the admin-locked status from that date.
- Users' slots on that date revert to their template value on the next materialisation cycle (overnight, or immediately on the next template save).
You can filter the holiday list by year using the year picker.
Be cautious with past dates
Adding a holiday on a past date rewrites slots for that date. It has no practical effect since the date has already passed, but it does generate calendar write operations for all affected users.
Background jobs
Two background jobs support the Presence module:
| Job | Schedule | Purpose |
|---|---|---|
PresenceMaterialisationJob | Nightly | Expands each user's week template into concrete slots for the rolling window (today through end of next year). Does not overwrite overrides or holiday slots. |
PresenceCalendarSyncJob | On demand (queued) | Syncs one user's materialised slots to their default Nextcloud calendar. Triggered after template saves and immediately for date overrides. |
Ensure your NC cron is running — without it, the rolling window will not extend and users' schedules will stop populating after the current materialised range.
Troubleshooting
Calendar events not appearing or not updating.
Check the Nextcloud log for [TeamHub][PresenceCalendarService] lines at debug level. Common causes:
- The user has no default calendar (birthday-only calendars are excluded).
- Stale soft-deleted rows in
oc_calendarobjects— run:sqlThen have the user re-save their template to trigger a fresh sync.DELETE FROM oc_calendarobjects WHERE uid LIKE '%teamhub-presence%' AND uri LIKE '%-deleted%';
Holidays not appearing for users.
Holiday slots are created when you add the holiday. If users were added to the system after the holiday was added, their slots may be missing — remove and re-add the holiday to trigger slot creation for all current users.
Presence tab not appearing for a team.
Two conditions must both be true: (1) the NC admin has enabled the Presence module, AND (2) the team admin has enabled the Presence tab for that specific team (Manage Team → Settings → Team apps → Presence tab).