First load:
- Draw the Overview as soon as the data arrives instead of on its next
2-second timer tick (about 2.5 s to 0.6 s on a typical connection).
- Start on DOMContentLoaded instead of window.onload.
- Load the ~900 KB PDF library only when someone exports a PDF.
- Fetch the startup files side by side, and build the docs search index
after the dashboard has drawn (unless the visit starts on /docs).
- Show a loading placeholder on the Overview until the data arrives.
Demo: the date-batch tags sit on fixed working-day offsets from today.
The seed records them in Demo-Dates.json and the worker relabels them when
the day changes, so a long-running container never looks stale.
- Jump sheet: Top / Middle / Bottom with the Card fields arrows; the Jump
button uses the same bold arrows.
- Container timezone defaults to America/Chicago (TZ in Dockerfile/compose).
- Demo worker follows its own business hours (Demo.BusinessHours, default
06:00-21:00 every day) with the midnight pitstop; the simulated cycle in
the browser shows the real worker's next run.
- Jump (phones / tablets): find a device by name and scroll to its card, or
jump to a section, the top or the bottom of the page.
- Documentation on phones: long paths, links, code and tables wrap; toolbar is
title, last edited, then the buttons.
- Filter bar's Clear is the only clear button on phones.
- Card fields: search box and add list as wide as the field rows.
- Presence sweep: the demo uses the hourly schedule too, and the last sweep
time survives a worker restart (a restart used to trigger an extra sweep).
- Worker publishes the rows swept so far every few seconds (LivePublishSeconds)
with a DataVersion stamp; the dashboard reloads on each new version, so
tables, the Overview and open dialogs update mid-cycle. Shared files are
written to a temp file and swapped in, so readers never see half a file.
- Phones / tablets: one Filter & sort button opens a column list instead of a
row of chips, on every table.
- Details: a wrapped Simple / Advanced toggle sits on the left.
- Card fields: fixed-height dialog; field list and add list share it evenly.
- Source Devices in the undocumented-apps list filters by device name, like
the software columns; Devices and the action column take less room.
- Drop the one-click documented pick (Documented + Only ticked does it).
- Stage legend underline spans label and number.
- Device details title stays on one line; the name truncates instead.
- Presence sweep also pings devices under Skip USMT tags.
- Every nav page has its own address (/tracked, /status, /devices, ...);
the logo and name go to the Overview; back/forward work.
- List filters gain an "Only ticked" mode; software columns get a one-click
"devices with only documented apps" pick and an easiest-first sort.
- Overview: the device list uses the dashboard's table header (sticky, with
Excel filters); what opened it is clearly highlighted; locations colored by
how much is done (red to green); stages read red / amber / green.
- Details: one-line title bar; presence and monitors only in Advanced View.
- Presence sweep pings only completed pairs (everything else is pinged by
the sweep itself), hourly and at midnight.
- Custom View scrollbar smaller, in the table header blue.
- Docs: no sideways scroll in the article list; no blank lines around code.
Worker: pings every tracked device on a presence sweep (hourly in business
hours plus midnight) and records last online; inventory reports whether a
device was found in AD and SCCM; monitors from WmiMonitorID; snapshots of
the last reachable state replace "Cached"; newly tracked devices are swept
and published first; totals count source devices only; per-type timing in
Worker-State.
Front end: details dialog shows presence, reasons instead of N/A,
"Waiting for worker...", monitors and snapshot times, and refreshes in
place; Custom View gains Days Offline, Last Online, Found In and monitor
columns; manual pair changes show immediately; sync dialog shows timing by
type. Custom View gets a large scrollbar; "Exactly ticked" filter.
Remove all environment-specific data and make the dashboard adoptable
anywhere, then add a demo that runs the real PowerShell services.
- Strip cached device data, internal knowledge-base articles and
screenshots, server/site names and the old project notes; replace the
knowledge base with generic sample articles and diagrams
- Move every environment value into Config/usmt-dash.psd1
- Route all infrastructure access in the worker and Get-Software.ps1
through a provider (Providers/SCCM.ps1), with a config-driven asset
inventory view instead of a hard-coded custom class
- Add Providers/Demo.ps1: a deterministic simulated fleet whose
migrations progress in real time, and Demo/New-DemoData.ps1 to seed it
- Server: -Demo makes the API read-only; add get-config and get-logs;
serve static files only from web/, Documentation/ and an allowlist of
Data/ files with a path-traversal guard; gzip large responses
- Mirror both services' console output to Data/Logs via a Write-Host
proxy, and add a terminal panel to the dashboard that streams it
- Demo sandbox (web/demo/demo.js): visitor changes to tags, articles and
images are kept in the visitor's browser and echoed in the terminals;
nothing a visitor does reaches the server
- Vendor marked, highlight.js and html2pdf.js instead of loading CDNs
- Dockerfile and compose file for hosting the demo (Coolify-ready)