[object Object]

← back to Commercialrealestate

CRCP listings: daily rotating refresh (DTD verdict C) — ~3 metros/day, timeout-safe; launchd+recurring-spend gated

cd428e01b3b2c5603e45203425271615453a79c4 · 2026-07-12 12:01:06 -0700 · Steve

Files touched

Diff

commit cd428e01b3b2c5603e45203425271615453a79c4
Author: Steve <steve@designerwallcoverings.com>
Date:   Sun Jul 12 12:01:06 2026 -0700

    CRCP listings: daily rotating refresh (DTD verdict C) — ~3 metros/day, timeout-safe; launchd+recurring-spend gated
---
 scripts/com.steve.crcp-listings-rotating.plist | 20 +++++++++++++++++++
 scripts/refresh-listings-rotating.sh           | 27 ++++++++++++++++++++++++++
 scripts/sweep-remaining-metros.sh              |  0
 3 files changed, 47 insertions(+)

diff --git a/scripts/com.steve.crcp-listings-rotating.plist b/scripts/com.steve.crcp-listings-rotating.plist
new file mode 100644
index 0000000..479be64
--- /dev/null
+++ b/scripts/com.steve.crcp-listings-rotating.plist
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>Label</key><string>com.steve.crcp-listings-rotating</string>
+  <key>ProgramArguments</key>
+  <array>
+    <string>/bin/bash</string>
+    <string>/Users/macstudio3/Projects/commercialrealestate/scripts/refresh-listings-rotating.sh</string>
+  </array>
+  <!-- Daily 5:30 AM: sweeps ~3 metros/day (DTD verdict C). All 22 metros refresh within
+       a week; each per-metro session is short enough to beat the Browserbase timeout.
+       PAID (Browserbase, ~pennies/day). Adjust SLICE via EnvironmentVariables. -->
+  <key>StartCalendarInterval</key>
+  <dict><key>Hour</key><integer>5</integer><key>Minute</key><integer>30</integer></dict>
+  <key>StandardOutPath</key><string>/tmp/crcp-listings-rotating.out</string>
+  <key>StandardErrorPath</key><string>/tmp/crcp-listings-rotating.err</string>
+  <key>RunAtLoad</key><false/>
+</dict>
+</plist>
diff --git a/scripts/refresh-listings-rotating.sh b/scripts/refresh-listings-rotating.sh
new file mode 100755
index 0000000..75fced1
--- /dev/null
+++ b/scripts/refresh-listings-rotating.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+# DTD verdict C (2026-07-12): daily ROTATING listings refresh. Each day sweeps a small
+# slice (~3 metros) so: every metro refreshes within ~a week, daily Browserbase spend is
+# pennies, each per-metro session is short enough to beat the session-lifetime timeout,
+# and the email-alerts diff surfaces new listings as a daily trickle.
+#
+# Deterministic rotation: day-of-year picks which SLICE of the metro list runs today.
+export NODE_PATH="$HOME/.claude/skills/browserbase/node_modules"
+cd "$HOME/Projects/commercialrealestate" || exit 1
+
+SLICE=${SLICE:-3}   # metros per day (override via env)
+# canonical metro order (all 22 keys from metro-listings-config.json)
+METROS=($(node -e "console.log(Object.keys(require('./data/metro-listings-config.json').metros).join(' '))"))
+N=${#METROS[@]}
+DOY=$(date +%j | sed 's/^0*//')     # day of year, 1..366
+START=$(( (DOY * SLICE) % N ))
+
+echo "$(date '+%F %T') rotating refresh: N=$N metros, slice=$SLICE, doy=$DOY, start=$START"
+TODAY=()
+for ((i=0; i<SLICE; i++)); do TODAY+=("${METROS[$(( (START + i) % N ))]}"); done
+echo "today's metros: ${TODAY[*]}"
+
+for m in "${TODAY[@]}"; do
+  echo "=== $m ==="
+  node scripts/refresh-listings-multi.js "$m" 2>&1 | grep -E "captured|ADDED|FATAL" | sed "s/^/  [$m] /"
+done
+echo "$(date '+%F %T') rotating refresh done: ${TODAY[*]}"
diff --git a/scripts/sweep-remaining-metros.sh b/scripts/sweep-remaining-metros.sh
old mode 100644
new mode 100755

← 0a6e0fc CRCP email-alerts: opt-in gov-agent segment (DTD verdict C)  ·  back to Commercialrealestate  ·  CRCP listings: all-metro Crexi sweep complete — 2,791 listin 06ae110 →