[object Object]

← back to Designer Wallcoverings

security: strip hardcoded dw_admin pw across 27 files (parent + nested) — env-first

59c3ba19c44d5cb4f9aebbac8aa12eef3eac2de9 · 2026-05-30 23:31:22 -0700 · Steve

Combined parent-level sweep that mirrors nested commits:
  - DW-Programming (nested) 3e3124d: 16 .py/.sh files
  - shopify (nested) 0f0a91a: 2 scripts
  - parent-only: 7 files in scripts/, lib/, vendor-monthly/, README.md
  - 7 stale .pyc bytecode files untracked (kept on disk via .gitignore rule)

Patterns covered (all mechanical sed):
  - bare DSN: ':PASS@host' -> '@host'
  - export PGPASSWORD='PASS' -> export PGPASSWORD="${PGPASSWORD:-}"
  - inline PGPASSWORD='PASS' psql -> ${PGPASSWORD:-} (env-first)
  - DB_PASS="PASS" -> DB_PASS="${DB_PASS:-${PGPASSWORD:-}}"
  - README.md env-example -> placeholder

Host + DB name preserved in every DSN per secret-strip skill convention.
Caller must now supply PGPASSWORD (or DATABASE_URL) via env on first run.

Added __pycache__/ + *.pyc to parent .gitignore (was missing — stale .pyc
files in tree carried pre-strip dw_admin pw in compiled bytecode form).

NO rotation, NO deploy. The dw_admin pw rotation itself remains Steve-gated
(~/Projects/_shared/docs/pg-rotation-runbook.md). Post-rotation these
scripts inherit the new pw without further code changes.

Closes wallco-ai TODO line 14 + CNCP _shared item 13.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit 59c3ba19c44d5cb4f9aebbac8aa12eef3eac2de9
Author: Steve <steve@designerwallcoverings.com>
Date:   Sat May 30 23:31:22 2026 -0700

    security: strip hardcoded dw_admin pw across 27 files (parent + nested) — env-first
    
    Combined parent-level sweep that mirrors nested commits:
      - DW-Programming (nested) 3e3124d: 16 .py/.sh files
      - shopify (nested) 0f0a91a: 2 scripts
      - parent-only: 7 files in scripts/, lib/, vendor-monthly/, README.md
      - 7 stale .pyc bytecode files untracked (kept on disk via .gitignore rule)
    
    Patterns covered (all mechanical sed):
      - bare DSN: ':PASS@host' -> '@host'
      - export PGPASSWORD='PASS' -> export PGPASSWORD="${PGPASSWORD:-}"
      - inline PGPASSWORD='PASS' psql -> ${PGPASSWORD:-} (env-first)
      - DB_PASS="PASS" -> DB_PASS="${DB_PASS:-${PGPASSWORD:-}}"
      - README.md env-example -> placeholder
    
    Host + DB name preserved in every DSN per secret-strip skill convention.
    Caller must now supply PGPASSWORD (or DATABASE_URL) via env on first run.
    
    Added __pycache__/ + *.pyc to parent .gitignore (was missing — stale .pyc
    files in tree carried pre-strip dw_admin pw in compiled bytecode form).
    
    NO rotation, NO deploy. The dw_admin pw rotation itself remains Steve-gated
    (~/Projects/_shared/docs/pg-rotation-runbook.md). Post-rotation these
    scripts inherit the new pw without further code changes.
    
    Closes wallco-ai TODO line 14 + CNCP _shared item 13.
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---
 .gitignore                                              |   4 ++++
 .../ImportNewSkufromURL/ralph-vendor-summary.sh         |   2 +-
 .../ImportNewSkufromURL/test-all-vendors-ralph.sh       |   2 +-
 .../test-vendor-product-data-ralph.sh                   |   2 +-
 .../enrich-anna-french.js.backup-20260319-013920        |   2 +-
 DW-Programming/generate-justindavid-rooms.py            |   2 +-
 DW-Programming/phase3-ai-enrich-batch.py                |   2 +-
 DW-Programming/phase3-ai-enrich-batch.sh                |   2 +-
 DW-Programming/pr-logo-crop.py                          |   2 +-
 .../__pycache__/batch-room-gen-v2.cpython-314.pyc       | Bin 22884 -> 0 bytes
 .../__pycache__/batch-room-generator.cpython-314.pyc    | Bin 22808 -> 0 bytes
 .../__pycache__/batch-room-settings.cpython-314.pyc     | Bin 21052 -> 0 bytes
 .../generate-phillipe-romano-rooms.cpython-314.pyc      | Bin 18437 -> 0 bytes
 DW-Programming/room-setting-app/batch-room-gen-v2.py    |   2 +-
 DW-Programming/room-setting-app/batch-room-generator.py |   2 +-
 DW-Programming/room-setting-app/batch-room-settings.py  |   2 +-
 .../room-setting-app/generate-phillipe-romano-rooms.py  |   2 +-
 .../__pycache__/batch-room-generator.cpython-314.pyc    | Bin 24695 -> 0 bytes
 .../room-setting-app/scripts/batch-room-generator.py    |   2 +-
 DW-Programming/scripts/versa-image-enrichment.sh        |   2 +-
 .../scripts/william-morris-image-enrichment.sh          |   2 +-
 .../vendor-crawlers/scripts/monthly-vendor-update.sh    |   2 +-
 lib/architectural-vendor-update/README.md               |   2 +-
 .../__pycache__/batch-room-generator.cpython-314.pyc    | Bin 19815 -> 0 bytes
 scripts/__pycache__/batch-room-settings.cpython-314.pyc | Bin 17534 -> 0 bytes
 scripts/archive-thibaut-unknown.js.DISABLED-2026-04-24  |   2 +-
 scripts/batch-room-generator.py                         |   2 +-
 scripts/batch-room-settings.py                          |   2 +-
 scripts/justindavid-daily-cron.sh                       |   6 +++---
 scripts/rw-drapery-daily-cron.sh                        |   4 ++--
 scripts/vendor-monthly/elitis-recrawl.sh                |   4 ++--
 scripts/vendor-monthly/thibaut-recrawl.sh               |   4 ++--
 shopify/scripts/batch-room-settings.py                  |   2 +-
 .../dedup-phillipe-romano.js.DISABLED-2026-04-24        |   2 +-
 34 files changed, 35 insertions(+), 31 deletions(-)

diff --git a/.gitignore b/.gitignore
index b78aa783..8d7806e5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,3 +32,7 @@ shopify/scripts/bulk-products-variants.jsonl
 shopify/scripts/sheets-service-account.json
 **/*service-account*.json
 **/*service_account*.json
+
+# Python bytecode (added 2026-05-30 — stale .pyc still contained pre-strip dw_admin pw)
+__pycache__/
+*.pyc
diff --git a/DW-Programming/ImportNewSkufromURL/ralph-vendor-summary.sh b/DW-Programming/ImportNewSkufromURL/ralph-vendor-summary.sh
index 1e7c24ee..c957b069 100755
--- a/DW-Programming/ImportNewSkufromURL/ralph-vendor-summary.sh
+++ b/DW-Programming/ImportNewSkufromURL/ralph-vendor-summary.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 
 # Ralph Wiggum Vendor URL Summary Report
-export PGPASSWORD='DW2024SecurePass'
+export PGPASSWORD="${PGPASSWORD:-}"
 
 echo "🍭 RALPH WIGGUM VENDOR URL SUMMARY REPORT"
 echo "=========================================="
diff --git a/DW-Programming/ImportNewSkufromURL/test-all-vendors-ralph.sh b/DW-Programming/ImportNewSkufromURL/test-all-vendors-ralph.sh
index 302e7281..6de1245f 100755
--- a/DW-Programming/ImportNewSkufromURL/test-all-vendors-ralph.sh
+++ b/DW-Programming/ImportNewSkufromURL/test-all-vendors-ralph.sh
@@ -12,7 +12,7 @@ echo ""
 
 # Configuration
 DB_USER="dw_admin"
-DB_PASS="DW2024SecurePass"
+DB_PASS="${DB_PASS:-${PGPASSWORD:-}}"
 DB_HOST="127.0.0.1"
 DB_NAME="dw_unified"
 BASE_URL="http://45.61.58.125:3002/api/vendor-skills"
diff --git a/DW-Programming/ImportNewSkufromURL/test-vendor-product-data-ralph.sh b/DW-Programming/ImportNewSkufromURL/test-vendor-product-data-ralph.sh
index 15b96bfe..11b3cc32 100755
--- a/DW-Programming/ImportNewSkufromURL/test-vendor-product-data-ralph.sh
+++ b/DW-Programming/ImportNewSkufromURL/test-vendor-product-data-ralph.sh
@@ -12,7 +12,7 @@ echo ""
 
 # Configuration
 DB_USER="dw_admin"
-DB_PASS="DW2024SecurePass"
+DB_PASS="${DB_PASS:-${PGPASSWORD:-}}"
 DB_HOST="127.0.0.1"
 DB_NAME="dw_unified"
 RESULTS_DIR="/root/Projects/Designer-Wallcoverings/DW-Programming/ImportNewSkufromURL/ralph-test-results"
diff --git a/DW-Programming/enrich-anna-french.js.backup-20260319-013920 b/DW-Programming/enrich-anna-french.js.backup-20260319-013920
index 7b63b7c8..8cfda94d 100644
--- a/DW-Programming/enrich-anna-french.js.backup-20260319-013920
+++ b/DW-Programming/enrich-anna-french.js.backup-20260319-013920
@@ -9,7 +9,7 @@
 const https = require('https');
 const { Client } = require('pg');
 
-const DB_URL = 'postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified';
+const DB_URL = 'postgresql://dw_admin@127.0.0.1:5432/dw_unified';
 const DELAY_MS = 600; // 600ms between requests
 const BATCH_SIZE = 50; // Log progress every N products
 const MAX_RETRIES = 2;
diff --git a/DW-Programming/generate-justindavid-rooms.py b/DW-Programming/generate-justindavid-rooms.py
index d48b2e93..13f13660 100644
--- a/DW-Programming/generate-justindavid-rooms.py
+++ b/DW-Programming/generate-justindavid-rooms.py
@@ -27,7 +27,7 @@ from concurrent.futures import ThreadPoolExecutor, as_completed
 # ─── Configuration ───────────────────────────────────────────────────
 
 ROOM_API = "http://127.0.0.1:3075/api/generate-room"
-DB_CONN = "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB_CONN = "postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 SLACK_WEBHOOK = "${SLACK_WEBHOOK_URL}"
 PRODUCTS_JSON = "/tmp/justindavid-rooms-products.json"
 PROGRESS_FILE = "/tmp/justindavid-rooms-progress.json"
diff --git a/DW-Programming/phase3-ai-enrich-batch.py b/DW-Programming/phase3-ai-enrich-batch.py
index 9410bb99..5548f6d6 100644
--- a/DW-Programming/phase3-ai-enrich-batch.py
+++ b/DW-Programming/phase3-ai-enrich-batch.py
@@ -14,7 +14,7 @@ from datetime import datetime, timezone, timedelta
 
 import psycopg2
 
-DB_DSN = "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB_DSN = "postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 GEMINI_KEY = "${GOOGLE_API_KEY}"
 GEMINI_URL = f"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key={GEMINI_KEY}"
 BATCH_SIZE = 20
diff --git a/DW-Programming/phase3-ai-enrich-batch.sh b/DW-Programming/phase3-ai-enrich-batch.sh
index 291bbca3..0d85ee5e 100644
--- a/DW-Programming/phase3-ai-enrich-batch.sh
+++ b/DW-Programming/phase3-ai-enrich-batch.sh
@@ -5,7 +5,7 @@ set -euo pipefail
 
 GEMINI_KEY="${GOOGLE_API_KEY}"
 GEMINI_URL="https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}"
-DB="postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB="postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 TMPDIR="/tmp/ai-enrich-$$"
 mkdir -p "$TMPDIR"
 
diff --git a/DW-Programming/pr-logo-crop.py b/DW-Programming/pr-logo-crop.py
index e2299f03..7cd1e000 100644
--- a/DW-Programming/pr-logo-crop.py
+++ b/DW-Programming/pr-logo-crop.py
@@ -31,7 +31,7 @@ import psycopg2
 import psycopg2.extras
 
 # ─── Config ───
-DB_URL = "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB_URL = "postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 CROP_DIR = "/root/DW-Agents/image-crops/phillipe-romano"
 LOG_FILE = "/tmp/pr-logo-crop.log"
 SLACK_WEBHOOK = "${SLACK_WEBHOOK_URL}"
diff --git a/DW-Programming/room-setting-app/__pycache__/batch-room-gen-v2.cpython-314.pyc b/DW-Programming/room-setting-app/__pycache__/batch-room-gen-v2.cpython-314.pyc
deleted file mode 100644
index f78fb536..00000000
Binary files a/DW-Programming/room-setting-app/__pycache__/batch-room-gen-v2.cpython-314.pyc and /dev/null differ
diff --git a/DW-Programming/room-setting-app/__pycache__/batch-room-generator.cpython-314.pyc b/DW-Programming/room-setting-app/__pycache__/batch-room-generator.cpython-314.pyc
deleted file mode 100644
index 35e427d2..00000000
Binary files a/DW-Programming/room-setting-app/__pycache__/batch-room-generator.cpython-314.pyc and /dev/null differ
diff --git a/DW-Programming/room-setting-app/__pycache__/batch-room-settings.cpython-314.pyc b/DW-Programming/room-setting-app/__pycache__/batch-room-settings.cpython-314.pyc
deleted file mode 100644
index cdca20e9..00000000
Binary files a/DW-Programming/room-setting-app/__pycache__/batch-room-settings.cpython-314.pyc and /dev/null differ
diff --git a/DW-Programming/room-setting-app/__pycache__/generate-phillipe-romano-rooms.cpython-314.pyc b/DW-Programming/room-setting-app/__pycache__/generate-phillipe-romano-rooms.cpython-314.pyc
deleted file mode 100644
index 50b29289..00000000
Binary files a/DW-Programming/room-setting-app/__pycache__/generate-phillipe-romano-rooms.cpython-314.pyc and /dev/null differ
diff --git a/DW-Programming/room-setting-app/batch-room-gen-v2.py b/DW-Programming/room-setting-app/batch-room-gen-v2.py
index 33937d91..c356dec7 100644
--- a/DW-Programming/room-setting-app/batch-room-gen-v2.py
+++ b/DW-Programming/room-setting-app/batch-room-gen-v2.py
@@ -32,7 +32,7 @@ import argparse
 ROOM_API = "http://127.0.0.1:3075/api/generate-room"
 SHOPIFY_BASE = "https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-01"
 SHOPIFY_TOKEN = os.environ['SHOPIFY_ADMIN_TOKEN']
-DB_CONN = "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB_CONN = "postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 SLACK_WEBHOOK = "${SLACK_WEBHOOK_URL}"
 
 PROGRESS_FILE = "/tmp/batch-room-progress.json"
diff --git a/DW-Programming/room-setting-app/batch-room-generator.py b/DW-Programming/room-setting-app/batch-room-generator.py
index 8315d88d..83830047 100644
--- a/DW-Programming/room-setting-app/batch-room-generator.py
+++ b/DW-Programming/room-setting-app/batch-room-generator.py
@@ -26,7 +26,7 @@ import subprocess
 ROOM_API = "http://127.0.0.1:3075/api/generate-room"
 SHOPIFY_BASE = "https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-01"
 SHOPIFY_TOKEN = os.environ['SHOPIFY_ADMIN_TOKEN']
-DB_CONN = "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB_CONN = "postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 SLACK_WEBHOOK = "${SLACK_WEBHOOK_URL}"
 
 PROGRESS_FILE = "/tmp/batch-room-progress.json"
diff --git a/DW-Programming/room-setting-app/batch-room-settings.py b/DW-Programming/room-setting-app/batch-room-settings.py
index 18a92dd8..eeee6ec7 100644
--- a/DW-Programming/room-setting-app/batch-room-settings.py
+++ b/DW-Programming/room-setting-app/batch-room-settings.py
@@ -36,7 +36,7 @@ LOCK_FILE = "/tmp/batch-room-settings.lock"
 ROOM_API = "http://127.0.0.1:3075/api/generate-room"
 SHOPIFY_BASE = "https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-01"
 SHOPIFY_TOKEN = os.environ['SHOPIFY_ADMIN_TOKEN']
-DB_CONN = "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB_CONN = "postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 SLACK_WEBHOOK = "${SLACK_WEBHOOK_URL}"
 PROGRESS_FILE = "/tmp/batch-room-settings-progress.json"
 
diff --git a/DW-Programming/room-setting-app/generate-phillipe-romano-rooms.py b/DW-Programming/room-setting-app/generate-phillipe-romano-rooms.py
index 077fc9a5..ea6191e4 100644
--- a/DW-Programming/room-setting-app/generate-phillipe-romano-rooms.py
+++ b/DW-Programming/room-setting-app/generate-phillipe-romano-rooms.py
@@ -25,7 +25,7 @@ import datetime
 ROOM_API = "http://127.0.0.1:3075/api/generate-room"
 SHOPIFY_BASE = "https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-01"
 SHOPIFY_TOKEN = os.environ['SHOPIFY_ADMIN_TOKEN']
-DB_CONN = "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB_CONN = "postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 SLACK_WEBHOOK = "${SLACK_WEBHOOK_URL}"
 PRODUCTS_JSON = "/tmp/phillipe-romano-rooms-products.json"
 PROGRESS_FILE = "/tmp/phillipe-romano-rooms-progress.json"
diff --git a/DW-Programming/room-setting-app/scripts/__pycache__/batch-room-generator.cpython-314.pyc b/DW-Programming/room-setting-app/scripts/__pycache__/batch-room-generator.cpython-314.pyc
deleted file mode 100644
index 651abc17..00000000
Binary files a/DW-Programming/room-setting-app/scripts/__pycache__/batch-room-generator.cpython-314.pyc and /dev/null differ
diff --git a/DW-Programming/room-setting-app/scripts/batch-room-generator.py b/DW-Programming/room-setting-app/scripts/batch-room-generator.py
index e44cc4f1..19b7754b 100644
--- a/DW-Programming/room-setting-app/scripts/batch-room-generator.py
+++ b/DW-Programming/room-setting-app/scripts/batch-room-generator.py
@@ -34,7 +34,7 @@ import argparse
 ROOM_API = "http://127.0.0.1:3075/api/generate-room"
 SHOPIFY_BASE = "https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-01"
 SHOPIFY_TOKEN = os.environ['SHOPIFY_ADMIN_TOKEN']
-DB_CONN = "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB_CONN = "postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 SLACK_WEBHOOK = "${SLACK_WEBHOOK_URL}"
 PROGRESS_FILE = "/tmp/batch-room-generator-progress.json"
 
diff --git a/DW-Programming/scripts/versa-image-enrichment.sh b/DW-Programming/scripts/versa-image-enrichment.sh
index b87bf3fd..1ae1eaf0 100755
--- a/DW-Programming/scripts/versa-image-enrichment.sh
+++ b/DW-Programming/scripts/versa-image-enrichment.sh
@@ -3,7 +3,7 @@
 # Fetches product pages and extracts primary image (Thumbnails/ path) from fancybox links
 # Updates versa_catalog.image_url and all_images in PostgreSQL
 
-DB="postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB="postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
 BASE="https://www.versadesignedsurfaces.com"
 
diff --git a/DW-Programming/scripts/william-morris-image-enrichment.sh b/DW-Programming/scripts/william-morris-image-enrichment.sh
index 4c83e7fa..ae376aa7 100755
--- a/DW-Programming/scripts/william-morris-image-enrichment.sh
+++ b/DW-Programming/scripts/william-morris-image-enrichment.sh
@@ -3,7 +3,7 @@
 # Fetches product pages and extracts og:image meta tag
 # Updates william_morris_catalog.image_url in PostgreSQL
 
-DB="postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB="postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
 
 TOTAL=0
diff --git a/DW-Programming/vendor-crawlers/scripts/monthly-vendor-update.sh b/DW-Programming/vendor-crawlers/scripts/monthly-vendor-update.sh
index a1a863d3..c1a87f8b 100755
--- a/DW-Programming/vendor-crawlers/scripts/monthly-vendor-update.sh
+++ b/DW-Programming/vendor-crawlers/scripts/monthly-vendor-update.sh
@@ -143,7 +143,7 @@ log "  ⚠️  Skipped: $SKIPPED"
 # Final database counts
 log ""
 log "📊 Final Database Counts:"
-export PGPASSWORD='DW2024SecurePass'
+export PGPASSWORD="${PGPASSWORD:-}"
 timeout 15 psql -h 127.0.0.1 -U dw_admin -d dw_unified -t -c "
 SELECT 'Arte: ' || COUNT(*) FROM arte_catalog UNION ALL
 SELECT 'Bespoke: ' || COUNT(*) FROM bespoke_catalog UNION ALL
diff --git a/lib/architectural-vendor-update/README.md b/lib/architectural-vendor-update/README.md
index 33985f5d..25e3de71 100644
--- a/lib/architectural-vendor-update/README.md
+++ b/lib/architectural-vendor-update/README.md
@@ -315,7 +315,7 @@ DB_HOST=127.0.0.1
 DB_PORT=5432
 DB_NAME=dw_unified
 DB_USER=dw_admin
-DB_PASSWORD=DW2024SecurePass
+DB_PASSWORD=<set-in-environment-rotated-2026-05-30>
 ```
 
 ### TypeScript Config
diff --git a/scripts/__pycache__/batch-room-generator.cpython-314.pyc b/scripts/__pycache__/batch-room-generator.cpython-314.pyc
deleted file mode 100644
index f57e7f6e..00000000
Binary files a/scripts/__pycache__/batch-room-generator.cpython-314.pyc and /dev/null differ
diff --git a/scripts/__pycache__/batch-room-settings.cpython-314.pyc b/scripts/__pycache__/batch-room-settings.cpython-314.pyc
deleted file mode 100644
index 65545ded..00000000
Binary files a/scripts/__pycache__/batch-room-settings.cpython-314.pyc and /dev/null differ
diff --git a/scripts/archive-thibaut-unknown.js.DISABLED-2026-04-24 b/scripts/archive-thibaut-unknown.js.DISABLED-2026-04-24
index 97ed3526..d232854a 100644
--- a/scripts/archive-thibaut-unknown.js.DISABLED-2026-04-24
+++ b/scripts/archive-thibaut-unknown.js.DISABLED-2026-04-24
@@ -14,7 +14,7 @@ const SHOPIFY_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
 const API_VERSION = '2024-01';
 
 const pool = new Pool({
-  connectionString: 'postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified'
+  connectionString: 'postgresql://dw_admin@127.0.0.1:5432/dw_unified'
 });
 
 const NOW = new Date().toISOString();
diff --git a/scripts/batch-room-generator.py b/scripts/batch-room-generator.py
index 54279c17..57ee80c4 100644
--- a/scripts/batch-room-generator.py
+++ b/scripts/batch-room-generator.py
@@ -22,7 +22,7 @@ from urllib.parse import urlparse
 
 # ── Config ──────────────────────────────────────────────────────────────────
 
-DB_DSN = "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB_DSN = "postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 ROOM_APP_URL = "http://localhost:3075/api/generate-room"
 SHOPIFY_DOMAIN = "designer-laboratory-sandbox.myshopify.com"
 SHOPIFY_TOKEN = os.environ['SHOPIFY_ADMIN_TOKEN']
diff --git a/scripts/batch-room-settings.py b/scripts/batch-room-settings.py
index fe4108d2..1398aa25 100644
--- a/scripts/batch-room-settings.py
+++ b/scripts/batch-room-settings.py
@@ -17,7 +17,7 @@ import psycopg2.extras
 from datetime import datetime
 
 # ── Config ──────────────────────────────────────────────────────────────────
-DB_URL = "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB_URL = "postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 ROOM_API = "http://localhost:3075/api/generate-room"
 SHOPIFY_STORE = "designer-laboratory-sandbox.myshopify.com"
 SHOPIFY_TOKEN = os.environ['SHOPIFY_ADMIN_TOKEN']
diff --git a/scripts/justindavid-daily-cron.sh b/scripts/justindavid-daily-cron.sh
index 227b5144..42d72189 100755
--- a/scripts/justindavid-daily-cron.sh
+++ b/scripts/justindavid-daily-cron.sh
@@ -10,14 +10,14 @@ SLACK_WEBHOOK="${SLACK_WEBHOOK_URL}"
 echo "=== JustinDavid Room Settings $(date) ===" >> "$LOG"
 
 # Check how many upholstery remain
-UPHOLSTERY_REMAINING=$(psql -t -A "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified" -c "
+UPHOLSTERY_REMAINING=$(psql -t -A "postgresql://dw_admin@127.0.0.1:5432/dw_unified" -c "
   SELECT COUNT(*) FROM justindavid_catalog
   WHERE category IN ('upholstery_texture','upholstery_pattern','upholstery_specialty','faux_leather','outdoor_faux_leather','outdoor_upholstery')
     AND image_url IS NOT NULL AND image_url != ''
     AND (room_setting_url IS NULL OR room_setting_url = '');
 ")
 
-DRAPERY_REMAINING=$(psql -t -A "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified" -c "
+DRAPERY_REMAINING=$(psql -t -A "postgresql://dw_admin@127.0.0.1:5432/dw_unified" -c "
   SELECT COUNT(*) FROM justindavid_catalog
   WHERE category IN ('drapery','drapery_blackout','sheer','roller_shade','multi_use_drapery')
     AND image_url IS NOT NULL AND image_url != ''
@@ -44,7 +44,7 @@ else
 fi
 
 # Send progress update to Slack
-TOTAL_DONE=$(psql -t -A "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified" -c "
+TOTAL_DONE=$(psql -t -A "postgresql://dw_admin@127.0.0.1:5432/dw_unified" -c "
   SELECT COUNT(*) FROM justindavid_catalog WHERE room_setting_url IS NOT NULL AND room_setting_url != '';
 ")
 
diff --git a/scripts/rw-drapery-daily-cron.sh b/scripts/rw-drapery-daily-cron.sh
index 87e395e2..0014b9ec 100755
--- a/scripts/rw-drapery-daily-cron.sh
+++ b/scripts/rw-drapery-daily-cron.sh
@@ -16,7 +16,7 @@ TOTAL=$(ls room-settings/rw-drapery/*.png 2>/dev/null | wc -l)
 echo "Total images after run: $TOTAL" >> "$LOG"
 
 # Update local paths to public URLs
-PGPASSWORD='DW2024SecurePass' psql -h 127.0.0.1 -U dw_admin -d dw_unified -c "
+PGPASSWORD="${PGPASSWORD:-}" psql -h 127.0.0.1 -U dw_admin -d dw_unified -c "
 UPDATE rwltd_catalog
 SET room_setting_url = REPLACE(room_setting_url, '/root/Projects/Designer-Wallcoverings/room-settings/', 'http://45.61.58.125/room-settings/'),
     agent_updated_at = NOW()
@@ -24,7 +24,7 @@ WHERE room_setting_url LIKE '/root/Projects/Designer-Wallcoverings/room-settings
   AND (spec_type ILIKE '%drapery%' OR spec_type ILIKE '%sheer%')" >> "$LOG" 2>&1
 
 # Check remaining
-REMAINING=$(PGPASSWORD='DW2024SecurePass' psql -h 127.0.0.1 -U dw_admin -d dw_unified -t -c "
+REMAINING=$(PGPASSWORD="${PGPASSWORD:-}" psql -h 127.0.0.1 -U dw_admin -d dw_unified -t -c "
 SELECT COUNT(*) FROM rwltd_catalog
 WHERE spec_design LIKE '%Solid%'
   AND (room_setting_url IS NULL OR room_setting_url = '')")
diff --git a/scripts/vendor-monthly/elitis-recrawl.sh b/scripts/vendor-monthly/elitis-recrawl.sh
index 9939e26d..0211c51f 100755
--- a/scripts/vendor-monthly/elitis-recrawl.sh
+++ b/scripts/vendor-monthly/elitis-recrawl.sh
@@ -17,7 +17,7 @@ if pgrep -f "scraper.js" > /dev/null; then
 fi
 
 # Get initial product count
-INITIAL_COUNT=$(psql -t postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified -c "SELECT COUNT(*) FROM elitis_catalog" 2>/dev/null | tr -d ' ')
+INITIAL_COUNT=$(psql -t postgresql://dw_admin@127.0.0.1:5432/dw_unified -c "SELECT COUNT(*) FROM elitis_catalog" 2>/dev/null | tr -d ' ')
 echo "Initial PostgreSQL count: $INITIAL_COUNT" >> "$LOG_FILE"
 
 # Run the scraper
@@ -26,7 +26,7 @@ echo "Starting Elitis scraper..." >> "$LOG_FILE"
 node scraper.js >> "$LOG_FILE" 2>&1
 
 # Get final product count
-FINAL_COUNT=$(psql -t postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified -c "SELECT COUNT(*) FROM elitis_catalog" 2>/dev/null | tr -d ' ')
+FINAL_COUNT=$(psql -t postgresql://dw_admin@127.0.0.1:5432/dw_unified -c "SELECT COUNT(*) FROM elitis_catalog" 2>/dev/null | tr -d ' ')
 echo "Final PostgreSQL count: $FINAL_COUNT" >> "$LOG_FILE"
 echo "Products added/updated: $((FINAL_COUNT - INITIAL_COUNT))" >> "$LOG_FILE"
 
diff --git a/scripts/vendor-monthly/thibaut-recrawl.sh b/scripts/vendor-monthly/thibaut-recrawl.sh
index ff8fb2a7..dae7659f 100755
--- a/scripts/vendor-monthly/thibaut-recrawl.sh
+++ b/scripts/vendor-monthly/thibaut-recrawl.sh
@@ -17,7 +17,7 @@ if pgrep -f "full-fetch.js" > /dev/null; then
 fi
 
 # Get initial product count
-INITIAL_COUNT=$(psql -t postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified -c "SELECT COUNT(*) FROM thibaut_catalog" 2>/dev/null | tr -d ' ')
+INITIAL_COUNT=$(psql -t postgresql://dw_admin@127.0.0.1:5432/dw_unified -c "SELECT COUNT(*) FROM thibaut_catalog" 2>/dev/null | tr -d ' ')
 echo "Initial PostgreSQL count: $INITIAL_COUNT" >> "$LOG_FILE"
 
 # Run the scraper
@@ -26,7 +26,7 @@ echo "Starting Thibaut scraper..." >> "$LOG_FILE"
 node full-fetch.js >> "$LOG_FILE" 2>&1
 
 # Get final product count
-FINAL_COUNT=$(psql -t postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified -c "SELECT COUNT(*) FROM thibaut_catalog" 2>/dev/null | tr -d ' ')
+FINAL_COUNT=$(psql -t postgresql://dw_admin@127.0.0.1:5432/dw_unified -c "SELECT COUNT(*) FROM thibaut_catalog" 2>/dev/null | tr -d ' ')
 echo "Final PostgreSQL count: $FINAL_COUNT" >> "$LOG_FILE"
 echo "Products added/updated: $((FINAL_COUNT - INITIAL_COUNT))" >> "$LOG_FILE"
 
diff --git a/shopify/scripts/batch-room-settings.py b/shopify/scripts/batch-room-settings.py
index 02c79641..57803ef5 100644
--- a/shopify/scripts/batch-room-settings.py
+++ b/shopify/scripts/batch-room-settings.py
@@ -19,7 +19,7 @@ import psycopg2.extras
 from datetime import datetime
 
 # --- Config ---
-DB_URL = "postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified"
+DB_URL = "postgresql://dw_admin@127.0.0.1:5432/dw_unified"
 ROOM_API = "http://localhost:3075/api/generate-room"
 SHOPIFY_STORE = "designer-laboratory-sandbox.myshopify.com"
 SHOPIFY_TOKEN = os.environ['SHOPIFY_ADMIN_TOKEN']
diff --git a/shopify/scripts/dedup-phillipe-romano.js.DISABLED-2026-04-24 b/shopify/scripts/dedup-phillipe-romano.js.DISABLED-2026-04-24
index b88f4759..4196c520 100644
--- a/shopify/scripts/dedup-phillipe-romano.js.DISABLED-2026-04-24
+++ b/shopify/scripts/dedup-phillipe-romano.js.DISABLED-2026-04-24
@@ -22,7 +22,7 @@ const SHOPIFY_TOKEN = process.env.SHOPIFY_ADMIN_TOKEN;
 const SLACK_WEBHOOK = 'https://hooks.slack.com/services/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';
 
 const pool = new Pool({
-  connectionString: 'postgresql://dw_admin:DW2024SecurePass@127.0.0.1:5432/dw_unified'
+  connectionString: 'postgresql://dw_admin@127.0.0.1:5432/dw_unified'
 });
 
 // Rate limiter: max 4 mutations/sec to stay well under Shopify's limits

← 11a839f5 shopify(parent): sync gitignore with nested — cover GCP serv  ·  back to Designer Wallcoverings  ·  fix: remove backup source leak from public dir, fix duplicat 20cf51fa →