diff --git a/WORKITEMS.md b/WORKITEMS.md
new file mode 100644
index 0000000..b0a93c1
--- /dev/null
+++ b/WORKITEMS.md
@@ -0,0 +1,38 @@
+# Shared Work Items
+
+Tag yourself to claim. Check off when done. Add new items at the bottom of the relevant section.
+
+**Syntax:** `- [ ] Description — @mike/@howard/@unassigned | added YYYY-MM-DD`
+
+---
+
+## Active
+
+- [ ] Deploy session manager to SAGE-SQL (IIS app, Windows Auth) — files ready at `clients/dataforth/session-manager/` — @mike | added 2026-04-17
+- [ ] Cascades Synology (cascadesds) — get admin creds, add to vault — @howard | added 2026-04-17
+- [ ] Howard Gitea account — create via web UI at git.azcomputerguru.com — @mike | added 2026-04-16
+- [ ] desertrat.com — add DMARC p=reject + harden SPF on Route 53 (need AWS access) — @unassigned | added 2026-04-17
+- [ ] desertrat.com — long-term migration from WebSvr to IX + MailProtector — @unassigned | added 2026-04-17
+- [ ] MVAN other domains — only mvaninc.com has DMARC; client has other domains needing protection — @unassigned | added 2026-04-17
+- [ ] Glaztech Syncro ticket #32165 — timer entry billed wrong (should be comment+time); fix in Syncro GUI — @mike | added 2026-04-17
+- [ ] jparkinsonaz.com certbot — retry autodiscover cert once A record TTL expires — @unassigned | added 2026-04-17
+- [ ] Neptune jparkinson password — set to jP$48504850, verify mail working — @unassigned | added 2026-04-17
+- [ ] Len's Auto Brokerage — deploy GuruRMM v0.6.1 to 10 Windows endpoints — @mike | added 2026-04-16
+- [ ] GuruRMM server migration 5 — sqlx checksum drift blocks new server build — @mike | added 2026-04-16
+- [ ] Jupiter Windows VM — Server 2022 build worker for MSI CI — @unassigned | added 2026-04-16
+- [ ] Cloudflare SXG — disable via dashboard (API tokens lack scope), auto-removes June 23 — @unassigned | added 2026-04-17
+- [ ] GrepAI index — run `grepai watch` to build semantic search index — @unassigned | added 2026-04-16
+
+## Completed
+
+_Move items here when done. Keep for 30 days then delete._
+
+---
+
+## How to use
+
+- **Claim:** change `@unassigned` to your name
+- **Add:** append to Active section with today's date
+- **Complete:** move to Completed with date: `- [x] Description — @mike | done 2026-04-18`
+- **Claude:** say "show work items" or "add work item: ..." and Claude reads/updates this file
+- **Sync:** items sync via `/sync` like everything else
diff --git a/clients/dataforth/session-manager/Default.aspx b/clients/dataforth/session-manager/Default.aspx
new file mode 100644
index 0000000..d26027b
--- /dev/null
+++ b/clients/dataforth/session-manager/Default.aspx
@@ -0,0 +1,381 @@
+<%@ Page Language="C#" AutoEventWireup="true" %>
+<%@ Import Namespace="System.Diagnostics" %>
+<%@ Import Namespace="System.Text.RegularExpressions" %>
+<%@ Import Namespace="System.Collections.Generic" %>
+<%@ Import Namespace="System.Web.Security" %>
+
+
+
+
+
+
+ Session Manager — SAGE-SQL
+
+
+
+
+
+
+
+
Signed in as <%= currentDisplayName %>
+
Refresh
+
+
+ <% if (!string.IsNullOrEmpty(statusMessage)) { %>
+
<%= Server.HtmlEncode(statusMessage) %>
+ <% } %>
+
+ <% if (userSessions.Count > 0) { %>
+
+
+
+ | Session |
+ State |
+ ID |
+ Action |
+
+
+
+ <% foreach (var s in userSessions) { %>
+
+ | <%= string.IsNullOrEmpty(s.SessionName) ? "RemoteApp" : Server.HtmlEncode(s.SessionName) %> |
+
+ ">
+ <%= s.State == "Disc" ? "Disconnected" : s.State %>
+
+ |
+ #<%= s.Id %> |
+
+ <% if (s.CanReset) { %>
+ Reset
+ <% } else { %>
+ Active
+ <% } %>
+ |
+
+ <% } %>
+
+
+ <% } else { %>
+
+
✓
+
No sessions found for your account.
You're all clear.
+
+ <% } %>
+
+
+
+
+
diff --git a/clients/dataforth/session-manager/web.config b/clients/dataforth/session-manager/web.config
new file mode 100644
index 0000000..ea2b968
--- /dev/null
+++ b/clients/dataforth/session-manager/web.config
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/session-logs/2026-04-17-session.md b/session-logs/2026-04-17-session.md
index b070a63..75aff4b 100644
--- a/session-logs/2026-04-17-session.md
+++ b/session-logs/2026-04-17-session.md
@@ -215,3 +215,49 @@ Built `/syncro` slash command for ticket management via Syncro REST API.
- Ollama URL: `http://100.92.127.64:11434`
- Firewall: inbound TCP 11434 from 100.0.0.0/8 only
- Env var: `OLLAMA_HOST=0.0.0.0:11434` (User scope on DESKTOP-0O8A1RL)
+
+---
+
+## Update: 20:00 — SAGE-SQL session manager, shared work items
+
+### Dataforth SAGE-SQL session manager — built, not yet deployed
+Built self-service session reset web app for Dataforth users on SAGE-SQL (192.168.0.153, Windows Server 2016).
+
+**Problem:** Users connect via RemoteApps to SAGE. Sessions hang/disconnect and require IT to remote in and logoff sessions manually.
+
+**Solution:** Single-file ASP.NET WebForms app (`Default.aspx` + `web.config`) that:
+- Uses Windows Authentication (auto-identifies domain user, no login needed)
+- Shows only the authenticated user's own RDP/RemoteApp sessions
+- Only allows resetting disconnected ("Disc") sessions, not active ones
+- Confirmation prompt before reset
+- Logs all reset actions to monthly log files at `~/logs/YYYY-MM.log`
+- Dark themed UI
+
+**Files:**
+- `clients/dataforth/session-manager/Default.aspx` — full app (server-side C# + HTML/CSS)
+- `clients/dataforth/session-manager/web.config` — IIS config (Windows Auth on, Anonymous off)
+
+**Deployment blocked:** VPN connectivity issues — SSH to AD2 times out (ICMP works, TCP blocked), WinRM to SAGE-SQL blocked, RMM API at 172.16.3.30:3001 unreachable. Deferred to next session.
+
+**Deployment steps (for tomorrow):**
+1. Create `C:\inetpub\sessions\` on SAGE-SQL
+2. Copy Default.aspx + web.config to that directory
+3. Create IIS application: `New-WebApplication -Name "sessions" -Site "Default Web Site" -PhysicalPath "C:\inetpub\sessions" -ApplicationPool "DefaultAppPool"`
+4. Verify Windows Auth enabled, Anonymous Auth disabled
+5. Test at `http://sage-sql/sessions/`
+6. App pool identity (NetworkService) should have permission to run `logoff` command
+
+**WinRM TrustedHosts updated:** Added `192.168.0.153,SAGE-SQL` to local TrustedHosts for future NTLM auth (workstation not domain-joined).
+
+### Shared work items board — created
+Created `WORKITEMS.md` at repo root — shared task list that syncs via Gitea.
+- Both Mike and Howard can add/claim/complete items
+- Uses `@mike`/`@howard`/`@unassigned` tagging
+- Populated with all carry-over items from this session and previous days
+- Claude can read/update it on request ("show work items", "add work item: ...")
+
+### Network issues (end of day)
+- AD2 (192.168.0.6): ICMP ping works (23-46ms), SSH port 22 times out
+- SAGE-SQL (192.168.0.153): WinRM port 5985 unreachable from workstation
+- RMM server (172.16.3.30:3001): connection times out
+- Likely VPN/firewall filtering TCP but passing ICMP