{"slug":"consulting-intake","total":12,"limit":100,"offset":0,"since":null,"commits":[{"hash":"2f22dfc","date":"2026-08-31 04:14:19 -0700","author":"steve@designerwallcoverings.com","subject":"update lhf.js SOURCE OF TRUTH comment to include intake portal path","body":""},{"hash":"e354af7","date":"2026-08-31 04:13:45 -0700","author":"steve@designerwallcoverings.com","subject":"add LHF widget to intake admin command center (fleet pattern parity)","body":""},{"hash":"5027e89","date":"2026-08-30 14:27:08 -0700","author":"Steve Abrams","subject":"deploy-safety: exclude data/ from rsync so deploys never clobber prod-written intakes/admin edits (TK-22)","body":""},{"hash":"19e3da0","date":"2026-08-30 13:33:29 -0700","author":"Steve Abrams","subject":"Fix creds-in-URL fetch guard on both gated pages (portal/admin) — byte-exact fleet drop-in, standalone files patched directly (TK-22)","body":""},{"hash":"412a186","date":"2026-08-25 10:48:54 -0700","author":"Steve","subject":"creds-safe fetch guard: resolve relative fetch vs credential-free location (creds-in-URL trap)","body":"Fleet inoculation — opening this basic-auth app with credentials in the URL\npoisoned document.baseURI and made relative fetch('/api/…') throw. Guard resolves\nnon-absolute request URLs against location instead. Ref: creds-in-url-fetch-guard-fleet-pattern.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"6a3fbc6","date":"2026-07-25 10:55:27 -0700","author":"Steve","subject":"chore: lint (intake write try/catch), v0.1.2 (session close)","body":""},{"hash":"cdc7067","date":"2026-07-25 10:39:47 -0700","author":"Steve Abrams","subject":"harden public /api/intake: per-IP + global rate limiting (no new deps)","body":"Zero-dependency in-memory sliding-window limiter: 5 submissions/IP/10min plus a\n500/day global backstop so distributed spam can't fill intakes.json. trust proxy\nso it keys on the real client IP through nginx (X-Forwarded-For), not loopback.\nVerified: 5x200 then 429 same-IP; distinct IPs get independent buckets."},{"hash":"c3c30a5","date":"2026-07-19 07:38:05 -0700","author":"Steve Abrams","subject":"intake sign-in: hero Ken-Burns pan-zoom + reduced-motion guard (parity with RENTV portal motion layer)","body":""},{"hash":"b6ee91b","date":"2026-07-17 11:16:09 -0700","author":"Steve","subject":"chore: v-bump (session close)","body":""},{"hash":"0b5ab1d","date":"2026-07-17 09:50:39 -0700","author":"Steve","subject":"Intake app: rich UX — rotating skyline hero, editorial dark-gold system, restyled questionnaire","body":""},{"hash":"cc8c413","date":"2026-07-17 07:56:46 -0700","author":"Steve","subject":"Consulting Intake template home — public questionnaire front door","body":""},{"hash":"eb9a624","date":"2026-07-17 07:56:06 -0700","author":"Steve","subject":"scaffold consulting portal for Consulting Intake","body":""}]}