Release Notes

v2.29.0

October 21, 2026 Current

Inventory Dashboard: in the Edit Asset window, Custodian Nbr is now a drop-down of the custodian list (number, unit and primary custodian). Choosing a custodian fills in Unit, POC, Duty Phone and Building from that custodian's record, and the boxes it changed light up briefly; every box can still be changed before saving. Opening an asset never changes anything, and an asset on a number that isn't on the custodian list keeps it and says so. In the Add Custodian and Edit Custodian windows, the Primary Custodian and Alternate Custodian boxes now search the user directory by name (any order, rank optional), by DoD ID (4 digits or more, from the start) or by email. Picking the primary custodian fills in their email and extension (their duty phone), and their unit when Unit is empty; picking an alternate fills in their email. The list works with the arrow keys, Enter and Escape, disabled accounts are left out, and a name that isn't in the directory can still be typed in.

v2.28.0

October 20, 2026

Search boxes have a clear (×) button: User Management search and Add Member in User Groups on the Admin Dashboard, and every search box in Custodian Inventory (Equipment, History, Turn-ins, Recent changes, and the item list when adding a document). It shows while there's text in the box and clears it in one tap, and the results refresh as if you had deleted the text. Escape in the box does the same. It looks the same on computers, iPads and phones. The browser's own clear button, which only some browsers show, is hidden so there's just one.

v2.27.0

October 20, 2026

Fixed: User Management search on iPad and iPhone. Their keyboards type curly quotes (Smart Punctuation), so a search like '514 AES' and SSgt found nothing there. Curly quotes and long dashes now count as the plain ones (so GS–11 works too). The search box also no longer autocorrects or auto-capitalizes what you type.

v2.26.0

October 20, 2026

Custodian Inventory: the Equipment search now covers every filter, like the workorder dashboard. While you search (or pick a category), each filter chip (All, Missing building or room, No documents, Status Unknown, Issued to: not linked, Turn-in pending) shows how many matches it holds: blue when there are some, gray when there are none. If a new search finds nothing under the chip or category you're on, the list moves to where the matches are and says so (for example 'Nothing under Missing building or room, so showing All'). With 3 or more characters, your other accounts are searched too. If the account you're on has no match, the page says so and lists the accounts that do, with the number of matches; click one to open that account with the search kept. Scanning or entering a serial that isn't on the account now puts it in the search box, so you can see whether it's on another of your accounts.

v2.21.0

October 18, 2026

User Management on the Admin Dashboard can now search every user field, not just name and DoD ID. Pick what to search in from the new list beside the search box (All fields, Name, DoD ID, Unit, Office, Mobile number, Pay grade, Rank / grade, Email, PIV, Base, MAJCOM or Group), or leave it on All fields to look everywhere at once. Mobile numbers match in any format, so 8565551234, 856-555-1234 and (856) 555-1234 find the same person. Pay grade takes E-8, E8, GS-11, O3 or just 8. All fields starts searching at 2 characters and a single chosen field at 1 (it was 3 before). Each user in the list now shows their grade, unit and office under their name, and the matching phone number when you searched by number.

v2.20.0

October 18, 2026

Changing a computer's location to anything other than the Equipment Staging Map now takes it off the map. Setting it to Customer Possession, Shipping, a building, Tech Workbench or Other from the location popup on Service Bench, Workorder Details or the dashboard (one computer or several at once) clears its map position, and the map's activity shows Picked up (Customer Possession) or Removed (location changed) with where it went. Before, only Customer pickup did this, so computers could stay on the map after they had left. The location windows warn first when the computer is on the map. The map button in the location windows is now one button, Show on map. If the computer is on the map, the map opens to its room with its position picked, and its square and its room on the floor plan pulse for a few seconds; tap an open position to move it. If it isn't on the map, it starts the guided placement as before. Several selected computers use Place on map. A computer with the customer shows 'With the customer, so it isn't on the map' instead of the button. For administrators: scripts/cleanup_staging_map_locations.js lists computers still on the map whose ticket location says they are elsewhere (run it once after updating) and removes them with --apply.

v2.19.0

October 16, 2026

EITaaS Export prepares several tickets for EITaaS at once. Open it from the new EITaaS button on the Technician Dashboard (tick tickets first to export just those) or the EITaaS Export card on the Admin Dashboard. Choose tickets by EITaaS status (starting with those not in EITaaS yet), ticket status, date or search, set the EITaaS fields once for all of them, and each ticket is emailed to you on its own, the same email as the EITaaS button on Workorder Details, with its linked documents attached. A progress bar shows each ticket, and one that fails is reported and left ticked so you can try it again. Category, Subcategory and Product or Service come from mappings by job type and issue, which you set on the Mappings tab; Assigned To defaults to each ticket's technician; tickets saved before keep their own values. When a ticket has more than 5 linked documents or they add up to more than 10 MB, they are sent as one .zip (both limits can be changed on the Mappings tab), and this also applies to the EITaaS button on Workorder Details. Record incident numbers lists every emailed ticket that has no EITaaS incident number yet; type or paste the numbers (several lines paste down the list) and saving marks the tickets Entered in EITaaS. The single-ticket EITaaS email now reports a failed send instead of saying it was sent.

v2.18.1

October 16, 2026

Printing from Linked Documents (the Print buttons, Print selected, Print all and the document editor's Print) now opens the print dialog on the same page. In 2.18.0 the site's security settings blocked the hidden print frame, so the PDF opened in a new tab and you had to print from there.

v2.18.0

October 16, 2026

Dashboard search now looks across the Open, Assigned and Closed tabs at once. Each tab shows how many tickets match, and when nothing matches on the tab you're on, the search moves you to the first tab that has a match and says so under the search box. Searches of three or more characters also find tickets closed more than 7 days ago (by ticket number, customer, serial number, description or notes) and list them with links at the top of the Closed tab. Linked Documents has a Print button on each document next to edit, delete and send, a checkbox on each printable document, and Print selected and Print all buttons, so several documents print together in one print dialog without opening each one. Printing now opens the print dialog on the same page instead of a new tab, including from the document editor's Print button, which saves your changes first. Filled-in PDFs print with their values, pictures are fitted to a page, and Word, Excel and text uploads are left out of a combined print with a note saying so (open them in their own program to print). On iPhone and iPad the PDF opens in a new tab, since Safari there can't print it in place.

v2.17.0

October 16, 2026

PACT can now take TECH Refresh replacements from BECO stock (computers scanned in through Equipment Receiving), even before they appear in ELMS. On a TECH Refresh, Choose from BECO stock lists the received computers for the refresh's model (or any model, or one shipment), takes the next N in scan order or the ones you pick, shows how they pair with the outgoing computers in series order, then reserves them and fills in New Serial, MAC and Computer Name. Reserved computers can't be taken by another refresh, even by two people at once. Typing or scanning a stock serial into New Serial reserves it when you save (and fills its MAC); a serial another refresh holds is refused and that refresh is named. Clearing or changing a serial, the ✕ on its tag, archiving or deleting the refresh gives the computer back to stock. Add to Inventory now assigns reserved stock to the unit by updating the received record (POC, building, room, series, the computer it replaces) instead of skipping it, while hand-entered computers are still added as before; nothing is duplicated and a repeat click changes nothing. The BECO equipment import keeps a PACT-assigned computer on the unit's account while ELMS still lists it under NEW, lists it as a transfer still to make in ELMS, and confirms it once ELMS shows the transfer. If replacements change after the deployment files were generated, the refresh says to generate them again. Equipment Receiving shows how many of each shipment's computers PACT has reserved or assigned.

v2.16.0

October 15, 2026

New: Equipment Receiving (Equipment › Equipment Receiving) for bringing a shipment of computers into inventory. Start a shipment from an equipment profile, enter the expected quantity, one warranty date for the whole lot, the cost and the ELMS Type Action, then scan each computer's serial and MAC in either order. Each computer is saved as soon as it is scanned, under the ELMS custodian NEW, with sounds and on-screen confirmation. Duplicate serials and MACs (in the shipment, another shipment or Inventory) are refused and listed under Problems, and the database itself stops two scanners saving the same computer. Shipments can be paused and resumed, and any entry can be fixed or removed with a reason. Closing a shipment produces the ELMS Asset Receiving mass-upload spreadsheet from ELMS's own template (Asset ID prefix FFVQR0, Custodian NEW, Location MCGUIRE, Inv by Serial Y), split into files of 500 when needed, with the Stock Nbr and Acq Cost to enter on the ELMS screen. The BECO equipment import now saves each computer's ELMS Asset ID, confirms received computers as in stock when they appear in ELMS, reports them in the import summary, and no longer blanks a computer's CAGE (the ELMS extract has no CAGE column). Each shipment shows what is still not in ELMS and anything ELMS has entered differently. New Admin Dashboard card: Inventory Admin, for receiving profiles, the ELMS upload values, and a report of serial numbers that are in Inventory more than once. New permissions: Receive equipment, and Inventory Admin.

v2.15.7

October 14, 2026

Error pages are now consistent across the site and follow your theme settings. A mistyped or old address shows a styled "Page not found" page instead of a blank error. Expired or invalid customer links (packing list receiving, inventory inspections, MDM and Service Bench progress, sign-in sheets, the survey and AF 1297 form links) show a clean page that explains what happened and who to ask for a new link, with no menu or sign-in. Access-denied and sign-in problems explain what is needed and offer the right button (sign in, go back, or return to the dashboard). Errors inside the Print Labels window show a Close button that returns you to the page underneath. While the server is starting up, pages show a short "starting up" notice and reload by themselves after 5 seconds. Server errors no longer show internal error text. PACT downloads, Service Bench, Insights, Backup & Restore, Custodian Inventory and Diagnostics now use the same pages, and their scripts still get the same error responses as before.

v2.15.5

October 14, 2026

Added Custodian Inventory Admin to the Admin Dashboard for cleaning up test or accidental conversations and inventory inspections. Search and review records individually or in groups, choose a cleanup reason, and move them to Trash. Trashed records are hidden from normal views and unread counts. Trashing an unfinished inspection cancels it, stops reminders and disables its access link; restoring it leaves it cancelled. Permanent deletion requires a separate permission and typing the record ID, and also removes that inspection's evidence files. Equipment, custodian accounts and related conversations are retained. Closed inspections are protected from deletion because they may have updated equipment records. Cleanup history records who performed each action, the reason and its outcome. Separate group permissions control cleanup/restore and permanent deletion. Emails and texts already delivered cannot be recalled.

v2.15.4

October 14, 2026

Print Labels is now two clear steps. Choose labels: the ticket's serial numbers in their own scrolling list with a filter and a running count, so long tickets no longer stretch the window. Review: the printer (your last one is picked for you), print settings folded into one line showing the current values, the batch beside a label-by-label preview, and the Print button naming the count and the printer. Works on computer, iPad and phone (full screen, with each label as a small card on phones). Fixed: Zebra printers now have their own Darkness setting (0-30). The old shared Density box doubled the value for Zebras, so a printer saved at darkness 15 printed at 30, and its saved value showed as an error. Custodian Inventory: a Print label button in the item window (for people with the Print labels permission) prints a replacement label for that item straight from its inventory record, no ticket needed. The Items tab now has one search box: it filters as you type, and Enter or a scan opens that serial.

v2.15.3

October 14, 2026

Choose on Staging Map (from Service Bench or Workorder Details) is now a guided, step-by-step placement: click a building, then a room on its floor plan (tabs for buildings with several floors), then the cabinet, shelf, table, dock or pallet it goes in, and finish with one Save placement button that says exactly where it goes. A path at the top (Buildings › Building › Floor › Room › Storage) lets you go back to any level, Escape goes back one, and Show current location jumps to where the computer is now. Storage shows how many open positions it has; printers, racks and other fixtures are faded and say they have no storage positions. For one computer the first open position is chosen for you; for several, the positions they will fill are highlighted. Several computers can now go on any storage with enough room, not only pallets. After saving, the map closes and Service Bench reopens the location window showing the new spot. Fixed: empty positions could show as unavailable when the map opened for a ticket, and tapping a cabinet did nothing for a single computer.

v2.15.1

October 12, 2026

Fixed: Generate AF 1297 and document uploads in Custodian Inventory failed on the server (the document record could not hold the file type), and so did documentation photos on inventory inspections. The AF 1297 now shows an Open button in the item window instead of a pop-up tab. Fixed: Service Bench (and anything else) could not save older tickets whose EITaaS status is 'Not Synced'. New test checks every record these pages write against the real database schemas.

v2.15.0

October 12, 2026

Packing lists: Create Packing List on Workorder Details and in Service Bench › Tasks; a ticket number fills in the computers (ones already with the customer start unticked), title (Tech Refresh), destination (Unit, Building — Attention: UPC) and receiver. Counted items can be added when creating and changed until the receiving link is sent (Change contents keeps the scans). Scans are checked: box barcodes (WO#, order numbers) are turned away, computers from inventory that aren't on the list are named with their ticket, with a different sound for counted, already counted, not on the list and not a serial. The printed list (View / print, Download) has a barcode per serial for two-person verification. Custodian Inventory: Generate AF 1297 in the item window. Linked documents: Previous / Next with Document N of M, saving first.

v2.14.1

October 11, 2026

Custodian Inventory: Messages lists every account by default for people with more than one account (remembered on the device), and the Account list marks accounts with new messages or changes to review (they move to the top). No more picking each account to find a new message.

v2.7.42

October 9, 2026

Service Bench › Tasks › Print labels opens only the Print Equipment Labels window over the bench; closing it returns to Service Bench. Message templates can also be exported and imported from Admin Dashboard › Data Import/Export (as well as from Message Templates).

v2.7.39

October 9, 2026

Admin Dashboard: System Overview shows each count as a number, keeps small bars visible (log scale when needed) and shows counts on hover anywhere in a column; open tickets now count every ticket that isn't Completed or Closed. Recent Login Sessions lists one collapsible row per person with a hover card of their details, shows who is online or still signed in, and has Log off (new permissions: Log users off, Log administrators off). Session IDs are no longer sent to the page.

v2.7.38

October 9, 2026

Workorder Details: the Status dropdown now shows the ticket's real status (it always showed Open); closed and completed tickets show Completed, and saving one as Completed keeps it closed. Reopening or completing a ticket through Update needs the close permission and asks first. Notes can be added to closed tickets: adding a note no longer fails when the ticket changed after the page opened or has no version number. Service Bench: a previewed customer message now has an Edit message button to fix the subject or text before sending; the progress link stays at the end and a completion notice is still tracked as sent.

v2.7.37

October 9, 2026

Equipment Staging Map: new Decor items in the editor (couch, LCD TV and floor speaker), with no computer positions. Double-clicking (or double-tapping) a room on the floor plan now opens it in the editor too; before, the first click redrew the plan so the double-click was lost.

v2.7.36

October 9, 2026

Equipment Staging Map: + Room, + Open floor area and Duplicate now place the new room in an empty spot on the floor, nearest the middle of the view, instead of past the right-most room. The floor only grows when no empty spot fits, and the view keeps its zoom.

v2.7.35

October 9, 2026

Equipment Staging Map: rooms and open floor areas can now be as large as a floor (up to 1,000 ft), so warehouse layouts save and publish; the old 200 ft room limit made the draft fail with 'A layout value is out of range'. Save errors now name the room or item and the value that is out of range.

v2.7.34

October 9, 2026

Equipment Staging Map editor: alignment guides. While dragging or resizing furniture or rooms, a guide line appears when an edge or center lines up with another item, a wall or the floor's edge, and the item snaps into line; releasing keeps it aligned. Align guides can be turned off in the toolbar, or hold Alt to place freely.

v2.7.33

October 9, 2026

Face ID / fingerprint sign-in: choosing the passkey the iPad or iPhone offers above the keyboard (or Android autofill) when tapping the name or PIN box now signs in, instead of doing nothing. Login pages keep that request ready and refresh it every few minutes.

v2.7.32

October 9, 2026

Face ID / fingerprint sign-in (passkeys) on every staff login except the kiosk: Technician (and Service Bench, Staging Map, Tools), Admin, Inventory, PACT, Sign-In Sheets, Diagnostics and MDM. Admin sign-in asks for the PIN after the face or fingerprint. Set up and manage devices from the menu (Face ID / Fingerprint Sign-In, PIN required); administrators can remove a user's devices in Edit User. Locked or disabled accounts are refused, and login history records passkey sign-ins. Also fixes login history for Inventory, PACT, Sign-In Sheets and Diagnostics. Run npm install after updating (adds @simplewebauthn/server).

v2.7.30

October 9, 2026

Fixes customer pickup on Service Bench and the Staging Map (signature records were rejected by the work order schema), and the Walled room / Open floor area switch on the Staging Map. Service Bench: one button per checklist step (Stamp or Clear mode) plus Stamp through Login 1 replace the field drop-down and Stamp/Clear selected; selections stay after bulk actions unless Clear selection after a bulk action is checked.

v2.7.29

October 9, 2026

Equipment Staging Map: chairs, network racks, water fountains, stacking units, horizontal/vertical walls and styled text boxes; round, square and rhombus tables; rotate items and rooms by dragging (15° steps, green square indicator every 90°); resize rooms by dragging their edges; open floor areas without walls for warehouses; layouts export as .map files. Service Bench: a Tasks menu per ticket for customer pickup (customer and technician signatures), contact customer, status link, map, complete and close; only the newest ticket per customer opens, the rest show a summary.

v2.7.28

October 8, 2026

Equipment Staging Map: All buildings view with small floor plans and computer counts per building, floor and room; guided Move to another spot (building, room, spot); a full-width search row for customer name, serial, hostname, model, DoD ID, ticket or unit; a Not on the map overlay with device icons and Place; Contact customer, Complete and Close work order from the map; customer pickup now also needs the technician's release signature. Picked-up computers show With customer and who took them on Service Bench, Workorder Details and the map. Service Bench groups computers under each ticket with a select-all checkbox and collapse toggle.

v2.7.27

October 8, 2026

Equipment Staging Map: a designed access page replaces the plain-text error. It lists exactly which access is missing (account active, page access, Inventory: View) with where an administrator grants it, shows who is signed in, and offers Go to Service Bench, Go back and Sign in as someone else (or Close inside Service Bench's map window).

v2.7.26

October 8, 2026

Equipment Staging Map overlays: show a ticket (from a computer, the Ticket # box, the search box or ?ticket=) to highlight all its computers with S/N and status tags, list ones in other rooms or buildings with a link to each, and list ones not on the map; optionally highlight the same unit's computers that are ready for pickup in a second color. Other overlays: Ready for pickup, Needs attention, Here 7+ days, No work order and Open spots. Service Bench: select computers without a checklist and use Create checklists to make them all at once; existing checklists are never duplicated. Technicians can edit notes they wrote (Workorder Details, Service Bench and the Staging Map); edited notes show when and by whom, and the earlier wording is kept on the ticket.

v2.7.23

October 7, 2026

Label Printers: printers have a MAC address, shown under the IP in the printer list, entered in the printer editor or found with Auto-discover (Zebra printers report it directly; others through the server's ARP table on the same network).

v2.7.22

October 7, 2026

Labels: Label Printers has a Test Label button (preview at the printer's size/DPI, then print) using the template marked "Test label". Label Creator: Ctrl/Shift+click to select several elements, move them together, align left/center/right, and set their size (mm) and font size in one step.

v2.7.21

October 6, 2026

Labels: Zebra printers now print the same image as the preview and the Phomemo; large label jobs are sent completely before the connection closes. Computers get a Device Type (e.g. Laptop) and NSN, editable in Inventory; label fields Device Type, Model_Number and the new NSN now show the expected values.

v2.7.19

October 6, 2026

PACT: corrected the laptop NSN to 7021DSNOTEBO1.

v2.7.18

October 6, 2026

PACT: AF 1297 updated - Issued By shows the POC, Issued To and Return Date are left for the customer, Stock Number shows the NSN, and Description of Item reads "Model - S/N: serial (n OF total)". Text shrinks to fit each box.

v2.7.17

October 6, 2026

PACT: Add equipment to inventory now asks for the NSN (laptops default to 7021DSNOTEBOOK1), Part Number, CAGE and Warranty Expiration, and saves them on every computer in that import.

v2.7.16

October 6, 2026

PACT: computer names now use the right type letter. The name shown while typing a new serial includes the type, and the type follows your PACT Preferences default unless one was picked for the refresh (the new computer's inventory description still takes priority).

v2.7.15

October 6, 2026

PACT: "Save selections as defaults" now saves your unit preferences when you generate a TECH REFRESH checklist (it was being ignored). Removed the duplicate checkbox on the PACT page.

v2.7.14

October 6, 2026

PACT: column headers on the generated-file View page (spreadsheets and CSVs) now follow the site theme, so they are readable in Dark and Midnight as well as Light.

v2.7.13

October 6, 2026

PACT's DRA export now writes the replacement model with its normal spacing (for example DELL PRO 14 PLUS) in the ReplacementModel column, so it matches inventory and the SCO Admin Tool's ShortName Map. The Description column is unchanged.

v2.7.12

October 6, 2026

PACT pages now load their scripts and styles with versioned links, so after a deploy browsers always get the new files instead of an old cached copy. This fixes Add Equipment to Inventory and Create Job doing nothing on a site still serving the previous version of the page's script.

v2.7.11

October 6, 2026

SCO Admin Tool inventory download: - New Admin Dashboard card, SCO Admin Tool, for the shared secret the tool uses to download the computer inventory. Generate creates a strong secret; Show and Copy help move it into the tool. Viewing or changing it requires the Update Inventory permission. - New download address /api/sco-tool/inventory for the tool's Update Inventory button. Requests must be signed with the shared secret, and the inventory is sent encrypted with it, so only a copy of the tool with the same secret can download and read it. - The download includes every computer with its POC, unit, phone, building, room, serial, computer name, replaced serial, model, MAC address, series, custodian account, manufacturer and status. Blank POC, unit, phone and building are filled from the custodian account.

v2.7.5

October 5, 2026

The POC's rank now appears on PACT TECH Refresh paperwork: - AF 1297: POC shows rank and name (e.g. "TSgt Jane Doe"). - TECH Refresh Checklist: POC shows rank and name, and Rank / Unit shows "TSgt / 514 LRS". Rank is looked up from the POC's email in the user directory, so a promotion shows up the next time the files are generated. New TECH Refreshes save the custodian's email with each row; existing ones find it from the custodian record that matches the POC's name.

v2.7.3

October 1, 2026

The hamburger menu is reorganized into labelled sections, with an icon on every item: - Front Desk: Home, Sign-In Sheets - Work Orders: Technician Dashboard, Service Bench, MDM, Unmatched Messages - Equipment: Inventory, PACT - Tools: Tools, Downloads - Administration: Admin Dashboard, Diagnostics Account items (Virtual CAC Pairing, Change PIN, Settings, About) stay pinned at the bottom. The page you're on is highlighted, the app name appears at the top, and the list scrolls on shorter screens instead of being cut off. "Sign-In Sheet" is now "Sign-In Sheets" and "Inventory Dashboard" is now "Inventory".

v2.4.0

September 28, 2026

The same serial number can no longer be added twice to one ticket. On Workorder Create and in the Workorder Details equipment window, a repeat typed or USB-scanned serial is refused with a short warning and a low tone, and the phone camera scanner says “already added” and stays open for the next label. The server also drops any duplicate that gets through. When a serial is already on another open ticket, a warning appears under it. Customers checking in see the ticket number and are asked to tell the technician if it is the same problem. Technicians see who it is assigned to, with a link to open it. The new ticket is still created, and the two tickets are linked to each other. Workorder Details shows a notice at the top when its equipment is also on another open ticket. After a ticket is resolved, or set to Completed, a window lists those other open tickets. The technician can close any of them with one closure note, open them in a new tab to review first, or skip.

v2.3.2

September 26, 2026

User imports no longer stop partway through when a row conflicts with an existing user, such as an email address already used by another account. Admin Dashboard Data Import skips the row and continues. The bulk sync API reports it as skipped instead of marking the whole sync as failed. Each skipped row names the account that already holds the value. Admin Dashboard user imports now require a 10-digit DoD ID, a single-letter PIV and a name, so blank rows such as shared mailbox accounts can no longer create empty user records. The Add New User page now checks every field on the server: a 10-digit DoD ID, a status from the list, a name, a valid email, and grade, unit, office, base and MAJCOM. It will not create a second account for an existing DoD ID and status or an email already in use, and it is rate limited. If something is wrong, the form shows what to fix and keeps the information already entered.

v2.3.1

September 26, 2026

User imports now honor the ACCOUNTDISABLED column from the Active Directory extract (true/false, TRUE/FALSE, 1/0 or yes/no) in the bulk sync API, the user update APIs and Admin Dashboard Data Import. A blank or missing column leaves accounts unchanged, and an invalid value skips the row with a reason. Each account now records who disabled it. Active Directory can only re-enable accounts it disabled, and accounts disabled by an administrator in the Admin Dashboard stay disabled until an administrator enables them. In the Users table, the icon tooltip shows whether an account was disabled by an administrator, in Active Directory, or because it is no longer in the extract. After a full bulk extract, users who were in an earlier sync but are no longer present are disabled (never deleted) and re-enabled automatically if they return. This is skipped when the extract is under 90% of the previous count or the sync is marked partial, and it does not affect users added by hand. The first sync after this update only records who is present. The bulk sync response and sync job notes include a summary of directory changes. Admin Dashboard imports report skipped rows and Active Directory status changes.

v2.3.0

September 25, 2026

New Admin Dashboard card: Rep Duty Schedules. The representative list on the check-in form can now show only the people on duty today, with a Show all representatives option and an automatic fallback to everyone if nobody is on duty. The filter is off until turned on in the card's Settings tab. The Today tab shows who customers will see and why. A representative is on duty when an assigned schedule covers today, when they have an On duty exception, or when they logged in as staff today (Technician, Admin or MDM). Off duty exceptions for leave or TDY override everything. Schedules are either weekly days or specific dates (such as UTA weekends). They can be created, edited, copied, deleted, exported and imported, so schedules built on one site can be moved to another. Click Export for schedules only; long press or Shift+click to include rep assignments. New Holidays & Family Days tab. Federal holidays download automatically from Nager.Date for the current and next fiscal year, using OPM observed dates, with a built-in calculation as fallback and cross-check. The list updates each year on a chosen date (default October 1) or on demand with Update now, and holidays added by hand, such as Executive Order closures, are kept. Family days are entered per date as Military only or Everyone. Representatives are classified as military or civilian from their personas; anyone with a civilian (.C) persona counts as civilian. Each rep can also be set manually. Schedules can skip federal holidays and family days. Weekly schedules can also give an in-lieu-of holiday when a holiday falls on a non-workday, using either the OPM rule (the workday before) or the nearest workday in the same week. The representative Unit, Office, check-in label and time zone are now settings in the Rep Duty Schedules card instead of being fixed to 514 MSG / SCO, so other organizations can adopt the site without code changes. A new Manage Rep Duty Schedules group permission controls changes. User accounts have a separate Disabled status. Disable User in the Admin Dashboard now blocks every staff login, including existing sessions, and removes the person from representative lists. Wrong-PIN lockouts are tracked separately and cleared with a new Unlock button. Accounts previously disabled with the old button now show as locked and remain blocked. Stylesheets and scripts on the check-in, Service Bench, MDM and Admin pages now carry a content version, so browsers always load the current files after an update.

v2.2.7

September 25, 2026

Service Bench now has its own login page. Selecting Service Bench from the menu while logged out opens Service Bench Login, and after login, PIN entry, CAC login or PIN creation you land directly on Service Bench. An expired session returns you to Service Bench Login. A Log out button sits under your name in the header, and clicking the logo now logs out and returns to the home screen, matching the Technician Dashboard, Diagnostics and MDM. Service Bench and MDM Service Bench have a Sort by option: oldest ticket first (default), newest ticket first, needs attention first, least progress first, or customer name. Each work order heading shows the date it was opened and how many days ago. Customers now load collapsed. Each customer shows a New tag when a ticket was opened since your last visit to that bench (at least the last 24 hours), and a tag showing how many days old their oldest open ticket is. It is green, yellow or red based on thresholds set in the new Admin Dashboard > Service Bench Settings card (defaults: yellow at 30 days, red at 60). Saving those settings requires the new Configure Service Bench Settings group permission. Auto refresh (on/off and interval), row spacing, sort and customers per page are now saved to your account for each bench and follow you to any computer. Existing choices on a device carry over the first time. The per-device Customers per Page option in Settings has been removed in favor of the menu on each bench.

v2.2.6

September 24, 2026

MDM Service Bench now prepopulates matching device fields from the iPhones and iPads inventory when registering a serial supplied during ticket creation or through Assign device. The Add device form also fills the ticket customer's DoD ID + PIV account, first name, last name, rank, unit, and email. The device phone number remains blank for the technician to enter. Customer prefill and assigned-user lookup omit a trailing middle initial from the first-name field. Added Unassign device beside Assign device, with checks to prevent assigning equipment already reserved by another active ticket. Unassigning retains the device record, linked documents, and archived checklist history. Completed transfers continue to use the return workflow. Deleting a work order now releases its MDM device reservation while preserving the inventory record and completed issue or return state. Reservations left by previously deleted tickets recover when assigning the device again. Both MDM and computer-imaging Service Bench pages refresh after dashboard deletions or when returning to the page, when no edit or selection is active. The work order confirmation page now includes the shared hamburger menu and its Settings, About, and Virtual CAC controls. Its equipment serial-number panel follows the selected theme. Fixed the delete-confirmation warning so its text wraps naturally instead of appearing in separate columns.

v2.2.5

September 22, 2026

Equipment locations and notes are easier to access. Service Bench now has Notes and Location buttons: tap to view, or hold to add a note or edit a device location. Visible editing actions are also available inside the dialogs. Each device can have its own location and details, with the technician and update time recorded. Existing tickets retain their ticket-level location as a fallback until a device location is saved. Equipment rows in Ticket Details and serial-number links in Workorder Details open a location popup. Authorized technicians can edit locations there, and Close, outside-click, or Escape dismisses the popup. Missing location details stay blank for a cleaner display. Click the SCO representative's name in Workorder Details to view contact information, compose email or SMS/MMS messages, and select linked documents to send. A new Work Orders > Update SCO Representative permission allows corrections using the SCO roster. Changes update the representative's saved identity and contact details and retain change history without changing the assigned technician or previously generated documents. Messaging uses existing communication permissions and requires an explicit Send action.

v2.2.4

September 21, 2026

Restored camera scanning on Create Work Order. The Scan button beside the equipment serial number field is available again, allowing phones and tablets to scan QR codes and barcodes from device labels. Restored the scanner scripts, styles, and mobile layout assets that were accidentally removed during the dark-mode update. Scanning has been confirmed working again on mobile devices.

v2.2.3

September 20, 2026

Improved the Unmatched Messages header on phones. The title uses a smaller font and wraps between words so Unmatched no longer splits onto a separate line. A compact logo and Refresh button give the heading more room, with the header able to wrap on narrow screens. Tablet and desktop styling is unchanged.

v2.2.2

September 20, 2026

Session secret rotation and server restart controls in .env Settings. Rotate secret, next to SESSION_SECRET's Change button, generates and saves a strong random secret on the server while keeping its value masked and preserving backup history. A confirmation explains that the new secret takes effect after restarting and that users will need to sign in again. Restart server, next to Import .env, lets authorized administrators restart the website application to apply saved settings. The new System > Restart server group permission controls access. The restart checks that PM2 can bring the application back, allows active requests time to finish, and provides a link to sign in again. Confirmation warns about the brief outage and potential interruption to unsaved work. This restarts the website application, not the host computer.

v2.2.1

September 20, 2026

Auto Refresh for Service Bench and MDM Service Bench. Both benches now have the same Auto Refresh switch and "Every N sec" box as System Diagnostics, next to the Refresh button. Turn it off to stop automatic updates or set how often the list refreshes (5 to 9999 seconds). Each device remembers its own choice, and a small "Updated" time shows when the list was last refreshed. It starts on at 30 seconds, the same as before. Automatic refreshes still pause while a dialog is open, computers are selected, or a change is being saved, so they never interrupt a technician mid-update.

v2.2.0

September 20, 2026

Choose your theme, and administrators can create new ones. Settings now has a Theme picker with preview cards for Light, Dark and Midnight, plus any theme an administrator has created. Each device remembers its own choice. Administrators can build themes in the new Theme Creator on the Admin Dashboard. Pick a light or dark base and seven colours, and the rest of the palette is worked out automatically (every colour can still be adjusted under Advanced). A live preview and a readability check show how the theme will look, "Try on this page" previews it on the real dashboard before saving, and themes can be edited, duplicated or deleted. Saved themes appear in everyone's Settings right away. Dark themes recolour every page; light themes recolour the page, cards, tables, forms, buttons and tabs. Permissions to create, modify and delete themes can be granted per group in Admin Dashboard > Groups. Dark mode logos. The 514 MSG shield and the Air Force Reserve Command seal now use transparent versions on dark and custom themes, so they no longer appear on a bright white or grey box. Fixes: the Service Bench logo no longer gets cut off on iPad (the logo now keeps a fixed size, and its hover effect only applies on devices with a mouse). The red Close buttons in the Settings, About and PIN dialogs are easier to read in dark mode, and the PACT custodian and equipment tables use the theme's own stripe colours.

v2.1.4

September 20, 2026

Install as an app on Android. The site can now be installed as an app from Edge, Chrome or Samsung Internet on Android phones and tablets (menu > Add to phone / Install app). It appears in the app drawer with the 514 MSG shield icon and opens full-screen without the browser address bar. Previously the browser reported that the app could not be installed and only offered a plain shortcut. The app display setting was changed from a normal browser tab to standalone, and a small service worker (sw.js) was added. The service worker does not store any pages or data, so sign-ins, CAC sessions, tickets and documents always come from the server. If a page cannot load because the device is offline, a simple "You are offline" page with a Try again button is shown. Shortcuts added to an iPhone or iPad after this update also open full-screen; existing shortcuts keep their current behavior until they are deleted and added again. In the full-screen app, use the site's menu and Home links to navigate.

v2.1.3

September 20, 2026

Computer Re-Image Checklist signature fixes. Save Changes now turns yellow when a signature is added, redone, moved, resized or removed. Previously it stayed green after signing, so it was easy to leave the document without saving. This applies to every PDF form that uses the document editor. The signature button on the Computer Re-Image Checklist now reads "Sign: Customer Signature" instead of "Sign: Signature", to tell it apart from the SCO rep signature. The Pick-up Date/Time box below the customer signature is now filled in automatically with the current date and time when the customer signs (for example, 9/19/2026 11:32 PM), and updates if the signature is redone. The box is read-only, and the "Fill: Pick-up Date/Time" quick-fill button has been removed. Signing as the SCO rep does not change it.

v2.1.2

September 20, 2026

Home-screen name. When the site is saved to the home screen of an iPhone, iPad or Android phone or tablet, the shortcut is now named "514 MSG/SCO Check-In" instead of "Check-In". Some devices shorten long names under the icon, but the full name is used when the shortcut is opened or listed. The name is set in the web app manifest and on every page that uses the shared responsive layout. Existing home-screen shortcuts keep the old name until they are deleted and added again.

v2.1.1

September 20, 2026

Home-screen icon. When the site is saved to the home screen of an iPhone, iPad or Android phone or tablet, it now shows the 514 MSG shield instead of a plain letter, and the shortcut is named "Check-In". The shield also appears as the tab icon in desktop browsers. Icons were added for iOS (Apple touch icon), Android (standard and adaptive/maskable) and browser tabs, along with a web app manifest, and are included on every page that uses the shared responsive layout. The site still opens in the normal browser window, so navigation is unchanged. Existing home-screen shortcuts keep the old icon until they are deleted and added again.

v2.1.0

September 19, 2026

Camera scanning. Phones, tablets and computers with a webcam can now read QR codes and barcodes with the device camera, using the new Scan button. Equipment serial numbers: a Scan button now sits beside Add on the serial number field on both the Create Ticket page and the Ticket Details page. Point the camera at the QR code or barcode on a device asset tag and the serial number is filled in and added automatically. The camera stays open so several devices can be scanned in a row; press Done when finished. Supports QR, Data Matrix, Code 128, Code 39 and other common label types. The scanner reads only the serial number from the code, ignoring extra header text, "S/N:" labels and support-page web links, such as those on Dell and HP labels. Sign-In Sheet and Kiosk: a Scan button next to the Add Attendee field reads the barcode on the back of a CAC and fills in the field, and the existing lookup and first-time pairing continue as before. Only the CAC barcode is accepted, so the other barcodes on the card are ignored. Camera controls and fallbacks: a light button and zoom slider appear on devices that support them, and a flip button appears when more than one camera is available. If camera access is blocked or unavailable, a Take Photo button reads the code from a picture instead. Scanning works in the browser on iPhone, iPad, Android and desktop, with no app to install; the camera requires a secure (https) connection and the browser's permission the first time it is used. Added a shared scanner script (scanner.js), stylesheet (scanner.css) and the bundled open-source ZXing barcode library (Apache-2.0 license included). On phones, the serial number field and its Add and Scan buttons now stack to fit the screen.

v2.0.0

September 19, 2026

Phone and tablet support. The site now works on iPhone, iPad, Samsung Galaxy phones (including the Ultra models) and Galaxy Tabs, in addition to desktop browsers. Desktop layouts are unchanged. Virtual CAC is not available on phones and tablets, so on those devices the CAC Login card is hidden on every login page (check-in, Technician, Inventory, PACT, MDM, Sign-In, Diagnostics and Admin), the Virtual CAC Pairing menu entry and pairing window are removed, and Manual Login is shown as a single centered card. Detection is based on the device rather than the window size, so a narrow desktop browser window or a Windows touchscreen laptop still gets Virtual CAC. Layout changes on small screens: login cards, forms, button rows and toolbars stack to fit the screen with no sideways page scrolling. Wide tables scroll inside their own box instead of stretching the page. Ticket tables display as labeled cards on phones and on tablets held in portrait. Buttons and fields have larger touch targets, and fields no longer trigger iOS zoom-in when tapped. The hamburger menu button is larger, the side menu scrolls on short screens, and it closes after a tap on touch devices including iPad in landscape. Pop-up windows fit the screen height and scroll when needed. Added the missing viewport setting on pages that lacked it. Added a shared responsive stylesheet (responsive.css) and script (responsive.js) loaded on all pages except print/PDF templates and customer status pages. The Admin Dashboard receives the shared touch and tablet fixes only and may still scroll sideways on wide tables.

v1.9.3

September 19, 2026

Added support for unavailable equipment serial numbers during ticket creation. NA and N/A, regardless of case or surrounding whitespace, are normalized to N/A (Not Available). Customers can create a ticket with this placeholder when Require Equipment is enabled and Enforce Serial Format is disabled. The placeholder is rejected when serial-format enforcement is enabled. Tickets containing only unavailable serials no longer generate an AF1297. Confirmation messages omit the receipt link and attachment, avoiding missing-form errors. When unavailable placeholders and real serials are entered together, only real equipment appears on the AF1297, including the confirmation-page printout. Manual AF1297 generation also rejects unavailable-only equipment. Reimage and MDM Service Bench tracking excludes these placeholders so N/A is not treated as a physical device. Added automated checks for normalization, document-generation rejection, notification templates and Service Bench handling.

v1.9.2

September 19, 2026

Fixed stale admin dashboard scripts hiding newly deployed Issue actions and status badges. The admin script URL now includes a hash of its contents, so script changes receive a new URL even when the application version is unchanged. The admin dashboard page also sends Cache-Control: no-store. Improved the Issues table action layout: Edit, Delete and Disable/Enable stay together on one non-wrapping row, while Copy appears on its own row with an 8px gap above it. This prevents the Actions column from squeezing Disable/Enable onto an extra line and unnecessarily increasing row height. The layout was checked at desktop and tablet widths.

v1.9.1

September 19, 2026

Expanded MDM into Service Bench, Devices, Phonebook & Contacts, and Guides, with the 514 MSG logo, centered MDM title and Provision / Issue / Support / Return subtitle. Desktop and tablet layouts follow the site theme. The existing MDM login, device research, phonebook and contact tools remain available in their respective tabs. Added iPhone/iPad provisioning and return queues selected through each Issue’s Service Bench trouble task. One customer work order can track multiple devices with individual checklists, collapsible customer groups, filtering, pagination, touch-friendly/compact spacing and bulk step updates. Steps can be stamped or cleared; Delayed and Error require internal notes. Long-press actions and visible controls provide notes, step status and notification options. Workflow activity records the acting technician and updates the work-order assignment. Provisioning tracks Workspace ONE, activation codes, device updates, Apple Configurator, Purebred administrator association and customer acceptance, mobile-network activation, PIV-D, mail and Teams setup, AF1297 signature and device release. Wi-Fi-only equipment can mark mobile activation Not Applicable. Assigning equipment through the provisioning bench generates a per-device issue AF1297. Returns track Apple ID sign-out, Find My disabled, factory reset, a return AF1297 transferring the device from the customer to 514 MSG/SCO, transfer acknowledgement and return to the reusable pool. Form generation is separate from signature/acknowledgement. Prerequisites must be completed before issuance or reuse, and reopening a prerequisite clears final completion. Checklists can be printed without a new fillable PDF template. Added serial reservations, stale-save checks and workflow history to prevent conflicting assignments and premature reuse. Devices shows lifecycle state and an Available for reuse filter. Phonebook/contact exports exclude reserved, returning and reusable-pool devices, while existing untracked inventory retains its previous behavior. Bench-managed assignments cannot be overwritten by imports or bypassed through normal device editing, and devices with workflow history cannot be deleted. Added expiring, revocable customer status links for MDM work orders, showing the assigned technician, completed/total device counts and per-device progress in 0/25/50/75/100 percent stages without exposing internal notes or credentials. Customer messages support SMS/email previews, templates and custom text, optional approved customer guide links and no attachments. Durable channel status prevents automatic resending of accepted messages. Added a Guides library for approved HTTPS documents/videos with customer or technician-only visibility, including support/new-CAC material. Existing MDM permissions govern workflow access, with existing SMS/email permissions required for notifications. Added Disable/Enable to Admin Issues. Disabled Issues disappear from new-ticket dropdowns, and stale submissions selecting them are rejected. Their IDs, historical ticket references and workflow settings are preserved, so existing tickets remain usable in Service Bench. Legacy Issues remain enabled by default. Added Copy with a new ID and names ending in -copy, -copy 1, -copy 2, etc.; copies retain configuration, start disabled and open for editing before being enabled. Availability is included in admin exports/imports, while older imports without it preserve existing availability. Added internal notes to the Issue editor for retirement reasons, replacement Issues and configuration cautions. Click an Issue row or View notes to expand its notes. Notes support up to 10,000 characters, remain excluded from normal customer-facing queries, and are preserved by copying and admin export/import. Added setup documentation and automated coverage for lifecycle transitions, permissions, reservations, customer-link privacy, notification replay protection, Issue availability/copying and notes.

v1.9.0

September 19, 2026

Added Service Bench for managing open reimage work orders, with one row per computer, collapsible customer groups, customer rank and unit, serial/MAC details, filters, customer-based pagination, and touch-friendly or compact spacing. Responsive layouts support desktop and tablet screens and follow the site’s light/dark setting. The 514 MSG logo appears above the Service Bench title and returns to the Technician Dashboard with the same hover and keyboard-focus behavior as other staff-page logos. Technicians can create missing PDF checklists, stamp or clear individual steps, update selected computers in bulk, and undo an update. Login 1 marks a computer complete; Login 2 and Login 3 track later logins. Holding a row adds an internal ticket note, while holding a step allows Delayed or Error status with a required note and yellow/red indicators. Visible controls offer the same actions without a long press. Changes assign the work order to the last acting technician and record activity. Work-order versions, checklist revisions, and editing locks protect against conflicting saves; PDF updates preserve previous files and respect locked checklists. Service Bench customer notifications preview SMS and email before sending. Notifications identify the completed computer while other computers remain unfinished; once every computer in that work order is complete, the existing Ready for Pickup template is used without attachments. Holding Notify Customer opens existing templates or a custom message. Channel status tracking and duplicate-send protection allow failed channels to be retried without resending accepted messages. Notifications include an expiring, revocable customer progress link showing completed/total computers, each computer’s progress in 25/50/75/100 percent stages (or queued before work starts), and the assigned technician, without exposing internal notes or MAC/contact details. Administrators can grant Service Bench page access under Groups and select the Reimage trouble task on the relevant Issue. Queue membership uses the configured issue instead of hardcoded description text. Existing Technician Dashboard permissions govern viewing, changes, assignment, and SMS/email communication. Added setup documentation and automated service, route, and desktop/tablet browser checks. Updated the Computer Reimage Checklist PDF template and corrected the first Last Login label to Date/Time 1. Added Quick Fill buttons for imaging, domain, Cisco ISE, all three login entries, and pickup date/time. Buttons stamp the technician’s rank/initials and current date/time, with compact stamps for narrow login fields, while keeping fields editable. Fixed text clipping in Acrobat and the browser editor preview, and ensured Quick Fill changes mark the document as modified so they can be saved. IA validity is now configurable through IA_DURATION in .env. It accepts a day count or multiplication such as 365*3 (1,095 days); local/example configuration uses that three-year day count. Missing or invalid values fall back to 365 days. The existing warning at 30 days or fewer remains. Durations are exact days rather than calendar-year anniversaries, and configuration changes require an app restart. Added tests for parsing, expiration, and leap-year behavior.

v1.8.7

September 17, 2026

The EITaaS export page (Work Order details → EITaaS button) was throwing "Unterminated string in JSON" and failing to load any data for tickets whose notes, technician notes, or SMS/communication history contained an apostrophe (e.g. "I won't stop until..."). The page was embedding raw JSON.stringify() output into single-quoted HTML attributes, and an unescaped apostrophe in the data closed the attribute early, corrupting the JSON before the browser could parse it. The page now HTML-entity-escapes that data before embedding it, the same fix already used on the Communicate page, so the EITaaS form populates correctly regardless of punctuation in a ticket's history.

v1.8.6

August 29, 2026

The admin dashboard's Work Orders export/import now uses .json instead of .xlsx, since the old spreadsheet format couldn't round-trip a ticket's nested data (token recipients, status history, and similar fields were flattened into unreadable "[object Object]" cells) and never carried a ticket's linked documents (generated PDFs and HTML forms) at all. Exporting Work Orders now produces a .json file with each linked document's file content embedded alongside its metadata, and a new optional Ticket ID(s) field lets you export a specific ticket or set of tickets instead of the whole system — the normal case for moving a ticket you created on the dev site over to production. Importing that .json back in always creates each ticket fresh under a brand-new ID, never overwriting an existing one, and writes its linked-document files back to disk under the new ticket's own folder; if one ticket in a batch fails to import, the rest still go through. Users/Groups import and export are unchanged.

v1.8.5

August 29, 2026

SIPR token requests: Issues can now be flagged (admin dashboard) to collect one or more token recipients instead of serial numbers, and workorder creation generates a filled DD Form 2842 per recipient, with Registration Official info snapshotted from the ticket’s SCO Rep so later regeneration stays correct regardless of who’s logged in. The Token Recipients picker can now be searched by DoD ID as well as name, the Token ID field auto-formats to the 5-group format (e.g. 534E-0650-0201-0003-7841) with letters capitalized end-to-end, and the DD2842’s telephone fields now auto-fill the correct area code when only a bare 7-digit extension is on file — DSN 312 for the 650 exchange, 609 for the 754 exchange — without overwriting a number that already has one. Added retry-match and delete to the unmatched messages triage inbox: a broader DOD-ID-based candidate lookup lets a technician manually link a message the auto-matcher missed (e.g. a contact’s phone/email was added after their workorder was created), and delete removes a message that will never have a match. The workorder owner and assigned technician are now also notified by SMS/email whenever an inbound customer message is matched to their workorder, whether automatically or via the triage inbox, and admins are alerted when a message can’t be matched to any workorder at all. Added a downloadable blank equipment import template (data columns plus an instructions sheet) via a new Download Template button on the Inventory Dashboard. The DoD seal/logo now returns technicians to their own section’s landing page (Technician, Admin, Diagnostics, PACT, Inventory) instead of bouncing them to the public check-in kiosk screen, and logs them out automatically at each section’s root page — this runs on a shared walk-up kiosk, so leaving an authenticated session on screen for the next customer is worth closing.

v1.8.4

August 20, 2026

Technician Dashboard workorder search now also matches equipment serial numbers. Each workorder row already carried its linked equipment's serial numbers (used to populate the Equipment section of the ticket detail modal), but the search box only checked ticket ID, customer, description, assigned technician, and SCO representative — so a technician who only had a serial number in hand had no way to find the workorder it belonged to. The search box placeholder now reads "Search by Ticket ID, Customer, Description, or Serial Number" to reflect this, and the match applies across the Open, Assigned, and Closed tabs, since all three tabs share the same search logic.

v1.8.3

July 31, 2026

Reworked how warranty request and computer reimage checklist documents are edited from the Linked Documents screen. These are PDF-based documents, and the editor previously showed the PDF in a read-only browser preview next to a separate list of duplicate text fields — a leftover of the fact that a browser can't read values back out of an embedded PDF viewer. Fields are now editable directly in the document preview itself, the same way the AF1297 form already worked, so what you see is what you're editing. Along the way, also fixed the warranty request form's field text rendering as a dull gray/navy instead of black, a doubled/ghosted-text glitch where the preview's background and the editable overlay both drew the same value slightly offset from each other, and a bug where a field placed twice on the same page (the reimage checklist's custodian contact number) only showed one editable copy instead of both. The editor now warns before closing a document with unsaved changes, and a bug where the Save button could get stuck showing unsaved changes after switching to a different document is fixed. Also fixed two related login issues affecting mobile users. The manual login search box was storing your rank alongside your name (e.g. "SMSgt John Doe") once selected, which is exactly the value a phone's password manager would save and later autofill back in — but the rank-prefixed text no longer matched anything, so autofill silently failed to log you in. The search box now keeps just your plain name going forward, and the underlying user search was made tolerant of both a leftover rank prefix (for anyone whose phone already saved the old value) and name order, so a search still resolves correctly either way. On the reimage checklist, the custodian contact field was renamed "Custodian Info" and now shows both name and phone number (e.g. "SMSgt MICHAEL A GATES / 856.723.3608") instead of just a phone number. The field was also widened toward its label to prevent longer names from getting clipped.

v1.8.2

July 31, 2026

Reworked how warranty request and computer reimage checklist documents are edited from the Linked Documents screen. These are PDF-based documents, and the editor previously showed the PDF in a read-only browser preview next to a separate list of duplicate text fields — a leftover of the fact that a browser can't read values back out of an embedded PDF viewer. Fields are now editable directly in the document preview itself, the same way the AF1297 form already worked, so what you see is what you're editing. Along the way, also fixed the warranty request form's field text rendering as a dull gray/navy instead of black, a doubled/ghosted-text glitch where the preview's background and the editable overlay both drew the same value slightly offset from each other, and a bug where a field placed twice on the same page (the reimage checklist's custodian contact number) only showed one editable copy instead of both. The editor now warns before closing a document with unsaved changes, and a bug where the Save button could get stuck showing unsaved changes after switching to a different document is fixed. Also fixed two related login issues affecting mobile users. The manual login search box was storing your rank alongside your name (e.g. "SMSgt John Doe") once selected, which is exactly the value a phone's password manager would save and later autofill back in — but the rank-prefixed text no longer matched anything, so autofill silently failed to log you in. The search box now keeps just your plain name going forward, and the underlying user search was made tolerant of both a leftover rank prefix (for anyone whose phone already saved the old value) and name order, so a search still resolves correctly either way.

v1.8.1

July 29, 2026

Added the ability to enable or disable a user account directly from the admin panel — a Disable User / Enable User button next to Clear PIN on the Edit User modal, and a slashed-user icon in the User Management table showing which accounts are currently disabled. This was the missing GUI-side undo for account lockouts, which previously could only be lifted by editing the database directly. Toggling requires the users.manage permission rather than just general dashboard access, since it's a more sensitive action than editing a profile field, and an admin can't disable their own account while logged in. While building it, found and fixed a real bug: the automatic "lock an account after repeated failed PIN attempts" protection never actually worked. The failed-attempts counter was spelled three different, inconsistent ways across the schema and the code that increments and checks it (FAILEDATTEMTS in the schema, FAILEDATTEMPTS in the tracking logic, FAILEDATTEMPS in a couple of user-creation defaults) — Mongoose silently drops any field an update touches that isn't declared in the schema, so the counter never actually persisted, and the lockout check was always comparing against nothing. All three now refer to the same field, and the lockout threshold — previously hardcoded to 3 — is configurable via a new PIN_RETRIES value in .env, falling back to 3 if it's missing or invalid.

v1.8.0

July 28, 2026

Added a full server-hardening stack — mod_security, mod_evasive, and fail2ban — after enabling Cloudflare's orange-cloud proxying and edge security features on 514sco.com. fail2ban includes a dedicated checkin-auth jail tuned specifically for repeated login/PIN failures, integrated with the Cloudflare API so a ban actually blocks the attacker at Cloudflare's edge — a purely local ban does nothing against Cloudflare-proxied traffic, since every visitor otherwise appears to originate from Cloudflare's own IP ranges. Getting there first meant closing real gaps in the app's own auth code: login/PIN attempts across all five auth surfaces (dashboard, admin, diagnostics, inventory, PACT) are now rate-limited per IP+account, and every attempt is written to a single-line audit log fail2ban's filter matches against. Along the way, found and fixed the admin login endpoint's rate limiter, which had been effectively disabled (1000 requests per window) and offered no real resistance to PIN brute-forcing. Added a new Security page to the admin dashboard (security.view/security.manage permissions, assignable per group) showing every IP currently banned — locally by fail2ban and/or blocked at Cloudflare's edge — with a live countdown to when each local ban expires and a one-click Unban that clears both places at once. It's restricted to trusted LAN/VPN networks at two independent layers, Apache and the app itself, so the page isn't reachable from outside even before a login is attempted, and untrusted networks now get an explained, styled page instead of a bare Forbidden response. A second tab, Activity Log, shows recent login/PIN attempts and network-restriction hits pulled directly from the app's own auth log, with a Ban button on any row for cutting off something suspicious immediately rather than waiting for it to trip fail2ban's own threshold — it flags whichever row is your own current connection so a ban can't be pointed at yourself by mistake. Diagnosed and fixed a real production incident along the way: this server sits behind pfSense running HAProxy in TCP passthrough mode, which causes every Cloudflare-forwarded connection to appear at Apache as coming from the gateway's own address rather than the real visitor. Banning that shared, misattributed address after 5 failed PIN attempts took the entire site offline for an hour, and separately meant the Security page's network allowlist was actually letting outside traffic through rather than blocking it, since the masked gateway address happened to fall inside the trusted range. Both are fixed the same way — Apache now trusts that specific gateway hop and reads the real client IP from Cloudflare's own header, which was arriving correctly the whole time and simply wasn't being consulted. Also fixed two bugs found while testing the new dashboard end-to-end: Cloudflare's API splits single-address blocks into separate IPv4 and IPv6 rule types, and the dashboard was only ever checking for IPv4 — silently hiding any IPv6 block even when it was live and visible in Cloudflare's own console; and the sudoers rule the app needs to read fail2ban's status had never actually been installed, which failed completely silently, so a real ban was invisible on the dashboard with no error shown anywhere. Both failure paths are now logged and surfaced as a visible warning instead of quietly showing an empty list.

v1.7.9

July 24, 2026

Added a Request Documents feature: a technician can now ask a customer for documentation without them ever logging in. Picking "Request documents" from the Communicate page's template dropdown generates a one-time, 48-hour upload link (built from the server's own HOSTNAME, so it always points at the right environment) and drops it into the editable message body. The customer's upload page accepts .pdf/.doc/.docx/.xls/.xlsx/.txt by default (expandable later via .env, no code changes needed), checks each file's real content against its extension (not just the browser's claimed type), and scans it with ClamAV before a technician ever sees it — files that can't be scanned are kept but clearly flagged "Unscanned" rather than silently treated as safe. Submitted files land in a staging area outside any web-servable folder until a technician reviews them from a new "Awaiting Documents" button on Workorder Details (with a pending-count badge), where they can approve a file onto Linked Documents (date/time-stamped to when the customer actually submitted it) or delete it, keeping a short audit record either way. A new documents.review permission gates who can do that review, assignable per group like other features here. Fixed two related issues found while testing on real hardware: a version mismatch where the file-type library's CommonJS release exposes its detector under a different name than expected, and ClamAV scans failing with a permission error when the upload staging folder lived under a restricted home directory — uploaded files and folders are now given explicit, predictable permissions regardless of the server's umask. Renamed "POC" to "Property Custodian" on the Communicate page and made it actually work — it previously just displayed and sent to the customer's own contact info a second time rather than a different recipient. Email Property Custodian now looks up the real equipment custodian on file (same lookup already used to CC custodians on the original check-in confirmation) and defaults unchecked, since notifying the custodian is a deliberate extra step rather than automatic. There's no SMS equivalent — custodian records only ever have email addresses on file, so that option was left out rather than added as something that could never work.

v1.7.8

July 23, 2026

Added a Cage field (5-character CAGE code, auto-uppercased/trimmed, optional) to Computers, iPads, iPhones, and Printers. It's now a pickable field in the Label Creator for all four device categories, and shows up in Inventory Management's asset edit modal with search and sortable-column support; the BECO spreadsheet import maps it in too. Format validation runs in three layers — schema, update route, and client-side check before submit. Along the way, fixed two other bugs: the iPad, iPhone, and Printer schemas were missing several fields the edit form already exposed (Manufacturer, Unit, POC, Capacity, COLOR, IMEI, IMEI2, CSN, Warranty Expiration, etc.), so edits to those fields silently failed to save with no error shown; and iPad/iPhone each had a harmless duplicate Type field, now cleaned up. Also diagnosed and fixed several Zebra label printer quality issues, using a real ZebraDesigner packet capture as ground truth. Darkness now uses the printer's absolute ~SD command instead of the relative ^MD, and the print modal's 0-15 density override now correctly scales to Zebra's native 0-30 range — previously darkness changes could look inconsistent print to print, and the UI's override never reached more than half the printer's real range. QR codes on Zebra prints were noticeably smaller than the same code on a Phomemo print; switched Zebra's QR rendering from its native ^BQ barcode command (a coarse 1-10 magnification scale with no reliable size formula) to a hand-built bitmap using the same QR data as the Phomemo path, for pixel-exact size parity between printer types. The classification banner element (the Secret/Unclassified box) no longer has "IF FOUND / PLEASE CALL <office phone>" welded into it — that text is now separate elements in the Label Creator, so each template can reposition, reword, or drop that callout independently of the classification box.

v1.7.7

July 23, 2026

Refined the digital signature feature added in 1.7.6. Signatures and their date/time stamps now preview directly on the document before saving — drag and resize a signature into place, or redo it, before Save Changes locks it in. Timestamps now show as a boxed date-on-top, time-on-bottom stamp next to each signature. Fixed signatures occasionally not appearing after save, a mislabeled "Signed" button, and a vertical placement offset that could land a manually-placed signature a bit higher than where it was dragged.

v1.7.1

July 22, 2026

Fixed a bug where a corrected AF1297 could still be sent to a customer as a stale image if the Communicate page cached an earlier version. The Communicate page's 'Include AF1297' checkbox is now a full document checklist, matching the EITaaS export page — a technician can select any linked document(s) (AF1297, warranty requests, etc.) to send, not just the 1297. Selected documents go out as real email attachments and, for text messages, as MMS images; templated documents like AF1297 are regenerated fresh at send time rather than reused from a cached file, so edits are always reflected. The initial check-in confirmation send also now regenerates its AF1297 image fresh before sending. Also fixed a bug where printing an equipment label to a Zebra printer failed with a 'typeLabel is not defined' error (Phomemo printing was unaffected).

v1.7.0

July 21, 2026

AF1297 'Issued By'/'Issued To' reversal (for issues like SIPR token pickup where SCO hands equipment to the customer rather than the reverse) is now a 'Reverses Issued By/To' toggle on each issue in the admin Issues manager, replacing a hardcoded list of issue IDs — new issues that need this no longer require a code change. Added per-issue serial number format enforcement: an 'Enforce Serial Format' toggle on each issue, with an optional custom pattern (e.g. a fixed token format) or a fallback to the app's default 6-30 character format; turning enforcement off accepts any serial number. This applies consistently on workorder creation, when adding equipment from Workorder Details, and on the server. Fixed the printed equipment label's phone number overlapping the MAC address, added the missing navigation menu to the Manual Check-In page, and widened two admin dashboard modals (Issue Editor and Issues Management) so their content no longer requires horizontal scrolling.

v1.6.9

July 21, 2026

Added network auto-discovery for label printers: a new Discover Printers button on the admin dashboard scans a configurable subnet for devices listening on port 9100, identifies each one as TSPL (Phomemo) or ZPL (Zebra) by querying it directly, and optionally checks mDNS as a faster path for Zebra printers. Results can be sent straight into the Add Printer form with one click instead of typing IPs in by hand. Also gave Label Sizes the same export/import/bulk-delete tools the printer registry already had — checkboxes, select-all, and Export/Import/Delete Size(s) buttons, using a self-contained .labelsize file — so label sizes can move between the dev and production sites the same way printers do. A new printers.discover permission gates the network scan, grantable independently per group like the other printer permissions.

v1.6.8

July 21, 2026

Added a per-device Settings section to the hamburger menu (above About) with two toggles: Dark Mode and Play Check-In Greeting. Both are stored in the browser's local storage rather than tied to a login, so they're unique to that computer — clearing cookies won't reset them, and an unconfigured device keeps behaving exactly as before (light theme, greeting on). Dark mode is applied as early as possible on page load to avoid a flash of light mode, and reaches every page that includes the hamburger menu via a shared theme stylesheet, with additional overrides added to the check-in, work order creation, work order details, and technician dashboard pages for elements that needed page-specific dark styling. Status, priority, and technician badges keep their normal colors in dark mode since they carry meaning. The greeting toggle sits underneath the existing site-wide greeting setting — both need to be on for the spoken greeting to play on a given device.

v1.6.7

July 21, 2026

Label printing feature complete. Technicians can print equipment labels straight from Workorder Details for Phomemo (TSPL, bitmap-rendered) and Zebra (ZPL, native commands) printers over raw TCP — each label shows device type, QR code, serial, unit, and MAC (computers only), with a per-item Secret/Unclassified toggle. The print modal now includes a live preview before anything is sent to a printer, per-item copies, and per-job DPI/Speed/Density/Invert Colors overrides that apply for that print run only. Printer configuration moved from a static config file into MongoDB, managed from a new Label Printers card on the Admin Dashboard: printers reference reusable named label-size presets, can be duplicated as a starting point for adding a similar printer, and can be exported/imported as .labelprinter files (or bulk-deleted) to make moving configs between the dev and production sites straightforward. Five new permissions back all of this — workOrders.printLabels for using a printer, and printers.create/update/delete/export/import for managing the registry — each grantable independently per group. Also fixed a bug where labels for equipment added to a ticket via the Equipment modal wouldn't show up in Print Labels until the page was refreshed; the print modal now always reads the ticket's current serial numbers instead of a stale copy from when the page first loaded.

v1.6.6

July 19, 2026

Fixed group permission changes silently failing to save. models/schemas/UserGroup.js defines group permissions as a strict, explicitly-listed nested schema, and the recently added workOrders.reassign, workOrders.unassign, and system.admin permissions were never added to it — Mongoose's default strict mode was quietly dropping those fields on every save with no error shown, so checking them in the group editor appeared to work but never actually persisted. Added the missing fields to the schema and verified every permission defined in utils/rbac.js now has a matching schema path, so this class of bug can't happen unnoticed again for any current permission.

v1.6.5

July 19, 2026

Fixed a bug where assigning a work order to a technician could fail with "Selected user does not have permission to be assigned work orders" even after granting every permission visible in the group editor — workOrders.assign was enforced in code but had no checkbox anywhere in the UI, making it impossible to grant. Audited the full permission list against the group editor and added 13 missing permission checkboxes, organized under new category subheadings (Work Orders, Users, Groups, Inventory, System, PACT). Also split the overloaded workOrders.assign permission into three distinct permissions: Be Assigned Work Orders (eligibility to receive an assignment), Assign / Reassign Work Orders (perform the action), and a new Unassign Work Orders permission. Added an Unassign button to the Workorder Details page, next to Assign, disabled whenever a ticket has no assignee, letting a ticket be released back to the pool if the assigned technician can't complete it.

v1.6.4

July 19, 2026

Housekeeping: archived retired linked-document templates (checklist.ejs, ComputerReImage.ejs, and their associated JS/CSS) now that the PDF-based reimage checklist and warranty request workflows replace them — verified first that ComputerReImage-data.js is still a live dependency of the new PDF checklist feature and left it in place. Also traced and archived several other dead files after confirming nothing in the codebase references them: the misspelled templetes/ folder of source forms, the one-off backups/ snapshot folder, middleware/auth.js (superseded by middleware/adminAuth.js), and public/js/workorder_create.old.js. Everything moved to an archive/ folder at the project root rather than being deleted outright, so it can be verified nothing broke before removing it for good.

v1.6.3

July 19, 2026

Added an HP and Dell warranty request workflow as a new linked document type. Editable warranty request PDFs are generated from the original fillable HP or Dell template (selected automatically by manufacturer), with a separate document created per equipment serial number named Warranty_Request-[Serial Number]. Equipment, warranty, and work-order information is populated automatically, including the operating system version (read from SDC_VERSION), the document creator as the primary onsite contact, OFFICE_PHONE_NUMBER as the shared commercial contact number, and technician-specific email and mobile contact details. HP requests are sent to usafEmail and Dell requests to usafEmail1, with the sending technician, office, a configured alternate contact, the primary custodian, and custodian alternates all CC'd (custodian recipients are resolved per-document from that document's equipment serial number), and duplicate recipients are removed automatically. The linked-document email dialog now also supports multiple CC addresses.

v1.6.2

July 19, 2026

Added editable, per-serial computer reimage checklist PDFs as a new linked document type. Checklists are generated from the official fillable PDF template, with one document created per device serial number and named ComputerReImageChecklist-[Serial Number]. Fields are pre-populated from workorder and device lookup data, and the original checklist layout and fillable PDF fields are preserved, so the document editor can open, edit, and save PDF fields directly (with same-origin PDF previews) rather than only plain HTML documents. Also added direct PDF printing and export, and PDF-backed checklists now rasterize correctly to JPG export using Poppler. Existing HTML linked-document behavior is unchanged.

v1.6.1

July 19, 2026

Site-wide visual consistency pass: added the hamburger menu and a clickable home logo to every page that was missing them (Workorder Details, EITaaS, Communicate, Linked Documents, Unmatched Messages triage inbox, and all PACT TECH Refresh pages), so navigation now works the same everywhere. Fixed the PACT TECH Refresh Home page’s hamburger icon rendering invisible — it depends on Font Awesome, which that page (and PIN Verification and Export Confirm) never loaded. Nudged logos on pages like EITaaS so they no longer sit underneath the fixed hamburger icon. Fixed the Change PIN, About, and Virtual CAC modals’ Close buttons, which were cut off or washed-out on any page that also loads Bootstrap (technician dashboard, login, etc.) — traced through three collisions where Bootstrap’s own .modal-content and .btn-close classes silently filled in display, width/height, and opacity properties these custom modals never declared themselves. Also fixed the About modal’s Close button overflowing past the modal’s edge on those same pages. Also added this Release Notes page.

v1.6.0

July 19, 2026

Two-way SMS/MMS and email communication with customers: reply directly from the Communicate page (new MMS/Email/History tabs), inbound Twilio and Mailgun webhooks with signature validation, automatic matching of replies to the correct workorder, and a triage inbox for anything that can’t be auto-matched. Communicate access is now split into separate SMS and Email permissions, assignable per group. Linked documents now show a full date and time (configurable timezone) instead of just a date. AF1297 is generated automatically at workorder creation instead of only on manual request or every notification send. EITaaS export now lets you pick which linked documents to attach, with a select-all toggle. Resending notifications now automatically CCs the equipment custodian(s) and the office box for computer/printer workorders. Added a spoken Microsoft Azure voice greeting on check-in, addressing customers by full rank and name, configurable via GREETING and GREETINGSTATEMENT. Plus several underlying fixes: inbound message matching now correctly requires DOD ID and PIV together, ambiguous matches resolve to the most recently active conversation, outbound email HTML now displays correctly, a data-attribute escaping bug that could break the Communicate page was fixed, and the Content-Security-Policy was updated to allow the greeting audio to play.

v1.5.1

June 14, 2026

Added the PACT Package Explorer: a browsable view of a TECH Refresh’s generated files with workspace summary statistics (rows, files, PDFs, total size, missing files), search with auto-expand across both Package Explorer and TECH Refresh Home, an embedded PDF preview modal, per-file view/download/print actions, download-all and print-all for AF1297 and Checklist packages, and missing-file detection that disables actions for documents that aren’t available.

v1.5.0

June 13, 2026

Groundwork for the Package Explorer feature: generated AF1297 and TECH Refresh Checklist PDFs are now saved to disk individually (not just bundled inside ZIP archives) during package generation, with their file names and paths recorded on the job, so individual PDFs can be viewed, downloaded, and printed without extracting a ZIP.

v1.0.0

June 15, 2025

Initial deployment. Detailed release notes weren’t tracked yet at this point — this entry marks the starting point of the system’s history.