User Documents tab
Every user now has a Documents tab listing all uploaded evidence — type, status, expiry, and a download link in one place.
Every user now has a Documents tab listing all uploaded evidence — type, status, expiry, and a download link in one place.
Competence files now live in a canonical user_documents table with a many-to-many link to competencies. Each document carries a verification status and can be reused across multiple competence claims.
Dashboard KPIs and the Clockwork view now refresh automatically so you see current state without reloading.
Admins can send workers a secure tokenised link to fill in missing information or update competence — no login required. Links expire and are one-time.
Resolved a bind_param type/count mismatch that was returning 500s on both shift creation and signup link creation paths.
Users provisioned before the user_auth table existed can now request a password reset — the flow auto-creates the auth record on first reset.
Public registration no longer routes through reCAPTCHA. Submit handlers were hardened against silent failures as part of the cleanup so a missing third-party dependency cannot strand a submission.
Incident type labels and category names are now available in Norwegian, Swedish, and Danish in addition to English.
The Resend action is now available on partially-signed contracts, making it easier to nudge the remaining signer without opening a fresh agreement.
Quill is now bundled rather than CDN-loaded — resolves a loading failure that could leave the template editor blank or non-editable.
Sender counter-signature is fully wired up. Signed PDFs include the per-signer audit trail and signature certificate, are attached to the fully-signed notification email, and contract emails carry the sending account's name.
Social-security numbers are now encrypted at rest with a per-user salt and account-scoped pepper. Revealing an ID number in the clockwork verify modal goes through a dedicated audit-logged endpoint — every reveal is attributable.
Technical focus: AES-256-GCM • Audit-logged reveal endpoint
Registration forms now have independent toggles for workspace access and terminal clock-in access. Terminal access is blocked by default on new forms — the more conservative posture.
Public registration submissions create the account, send a welcome email containing the PIN and a set-password link, and enforce shift selection on shift-scoped signup links. Removes the manager round-trip for day-of-event onboarding.
Tab navigation surfaces a dedicated Approvals page; shifts now optionally carry a group; CSV import covers group_id and the full current schema. Brings the schedule module up to parity with the rest of the platform.
Filled slots vs active slots is reported in real time on the workspace dashboard. Replaces the previous "log in to find out" model with operational visibility on landing.
Replaces feature-specific cron jobs with a unified worker that polls a shared queue. Stuck-job detection and per-run duration metrics make background work observable end-to-end through one operational surface.
Technical focus: Job queue • Worker coordination • Stuck-job detection
Each leaf location can be configured to send a 06:00 crew list and shift overview to its linked users every morning, in the recipient's preferred language.
Workers are linked to one or more leaf locations. Per-location crew lists are produced on demand as PDF, in-browser view, or email — in English, Norwegian, Swedish, or Danish.
PHP errors are now logged on production for operator debugging without ever surfacing them to end users.
Login page is now indexable with a proper canonical URL and meta description. All other pages remain noindex by deliberate policy.
Admin logout was leaving the session intact due to a cookie path mismatch. Resolved.
Permissions-Policy, stricter CSP, and the standard security header set are now enforced consistently at both Apache and Nginx. Eliminates a class of header drift between deployment topologies.
Technical focus: CSP • Permissions-Policy • Apache + Nginx
Cleaned up double borders, fixed shift-time display on the dashboard, and excluded admin-assigned shifts from the approval count.