[object Object]

← back to Sample Followup Sweep

Console: re-request detection + initial-request date, expandable item detail, pinned port

55d687941a6cc512a2b1355f5a144c25840c7815 · 2026-08-14 13:43:36 -0700 · Steve Abrams

Files touched

Diff

commit 55d687941a6cc512a2b1355f5a144c25840c7815
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Fri Aug 14 13:43:36 2026 -0700

    Console: re-request detection + initial-request date, expandable item detail, pinned port
---
 data/fleet.json        | 641 ++++++++++++++++++++++++++++++++++++++-----------
 scripts/build-fleet.js |  17 +-
 server.js              |  31 ++-
 3 files changed, 538 insertions(+), 151 deletions(-)

diff --git a/data/fleet.json b/data/fleet.json
index 3fd5bb1..7c83554 100644
--- a/data/fleet.json
+++ b/data/fleet.json
@@ -15,87 +15,124 @@
           "dw": "DWKK123171",
           "client": "Emily Guth",
           "age": 53,
-          "req": "06/22/2026"
+          "req": "06/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/22/2026"
         },
         {
           "mfr": "PCL7033 Prête-Moi Ta Plume! Feather Panel 02",
           "dw": "EUR80616",
           "client": "Peyton Pawlicki",
           "age": 43,
-          "req": "07/02/2026"
+          "req": "07/02/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/02/2026"
         },
         {
           "mfr": "FRL5229/01",
           "dw": "RALPH1077",
           "client": "Jay RInehart",
           "age": 36,
-          "req": "07/09/2026"
+          "req": "07/09/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/09/2026"
         },
         {
           "mfr": "PJD6009/01",
           "dw": "DWDG987895",
           "client": "Alia Garcia",
           "age": 32,
-          "req": "07/13/2026"
+          "req": "07/13/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/13/2026"
         },
         {
           "mfr": "P555-17-Ajanta Plaster",
           "dw": "EUR90140",
           "client": "Christine Levy",
           "age": 30,
-          "req": "07/15/2026"
+          "req": "07/15/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/15/2026"
         },
         {
           "mfr": "P555-16-Ajanta Plaster",
           "dw": "EUR90139",
           "client": "Christine Levy",
           "age": 30,
-          "req": "07/15/2026"
+          "req": "07/15/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/15/2026"
         },
         {
           "mfr": "PCL7033-02",
           "dw": "EUR80616",
           "client": "The Hunter House",
           "age": 28,
-          "req": "07/17/2026"
+          "req": "07/17/2026",
+          "reRequested": true,
+          "timesRequested": 2,
+          "initialReq": "07/17/2026"
         },
         {
           "mfr": "PDG646/07",
           "dw": "EUR70041",
           "client": "Margie Pesicka",
           "age": 28,
-          "req": "07/17/2026"
+          "req": "07/17/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/17/2026"
         },
         {
           "mfr": "PCL7033-02",
           "dw": "EUR80616",
           "client": "The Hunter House",
           "age": 25,
-          "req": "07/20/2026"
+          "req": "07/20/2026",
+          "reRequested": true,
+          "timesRequested": 2,
+          "initialReq": "07/17/2026"
         },
         {
           "mfr": "FRL5217/01",
           "dw": "RALPH1007",
           "client": "Kathiann Crews",
           "age": 24,
-          "req": "07/21/2026"
+          "req": "07/21/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/21/2026"
         },
         {
           "mfr": "W7780-13-Regency Flock Velvet Stripe-Red",
           "dw": "EUR71111",
           "client": "Charlotte Harrison",
           "age": 23,
-          "req": "07/22/2026"
+          "req": "07/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/22/2026"
         },
         {
           "mfr": "Belles Rives WALLPAPER",
           "dw": "DWBW600417",
           "client": "Charlotte Harrison",
           "age": 23,
-          "req": "07/22/2026"
+          "req": "07/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/22/2026"
         }
       ],
-      "count": 12
+      "count": 12,
+      "reReqCount": 2
     },
     {
       "slug": "spn",
@@ -107,80 +144,114 @@
           "dw": "DIG441001V",
           "client": "Jacqueline Edwards",
           "age": 60,
-          "req": "06/15/2026"
+          "req": "06/15/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/15/2026"
         },
         {
           "mfr": "Dig-700005-25-type-2-vinyl",
           "dw": "Dig700005",
           "client": "SEND 2ND DAY SAMPLES*** Marnie Ann Stebner",
           "age": 60,
-          "req": "06/15/2026"
+          "req": "06/15/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/15/2026"
         },
         {
           "mfr": "DIG624430Spn:20481474",
           "dw": "DIG624430",
           "client": "Andrew B Steinau",
           "age": 24,
-          "req": "07/21/2026"
+          "req": "07/21/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/21/2026"
         },
         {
           "mfr": "DIG-624415 SPN: 20275385",
           "dw": "DIG624415-25 vinyl",
           "client": "Andrew B Steinau",
           "age": 24,
-          "req": "07/21/2026"
+          "req": "07/21/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/21/2026"
         },
         {
           "mfr": "DIG_977030 spn: 22827698",
           "dw": "DIG977030",
           "client": "Charlotte Harrison",
           "age": 23,
-          "req": "07/22/2026"
+          "req": "07/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/22/2026"
         },
         {
           "mfr": "DIG623071 (SPN#DIG623071 SPN#(13656114)",
           "dw": "DIG623071-25-vin",
           "client": "Charlotte Harrison",
           "age": 23,
-          "req": "07/22/2026"
+          "req": "07/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/22/2026"
         },
         {
           "mfr": "SUNSHINE-MODE-PLAID-WALLPAPER spn:22827966",
           "dw": "DIG240013",
           "client": "Charlotte Harrison",
           "age": 23,
-          "req": "07/22/2026"
+          "req": "07/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/22/2026"
         },
         {
           "mfr": "DIG-74795SM",
           "dw": "DIG74795SM",
           "client": "Charlotte Harrison",
           "age": 23,
-          "req": "07/22/2026"
+          "req": "07/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/22/2026"
         },
         {
           "mfr": "DIG_74793sm",
           "dw": "DIG74793",
           "client": "Charlotte Harrison",
           "age": 23,
-          "req": "07/22/2026"
+          "req": "07/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/22/2026"
         },
         {
           "mfr": "90026",
           "dw": "WPEX90026",
           "client": "Charlotte Harrison",
           "age": 23,
-          "req": "07/22/2026"
+          "req": "07/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/22/2026"
         },
         {
           "mfr": "60400",
           "dw": "WPEX60400",
           "client": "Charlotte Harrison",
           "age": 23,
-          "req": "07/22/2026"
+          "req": "07/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/22/2026"
         }
       ],
-      "count": 11
+      "count": 11,
+      "reReqCount": 0
     },
     {
       "slug": "green",
@@ -192,52 +263,74 @@
           "dw": "GRS800010",
           "client": "Janet Gaza Kolb",
           "age": 23,
-          "req": "07/22/2026"
+          "req": "07/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/22/2026"
         },
         {
           "mfr": "BX10180",
           "dw": "PWV10180",
           "client": "Donna Horner",
           "age": 21,
-          "req": "07/24/2026"
+          "req": "07/24/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/24/2026"
         },
         {
           "mfr": "H172NG5083",
           "dw": "PWV500960",
           "client": "JRP Design & Remodel, Inc.",
           "age": 15,
-          "req": "07/30/2026"
+          "req": "07/30/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/30/2026"
         },
         {
           "mfr": "S300NQ8242",
           "dw": "Cork501520",
           "client": "JRP Design & Remodel, Inc.",
           "age": 15,
-          "req": "07/30/2026"
+          "req": "07/30/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/30/2026"
         },
         {
           "mfr": "S300NQ8243",
           "dw": "Cork501530",
           "client": "JRP Design & Remodel, Inc.",
           "age": 15,
-          "req": "07/30/2026"
+          "req": "07/30/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/30/2026"
         },
         {
           "mfr": "S176NQ8341",
           "dw": "Cork501390",
           "client": "JRP Design & Remodel, Inc.",
           "age": 15,
-          "req": "07/30/2026"
+          "req": "07/30/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/30/2026"
         },
         {
           "mfr": "G0174NQ8330",
           "dw": "Cork500620",
           "client": "JRP Design & Remodel, Inc.",
           "age": 15,
-          "req": "07/30/2026"
+          "req": "07/30/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/30/2026"
         }
       ],
-      "count": 7
+      "count": 7,
+      "reReqCount": 0
     },
     {
       "slug": "kra",
@@ -249,52 +342,74 @@
           "dw": "DWKK134939",
           "client": "Lisa McIlhenny FEDEX",
           "age": 18,
-          "req": "07/27/2026"
+          "req": "07/27/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/27/2026"
         },
         {
           "mfr": "2019101.313.0",
           "dw": "DWKK134938",
           "client": "Lisa McIlhenny FEDEX",
           "age": 18,
-          "req": "07/27/2026"
+          "req": "07/27/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/27/2026"
         },
         {
           "mfr": "F1562/04.CAC.0",
           "dw": "DWKK119396",
           "client": "Lisa McIlhenny FEDEX",
           "age": 18,
-          "req": "07/27/2026"
+          "req": "07/27/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/27/2026"
         },
         {
           "mfr": "F1562/02.CAC.0",
           "dw": "DWKK119394",
           "client": "Lisa McIlhenny FEDEX",
           "age": 18,
-          "req": "07/27/2026"
+          "req": "07/27/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/27/2026"
         },
         {
           "mfr": "GWP-3415.16.0",
           "dw": "DWKK139575",
           "client": "Denise Duggan",
           "age": 17,
-          "req": "07/28/2026"
+          "req": "07/28/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/28/2026"
         },
         {
           "mfr": "ALTHEA COTTON P.CITRON.0",
           "dw": "DWKK142456",
           "client": "Kristiina Sutherland",
           "age": 11,
-          "req": "08/03/2026"
+          "req": "08/03/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "08/03/2026"
         },
         {
           "mfr": "ALTHEA LINEN PR.CITRON.0",
           "dw": "DWKK142457",
           "client": "Kristiina Sutherland",
           "age": 11,
-          "req": "08/03/2026"
+          "req": "08/03/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "08/03/2026"
         }
       ],
-      "count": 7
+      "count": 7,
+      "reReqCount": 0
     },
     {
       "slug": "sca",
@@ -306,38 +421,54 @@
           "dw": "DWA89306",
           "client": "Michelle kungis",
           "age": 45,
-          "req": "06/30/2026"
+          "req": "06/30/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/30/2026"
         },
         {
           "mfr": "SC WP88355D 0006",
           "dw": "DWA82596",
           "client": "Leah E Ramsay",
           "age": 34,
-          "req": "07/11/2026"
+          "req": "07/11/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/11/2026"
         },
         {
           "mfr": "wh000013326",
           "dw": "DWA88957",
           "client": "GoldLeaf Interior",
           "age": 23,
-          "req": "07/22/2026"
+          "req": "07/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/22/2026"
         },
         {
           "mfr": "wtt661518",
           "dw": "DWA88660",
           "client": "GoldLeaf Interior",
           "age": 23,
-          "req": "07/22/2026"
+          "req": "07/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/22/2026"
         },
         {
           "mfr": "CL WP26420 0003",
           "dw": "DWA89455",
           "client": "Lisa McIlhenny FEDEX",
           "age": 18,
-          "req": "07/27/2026"
+          "req": "07/27/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/27/2026"
         }
       ],
-      "count": 5
+      "count": 5,
+      "reReqCount": 0
     },
     {
       "slug": "wq",
@@ -349,38 +480,54 @@
           "dw": "GLM4134",
           "client": "Margie Pesicka",
           "age": 28,
-          "req": "07/17/2026"
+          "req": "07/17/2026",
+          "reRequested": true,
+          "timesRequested": 2,
+          "initialReq": "07/17/2026"
         },
         {
           "mfr": "FISHNET-SEQUIN-GLITTER-WALLCOVERING-BLACK-COPPER",
           "dw": "GLM4134",
           "client": "Margie Pesicka",
           "age": 28,
-          "req": "07/17/2026"
+          "req": "07/17/2026",
+          "reRequested": true,
+          "timesRequested": 2,
+          "initialReq": "07/17/2026"
         },
         {
           "mfr": "LN50035",
           "dw": "GRS800776",
           "client": "JRP Design & Remodel, Inc.",
           "age": 15,
-          "req": "07/30/2026"
+          "req": "07/30/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/30/2026"
         },
         {
           "mfr": "LN50083-1",
           "dw": "GRS800956",
           "client": "JRP Design & Remodel, Inc.",
           "age": 15,
-          "req": "07/30/2026"
+          "req": "07/30/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/30/2026"
         },
         {
           "mfr": "LN50084",
           "dw": "DWC50084",
           "client": "JRP Design & Remodel, Inc.",
           "age": 15,
-          "req": "07/30/2026"
+          "req": "07/30/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/30/2026"
         }
       ],
-      "count": 5
+      "count": 5,
+      "reReqCount": 2
     },
     {
       "slug": "thi",
@@ -392,31 +539,44 @@
           "dw": "ROP73313",
           "client": "Haley McKinley",
           "age": 39,
-          "req": "07/06/2026"
+          "req": "07/06/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/06/2026"
         },
         {
           "mfr": "",
           "dw": "ROP73020",
           "client": "Haley McKinley",
           "age": 39,
-          "req": "07/06/2026"
+          "req": "07/06/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/06/2026"
         },
         {
           "mfr": "",
           "dw": "ROP73216",
           "client": "Haley McKinley",
           "age": 39,
-          "req": "07/06/2026"
+          "req": "07/06/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/06/2026"
         },
         {
           "mfr": "",
           "dw": "ROP73150",
           "client": "Shi Shi Gallery",
           "age": 39,
-          "req": "07/06/2026"
+          "req": "07/06/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/06/2026"
         }
       ],
-      "count": 4
+      "count": 4,
+      "reReqCount": 0
     },
     {
       "slug": "pf",
@@ -428,31 +588,44 @@
           "dw": "DWPF150036",
           "client": "Kristiina Sutherland",
           "age": 36,
-          "req": "07/09/2026"
+          "req": "07/09/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/09/2026"
         },
         {
           "mfr": "BP203004",
           "dw": "DWPF150039",
           "client": "Kristiina Sutherland",
           "age": 36,
-          "req": "07/09/2026"
+          "req": "07/09/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/09/2026"
         },
         {
           "mfr": "BP203005",
           "dw": "DWPF150040",
           "client": "Kristiina Sutherland",
           "age": 36,
-          "req": "07/09/2026"
+          "req": "07/09/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/09/2026"
         },
         {
           "mfr": "BP203002",
           "dw": "DWC321345",
           "client": "Sincere Things, LLC",
           "age": 25,
-          "req": "07/20/2026"
+          "req": "07/20/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/20/2026"
         }
       ],
-      "count": 4
+      "count": 4,
+      "reReqCount": 0
     },
     {
       "slug": "yor",
@@ -464,31 +637,44 @@
           "dw": "DWJS17726",
           "client": "lauren shapiro",
           "age": 35,
-          "req": "07/10/2026"
+          "req": "07/10/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/10/2026"
         },
         {
           "mfr": "56877",
           "dw": "DWJS90066",
           "client": "Caitlin Rae Designs",
           "age": 16,
-          "req": "07/29/2026"
+          "req": "07/29/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/29/2026"
         },
         {
           "mfr": "56876",
           "dw": "DWJS90065",
           "client": "Caitlin Rae Designs",
           "age": 16,
-          "req": "07/29/2026"
+          "req": "07/29/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/29/2026"
         },
         {
           "mfr": "56878",
           "dw": "DWJS90067",
           "client": "Caitlin Rae Designs",
           "age": 16,
-          "req": "07/29/2026"
+          "req": "07/29/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/29/2026"
         }
       ],
-      "count": 4
+      "count": 4,
+      "reReqCount": 0
     },
     {
       "slug": "sch",
@@ -500,24 +686,34 @@
           "dw": "DWPIL7744",
           "client": "Holly Bauer",
           "age": 58,
-          "req": "06/17/2026"
+          "req": "06/17/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/17/2026"
         },
         {
           "mfr": "5000412",
           "dw": "DWLK829860",
           "client": "judy heiny",
           "age": 53,
-          "req": "06/22/2026"
+          "req": "06/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/22/2026"
         },
         {
           "mfr": "WOODPERRY, MIMOSA WALLCOVERINGS |",
           "dw": "DWLK803930",
           "client": "Elizabeth H Hollingsworth",
           "age": 36,
-          "req": "07/09/2026"
+          "req": "07/09/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/09/2026"
         }
       ],
-      "count": 3
+      "count": 3,
+      "reReqCount": 0
     },
     {
       "slug": "chin",
@@ -529,24 +725,34 @@
           "dw": "DWCS893848",
           "client": "Jessica Noble",
           "age": 37,
-          "req": "07/08/2026"
+          "req": "07/08/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/08/2026"
         },
         {
           "mfr": "6460-41",
           "dw": "DWCS930248",
           "client": "Alison Iglehart",
           "age": 36,
-          "req": "07/09/2026"
+          "req": "07/09/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/09/2026"
         },
         {
           "mfr": "6620 13WWP",
           "dw": "DWCW734546",
           "client": "Alison Iglehart",
           "age": 36,
-          "req": "07/09/2026"
+          "req": "07/09/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/09/2026"
         }
       ],
-      "count": 3
+      "count": 3,
+      "reReqCount": 0
     },
     {
       "slug": "mor",
@@ -558,24 +764,34 @@
           "dw": "DWWM14464",
           "client": "Nicole Stauffer",
           "age": 33,
-          "req": "07/12/2026"
+          "req": "07/12/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/12/2026"
         },
         {
           "mfr": "216035",
           "dw": "DWWM14707",
           "client": "Martha Ratay",
           "age": 11,
-          "req": "08/03/2026"
+          "req": "08/03/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "08/03/2026"
         },
         {
           "mfr": "216538",
           "dw": "DWWM14752",
           "client": "Pamela Thomaston",
           "age": 11,
-          "req": "08/03/2026"
+          "req": "08/03/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "08/03/2026"
         }
       ],
-      "count": 3
+      "count": 3,
+      "reReqCount": 0
     },
     {
       "slug": "qua",
@@ -587,24 +803,34 @@
           "dw": "DWCW777346",
           "client": "",
           "age": 31,
-          "req": "07/14/2026"
+          "req": "07/14/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/14/2026"
         },
         {
           "mfr": "AP303 10PV",
           "dw": "DWCW762146",
           "client": "Kate Harrell",
           "age": 25,
-          "req": "07/20/2026"
+          "req": "07/20/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/20/2026"
         },
         {
           "mfr": "306520F-102",
           "dw": "DWQC600140",
           "client": "Sally P Brady",
           "age": 11,
-          "req": "08/03/2026"
+          "req": "08/03/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "08/03/2026"
         }
       ],
-      "count": 3
+      "count": 3,
+      "reReqCount": 0
     },
     {
       "slug": "ver",
@@ -616,17 +842,24 @@
           "dw": "VER47203",
           "client": "Chanele Williams",
           "age": 53,
-          "req": "06/22/2026"
+          "req": "06/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/22/2026"
         },
         {
           "mfr": "AS343264",
           "dw": "VER46222",
           "client": "FEDEX",
           "age": 35,
-          "req": "07/10/2026"
+          "req": "07/10/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/10/2026"
         }
       ],
-      "count": 2
+      "count": 2,
+      "reReqCount": 0
     },
     {
       "slug": "tbd",
@@ -638,17 +871,24 @@
           "dw": "DWPN100750",
           "client": "Jody Malan",
           "age": 53,
-          "req": "06/22/2026"
+          "req": "06/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/22/2026"
         },
         {
           "mfr": "*** ENTER MFR # ***",
           "dw": "DWAF74886",
           "client": "Sarah Robinson",
           "age": 44,
-          "req": "07/01/2026"
+          "req": "07/01/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/01/2026"
         }
       ],
-      "count": 2
+      "count": 2,
+      "reReqCount": 0
     },
     {
       "slug": "arte-international",
@@ -660,17 +900,24 @@
           "dw": "DWAR320016",
           "client": "Suzi Graef",
           "age": 53,
-          "req": "06/22/2026"
+          "req": "06/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/22/2026"
         },
         {
           "mfr": "29243",
           "dw": "DWAR320016",
           "client": "rachael roberts",
           "age": 45,
-          "req": "06/30/2026"
+          "req": "06/30/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/30/2026"
         }
       ],
-      "count": 2
+      "count": 2,
+      "reReqCount": 0
     },
     {
       "slug": "schumacher",
@@ -682,17 +929,24 @@
           "dw": "DWLK833920",
           "client": "Terri Matthews",
           "age": 39,
-          "req": "07/06/2026"
+          "req": "07/06/2026",
+          "reRequested": true,
+          "timesRequested": 2,
+          "initialReq": "07/06/2026"
         },
         {
           "mfr": "5005652",
           "dw": "DWLK833920",
           "client": "Terri Matthews",
           "age": 39,
-          "req": "07/06/2026"
+          "req": "07/06/2026",
+          "reRequested": true,
+          "timesRequested": 2,
+          "initialReq": "07/06/2026"
         }
       ],
-      "count": 2
+      "count": 2,
+      "reReqCount": 2
     },
     {
       "slug": "sand",
@@ -704,17 +958,24 @@
           "dw": "DWZF187058",
           "client": "FEDEX",
           "age": 35,
-          "req": "07/10/2026"
+          "req": "07/10/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/10/2026"
         },
         {
           "mfr": "217209",
           "dw": "DWWM14281",
           "client": "Chris Landis",
           "age": 25,
-          "req": "07/20/2026"
+          "req": "07/20/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/20/2026"
         }
       ],
-      "count": 2
+      "count": 2,
+      "reReqCount": 0
     },
     {
       "slug": "con",
@@ -726,17 +987,24 @@
           "dw": "LIN980008",
           "client": "Margie Pesicka",
           "age": 28,
-          "req": "07/17/2026"
+          "req": "07/17/2026",
+          "reRequested": true,
+          "timesRequested": 2,
+          "initialReq": "07/17/2026"
         },
         {
           "mfr": "RD1893FR",
           "dw": "LIN980008",
           "client": "Margie Pesicka",
           "age": 28,
-          "req": "07/17/2026"
+          "req": "07/17/2026",
+          "reRequested": true,
+          "timesRequested": 2,
+          "initialReq": "07/17/2026"
         }
       ],
-      "count": 2
+      "count": 2,
+      "reReqCount": 2
     },
     {
       "slug": "thib",
@@ -748,17 +1016,24 @@
           "dw": "DWAF65004",
           "client": "Paola Salomon",
           "age": 25,
-          "req": "07/20/2026"
+          "req": "07/20/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/20/2026"
         },
         {
           "mfr": "AT24575",
           "dw": "DWAF65000",
           "client": "Paola Salomon",
           "age": 25,
-          "req": "07/20/2026"
+          "req": "07/20/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/20/2026"
         }
       ],
-      "count": 2
+      "count": 2,
+      "reReqCount": 0
     },
     {
       "slug": "sandb",
@@ -770,17 +1045,24 @@
           "dw": "DWSS71172",
           "client": "Lisa McIlhenny FEDEX",
           "age": 18,
-          "req": "07/27/2026"
+          "req": "07/27/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/27/2026"
         },
         {
           "mfr": "S10176",
           "dw": "DWSS74114",
           "client": "Lisa McIlhenny FEDEX",
           "age": 18,
-          "req": "07/27/2026"
+          "req": "07/27/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/27/2026"
         }
       ],
-      "count": 2
+      "count": 2,
+      "reReqCount": 0
     },
     {
       "slug": "astsand",
@@ -792,17 +1074,24 @@
           "dw": "PRN62373",
           "client": "Andrea Reiser",
           "age": 14,
-          "req": "07/31/2026"
+          "req": "07/31/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/31/2026"
         },
         {
           "mfr": "wk111 - $20.90 net - 1/12/12)",
           "dw": "REW6211",
           "client": "JODI MILLER",
           "age": 11,
-          "req": "08/03/2026"
+          "req": "08/03/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "08/03/2026"
         }
       ],
-      "count": 2
+      "count": 2,
+      "reReqCount": 0
     },
     {
       "slug": "pin",
@@ -814,17 +1103,24 @@
           "dw": "DWPF600399",
           "client": "Marci Stewart",
           "age": 14,
-          "req": "07/31/2026"
+          "req": "07/31/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/31/2026"
         },
         {
           "mfr": "B7570001",
           "dw": "DWPF600091",
           "client": "Marci Stewart",
           "age": 14,
-          "req": "07/31/2026"
+          "req": "07/31/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/31/2026"
         }
       ],
-      "count": 2
+      "count": 2,
+      "reReqCount": 0
     },
     {
       "slug": "coor",
@@ -836,17 +1132,24 @@
           "dw": "DWDC330786",
           "client": "Kristine Bennett",
           "age": 11,
-          "req": "08/03/2026"
+          "req": "08/03/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "08/03/2026"
         },
         {
           "mfr": "B00317 Clover Cacao",
           "dw": "DWDC330787",
           "client": "Kristine Bennett",
           "age": 11,
-          "req": "08/03/2026"
+          "req": "08/03/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "08/03/2026"
         }
       ],
-      "count": 2
+      "count": 2,
+      "reReqCount": 0
     },
     {
       "slug": "san",
@@ -858,10 +1161,14 @@
           "dw": "DWAC1010582",
           "client": "Susan Berghouse",
           "age": 53,
-          "req": "06/22/2026"
+          "req": "06/22/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/22/2026"
         }
       ],
-      "count": 1
+      "count": 1,
+      "reReqCount": 0
     },
     {
       "slug": "bre",
@@ -873,10 +1180,14 @@
           "dw": "DWJS90185",
           "client": "Reed Reynolds",
           "age": 46,
-          "req": "06/29/2026"
+          "req": "06/29/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/29/2026"
         }
       ],
-      "count": 1
+      "count": 1,
+      "reReqCount": 0
     },
     {
       "slug": "jofa",
@@ -888,10 +1199,14 @@
           "dw": "DWKK134236",
           "client": "Rachel Kiedrowski",
           "age": 46,
-          "req": "06/29/2026"
+          "req": "06/29/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/29/2026"
         }
       ],
-      "count": 1
+      "count": 1,
+      "reReqCount": 0
     },
     {
       "slug": "rad",
@@ -903,10 +1218,14 @@
           "dw": "DIg4350114V",
           "client": "Jenna Quam",
           "age": 45,
-          "req": "06/30/2026"
+          "req": "06/30/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "06/30/2026"
         }
       ],
-      "count": 1
+      "count": 1,
+      "reReqCount": 0
     },
     {
       "slug": "twi",
@@ -918,10 +1237,14 @@
           "dw": "DWAR320018",
           "client": "Edidiong Odiong",
           "age": 39,
-          "req": "07/06/2026"
+          "req": "07/06/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/06/2026"
         }
       ],
-      "count": 1
+      "count": 1,
+      "reReqCount": 0
     },
     {
       "slug": "lbi",
@@ -933,10 +1256,14 @@
           "dw": "HWC61147",
           "client": "Evelyn Dame",
           "age": 38,
-          "req": "07/07/2026"
+          "req": "07/07/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/07/2026"
         }
       ],
-      "count": 1
+      "count": 1,
+      "reReqCount": 0
     },
     {
       "slug": "pj",
@@ -948,10 +1275,14 @@
           "dw": "DWCPJ4185LA",
           "client": "Lake Flato Architects",
           "age": 36,
-          "req": "07/09/2026"
+          "req": "07/09/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/09/2026"
         }
       ],
-      "count": 1
+      "count": 1,
+      "reReqCount": 0
     },
     {
       "slug": "brewster",
@@ -963,10 +1294,14 @@
           "dw": "DWBR170698",
           "client": "lauren shapiro",
           "age": 35,
-          "req": "07/10/2026"
+          "req": "07/10/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/10/2026"
         }
       ],
-      "count": 1
+      "count": 1,
+      "reReqCount": 0
     },
     {
       "slug": "osb",
@@ -978,10 +1313,14 @@
           "dw": "EUR70871",
           "client": "Lisa McIlhenny FEDEX",
           "age": 18,
-          "req": "07/27/2026"
+          "req": "07/27/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/27/2026"
         }
       ],
-      "count": 1
+      "count": 1,
+      "reReqCount": 0
     },
     {
       "slug": "maya",
@@ -993,10 +1332,14 @@
           "dw": "Maya50408",
           "client": "Pierce Condominium c/o FirstService Residential",
           "age": 18,
-          "req": "07/27/2026"
+          "req": "07/27/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/27/2026"
         }
       ],
-      "count": 1
+      "count": 1,
+      "reReqCount": 0
     },
     {
       "slug": "kor",
@@ -1008,10 +1351,14 @@
           "dw": "DWK29028",
           "client": "Sheryl Repasky",
           "age": 16,
-          "req": "07/29/2026"
+          "req": "07/29/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/29/2026"
         }
       ],
-      "count": 1
+      "count": 1,
+      "reReqCount": 0
     },
     {
       "slug": "rbl",
@@ -1023,10 +1370,14 @@
           "dw": "DWRW76354",
           "client": "Elizabeth Kent",
           "age": 15,
-          "req": "07/30/2026"
+          "req": "07/30/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/30/2026"
         }
       ],
-      "count": 1
+      "count": 1,
+      "reReqCount": 0
     },
     {
       "slug": "olp",
@@ -1038,10 +1389,14 @@
           "dw": "DWCOP-ART-DECO-WAVES",
           "client": "Andrea Reiser",
           "age": 14,
-          "req": "07/31/2026"
+          "req": "07/31/2026",
+          "reRequested": false,
+          "timesRequested": 1,
+          "initialReq": "07/31/2026"
         }
       ],
-      "count": 1
+      "count": 1,
+      "reReqCount": 0
     }
   ]
 }
\ No newline at end of file
diff --git a/scripts/build-fleet.js b/scripts/build-fleet.js
index 02231d6..5f0c351 100644
--- a/scripts/build-fleet.js
+++ b/scripts/build-fleet.js
@@ -39,9 +39,20 @@ for (const r of j.records) {
   });
 }
 
-const vendors = Object.values(g)
-  .map(v => ({ ...v, items: v.items.sort((a, b) => b.age - a.age), count: v.items.length }))
-  .sort((a, b) => b.count - a.count);
+// Re-request detection: same DW# (or pattern) + same client appearing more than once
+// = that sample was requested again. Earliest date = initial request.
+const vendors = Object.values(g).map(v => {
+  const byKey = {};
+  for (const it of v.items) { const k = (it.dw || it.mfr) + '|' + it.client; (byKey[k] = byKey[k] || []).push(it); }
+  for (const k in byKey) {
+    const arr = byKey[k];
+    const initial = arr.map(x => x.req).filter(Boolean).sort((a, b) => new Date(a) - new Date(b))[0] || null;
+    const reReq = arr.length > 1;
+    arr.forEach(x => { x.reRequested = reReq; x.timesRequested = arr.length; x.initialReq = initial || x.req; });
+  }
+  const items = v.items.sort((a, b) => b.age - a.age);
+  return { ...v, items, count: items.length, reReqCount: items.filter(x => x.reRequested).length };
+}).sort((a, b) => b.count - a.count);
 
 const out = {
   generated: '2026-08-14',
diff --git a/server.js b/server.js
index 8ef57ac..650c5d2 100644
--- a/server.js
+++ b/server.js
@@ -73,7 +73,7 @@ const server = http.createServer(async (req, res) => {
   send(res, 404, { error: 'not found' });
 });
 
-const srv = server.listen(0, '127.0.0.1', () => {
+const srv = server.listen(process.env.PORT || 64845, '127.0.0.1', () => {
   const port = srv.address().port;
   fs.writeFileSync(p('out', 'viewer-port.txt'), String(port));
   console.log(`Sample Follow-Up console → http://127.0.0.1:${port}/  (admin / DW2024!)`);
@@ -101,6 +101,13 @@ const PAGE = `<!doctype html><html><head><meta charset="utf-8"><title>Sample Fol
  #modal .card{background:#fff;max-width:680px;width:92%;max-height:86vh;overflow:auto;border-radius:10px;padding:22px 26px}
  #status{font-size:13px;color:#137a34}
  .muted{color:#999;font-size:12px}
+ button.exp{border:none;background:none;cursor:pointer;font:inherit;color:#0645ad;padding:0}
+ table.detail{width:100%;margin:4px 0;background:#fafafd;border:1px solid var(--b)}
+ table.detail th{position:static;top:auto;background:#f0f0f3;font-size:11px}
+ table.detail td{font-size:12px;padding:5px 8px}
+ tr.rr td{background:#f6f0ff}
+ .badge.rrb{background:#ece2fb;color:#5b2ea6}
+ .detailrow>td{padding:0 10px 8px}
 </style></head><body>
 <header>
  <h1>Sample Follow-Up — Vendor Console</h1>
@@ -118,7 +125,7 @@ const PAGE = `<!doctype html><html><head><meta charset="utf-8"><title>Sample Fol
  </div>
 </header>
 <div class="wrap"><table><thead><tr>
- <th></th><th>Vendor</th><th>Items</th><th>Oldest</th><th>Status</th><th>Sample email</th><th>DW acct #</th><th></th>
+ <th></th><th>Vendor</th><th>Items</th><th>Re-req</th><th>Oldest</th><th>Status</th><th>Sample email</th><th>DW acct #</th><th></th>
 </tr></thead><tbody id="rows"></tbody></table>
 <p class="muted">Queue writes <code>out/send-queue.json</code>. Ready = sample email + acct present. Then in chat: “create the queued drafts” → they land in info@ Drafts for you to send. 15 rows had no vendor id and aren’t shown.</p>
 </div>
@@ -132,18 +139,32 @@ function ready(v){const c=S.contacts[v.slug]||{};return c.sample_email&&c.accoun
 function sorted(){const k=document.getElementById('sort').value;localStorage.setItem('sfsort',k);const a=[...S.fleet.vendors];
  if(k==='items')a.sort((x,y)=>y.count-x.count);if(k==='age')a.sort((x,y)=>y.items[0].age-x.items[0].age);
  if(k==='name')a.sort((x,y)=>x.name.localeCompare(y.name));if(k==='ready')a.sort((x,y)=>(ready(y)?1:0)-(ready(x)?1:0));return a;}
+function itemsTable(v){
+ let h='<table class=detail><thead><tr><th>Pattern (Mfr#)</th><th>DW#</th><th>Client</th><th>Initial request</th><th>Re-req</th></tr></thead><tbody>';
+ for(const i of v.items){
+   h+='<tr'+(i.reRequested?' class=rr':'')+'><td>'+esc(i.mfr)+'</td><td class=vid>'+esc(i.dw||'-')+'</td><td>'+esc(i.client||'')+'</td>'+
+      '<td>'+esc(i.initialReq||i.req||'-')+'</td>'+
+      '<td>'+(i.reRequested?'<span class="badge rrb">RE-REQ ×'+i.timesRequested+'</span>':'')+'</td></tr>';
+ }
+ return h+'</tbody></table>';
+}
 function render(){const t=document.getElementById('rows');t.innerHTML='';for(const v of sorted()){const c=S.contacts[v.slug]||{};const r=ready(v);
  const tr=document.createElement('tr');tr.innerHTML=
  '<td><input type=checkbox class=pick data-slug="'+v.slug+'"></td>'+
  '<td><b>'+esc(v.name)+'</b><div class=vid>'+esc(v.vid)+'</div></td>'+
- '<td>'+v.count+'</td><td>'+v.items[0].age+'d</td>'+
+ '<td><button class=exp data-exp="'+v.slug+'">▶ '+v.count+'</button></td>'+
+ '<td>'+(v.reReqCount?'<span class="badge rrb">'+v.reReqCount+'</span>':'<span class=muted>–</span>')+'</td>'+
+ '<td>'+v.items[0].age+'d</td>'+
  '<td><span class="badge '+(r?'ok':'need')+'">'+(r?'READY':'NEEDS')+'</span></td>'+
  '<td><input class="em" data-slug="'+v.slug+'" data-f="sample_email" value="'+esc(c.sample_email||'')+'" placeholder="sample email"></td>'+
  '<td><input class="ac" data-slug="'+v.slug+'" data-f="account_number" value="'+esc(c.account_number||'')+'" placeholder="acct #"></td>'+
  '<td><button data-prev="'+v.slug+'">preview</button></td>';
- t.appendChild(tr);}
+ t.appendChild(tr);
+ const dr=document.createElement('tr');dr.className='detailrow';dr.style.display='none';
+ dr.innerHTML='<td></td><td colspan=8>'+itemsTable(v)+'</td>';t.appendChild(dr);}
  t.querySelectorAll('input.em,input.ac').forEach(i=>i.addEventListener('change',saveContact));
- t.querySelectorAll('button[data-prev]').forEach(b=>b.addEventListener('click',()=>preview(b.dataset.prev)));}
+ t.querySelectorAll('button[data-prev]').forEach(b=>b.addEventListener('click',()=>preview(b.dataset.prev)));
+ t.querySelectorAll('button.exp').forEach(b=>b.addEventListener('click',e=>{const dr=e.target.closest('tr').nextElementSibling;const open=dr.style.display==='none';dr.style.display=open?'table-row':'none';e.target.textContent=(open?'▼ ':'▶ ')+e.target.textContent.slice(2);}));}
 async function saveContact(e){const el=e.target;const slug=el.dataset.slug;const row=[...document.querySelectorAll('input[data-slug="'+slug+'"]')];
  const em=row.find(x=>x.dataset.f==='sample_email').value.trim();const ac=row.find(x=>x.dataset.f==='account_number').value.trim();
  await fetch('/api/contact',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({slug,sample_email:em,account_number:ac})});

← d5b7022 Fleet sweep (37 vendors/106 items) + selection console (serv  ·  back to Sample Followup Sweep  ·  Harvest vendor sample emails + accounts from Sent folder int cbdaa5d →