diff --git a/html/admin.html b/html/admin.html
index 470e610..cb84d95 100644
--- a/html/admin.html
+++ b/html/admin.html
@@ -34,12 +34,12 @@
/* Every container admin.js paints a table into is a scrollport of its own, so a
sticky header always has something to stick to rather than sliding up behind
the app bar. Same rule as console.css's .tscroll. */
- #comments-admin, #audit-admin, #notif-box, #usage-admin, #projects-table, #defmem-table{
+ #comments-admin, #audit-admin, #notif-box, #usage-admin, #activity-admin, #projects-table, #defmem-table{
overflow:auto; max-height:min(70vh,640px); overscroll-behavior:contain; }
/* If admin.js wraps its table in its own .tscroll, the outer box steps aside so
one table never ends up with two scrollbars. */
#comments-admin:has(.tscroll), #audit-admin:has(.tscroll), #notif-box:has(.tscroll),
- #usage-admin:has(.tscroll), #projects-table:has(.tscroll), #defmem-table:has(.tscroll){
+ #usage-admin:has(.tscroll), #activity-admin:has(.tscroll), #projects-table:has(.tscroll), #defmem-table:has(.tscroll){
overflow:visible; max-height:none; }
/* Comment text and audit detail are the two columns you are actually here to
@@ -53,7 +53,7 @@
border:1px solid var(--border-strong); border-radius:0; margin-bottom:var(--s3); }
@media (max-width:900px){
- #comments-admin, #audit-admin, #notif-box, #usage-admin, #projects-table, #defmem-table{
+ #comments-admin, #audit-admin, #notif-box, #usage-admin, #activity-admin, #projects-table, #defmem-table{
max-height:none; }
}
@@ -175,7 +175,41 @@
Click refresh to load.
-
+
+
+
Activity & usage
+
Who is using the suite, which tools, and how often — recorded server-side on every
+ sign-in and page open, kept indefinitely. Filter below, or export a CSV: raw (real usernames) for
+ internal use, or sanitized (each user replaced with a stable, non-reversible id) for feeding into
+ Power BI or another external reporting tool without carrying real identities.
+
+
+
+
+
+
+
+
+
+
+
+
Loading…
+
+
+
+
+
+
+
+
Usage logs
Engagement recorded by both tools — the work package creator and the SOP wizard —
diff --git a/html/admin.js b/html/admin.js
index f339bd1..e1a5934 100644
--- a/html/admin.js
+++ b/html/admin.js
@@ -24,6 +24,7 @@ function reveal(){
loadNotifications();
loadComments();
loadAudit();
+ loadActivity();
loadUsage();
}
function showDenied(){
@@ -189,6 +190,19 @@ async function loadProjects(){
banner.style.display='none';
_adminProjects = json;
renderProjects();
+ populateActivityProjectFilter();
+}
+
+// The activity project filter reuses the same project list the Projects card
+// already fetched — no second /api/projects call just to fill a