30 May 2026

Update - 30 May 2026

A big catch-up. The headline is single sign-on — sign in via Keycloak, Microsoft Entra, Okta, Google and other OpenID Connect providers, with the flexibility to run different user groups on different providers and a local-login fallback that means nobody gets locked out. Alongside it: the new Workflows automation engine, Excel-style Table views across several modules, Tasks calendar & timeline, Forms versioning and new field types, customer-satisfaction surveys and screen recordings on Tickets, Process Mapper custom step types, an asset lifecycle layer, and a broad consistency polish across the whole app.

FeatureAuthentication

Sign in with single sign-on (SSO)

You can now log in to FreeITSM through an external identity provider — Keycloak, Microsoft Entra ID, Okta, Google Workspace and other OpenID Connect providers. The provider handles the password and MFA; FreeITSM just receives a verified, signed token. Read the deep dive or the setup guide.

FeatureAuthentication

Roll out SSO at your own pace

Assign individual users to a provider so you can move people across in cohorts — run an Entra pilot for one group while everyone else stays on Keycloak. An email-first login routes each person to the right place, local login remains as a fallback, and signing out now ends the provider session too.

FeatureAuthentication

Single Sign-On admin page

A new System → Single Sign-On screen to add and manage identity providers, with a built-in "test" button to check a provider before saving and master on/off switches. Client secrets are stored encrypted.

FeatureWorkflows

New module: Workflows

A cross-module automation engine: when something happens, run the actions you choose. Build rules once and let them handle the repetitive work. Read the deep dive.

FeatureWorkflows

Visual workflow canvas

A drag-and-drop visual canvas for building workflows, replacing the original form-based editor.

FeatureWorkflows

AI co-author for workflows

Describe a workflow in plain English and the AI scaffolds it on the canvas for you to tweak and save.

FeatureWorkflows

Choose your AI provider for Workflows

Per-module AI settings let you pick the provider, model and key, with both Anthropic and OpenAI supported.

FeatureWorkflows

Friendlier workflow conditions

Conditions now show real values rather than internal ids, and support OR-style multi-select in a single line.

FeatureWorkflows

Real workflow actions

Workflows can now set status and priority, assign, add notes, send emails, and create tasks and tickets — with variable substitution and a friendly per-action form instead of raw JSON.

FeatureWorkflows

Tickets trigger workflows

Ticket changes now fire live workflow events, so creating, assigning or re-prioritising a ticket can drive automation.

FeatureWorkflows

Forms, Tasks and Changes trigger workflows too

Submitting a form, completing a task or approving a change can now kick off a workflow — all the trigger events are live.

ImprovementWorkflows

Smarter condition operators

The operator choices now match the field type, so irrelevant options no longer clutter the list.

ImprovementWorkflows

Workflows help guide

The help page gained a left guide panel with scroll-spy navigation.

ImprovementWorkflows

Loop protection

Behind-the-scenes safeguard so a workflow can't trigger itself into a runaway loop; any blocked run is recorded in the audit trail.

FeatureTasks

Tasks calendar view

See your tasks laid out on a calendar by date.

FeatureTasks

Tasks timeline (Gantt) view

A Gantt-style timeline view of tasks across their start and due dates.

FeatureTasks

Month / Week / Day on the tasks calendar

The tasks calendar gained Month, Week and Day views matching the Calendar module.

FeatureTasks

Drag & right-click on the timeline

Drag timeline bars to reschedule, drag their edges to change start/due dates, and right-click for quick assignment, status and priority changes.

FeatureTasks

Tasks table view with inline editing

A full-screen, Excel-style grid of tasks where you can edit cells in place, with filters, sorting, column control and CSV export.

FeatureTasks

Quick-look panel on the calendar

Clicking a task in the calendar opens a slide-in detail panel instead of navigating away.

FeatureTasks

Quick-look panel on the timeline

Clicking a task on the timeline now opens the same slide-in detail panel.

FeatureTasks

Configurable board card fields

Choose which fields appear on the task board cards.

FeatureTasks

Right-click board cards

A right-click menu on board cards for quick actions.

FeatureTasks

Search your tasks

A search box on the board and list views.

FeatureTasks

Task tags

Tag tasks and filter by them.

FeatureTasks

Reorder board columns

Drag task board columns into the order you want.

FeatureTasks

Tasks in your language

The Tasks module is now fully multilingual.

FeatureTasks

Tasks help guide

The Tasks module gained a full in-app help guide.

ImprovementTasks

Task start dates

Tasks now have a start date as well as a due date.

ImprovementTasks

One column per status

The task board now shows a column for each status.

ImprovementTasks

Consistent calendar toolbar

The tasks calendar toolbar now mirrors the Calendar module's header.

ImprovementTasks

Timeline auto-fits the screen

The timeline now sizes itself to the available width — no more zoom buttons.

ImprovementTasks

Tidier Tags settings

Each section of the Tags settings tab now sits in its own panel.

ImprovementTasks

Tasks help updated

The help guide now covers the calendar, timeline and table views.

FeatureProcess Mapper

Right-click to create a connected step

Right-click a step to drop a new step that's already connected to it.

FeatureProcess Mapper

Custom step types

Define your own palette of step types to suit your processes.

FeatureProcess Mapper

Custom step types in the editor

The editor is fully driven by your custom step types.

FeatureProcess Mapper

More right-click actions + rubber-band select

Four more right-click actions, plus rubber-band selection across lanes.

FeatureProcess Mapper

PNG and PDF export

Export your process maps as PNG or PDF.

FeatureProcess Mapper

More step actions, links and sticky notes

The step right-click menu gained eight new actions, per-step URL links, and sticky-note annotations.

FeatureProcess Mapper

Hideable left panel

The left panel can be hidden and slid in on hover, controlled from a new Settings tab.

ImprovementProcess Mapper

Recolour on type change

Changing a step's type now repaints it in that type's default colour.

ImprovementProcess Mapper

Bookmarkable diagrams

Selecting a process updates the URL, so diagrams are bookmarkable and back/forward moves between them.

ImprovementProcess Mapper

No more flicker mid-drag

The step detail panel no longer flashes open while you drag.

FeatureForms

AI settings for Forms

A per-module AI tab for Forms with its own provider, key and billing.

FeatureForms

Four new field types

Forms gained email, number, radio-button and multi-select checkbox fields.

FeatureForms

Form versioning

Save updates a form in place, or save it as a new version — and browse the full history from a Versions dropdown.

FeatureForms

Dedicated form editor page

Editing a form now has its own clean page and URL.

FeatureForms

Version details in the builder

Author, created/modified dates and version number are shown in the builder.

ImprovementForms

Context-aware AI Assist

When editing an existing form, AI Assist now modifies it rather than replacing it.

ImprovementForms

Restructured form editor

Tools at the top, completion actions at the bottom, and version details in a slide-out drawer.

ImprovementForms

Forms dashboard table

The Forms landing page is rebuilt as a full-width dashboard table.

ImprovementForms

Tidier add-field popup

The add-field popup is wider with neatly aligned badges.

ImprovementForms

Settings polish

General settings tidy-up and a consistent help-sidebar heading colour.

FeatureTickets

Customer satisfaction (CSAT) surveys

Customers can rate their experience when a ticket is closed, feeding satisfaction reporting.

FeatureTickets

Screen recordings on tickets

End users can record their screen straight from the new-ticket form — no plugins or third-party tools needed.

FeatureTickets

Month / Week / Day on the tickets calendar

The Tickets calendar gained Month, Week and Day views.

FeatureTickets

Manage end users from Tickets

Analysts can now create, edit and delete end users from the Users page.

FeatureTickets

Set status from the right-click menu

Change a ticket's status straight from the inbox right-click menu.

FeatureTickets

Set priority from the right-click menu

Change a ticket's priority from the right-click menu.

FeatureTickets

Assign from the right-click menu

Assign a ticket to an analyst from the right-click menu.

ImprovementTickets

Full-width Rota page

The Rota page is now full-width with calendar-style navigation controls.

ImprovementTickets

Tidier reply-cleanup settings

The reply-cleanup settings tab now uses a two-column layout, with a tab-cutoff issue fixed.

ImprovementTickets

Consistent SLA settings text

Font sizes and muted-text colours are now consistent across the SLA settings.

ImprovementTickets

Tidier SLA settings panels

Each SLA settings section now sits in its own panel, matching Global settings.

ImprovementTickets

Settings tidied to sentence case

The Tickets settings area now uses consistent sentence-case wording.

ImprovementTickets

Tickets help updated

The Tickets help page now covers the most recently added features.

FeatureAssets

Full-screen Assets table view

An Excel-style table of every asset with column filters, sortable/reorderable/hideable columns, CSV and PDF export, and per-user layout.

FeatureAssets

Build a location hierarchy

A new Locations tab lets you create an arbitrary-depth tree of sites, buildings and rooms for where assets live.

FeatureAssets

Locations, purchase & warranty details

Assets can be placed in your location hierarchy and carry purchase date, cost, supplier, order number and warranty expiry.

FeatureAssets

Check-in / check-out with a custody trail

Assigning an asset is now a check-out (with an optional due-back date) and removing it a check-in, with every movement kept in a custody history per asset.

FeatureAssets

Warranty-expiry alerts

Asset warranties can surface as alerts on the Watchtower dashboard and/or as Calendar events, with a configurable "warn X days before" threshold.

ImprovementAssets

Suppliers from the shared registry

Asset suppliers are now picked from the same supplier list as Contracts rather than typed as free text — one record per vendor across the system.

ImprovementAssets

Tidier assign-user dialog

Sentence-case labels, a shorter "Assign" button, and a fixed-height results box so the dialog no longer jumps around as you search.

ImprovementAssets

Full-width Servers page

The Servers page now uses the full screen width, and a redundant Add button on empty dashboards is gone.

ImprovementAssets

Settings tidied to sentence case

The Assets settings area now uses consistent sentence-case wording throughout.

FeatureCalendar

New Table view

A full-screen, Excel-style grid of every event with inline editing, filters, sorting, column control and CSV export.

ImprovementCalendar

Settings tidied up

Sentence-case wording, single-word buttons and consistent action icons throughout calendar settings.

ImprovementCalendar

Standard tab layout

Calendar settings now use the same tabbed layout as the other modules.

ImprovementCalendar

Friendlier dialogs

Calendar settings now use the app's styled confirm dialogs and toasts instead of plain browser pop-ups.

FeatureChange Management

Manage change-form sections

Settings now let you add, rename, reorder and delete form sections and drag fields between them, with the change form updating live.

FeatureChange Management

New Table view for changes

A full-screen, Excel-style grid of every change with sorting, filtering, column control and CSV export.

FeatureChange Management

Edit changes inline in the table

Edit type, priority, impact and assignee directly in the change grid; status and the detailed fields stay in the full form.

ImprovementChange Management

Tidier change form

Short fields now pair two-per-row automatically while longer fields take the full width.

ImprovementChange Management

Sticky Save/Cancel footer

The change editor gained a sticky footer with Cancel and Save.

FeatureKnowledge

Configurable sidebar visibility

Choose whether the Knowledge sidebar is always visible or shows on hover, per analyst.

ImprovementKnowledge

Better review screen

A full-width review screen with a "Days overdue" column and a quick edit button.

ImprovementKnowledge

Review screen search

The review screen moved to a clean URL with an inner-scrolling table and a search box.

ImprovementKnowledge

Title and tags on one row

The article editor now puts Title and Tags on the same row.

ImprovementKnowledge

Settings tidied up

Sentence-case wording and single-word action buttons.

ImprovementCMDB

Roomier AI settings

The AI integration tab now uses a two-column layout with a larger custom-instructions box.

ImprovementCMDB

Settings match the other modules

CMDB settings tabs now share the same look and spacing as every other module.

ImprovementCMDB

Settings tidied up

Sentence-case wording and modal buttons that match the rest of the app.

FeatureMorning Checks

Draggable list/chart divider

Drag the divider between the checks list and the chart; the split is saved per analyst.

FeatureMorning Checks

Chart fill setting

Choose a plain or gradient bar fill for the chart, saved per analyst.

FeatureMorning Checks

Custom check statuses

Admins can add, rename, recolour, reorder and require notes per status — reflected on the dashboard, chart and PDF.

ImprovementMorning Checks

Full-viewport layout

The dashboard and settings now fill the screen.

ImprovementMorning Checks

Icon row actions

Settings row actions are now pencil and trash icons.

ImprovementMorning Checks

Chart polish

The chart now expands and collapses smoothly, with a cleaner header and more usable space.

ImprovementMorning Checks

Normalised statuses

Check results now use a proper status list, with a guided tool to tidy up any old data.

ImprovementReporting

Full-viewport logs

The system-logs page now fills the screen.

ImprovementReporting

Sticky logs pagination

System-log pagination is now a sticky footer with equal-width Previous/Next buttons.

ImprovementReporting

Sentence case on system logs

System-log tabs, column headers and page title now use sentence case.

FeatureSelf-Service

End-user help page

The self-service portal gained a help page for end users.

ImprovementSelf-Service

Hover-to-rate CSAT

The satisfaction survey now has a proper hover-to-rate star interaction.

ImprovementLMS

Full-width dashboard + icon actions

The LMS dashboard now fills the screen and uses icon action buttons.

ImprovementSoftware

Module tidy-up

Sentence case, full-width settings, icon row actions and consistent help headings across the Software module.

ImprovementContracts

Sentence case + Left-panel setting

A module-wide sentence-case sweep plus a new Left-panel tab in settings.

ImprovementService Status

Sentence case settings

Service Status settings now use sentence case throughout.

ImprovementHelp

Help & wiki updated

Help pages and the GitHub wiki brought up to date with the latest features.

ImprovementSystem

Preferences in the avatar menu

Reach your preferences from the avatar menu on any page.

ImprovementSystem

Account-based preferences

Your preferences now save to your account (not just the browser) and gather the per-user settings from across the app in one place.

ImprovementSystem

Consistent notifications

App-wide standard toast notifications and confirmation dialogs.

ImprovementSystem

Toggle switches + sticky buttons in dialogs

"Active" is now a toggle switch, and Save/Cancel stay pinned to the bottom of every settings dialog.

ImprovementSystem

Consistent settings dialogs

Every settings dialog now shares one consistent look and feel.

ImprovementSystem

Consistent dialog close controls

Dialogs across the app now close from a single Close button in the footer.

ImprovementSystem

Clearer help navigation

Help sidebar headings are grey until selected, then take the accent colour — across every module.

ImprovementSystem

Full-width admin pages

Settings and admin pages now fill the screen.

ImprovementSystem

Consistent top navigation

Every module's top navigation now behaves the same — sticky, equal-width buttons, centred.

17 May 2026

Update - 17 May 2026

The big one. The SLA module ships end-to-end on the Tickets module — schema, engine, settings UI, reading-pane panel, inbox pill, per-department breach notifications, cron worker with rate-limiting and an activity log, plus an in-app help page, a wiki page, and a deep-dive article. Tickets also gets time recording, a right-click context menu, a pop-out full-screen view, and a full i18n sweep taking every Tickets page through 18 languages. Two new locales (Afrikaans + Indonesian) bring the total to 20. Plus full-width settings pages across four other modules, a Watchtower guardrail for paused tickets, and assorted fixes.

FeatureTickets

SLA Module — Schema + Engine + Reading Pane + Inbox Pill

Business-hours-aware Service Level Agreements with per-priority response and resolution targets, configurable business calendars (timezone + weekly hours + holidays), and pause-the-clock statuses. Compute-on-read engine (`includes/sla.php`) walks the ticket audit log and intersects each non-paused interval with the calendar's working hours — no stored counters, no drift. Calendar edits recompute every historical ticket on the next view. The reading pane gets a colour-coded SLA panel (response + resolution rows, progress bars, status pills); the inbox list gains a small dot + label per row showing the more urgent of the two clocks. An admin-controlled `Enforce SLAs from` datetime cutoff grandfathers existing tickets so nothing breaches retroactively on first activation.

FeatureTickets

SLA Settings UI — Calendars, Targets, Behaviour

New SLA tab on the Tickets settings page with three sections. Global settings: enforcement cutoff, warning threshold percent, mid-flight priority-change behaviour (forward / recompute / reset), reopen behaviour (reset / continue), first-response definition (outbound email / status change / either). SLA Targets per priority: per-row response + resolution minutes + calendar select. Business Calendars: name + IANA timezone (loaded from `timezone_identifiers_list()` and grouped by region) + 7-row weekly hours grid + holidays list, with create/edit modal and transactional save. Plus a dedicated Pause-SLA column on the Statuses tab so admins can flag custom statuses (e.g. Awaiting Vendor, Maintenance Window) as clock-stopping.

FeatureTickets

Per-Department Breach Notifications + Cron Worker

Configurable rules that fire emails when a ticket approaches breach (warning) or actually breaches. Four dimensions per rule, all independent: scope (default or per-department), trigger (warning / breach), target (response / resolution / both), recipients (any combination of the ticket's assignee, members of the ticket's department teams, a specific named analyst, and custom email addresses). Department-specific rules win over the default. Powered by a new cron/sla_breach_check.php worker that runs on a schedule (every 5 min is the sweet spot) and dedups via the `sla_notifications_sent` table so each (ticket, target, trigger) combination fires at most once. Emails go out via the ticket's originating mailbox using the same OAuth tokens as inbound mail polling.

ImprovementTickets

Cron Worker: Rate-Limiting + Activity Log

Three security layers on the breach-check cron. 1. 128-bit shared-secret token for HTTP invocation (CLI skips, gated by filesystem perms). 2. Per-IP failed-auth lockout — more than 10 wrong-token attempts from one IP in the past hour triggers a 1-hour 429. 3. Min interval between successful runs (default 30s) — even a valid request returns 429 if it arrives too soon after the last run; catches accidental double-scheduling and runaway loops. New `sla_cron_runs` table logs every invocation (accepted or rejected) with outcome, duration, counts, and client IP. Auto-pruned after 30 days. A Cron Activity panel in the SLA settings tab shows the last 20 runs with colour-coded outcome pills.

FeatureTickets

SLA Management Help Page (in-app + wiki + freeitsm.co.uk)

SLA is meaty enough to deserve its own help page rather than getting buried in a single tab. New in-app page at tickets/help-sla.php with 7 sections (overview, building blocks, behaviour settings, breach notifications, cron setup, worked examples, troubleshooting) and a prominent gradient callout linking to it from the main Tickets help guide. Worked examples cover the simple case (UK ticket / UK desk) plus a cross-timezone scenario (UK ticket / Estonia desk) with three "fair" configuration options — customer-centric (UK calendar), analyst-centric (Estonia calendar), and overlap-window (UK 09:00-15:00). Also published on the wiki as a dedicated page and as a deep-dive article on freeitsm.co.uk featuring four fictional service delivery managers showing how the same building blocks fit very different teams.

FeatureTickets

Pop-Out (Full-Screen) Ticket View

Click the maximise icon next to the ticket subject (or double-click the email row) to toggle a focus-mode layout: folder list and email list disappear, reading pane fills the full width, properties panel floats as a 340px right-hand sidebar with everything stacked vertically. Same `renderTicket()` markup — just a body class toggled by JS, with the CSS doing the layout work. State persists via localStorage tied to the actual reading-pane state, so F5 with no ticket selected lands back in the default three-column view instead of trapping you in a blank popout.

FeatureTickets

Time Recording Against Tickets

Granular per-ticket time logs. Inline form in the reading pane (minutes + optional description) appends entries to a list showing who logged what and when, with a running total at the top. Each entry is soft-deletable but only by the analyst who logged it. Storage is integer minutes (no decimal-hour rounding), rendered as 45m or 1h 30m. The right-click context menu's Record time modal includes a datetime picker so you can backdate work you forgot to log earlier. Backed by a dedicated `ticket_time_entries` table indexed by analyst + datetime ready for a per-analyst timesheet view later.

FeatureTickets

Right-Click Context Menu — Quick Actions Without Losing Place

Right-click any ticket in the inbox to get a popover with two actions: Link CMDB object (search-as-you-type modal with multi-link in one sitting) and Record time (modal with backdating). Operates on the right-clicked ticket without changing the current reading-pane selection — so you can be reading ticket A and log time against ticket B without losing your place. If the affected ticket happens to be the one open in the reading pane, the relevant section there auto-refreshes when the modal closes. Closes on outside-click, Escape, window blur, or scroll.

ImprovementTickets

Tickets Module: Every Page i18n'd Across 18 Languages

Reading-pane chrome (action buttons, CMDB section, Time Entries section), Users page, Rota page, Calendar page, Dashboard heading and Add buttons, the entire Settings page (tabs, headings, column headers, action-icon tooltips, all 14 modals including the OAuth/Azure/IMAP technical labels, all button text), full-width Settings layouts everywhere — all translated natively into the 17 non-English locales. Convention for technical labels: product / protocol names (Azure, OAuth, IMAP, Microsoft, Google, CMDB, AI) stay Latin in all locales including Indic; generic surrounding words (Port, Scopes, Secret, Tenant, ID) translate naturally. Roughly 4,000 translation entries added across the pass. Tickets is now the second fully-i18n'd module after Process Mapper.

FeatureProject

Afrikaans — 19th Supported Locale

Targeted at South African users. Subagent used the existing Dutch translations as a starting point given Afrikaans's 17th-century Dutch origin, then adapted for distinct Afrikaans conventions (simpler verb conjugation, more English loanwords in tech contexts, distinctive vocabulary — Stoor not Opslaan for Save, Kanselleer not Annuleren for Cancel, Skrap for Delete). Notable translation calls: "Service Desk" as Dienstoonbank, "Rota" as Rooster, "Watchtower" as Wagpos, "Tickets" as Kaartjies. Full translations of common.php, tickets.php, and process-mapper.php.

FeatureProject

Indonesian (Bahasa Indonesia) — 20th Supported Locale

Targeted at Indonesian users. Heavy use of English loanwords where local IT staff would type them (Email, Login, Logout, Password in everyday admin fields), formal native terms for security-sensitive labels (Kata Sandi for password-change modal title), pure Indonesian for surfaces that aren't tech-jargon-specific (Simpan/Batal/Hapus/Cari/Tambah). Notable calls: "Service Desk" kept as the English loanword (the calque Meja Layanan feels awkwardly literal), "Rota" as Jadwal Kerja, "On Call" as Siaga. Indonesian doesn't inflect for plural so no Russian/Polish-style colon-trick needed. FreeITSM now supports 20 languages end-to-end.

ImprovementProject

Home Screen, Waffle Menu + Ticket Calendar i18n'd

The home page module grid, the waffle-menu module switcher, and the ticket calendar (week-navigation buttons, month names, day-of-week headers) all translated across 18 languages. Dates rendered via Intl.DateTimeFormat so French sees lun. mar. mer., German sees Mo Di Mi, etc. — no hardcoded English short-form arrays. Plus an i18n bootstrap order fix so the per-user locale preference lookup actually fires before the first paint.

FeatureWatchtower

Tickets Paused Too Long — Guardrail Against SLA Escape Valves

Crossover with the SLA pause-the-clock feature. Catches the well-known ITIL antipattern of analysts parking tickets in On Hold to dodge the SLA clock when stuck or busy. The Tickets card on Watchtower now shows an amber attention row whenever there are tickets in a paused-SLA status where the last status change was longer ago than the configured threshold (wall-clock hours). Default 24h (allows overnight pauses, flags anything sitting through a full working day); configurable via system_settings.watchtower_paused_too_long_hours. Single correlated-subquery SQL — scales to thousands of tickets without per-row work.

FixWatchtower

SQL Error Referencing Legacy changes.status Column

Column not found: 1054 Unknown column 'status' in 'where clause'. The Watchtower dashboard's Changes counter still referenced the legacy changes.status VARCHAR column that was dropped after the migration to a proper change_statuses lookup table. Fixed by JOINing the lookup and comparing by name to preserve the original semantics.

FeatureLMS

LMS Module: In-App Help Page

Comprehensive in-app help page for the LMS module covering content authoring, SCORM packages, learning paths, quizzes, certificates, and reporting. Matches the visual conventions of the other module help pages (scroll-spy sidebar, sectioned content).

ImprovementCross-module

Full-Width Settings Pages — Service Status, Tasks, CMDB

Settings screens on Service Status, Tasks, CMDB (and earlier in the day, Tickets) all switched from the default 1200px container to fill the full screen width — matching the consistent treatment across modules. The bigger working area makes the lookup tables much more usable when there are many columns. Plus a follow-up fix for action icons getting cramped onto two rows in Tasks settings (the new wider tables gave the Actions column the smallest share of auto-layout width).

ImprovementReporting

Reporting Module Polish

The User Logins report now fills the page width to match other reports, and the module's nav buttons are equal-width and centred. Small visual consistency improvements that make the module feel less ad-hoc.

ImprovementTickets

Tickets Help Page Brought Up to Date

The help page now covers the recently-shipped features: drag-and-drop triage with spring-loaded folder expansion, the Department-vs-Analyst grouping toggle, full-screen popout view, right-click quick actions, and time recording. Five new sub-sections added across the existing structure; three new tips on the Quick Tips card grid.

FixTickets

Malformed Email Bodies No Longer Bleed into CMDB / Time Entry Panels

Reported via ticket MFG-151-13903 where the email body ran straight into the operational sections below. Root cause: email HTML interpolated raw into a template literal with an unclosed tag caused the browser's HTML parser to balance the unclosed tag at the end of the parent element — so sibling containers (CMDB objects, time entries, notes) silently ended up nested inside the email body's runaway element. Fix runs every email body through DOMParser.parseFromString() (auto-balances tags safely in a separate document context) and also strips <style>/<script>/<link>/<base>/<meta> blocks that could leak page-wide CSS. Plus CSS contain: layout paint + overflow: hidden on the email body containers as belt-and-braces against positioning escape.

FixTickets

Email Templates Tab: "t is not a function" Console Error

Self-inflicted regression from the i18n pass. The Email Templates render's .map(t => ...) arrow-function parameter t (each template object) shadowed the global t() i18n function, so the inner template literal's ${t('common.edit')} call was trying to invoke the template object as a function. Renamed the parameter to tpl. Swept the rest of the file for the same pattern — the other 5 callsites only access properties, not the function.

16 May 2026

Update - 16 May 2026

FreeITSM is now multi-lingual. New native i18n infrastructure (PHP t() + JS bridge + per-locale translation files + per-key fallback to English) plus the Process Mapper module pilot-converted end-to-end across 18 languages — English, French, German, Spanish, Brazilian Portuguese, Dutch, Italian, Polish, Russian, plus nine Indian languages (Hindi, Bengali, Tamil, Telugu, Marathi, Kannada, Malayalam, Gujarati, Punjabi, each in its own native script). Pick a language in System → Preferences and the Process Mapper UI re-renders in that language: toolbar, autosave status, sidebar, detail panel labels, dropdowns, placeholders, hint text, export modal, the lot. Other modules will follow in phased sweeps; the infrastructure is the hard part and it's done. Read the deep dive on how the i18n layer works →

Plus the same day: the Network Mapper module shipped end-to-end — graph editor with autosave + version history, 65-icon library with per-node override, drag-to-canvas binding from the CMDB picker, header/footer branding overlay, Present mode, zoom controls, and a help screen. Plus a new organisational branding settings system, CMDB planned objects for future-state architecture work, and Tickets i18n phase 1a (inbox chrome).

FeatureProject

Native Multi-Language Support — i18n Phase 1

Brand new i18n infrastructure. PHP and JavaScript both gain a t('namespace.path.to.key') helper that resolves through per-locale translation files (lang/<code>/<namespace>.php). Fallback works per key, not per file — if a German file has 80% of keys translated, you get those 80% in German and the missing 20% in English. JS reads from a window.translations object that PHP injects at page render with the active locale already merged on top of English, so the JS layer doesn't need to re-implement the fallback chain. Locale resolution goes user preference → browser Accept-Language header → English default. Eight starter locales shipped in phase 1: en, fr, de, es, pt-BR, nl, it, pl, with the Process Mapper module converted as the pilot so language switches produce visible changes immediately.

FeatureProject

Russian Added as 9th Supported Locale

Native name Русский. Full translations of common.php and process-mapper.php — switching to Russian gives a fully localised Process Mapper UI. Demonstrates how cheap a new language is once the i18n infrastructure is in place: two new files plus one line in the supported-locales map.

FeatureProject

Nine Indian Languages Added

Hindi (हिन्दी), Bengali (বাংলা), Tamil (தமிழ்), Telugu (తెలుగు), Marathi (मराठी), Kannada (ಕನ್ನಡ), Malayalam (മലയാളം), Gujarati (ગુજરાતી), Punjabi (ਪੰਜਾਬੀ, Gurmukhi script). Each appears in the System → Preferences dropdown in its own native script. Full common.php + process-mapper.php for every locale — 18 new files in total. FreeITSM now supports 18 languages end-to-end on the pilot module. A native-speaker review is wise before relying on these in production — community PRs welcome.

ImprovementProcess Mapper

Full Process Mapper Coverage — Every Visible String Translated

Expanded the i18n sweep through every UI surface on the Process Mapper module: module header (title + nav buttons), sidebar (+ New Process, Search processes…, empty state), detail panel labels (Label / Type / Colour / Gradient / Description / Position / Size / Height / Order / Connectors), step-type dropdown options (Process / Decision / Terminal / Document), input placeholders ("Add notes about this step…", "e.g. HR / IT / Vendor"), the lane usage hint paragraph, and the dynamic detail panel title (Step Details / Group Details / Lane Details) set via JS t(). ~20 new translation keys added under the process-mapper.nav.*, process-mapper.sidebar.*, and process-mapper.detail.step_type.* namespaces, and translated across all 18 languages in parallel.

FeatureTickets

Tickets i18n — Phase 1a (Inbox Chrome Across 18 Languages)

Second module pilot-converted to the new i18n layer after Process Mapper. Phase 1a covers every PHP-rendered string visible on inbox page load: header nav (Inbox / Dashboard / Users / Calendar / Rota / Settings / Help), folder panel + group toggle, email list placeholder, reading-pane empty states, five modals (Add Note, Reply/Forward, Create New Ticket, Search, Schedule Work), and the AI Chat panel. About 70 translation keys across tickets.nav.*, tickets.folders.*, tickets.list.*, plus per-modal namespaces, all 18 locales updated in parallel.

FeatureNetwork Mapper

Network Mapper Module — Shipped End-to-End

Brand new module for building network diagrams where every node binds to a real CMDB object — so the diagram is the CMDB's source of truth, not a Visio file on a SharePoint site that drifts the moment anything changes. Shipped across four progressive chunks plus polish: graph foundation, editor shell with autosave + version history, drag-to-canvas binding from the CMDB picker, inline connector labels, detail panel with related-object suggestions, 65-icon library with per-node override, word-boundary label wrapping, page-size guide overlay, header/footer branding overlay (logo + footer line), version history dropdown in the toolbar, and a dedicated help screen. See the deep-dive article for the full story.

FeatureNetwork Mapper

Zoom Controls + Present Mode

The same evening as the module foundation. Toolbar gets zoom-in / zoom-out / fit-to-screen buttons. Present mode hides the toolbar, sidebar, and editor chrome, leaving just the diagram against the canvas — for projecting in a meeting or screen-sharing without the UI distracting from the content. Escape to exit. Auto-centre tool finds the bounding box of the diagram and zooms to fit on demand — useful when nodes have drifted off-screen during editing.

FeatureCMDB

CMDB: Planned Objects (Future-State Architecture)

New is_planned flag on every CMDB object so architects can model future-state infrastructure (proposed servers, planned services, replacement hardware) alongside the live estate without those entries leaking into operational reports. Planned objects render with a dashed border + amber tag everywhere they appear. Filter toggle on the CMDB list page hides them by default. Useful as a thinking tool for change planning where you want the CMDB topology to be the canvas.

FeatureSystem

Organisation Branding Settings

A System → Branding page where the organisation's logo (square + landscape) and footer line are configured once. The Network Mapper module then surfaces these as an optional header/footer overlay on every diagram — useful when exporting diagrams that get circulated externally or embedded in management decks. The same branding data is wired ready for other modules (PDF reports, certificates, etc.) to consume in future passes.

15 May 2026

Update - 15 May 2026

Big upgrade to the Process Mapper module — from basic flowchart builder to proper modelling tool. Autosave with Word-style live status, free-form groups that own their contents, full swimlanes (reorder by header drag, resize by divider drag, automatic step-to-lane ownership), gradient fills on every shape, and export to Mermaid markup for embedding in any Markdown surface (GitHub, Notion, Confluence, Obsidian, Mermaid Live Editor). Plus a new System → Debug Tools library so users on the other side of the world can run a one-click diagnostic and paste the output back when something fails. The Contracts module also gets a polish round (Suppliers and Contacts pages adopt the dashboard layout, edit form switches to sentence case, sticky footer on long forms, dedicated supplier view page). Plus the GitHub wiki goes from empty to fully populated with 26 module pages.

FeatureProcess Mapper

Swimlanes

Horizontal bands stacked top-to-bottom across the canvas, with a left-edge vertical label header showing each lane's name. Click Lane in the toolbar to drop a band; drag the header up/down to reorder — every step (and group) in the affected lanes reflows to stay anchored to its band. Drag the bottom edge of a lane to resize it (snaps to the grid in the same 20px increments as the steps); lanes below shift to make room and their contents follow. Steps gain a lane_id that auto-assigns based on where the step ends up after each drag, so the data model always reflects what's visually true. Delete a lane and contained steps lose their lane assignment but keep their position — nothing is lost. Per-lane gradient fills supported via the same colour-pair mechanic as the rest.

FeatureProcess Mapper

Groups — Labelled Underlays

Optional coloured rectangles that sit behind steps as a visual underlay. Useful for marking a phase ("Resolution", "Triage"), a team's area of responsibility, or any free-form cluster. Click Group in the toolbar to drop a 240×160 rectangle at the canvas centre; drag the body to move (snaps to the 20px grid like steps), drag the bottom-right corner handle to resize, double-click to rename. Detail panel grows a second body for groups with inputs for label, fill colour, position, and size — typing in any input updates the canvas live.

FeatureProcess Mapper

Groups Own Their Contents

The natural follow-up to plain visual groups: drag a group and the steps inside it now come with it. Each step has a nullable group_id that auto-assigns when a step is dropped inside a group; dragging the group applies the per-frame delta to every step where group_id matches, so contained steps track the group rigidly. When groups overlap, the smallest by area wins for ownership — an inner group inside a wider one claims the steps that visually fall inside it. Resize a group so a step ends up outside — that step's group_id clears on mouseup. Delete a group and contained steps survive untouched (just lose their group assignment).

FeatureProcess Mapper

Autosave with Word-style Live Status

New Autosave toggle in the toolbar persists per-analyst. When on, a debounced save fires ~2 seconds after the last edit — no wasted writes on an untouched diagram, no half-finished-drag captures. Status line beside the toggle cycles through ✓ Saved / Unsaved / Saving… / ⚠ Save failed — retry, held visible for at least 400ms so it doesn't just flash on fast saves. The save fire defers itself while any drag is in progress so the user's in-flight drag never gets clobbered by a mid-drag reload. Manual Save button and Ctrl+S still work in both modes.

FeatureProcess Mapper

Gradient Fills on Steps, Groups and Lanes

Each shape can now render as a two-stop diagonal gradient instead of a flat fill. Detail panel's Colour input grows an inline Gradient checkbox plus a second-colour swatch; ticking the box reveals the second picker (pre-seeded with a darker shade of the primary colour, but you can pick anything) and the change applies live. Lanes inherit the same mechanic. Null second colour = solid, so every existing diagram keeps its previous look.

FeatureProcess Mapper

Export to Mermaid

Toolbar Export button opens a modal with the current process rendered as Mermaid flowchart markup, ready to paste into any Markdown surface that supports it (GitHub READMEs, GitHub/GitLab wikis, Notion, Confluence, Obsidian, Mermaid Live Editor). Uses flowchart LR direction so lanes-as-subgraphs stack vertically into proper horizontal swimlanes, with step shapes mapped to classic Mermaid syntax for maximum renderer compatibility — Process becomes ["label"], Decision {"label"}, Terminal (["label"]), Document [/"label"/]. Connectors become --> arrows with labels surviving as -->|"label"|. Hand-placed positions, colours, gradients, and groups deliberately not exported — Mermaid auto-layouts. Lossy on visuals, faithful on structure.

ImprovementProcess Mapper

Detail Panel Survives Autosave

Previously, every autosave reloaded the canvas to pick up fresh real IDs, and the reload closed the detail panel. So if you were mid-edit on a step or group properties, the panel slid closed every 2 seconds. Fix captures the current selection by stable identity (step x/y, group x/y/w/h, lane display_order) before the save, then re-finds the equivalent entity after the reload and re-populates the panel with the fresh IDs — so editing continues seamlessly across autosaves.

FixProcess Mapper

Delete and Backspace Now Actually Delete the Selection

Clicking a step (or group, or connector) used to leave keyboard focus on <body> rather than the canvas, so the canvas's keydown listener never fired and Delete/Backspace did nothing. Now any selection action explicitly pulls focus onto the canvas so the keystrokes reach the listener — consistent across steps, groups, lanes, and connectors.

FixProcess Mapper

Lanes Were Invisible After Creation

Clicking the Lane button opened the detail panel with a fresh lane visible in the inputs, but no band appeared on the canvas. CSS stacking-context quirk — the canvas wasn't promoted to a stacking-context root, so lane elements at negative z-index painted behind the canvas's own dot-grid background instead of between the grid and the steps. One-line CSS fix (isolation: isolate on the canvas) puts the lanes back where they belong.

FixProcess Mapper

Steps in Lanes Followed Reorder Properly

Steps visually sat inside a lane but with no lane_id tagged (common for steps that pre-dated their lanes) used to get left behind when the lane was reordered — the lane band would shift and the step would stay stranded at its old position. Auto-tag pass at the start of every lane drag now stamps every step's lane_id based on its current visual position, so the upcoming reorder operates on a fully-tagged set.

FixProcess Mapper

Resizing a Lane Moves Everything Below the Divider

Same underlying class of bug as the reorder one above: the resize used to shift only those steps whose lane_id matched a below-lane, so any step with a missing or stale lane assignment got left at its old position while its lane band shifted underneath it. Shift criterion swapped from lane_id matching to visual centre position vs the resized lane's bottom edge — anything visually below the divider now moves by the same delta the divider moved, regardless of tag state.

FixProcess Mapper

Lane Divider Drag Snaps to the Grid

Dragging a lane's bottom edge to resize used to let the divider follow the cursor pixel-by-pixel, but the steps below snap to the 20px grid — so each per-frame 1px delta got rounded back to zero by the snap and contents never actually moved while the divider drifted away. Divider now locks to the grid so it moves in 20px increments matching the step grid; deltas always clean multiples of 20, contents track the divider properly.

FixProcess Mapper

Groups Inside a Lane Move with the Lane

Original design said groups stay at their absolute position when their lane reorders or resizes (groups are deliberately free-form, with no stored lane_id), but in practice if you draw a group around a sub-flow inside a lane you expect it to follow the lane. Each lane operation now snapshots each group's offset within its containing lane (derived on the fly from the group's vertical centre) and reapplies it after the lane stack reflows — so groups now track lanes through reorder, resize, and delete.

FixProcess Mapper

Drags No Longer Snap Back Mid-Drag

Occasional bug where a step/group/lane drag would suddenly revert mid-drag and the detail panel slide closed. Pure timing collision: the autosave timer (2s after the last edit) could fire during a drag, causing the reload-after-save to destroy the in-progress element. Autosave now checks for any active drag state when the timer fires and reschedules itself if so — save only fires once the mouse is released.

FeatureSystem

Debug Tools Library

App-store-style catalogue of self-contained diagnostics at System → Debug Tools. When a user reports a problem you can't reproduce locally, you tell them "run D001 and paste me the output". Each diagnostic is a single PHP file that emits a plain-text section-delimited report covering everything that might matter (environment, config, files, DB connection, schema, write probe, live attempt). The landing page lists each one with an ID badge, category, "when to run" description, the full list of checks performed, runtime estimate, and side-effect notes — plus Run / Copy buttons. First diagnostic shipped: D001 — Demo Core Data Import, a 9-section report covering everything from PHP version to a transactional write probe to a live import attempt with captured PHP warnings. Designed so the diagnostic itself never crashes — every section wrapped in try/catch, expected-column lists carried inline so it works even when other parts of the system are missing or broken.

FixSystem

D001 No Longer Reports False Positives

The live-import section was reporting failures even on healthy installs. Two root causes: the error-handler severity map referenced E_STRICT (deprecated in PHP 8.4+, caused a recursive notice that dumped raw HTML into the captured response and broke JSON parsing), and the import script's relative require_once path didn't resolve correctly because the working directory was D001's folder rather than the import script's. Both fixed — D001 now reports a clean run on a working install.

ImprovementSystem

D001 Redacts More Sensitive Fields

So the report is safer to paste back to support on a real install. DB_USERNAME now reported as length-only (it's half a credential). The per-table sample-row redaction was extended to also blank username, email, full_name, display_name, and preferred_name — each replaced with [redacted N chars] so length-related issues (empty or absurdly long values) are still visible. Team / department / ticket-type names left visible since they're load-bearing for diagnosis and rarely contain personal PII.

ImprovementSystem

D001 Annotates Known-Benign PHP Notices Instead of Filtering Them

Previously the diagnostic silently suppressed three message patterns it considered noise, but PHP 8.4's actual session-already-active wording didn't match any filter and leaked through with no context. Replaced the silent filters with an explainer table that keeps the notice visible verbatim then appends an arrow-indented one-liner explaining why it's expected (e.g. "Expected — D001 already started a session, so PHP skipped the import's redundant session_start() call. Not a problem."). Unrecognised warnings are still surfaced normally — they're the ones that might actually matter.

ImprovementContracts

Suppliers Screen Adopts the Dashboard Layout

The Suppliers page used to be just a table; it now mirrors the Contracts dashboard with a 260px left sidebar + full-width table on the right. The sidebar leads with an Overview block (an All Suppliers total then the supplier base broken down by supplier type, each type split across the statuses it has suppliers in — e.g. Software vendor → Active 4, Pending 1), and the + Add Supplier button moves out of the table header into the sidebar as the primary amber CTA. So Contracts / Suppliers now read as one consistent app.

ImprovementContracts

Contacts Screen Adopts the Dashboard Layout

Same treatment as Suppliers, applied to the Contacts page. Sidebar overview leads with an All Contacts total then breaks the contact base down by supplier (each supplier a sub-heading, count split into Active / Inactive). Contacts without a supplier sort to the end under No supplier. The Add button moves out of the table into the sidebar. Contracts / Suppliers / Contacts now all read as one consistent app.

ImprovementContracts

Email Addresses on Contacts Table Are Clickable mailto Links

Styled in the module's amber palette (no underline at rest, underlines on hover) so analysts can launch a new email straight from the list without copy-pasting.

FeatureContracts

Supplier View Page

Dedicated read-only screen at contracts/suppliers/view/?id=X showing every field of a supplier laid out the same way as the edit modal (Legal Name + Trading Name full width at top, Reg/VAT and Type/Status paired, then Address / Questionnaire / Other sections) but rendered inline as label-above-value pairs instead of inside a modal. Each row in the suppliers list grows a new eye icon that opens this page; the supplier's legal name in the first column is also a clickable link. Keeps the same left sidebar overview as the list so navigation context never disappears. The edit modal is embedded too — a small pencil icon in the card header opens it in place, save closes it and refreshes both the view body and the sidebar overview so a status / type change is reflected instantly without leaving the page.

ImprovementContracts

Supplier Names on Contacts Table Link to the Supplier View Page

So analysts can jump from a contact straight to the supplier's full record. Picks up the existing amber link styling. Rows with no supplier still show a plain -.

ImprovementContracts

Contract View + Edit Pages Use the Full-Screen Sidebar Layout

Both pages drop the old narrow centered card in favour of the same flex layout as the dashboard — 260px left sidebar + main pane stretching to the rest of the viewport. The sidebar mirrors the dashboard exactly (Overview totals, Quick Links, amber CTA at the foot). The main pane scrolls inside itself so the sidebar stays anchored when scrolling a long contract or term-tabs detail.

ImprovementContracts

Edit / Add Contract Form Switched to Sentence Case

Page heading, browser tab title, multi-word labels (Contract number, Contract owner, Start/End date, Notice period, Notice date, Contract value, Payment schedule, Cost centre, DPIA completed date, DMS link), section headings, and the placeholder dropdowns all now follow sentence case. Acronyms (DMS, DPIA) and single-word labels kept as-is.

ImprovementContracts

Save / Cancel Buttons Sit in a Sticky Footer on the Edit Contract Page

So they're always within reach on long forms (which the contract form gets to be once Terms & data protection and the Contract terms detail tabs are populated). The .form-actions bar bleeds past the main pane's padding to span the full width of the viewport with a subtle top border and soft upward shadow visually separating it from the form. Submit still wires through correctly via HTML5's form attribute on the Save button.

FixContracts

Gap Below Sticky Footer on Edit Contract Page

Sticky footer was anchored above the main pane's 30px bottom padding, leaving an empty strip visible below the bar. Removed the offending padding and matching negative margin so the footer sits flush with the viewport edge.

FixContracts

Sticky Footer Padding Now Equal on All Sides

Was 14px 30px which left the Save/Cancel buttons feeling pressed against the bottom edge. Now 16px all round.

FixContracts

Save / Cancel Sit Higher in the Sticky Footer

Padding shifted from 16px all round to 10px 16px 22px 16px (less above, more below) so the buttons hug the upper third of the bar where the eye lands.

ImprovementContracts

Header Nav Buttons on the Contracts Portal Are All the Same Width

Contracts / Suppliers / Contacts / RFP Builder / Settings / Help now line up evenly instead of each sizing to its label. Scoped to the contracts header so other modules' header nav widths are unaffected.

FeatureProject

GitHub Wiki Populated

The project wiki goes from empty to fully populated — 26 markdown pages covering Home, Installation, Architecture, Security, Browser Extension, API Reference, plus a dedicated page per module (Watchtower, Tickets, Tasks, Assets, Knowledge, Change Management, Calendar, Morning Checks, Reporting, Software, Forms, Contracts, Service Status, Self-Service Portal, LMS, Process Mapper, CMDB, System), with _Sidebar.md for left-rail navigation and _Footer.md for the licence line. Sliced from the existing README and rewritten for the wiki context.

10 May 2026

Update - 10 May 2026

A whole new module ships this release — the CMDB (Configuration Management Database). Model your IT estate as a graph of typed objects with a strict containment hierarchy plus a separate user-defined relationships layer. AI-powered property suggestions when creating classes, an AI-generated synthesis paragraph at the top of every object detail page, an Impact panel showing what would break if any given object went down, an inline visual mini-graph, and full cross-module wiring with Tickets — link a ticket to its affected CMDB objects, see all tickets touching an object on its Activity panel. Plus a comprehensive help guide, rich seeded demo data with 39 objects, a few UX wins (in-place property editing from the object page, coloured dropdown options), two bug fixes, and one Tickets-side feature: a toggle to view the inbox folder pane grouped by analyst rather than department.

FeatureCMDB

Brand New CMDB Module

"Configuration Management Database" is a big phrase, but the idea is simple — record what makes up your IT estate (servers, databases, applications, the people who own them, the network devices it all sits on) and how they fit together, then ask useful questions like "what depends on this database?" or "which applications use Active Directory?". The new module is entirely user-defined: you create your own classes (Server, Database, Application, etc), give each class its own properties (text, number, date, Yes/No, dropdown with optional per-option colours, and references to other objects), and link objects with a strict parent/child hierarchy plus user-defined relationship verbs (depends on, connects to, managed by). Settings page has three tabs — Classes, Relationship Types, AI Integration. The data model is normalised throughout with immutable auto-increment IDs and editable labels, so you can rename anything without breaking stored values. New top-level entry in the waffle menu in its own pink/magenta brand colour.

FeatureCMDB

AI Suggest Properties

Once you've created a class — say Database — click the property-count badge to open the properties manager, then click ★ Suggest with AI. A two-stage wizard: Claude asks 3-5 short clarifying questions about your specific environment ("What kind — SQL Server, Postgres, MongoDB, Redis?", "Do you track schemas separately?"), then proposes 6-12 properties tailored to your stack with type, key, required flag and a one-line "why" rationale. Untick anything you don't want, click Add Selected, properties are bulk-created in one go. The system prompt is locked down to factual structured JSON only, with markdown-fence stripping for robustness. Reuses the saved CMDB Anthropic key from the AI Integration tab — separate from the keys for RFP AI / Knowledge AI / Reply Cleanup so each feature's spend is its own line on the Anthropic billing console.

FeatureCMDB

Object Management — Browse, Detail Page, Hierarchy & Relationships

Once classes have properties, you populate them. The browse page has a class sidebar with object counts and a table per class showing name, parent, child count, last updated. Click + New, give it a name (any required properties show as fields right there), and you land on the object detail page — one big inline-edit form. Click any value to edit in place; type-aware editors render text input / number / date picker / Yes-No select / dropdown with coloured pills / object-reference autocomplete; saves on Enter or blur, Escape cancels. Hierarchy section shows parent + children with cross-navigation. Relationships section has outgoing and incoming columns side by side with an Add Relationship modal that includes a verb dropdown with a live inverse-verb hint and a global object autocomplete. Cycle prevention on parent assignment refuses "the parent is a descendant" mistakes; cascade-delete confirms with the descendant count up front.

FeatureCMDB

AI Summary, Impact Panel & Inline Mini-Graph

The bit that turns the object detail page from a data form into something that tells you what the thing is at a glance. AI Summary card at the top of every object — click Generate to have Claude produce a 2-3 sentence prose synthesis covering class + hierarchy + owner + what depends on it + open ticket context. Cached on the row so reloads don't re-call the AI; click Regenerate after big changes. Impact panel shows what would break if this object went offline, in three buckets — Descendants (cascade-delete candidates from the hierarchy), Referenced by property (other objects whose object_ref properties point at this one), Things that link in (incoming relationships rendered with the inverse verb so they read naturally). Inline mini-graph — pure CSS visualisation showing parent above, this object centre as a pink gradient node, direct children below, and outgoing/incoming relationships in side columns. Click any node to navigate.

FeatureTickets / CMDB

Tickets ↔ CMDB Cross-Module Wiring

The moment the CMDB stops being a silo. Every ticket reading pane now has an Affected CMDB Objects section between the email thread and notes — pink-tinted info cards showing each linked object (name, class badge, parent context, X to unlink), with a + Link object button that opens an inline autocomplete searching every CMDB object. The CMDB object detail page reciprocally grows an Activity panel showing the tickets that touch it: open and recent closed buckets, each ticket card showing status pill in the lookup colour, priority, assignee, department, last updated. Click any card to deep-link straight back to the ticket. The AI summary prompt now also pulls open ticket counts and the most recent five subjects, so the synthesis can mention things like "currently has 2 open tickets including a P1 backup failure" — turning the CMDB into a live operational map rather than a static inventory.

FeatureCMDB

Comprehensive CMDB Help Guide

A new help page at cmdb/help.php with sticky left-pane scroll-spy navigation and twelve sections: Overview, Core Concepts (the five things), Classes & Properties, AI Suggest Properties, Adding Objects, Hierarchy, Relationships, Property vs Parent vs Relationship (a three-card decision guide for the question every CMDB user asks themselves), AI Summary / Impact / Map, Linking Tickets, Settings tour, and Tips & Conventions. Three sections are flagged as "Critical reading" with a red ★ in the nav and a legend at the bottom of the sidebar. Hero gradient and accents use the module's pink/magenta brand throughout.

FeatureCMDB

Rich CMDB Demo Data

Adds CMDB to the System → Demo Data importer with a realistic small IT estate so a fresh install can show the synthesis features against real data immediately. Eight classes (Server, Database, Application, Service, Person, Team, Network Device, Endpoint), ~50 property definitions with colour-coded Criticality / Environment / Tier dropdowns, 39 objects (8 people, 4 teams, 5 servers including SQLSVR01 with two child databases parented hierarchically, 4 databases, 6 apps spanning internal / SaaS / on-prem vendor, 6 services across Tier 0–2, 3 network devices, 3 endpoints), ~150 property values with object-reference values like Owner → Person, and ~30 relationships across six verbs. Active Directory ends up with five incoming "uses identity from" links so its Impact panel reads richly straight after import; SolarWinds monitors all five servers; SQL servers connect to CORE-SW01 → CORE-RTR01 → FW01.

FeatureTickets

By Department / By Analyst Toggle on the Inbox

A new segmented control under the Folders header lets each analyst flip between grouping the inbox tree by department + status (the existing default) or by assigned analyst + status — handy for SDM-style "who's drowning, who's free, whose queue is stale" triage. The choice is persisted per-analyst via a new generic user_preferences table built so other modules can reuse it for future per-user settings with no schema change. Drag-and-drop extends to the analyst view: drop a ticket on an analyst folder to assign that analyst (sets both assigned_analyst_id and owner_id so the right-pane Owner field stays in sync), drop on an analyst + status subfolder to update both at once, drop on Unassigned to clear the analyst. Unassigned is contextual — in Department view it lists tickets with no department, in Analyst view it lists tickets with no assignee.

ImprovementCMDB

AI Suggest Auto-Creates Missing Target Classes

When the AI proposes an Object Reference property like Owner → Person and you don't yet have a Person class, the bulk-add flow now auto-creates the missing class on the fly with the AI's hinted name, then wires the new property's foreign key to it — replacing the previous "skipped — add manually" behaviour that left people confused about where some suggestions had gone. Subsequent suggestions in the same batch reuse the just-created class. The Result panel surfaces three sections: green "Properties added", purple "Classes auto-created" (with a hint to run AI Suggest on each new empty class to flesh it out), and a red "Failed" list for genuine errors.

ImprovementCMDB

Edit Property Definitions from the Object Page

A small ⚙ cog appears next to each property's type tag on the object detail page. Click it — a floating draggable modal opens with that property's full definition (label, immutable key, type, target class for object_ref, dropdown options, required flag) so you can tweak the schema without bouncing back to Settings. The modal floats over the page (no full-screen backdrop) so the analyst can keep referring to the data while editing the schema; the pink gradient header is a drag handle so you can drop the modal anywhere on screen, with viewport clamping so it can't escape. Re-centred on each open so it doesn't drift across reopens. Drag implementation matches the existing tickets-search-modal pattern.

ImprovementCMDB

Dropdown Options Editor with Per-Option Colours

Replaces the freeform "one option per line" textarea with a proper row-based editor. Each option is its own row with a value text input, an optional colour swatch (click to set, × to clear back to plain text), ↑↓ buttons to reorder, and a 🗑 to delete; + Add option appends a new row. Implemented as a shared component used from BOTH the Settings page property modal AND the floating edit-property modal on the object detail page so they stay in sync. The colour drives a tinted pill on the object detail page when set — so a Criticality of Critical shows red, Low green, etc — using the same alpha-tinted-bg pattern as ticket status badges. No colour set → plain text fallback. Storage was always normalised (each option a row in its own table); this just brings the editing UX up to match.

FixCMDB

Inline-Edit No Longer Fails on an Unrelated Required Field

The save_object.php required-property validation was checking the request payload only — so editing e.g. Email Address on a Person sent only that one property in the payload, and the validator wrongly concluded Employee Type was missing (even though it was already saved on the row). Validation now skips required-property checks for fields the caller isn't explicitly touching: required is enforced on create (initial values must be non-empty) and on update only when the caller explicitly sets a required property to empty. The common inline-edit-one-field case leaves untouched fields alone, matching how partial updates should work.

FixCMDB

+ New Modal Now Collects Required Properties

Previously the New Object modal only had a name field, so any class with required properties (e.g. a Person class with a required Employee Type) couldn't be created at all — the server would reject the create with "Required property missing". The modal now fetches the class's properties when it opens, filters to required ones, and renders them as type-aware editors below the name input: text / number / date / Yes-No select / dropdown using the colour-aware options / object-ref autocomplete scoped to the property's target class. Most classes have no required properties so the modal stays as just a name input — only classes that genuinely need data up front get the extra fields.

09 May 2026

Update - 9 May 2026

A big release for the Tickets module. Two new headline features — AI Reply Cleanup, which turns a one-liner draft into a properly formatted email without inventing details, and drag-and-drop triage, which lets you move a ticket between departments and statuses by dragging it onto a folder. Underneath that, a sweep of normalisation work pulls hardcoded enums out of the codebase and into proper lookup tables — meaning a sysadmin can now add a new ticket status, change priority, task status or service-impact level from settings and see it reflected everywhere with no code change. Plus demo data for Tasks and Process Mapper, a Process Mapper help guide, and a few homepage fixes. Read the AI Reply Cleanup deep dive.

FeatureTickets

AI Reply Cleanup

A new ★ Cleanup button in the ticket reply window. Type a rough draft — even just two or three words like "cost is £250 - ok?" or "fixed" — click Cleanup, and Claude streams back a properly formatted email: "Dear [requester],", paragraph breaks, grammar fixes, the configured tone, "Kind regards,". The system prompt is locked down with explicit do-and-don't rules and several positive and negative examples so the AI cannot invent technical details, fabricate apologies, or pad a short draft into multiple paragraphs. It pulls the requester's first name, ticket subject, and original problem from the ticket so very-short drafts can reference the right context (and so a hardware-delivery ticket gets "please confirm it's set up correctly" rather than the absurd "please re-test the mouse"). New Tickets → Settings → Reply Cleanup tab houses an Anthropic API key (separate from the other AI features so its spend shows up as its own line on your Anthropic bill), model picker, tone dropdown, a Test connection button, a Custom Instructions textarea for organisation-specific tweaks, and a read-only view of the full system prompt for transparency. Streams live into the rich-text editor via Server-Sent Events, with an Undo link that appears for 30 seconds after streaming completes in case the rewrite isn't right. Read the deep dive.

FeatureTickets

Drag-and-drop Ticket Triage

Drag any ticket from the email list onto a folder in the left pane to update it. Drop on a department folder to reassign it (status untouched), drop on a department → status subfolder to update both in one go, or drop on Unassigned to clear the department. The four status subfolders are now always rendered when a department is expanded (zero-count statuses appear with a dimmed badge) so any status is reachable as a drop target. Hovering a collapsed department for ~600ms during a drag auto-expands it — Outlook-style spring-loaded folders — and the expand/collapse is now smoothly animated. Audit history is written for whichever fields actually changed, and the reading pane refreshes if you happened to drag the ticket that's currently open in it.

FeatureTickets

Customisable Ticket Statuses & Priorities

Two new tabs in Tickets → Settings for managing ticket statuses (Open, In Progress, On Hold, Awaiting Response, Closed) and priorities (Low, Normal, High, Critical, Urgent) without touching the database. Each tab follows the existing settings pattern — an Add button, a table with name / colour swatch / flags / order / active, and an inline edit modal. Statuses get an "Is closed" flag that drives badge colours, watchtower counters and the closed-datetime stamp via the flag rather than a literal name match. Priorities get a colour and a default flag. Delete refuses with a friendly count-of-tickets message rather than letting an FK constraint surface a raw SQL error. Adding a new status or priority here flows automatically into the inbox folder pane, the reading-pane dropdowns, the dashboard widget filter, the self-service portal, the user-tickets page and the analyst-side dashboard charts — no JS edit required anywhere.

FeatureTasks

Tasks Module in the Demo Data Importer

The System → Demo Data importer now seeds the Tasks module too. Twelve parent tasks across To Do / In Progress / Done with realistic IT-ops content (UPS battery swap, SSL renewal, file-share migration, Citrix decom, new starter onboarding, etc.), 21 nested subtasks, mixed analyst/team assignments, due dates, and 8 task comments — about 42 records total. The demo-data page picks up a Tasks card and includes it in the post-core enable list so a fresh install can show the kanban looking lived-in within seconds.

FeatureProcess Mapper

Process Mapper Demo Data — with Auto-Layout

Six realistic ITSM flowcharts seed via the importer: incident triage, new starter onboarding, standard change approval, major incident response, asset disposal, and self-service password reset. About 57 steps and 58 connectors covering all four step types (process, decision, start-terminal, document) and including a back-edge loop in the major-incident flow. The clever bit: the seed JSON omits x/y coordinates entirely. A new server-side autoLayoutProcessMapper() pass builds a per-process forward DAG (back-edges in JSON authoring order are dropped from ranking), assigns each step a column via longest-path relaxation, and stacks steps within a column centred around a baseline — yielding a clean left-to-right diagram that looks like what a user would have drawn by hand. So the seed JSON only needs _ref, process_id, type and label per step. Width and height come from the step type defaults too.

FeatureProcess Mapper

Process Mapper Help Guide

A new help page at process-mapper/help.php, fixing a dead link in the module header that pointed at a missing page. Styled to match the other module help guides — left-pane navigation and seven scroll-spy sections covering Overview (with feature cards and a four-step flow diagram), Creating a process, Step types (mini SVG previews of each), Drawing connectors (edge-handle drag and Connect-tool modes), Arranging & editing (drag, multi-select, Ctrl+A, arrow-key nudge, detail panel, delete), Saving & loading, and Quick tips. Hero gradient and accents use the module's existing indigo brand. Keyboard shortcuts are rendered as styled kbd chips throughout.

ImprovementMultiple Modules

Lookup-table Normalisation Across Five Modules

A pattern repeated through the codebase: a status / priority / type / impact column stored as a free-text VARCHAR with a hardcoded enum of valid values baked into the PHP — so adding a new status meant a code change. This release migrates five of those columns into proper lookup tables with the same shape (id, name, colour, is_default, is_active, display_order, plus the relevant flag like is_closed or severity_order). Tickets — status & priority normalised, plus the staff rota's location column. Change Management — status, type, priority and impact, with a change_statuses.is_closed flag that replaces literal-matching 'Completed'. Tasks — status & priority. Service Status — incident status (with is_resolved) and impact level (with a severity_order column that replaces a hardcoded ORDER BY CASE WHEN impact_level = 'Major Outage' THEN 1... block in three different files). db_verify.php migrates each one in place — creates the lookup, seeds defaults, backfills ids from the legacy text, adds the FKs and indexes, and only drops the legacy column once 100% of rows have migrated. Across all five lookups, a total of about 30 new endpoints follow the same hex-validated, only-one-default, refuse-delete-if-in-use pattern, and admin settings tabs gain a shared edit modal that conditionally shows the right flags per lookup type.

ImprovementTickets

Inbox Icon Buttons

The + New, Search and Refresh text buttons above the inbox email list are now compact 32×32 icon-only buttons with hover tooltips for accessibility. The New icon keeps a subtle green accent so it still reads as the create-action; Search and Refresh are neutral grey with a blue hover. Same Outlook feel, less header clutter.

ImprovementMultiple Modules

Ticket Statuses Now Drive Every Surface

Once the lookup table existed, the rest of the codebase still had several places that hardcoded ['Open', 'In Progress', 'On Hold', 'Closed'] — meaning the seeded Awaiting Response status existed in the database but was invisible in the UI. This release sweeps those out: the inbox folder pane, the reading-pane Status dropdown, the analyst dashboard widget filter, the self-service portal summary cards, the self-service ticket-detail badge, and the Users-page tickets list all now read active statuses from the lookup at runtime. The self-service portal also drops its hardcoded .status-open / .status-in-progress CSS classes in favour of inline styles derived from each lookup row's colour field — so any new status you add in settings styles itself correctly with no per-status CSS edit.

ImprovementHomepage

Homepage Restored Watchtower & Tasks Cards, Tighter Grid

Watchtower and Tasks were both already in the waffle menu and module-colours map but had been left out of the post-login homepage grid — so analysts could only reach them via the cross-module waffle menu. Both now appear as proper tiles (slate-blue Watchtower, purple Tasks) and respect the per-analyst allowed_modules permission. While there, the homepage grid was tightened to fit all 17 modules across three rows instead of four — smaller card padding and icon size, tighter gap, and 7 columns instead of 5. Same content, less scrolling.

FixTickets

Status Badge Colours on the Users Page

The Users-page ticket list was building its status badge class with status-${status.toLowerCase()} and matching against five hardcoded CSS rules — three of which referenced status names that aren't in the lookup at all (new, pending, resolved), and any seeded status containing a space (In Progress, On Hold, Awaiting Response) generated an invalid two-token class so the badge rendered uncoloured. Fixed by reading the colour from the lookup and applying it inline, same pattern as the self-service portal. The five dead CSS rules are removed.

04 May 2026

Update - 4 May 2026

Cross-module synergies, a new headline AI feature, and a click-through Intune dashboard. Contracts can now spawn related tasks and calendar events in one click; amber and red morning checks can become tickets in one click; the form builder learns to build itself from a one-paragraph description; and the new Intune dashboard turns "how many noncompliant?" and "which ones?" into the same gesture. Read the Intune reporting deep dive, the AI form builder deep dive, and the connected-modules deep dive for the longer take.

FeatureContracts

Tasks & Calendar Events from a Contract

Two new buttons in the contract view header — Task and Calendar — open lightweight modals pre-filled from the contract you're looking at. The title becomes the contract number and name, the due date defaults to the notice date or end date, and the assignee defaults to the contract owner. Created items link back via a new contract_id column on tasks and calendar_events, so the contract page now also shows Related Tasks and Related Calendar Events panels listing everything tied to that contract. Bidirectional links, no copy-pasting, the work moves with you.

FeatureMorning Checks

Raise a Ticket from an Amber or Red Check

A new + Raise ticket button appears next to the Status buttons on every amber and red check row. Click it to open a modal pre-filled with the check name, date, status and notes. Pick priority (defaulting to High for Red, Normal for Amber), assignee (defaulting to you), department and ticket type, and a new ticket is created with you as the requester. Works on today's check or after-the-fact on any historical row when navigating back through the date picker — no more "I noticed something failed two days ago and forgot to log it".

FeatureForms

AI Assist on the Form Builder

A new AI Assist button on the form builder. Type a one-paragraph description — "a holiday request form with name, dates, leave type and notes" — and a streaming Claude call generates a complete form definition: title, description, fields with the right types, sensible labels, required flags, and dropdown options. Streamed live to a monospace pane (claude.ai-style) with running counters for fields detected and tokens in/out/cached. The model output is constrained to the four field types the form builder actually supports and validated server-side, so it can't return anything that breaks the editor. Reuses the Anthropic API key already configured for the RFP Builder. Build a working draft in about four seconds, then tweak and save.

FeatureReporting

Intune Dashboard

A new Intune dashboard at /reporting/intune/. Five KPI cards across the top — total devices, compliant percentage, encrypted percentage, devices stale for 30+ days, and devices enrolled in the last 30 days — with green/amber/red tone thresholds so security gaps are visible at a glance. Below the strip, an eight-widget Chart.js grid: compliance breakdown, OS distribution, owner type (corporate vs personal), top ten manufacturers, top ten OS+version combinations, last-sync window distribution, 90-day enrolment trend, and an encryption-by-OS stacked bar. One backend call returns every aggregation in a single payload. Reporting landing page gains an Intune card and the reporting header gains an Intune nav button.

FeatureReporting

Click-through Drill-down on the Intune Dashboard

Every chart and four of the five KPI cards on the Intune dashboard are clickable. Click any compliance slice, OS bar, owner doughnut wedge, manufacturer bar, OS version bar, last-sync bucket, enrolment-trend day, or encryption-by-OS stacked segment — a slide-in modal opens listing the matching devices (name, user, OS, compliance pill, encrypted Y/N, last sync). Paginated 25 rows per page with Prev/Next, plus a single-click Export CSV button on the modal footer that downloads every matching row with a UTF-8 BOM for clean Excel rendering. SQL is parameterised and the filter enum is whitelisted server-side, so the chart-click URLs can't be poked into something they shouldn't query. Read the deep dive.

FixContracts

Expired Contracts Now Actually Show as "Expired"

A long-expired contract was still showing "Expiring Soon" because the manually-set status label took precedence over the actual expiry date in the badge logic. The date check now runs first — anything past its end date shows as Expired regardless of what label was saved on it. The manual status is only honoured for contracts that are still in date.

FixContracts

Task & Calendar Modals Showing Only a Grey Backdrop

The new contract-page modals were colliding with a global .modal rule in the shared inbox stylesheet that turns any matching element into an invisible full-screen layer. Result: backdrop appeared, modal didn't. Renamed the contract-page modal classes to a private .cv-modal* namespace so they no longer pick up the inbox styles.

FixForms

AI Assist Button Wasn't Visible

The AI Assist button from the same release was originally added to forms/builder.php — an orphan file that doesn't render the live form-building UI. Moved the entire feature into forms/index.php, which is the actual editor view, so the button now appears in the toolbar between Cancel and Save. After a successful generation the editor switches to the Preview tab so the result is visible immediately.

03 May 2026

Update - 3 May 2026

A big one: the RFP Builder — an AI-powered procurement requirements builder that turns five messy departmental feedback documents into a coherent, deduplicated, conflict-aware RFP, then helps you score the suppliers who reply and pick a winner. Lives inside the Contracts module.

FeatureRFP Builder

RFP Builder Database Schema

Thirteen new tables underpin the whole RFP Builder: RFPs, departments, categories, source documents, raw extracted requirements, consolidated/deduplicated requirements with source attribution, conflict tracking, generated output sections with version history, invited suppliers, multi-analyst scoring, and an AI processing log. Every table FKs back to the parent RFP so deletions cascade cleanly.

FeatureRFP Builder

RFP List & Per-RFP Overview

A new RFP Builder area inside the Contracts module with a list of every RFP (filterable by status), create/edit/delete actions, and a per-RFP overview page that doubles as a workflow dashboard — six phase tiles (docs → extracted → consolidated → generating → scoring → closed) light up amber as each phase becomes available, telling you exactly what to do next.

FeatureRFP Builder

RFP Departments Lookup

A new RFP Departments tab on the Contracts settings page maintains the master list of internal departments that contribute requirements documents (IT, Finance, HR, Risk, etc.). Each department has a name, colour swatch, sort order, and active toggle — the colours flow through the rest of the RFP Builder for visual continuity.

FeatureRFP Builder

Source Documents (DOCX Upload)

Upload .docx files from each contributing department, tagged with the department it came from. A dependency-free DOCX text extractor pulls the body content, and the Documents page lets you preview the raw text, re-extract, or delete. Files stored under a per-module uploads folder with an .htaccess blocking direct web access.

FeatureRFP Builder

RFP AI Settings Tab

A new RFP AI tab on the Contracts settings page where you pick your AI provider (Anthropic Claude or OpenAI), enter an API key (encrypted at rest, masked in API responses), and pick a model. A Test button runs a tiny round-trip request and reports latency and token usage so you know things are wired up before kicking off a real run.

ImprovementRFP Builder

Verify SSL Toggle on RFP AI Settings

A Verify SSL toggle on the RFP AI settings tab, with a red warning banner explaining the man-in-the-middle risk in plain English when verification is disabled. Both Save and Test honour the toggle — useful when testing through inspecting proxies, dangerous in production.

FeatureRFP Builder

Pass 1: AI Requirement Extraction

Per-document Extract requirements button calls Claude or GPT with the document text and gets back a structured JSON list of every requirement, pain point, and challenge — each tagged with type, source quote, and an AI confidence score. A new shared AI helper handles provider routing, retries on 429/5xx, and audit logging. Every run shows up in the AI activity panel.

FeatureRFP Builder

Extracted Requirements Browser

A cross-document table showing every extracted requirement for an RFP with department + type filters, type-coloured stat cards, AI confidence badges, an edit modal for cleaning up the AI output, and inline source quotes so the original phrasing stays one glance away. The Extracted phase tile on the overview links straight here once any requirements exist.

FeatureRFP Builder

AI Activity Panel

Every AI call gets logged to a processing-log table; the RFP overview page now surfaces the last 25 entries plus running totals (runs, errors, input/output tokens, cached input). Each row shows action, target, status pill, tokens, and call duration. The cached-input column is the cheapest token bill you'll ever see — see the prompt-caching update below for how that works.

FixRFP Builder

Anthropic Prompt Caching

The system prompt on every Anthropic call is now sent as a structured text block with a cache_control: ephemeral breakpoint. Subsequent calls within ~5 minutes reuse the cached prompt at ~10% of the normal input-token cost. For a 14-section generation pass, that's roughly a 5× cost reduction. Visible as non-zero cached-input numbers on the AI activity panel.

FeatureRFP Builder

Pass 2: AI Consolidation, Categorisation & Conflict Detection

The differentiating step. One big AI call takes every extracted requirement across every department and produces three things in one shot: 8–20 RFP categories tailored to the actual content, deduplicated consolidated requirements with priority and full source attribution, and a list of pairs flagged as genuine contradictions between departments. Wipe-and-replace transactional save with hallucination guards on source IDs and category indices.

ImprovementRFP Builder

Live SSE Streaming for AI Calls

Long AI calls now stream their response to the browser via Server-Sent Events — the AI's output appears live, claude.ai-style, instead of leaving the user staring at a spinner for two minutes. The 120-second cURL timeout that previously killed Pass 2 mid-call is gone — streaming keeps the connection alive continuously. DB writes still happen transactionally after the stream completes.

ImprovementRFP Builder

Live Progress Tracker

The streaming modal now has three pulsing task rows (Categorising / Consolidating requirements / Detecting conflicts) that update in real time as the AI generates output, by client-side scanning of the streamed JSON for unique key markers. Pulsing amber for the in-flight phase, green tick on completion, with a running count next to each (e.g. “14 categories”, “47 reqs”, “2 conflicts”).

FixRFP Builder

Page Scrolling on RFP Builder Screens

The shared inbox.css locks the body to height:100vh; overflow:hidden for the inbox split-pane layout. RFP Builder full-page screens needed a body { overflow: auto; height: auto } override — without it, content below the fold (notably 14 categories of requirements on the consolidate page) was unreachable.

FeatureRFP Builder

Editing Tools for Consolidated Requirements

Five operations covering every way the AI's output might need a nudge: Edit a row's text/type/priority/category/rationale, Delete, Split an over-merged row back into N (per-source picker assigns each source to one of the new rows), Merge 2+ rows by ticking checkboxes (source links union), and Add custom for requirements the AI missed entirely. All transactional with hallucination guards.

FeatureRFP Builder

Conflict Resolution

Each open conflict on the consolidate page now has four action buttons: Choose A, Choose B, Merge into one, and Dismiss. Each opens a small notes modal and stamps the conflict row with the resolution, the analyst, and the timestamp. Resolved conflicts move to a dimmed Resolved subsection with coloured resolution badges; Re-open reverts.

FeatureRFP Builder

Lock for Generation

A Lock for generation button on the consolidate page header flips is_locked = 1 on every consolidated requirement and transitions the RFP status to generating — signalling the consolidated set is signed off and ready for Phase 4. While locked, every editing affordance disappears behind a green banner; click Unlock to revert.

FeatureRFP Builder

Pass 3: AI Section Generation

One streamed AI call per category produces an HTML section ready for the eventual RFP document. A new document page lists every category with its generated content (or a “not yet generated” placeholder), per-category Generate / Re-generate buttons, and a Generate all header button that fires N sequential SSE calls with a checklist progress modal — each row pulses amber while active, turns green on success, grey on hash-skip, red on error.

ImprovementRFP Builder

Stable Modal Height During Streaming

The streaming progress modals were sized with max-height: 86vh and no explicit height, so they grew with their content and snapped back when the streaming preview cleared between sections. Lock the height to 86vh up front; the inner streaming pane scrolls within it.

FeatureRFP Builder

Document Framing (Intro / Scope / Response Instructions)

A real RFP doesn't open with “Identity and access management requirements:” — it opens with an introduction, scope statement, and response instructions for suppliers. Three new framing sections sit above the per-category body, AI-drafted from the analyst's optional procurement context note plus the category list. Each is editable independently, version-tracked, and appears in the document preview ahead of the category sections.

FeatureRFP Builder

Document Preview

A clean single-page rendered view of the whole RFP — cover with title and date, contents list (TOC) linking to every section, framing sections, then category sections in order. Print-ready CSS with sensible page-break rules; Ctrl+P / Cmd+P opens the browser print dialog for save-as-PDF. That's the artifact you share with suppliers.

FeatureRFP Builder

WYSIWYG Editing & Version History

Both framing and category sections are editable via a TinyMCE modal — bold/italic, h3/h4 headings, lists, links, tables, undo/redo. Editing a category section snapshots the prior content into history before overwriting. A new History button opens a version-history modal showing every prior version, each expandable to preview inline, with a Restore button that brings any version back as the new current.

FeatureRFP Builder

Pass 4: Restyle

A Restyle button on every section re-runs the AI over the existing HTML to apply the style guide WITHOUT changing the substance. Useful when the style guide changes after generation, when a section has been heavily edited, or just for a polish pass. Streams via the same batch modal as generation, with a purple “Restyle —” tag distinguishing it from a Generate.

FeatureRFP Builder

Suppliers Page

List of suppliers being evaluated for an RFP with their demo dates and notes (autosave on edit). + Add supplier opens a two-tab modal: pick from existing FreeITSM suppliers, or create a new prospective supplier inline (creates a row in the suppliers table tagged Prospective). Removing a supplier wipes any scores against them on this RFP.

FeatureRFP Builder

Supplier Scoring

Score one supplier at a time against every consolidated requirement. The 0–5 scale runs from “Does not meet” through “Excellent”, with a per-row notes textarea for evidence. Sidebar lists every supplier on the RFP for one-click switching. Sticky bottom bar shows my running overall, scored count, and the team aggregate. Per-category averages live-update as you score. Multi-analyst rollup is single-blind — you see colleagues' counts and averages, never their individual scores or names.

ImprovementRFP Builder

Rename “Invite” to “Add”

The supplier list page used “Invite” language inherited from the original design plan, which was misleading: the system never actually sends invitations to suppliers (suppliers don't log in — the PDF is shared out-of-band). Renamed throughout to “+ Add supplier” / “Add” / “Suppliers” for a more honest read.

ImprovementRFP Builder

Scoring Page UX Redesign

Six click-to-light score boxes (0–5) per requirement with a red→green colour gradient (red 0, orange 1, yellow 2, lime 3, green 4, deep green 5); click again to clear. Notes textarea spans the full row width and is twice the height. Left sidebar gains a live Score by category panel. New Spider button on the bottom bar opens a full-screen radar chart showing per-category averages, with my scores in amber and other analysts' aggregate as a dashed purple overlay if any.

FeatureRFP Builder

Cross-Supplier Compare Page

The decision-making view: big-number cards for each supplier ranked by overall score (gold/silver/bronze ribbons for top three), a multi-supplier radar chart overlaying every scored supplier on one set of category spokes (each in their own colour), and a category winners table marking the leader per category with the gap to second place. Ties marked explicitly.

FeatureRFP Builder

Coverage Heatmap

Matrix of categories × contributing departments showing how many consolidated requirements live in each intersection. Row-relative amber heat shading so each category compares against itself; stats strip across the top calls out single-source categories (potential bias risk) and multi-dept consensus categories (strong signal). One requirement counts in every department it has a source from.

FeatureRFP Builder

System-Default Style Guide

A new Default style guide textarea on the Contracts → Settings → RFP AI tab. Used as the fallback for any RFP without its own per-RFP override, applied at every AI generation step that produces document text (Pass 3 generation, Pass 4 restyle, framing). Three-tier resolution: per-RFP override → system default → hardcoded fallback.

FeatureRFP Builder

Full AI Audit Trail

Companion to the AI activity panel on the RFP overview, the new audit page surfaces every AI call ever made for an RFP — up to 2000 entries — with stats strip (runs, successful, errors, total tokens, cached input) and a filter card (by action, status, target text). Click rows to inspect the JSON details payload, errors, and per-call durations.

FeatureRFP Builder

In-App User Guide

A sticky-sidebar help page covering the six-phase workflow: overview, cost expectations table per AI pass, one card per phase explaining what to do, key concepts (lock gate, multi-analyst scoring, prompt caching, audit trail), and a FAQ. Linked from the RFP Builder list page sidebar and every per-RFP overview header. Written for the actual implementation, not lifted from elsewhere.

02 May 2026

Update - 2 May 2026

FeatureAssets

Microsoft Intune Device Sync

Pull device inventory directly from Microsoft Intune via the Microsoft Graph API. A detached background worker streams progress to a live progress bar and matches Intune devices to existing assets by hostname. Unknown devices are auto-created as stub assets so nothing is missed. The asset detail panel gains an Intune tab showing the Graph payload — useful for agent-less estates or as a complement to the PowerShell inventory agent.

FeatureAssets

Intune Software Inventory Sync

Pull installed-software lists for Intune-managed devices via Graph’s $expand=detectedApps, batched into manual jobs of configurable size (default 30) to stay safely inside Graph’s throttling limits. A new source column on software_inventory_detail keeps PowerShell-agent and Intune rows separate — the agent always wins where both report on the same device. The Intune settings tab gains a Sync software button and a recent-jobs list.

FeatureAssets

Intune Settings Tab

A dedicated Intune tab in Asset settings holds your tenant ID, client ID, client secret (encrypted at rest), and a Verify SSL toggle. Configure once and the rest of the Intune integration picks up the credentials automatically.

FeatureAssets

Intune Sync Tables

New intune_devices and intune_sync_jobs tables underpin the Intune integration — tracking each pulled device record and the history of every sync job, including duration, item counts, and any errors.

ImprovementAssets

Storage Figures for Intune-Only Assets

Intune sync now populates the Storage section on the asset page for devices without a PowerShell agent — using the device-level total and free figures from Intune (drive letter inferred from the OS). A new source column on asset_disks separates agent-owned and Intune-owned rows, so agent data always takes precedence when both exist.

ImprovementAssets

Inventory Freshness Chart

The Intune settings tab now shows a Chart.js bar chart of how fresh your software inventory is — how many Intune-eligible assets were synced less than a day ago, 1–6 days ago, 7+ days ago, or never. Refreshes automatically after each sync job so you can watch your coverage improve in real time.

ImprovementAssets

Verify SSL Warning Banner

Disabling Verify SSL on the Intune integration now shows a red warning banner explaining the man-in-the-middle risk in plain English — so the trade-off is obvious before you save.

ImprovementSystem

Mask Sensitive Settings in API Responses

Sensitive values in system_settings (vCenter password, Intune client secret, Knowledge AI/OpenAI keys) are now masked when read back via the get_system_settings API. Saves skip overwriting them when the field is left blank or unchanged, so you can edit other tabs without having to re-enter secrets each time.

ImprovementRepo

Gitignore Module Runtime Directories

Module-specific runtime upload directories (change-management/attachments/, lms/content/, tickets/attachments/) are now in .gitignore so tenant-specific files are never accidentally committed when contributing back upstream.

12 Apr 2026

Update - 12 April 2026

FeatureTasks

Tasks Module

New module for managing internal work that doesn't fit into a ticket or change request. Features a Kanban board with drag-and-drop card movement across To Do, In Progress, and Done columns, plus a sortable list view. Tasks support two-level subtask hierarchy — each subtask is a full task with its own status, priority, assignee, and due date. Link tasks to tickets or changes for traceability, assign to analysts and teams, and add comments. Overdue and due-today tasks surface automatically on the Watchtower dashboard and browser extension.

FeatureWatchtower

Browser Extension for Chrome & Edge

A Manifest V3 browser extension that polls the Watchtower dashboard and shows a badge count of items needing attention. Click the icon for a compact popup with all nine module summaries. Authenticates via API key (no session cookies), rate-limited to 60 requests per minute, with configurable polling interval from 1 to 30 minutes. Setup guide →

ImprovementSoftware

API Key Labels & Owner Binding

API keys can now have a human-readable label (e.g. “Chrome extension”) and are automatically bound to the analyst who created them. The key management table shows Label and Owner columns alongside the masked key, creation date, and status.

11 Apr 2026

Weekly Update - 11 April 2026

FeatureLMS

Learning Management System

New LMS module with full SCORM support (1.1, 1.2, and 2004). Upload SCORM ZIP packages which are automatically parsed for version and launch URL. Content runs in an embedded player with a dual JavaScript API bridge. Create learning groups, assign courses to groups with optional deadlines, and track progress per analyst with overdue highlighting.

FeatureLMS

Learner Data Viewer

Admins can view detailed learner data for any course session — summary cards showing status, score, attempts, and time spent, plus quiz responses with correct/incorrect badges, learning objectives, and the raw SCORM suspend data with syntax-highlighted JSON rendering.

FeatureProcess Mapper

Process Mapper

New module for building visual process flowcharts. Features a dot-grid canvas with snap-to-grid alignment, four shape types (process, decision, terminal, document), connector lines with optional text labels, Ctrl+click and rubber-band multi-select, arrow key nudge, and a slide-in detail panel for editing step properties.

FeatureTickets

Google Workspace Mailbox Support

Mailboxes can now be configured as either Microsoft 365 or Google Workspace. Google mailboxes authenticate via a separate OAuth callback and use the Gmail API for sending, reading, and managing emails. A provider dropdown in the mailbox settings controls which API is used. All existing Microsoft mailboxes continue to work unchanged.

FeatureSystem

Forgot Password

A “Forgot password?” link on the login page lets users request a password reset email. Uses the first configured mailbox to send a secure reset link with a 1-hour expiry token. The response is always the same whether the account exists or not to prevent user enumeration.

FeatureSystem

IP Brute Force Protection

Automatically bans IP addresses that repeatedly attempt logins against non-existent or locked accounts. First ban triggers after 5 failed attempts (configurable), with the threshold reducing by 1 after each ban down to a configurable minimum. Each ban lasts 24 hours. Returns HTTP 429 when banned. Settings configurable in System > Security.

10 Mar 2026

Weekly Update - 10 March 2026

FeatureSystem

Docker Support

FreeITSM now supports one-command deployment via Docker. A new Dockerfile, docker-compose.yml, and pre-configured database setup let you clone the repo and run docker compose up --build -d to get a fully working instance with Apache, PHP 8.4, and MySQL 8.0 — no manual configuration required. Works on both Linux and Windows.

ImprovementSystem

Auto-Generated Encryption Key

Docker containers now auto-generate a unique encryption key on first boot via an entrypoint script, stored in a persistent Docker volume. The encryption key path is also configurable via environment variable, so both Docker and manual installs can set the key location to suit their environment.

ImprovementSystem

PHP Version Check on Setup Page

The setup verification page now shows the current PHP version as a checklist item with a green pass or red fail based on the minimum 7.4 requirement, making it easier to spot version issues at a glance.

FixTickets

Ticket Folder List Fix

Fixed the ticket folder list not loading when the logged-in user has team assignments. The issue was caused by a MySQL-incompatible CAST AS INT in the department query, which has been replaced with a compatible alternative.

22 Feb 2026

Weekly Update - 22 February 2026

FeatureTickets

Ticket Dashboard

Per-analyst customisable dashboard for the Tickets module with a widget library, Chart.js charts (bar, pie, doughnut, line), status filtering on supported widgets, and drag-and-drop reordering. Each analyst sees their own layout and can add, remove, or rearrange widgets to suit their workflow.

FeatureTickets

Ticket Widget Library

Full-page widget library for managing ticket dashboard widgets with search, inline editing, duplicate, and delete. Create new chart widgets or customise existing ones from a central library, then add them to your personal dashboard.

FeatureTickets

Time-Series Widgets

Dashboard widgets that show tickets created or closed over time — per day for the current month or per month for the last 12 months. Gap-filled labels ensure every day or month appears on the chart axis even when there are no tickets, giving a true picture of volume trends.

FeatureTickets

Multi-Series Charts

Stacked bar and multi-line chart types with series breakdown by status or priority. Compare created vs closed tickets on a single chart, or see how ticket volumes split across statuses or priority levels over time. Each series is colour-coded for clear visual distinction.

FeatureTickets

Widget Filters & Date Ranges

Dashboard widgets now support configurable date ranges (last 7/30 days, this month, last 3/6/12 months, this year, or all time), department filtering with multi-select checkboxes, and day/month/year time grouping for time-series charts. Fine-tune each widget to show exactly the data slice you need.

FeatureTickets

Inline Widget Editing

A cog icon on each dashboard widget opens a modal to edit its properties — chart type, date range, department filter, time grouping, and more — without leaving the dashboard. The edit form is shared with the widget library so there is a single, consistent editing experience across both pages.

FeatureSystem

Dashboard Widgets Demo Data

Demo data import now includes 15 pre-built ticket dashboard widgets and per-analyst dashboard layouts for three analysts. Import to instantly populate dashboards with a variety of chart types, time-series views, and filtered widgets showcasing the full range of dashboard capabilities.

ImprovementTickets

Auto-Generated Widget Descriptions

The widget editor auto-generates a human-readable description as you change parameters — for example “Tickets by department (last 30 days)” or “Created vs closed per month”. Descriptions update live as you select different properties, date ranges, and filters, and can still be overridden with custom text.

FixTickets

Analyst Widget Column Fix

Fixed the “Tickets by analyst” and “Tickets by owner” dashboard widgets using the wrong column name, which caused them to return no data. The query now correctly references the analyst’s full name.

FixTickets

Owner Sets Analyst ID

Setting the ticket owner from the dropdown now also populates the assigned_analyst_id field, so the analyst appears correctly in dashboard widgets that group or filter by assigned analyst.

FeatureWatchtower

Watchtower Dashboard

A new unified attention dashboard showing actionable items across all modules in a single overview. Eight colour-coded cards cover Morning Checks, Tickets, Changes, Calendar, Service Status, Contracts, Knowledge, and Assets — each with green, amber, or red status dots so a service delivery manager can scan the entire landscape in 30 seconds. Auto-refreshes every 5 minutes.

FeatureWatchtower

Watchtower Help Page

Interactive help page for the Watchtower module with scroll-spy sidebar navigation covering dashboard layout, status dot meanings, module card details, and the auto-refresh system.

FeatureAll Modules

Module Help Pages

Added interactive help pages with scroll-spy sidebar navigation to nine modules: Tickets, Knowledge, Calendar, Morning Checks, Reporting, Software, Contracts, Forms, and Service Status. Each help page covers the module’s key features, workflows, and tips in a clean, scrollable layout with a sticky section menu.

FeatureSelf-Service

Self-Service Portal

A new self-service portal for end users with registration, login, and account claiming. Users can create accounts or claim existing passwordless records by matching their email address. The portal provides a separate, simplified interface distinct from the analyst view.

FeatureSelf-Service

Self-Service Dashboard

A personalised dashboard for self-service users showing ticket summary cards (open, in progress, on hold, closed), a list of recent tickets, and live system status pulled from the Service Status module.

FeatureSelf-Service

Self-Service Tickets

End users can create new tickets and view existing ones through the self-service portal. The ticket creation form captures subject, description, and department. The detail view shows the full ticket timeline including analyst responses.

FeatureSelf-Service

Mailbox Selection

Self-service ticket creation now includes a mailbox selection dropdown so replies are sent from the correct mailbox. This ensures responses reach users from the right team or department email address.

FeatureSelf-Service

File Attachments

Drag-and-drop file attachments on the self-service new ticket form. Users can drag files onto the form or click to browse, with visual feedback during the drag and a file list showing attached items before submission.

FeatureSelf-Service

Account Menu

An initials avatar circle with a dropdown menu on all self-service portal pages. The menu provides access to account management features including preferred name, password change, and multi-factor authentication settings.

FeatureSelf-Service

Self-Service MFA

Multi-factor authentication (TOTP) support for self-service users, reusing the existing MFA libraries from the analyst side. Users can set up an authenticator app from their account menu for an extra layer of security on their portal login.

FeatureSelf-Service

Preferred Name

Self-service users can set a preferred name so they are addressed how they like — for example “Ed” instead of “Ed Mozley”. The preferred name is used across the portal and in greetings.

FeatureSelf-Service

Change Password

Self-service users can change their password from the account dropdown menu. Requires entering the current password and confirming the new one, with strength validation.

FeatureSoftware

Software Dashboard

Customisable dashboard for the Software module with widgets showing version distribution, top installed applications, and publisher breakdowns. Click any chart segment to drill down into the underlying data. Edit widget properties via a cog icon without leaving the dashboard.

FeatureAssets

Device Manager

Device manager enumeration for each asset showing device category, name, driver information, and status. Populated automatically by the PowerShell inventory agent, giving a complete view of hardware components and their driver health per machine.

ImprovementSelf-Service

Shared MFA Endpoints

Deduplicated MFA API endpoints so the same code serves both analysts and self-service users. A shared auth context helper detects the caller type, eliminating duplicated logic and ensuring consistent MFA behaviour across both portals.

FixCalendar

Month Navigation Icons

Replaced broken SVG chevron icons on the calendar month navigation buttons with reliable text-based chevrons that render correctly across all browsers.

21 Feb 2026

Weekly Update - 21 February 2026

FeatureAssets

PowerShell Inventory Agent

A PowerShell agent collects detailed hardware, disk, network, GPU, TPM, BitLocker, and software inventory from Windows machines and syncs it to the asset database via a new system-info ingest API. Run it on-demand or as a scheduled task for automatic asset discovery and updates.

FeatureSoftware

System Components vs Applications

Software inventory now distinguishes between user-visible applications and hidden system components using the Windows registry SystemComponent flag. A tabbed view (Applications, Components, All) is available in both the software module and the asset detail page, so component noise no longer clutters the main application list.

FeatureAssets

Asset Dashboard

Per-analyst customisable dashboard for the Assets module with Chart.js charts (bar, pie, doughnut), status-filtered data widgets, and drag-and-drop reordering. Each analyst sees their own widget layout, and charts update in real time as asset data changes.

FeatureAssets

Widget Library

Full-page widget library for managing dashboard widgets with search, inline editing, duplicate, and delete. Create new chart widgets or customise existing ones without leaving the library page, then add them to your dashboard.

FeatureTickets

Mailbox Email Whitelist

Per-mailbox domain and email address whitelisting for the email import system. Add trusted domains and addresses to each mailbox — emails from non-whitelisted senders are automatically rejected. If no whitelist entries are configured, all senders are allowed, keeping existing mailboxes working as before.

FeatureTickets

Mailbox Activity Log

Searchable, paginated activity log recording every email imported or rejected during mailbox processing. View activity per-mailbox in a modal or open the full-screen view with a left-hand mailbox panel. Click any entry to see the raw processing log showing each step, API response codes, and error details.

ImprovementAssets

Extended Asset Fields

Widened hostname and service tag columns to support longer values, and added new asset fields for domain, logged-in user, last boot time, TPM version, BitLocker status, and GPU model. These fields are populated automatically by the PowerShell inventory agent.

ImprovementTickets

Email Action Choices

Configurable per-mailbox actions for processed emails. Choose what happens to rejected emails (delete permanently, move to Deleted Items, or mark as read) and imported emails (delete permanently or move to a specified folder). Folder names are resolved to Graph API folder IDs automatically, with a Verify button to check the folder exists before saving.

FixTickets

Move-to-Folder Fix

Fixed emails not being moved after import when configured to move to a folder. The Microsoft Graph API requires folder IDs or well-known names, not display names. A new resolver maps display names like “Deleted Items” to their API equivalents and looks up custom folder IDs automatically.

FeatureSystem

MySQL Database Migration

Migrated the entire database layer from SQL Server Express (PDO ODBC) to MySQL 8.0+ (PDO MySQL) across approximately 55 PHP files and 47 tables. FreeITSM now runs on MySQL or MariaDB, removing the dependency on Microsoft SQL Server and making it easier to deploy on Linux, Docker, or any WAMP/LAMP stack.

FeatureSystem

Per-Module Demo Data Import

New Demo Data page in System settings lets you import realistic sample data module by module. Eleven JSON datasets cover tickets, assets, knowledge, changes, calendar, morning checks, contracts, services, software, and forms. Import Core first for shared reference data, then choose which modules to populate. Each import can be re-run safely — existing demo data is cleaned before re-importing.

FeatureContracts

Configurable Contract Terms Tabs

Contracts now support configurable terms tabs with TinyMCE rich text editors. Administrators can create custom tabs for detailed terms such as special terms, KPIs, SLAs, and termination conditions, all saved alongside the contract.

FeatureSystem

Toast Notification System

Added a global toast notification system with configurable screen position. Choose from 9 positions via a visual grid picker in System preferences. Toasts are colour-coded by type with icons and slide-in animations for save confirmations, errors, and informational messages.

FeatureSystem

Security Settings

New Security page in System settings with three policies: trusted devices (skip OTP for a configurable number of days with per-user toggle), password expiry (force password changes after a set number of days), and account lockout (lock accounts after repeated failed login attempts).

FeatureService Status

Service Status Dashboard

New Service Status module with a configurable service catalogue, incident tracking with multi-service impact levels, and a worst-status board view. Define your services, log incidents against them, and see at a glance which services are affected and their current state.

FeatureSystem

Configurable Module Colours

Each module’s colour theme can now be customised in System settings. Per-module primary and secondary colour pickers with live preview let you personalise headers, icons, and the home screen. A reset button restores the defaults.

FeatureSoftware

Software Installed on Assets

When both Software and Assets demo data are imported, a bonus option appears to link software installations to computers. This populates the software inventory detail table with realistic installation records — showing which apps are installed on which devices with version numbers and install paths.

ImprovementSystem

MySQL ID Generation

Replaced all SQL Server OUTPUT INSERTED.id and SCOPE_IDENTITY() patterns with MySQL’s lastInsertId() across 18 API files for reliable auto-increment ID retrieval.

ImprovementSystem

SQL Syntax Conversion

Converted all SQL Server-specific syntax to MySQL equivalents: GETUTCDATE to UTC_TIMESTAMP, DATEADD/DATEDIFF to DATE_ADD/TIMESTAMPDIFF, CONVERT to DATE_FORMAT, TOP to LIMIT, and CAST NVARCHAR to standard VARCHAR.

ImprovementSystem

Database Schema for MySQL

Rewrote the database schema file and schema verification engine for MySQL with InnoDB storage engine and utf8mb4 character set, ensuring full Unicode support including emoji.

ImprovementSystem

Table Existence Checks

Replaced SQL Server OBJECT_ID table existence checks with standard information_schema queries that work across MySQL and MariaDB.

ImprovementSystem

Setup Page MySQL Check

Updated the setup verification page to check for the pdo_mysql PHP extension instead of pdo_odbc, matching the new MySQL database requirement.

ImprovementContracts

Wider Contract Pages

Widened the contract edit and view pages from 800px/900px to 1120px for better use of screen space, giving more room for terms and detailed fields.

ImprovementContracts

Unified Contract Save

Contract details and terms tabs are now saved together with a single Save button. New contracts automatically receive their ID before terms are saved, removing the need for a two-step save process.

ImprovementKnowledge

Ask AI Navigation

The Ask AI button now works from any page in the Knowledge module. When clicked from Settings or Review, it navigates to the main knowledge page first, then slides open the AI chat panel automatically.

ImprovementKnowledge

Article Links in AI Chat

Clicking an article link in the AI chat response now loads the article in the main panel while keeping the chat open, so you can read the full article without losing your conversation.

ImprovementSoftware

Expanded Software Demo Data

Software demo data expanded from 5 to 20 applications and 13 licences with a realistic mix of subscription, perpetual, expired, and bundled licence types. Includes detailed vendor contacts, renewal notes, and actionable reminders.

FixSystem

SQL Injection Prevention

Parameterized all remaining raw SQL updates involving token_data and integer interpolation across 6 files, closing potential SQL injection vectors.

FixKnowledge

Embedding Query Fix

Replaced SQL Server’s DATALENGTH() function with MySQL’s LENGTH() in AI chat, embedding stats, and article embedding queries, fixing errors when testing API key connections.

FeatureTickets

Email Templates

Automated email templates triggered by ticket events — new ticket from email, ticket assigned, and ticket closed. Subject and body support merge codes for ticket reference, requester name, analyst name, department, dates, and more. Configure templates in Ticket Settings with display order and active toggles.

FeatureTickets

Ask AI

An Ask AI button in the ticket detail view opens a slide-in chat panel that automatically sends the ticket’s subject and description to the knowledge base AI. Relevant articles are returned as clickable links that open in new tabs, helping analysts find solutions without leaving the ticket.

FeatureKnowledge

Article Versioning

Save as new version button on the article editor archives the current content and increments the version number. The version is displayed next to the created date (e.g. “v3”) and previous versions are stored in a history table. AI search always queries the latest version only.

FeatureSystem

Custom Alert Modals

A shared customAlert component replaces native browser alert and confirm dialogs with styled modals. Supports four types — info, warning, danger, and success — with OK-only or OK/Cancel modes. Promise-based API with smooth animations and keyboard support.

FeatureTickets

Staff Rota

A weekly staff rota page showing analyst shift patterns in a grid layout with day columns and analyst rows. Each cell displays the shift name and times, an Office or WFH location badge, and an on-call badge where applicable. Click any cell to add, edit, or remove entries. Configure shift definitions and toggle weekend visibility in Ticket Settings.

FeatureChange Management

Risk Assessment Matrix

A 5×5 colour-coded risk matrix with Likelihood (1–5) and Impact (1–5) scoring. The risk score auto-calculates and derives a risk level (Low, Medium, High, Very High, Critical) displayed on both the change list cards and the detail view with colour-coded badges.

FeatureChange Management

Post-Implementation Review

Structured PIR fields appear when a change is marked Completed or Failed: was it successful (yes/no), actual start and end times, lessons learned, and follow-up actions. Captures what actually happened so teams can learn and improve from every change.

FeatureChange Management

Activity Timeline

A combined chronological timeline on the change detail page merging comments and audit trail entries into a single view. Post comments inline with a text area at the top, and see every field change, status transition, and discussion in one scrollable timeline with timestamps and analyst names.

FeatureChange Management

Audit Logging

Server-side audit logging that tracks every field change by comparing old and new values before each update. Status changes, field edits, and CAB votes are all automatically recorded with timestamps, providing a complete history of who changed what and when.

FeatureChange Management

CAB Approval Workflow

A Change Advisory Board (CAB) multi-member approval workflow. Assemble a panel of reviewers with required or optional roles, choose an approval type (all must approve or majority), and let members vote Approve, Reject, or Abstain with comments. Status transitions automatically when the voting threshold is met — or reverts to Draft if any required member rejects.

FeatureChange Management

CAB Review Panel

A dedicated review panel on the change detail view showing each CAB member as a card with their name, required/optional badge, colour-coded vote status, vote comment, and timestamp. A progress badge shows how many required votes have been cast. Pending CAB members see an inline vote form with Approve, Reject, and Abstain buttons.

FeatureChange Management

My CAB Reviews Filter

A new “My CAB reviews” filter on the Approvals page showing changes where the current analyst has a pending CAB vote. Each approval card displays a CAB progress badge (e.g. “CAB: 1/3”) so reviewers can see at a glance how many votes are still needed.

ImprovementChange Management

Help Guide Page

A dedicated full-page help guide with left-pane section navigation covering the complete change management process: change types, the lifecycle flow, step-by-step recording instructions, CAB review workflow, risk assessment, and post-implementation review. Scroll-spy highlights the active section as you read.

15 Feb 2026

Weekly Update - 15 February 2026

FeatureChanges

Change Management Calendar View

Added a calendar view to the Change Management module with month, week, and day views. Changes with scheduled work windows appear as colour-coded pills based on their status. A sidebar with status filter checkboxes lets you show or hide changes by status. Clicking a change opens a detail popup showing the type, status, work window, outage window, priority, impact, and assigned analyst, with a button to open the full change editor.

FeatureChanges

Change Management Settings

Added a Settings page to the Change Management module with field visibility configuration. Administrators can toggle which fields appear on the change form, organised by section (Classification, People, Schedule, and Details). Hidden fields are removed from both the editor and the detail view, keeping the interface clean for teams that don't need every field.

FeatureChanges

Change Management Approvals

New Approvals page in the Change Management module showing all changes with a status of Pending Approval. Three filter tabs — All, Assigned to me, and Requested by me — let analysts quickly find changes they need to review or track. Each card shows the change type, priority, impact, requester, assigned approver, and submission date.

FeatureMorning Checks

Morning Checks Settings Page

Restructured the Morning Checks management page into a proper Settings page with a tabbed layout matching other modules. Check definitions are now added and edited via modal popups instead of inline forms. The existing checks list supports drag-and-drop reordering with grip handles — drag checks up or down to set the order they appear on the dashboard. A modern toggle switch controls active/inactive status.

FeatureForms

Forms Module Redesign

Completely redesigned the Forms module with a unified sidebar + editor layout matching other modules. The sidebar shows a searchable list of all forms with quick actions (Fill In, Submissions, Delete), while the main area features full-width title and description inputs with tabbed Fields and Preview panels. Form fields and dropdown options support drag-and-drop reordering with visual drop indicators, and pressing Enter on dropdown options adds a new one automatically. The company logo is shown in the form preview.

FeatureForms

Forms Settings Page

Added a dedicated Settings page to the Forms module, accessible from the header navigation bar like all other modules. The first tab, Layout, lets you configure the company logo alignment (left, centre, or right) on forms with a live preview. The setting applies to both the form editor preview and the fill-in page seen by end users.

FeatureForms

Unsaved Changes Protection

The form editor now tracks unsaved changes with a visual indicator — an orange "Unsaved changes" label appears next to the title and the Save button pulses gently. A confirmation dialog appears when navigating away, switching forms, or closing the browser tab with unsaved edits, preventing accidental data loss.

FeatureKnowledge

Knowledge Base Recycle Bin

Added article archiving with a recycle bin to the Knowledge module. Deleting an article now soft-deletes it rather than permanently removing it. Archived articles can be restored or permanently deleted from the recycle bin view. Configurable auto-purge retention (0–999 days) is available in Knowledge Settings. The AI chat panel includes a toggle to optionally search archived articles.

FeatureSystem

Setup Verification Page

Added a setup verification page at /setup that checks the basics before going live. It verifies that config.php and db_config.php exist, tests the database connection, checks for required PHP extensions, and warns if SSL peer verification is off or error display is on. Designed to be deleted once the system is in production.

FeatureSystem

One-Click Admin Account Creation

The setup verification page now detects when the database has no analyst accounts and offers a one-click button to create the default admin account. This closes the gap for fresh installs where the SQL seed wasn't run, letting new users get logged in without touching the database directly.

FeatureContracts

Supplier Types & Statuses

Added supplier types and supplier statuses as configurable lookup tables with full CRUD management in the contracts settings page. Each supplier can now be categorised by type and tracked by status, with both lists managed via a tabbed settings interface.

FeatureContracts

Expanded Supplier Records

Suppliers now capture registration number, VAT/tax number, type, status, full address fields, questionnaire issued and received dates, and free-text comments. The add/edit modal uses a two-column layout with grouped sections for a clean data entry experience.

FeatureContracts

Expanded Contact Records

Contacts in the suppliers module now include job title, direct dial, and switchboard fields. Job title is shown in the contacts table for quick reference alongside name, email, and supplier.

FeatureContracts

Contract Statuses & Payment Schedules

Added contract statuses and payment schedules as configurable lookup tables managed in the contracts settings page. Each contract can be assigned a status and a payment schedule from these administrator-defined lists.

FeatureContracts

Expanded Contract Records

Contracts now capture status, notice date, contract value with currency, payment schedule, cost centre, DMS link, and a full description. A new Terms & Data Protection section tracks terms status (received/reviewed/agreed), whether personal data is transferred, DPIA requirement, DPIA completion date, and a DPIA document link.

FeatureContracts

Contracts Dashboard with Sidebar & Search

Redesigned the contracts dashboard with a left sidebar panel showing overview statistics (total contracts, active, expiring within 90 days, suppliers, contacts), quick navigation links, and a universal search button. The search modal searches across contracts, suppliers, and contacts simultaneously with colour-coded result type badges.

ImprovementSystem

Default Admin Account

The SQL install script and database verification now seed a default admin account (admin/freeitsm) automatically when no analyst accounts exist. This ensures new installations always have a way to log in without manual database work.

ImprovementSoftware

Settings Page Tabbed Layout

Restructured the Software module settings page to use the standard tabbed layout matching other modules, replacing the previous single-panel layout with a consistent, organised interface.

ImprovementContracts

Contract View Page

Updated the contract detail view to display all new fields organised into clear sections: Dates, Financial, and Terms & Data Protection. DMS links are clickable, boolean fields show Yes/No labels, and section headers use the contracts amber theme.

ImprovementForms

Form Layout Constraint

Form elements now snap to either 50% or 100% width with a maximum of two elements per row. This ensures a consistent, clean layout across all forms and prevents awkward sizing that could occur with freeform widths.

ImprovementChanges

Sticky Change Editor Header

The Change Management editor header with Cancel and Save buttons is now sticky, remaining visible at the top of the page as you scroll through long change forms. This makes it easier to save or cancel without scrolling back to the top.

ImprovementChanges

Change Search Modal

Replaced the sidebar search box in Change Management with a search button that opens a draggable modal dialog. Search by change number or title, with results displayed in a scrollable list. Clicking a result navigates directly to that change. The modal matches the search pattern used in the Tickets module for consistency.

ImprovementChanges

Sticky Change Detail Header

When viewing a change, the action buttons, reference number, status badges, title, and property grid now form a sticky header that stays visible as you scroll through the description, risk evaluation, and other long-form fields below.

ImprovementMorning Checks

Morning Checks Chart Navigation

Clicking a bar in the Morning Checks 30-day overview chart now jumps to that day's checks. The date selector updates and the checks table reloads, making it quick to investigate a day that had amber or red statuses.

ImprovementMorning Checks

PDF Export with Selectable Text

Replaced the image-based PDF renderer with jsPDF AutoTable, so exported PDFs now contain real selectable and highlightable text. Status values are colour-coded (green, amber, red) and the company logo is included at the top. This also resolves the previous issue where the chart footer could crop the table content.

ImprovementTickets

Email Reply Threading

Redesigned the email thread display in Tickets to show flat thread content with proper stripping of email client attribution lines. Thread assembly now happens server-side for cleaner reply and forward flows, with a hidden reply marker used programmatically for accurate thread detection while remaining invisible to recipients.

ImprovementForms

Smart Form Field Sync

Rewrote the form save logic to update existing fields in place rather than deleting all fields and re-inserting them. This preserves field IDs and linked submission data, preventing data loss when editing form designs that already have submissions.

ImprovementForms

Toast Notifications in Forms

Replaced inline save and error messages in the Forms module with toast notifications matching the app-wide pattern used in Tickets and Knowledge. Success and error toasts slide up from the bottom of the screen and auto-dismiss after three seconds.

FixChanges

Datetime Format

Fixed an error when saving work start and end dates on changes. The HTML5 datetime-local input omits seconds, but the database requires them. The API now automatically appends seconds when they're missing, preventing format errors.

FixChanges

Approvals Count Query

Fixed the Change Management Approvals page failing to load due to a database query error. Multiple separate count queries were causing issues. Consolidated into a single query using conditional aggregation for reliable results.

FixMorning Checks

Morning Checks PDF Export

Fixed the PDF export in Morning Checks being cut off by the fixed-position 30-day chart footer. Switched from an image-based renderer to jsPDF AutoTable which builds the PDF directly from table data, eliminating all viewport-related cropping issues.

FixForms

Form Save with Existing Submissions

Fixed a bug where saving changes to a form's title, description, or fields would silently fail if the form already had submissions. A foreign key constraint between submission data and form fields was causing the entire save transaction to roll back.

FixForms

Drag-and-Drop Handle Detection

Fixed an issue where drag-and-drop for form fields and dropdown options wasn't responding despite the grip handles being visible. The HTML5 Drag and Drop API reports the draggable element as the event target rather than what was clicked, so a mousedown listener now correctly tracks whether the drag was initiated from a grip handle.

08 Feb 2026

Weekly Update - 8 February 2026

Feature

Software Licence Management

Added a full licence management module to Software. Record licences against applications in the inventory with fields for licence type, quantity, renewal dates, licence keys, portal URLs, costs, vendor contacts and notes. Renewal dates are colour-coded (red for overdue, amber for approaching, green for healthy) and status badges show Active, Expired, or Cancelled states. Includes search, sortable columns, and CSV export.

Feature

Software API Key Management

New settings page in the Software module for managing API keys used by the external software inventory submission endpoint. Generate new keys, revoke or activate existing keys, copy keys to clipboard, and delete keys you no longer need. Keys are displayed masked for security with the full key shown only once at generation time.

Improvement

Reporting Module Restructure

Restructured the Reporting module with a dedicated module header featuring the waffle menu for easy navigation between modules. Added a landing page with card-based navigation to System Logs and Ticket Dashboards. Logs now sit in their own subfolder and a holding page is in place for future ticket KPI dashboards.

Improvement

Calendar Drag and Drop

Added drag-and-drop support to the Calendar module. Events can now be moved between dates by simply dragging and dropping them on the calendar grid, making it quicker and easier to reschedule tasks and appointments.

Feature

System Module

New System administration module with two features. Encryption management provides a guided interface for generating the AES-256-GCM encryption key with clear instructions on secure placement outside the web root. Module Access lets administrators control which modules each analyst can see on the home screen and waffle menu, with an intuitive toggle matrix and auto-save.

Feature

Analyst Account Menu & Multi-Factor Authentication

Replaced the header logout button with an initials avatar circle that opens a dropdown account menu on every page. From the menu, analysts can change their password or set up TOTP-based multi-factor authentication by scanning a QR code with an authenticator app like Google Authenticator or Microsoft Authenticator. MFA is optional and per-analyst — those with MFA enabled are prompted for a 6-digit one-time code after entering their password, while analysts without MFA log in as normal.

01 Feb 2026

Weekly Update - 1 February 2026

Improvement

Team-Based Ticket Filtering

Enhanced the team-based access control system in the Tickets module. Department filtering now respects analyst team memberships more efficiently, improving performance when loading ticket counts and folders.

Improvement

vCenter VM Sync Reliability

Improved error handling in the VMware vCenter integration. The sync process now provides clearer feedback when connection issues occur and handles API timeouts more gracefully.

Fix

Email Attachment Display

Fixed an issue where email attachments with special characters in filenames weren't displaying correctly in the ticket reading pane. All attachment types now show properly with their original names.

25 Jan 2026

Weekly Update - 25 January 2026

Feature

Form CSV Export

Added CSV export functionality to the Forms module. Export form submissions with proper UTF-8 BOM encoding for Excel compatibility, making it easier to analyze submission data in spreadsheets.

Improvement

Knowledge Base AI Chat

Refined the AI-powered chat functionality in the Knowledge module. The Claude AI integration now provides more relevant answers by better utilizing the OpenAI embeddings for semantic article matching.

Fix

OAuth Token Refresh

Fixed an issue where Microsoft 365 OAuth tokens weren't refreshing properly for mailbox integrations. Email import now continues uninterrupted when tokens approach expiration.

18 Jan 2026

Weekly Update - 18 January 2026

Feature

Morning Checks 30-Day Trends

Enhanced the Morning Checks module with visual trend charts. Each check item now displays a 30-day trend line showing Red, Amber, and Green status patterns over time, making it easier to spot recurring issues.

Improvement

Encrypted Settings Storage

Improved security by implementing AES-256-GCM encryption for sensitive system settings. vCenter credentials, AI API keys, and other secrets are now encrypted at rest with the key stored outside the web root.

Improvement

Ticket Audit Trail

Enhanced the audit logging system in the Tickets module. All ticket changes are now tracked with timestamps, analyst names, and detailed change descriptions for better accountability.

Fix

TinyMCE Editor Loading

Resolved an issue where the rich text editor in Knowledge articles and Change requests wasn't initializing properly on slower connections. Editor now loads more reliably across all network conditions.

Stay in the Loop

FreeITSM is constantly evolving. Check back regularly for new features, improvements, and fixes. Or watch the repository on GitHub to get notified of updates.

Watch on GitHub