← HR Cluster

Changelog

Operational and technical updates to the HR Cluster platform.

Types of changes
Added New functionality or modules.
Updated Improvements or changes to existing functionality.
Core Major architectural, platform-wide, or operational changes.
Deprecated Features scheduled for removal.
Removed Features or functionality removed.
Fixed Bug fixes and issue resolution.
Security Security improvements or vulnerability fixes.

2026

— continued

Transactional emails resolve language per recipient

All outbound mail — not just contracts — now picks language from the recipient's preference plus the account default, instead of the sending actor's session language. Closes a long-standing class of mis-localised notifications.

Technical focus: resolve_recipient_lang() • Per-recipient language resolution

Form interaction model unified across the workspace

Native browser confirm and alert dialogs replaced with in-app modals (Escape closes, focus returns to the trigger). Every form shows a submit loading state, and submitter values are preserved when validation fails.

Security hardening pass across POST handlers, PIN entry, and signing tokens

Enforced CSRF on every POST endpoint, added per-user PIN throttling, and started logging IP plus user-agent on contract-signing and password-reset tokens. Mail attachments now fail closed when the file is missing, and elevated access is cleared automatically when a user is demoted.

Technical focus: CSRF • PIN throttling • Per-token IP/UA audit

Form submissions grouped by workflow state, reviewed in a dedicated modal

Submissions are bucketed by workflow stage (needs review, approved, rejected) instead of raw lifecycle states. Each opens in its own review modal, keeping context off the main list.

Per-module access management lives on the module itself

Every module settings page now lists who has access and exposes a typeahead to grant or revoke without leaving the module. Removes the round-trip through global user settings.

Self-service area for workers • hours, profile, competence, contracts

Workers get a personal area at /me with their hours dashboard, an editable profile, a competence wallet for adding qualifications and proof, and a contract archive. Reduces day-to-day questions reaching account managers.

8 changes · 1 added · 5 updated · 2 fixed

Clockwork 2 · Workforce 2 · UI 2 · Scheduling 1 · Contracts 1 · Forms 1 · +1 more

Signup list filters out shifts the worker is already assigned to

Shifts already assigned to a crew member are filtered out of the public signup list, preventing double-assignment from a single signup session.

Enabling Ops grants access to managers, not just admins

Activating the Ops platform on an account now correctly extends Ops access to managers — closing a permission gap that required a manual second step.

Module settings page surfaces platform attribution per module

The modules settings page shows which platform — Workforce or Ops — each module belongs to, making the scope of any toggle change immediately visible.

Session cards align time and task lines via mobile subgrid

Session cards on narrow viewports now keep the time and task fields aligned across all rows.

Radio channels gain mode and signal-type metadata; lists exportable

Radio channels now carry mode (analogue, digital, DMR, TETRA) and signal type (simplex, duplex). Public contact and channel lists are downloadable as CSV or PDF on a per-list basis.

Voiding fully-signed contracts notifies the recipient

Fully-signed contracts can now be voided. The recipient receives a notification email when their contract is voided, regardless of opt-out settings — voiding is not optional communication.

GPS captured consistently across every clock-in/out flow

Location now logs whether the worker clocks via QR code or a manager clocks them in from the backend. GPS capture timeout is also more reliable on slow connections.

Food and allergies • dietary data collection module

Collect dietary preferences and allergy information from crew. Send request emails individually or in bulk via Groups, track responses, and export a summary. Access grants are per-user so visibility stays controlled.

9 changes · 2 added · 5 updated · 2 fixed

Contracts 3 · Workforce 2 · Messaging 2 · Locations 2 · Infrastructure 1 · Scheduling 1 · +4 more

Users • preferred language no longer corrupted on save

Editing a user could in rare cases write the literal string "Array" into their preferred language field. The user form now validates the active language before saving.

Groups • contract coverage table tidy-up

The contract coverage table on the group detail page no longer shows a redundant Details button; the row itself is the link.

Users • import lives in Settings

The Import button on the Users page now goes to the canonical Settings → Import wizard, with the old standalone import URL redirecting there. The button is also hidden on mobile, since the wizard is desktop-first.

Projects • clearer hierarchy, no empty container rows

Project lists now show "Parent / Child" for projects nested inside a container, and container projects with no children are no longer shown as empty rows.

Comms • phone numbers display as +47 12345678

Phone numbers on the Contacts tab and in the printable contact-list PDF now render in spaced international format for readability.

Items moved into Ops

Items has been recategorised in the sidebar from Workforce into Ops, alongside Inventory and Locations.

Contracts • emails go out in the recipient's language

Contract emails (sent, viewed, signed, declined, reminders) now resolve language per recipient using their preferred language and the account default as fallback, instead of using the sender's language. Cron-triggered reminders translate correctly for each individual recipient even when no admin is logged in.

Contracts • automated signing reminders

Recipients with unsigned contracts are now reminded automatically by email. A standard reminder fires 5 days after sending and again 3 days before the recipient's first scheduled shift. An urgent reminder fires when a shift is due within 24 hours and the contract is still unsigned. Each stage only triggers once per recipient, so the same person never gets the same nudge twice.

Comms • Contacts and Radio Channels

A new Comms section in the sidebar groups two modules. Contacts (per-account contact lists for emergency, suppliers, crew leads) has moved here from its previous location. Radio Channels is brand new — track which crew or department is on which frequency / channel during the event, with per-channel notes and a printable overview.

3 changes · 2 updated · 1 fixed

Workforce 1 · Messaging 1 · Groups 1 · Localization 1

Messaging • group with subgroups no longer drops recipients

Composing a message to a group now correctly resolves recipients via the leaf-only group assignment. Users in subgroups under the selected group are no longer missed when the message is sent.

Contacts • translated default list and tighter public layout

The default Contacts list seeded when the module is first enabled is now created in the account's default language. The public contact-list page also renders denser cards on small screens.