Rentv 2026
Search the build
-
f19f6ee42026-08-25 initial scaffold + creds-safe fetch guard (gitify per standing rule) -
437aa93c2026-08-15 TK-10569: port /api/advertise + /api/advertise-inquiries from rentv to rentv-2026 -
5a59077e2026-08-15 rentv: per-IP write-form rate limits on /api/subscribe + /api/ad/reserve (TK-10559) -
f2bf75512026-08-15 rentv: P1+P2+P3 public-launch hardening (TK-10564/10575, Steve-approved 2026-08-14) -
d5a4141e2026-08-15 pr-intelligence: add CAN-SPAM List-Unsubscribe header + address footer to buildMime (TK-10578) -
a415d2412026-08-10 chore: v0.24.1 (session close — ad-slots correctness fixes + coverage) -
fc7ec8012026-08-10 fix(adslots): 5 ad-system.cjs correctness fixes + regression guards (TK-10364) -
f709ec782026-08-10 test(adslots): +124 coverage (buildInventory sources/dedup, reserve soft-hold lifecycle, exact price ladder, admin gating) + replace a pricing tautology with live-value asserts -
423cfa3d2026-08-08 test(adslots): cover ad-system admin write paths (video/placement/site-template) -
9af4fe932026-08-08 chore: sync package-lock version to 0.24.0 (trailing the v0.24.0 bump) -
adcaafca2026-08-08 test(adslots): rate-card data contract + rate-card/slot endpoint coverage -
e15f53982026-08-08 test(adslots): cover ad-system + fix filtered inventory summary mismatch -
4295511a2026-08-07 chore: v0.24.0 (session close — View-all toggle wired + preview synced) -
d71f0c892026-08-07 fix(login): resolve /api/login against location.origin so Basic-Auth creds-in-URL access can't taint the fetch base -
ee2f98022026-08-07 fix: inject template-toggle.js (View-all compare) site-wide — was orphaned, only /toggle.js (front/backend switcher) was wired -
ed7346a72026-08-07 chore: gitignore node_modules symlink (was leaking as untracked) + package-lock -
a6b6120d2026-08-07 5x sweep 2: 'Make this the site' works in preview mode (PUBLIC/OPEN), stays adminOnly on prod -
fb82cb6c2026-08-07 5x sweep 1: add favicon.ico + favicon.svg (fixes /favicon.ico 404 site-wide) -
3a9785bd2026-08-07 selector: bake rank + why-it-wins + competitor into each full-screen preview modal -
cfd849be2026-08-07 selector: add Classic (original) as 6th option + rank all 6 + why-it-wins + CRE competitor landscape -
a28939c12026-08-07 chore: v0.23.0 (session close — admin View all template-compare toggle) -
72de4de22026-08-07 TK-10350: render-proof screenshots for the 5 template variants (A/C/D/E) -
931727112026-08-07 TK-10350: verify 5 distinct template variants + wire template D video cards into ad inventory (all 123 videos sponsorable) -
1add61c92026-08-07 docs: surgical deploy handoff for claude-rentv-max (toggle + templates + ad-slots) -
cf5c27a72026-08-07 TK-10105: fix heygen 'Not logged in' auth wiring in buildloop -
3e325c5f2026-08-07 template-toggle: add admin 'View all — compare' overlay (all 6 templates live side-by-side) -
e6e748c42026-08-07 rentv 2026: admin front-end template toggle -
23094df12026-08-07 rentv: re-gate site behind un/pw (reverse 2026-08-06 public launch) -
089da29b2026-08-07 RENTV 2026: element-numbering overlay (all templates) + demo sold-sponsorship creatives -
827eb1662026-08-07 RENTV 2026: 5-template selector + ad-slots-for-sale system (all videos as sponsorable inventory) -
5b0ae4392026-08-07 auto-data-snapshot: 2026-08-07T10:41:58 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
7061d1992026-08-07 auto-data-snapshot: 2026-08-07T10:09:04 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
10285af72026-08-07 auto-data-snapshot: 2026-08-07T09:37:33 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
3e204fc82026-08-07 chore: v0.21.5 → v0.22.0 (session close — All Star Group section + 5-theme picker) -
4bfeb75c2026-08-07 allstar: default theme → Capital (Blackstone dark+gold) for first load -
0521e0122026-08-07 auto-data-snapshot: 2026-08-07T09:05:06 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
0a9bf9432026-08-07 allstar: 5 firm-inspired themes with distinct UI per theme (toggle + persist) -
6b98f1662026-08-07 auto-data-snapshot: 2026-08-07T08:32:43 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
da2aa3f62026-08-07 Add All Star Group section to RENTV backend — RENTV-style rebuild, 2026 -
f3f859ab2026-08-07 auto-data-snapshot: 2026-08-07T08:00:20 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
557f42ea2026-08-07 auto-data-snapshot: 2026-08-07T07:29:27 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
4cf0c4ad2026-08-07 consulting portal: sync refreshed CRCP growth page + daynight readability fix from consulting-rentv-com@55f002c (TK-10299/TK-10319) -
8e9b0dd52026-08-07 auto-data-snapshot: 2026-08-07T06:58:19 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
5908c9c82026-08-07 auto-data-snapshot: 2026-08-07T06:27:13 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
7200a5452026-08-07 auto-data-snapshot: 2026-08-07T05:56:28 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
8c92dd652026-08-07 auto-data-snapshot: 2026-08-07T05:25:40 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
1a4a5cda2026-08-07 auto-data-snapshot: 2026-08-07T04:54:46 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
3039ae022026-08-07 auto-data-snapshot: 2026-08-07T04:23:46 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
51ae0ace2026-08-07 auto-data-snapshot: 2026-08-07T03:53:01 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
7c16d0b42026-08-07 auto-data-snapshot: 2026-08-07T03:22:15 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
a1de2be72026-08-07 auto-data-snapshot: 2026-08-07T02:51:26 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
1df4a6422026-08-07 auto-data-snapshot: 2026-08-07T02:20:18 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
f12c8ab22026-08-07 auto-data-snapshot: 2026-08-07T01:49:10 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
1af729182026-08-07 auto-data-snapshot: 2026-08-07T01:18:25 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
96d1ede22026-08-07 auto-data-snapshot: 2026-08-07T00:47:33 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
ac9af4fd2026-08-07 auto-data-snapshot: 2026-08-07T00:16:37 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
eb01e95d2026-08-06 auto-data-snapshot: 2026-08-06T23:45:50 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
55fdc7ec2026-08-06 auto-data-snapshot: 2026-08-06T23:15:02 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
735b79ac2026-08-06 auto-data-snapshot: 2026-08-06T22:44:16 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
026b96132026-08-06 auto-data-snapshot: 2026-08-06T22:13:22 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
a7dacdd92026-08-06 auto-data-snapshot: 2026-08-06T21:42:38 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
30954cd42026-08-06 auto-data-snapshot: 2026-08-06T21:11:53 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
66c560a52026-08-06 auto-data-snapshot: 2026-08-06T20:41:05 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
8e4a39892026-08-06 auto-data-snapshot: 2026-08-06T20:10:15 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
4865af4c2026-08-06 auto-data-snapshot: 2026-08-06T19:39:21 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
d2db9fcc2026-08-06 auto-data-snapshot: 2026-08-06T19:08:34 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
db9cc1f32026-08-06 auto-data-snapshot: 2026-08-06T18:37:41 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
59a60b882026-08-06 fix(archive): dedup parse-article's STALE parser fork → import the hardened deal-parse (single source of truth). parse-article.mjs kept its own OLD copies of parseAmount/txnOf/typeOf/classify/parseSize/summarize — the news-archive pipeline (pull-archive→parseArticle) was silently running WITHOUT every deal-parse fix. Proven live-divergent: $153/sf→153 (now null), $5 billionaire→$5B (now 5), 104k sf→lost (now 104000), summarize '$1. 625' (now '$1.625'). Deleted the 6 duplicates, import+re-export from deal-parse. +5 tests (parseHeadline/parseDate/bodyText/parseArticle + a dedup-lock), 70/0. -
01984a252026-08-06 auto-data-snapshot: 2026-08-06T18:06:44 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
f2f651fd2026-08-06 auto-data-snapshot: 2026-08-06T17:35:56 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
47c3761d2026-08-06 polish(services): trade chips — specialty trades lead, General buckets trail muted -
47cb4fdb2026-08-06 feat(services): contractor trade filter (CSLB class) for Construction -
9911142f2026-08-06 auto-data-snapshot: 2026-08-06T17:04:50 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
046808212026-08-06 harden(brief): stale-lock TTL — a hard-killed run (SIGKILL/OOM) that leaves the brief-gen lock behind can't silently disable brief refresh forever; a run >15min old (≫ any real run) is stolen with a WARN, else a live concurrent run holds it → skip. Closes the one lock caveat Cody raised on the concurrent-run fix. -
3e79a22d2026-08-06 harden(agents review): spend-safety + robustness pass on this session's code (2 read-only reviewers, findings verified before applying). gen-deal-brief: (1) ledger write wrapped so a post-TTS ENOSPC surfaces LOUD instead of silently under-counting the cap; (2) --force now bypasses dedupe ONLY, cap needs explicit --force-overcap; (3) lockfile prevents two overlapping runs double-spending; (4) DRY_RUN=0 no longer treated as dry. parseAmount: (?![a-z]) kills the '$5 billionaire'→$5B fabrication (0/30 corpus regressions; now feeds paid TTS). brief.html: scheme-guard t.href (no javascript: URLs). +1 test, 65/0. -
9c83657e2026-08-06 fix(firm): profile KPIs drill deeper (every-datum-hrefs rule) — 'Largest deal' → that deal's page, 'Top asset class' → /sector?type=. KPIs with no clean deeper target (Total volume/Deals/Markets) left unlinked rather than forced. Verified targets valid (/sector accepts ?type=), profile serves 200. -
1a6901b52026-08-06 feat(brief): hard monthly spend cap (BRIEF_MONTHLY_CAP, default 40 ≈ $6/mo) — a dollar backstop beyond the top-deal-change dedupe. Even if the top deal flaps, spend is bounded; ledger in rsync-excluded public/audio (prod-owned, survives deploys). Verified: cap=0 skips before any TTS call (no mp3, no spend). -
35d978b22026-08-06 auto-data-snapshot: 2026-08-06T16:33:58 (8 data files) — .deploy.conf data/deals-registry.json data/deals.json data/markets.json data/news.json -
ab40d2bf2026-08-06 feat(brief): auto-refresh the Boomer 'Deal of the Day' — pull-deals chains generateBrief() after writing deals.json (dedupe-guarded → spends ~$0.15 ONLY when the top deal changes; NON-FATAL so a TTS error never breaks the crawl). Keeps /brief current on prod via the existing pull-deals cron — no crontab edit. gen-deal-brief refactored to export generateBrief() + run standalone only when invoked directly. 64/0. -
6574a4ff2026-08-06 feat(services): Property Management now registry-backed (162 DRE-licensed PM firms) -
fd1945d52026-08-06 nav: surface /firm (💼 Active Dealmakers) in the site-wide Explore drawer (rentv-nav.js) — the live Broker/Firm feature was only in its own page's drawer, undiscoverable elsewhere. One-line additive edit next to the deal-data links. Discoverability for a shipped feature. -
48878dbe2026-08-06 feat(brief): Boomer 'Deal of the Day' audio brief (REPOINT feature #3, Steve-approved) — gen-deal-brief.mjs composes a factual script from the top deal (reuses acquirer) + ElevenLabs TTS in Boomer's voice (czUPGx5phxE6qpQ46nRS), with a top-deal-change spend guard (~$0.15/day not per-cron) + DRY_RUN; brief.html gains a graceful audio player. ALSO fixes a real summarize() bug the brief surfaced: the sentence splitter broke decimals ('$1.625'→'$1. 625') on every deal card — now splits only on a terminator+space+capital. +1 test, 64/0. Generated 1 brief ($0.147, local). -
218458872026-08-06 auto-data-snapshot: 2026-08-06T16:03:07 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
8e0541c92026-08-06 feat(services): CSV export + per-view SEO/JSON-LD + provider detail pages -
6190cac52026-08-06 feat(deals): parseAcquirer recall 19→23/30 — handle development announcements (dev verbs: starts work on / breaks ground / underway → GO Industrial, Meta Housing) + passive voice ('Acquired by <Firm>' / 'sold to <Firm>' → WareSpace, Blackstone). Still zero asset-as-firm false positives (asset/place-fronted guard unchanged). +5 test cases, 63/0. -
e393d66a2026-08-06 feat(services): DTD-verdict guardrails on the Featured layer (keep-with-guardrails) -
b63cb3392026-08-06 auto-data-snapshot: 2026-08-06T15:32:11 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
8d3f54a32026-08-06 feat(firm): dedicated firm PROFILE view on /firm?name= — header + KPI strip (total volume, deals, markets, top asset class, largest deal) + that firm's deals as full cards, with a back link. This completes the 'Broker/Firm profile page' vision (REPOINT #1); index leaderboard unchanged. Client-side, reuses build() data, verified computation + both modes 200. -
04e22ebe2026-08-06 consulting portal: revert stray theme-aware --dim/--panel indirection (forced-black bg already handles readability) -
8d29e4272026-08-06 feat(firm): /firm 'Active Dealmakers' page — deal flow grouped by acquiring firm (ranked by volume/count, expandable to each firm's deals, deep-linkable ?name=), + acquirer link on deal cards → /firm (href-deeper rule). REPOINT feature #1 visible layer, built on parseAcquirer/acquirer. Pure client-side off /api/deals (zero server.js edits — express.static serves it at /firm); null-acquirer deals honestly excluded + disclosed, never bucketed as a phantom firm. -
9aa5412f2026-08-06 feat(deals): parseAcquirer() extracts the leading firm from a deal title + persist as 'acquirer' — the data substrate for the Broker/Firm profile pages (REPOINT feature #1, Steve-approved). HIGH precision: 19/30 clean firms on the live corpus, 0 asset-as-firm false positives (asset-fronted/place-fronted/passive → honest-null). +2 tests, 63/0. Field populates on next pull-deals cron run. -
e8a2e4012026-08-06 chore(services): localhost-only ?reset=outreach to clear the outreach basket -
44ff063a2026-08-06 auto-data-snapshot: 2026-08-06T15:00:51 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
0007cc492026-08-06 auto-data-snapshot: 2026-08-06T14:29:57 (8 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
ef48e64f2026-08-06 fix(deals): summarize() collapses whitespace runs — the sentence class absorbed leading spaces so join yielded 'end. Start' (2-3 spaces) on 30% of the LIVE corpus's customer-facing deal-card summaries. \s+→' ' normalizes (also flattens tab/newline from fetched bodies). Updated 2 tests that pinned the artifact + added a source-multispace test. 61/0 -
4c3bc4912026-08-06 feat(services): per-firm pitch note rides into the /social letter -
980b53512026-08-06 chore: remove dead looksPlace helper + vN patch bump (session close) — parseAmount \s* + sanitizeLocation state-name map hardening -
d0acfe5e2026-08-06 auto-data-snapshot: 2026-08-06T13:58:45 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
971e9e4b2026-08-06 harden(deals): parseAmount \s* binds magnitude across a typographic double space ($52 million→$52M, was $52); document range + billionaire as zero-occurrence follow-ons. Pure superset — real corpus uses ≤1 space, no existing input changes. +1 test, 60/0 -
206b99542026-08-06 Gate E (TK-10076): /services degraded-state banner on realestate outage (was silent 'No providers found') + zero-row services canary (4x/day → CNCP) -
a3ae8ad52026-08-06 auto-data-snapshot: 2026-08-06T13:27:53 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
0250fee32026-08-06 feat(services): 'Solicit all visible' bulk action (admin) -
17716ea22026-08-06 harden(location): Cody gate — normalize whitespace before the state-name lookup + add a bare 'dc' key so 'D.C.' and double-spaced 'New Mexico' resolve instead of silently dropping to null -
338049672026-08-06 auto-data-snapshot: 2026-08-06T12:57:07 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
3b60464d2026-08-06 fix(location): sanitizeLocation maps a full state NAME to its code instead of blind slice(0,2) — a model returning 'Arizona' was truncated to 'AR' (Arkansas!), 'Nevada'→'NE' (Nebraska!), 'Texas'→'TE' (dropped), silently mis-attributing RENTV's core states. Valid 2-letter codes unchanged; non-US dropped. +6 tests, 59/0 -
d3fe7c222026-08-06 feat(services): admin-only 'Solicit' → pipes firm into /social outreach generator -
427a4cf22026-08-06 feat(services): rank big multi-location firms first (solicitation view) + add Arizona -
b2b4b8c82026-08-06 harden(llm-extract): Cody gate — anchor num() at the LEADING number + a >=100k 'already a full dollar value' guard, fixing a CATASTROPHE my first pass introduced ('51800000 (51.8M)' concatenated digit runs then scaled → $5e15). Also covers mln/bn abbrevs; anchoring rejects 'lot 5b'. 17/17 verified -
869dd4362026-08-06 auto-data-snapshot: 2026-08-06T12:25:51 (1 data files) — package-lock.json -
1683930c2026-08-06 chore: v0.21.4 (session close — /consulting black bg + daynight-skip cleanup) -
4b1f148b2026-08-06 harden(llm-extract): magnitude-aware num() — if the model returns '51.8 million'/'$1.2 billion'/'$51.8M'/'985k' instead of the requested integer, scale it (was signed as 52/1/52/985 by the digits-only strip). Compliant integers unchanged. Defensive: no verified live occurrence (archive stores no amounts) but the num() mangling is a real reproducible code weakness feeding customer-facing amounts -
e61ee4192026-08-06 chore: dynamic featured-video + latest-article hero + image-pipeline fix, v0.21.3 (session close) -
0121172a2026-08-06 fix(deploy-frontpage): zsh array for ssh opts (plain string errored 'connecttimeout extra arguments' on first real use) -
78a39e802026-08-06 PR-intel: add found_role_corroborated status (DTD verdict C) — role-backed search hit distinct from URL-identity-confirmed; same-run promotion; score 60; UI badge + filter + migration 011 -
8d4a638e2026-08-06 feat(services): guarantee >=1 vendor per category — curated Featured layer -
71ec8d492026-08-06 fix(auth): bridge server-admin session into /api/pr so deals.html deal-notes work -
f8daa54d2026-08-06 Fix /consulting/slideshow dead 403: INTERNAL_STATIC guard now redirects anon browser hits to /login (mirrors adminOnly) -
0960554d2026-08-06 consulting portal: remove dead theme-aware CSS (superseded by forced-black bg) -
b1faccd82026-08-06 harden(feeds): Cody sweep — xmlEsc the channel-level <link> in feed.xml + deals.xml too (their item links were escaped but the Host-derived channel link wasn't — the same gap just closed in sitemap.xml). feed.json is safe (JSON.stringify). TDZ non-issue: handlers run post-load -
9cf5e94e2026-08-06 consulting: skip daynight injection on /consulting (DTD verdict A — kill the dead toggle button on the dark-locked deliverable; scoped to /consulting, admin/versions/desk keep the toggle) -
3cc788862026-08-06 deploy.sh: reload procs separately + retrying health check (auto-deploy hook) -
1f8406752026-08-06 fix(sitemap): xmlEsc the <loc> (sibling-drift — feed.xml/deals.xml already escape) so the sitemap stays valid XML if a slug carries an '&' and the client-controlled Host header can't inject into it. Defensive: current slugs/ids are all clean -
551290202026-08-06 nav(services): add CRE Services to shared masthead drawer (rentv-nav.js) + homepage nav row -
bc6ded372026-08-06 feat(services): metro switcher (LA/OC/SD/IE/Ventura) + fleet nav link -
03e431332026-08-06 harden(content-studio): Cody gate — also drop 'reports? that' + 'covered by' from the attribution scrub (they mangled 'annual report that…' / 'parking covered by a canopy'), and clean a connective left DANGLING by the outlet strip only when it precedes punctuation (so 'per unit'/'covered by a canopy' stay intact). Verified 8/9; rare mid-clause dangling-via residual documented -
ac3c09852026-08-06 chore: v0.21.2 (session close — nav: Regions + Market Snapshot to right hamburger) -
f35eeeac2026-08-06 auto-data-snapshot: 2026-08-06T11:23:39 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
5d632c192026-08-06 add /consulting black-bg post-deploy verifier -
ceb687082026-08-06 consulting portal: pin bright accents unconditionally so text stands out on the forced-black bg (day + night) -
d72a12932026-08-06 consulting portal: make gold + semantic accents theme-aware so text is readable in day mode -
0e0b17f32026-08-06 consulting portal: force permanent black background (override daynight day-mode washout) -
f57a571a2026-08-06 Move Regions + Market Snapshot into the right hamburger (Sections) drawer -
95adcfbf2026-08-06 fix(content-studio): stop the attribution scrub from deleting bare 'per'/'via' — they mangled common CRE prepositions in generated copy ('$928k per unit'→'$928k unit', '6% per annum'→'annum', 'via a JV'→'a JV'). Real 'per <outlet>' attribution already neutralized by the outlet-name strip above -
d7e04f052026-08-06 feat(services): /services — Greater LA CRE services directory from real license registries -
a8efed7c2026-08-06 PR-intel: soft-delete (Discard) for outreach drafts -
466646372026-08-06 PR-intel CA gate: count a verified general_press_email as a contact -
41fe62072026-08-06 rentv front page: feature Boomer's CRE Talk video (vimeo 1178561985) front & center above the news hero (static block, persists through wire re-render) -
48c937222026-08-06 rentv front page: fold Market Snapshot stats strip into a collapsed-on-load module too (restores grid, not block, when expanded) -
faad4bab2026-08-06 rentv front page: drawer groups collapse on load — click a title to expand (accordion, both hamburgers, covers async Regions group) -
cd119d7c2026-08-06 fix(topic-hubs): word-boundary hub-keyword matching so a mid-word substring can't mis-file an article — 'bank' no longer tags Burbank as lenders-banks, 'mall'∉small, 'sale'∉wholesale, 'loan'∉Sloan. Leading-\b keeps intentional prefixes (refinanc→refinancing, bank→bankruptcy); space-padded ' ai ' stays a whole word -
1280b1632026-08-06 nav: add /deals-log (Deals Log) to map hamburger + Explore drawer (TK-10296) -
30df559d2026-08-06 PR CRM notes: attach to deals too (string entity_id) + deals.html wiring -
81770f552026-08-06 rentv front page: split single left drawer into 2 corner hamburgers (Explore left / Sections right) — parity with masthead nav -
ce0799962026-08-06 nav: surface /market-pulse (charts) in map hamburger + site-wide Explore drawer -
b83fd44b2026-08-06 harden(news-dedup): Cody gate — word-boundary the single-char units (b/m/k) so '$985,000 Multifamily' / '$1,000 Monthly' don't capture the next word's first letter as a unit (the false 'm' had made '$1,000 monthly' sign identical to '$1 billion'). Full-word units unchanged -
6b792cc92026-08-06 PR CRM: user-authored notes on any entity (org/broker/person/property/deal) -
14e137d52026-08-06 fix(news-dedup): newsSig amount normalization strips commas + scales a no-unit raw-dollar amount to millions — '$985,000' was captured as '985' and signed as $985M, risking a false same-deal merge (hiding a distinct story). Mil/Bil/k cases unchanged -
f4d659e32026-08-06 auto-data-snapshot: 2026-08-06T10:21:57 (6 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/ticker.json -
2837beed2026-08-06 Split nav into TWO hamburgers: upper-left (Explore+Regions) + upper-right (Sections+Tools) -
ba9f632d2026-08-06 logo: make it genuinely LIQUID — animated specular sweep + flowing tint + frosted glass -
4600ddf82026-08-06 auto-data-snapshot: 2026-08-06T10:13:41 (7 data files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
39ea230c2026-08-06 docs: mark multi-tenant RLS isolation DONE + operational notes (superuser migrations) -
9d3b82a92026-08-06 Sitewide nav: collapse all tab strips into a hamburger + center the logo -
b14737eb2026-08-06 fix(pr-intelligence): graceful 404 on people?id=<dead> — openPerson caught PR.api's throw on a non-existent person id (e.g. deep-link ?id=2539, which isn't among the 844 real people) and the detail drawer crashed unhandled. Now shows 'Person not found' instead of throwing. -
ea0ef6cd2026-08-06 PR intel (b2 complete): tenant isolation via Postgres RLS -
0044e5f82026-08-06 News map: collapse ALL controls into one LEFT hamburger; strip the busy top bar -
f47b2a572026-08-06 harden(dealdesk): Cody gate — coveredBy matches the needle segment as a WHOLE WORD (not substring), fixing the sf→transfers false-cover (27 titles) AND recovering legit short-firm coverage (CBRE→2 real matches) a length threshold would drop; <4-char floor drops state/initialism noise. (Verified Cody's >4-substring would've reintroduced hines∈machines) -
8c370f632026-08-06 fix(dealdesk): coveredBy guards the matched SEGMENT length, not the full needle — a needle like 'SF, CA 94105' was matching on 2-char 'sf' (∈ tranSFers) and falsely marking deals already-covered, skipping good Deal Desk candidates -
cb99f3132026-08-06 auto-save: 2026-08-06T09:51:16 (8 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
5c689bb62026-08-06 News map: collapse nav into a hamburger + log all articles in sitemap -
89d927a82026-08-06 chore: bump version to 0.21.1 (session close — cycles 16-40 deal-quality + admin-grid + Boomer voice, all deployed live) -
108b73922026-08-06 PR intel (b2 partial): scope outreach reads by tenant + completion checklist -
f6e1cf9d2026-08-06 PR intel (a): also delegate the no-trailing-slash /admin/pr-intelligence index so the empty shell isn't anon-accessible (data was already 401 either way) -
88858d332026-08-06 Public polish: hide all admin nav links from public + SEO for /map -
a3ed3e452026-08-06 PR intel (a): clean client login — server delegates PR surface to the PR auth layer -
12d0f4142026-08-06 harden(boomer-voice): Cody gate — digit-anchor every forSpeech size rule so bare 'SF' (San Francisco) and 'MSF Capital' aren't read as 'square feet'; also consumes the 'sq. ft.' trailing dot. Legit sizes (1.27 msf/104k sf/538,000 sf) still normalize -
1be2f46b2026-08-06 PR intel: router-level capability gate (b1) — every /api/pr route self-protects -
749cf6e92026-08-06 fix(boomer-voice): correct the stale comment naming the WRONG voice_id (EoZq → the current czUP clone) + normalize CRE shorthand for TTS ('1.27 msf'→'1.27 million square feet') + strip title trailing punctuation and fix empty-core double-space in the VO -
27f2cd042026-08-06 News map: market-activity stats panel (count + deal volume + top metros) -
ca159afb2026-08-06 PR intel: correspondence timeline on the contact drawer -
df653c372026-08-06 auto-save: 2026-08-06T09:20:28 (10 files) — .deploy.conf data/deals-registry.json data/deals.json data/markets.json data/news.json -
ee669c0a2026-08-06 fix(logo): keep header brand centered — .rentv-logo's position:relative clobbered .brand's absolute centering -
f3b164102026-08-06 harden(deals): Cody gate — scope parseOccupancy 'pre-' to 'leased' only so '90% preoccupied' isn't read as occupancy (my pre- addition had extended the occup root); \bbuilt ships as-is (Cody's 'custom built' critique was a misfire — that IS the build year) -
f0ce5eb32026-08-06 PR intel: tenant-scope core entity reads + 2nd-tenant safety guard -
eacf38312026-08-06 News map: add Street/Satellite base-layer toggle (Esri World Imagery, $0 no key) -
83953f442026-08-06 fix(deals): parseOccupancy counts 'N% pre-leased' (new-dev pre-leasing recall); parseYearBuilt uses \bbuilt so 'rebuilt in YYYY' (renovation year) isn't recorded as original construction year -
0884d55a2026-08-06 PR intel: Gmail correspondence sync + per-contact timeline -
7ac0a3d52026-08-06 News map: add From/To year-range filter (2015-present) -
10ac233d2026-08-06 harden(deals/closings): Cody gate — word-boundary match for short firm codes so a party drill on 'CT'/'PRI' stops hitting substrings ('ct' in transaction = 1611 deals → 13 real); JLL/CBRE/Cushman drills unchanged. Cody's >=4 length guard rejected (would revert legit 3-char firms JLL/IPA) -
0e3b12bc2026-08-06 PR intel: self-service login + credentials pages (Gmail integration under the account) -
5707ef5f2026-08-06 Add 'News Map' to sitewide nav + resolve straggler cities to 98.9% -
773a0d052026-08-06 fix(deals/closings-admin): party drill-downs filter by FIRM not the full 'Firm (agent, agent…)' string — clicking a broker chip now finds the firm's 449/806 deals instead of just itself (dead-drill → live). Display keeps full attribution; both twins fixed -
46c1d8d22026-08-06 PR intel: CRM auth routes + capability middleware (login/logout/me/users) -
f8c4a1bd2026-08-06 Complete geo-cache: all 563 corpus cities geocoded (538 located, 98% articles pinned) -
75001ae62026-08-06 Grow geo-cache to 442 geocoded cities for /map (94%+ corpus coverage) -
424c62442026-08-06 harden(deals): Cody gate — parseAmount handles bare $NM/$NB shorthand (was $150M→150) and skips more per-sf spellings (psf/sqft/per sq ft/per foot); latent gaps (live data uses spelled Mil/Bil) but real, guarded 'per <non-unit>' stays a total -
f1043d952026-08-06 PR intel: multi-tenant + RBAC auth foundation (template for more clients) -
aa6f0b5e2026-08-06 Add public geolocated news map (/map): green<3mo / red older, 'news around you' -
2765e5d02026-08-06 fix(deals): parseAmount skips per-unit/per-sf figures so a derived price isn't shown as the deal total ('$153/sf' office campus → no bogus $153; '$928k per unit' → not the price); walks all $ to find the real total -
65458b632026-08-06 Refresh RENTV wordmark → 2026 liquid-glass logo from rentv.com brand -
6033166b2026-08-06 feat(closings-admin): sibling-drift fix — mirror the created date+time chip to closings.html (/api/closings joins registry first_seen; corpus rows use article date, date-only, no fabricated time). 100% card coverage -
5de160cc2026-08-06 harden(deals-admin): Cody gate — every card now shows a created chip (was 1.1%→100%): corpus rows use the article date as created_at (date-only, no fabricated time), feed deals keep the real first_seen timestamp; fmtDateTime local-parses date-only to avoid the UTC-midnight off-by-one -
939f491c2026-08-06 Build missing topic.html + topics.html — fix broken /topic/* and /topics routes (TK-10282) -
0ece69ca2026-08-06 auto-save: 2026-08-06T08:19:59 (6 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/ticker.json -
97b029c82026-08-06 feat(deals-admin): show record created date+time on each deal card (Steve admin-card rule) — join registry first_seen as created_at in /api/deals-manage + '🕓 Added <date, time>' chip via toLocaleString -
ba45532d2026-08-06 Add rentv.com region+category tab panel + /region/:slug landing pages (TK-10278) -
f6e330bb2026-08-06 harden(deals): Cody gate — lower SF/unit plausibility threshold 100→50 so it stops false-dropping legit self-storage SF (~60-90 sf/unit) while still catching the <11 sf/unit residential body leaks -
72561ee42026-08-06 fix(deals): drop an implausibly small SF (<100 sf/unit) next to a unit count — a body-leaked per-unit avg/amenity size, not the asset total ('406 units · 669 SF' → '406 units') -
fa57d8462026-08-06 auto-save: 2026-08-06T07:49:47 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
2930a2082026-08-06 harden(deals): Cody gate — parseSize picks the EARLIEST-in-text sqft match, not by magnitude precedence, so a body 'N msf' comp can't override the title's real 'Nk sf' (branch-order bug: million scanned whole string first) -
280689302026-08-06 fix(deals): magnitude-aware parseSize — parse '104k sf'/'1.27 msf' so a title's real size (104,000 SF) isn't skipped and replaced by a stray body 'N sf' leak (was rendering 104k-sf buildings as '26 SF') -
9300439d2026-08-06 harden(deals): Cody gate — add 5 summarize() tests (prod path, was untested), hoist the deal-parse import to the top import block, fix .js→.mjs comment typo -
8f0382952026-08-06 test(deals): extract pull-deals field parsers to testable lib/deal-parse.mjs + add 18-case regression suite locking in cycle 28-31 fixes (parseAddress/typeOf/txnOf/parseLocation); wire into npm test -
9a19d50d2026-08-06 auto-save: 2026-08-06T07:19:35 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
530f18432026-08-06 harden(deals): Cody gate — anchor the new Development verbs (starts/begins work-on|construction, kicks-off construction) so 'kicks off marketing' / 'starts building a portfolio' aren't false Development; drop redundant 'gets underway' (bare 'underway' already matches) -
ca6bd6342026-08-06 fix(deals): recognize 'starts work/construction', 'begins construction', 'kicks off' as Development in txnOf so a groundbreaking (GO Industrial Starts Work on...) isn't mislabeled Sale from a body land-acquisition leak -
172ad5462026-08-06 auto-save: 2026-08-06T06:49:23 (8 files) — data/.archive-crawl.lock data/deals-registry.json data/deals.json data/markets.json data/news.json -
827944b12026-08-06 harden(deals): Cody gate — classify senior/independent/assisted-living facilities as Multifamily (fixes live 'Oxnard Independent Living → Retail' body-leak); senior anchored to housing/living so 'senior loan' stays correct -
8e36e5452026-08-06 fix(deals): demote building-form tower/high-rise below explicit use-types so a firm name ('Granite Towers') stops mislabeling a 229-unit multifamily asset as Office; add unit-count → Multifamily signal -
71c6cae22026-08-06 auto-save: 2026-08-06T06:19:10 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
db6ec30d2026-08-06 harden(deals): Cody gate — lookbehind so period-cut spares St./Mt./Ft. cities; narrow title-state to CA|AZ|NV|TX|WA so OR/ID/CO title tokens can't null a correct city -
d088ba4f2026-08-06 fix(deals): two location misparses — trust explicit title state over body-leaked city (AZ deal no longer labeled CA) + stop 'in <City>. <Word>' swallowing a next-sentence word (Sunnyvale. Located → Sunnyvale/CA) -
b0c8d34c2026-08-06 auto-save: 2026-08-06T05:48:58 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
63833d1a2026-08-06 fix(deals): word-boundary-anchor street suffixes so 'St' stops truncating names like 'North State St' → full 'North State Street' -
c9a19a7c2026-08-06 fix(deals): word-boundary-anchor the bare 'at' address cue so it stops false-extracting addresses from format/that/flat -
0a0f12732026-08-06 auto-save: 2026-08-06T05:18:46 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
88db348a2026-08-06 auto-save: 2026-08-06T04:48:33 (8 files) — data/.archive-crawl.lock data/deals-registry.json data/deals.json data/markets.json data/news.json -
afca6a932026-08-06 auto-save: 2026-08-06T04:18:20 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
5bb00f142026-08-06 server: Cody gate — add buyer/seller/broker to DEALS_FIELDS. My deals-manage gap-fill now SHOWS the corpus-enriched parties, but the PUT/POST handlers iterate DEALS_FIELDS to save — which omitted parties (unlike CLOSE_FIELDS) — so an admin could see a wrong buyer but their correction was silently dropped. Now DEALS_FIELDS matches CLOSE_FIELDS; party corrections persist through /api/deals-manage POST+PUT -
d1a588142026-08-06 server: /api/deals-manage now gap-fills feed rows from the corpus, mirroring /api/closings (TK-10254). The closings admin surface got corpus gap-fill (buyer/seller/broker/summary/property_type/etc. — the deals-pull feed lacks the LLM-extracted fields) but its sibling deals-manage never did, so the same feed deal showed enriched in closings but blank parties/summary in deals-manage. Added the same fill-blanks-only enrich. Verified live: 23/30 feed rows now carry parties, 30/30 carry summary -
b901cbaf2026-08-06 auto-save: 2026-08-06T03:48:10 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
556ba5762026-08-06 auto-save: 2026-08-06T03:18:00 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
e9b3e49f2026-08-06 server: Cody gate — proper DRILL-DOWN faceting in /api/unified-search (two independent passes). My first fix counted facets ignoring BOTH build and type; the correct model is per-facet exclusion: by_build honors an active type filter (excludes its own build), by_type honors an active build filter (excludes its own) — so each chip's count matches what selecting it yields even with the other facet active. Verified live: build=rentv → by_build.rentv === total -
e8952c252026-08-06 server: fix broken facet counts in /api/unified-search (the /re-search admin search). The build+type filters ran BEFORE the facet-count computation, contradicting the code's own comment ('over the term/amount-filtered set, before build/type narrowing'). So selecting a build/type zeroed out the OTHER facet chips — you couldn't see counts for or switch to other builds/types. Moved the facet count above the build/type filters. Verified live: facets now stable across a build filter while results still narrow correctly -
ff82d81d2026-08-06 auto-save: 2026-08-06T02:47:50 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
aae957c22026-08-06 pr/registry: give ncuaCreditUnions its own 'ncua' throttle key. It used 'fdic' (a copy-paste artifact from fdicBanks), which shared one 350ms rate-limit bucket across two INDEPENDENT gov hosts (api.fdic.gov vs mapping.ncua.gov), needlessly serializing them. Safe — no correctness depends on the shared throttle; separate keys just let the two independent APIs proceed independently -
b37f2aba2026-08-06 auto-save: 2026-08-06T02:17:40 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
b2de6f402026-08-06 pr/edgar: Cody gate — cache company_tickers.json (1h TTL). The ~1MB static file (SEC publishes daily) was fetched + deserialized + O(n)-scanned on EVERY searchCompanies call; now fetched at most once per process-hour via getTickersData(). Removed dead-code cleanup exposed this as the real latency/SEC-fair-access cost. Verified: 3 searches in-window → 1 fetch; after TTL → refetch -
fd7ccfda2026-08-06 pr/edgar: remove a guaranteed-failing wasted SEC request in searchCompanies. It fetched browse-edgar with output=atom (XML) via edgarFetch, whose r.json() can't parse XML → it ALWAYS threw and was swallowed, its result discarded (void j) — a doomed HTTP round-trip (latency + SEC rate-budget) before every real company_tickers.json search. Removed it + the dead unused 'url' var; error url now references the actual endpoint. Behavior-preserving (items always came from the tickers file) -
9bdae7222026-08-06 auto-save: 2026-08-06T01:47:30 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
e246fdef2026-08-06 pr/adapters: Cody gate — decode & LAST in stripTags (after the numeric passes). Decoding it first turned a double-encoded '&#38;' (literal '&') into '&' then the numeric pass collapsed it to '&' — corrupting the intended literal. Moved to last so double-encoded refs survive; single-encoded &/& still decode. Verified -
8d77a6f02026-08-06 pr/adapters: stripTags now decodes numeric character references (decimal + hex) + …/®/©/™. It only decoded a handful of named entities, so scraped text (RSS titles, website extraction, press contacts across every adapter) leaked literals like 'Smith & Co', 'Q3 …', 'Café', 'A&B'. Generic num-ref decode with a control-char guard (never emit <32/127 from malformed feeds). Verified new decodes + existing entities unregressed + control chars neutralized -
88150cf62026-08-06 auto-save: 2026-08-06T01:17:20 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
0ada77c42026-08-06 auto-save: 2026-08-06T00:47:08 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
a1432cf22026-08-06 pr/jobs: revert cycle-18 verify-person same-run corroboration (Cody gate → HOLD-FOR-STEVE). The stale read defers LinkedIn corroboration to a future re-verify; fixing it to corroborate same-run is DEFENSIBLE (eventual state is identical — old code corroborates on the next run) but its SOLE effect touches a contested trust behavior: whether org+title site evidence should promote a search-LOCATED, surname-matched LinkedIn URL to found_corroborated at all (site evidence corroborates the ROLE, not the URL identity). That's a trust-model decision for Steve. Left a NOTE comment; drafted the question to pending-approval -
5df9e1d22026-08-06 pr/jobs: fix stale-read in verify-person that deferred LinkedIn corroboration. p is loaded at the top; when a LinkedIn URL is located mid-handler it's written to the DB but the in-memory p wasn't updated, so the corroboration check (site-backed + found_uncorroborated → found_corroborated) read a stale null linkedin_url and skipped a person who should corroborate SAME run — deferring it to a future re-verify that may never run. Now updates local p after locate. Verified logic -
a57db1ed2026-08-06 auto-save: 2026-08-06T00:16:57 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
eed7cbc82026-08-05 pr/jobs: Cody gate — dedup the convergence-halt admin task. Concurrent workers both hitting duplicate_controller, or repeated re-arm→halt cycles, would pile up stale OPEN 'Coverage research halted' tasks (no auto-close path). Now checks for an existing open halt task first (count-query idiom) → at most one at a time. Still best-effort try/catch -
35976af22026-08-05 pr/jobs: surface anomalous convergence halts as an admin task (Cody cycle-16 follow-up). pending_stuck / duplicate_controller stops would otherwise halt the whole research pipeline SILENTLY (only convergence_state + audit, which nobody reads in real time). Now creates a pr_tasks item so an admin notices + can unstick. Normal terminal reasons (target_reached/sweep_dry/round_cap/budget_exhausted) don't alert. Best-effort try/catch so it never blocks the stop. Internal task write — safe, non-customer-facing -
d6396bdc2026-08-05 auto-save: 2026-08-05T23:46:47 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
af6ccef92026-08-05 pr/jobs: Cody gate on convergence-controller — (1) singleton guard: the self-re-enqueue chain changes tick each hop so it doesn't dedupe on payload; a second chain (admin re-trigger over a waiting one) would poll in parallel → count convergence-controller jobs, stop('duplicate_controller') if >1. (2) pending correctness: the drain count included jobs in retry-backoff (run_after in the future) which aren't actually draining and could inflate the wait / false-trip pending_stuck → added AND run_after <= now(). Verified premises against schema (run_after NOT NULL, indexed) -
7c58dbc92026-08-05 pr/jobs: cap convergence-controller re-ticks (runaway guard). The pending>0 branch re-enqueued the controller every 3min with tick+1 but never checked a max — a single job wedged in queued/running would re-tick FOREVER (none of the round/budget caps are reached while waiting), reintroducing exactly the unbounded-loop anti-pattern a prior Cody gate flagged. Added max_ticks (default 15 ≈ 45min) → stop('pending_stuck'). Verified bounded on a stuck job, normal drain unaffected -
f1d77cee2026-08-05 auto-save: 2026-08-05T23:16:37 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
0d18fabb2026-08-05 pr/geo+jobs: Cody gate — make the coverage major-metro model STATE-AWARE. My tier-aware gap fix used the CA-only MAJOR_METRO_KEYS in the state-parameterized generate-coverage-report, so for AZ (no metro in the CA set) all 15 major-tier categories were silently dropped from gap detection — a latent bug that would misfire when Arizona unlocks. Added geo.MAJOR_METRO_KEYS_BY_STATE + majorMetrosFor(state) (AZ = Phoenix/Maricopa cluster + Tucson); job now uses majorMetrosFor(state). CA unchanged, AZ major-type gaps correctly detected in the big AZ metros -
d76172e52026-08-05 pr/jobs: make generate-coverage-report gap detection TIER-AWARE, consistent with the /coverage denominator. It flagged count===0 for every scoped type in every metro, so up to 60 FALSE gaps (15 major-tier types × 4 secondary metros — e.g. pr_agency in Central Valley) inflated gap_count and misdirected the research pipeline. The tier 'denominator fix' was applied to the /coverage API (index.js) but never to this gap report. Now: universal types are gaps in any metro; major types only in the big metros. Verified -
e21420df2026-08-05 auto-save: 2026-08-05T22:46:27 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
035683ac2026-08-05 pr/letters: Cody gate — lowercase-normalize extractMergeFields too, so the stored merge_fields metadata matches render()'s now-case-insensitive fill (they described the same template in two case dialects). Bonus: {{First_Name}} and {{first_name}} now dedupe to one field. merge_fields is display/validation metadata (not a key/join), forward-only, verified -
bcf70d2e2026-08-05 pr/letters: case-insensitive merge-field lookup in render(). The {{...}} regex is /gi (case-insensitive match) but the fill did context[key] (case-sensitive), and mergeContext keys are all lowercase — so a mixed-case field like {{First_Name}} silently failed to fill and rendered as a literal broken placeholder in the SENT letter. Now context[key.toLowerCase()]. Verified any-case fields resolve, genuinely-absent fields still show + flag missing -
61c09db72026-08-05 auto-save: 2026-08-05T22:16:18 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
8aac79222026-08-05 pr/replies: Cody gate — guard the broadened opt-out regex against IRREVERSIBLE false positives. (1) negation lookbehind so 'don''t/do not/never stop sending' is NOT an opt-out (was permanently suppressing engaged leads); (2) redirect lookahead so 'stop sending TO my old address / IT to X' (lead giving a new address) isn't suppressed; (3) dropped bare 'no longer interested' — a soft-no/timing reply ('no longer interested in a Q3 close'), NOT a legal opt-out, was over-suppressing CRE leads. Verified 18 opt-outs caught, 0 false positives on 13 negation/non-opt-out cases -
dbb25bf72026-08-05 pr/replies: broaden opt-out detection (CAN-SPAM). The old regex missed 8 common opt-out phrasings — 'don''t email me' (contraction of do-not), 'take me off (your list)', 'remove my email/name' (only 'remove me' matched), 'stop sending', 'no longer wish to receive', 'cease all communication' — so those recipients were NOT suppressed and could be re-emailed (compliance violation). New OPT_OUT_RE catches 17+ phrasings with 0 false positives on non-opt-outs (verified 'remove the typo'/'stop by'/'I don''t think' etc. stay clear) -
430a62a62026-08-05 auto-save: 2026-08-05T21:46:07 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
685e6ac42026-08-05 pr/search: Cody gate — (1) strip internal double-quotes in term() so a name like The "Best" Group can't corrupt the phrase query; (2) short-circuit a degenerate bare 'site:linkedin.com/in|company' query (person+company both empty, reachable via locateCompany w/ null org) to an empty DEGENERATE_QUERY report — don't burn a paid search API call on a random LinkedIn sampling. Verified -
4cc523f82026-08-05 pr/search: fix findLinkedIn query building — a null/undefined/'' companyName (a person with no org; jobs/index.js:292 passes p.org_name) injected the LITERAL string "null"/"undefined"/empty "" into the search query, constraining it to garbage and tanking the LinkedIn match rate. Now built from non-empty trimmed quoted terms only. Verified null/undef/empty/whitespace all clean, normal queries unchanged -
0c981cc92026-08-05 auto-save: 2026-08-05T21:15:47 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
f1f7cb332026-08-05 pr/linkedin: Cody gate — extract shared LI_SEP so stripLinkedIn AND the discoverCommsPeople name/title split use the SAME separators. They'd drifted (strip covered pipe/middot, split only dashes), so middot/pipe-separated LinkedIn SERP titles were silently DROPPED at the Name-Case gate — proven, now recovered. Also collapse \\s+ (handles embedded newlines that defeated the non-dotAll .*). Verified strip + name-recovery across all separators -
2221ee512026-08-05 pr/linkedin: anchor stripLinkedIn to the LAST separator-before-LinkedIn (greedy ^(.*)) — self-gate caught that the first-match .* form (in the old code AND my first pass) truncated real 'LinkedIn Marketing Manager'-type titles to just the name. Now the trailing SERP tag is stripped while LinkedIn-as-content is preserved; verified 6 cases -
dc165ff32026-08-05 pr/linkedin: unify the ' | LinkedIn' SERP-suffix strip into one stripLinkedIn() helper. The two call sites had drifted to different separator classes (locatePerson [|–-] vs discoverComms [|·]), so 'LinkedIn' leaked into stored indexed_title on middot/en-dash/em-dash separators. One helper covers [|·–—-]; verified all separators stripped, legit + mid-word-LinkedIn titles preserved -
3c791fc62026-08-05 auto-save: 2026-08-05T20:45:35 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
0f85ba302026-08-05 pr/website: Cody gate — (1) wire the THIRD email-scan (profileOrganization L283, which populates general_press_email) to the shared isJunkContactEmail — my first pass missed it, so noreply/image emails still leaked into the main enrichment output. (2) DROP the @2x arm entirely: it false-positived real '2x' domains (pr@2xmedia.com, contact@2x.vc) and was redundant — retina image emails always end in an image extension already caught by the \.(png|…) arm. (3) \bexample\. avoids theexample.com. All 3 call sites now share one predicate; 15 predicate cases + both extractors verified -
d308a6f12026-08-05 pr/website: shared isJunkContactEmail() filter for BOTH extractors — extractPressContacts had NO junk filter (proven: it stored 'photo@2x.png' / 'noreply@firm.com' as press emails, skipping the real one), and extractPeople's inline filter missed no-reply/.gif/.svg/.webp/.jpeg. Both now pick the first NON-junk email per block (a junk match no longer blocks the real one). Verified junk skipped, real+press@ emails preserved -
270d4b182026-08-05 auto-save: 2026-08-05T20:15:24 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
d18592312026-08-05 pr/taxonomy: Cody gate — collapse whitespace at the top of classifyTitle. The fixed-width (?<!vice[\\s-]) lookbehinds were defeated by dirty input ('Vice President' w/ double-space, tab), re-mislabeling VPs as president/c_suite — exactly the bug class the guards fix. .replace(/\\s+/g,' ') normalizes before any pattern runs, fixing both rules + all [\\s-] separators. Verified double/triple-space + tab VPs now classify correctly, clean titles unregressed -
1bdfc17d2026-08-05 pr/taxonomy: fix two title-classification bugs (proven by execution). (1) bare 'president' in both the ROLE and SENIORITY rules matched 'Vice President', so every spelled-out VP/EVP/SVP was mislabeled role=president + seniority=c_suite — added a (?<!vice[\\s-]) lookbehind so VPs fall through to evp_svp/vp. (2) '^c[emc]o' only caught CEO/CMO/CCO at string-start, missing 'Regional CEO'/'Divisional CMO' → used \\bc[emc]o\\b. Verified 28 title cases across role+seniority -
bbcd07e62026-08-05 auto-save: 2026-08-05T19:45:13 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
ecc4c6ce2026-08-05 pr/normalize: Cody gate — anchor the N.A.-suffix strip to END-OF-STRING ($), not \\b. The \\b form fired at position 0 / after a hyphen too, wrongly collapsing PREFIX/MID uses ('N.A. Williams'→'williams', 'Corp N.A. Trust'→'trust') into false AUTO-merges (data loss — worse than the dedup miss). Now only a trailing N.A. is stripped: 4 suffix forms dedup, 3 prefix/mid cases stay distinct -
6c77b91a2026-08-05 pr/normalize: fix dedup miss on dotted bank 'N.A.' suffix — the 'na'/'n.a' ORG_STOPWORDS were unreachable (punctuation stripped to spaces before the filter), so 'First National Bank, N.A.' normalized to '...bank n a' and failed to dedup against 'First National Bank'. Fold the dotted N.A. form to a bare 'na' token first (leading \\b avoids matching 'national'/'john.adams'); verified 4 dotted/spaced forms now dedup, Nationwide/Santa Ana/distinct-banks unaffected -
fd31c4e62026-08-05 auto-save: 2026-08-05T19:14:58 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
6ea87b322026-08-05 social (Content Studio): escape x.platform (stored admin input) + x.id in the draft-card render — closes a stored self-XSS Cody caught one line below the fmtTopic fix (admin-only surface, so low severity, but no raw string should touch innerHTML). renderDrafts is now fully output-encoded -
115fabd22026-08-05 social (Content Studio): fmtTopic now delegates to the full esc() (& < > ") instead of escaping only '<' — defense-in-depth output-encoding across its 5 innerHTML sites (draft text/topic, featured-video title, calendar). Safe today in text-content, but robust if a string ever moves to an attribute context; also fixes rare &-entity misrender. Removes a redundant weaker escape -
c014ea302026-08-05 auto-save: 2026-08-05T18:44:47 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
27c936602026-08-05 newsSig: document that money amounts normalize to MILLIONS (k÷1000, m×1, b×1000) + guard against a wrong 'fix' — a defect-hunt agent misread k/=1000 as a bug (it's correct at a millions base; *=1000 would equate $100k with $100B and break news dedup). Comment-only, no behavior change -
f84bac8c2026-08-05 auto-save: 2026-08-05T18:14:36 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
7c02e37a2026-08-05 desk KPI: Cody gate — position the drill chevron top-right (::after on a block card was rendering as a dangling glyph below the value) + drop the .lk .v white override (removes a latent drillable-vs-not color delta if a non-drillable KPI is ever added) -
13fd2b862026-08-05 desk analytics: KPI cards (CA Brokers/Firms/Top firm/Marquee assets) now drill into their directory scope per the counts-must-href rule — added gotoScope() reusing the rail scope/view machinery; kpi-link hover/›/keyboard(role=button,Enter/Space) affordances. Previously dead-text numbers -
c7e155942026-08-05 auto-save: 2026-08-05T17:44:25 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
0e665e942026-08-05 review density: Cody gate — flex-shrink:0 on .revdens + .live so the toolbar slider doesn't float/squish between the flex:1 search and margin-auto indicator at 981-1100px; cap density at 5 (6-col dropped video thumbs to ~170px, too small for 16/9); aria-valuetext announces 'N columns' to screen readers -
48440b952026-08-05 review (The REview): add density slider to the video catalog grid (fixed 4-col → adjustable --cols, localStorage) per the every-grid-gets-density rule; desktop-only (mobile keeps the responsive column rules). Sort omitted by design — catalog is category-rail grouped w/ chips+search, and /api/videos carries no date to sort by -
15dedf602026-08-05 auto-save: 2026-08-05T17:14:13 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
4b0dfdfe2026-08-05 la-commercial: Cody gate — add esc() and escape all API-data interpolations (brief/name/address/city/type_label) going into innerHTML, closing an XSS vector on server/LLM-generated briefs + fixing raw '&' in firm names (e.g. 'Nourmand & Associates'). Kept the full-legal-name firm drill (verified it returns the exact firm, 1 result — more precise than a trimmed query) -
c98cd5962026-08-05 la-commercial: wire every datum to deeper data per the all-data-points-href rule — marquee assets + recent-activity rows now drill to their LA County Assessor parcel record (by AIN, the cited source); firm cards drill into the CRE Directory filtered to that firm (internal, no external firm link-out). Hover affordances + ↗ on external source links -
b69f59732026-08-05 blog density: Cody gate — hide the density slider on phones (auto-fill is 1-col under ~490px so --min was inert there; sort stays, it works on a 1-col list) + aria-label conveys direction. Rejected Cody's --cols suggestion (would force unreadable fixed columns on mobile) -
fc0ee30d2026-08-05 blog: add sort (Newest/Oldest/Title/Category) + density slider to the RENTV Originals grid per the every-grid-gets-sort+density rule — posts load client-side in full so the sort is honest (whole-set reorder, not a page); refactored fetch→render, both controls persist to localStorage -
050f7edc2026-08-05 PR intel: add Tavily as a 3rd free-tier search backend + PR_SEARCH_BACKEND override -
214a147e2026-08-05 directory density: Cody gate fixes — hide slider on mobile (dead below 560px where grid is 1fr!important), ellipsis+min-width:0 so cards stay uniform height at 4-col, min=2 + clamp stale localStorage (no degenerate 1-col) -
1ba53ee12026-08-05 directory: add density slider (card-grid --cols, localStorage) to the flagship CRE Directory per the every-grid-gets-density rule; sort left for a usre server-side ordering task (registry ignores ?sort, client sort would mislead a 34k paginated set) -
079893932026-08-05 auto-save: 2026-08-05T16:43:55 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
ce6805c12026-08-05 Boomer voice/byline: on-air name is BOOM not Bloom (Steve) — narration 'This is Boom with RENTV' + byline 'Boom · RENTV'; real surname stays only in the email + clone-provenance comments -
499478252026-08-05 Audience: CRM contacts now surface their REAL enriched LinkedIn (✓) instead of a search guess — fetchCrmContacts pulls linkedin_url; the 👤 action links the actual profile when we have it, falls back to search otherwise -
e8fc556f2026-08-05 PR intel: paginate linkedin-enrich target pool (Cody cycle 3) -
39587e392026-08-05 org drawer: surface each contact's LinkedIn as a clickable 🔗 (org detail now returns per-person linkedin_url) — see a firm's contacts' LinkedIn right where you pitch them, now that ~500 have it enriched -
f2a81c1c2026-08-05 auto-save: 2026-08-05T16:13:44 (8 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
05adbf9e2026-08-05 rentv social-video-gen: enforce shared per-video cost cap before ElevenLabs TTS (trim narration if over) -
96574cc12026-08-05 auto-save: 2026-08-05T15:43:31 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
ea4a72c82026-08-05 PR intel: safe org dedup (page-title captures → canonical brand) -
02cf415b2026-08-05 PR intel: yoloforever cycle 2 — enrich lockfile + linkedin re-check -
7701c7732026-08-05 auto-save: 2026-08-05T15:13:13 (8 files) — data/closings-overrides.json data/deals-registry.json data/deals.json data/markets.json data/news.json -
b6a773ff2026-08-05 RENTV Path A: additive session-cookie login + CSRF + service-token, v0.21.0 — TK-10257 -
bf2e528d2026-08-05 Cody-gate: Deal Desk corpus /find is HONEST — the corpus IS rentv.com's own articles, so a corpus deal was ALREADY covered by RENTV; label it covered:{RENTV corpus} + mode:repurpose, reframe UI from 'uncovered deal' to 'pull a RENTV closing to repurpose'. True-uncovered stays the Gemini engine. -
6a4fdee52026-08-05 Deal Desk: /find now defaults to a $0 corpus path (723 real uncovered closed deals from articles-corpus) instead of the credits-depleted Gemini — restores the dead feature; Gemini kept as opt-in engine=gemini -
8d2c596e2026-08-05 deals-log: change-history opens as a LEFT drawer, not a centered modal — Steve inline/left-panel directive -
caa3fa7c2026-08-05 re-search: click items expand INLINE + left detail panel (no modal, no navigate-away) — Steve directive -
dfe922fe2026-08-05 Cody-gate: buyer/seller/broker are now admin-editable (added to CLOSE_FIELDS + F + modal inputs) — an admin can correct a wrong LLM-extracted party, and the GET merge's edits-last precedence makes the correction win over the corpus -
676a74642026-08-05 PR intel: tighten LinkedIn slug guard to require surname (Cody fix) -
dbc79b262026-08-05 RENTV closings+deals editors: drill-down on every datum — badge→type, txn badge→txn, location & parties→search filters (href-everything rule), v0.20.1 — TK-10255 -
1b924b352026-08-05 closings: FIX enrichment merge — feed deals now gap-fill buyer/seller/broker (+summary/size/year/type) from their matching corpus article; before, all 23 feed closings showed NO party data despite the corpus having it for 22 (the whole corpus pipeline's payoff was defeated for feed rows) -
e6da0a922026-08-05 auto-save: 2026-08-05T14:42:56 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
2ec421b32026-08-05 Cody-gate: trim party value before filtering (whitespace-safe match) -
d7aca3d52026-08-05 RENTV: Deals page → backend-only + editable override layer (mirror closings, all txn types), v0.20.0 — TK-10255 -
279335d42026-08-05 closings: buyer/seller/broker are now clickable → filter the feed to that party's deals (every data point hrefs deeper); hover affordance -
1663154b2026-08-05 PR intel: CRM name/title hygiene tool (byline + trailing-punct cleanup) -
1fd2ec072026-08-05 Cody-gate: posts public-status now published|live in lockstep with /api/search (was published-only → a future 'live' post would 404 on its page while showing in search); cross-ref comment on the parallel search filter -
f40b0bc92026-08-05 PR intel: linkedin-enrich prioritizes media/PR contacts (org-id set sort) -
493127a22026-08-05 chore: session close — search buyer/seller/broker on closings (party-search fix), v0.19.1 -
548ec2002026-08-05 security: /api/posts + /api/posts/:id never serve DRAFTS to non-admin callers (user-tier past the site auth got all posts incl. unpublished outside-wire content) — force published-only, 404 drafts by id -
80087c0b2026-08-05 Cody-gate fixes: harden PR.date with isNaN guard (was rendering 'Invalid Date' for bad values, app-wide); org 'Added' column reuses the robust adminDt helper (ISO title + guards) -
74c3fba92026-08-05 People + Organizations lists: add sortable 'Added' column (created date+time, ISO in title) — recency curation per Steve's admin date-time rule; backend already returns created_at + supports created sort -
1edf0c452026-08-05 PR intel: LinkedIn enrichment via Brave search (local, key stays on Mac2) -
45863c902026-08-05 RENTV: incremental corpus-crawl wrapper (LOCK-aware, cursor-reset-only, $0 local) — completes crawl→sync→serve chain, TK-10254 follow-up -
f1e911ce2026-08-05 Cody-gate fixes: by_metro bar routes to organizations (org-level data, was mis-pointed at people); people dept filter adds editorial + media_business options (were unlisted → filter indicator snapped to all) -
7825d5f22026-08-05 pr-intelligence dashboard: PR-agency rows drill into the org record (organizations?id=) — completes dashboard href-rule compliance -
8911db122026-08-05 auto-save: 2026-08-05T14:12:38 (7 files) — data/deals-registry.json data/deals.json data/markets.json data/news.json data/search-index-meta.json -
72bdf1692026-08-05 RENTV: corpus→Kamatera hourly sync script (keeps live /closings fresh, no restart via mtime re-read, shrink-guarded) — TK-10254 follow-up -
ba1e3bf22026-08-05 fix: KPI card links inherit text color (was rendering numbers link-blue) — caught pre-deploy -
b34da7ac2026-08-05 pr-intelligence dashboard: KPI cards now drill to filtered lists (href rule) — stale→people?status=stale, no-PR→orgs?no_pr_contact=1, drafts→review, replies→inbox, followups→tasks, coverage/AZ→orgs?state= -
25e5df282026-08-05 PR intel: OpenClaw masthead extractor + per-person phone/email capture -
5c464c002026-08-05 pr-intelligence dashboard: every data point hrefs deeper — by_category→orgs?type=, by_role→people?department=, by_metro→people?metro=, coverage-gap cells→orgs?metro=&type= (was dead-end bars) -
75b7680c2026-08-05 search-index: HomesOnSpec LIVE from Kamatera (InventoryHome, ~40k spec homes) — TK-10253 -
fc57490b2026-08-05 Audience perf: precompute per-contact search index once on load (was JSON.stringify over 2,162 contacts per keystroke) — Cody's queued follow-up -
f44b4fff2026-08-05 RENTV closings: merge article corpus into /api/closings (Sale-only, listings filtered, deduped vs deals feed) — closes reporting gaps, self-heals as crawl grows; surface buyer/seller/broker on cards — TK-10254 -
80e38cfe2026-08-05 ops: persistent (launchd) RENTV build loop — sandboxed claude -p (no deploy/spend tool, drafts gated to pending-approval), hourly, sonnet; activation is Steve-run -
97ad44f22026-08-05 search-index: resolve psql by full path so launchd (minimal PATH) keeps the usre source — TK-10253 -
ddbcba2e2026-08-05 RENTV: launchd job for unified search index rebuild (all builds, every 30min) — TK-10253 -
f143ba692026-08-05 RENTV: unified full-text search — /api/unified-search (adminOnly) + re-search.html + build-search-index.mjs + generated search-index.jsonl (internal/admin pages excluded from index) -
784b3fe62026-08-05 deploy: rentv Review Queue narrow-viewport fix + national CRE media seed (54 orgs); refresh deals/markets/news/ticker + news-posting-playbook (TK-10249) -
9da8b6b02026-08-05 PR intel: daily media/PR refresh crawl ($0 local) -
3c3458572026-08-05 Consulting portal: RENTV brand film — Boom avatar (headshot) + corrected Boomer voice, HeyGen Avatar-IV render (heygen-brandfilm.mp4) -
b39b469c2026-08-05 auto-save: 2026-08-05T13:42:25 (8 files) — data/deals-registry.json data/deals.json data/markets.json data/news-posting-playbook.json data/news-posting-playbook.md -
b881b5e32026-08-05 RENTV: pull archive with LOCAL MODELS (qwen3:14b on Mac2+Mac1, $0) — TK-10250 -
0432aa442026-08-05 RENTV: move Property Closings to backend-only + editable override layer (add/edit/hide over live Sale feed) — TK-10251 -
f3a0f6392026-08-05 RENTV: News Playbook backend view + corpus/playbook API — TK-10250 -
f53f85cb2026-08-05 Audience (Cody gate): top-level try/catch on /api/audience (safe empty payload, never blank-500); empty-state names all 3 sources incl CRM -
f59848322026-08-05 RENTV: full rentv.com article corpus crawler + news-posting playbook — TK-10250 -
8c7c27672026-08-05 Audience: CRM contacts drill into their pr-intelligence person + org records (href-rule); fix CRM persona icon (was newsletter emoji) -
ccbda3ed2026-08-05 PR intel: better editorial-contact extraction for news publications -
f6d63f542026-08-05 Audience: surface the 2,162-contact pr-intelligence CRM (was showing only empty newsletter+sublease); add Category segment by org type; segments view now collapsible tabs (open collapsed, persisted) -
1658be9d2026-08-05 auto-save: 2026-08-05T13:12:15 (5 files) — data/deals.json data/markets.json data/news.json data/ticker.json public/admin/pr-intelligence/review.html -
d777700d2026-08-05 pr-intelligence Organizations: left-panel category rail (PR firms / builders / lenders / etc.), all columns sortable with ▲/▼, expandable inline rows, density slider, grid+list toggle, Reset — backend group filter (types=) + people/pr sort keys -
06fe82852026-08-05 deploy: exclude data/deals-registry.json so deploys never clobber prod's accumulating deal history — TK-10246 -
875aaec02026-08-05 PR intel: add national CRE media + association-media + PR agencies -
955211ec2026-08-05 RENTV: deals+registry ride the 20-min news cron (auto-accumulate) — TK-10246 -
a15c8be02026-08-05 RENTV: persistent deal registry + per-deal change history — TK-10246 -
9ea3fd532026-08-05 Boomer voice fix: re-clone from verified 7/31 VO (VOICE_ID czUPGx5phxE6qpQ46nRS); prior EoZqh clone sounded wrong -
eb29d4a12026-08-05 auto-save: 2026-08-05T12:42:02 (6 files) — data/markets.json data/news.json data/ticker.json src/pr/index.js src/pr/lib/geo.js -
d1b789152026-08-05 Content Studio: Boomer voice + video buttons — narrate the generated post in Boom's cloned ElevenLabs voice (mp3 or photo+Ken-Burns mp4), reuses async social-video job infra -
64a706302026-08-05 auto-save: 2026-08-05T12:11:52 (3 files) — data/markets.json data/news.json data/ticker.json -
c3c9f6ba2026-08-05 auto-save: 2026-08-05T11:41:42 (3 files) — data/markets.json data/news.json data/ticker.json -
c5edf5102026-08-05 George draft auth: try Basic <GEORGE_AUTH> (secrets-master value) -
b1efd88a2026-08-05 Content Studio: Email-to-Boom now creates a Gmail DRAFT in steve-office (no send-gate; Steve reviews + sends) -
6d2fbcd32026-08-05 Deal Desk: viewer for an uncovered closed CRE deal — chat-adjust any field + generate social (local LLM $0); Gemini find endpoint -
3cdd23d72026-08-05 chore: v0.19.0 (session close — Content Studio + photo tracking + email + Boom rename) -
7d1be3692026-08-05 Content Studio: one-button Email-to-Boom now includes images + video links (rich send) -
c0aff6682026-08-05 auto-save: 2026-08-05T11:11:27 (3 files) — data/markets.json data/news.json data/ticker.json -
468570032026-08-05 auto-save: 2026-08-05T10:41:17 (3 files) — data/markets.json data/news.json data/ticker.json -
3ddffc692026-08-05 auto-save: 2026-08-05T10:11:08 (3 files) — data/markets.json data/news.json data/ticker.json -
b0007cbd2026-08-05 auto-save: 2026-08-05T09:40:57 (3 files) — data/markets.json data/news.json data/ticker.json -
4ffccdc62026-08-05 auto-save: 2026-08-05T09:10:47 (3 files) — data/markets.json data/news.json data/ticker.json -
9b0cf7812026-08-05 auto-save: 2026-08-05T08:40:35 (3 files) — data/markets.json data/news.json data/ticker.json -
b43644772026-08-05 auto-save: 2026-08-05T08:10:17 (4 files) — data/markets.json data/news.json data/ticker.json server.js -
70045f712026-08-05 Content Studio email: use raw GEORGE_AUTH token for local George :9850 -
14ea31252026-08-05 Content Studio: track building photo from credited broker/developer (Gemini-grounded) + photo credit + Email-to-Boom via George; Bloom→Boom fix; retire rentv-website -
88f6724f2026-08-05 auto-save: 2026-08-05T07:40:04 (8 files) — data/markets.json data/news.json data/ticker.json docs/FORSALE-OUTREACH.md public/admin/pr-intelligence/linkedin-posting.html -
6be184862026-08-05 Drafts UI: escape data-id + plain-text drawer title + String() id compare (Cody hardening) -
f7026ca82026-08-05 auto-save: 2026-08-05T07:09:54 (3 files) — data/markets.json data/news.json data/ticker.json -
ff6d1c632026-08-05 auto-save: 2026-08-05T06:39:44 (5 files) — data/markets.json data/news.json data/ticker.json public/admin/pr-intelligence/pr-shared.js public/admin/pr-intelligence/content-drafts.html -
6462c58f2026-08-05 auto-save: 2026-08-05T06:09:34 (3 files) — data/markets.json data/news.json data/ticker.json -
07420bfb2026-08-05 auto-save: 2026-08-05T05:39:25 (3 files) — data/markets.json data/news.json data/ticker.json -
8f5165272026-08-05 auto-save: 2026-08-05T05:09:15 (3 files) — data/markets.json data/news.json data/ticker.json -
1a4a2c7c2026-08-05 auto-save: 2026-08-05T04:39:04 (3 files) — data/markets.json data/news.json data/ticker.json -
5e99d5862026-08-05 auto-save: 2026-08-05T04:08:53 (3 files) — data/markets.json data/news.json data/ticker.json -
5894cf022026-08-05 auto-save: 2026-08-05T03:38:44 (3 files) — data/markets.json data/news.json data/ticker.json -
e92ee9602026-08-05 auto-save: 2026-08-05T03:08:35 (3 files) — data/markets.json data/news.json data/ticker.json -
6f8ad3a02026-08-05 auto-save: 2026-08-05T02:38:25 (3 files) — data/markets.json data/news.json data/ticker.json -
22ea0b602026-08-05 auto-save: 2026-08-05T02:08:15 (3 files) — data/markets.json data/news.json data/ticker.json -
92b3b9692026-08-05 auto-save: 2026-08-05T01:38:06 (3 files) — data/markets.json data/news.json data/ticker.json -
e3f0bbbd2026-08-05 auto-save: 2026-08-05T01:07:57 (3 files) — data/markets.json data/news.json data/ticker.json -
5f5fde952026-08-05 auto-save: 2026-08-05T00:37:47 (3 files) — data/markets.json data/news.json data/ticker.json -
0927632e2026-08-05 auto-save: 2026-08-05T00:07:36 (3 files) — data/markets.json data/news.json data/ticker.json -
80fe61212026-08-04 auto-save: 2026-08-04T23:37:27 (3 files) — data/markets.json data/news.json data/ticker.json -
411cf9b42026-08-04 auto-save: 2026-08-04T23:07:17 (3 files) — data/markets.json data/news.json data/ticker.json -
368659cd2026-08-04 auto-save: 2026-08-04T22:37:08 (3 files) — data/markets.json data/news.json data/ticker.json -
ec8312de2026-08-04 auto-save: 2026-08-04T22:06:54 (3 files) — data/markets.json data/news.json data/ticker.json -
d5bd3f492026-08-04 auto-save: 2026-08-04T21:36:45 (3 files) — data/markets.json data/news.json data/ticker.json -
89cbdb8a2026-08-04 auto-save: 2026-08-04T21:06:36 (3 files) — data/markets.json data/news.json data/ticker.json -
658d67eb2026-08-04 auto-save: 2026-08-04T20:36:27 (3 files) — data/markets.json data/news.json data/ticker.json -
2c32774c2026-08-04 auto-save: 2026-08-04T20:06:17 (6 files) — data/markets.json data/news.json data/ticker.json scripts/build-news-archive.mjs scripts/pull-cre-news.mjs -
163f9fff2026-08-04 Content Studio: copyright Option 1 — outside-wire stories save as draft (UI + server-enforced), RENTV-sourced publish live -
bb10f92e2026-08-04 auto-save: 2026-08-04T19:36:08 (3 files) — data/markets.json data/news.json data/ticker.json -
7cbb2d952026-08-04 auto-save: 2026-08-04T19:05:58 (3 files) — data/markets.json data/news.json data/ticker.json -
8d7917c12026-08-04 Content Studio UX: feed category filter + copy-to-clipboard on blog/social (Cody-gated, HTTPS guard) -
657151c62026-08-04 auto-save: 2026-08-04T18:35:48 (3 files) — data/markets.json data/news.json data/ticker.json -
e100458d2026-08-04 Content Studio UX: tone/angle selector (news/analysis/punchy) + Regenerate + raw/deduped feed toggle (Cody-gated) -
d924c4482026-08-04 auto-save: 2026-08-04T18:05:34 (5 files) — data/markets.json data/news.json data/ticker.json public/admin/pr-intelligence/content-studio.html server.js -
9f00a2c92026-08-04 auto-save: 2026-08-04T17:35:24 (3 files) — data/markets.json data/news.json data/ticker.json -
dd0317e82026-08-04 Content Studio: cross-source dedup in feed (strict, Cody-hardened — no false merges) + '+N more sources' chip -
4d3751bd2026-08-04 Content Studio hardening: localize blog images on publish/edit (no third-party hotlinks) + scrub all known wire names (Cody gate) -
4ce9fdce2026-08-04 auto-save: 2026-08-04T17:05:12 (4 files) — .deploy.conf data/markets.json data/news.json data/ticker.json -
2e7caa4b2026-08-04 server: dependency-free .env loader (durable prod config across deploys) -
8c9901f92026-08-04 CRM Content Studio: deep multi-source dated news feed → original blog + social (local LLM $0, source-scrubbed) -
761151eb2026-08-04 auto-save: 2026-08-04T16:35:00 (5 files) — data/markets.json data/news.json data/ticker.json server.js public/admin/pr-intelligence/content-studio.html -
9bd88e882026-08-04 auto-save: 2026-08-04T16:04:49 (3 files) — data/markets.json data/news.json data/ticker.json -
2cef1f2a2026-08-04 chore: v0.18.0 — Property Closings feature (session close) -
7ac888552026-08-04 CRM: add LinkedIn Posting section (setup + composer preview, gated non-live) -
ad9276b62026-08-04 rentv: add Closings link to site-wide nav across 22 public pages -
00c045642026-08-04 auto-save: 2026-08-04T15:34:32 (47 files) — data/markets.json data/news.json data/ticker.json public/about.html public/advertise.html -
282201872026-08-04 rentv: make /closings customer-facing (public card grid, date-forward, nav link) -
89f3741f2026-08-04 auto-save: 2026-08-04T15:04:21 (1 files) — public/closings.html -
45ac18112026-08-04 rentv closings: parse full-month-name dates (June/July) → 18/21 coverage -
8a06b7a92026-08-04 rentv backend: Property Closings view (Sale deals w/ address·date·price, sortable+searchable) -
3e8842dc2026-08-04 auto-save: 2026-08-04T14:34:11 (3 files) — data/markets.json data/news.json data/ticker.json -
f8bdede12026-08-04 CRM: add LinkedIn Network page — TOS-safe import of Bloom's self-exported connections into People -
e32c9d292026-08-04 auto-save: 2026-08-04T14:04:01 (3 files) — data/markets.json data/news.json data/ticker.json -
b0e2eac52026-08-04 Add site-wide user day/night toggle (sun/moon icon) with FOUC guard -
15a1f9ba2026-08-04 auto-save: 2026-08-04T13:33:48 (3 files) — data/markets.json data/news.json data/ticker.json -
a30c778d2026-08-04 auto-save: 2026-08-04T13:03:31 (3 files) — data/markets.json data/news.json data/ticker.json -
b9d061b12026-08-04 auto-save: 2026-08-04T12:33:18 (3 files) — data/markets.json data/news.json data/ticker.json -
63ceb5322026-08-04 auto-save: 2026-08-04T12:03:05 (3 files) — data/markets.json data/news.json data/ticker.json -
f1b733e52026-08-04 auto-save: 2026-08-04T11:32:54 (3 files) — data/markets.json data/news.json data/ticker.json -
97f9f8a12026-08-04 auto-save: 2026-08-04T11:02:41 (3 files) — data/markets.json data/news.json data/ticker.json -
3ced0b492026-08-04 auto-save: 2026-08-04T10:32:27 (3 files) — data/markets.json data/news.json data/ticker.json -
87ab09a62026-08-04 auto-save: 2026-08-04T10:02:15 (3 files) — data/markets.json data/news.json data/ticker.json -
55e4bd2c2026-08-04 auto-save: 2026-08-04T09:32:01 (3 files) — data/markets.json data/news.json data/ticker.json -
abd444382026-08-04 auto-save: 2026-08-04T09:01:48 (3 files) — data/markets.json data/news.json data/ticker.json -
eec8d2792026-08-04 auto-save: 2026-08-04T08:31:34 (3 files) — data/markets.json data/news.json data/ticker.json -
ad3d3ad82026-08-04 auto-save: 2026-08-04T08:01:22 (3 files) — data/markets.json data/news.json data/ticker.json -
b5124f222026-08-04 auto-save: 2026-08-04T07:31:10 (3 files) — data/markets.json data/news.json data/ticker.json -
ee79bdb12026-08-04 auto-save: 2026-08-04T07:00:57 (3 files) — data/markets.json data/news.json data/ticker.json -
4be3a7892026-08-04 auto-save: 2026-08-04T06:30:44 (3 files) — data/markets.json data/news.json data/ticker.json -
eb6462e32026-08-04 auto-save: 2026-08-04T06:00:27 (3 files) — data/markets.json data/news.json data/ticker.json -
a37eed652026-08-04 auto-save: 2026-08-04T05:30:13 (3 files) — data/markets.json data/news.json data/ticker.json -
d0e167062026-08-04 auto-save: 2026-08-04T04:59:56 (3 files) — data/markets.json data/news.json data/ticker.json -
8104aa9d2026-08-04 auto-save: 2026-08-04T04:29:46 (3 files) — data/markets.json data/news.json data/ticker.json -
b21f07a62026-08-04 auto-save: 2026-08-04T03:59:36 (3 files) — data/markets.json data/news.json data/ticker.json -
9e392bc32026-08-04 auto-save: 2026-08-04T03:29:25 (3 files) — data/markets.json data/news.json data/ticker.json -
1f0c63022026-08-04 auto-save: 2026-08-04T02:59:16 (3 files) — data/markets.json data/news.json data/ticker.json -
425363bb2026-08-04 auto-save: 2026-08-04T02:29:06 (3 files) — data/markets.json data/news.json data/ticker.json -
7989b2772026-08-04 auto-save: 2026-08-04T01:58:56 (3 files) — data/markets.json data/news.json data/ticker.json -
53e495f42026-08-04 auto-save: 2026-08-04T01:28:47 (3 files) — data/markets.json data/news.json data/ticker.json -
e1d1143f2026-08-04 auto-save: 2026-08-04T00:58:37 (3 files) — data/markets.json data/news.json data/ticker.json -
921990682026-08-04 auto-save: 2026-08-04T00:28:28 (3 files) — data/markets.json data/news.json data/ticker.json -
06ea72702026-08-03 auto-save: 2026-08-03T23:58:19 (3 files) — data/markets.json data/news.json data/ticker.json -
eba5afa42026-08-03 auto-save: 2026-08-03T23:28:09 (3 files) — data/markets.json data/news.json data/ticker.json -
3051b04d2026-08-03 auto-save: 2026-08-03T22:57:59 (3 files) — data/markets.json data/news.json data/ticker.json -
ada2a9482026-08-03 auto-save: 2026-08-03T22:27:49 (3 files) — data/markets.json data/news.json data/ticker.json -
9b33c2ba2026-08-03 auto-save: 2026-08-03T21:57:39 (3 files) — data/markets.json data/news.json data/ticker.json -
8a9579b12026-08-03 auto-save: 2026-08-03T21:27:28 (3 files) — data/markets.json data/news.json data/ticker.json -
0b31aebd2026-08-03 auto-save: 2026-08-03T20:57:17 (3 files) — data/markets.json data/news.json data/ticker.json -
e03c639e2026-08-03 auto-save: 2026-08-03T20:27:06 (3 files) — data/markets.json data/news.json data/ticker.json -
c5dd7c5d2026-08-03 auto-save: 2026-08-03T19:56:54 (3 files) — data/markets.json data/news.json data/ticker.json -
a08135652026-08-03 auto-save: 2026-08-03T19:26:44 (3 files) — data/markets.json data/news.json data/ticker.json -
e14a01a52026-08-03 auto-save: 2026-08-03T18:56:31 (3 files) — data/markets.json data/news.json data/ticker.json -
47e8c56b2026-08-03 auto-save: 2026-08-03T18:26:20 (3 files) — data/markets.json data/news.json data/ticker.json -
4955ddfe2026-08-03 auto-save: 2026-08-03T17:56:09 (3 files) — data/markets.json data/news.json data/ticker.json -
3374b4d12026-08-03 auto-save: 2026-08-03T17:25:58 (3 files) — data/markets.json data/news.json data/ticker.json -
cde04fc62026-08-03 auto-save: 2026-08-03T16:55:48 (3 files) — data/markets.json data/news.json data/ticker.json -
a535b65c2026-08-03 auto-save: 2026-08-03T16:25:38 (3 files) — data/markets.json data/news.json data/ticker.json -
b9dd38ac2026-08-03 auto-save: 2026-08-03T15:55:27 (3 files) — data/markets.json data/news.json data/ticker.json -
1e2145002026-08-03 auto-save: 2026-08-03T15:25:17 (3 files) — data/markets.json data/news.json data/ticker.json -
308546172026-08-03 auto-save: 2026-08-03T14:55:07 (3 files) — data/markets.json data/news.json data/ticker.json -
3f50968f2026-08-03 auto-save: 2026-08-03T14:24:54 (3 files) — data/markets.json data/news.json data/ticker.json -
6528480b2026-08-03 auto-save: 2026-08-03T13:54:39 (3 files) — data/markets.json data/news.json data/ticker.json -
ebb5282c2026-08-03 auto-save: 2026-08-03T13:24:27 (3 files) — data/markets.json data/news.json data/ticker.json -
31dfdd912026-08-03 auto-save: 2026-08-03T12:54:16 (3 files) — data/markets.json data/news.json data/ticker.json -
243eea122026-08-03 auto-save: 2026-08-03T12:23:59 (3 files) — data/markets.json data/news.json data/ticker.json -
8a4971fc2026-08-03 auto-save: 2026-08-03T11:53:46 (3 files) — data/markets.json data/news.json data/ticker.json -
73283a532026-08-03 auto-save: 2026-08-03T11:23:33 (3 files) — data/markets.json data/news.json data/ticker.json -
7291febb2026-08-03 auto-save: 2026-08-03T10:53:14 (3 files) — data/markets.json data/news.json data/ticker.json -
af23c3e52026-08-03 auto-save: 2026-08-03T10:23:02 (3 files) — data/markets.json data/news.json data/ticker.json -
b8ac6f1f2026-08-03 auto-save: 2026-08-03T09:52:50 (3 files) — data/markets.json data/news.json data/ticker.json -
18e602842026-08-03 auto-save: 2026-08-03T09:22:36 (3 files) — data/markets.json data/news.json data/ticker.json -
361d43e22026-08-03 auto-save: 2026-08-03T08:52:19 (3 files) — data/markets.json data/news.json data/ticker.json -
994315712026-08-03 auto-save: 2026-08-03T08:22:05 (3 files) — data/markets.json data/news.json data/ticker.json -
c307d83a2026-08-03 auto-save: 2026-08-03T07:51:47 (3 files) — data/markets.json data/news.json data/ticker.json -
8ce703ea2026-08-03 chore: v0.17.1 (session close — pinned-video merge) -
e7079af12026-08-03 auto-save: 2026-08-03T07:21:35 (3 files) — data/markets.json data/news.json data/ticker.json -
49fe1fce2026-08-03 auto-save: 2026-08-03T06:51:19 (3 files) — data/markets.json data/news.json data/ticker.json -
9bd7674d2026-08-03 auto-save: 2026-08-03T06:21:04 (3 files) — data/markets.json data/news.json data/ticker.json -
6601aa742026-08-03 auto-save: 2026-08-03T05:50:52 (3 files) — data/markets.json data/news.json data/ticker.json -
6d8a2e7c2026-08-03 auto-save: 2026-08-03T05:20:38 (3 files) — data/markets.json data/news.json data/ticker.json -
224067ca2026-08-03 auto-save: 2026-08-03T04:50:22 (3 files) — data/markets.json data/news.json data/ticker.json -
bb1ad50e2026-08-03 auto-save: 2026-08-03T04:20:12 (3 files) — data/markets.json data/news.json data/ticker.json -
6f5ac63f2026-08-03 auto-save: 2026-08-03T03:50:03 (3 files) — data/markets.json data/news.json data/ticker.json -
755f89172026-08-03 auto-save: 2026-08-03T03:19:54 (3 files) — data/markets.json data/news.json data/ticker.json -
49dbb2f32026-08-03 auto-save: 2026-08-03T02:49:45 (3 files) — data/markets.json data/news.json data/ticker.json -
b9bf96882026-08-03 auto-save: 2026-08-03T02:19:36 (3 files) — data/markets.json data/news.json data/ticker.json -
f724a5702026-08-03 auto-save: 2026-08-03T01:49:27 (3 files) — data/markets.json data/news.json data/ticker.json -
c7ff26db2026-08-03 auto-save: 2026-08-03T01:19:18 (3 files) — data/markets.json data/news.json data/ticker.json -
55c36fd42026-08-03 auto-save: 2026-08-03T00:49:10 (3 files) — data/markets.json data/news.json data/ticker.json -
0acd0dd02026-08-03 auto-save: 2026-08-03T00:19:00 (3 files) — data/markets.json data/news.json data/ticker.json -
a548c31f2026-08-02 auto-save: 2026-08-02T23:48:52 (3 files) — data/markets.json data/news.json data/ticker.json -
2d599f5e2026-08-02 auto-save: 2026-08-02T23:18:42 (3 files) — data/markets.json data/news.json data/ticker.json -
97fcbc972026-08-02 auto-save: 2026-08-02T22:48:33 (3 files) — data/markets.json data/news.json data/ticker.json -
bd558c0c2026-08-02 auto-save: 2026-08-02T22:18:24 (3 files) — data/markets.json data/news.json data/ticker.json -
0359d3762026-08-02 auto-save: 2026-08-02T21:48:15 (3 files) — data/markets.json data/news.json data/ticker.json -
77db6b362026-08-02 auto-save: 2026-08-02T21:18:05 (3 files) — data/markets.json data/news.json data/ticker.json -
a13eb32c2026-08-02 auto-save: 2026-08-02T20:47:56 (3 files) — data/markets.json data/news.json data/ticker.json -
b69998672026-08-02 auto-save: 2026-08-02T20:17:45 (3 files) — data/markets.json data/news.json data/ticker.json -
196da3532026-08-02 auto-save: 2026-08-02T19:47:35 (3 files) — data/markets.json data/news.json data/ticker.json -
8375564d2026-08-02 auto-save: 2026-08-02T19:17:27 (3 files) — data/markets.json data/news.json data/ticker.json -
67fca9ee2026-08-02 auto-save: 2026-08-02T18:47:17 (3 files) — data/markets.json data/news.json data/ticker.json -
8d54e6822026-08-02 auto-save: 2026-08-02T18:17:08 (3 files) — data/markets.json data/news.json data/ticker.json -
885dd11b2026-08-02 auto-save: 2026-08-02T17:46:59 (3 files) — data/markets.json data/news.json data/ticker.json -
98ccc9fa2026-08-02 auto-save: 2026-08-02T17:16:50 (3 files) — data/markets.json data/news.json data/ticker.json -
4147b8142026-08-02 auto-save: 2026-08-02T16:46:41 (3 files) — data/markets.json data/news.json data/ticker.json -
a0df8a7e2026-08-02 auto-save: 2026-08-02T16:16:32 (3 files) — data/markets.json data/news.json data/ticker.json -
2aeff9fa2026-08-02 auto-save: 2026-08-02T15:46:24 (3 files) — data/markets.json data/news.json data/ticker.json -
7476a3042026-08-02 auto-save: 2026-08-02T15:16:13 (3 files) — data/markets.json data/news.json data/ticker.json -
ea300adb2026-08-02 auto-save: 2026-08-02T14:46:02 (3 files) — data/markets.json data/news.json data/ticker.json -
82912bea2026-08-02 auto-save: 2026-08-02T14:15:51 (3 files) — data/markets.json data/news.json data/ticker.json -
e2f512cf2026-08-02 auto-save: 2026-08-02T13:45:41 (3 files) — data/markets.json data/news.json data/ticker.json -
1c672b1a2026-08-02 auto-save: 2026-08-02T13:15:28 (3 files) — data/markets.json data/news.json data/ticker.json -
e92ff4812026-08-02 auto-save: 2026-08-02T12:45:17 (3 files) — data/markets.json data/news.json data/ticker.json -
715b846e2026-08-02 auto-save: 2026-08-02T12:15:06 (3 files) — data/markets.json data/news.json data/ticker.json -
13771e962026-08-02 auto-save: 2026-08-02T11:44:56 (3 files) — data/markets.json data/news.json data/ticker.json -
d7d51b512026-08-02 auto-save: 2026-08-02T11:14:47 (3 files) — data/markets.json data/news.json data/ticker.json -
768e4db02026-08-02 auto-save: 2026-08-02T10:44:36 (3 files) — data/markets.json data/news.json data/ticker.json -
1bb829a62026-08-02 auto-save: 2026-08-02T10:14:26 (3 files) — data/markets.json data/news.json data/ticker.json -
2d625f112026-08-02 auto-save: 2026-08-02T09:44:11 (3 files) — data/markets.json data/news.json data/ticker.json -
af4244102026-08-02 auto-save: 2026-08-02T09:14:01 (3 files) — data/markets.json data/news.json data/ticker.json -
ba4cb3e12026-08-02 auto-save: 2026-08-02T08:43:50 (3 files) — data/markets.json data/news.json data/ticker.json -
42cc24702026-08-02 auto-save: 2026-08-02T08:13:37 (3 files) — data/markets.json data/news.json data/ticker.json -
912bb8872026-08-02 auto-save: 2026-08-02T07:43:26 (3 files) — data/markets.json data/news.json data/ticker.json -
d2117c9e2026-08-02 auto-save: 2026-08-02T07:13:15 (3 files) — data/markets.json data/news.json data/ticker.json -
2b137e042026-08-02 harden(review): coerce id in openVideo find so /review?play=<id> deep-link survives numeric-vs-string api ids (flagged in /cs, parallel session now idle) -
b1e2d8e82026-08-02 auto-save: 2026-08-02T06:43:03 (3 files) — data/markets.json data/news.json data/ticker.json -
41d0de372026-08-02 auto-save: 2026-08-02T06:12:47 (3 files) — data/markets.json data/news.json data/ticker.json -
3d563e692026-08-02 auto-save: 2026-08-02T05:42:34 (3 files) — data/markets.json data/news.json data/ticker.json -
0ba9baa42026-08-02 auto-save: 2026-08-02T05:12:23 (3 files) — data/markets.json data/news.json data/ticker.json -
1b868b302026-08-02 auto-save: 2026-08-02T04:42:12 (3 files) — data/markets.json data/news.json data/ticker.json -
4927808c2026-08-02 auto-save: 2026-08-02T04:12:02 (3 files) — data/markets.json data/news.json data/ticker.json -
1920e4e52026-08-02 auto-save: 2026-08-02T03:41:50 (3 files) — data/markets.json data/news.json data/ticker.json -
5f8dda932026-08-02 auto-save: 2026-08-02T03:11:39 (3 files) — data/markets.json data/news.json data/ticker.json -
6e63c4682026-08-02 auto-save: 2026-08-02T02:41:29 (3 files) — data/markets.json data/news.json data/ticker.json -
947eabf52026-08-02 auto-save: 2026-08-02T02:11:19 (3 files) — data/markets.json data/news.json data/ticker.json -
28df6c092026-08-02 auto-save: 2026-08-02T01:41:08 (3 files) — data/markets.json data/news.json data/ticker.json -
a12e5a6c2026-08-02 auto-save: 2026-08-02T01:10:57 (3 files) — data/markets.json data/news.json data/ticker.json -
0105f0712026-08-02 auto-save: 2026-08-02T00:40:47 (3 files) — data/markets.json data/news.json data/ticker.json -
9ef999a72026-08-02 auto-save: 2026-08-02T00:10:36 (3 files) — data/markets.json data/news.json data/ticker.json -
2425b1f52026-08-01 auto-save: 2026-08-01T23:40:26 (3 files) — data/markets.json data/news.json data/ticker.json -
82d912bb2026-08-01 auto-save: 2026-08-01T23:10:15 (3 files) — data/markets.json data/news.json data/ticker.json -
7ab66d572026-08-01 auto-save: 2026-08-01T22:40:01 (3 files) — data/markets.json data/news.json data/ticker.json -
6fe9e4da2026-08-01 rentv (main): href-to-deeper-data on the news feed — LOCAL only, deploy Steve-gated (TK-10126) -
10699fc92026-08-01 auto-save: 2026-08-01T22:09:48 (4 files) — data/markets.json data/news.json data/ticker.json package-lock.json -
08f037e32026-08-01 chore: v0.17.0 — social presence surfaced (admin /social + front-page Follow footer) (session close) -
95353a692026-08-01 auto-save: 2026-08-01T21:39:39 (3 files) — data/markets.json data/news.json data/ticker.json -
5bd2ea932026-08-01 auto-save: 2026-08-01T21:09:29 (3 files) — data/markets.json data/news.json data/ticker.json -
8fc7f6ff2026-08-01 feat(front-page): add 'Follow RENTV' footer column (Instagram/Facebook/LinkedIn) per Steve override of DTD-A -
b65dd53a2026-08-01 auto-save: 2026-08-01T20:39:19 (3 files) — data/markets.json data/news.json data/ticker.json -
0dd480612026-08-01 chore(deploy): protect prod-owned data/social-drafts.json from rsync --delete clobber -
c93c877e2026-08-01 auto-save: 2026-08-01T19:38:57 (1 files) — docs/heygen-brandfilm-scripts.DRAFT.md -
fa3ecbc92026-08-01 feat(review): /review?play=<id> deep-link auto-opens a video's in-app modal; /social featured clip now drills to the SPECIFIC video (Cody gate: drill to record not firehose) -
148ec5fb2026-08-01 chore(rentv): stage Vimeo auto-refresh launchd plist (gated install) -
fea330052026-08-01 fix(social): featured video drills to in-app /review, not rentvreview.com link-out (RENTV no-link-out + href-drill HARD rules) -
c88d6e4f2026-08-01 chore(social): note no X account per Steve; Instagram + featured video stay admin-only -
ed30a7bf2026-08-01 review: pin video 3103 (Steven Bloom / RenTV founder) into The REview library -
cf61759d2026-08-01 feat(social): add Instagram + featured RENTV Review video to /social; new 'RENTV on the Web' section -
871a02b42026-08-01 chore: lint (py with-context), refactor (Invalid-Date guard, magic-number doc), v0.16.0 (session close) -
c06e94ce2026-07-31 fix(metros): metro deal items drill to the specific deal (/news/:id), not generic /deals -
4e674a282026-07-31 fix(watchlist): deal cards drill to the specific deal (/news/:id), not the generic /deals list -
afcf869a2026-07-31 feat(watchlist): add sort + density to the deal watchlist grid (HARD-rule compliance) -
b4f527152026-07-31 auto-save: 2026-07-31T16:29:30 (1 files) — public/watchlist.html -
fccef3ba2026-07-31 feat(deals): add sort + density controls to the CRE deal grid (HARD-RULE compliance) -
7f6b537b2026-07-31 fix(social): harden Vimeo refresh — empty-result guard + atomic write so a bad cron run can't clobber the deploy-protected library -
d3c7c5c92026-07-31 chore(social): daily prod cron to auto-refresh Vimeo library + protect it from deploy clobber (v0.15.1) -
35320f6b2026-07-31 feat(social): full Vimeo catalog (123 videos via viewer-JWT pagination) + reusable pull-vimeo-library.py refresh -
eda14bfa2026-07-31 feat(social): RENTV Video Library panel — 60 Vimeo CRE Talk assets (localized thumbs, sort/filter/density, copy-link/embed/draft-post) (v0.15.0) -
d55d5b822026-07-31 feat(social): use Boomer's dedicated VO clone (EoZqhGRrFYVEnxL4P2So) as studio voice; archive VO sample (v0.14.0) -
8bf8de3f2026-07-31 fix(social): cross-platform fonts (DejaVu/Liberation fallback) + robust ElevenLabs key resolution for Kamatera prod (v0.13.1) -
8336bfb82026-07-31 feat(social): article→video studio — Boomer-voiced 5/15/30s teasers from live rentv.com headlines (v0.13.0) -
1e7f99422026-07-31 chore: v0.12.0 (session close — RENTV Growth console + realestate licensed-targets platform) -
8eff89bc2026-07-31 chore: v0.10.0 → v0.11.0 (session close — licensed-CRE console + realestate integration) -
749d97732026-07-31 console: surface existing phone/website (60,861 contractors have phone) as tel/site links + CSV export + fix Los Angeles→Greater LA market-map bug -
7a41e57b2026-07-31 console: split 'Title & Escrow' facet → Escrow (registry-backed, 967) + Title (honest LinkedIn lens, no title data) — DTD contrarian fix so the label never overpromises -
b76ca06b2026-07-31 yoloforever: DTD-C punch-list COMPLETE (triage scoped, outreach proven end-to-end to provider-draft, send gated); loop retired -
2413bbdd2026-07-30 yoloforever ledger: autonomous tick — state-aware gate shipped (AZ first-class, passes); 2 items held for Steve -
0bad92c32026-07-30 pr-intelligence: state-aware quality gate (stateGate(state)) — Arizona now a first-class gate/dashboard number; /api/pr/gate/check?state=AZ; californiaGate() back-compat wrapper; test (30/30). DTD-C punch-list item 2. -
cf8d9dc22026-07-30 yoloforever: cycle 7 ledger — AZ coverage 81%, name gate hardened; both states verified >70% after honest junk sweep -
14d950ab2026-07-30 pr-intelligence: c7 structural name rule — trailing role/category noun ⇒ title not name (kills 'Utilities Field Inspector' class without word-chasing) -
7b2724ce2026-07-30 yoloforever: cycle 6 ledger — Arizona Phase 2 bootstrapped (116 orgs/265 people), multi-state dedupe fixed -
6993ec482026-07-30 pr-intelligence: Cody c6 — multi-state geo merge on exact-domain match (national firms gain AZ footprint instead of dropping it, audited) -
312a68db2026-07-30 console: add Developers facet → realestate (usre proxy + AZ DRE, 9830 devs); realestate now 74,350 targets across 5 roles -
9166e3472026-07-30 pr-intelligence: headless tool state-parametrized (PR_STATE, per-org state_presence) -
2ed7c8722026-07-30 pr-intelligence: Arizona Phase-2 seed (67 real AZ CRE orgs, gate-guarded) + pr:seed:az script -
13b6880c2026-07-30 console: /api/summit/licensed (realestate DB) + facet wiring — title/escrow/contractor/lender/attorney load real licensed names, grounded letters -
2d3f94772026-07-30 yoloforever: 🎯 CALIFORNIA QUALITY GATE PASSED (71% coverage, bank-excluded scope) — Arizona unlocked, Phase 2 parked for Steve -
f08f88a22026-07-30 pr-intelligence: headless tool skips coverage-excluded org types (non-bank targeting) -
bc9f1e632026-07-30 pr-intelligence: coverage-scope exclusion (Steve — skip bank/credit_union from gate denominator, dashboard no-PR count, gap report); configurable via coverage_exclude_types setting + Settings UI; migration 003 -
4a1cb2d02026-07-30 yoloforever: cycle 4 ledger — SHIP-AND-PAUSE; public-channel saturation reached, FDIC lever disproven, loop paused pending a Steve-gated next-lever -
bd17052e2026-07-30 social console F1: Role×Market×Sector facet builder — composes LinkedIn search, honest registry✓ vs lens tag, pin segment, load real names from CA-metro registry -
3db0aeaf2026-07-30 social console: /api/firm/:id proxy + firm→people drilldown, role icons on rows, RENTV-menu-grounded offer letters (real events/prices/contact) -
aed80d092026-07-30 pr-intelligence: Cody c4 — person.rejected audit logging, company-suffix HARD words, senior-title→leadership dept default; 28 industry associations added (Steve-directed) -
eaccaf1f2026-07-30 role icons: 13-icon SVG vocabulary for all CRE user/role types + /role-icons preview page -
835146a02026-07-30 social: collapsible left Growth·LinkedIn target rail — CRE conference-attendee roles + registry pull + per-name letter generator -
47c8ac142026-07-30 pr-intelligence: cycle-4 extractor upgrades — single-line Name,Title parsing; common bank-path probes + two-hop about crawl in headless tool -
6ffb2d7c2026-07-30 yoloforever: cycle 3 ledger (SHIP 3/3 local) -
b3dfe4782026-07-30 pr-intelligence: Cody c3 — two-tier name predicate (HARD title/product words reject anywhere; SOFT filler needs all-tokens), 16/16 known junk rejected, 10/10 real names pass -
d37f91382026-07-30 pr-intelligence: headless team-page extractor (local Playwright → audited prod API), ranked leadership-first link selection; name-gate stoplist extended with UI verb+noun leaks -
cf59aa532026-07-30 yoloforever: cycle 2 ledger (SHIP 5/5); local-models directive recorded -
41924b742026-07-30 pr-intelligence: Cody-gate c2 fixes — isLikelyPersonName chokepoint gate in people.create (+manual override), press-contact name/label swap-fix, caller guards, periodic stale-claim recovery (5min), comms-only coverage lens on gate -
284c46a92026-07-30 pr-intelligence: press-contact extractor — RSS-first release discovery (JS-rendered newsrooms), contact-block parser; discover-press-contacts job; registry orgs auto-queue verification -
67f5fba72026-07-30 people UI: stacked Public info column (email/LinkedIn/phone/address/notes each on its own line) + editable notes in drawer; list API exposes office_location+notes -
3976b9162026-07-30 yoloforever: cycle 1 ledger (SHIP 5/5) -
a52862d92026-07-30 pr-intelligence: Cody-gate fixes — hard search-query budget + persistent spend counter (dashboard-visible), durable convergence-controller job (race-free sweep-dryness via audit actor, logged stop reasons) -
8ed157352026-07-30 pr-intelligence: full HTML-entity decode in extraction paths (ndash/mdash/8217); yoloforever c1 data-quality pass -
1bcdcd8d2026-07-30 pr-intelligence: alias-qualify all whole-row reads (fleet pre-deploy lint: no bare SELECT *) -
fbe5b6962026-07-30 pr-intelligence: discover-people-linkedin job + adapter (permitted site:linkedin.com/in public-index query) — closes the contact-coverage gap; candidates stored search_indexed/found_uncorroborated -
697cc25b2026-07-30 growth: add 7 concrete conference lead-gen tactics to the RENTV growth board -
57c7ec072026-07-30 rentv/forsale: re-attribute outreach to Steven Bloom (RENTV founder/CEO, ex-C&W) + Cushman warm-intro angle -
fb013dc72026-07-30 auto-save: 2026-07-30T14:48:53 (1 files) — docs/FORSALE-OUTREACH.md -
b0bc9e512026-07-30 rentv/forsale: set suggested ad rate card + add sublease.com competitive-process outreach pack (prep-only) -
eb15d0a92026-07-30 rentv: add /forsale admin board — assets + known-advertiser prospect pipeline + sublease.com sale (DTD time-boxed LATER) -
69355a232026-07-30 pr-intelligence: operator review pass (256 orgs verified on evidence), gate dedupe check counts run-level dedupe, NUL-strip at fetch boundary; final verification green (28/28 tests) -
3317fa1c2026-07-30 pr-intelligence: website adapter — stopword guard against nav-heading false positives in team-page extraction -
eea88b782026-07-30 pr-intelligence: docs (data-sources, research-ops, email-setup, compliance, admin-guide), .env.example, Playwright browser-test scaffolds -
d0589dad2026-07-30 pr-intelligence: CA seed (178 curated + FDIC registry), unit+integration tests (28 passing), merge NULL-array fix, FDIC API host update -
762a11ea2026-07-30 pr-intelligence: mount /api/pr/* + /admin/pr-intelligence shells; 12-page admin workspace (dashboard, research, orgs, people, 3-col review, campaigns, letter builder, inbox, tasks, sources, runs, settings) -
7a3217d02026-07-30 auto-save: 2026-07-30T11:17:19 (4 files) — package.json server.js public/admin/pr-intelligence/ src/pr/index.js -
14c23d862026-07-30 pr-intelligence: lib (geo/taxonomy/normalize/dedupe/scoring/status), services, adapters, job queue + worker -
459558da2026-07-30 pr-intelligence: plan doc, isolated pg layer (rentv_pr), schema + seed-config migrations -
fecb50bb2026-07-30 auto-save: 2026-07-30T10:47:06 (1 files) — docs/ -
07c5e2f92026-07-29 Front page: move Deal Wire video row to the top (above Market Pulse) -
4e43e75d2026-07-29 Fix news narrations: strip fabricated 'reported first' claims + invented market commentary (contrarian gate → DTD FIX-THEN-SHIP) -
45440dc52026-07-29 Deal Wire: add 2 newest rentv.com stories (Longpoint AZ industrial, Santa Monica multifamily) — front page + library -
d216c6482026-07-29 chore: v0.10.0 (session close — front-page Deal Wire video row, cache-bust, 11 news videos) -
762628be2026-07-29 All 4 Sublease promos now real lip-synced talking-Boomer (15/30/60 rendered on funded wallet) -
5fec19712026-07-29 Extend Deal Wire to 11 news videos (5 more rentv.com stories) on front page + library -
6d6647882026-07-29 Front page: add Deal Wire Video row (6 news videos, public /vid path) -
5dd7950a2026-07-29 Add 6 RENTV News deal-wire videos (latest rentv.com stories, cloned voice, no music) -
c674d2812026-07-29 rentv: harden Desk backend proxies (contrarian fixes) -
a32a52252026-07-29 rentv Desk: fuller default loads for New Homes + Commercial -
d43103892026-07-29 rentv Desk: add Commercial scope (crcp LA commercial-RE CRM) + durable crcp cred -
1caab77d2026-07-29 5s Sublease promo: real lip-synced talking-Boomer avatar (face-cropped from rentv.com headshot) -
940fdce82026-07-29 Add Sublease × RENTV promos (5/15/30/60s, Boomer photo, Steve voice) to press library -
116662d32026-07-29 Master Reel + Walkthrough updated with deep growth section; add Growth Engine deep-dive film -
482ee13d2026-07-29 rentv Desk: add New Homes scope (homesonspec spec-home inventory) -
3c12ff4c2026-07-29 rentv: proxy homesonspec + crcp backends into the admin Desk -
689e1cd62026-07-29 Replace build slideshow with full front+backend walkthrough (deep every-screen narration, wall-to-wall Steve voice, no music) -
0c99aca62026-07-29 RENTV: add admin login boomer for rentv.agentabrams.com -
7d6069af2026-07-29 press library: cache-bust videos.json fetch so new films appear without hard-refresh -
6649775d2026-07-29 Add RENTV build slideshow presentation (Steve voice, HyperFrames) to press library -
6d46d5c42026-07-28 Master Reel: brighten+lift music bed so gaps carry on laptop/phone speakers (bass-rolloff fix); small-speaker audit clean -
d4c5df3f2026-07-28 Move LA Commercial + market-pulse sections to admin-only (APIs, page shells, nav links, search) -
d9294f442026-07-28 Master Reel: replace bed with crossfade-looped real music (fix loop-seam silence); continuous audio verified whole-file -
935c3ffa2026-07-28 Master Reel: mix continuous ducked music bed under narration (kill dead-silence pan-gaps), re-mux fixed audio -
6feeb3952026-07-28 Fix: person/sign-in icon opens the menu drawer instead of jarring redirect to /subscribe (index + desk) -
dcf6c8c92026-07-28 Master Reel: LONG detailed cut (14.3min, full-page slow pans, Steve voice + ambient bed, 20s real-avatar Boomer intro) -
55f6f8432026-07-28 Master Reel: rebuilt Boomer walkthrough (recap-v2 expanded to 22 scenes, current-site captures, Steve cloned voice throughout, 20s real-avatar PIP intro) -
99237b792026-07-28 Restore original 15.8-min detailed Master Reel (was wrongly replaced); keep short montage as Sizzle Reel -
eb831aaa2026-07-28 Pitch films rebuilt: Growth/Deep-Dive/SWOT/Ad-Plan (current data, Steve voice, 15s real-avatar PIP intro) replace stale July set -
76148e6f2026-07-28 Master Reel: real bearded-Steve avatar PIP (current data) replaces stale July reel -
b10b0ae52026-07-28 Video Library: add 18 Component Videos (each feature/tool, Steve cloned voice) — 41 videos total -
e9c26f232026-07-28 Add professional full-width site footer (front-end pages) -
9f5655f82026-07-28 Video Library: refresh walkthrough with clean-header captures (no top tabs, hamburger UL + person UR) -
d83ecd5c2026-07-28 Admin: add Social Media command center at /social (LinkedIn-forward, draft-only) -
c7d9db4c2026-07-28 Video Library: voiced walkthrough (Steve cloned VO) + created date/time on every card -
4ae1c7692026-07-28 Video Library: add RENTV full-site walkthrough as lead Feature Film (23 videos) -
11ac53762026-07-28 Complete consulting fold: rewrite /portal/* asset paths -> /consulting/* in portal.html -
9df21f112026-07-28 Admin Video Library: gather all RENTV films/walkthroughs/recaps into /press (22 videos) -
d28656842026-07-28 Add Front End <-> Backend toggle: site-wide injected widget + /backend admin hub -
6660ab362026-07-28 Fold /consulting dynamic API inline (intake + admin buckets), admin-only, namespaced under /consulting/api/* -
0dfdf6c32026-07-28 Unify RENTV: two-tier user/admin auth + fold consulting (/consulting) & promos (/press); rename rentv-v1 -> rentv (v0.9.0) -
f2f1c0a72026-07-28 auto-save: 2026-07-28T09:59:38 (3 files) — data/markets.json data/news.json data/ticker.json -
b3291f142026-07-28 auto-save: 2026-07-28T09:29:05 (3 files) — data/markets.json data/news.json data/ticker.json -
e19a76512026-07-28 auto-save: 2026-07-28T08:58:52 (3 files) — data/markets.json data/news.json data/ticker.json -
e9aea1bc2026-07-28 auto-save: 2026-07-28T08:28:39 (3 files) — data/markets.json data/news.json data/ticker.json -
a9b661192026-07-28 auto-save: 2026-07-28T07:58:26 (3 files) — data/markets.json data/news.json data/ticker.json -
0d5caece2026-07-28 auto-save: 2026-07-28T07:28:16 (3 files) — data/markets.json data/news.json data/ticker.json -
2936fe0f2026-07-28 auto-save: 2026-07-28T06:58:06 (3 files) — data/markets.json data/news.json data/ticker.json -
fcf9d7152026-07-28 auto-save: 2026-07-28T06:27:56 (3 files) — data/markets.json data/news.json data/ticker.json -
e56d37a42026-07-28 auto-save: 2026-07-28T05:57:47 (3 files) — data/markets.json data/news.json data/ticker.json -
c2c9ea362026-07-28 auto-save: 2026-07-28T05:27:36 (3 files) — data/markets.json data/news.json data/ticker.json -
bf4d0fc12026-07-28 auto-save: 2026-07-28T04:57:26 (3 files) — data/markets.json data/news.json data/ticker.json -
fe00f3d12026-07-28 auto-save: 2026-07-28T04:27:17 (3 files) — data/markets.json data/news.json data/ticker.json -
e8ae5a312026-07-28 auto-save: 2026-07-28T03:57:08 (3 files) — data/markets.json data/news.json data/ticker.json -
2d81b56a2026-07-28 auto-save: 2026-07-28T03:26:56 (3 files) — data/markets.json data/news.json data/ticker.json -
e946bd142026-07-28 auto-save: 2026-07-28T02:56:47 (3 files) — data/markets.json data/news.json data/ticker.json -
7b50f7c52026-07-28 auto-save: 2026-07-28T02:26:37 (3 files) — data/markets.json data/news.json data/ticker.json -
b3f7954f2026-07-28 auto-save: 2026-07-28T01:56:27 (3 files) — data/markets.json data/news.json data/ticker.json -
651703562026-07-28 auto-save: 2026-07-28T01:26:17 (3 files) — data/markets.json data/news.json data/ticker.json -
a283d16d2026-07-28 auto-save: 2026-07-28T00:56:07 (3 files) — data/markets.json data/news.json data/ticker.json -
0f640a222026-07-28 auto-save: 2026-07-28T00:25:56 (3 files) — data/markets.json data/news.json data/ticker.json -
2c4b30442026-07-27 auto-save: 2026-07-27T23:55:46 (3 files) — data/markets.json data/news.json data/ticker.json -
875ab59e2026-07-27 auto-save: 2026-07-27T23:25:34 (3 files) — data/markets.json data/news.json data/ticker.json -
496afdfb2026-07-27 auto-save: 2026-07-27T22:55:20 (3 files) — data/markets.json data/news.json data/ticker.json -
5f2cf8f82026-07-27 auto-save: 2026-07-27T22:25:06 (3 files) — data/markets.json data/news.json data/ticker.json -
0a1a872c2026-07-27 auto-save: 2026-07-27T21:54:54 (3 files) — data/markets.json data/news.json data/ticker.json -
36d4bea12026-07-27 auto-save: 2026-07-27T21:24:43 (3 files) — data/markets.json data/news.json data/ticker.json -
f36793362026-07-27 auto-save: 2026-07-27T20:54:34 (3 files) — data/markets.json data/news.json data/ticker.json -
528c78ef2026-07-27 auto-save: 2026-07-27T20:24:23 (3 files) — data/markets.json data/news.json data/ticker.json -
82af5c612026-07-27 auto-save: 2026-07-27T19:54:12 (3 files) — data/markets.json data/news.json data/ticker.json -
209979f22026-07-27 auto-save: 2026-07-27T19:23:22 (3 files) — data/markets.json data/news.json data/ticker.json -
711083952026-07-27 auto-save: 2026-07-27T18:53:10 (3 files) — data/markets.json data/news.json data/ticker.json -
8da8f9db2026-07-27 auto-save: 2026-07-27T18:22:43 (3 files) — data/markets.json data/news.json data/ticker.json -
a0b4bfda2026-07-27 auto-save: 2026-07-27T17:52:34 (3 files) — data/markets.json data/news.json data/ticker.json -
f5781deb2026-07-27 auto-save: 2026-07-27T17:22:24 (3 files) — data/markets.json data/news.json data/ticker.json -
0abdf5392026-07-27 auto-save: 2026-07-27T16:52:13 (3 files) — data/markets.json data/news.json data/ticker.json -
76beed962026-07-27 auto-save: 2026-07-27T16:21:58 (3 files) — data/markets.json data/news.json data/ticker.json -
29080baa2026-07-27 auto-save: 2026-07-27T15:51:48 (3 files) — data/markets.json data/news.json data/ticker.json -
7e9266d82026-07-27 auto-save: 2026-07-27T15:21:37 (3 files) — data/markets.json data/news.json data/ticker.json -
7d577c002026-07-27 auto-save: 2026-07-27T14:51:27 (3 files) — data/markets.json data/news.json data/ticker.json -
56b5b42d2026-07-27 rentv-v1: reconcile pull-news.mjs to prod authority (revert redundant 0b6f1d1 pull-markets import) -
9ab562652026-07-27 auto-save: 2026-07-27T14:21:14 (3 files) — data/markets.json data/news.json data/ticker.json -
0fc1e27d2026-07-27 auto-save: 2026-07-27T13:51:03 (3 files) — data/markets.json data/news.json data/ticker.json -
11ed87bb2026-07-27 auto-save: 2026-07-27T13:20:51 (3 files) — data/markets.json data/news.json data/ticker.json -
8ac7ec7a2026-07-27 auto-save: 2026-07-27T12:50:40 (3 files) — data/markets.json data/news.json data/ticker.json -
dab168402026-07-27 auto-save: 2026-07-27T12:20:30 (3 files) — data/markets.json data/news.json data/ticker.json -
2e2276fb2026-07-27 auto-save: 2026-07-27T11:50:21 (3 files) — data/markets.json data/news.json data/ticker.json -
8c154dcf2026-07-27 auto-save: 2026-07-27T11:20:11 (3 files) — data/markets.json data/news.json data/ticker.json -
365df92d2026-07-27 auto-save: 2026-07-27T10:49:50 (3 files) — data/markets.json data/news.json data/ticker.json -
9debc8d72026-07-27 auto-save: 2026-07-27T10:19:40 (3 files) — data/markets.json data/news.json data/ticker.json -
4f5efcd52026-07-27 auto-save: 2026-07-27T09:49:31 (3 files) — data/markets.json data/news.json data/ticker.json -
1f398b362026-07-27 auto-save: 2026-07-27T09:19:22 (3 files) — data/markets.json data/news.json data/ticker.json -
3c0ac0e12026-07-27 auto-save: 2026-07-27T08:49:12 (3 files) — data/markets.json data/news.json data/ticker.json -
9a5469be2026-07-27 auto-save: 2026-07-27T08:19:05 (3 files) — data/markets.json data/news.json data/ticker.json -
eb4a35112026-07-27 auto-save: 2026-07-27T07:48:56 (3 files) — data/markets.json data/news.json data/ticker.json -
6951a5622026-07-27 auto-save: 2026-07-27T07:18:47 (3 files) — data/markets.json data/news.json data/ticker.json -
0266f4932026-07-27 auto-save: 2026-07-27T06:48:37 (3 files) — data/markets.json data/news.json data/ticker.json -
e4fb6cfa2026-07-27 auto-save: 2026-07-27T06:18:28 (3 files) — data/markets.json data/news.json data/ticker.json -
e6f6aa592026-07-27 auto-save: 2026-07-27T05:48:20 (3 files) — data/markets.json data/news.json data/ticker.json -
81ad68ab2026-07-27 auto-save: 2026-07-27T05:18:10 (3 files) — data/markets.json data/news.json data/ticker.json -
a3528ddb2026-07-27 auto-save: 2026-07-27T04:48:02 (3 files) — data/markets.json data/news.json data/ticker.json -
337d37ba2026-07-27 auto-save: 2026-07-27T04:17:53 (3 files) — data/markets.json data/news.json data/ticker.json -
a517cea32026-07-27 auto-save: 2026-07-27T03:47:45 (3 files) — data/markets.json data/news.json data/ticker.json -
07d80f292026-07-27 auto-save: 2026-07-27T03:17:36 (3 files) — data/markets.json data/news.json data/ticker.json -
8e4c0e112026-07-27 auto-save: 2026-07-27T02:47:28 (3 files) — data/markets.json data/news.json data/ticker.json -
d8ba53ef2026-07-27 auto-save: 2026-07-27T02:17:19 (3 files) — data/markets.json data/news.json data/ticker.json -
d6ad58a12026-07-27 auto-save: 2026-07-27T01:47:10 (3 files) — data/markets.json data/news.json data/ticker.json -
0183f0912026-07-27 auto-save: 2026-07-27T01:17:03 (3 files) — data/markets.json data/news.json data/ticker.json -
c3742abf2026-07-27 auto-save: 2026-07-27T00:46:55 (3 files) — data/markets.json data/news.json data/ticker.json -
7d21bd552026-07-27 auto-save: 2026-07-27T00:16:47 (3 files) — data/markets.json data/news.json data/ticker.json -
a97a54132026-07-26 auto-save: 2026-07-26T23:46:40 (3 files) — data/markets.json data/news.json data/ticker.json -
db8c7b2f2026-07-26 auto-save: 2026-07-26T23:16:32 (3 files) — data/markets.json data/news.json data/ticker.json -
9860b4382026-07-26 auto-save: 2026-07-26T22:46:25 (3 files) — data/markets.json data/news.json data/ticker.json -
5db0bb472026-07-26 auto-save: 2026-07-26T22:16:17 (3 files) — data/markets.json data/news.json data/ticker.json -
0cdc95cc2026-07-26 auto-save: 2026-07-26T21:46:09 (3 files) — data/markets.json data/news.json data/ticker.json -
9a14fb0f2026-07-26 auto-save: 2026-07-26T21:15:59 (3 files) — data/markets.json data/news.json data/ticker.json -
4b36afea2026-07-26 auto-save: 2026-07-26T20:45:50 (3 files) — data/markets.json data/news.json data/ticker.json -
0b6f1d1c2026-07-26 rentv-v1: wire pull-markets into pull-news cron so /markets stays fresh (MARKETS-PATCH step 3) -
567d67ef2026-07-26 auto-save: 2026-07-26T20:15:38 (3 files) — data/markets.json data/news.json data/ticker.json -
87c7b4f12026-07-26 auto-save: 2026-07-26T19:45:29 (3 files) — data/markets.json data/news.json data/ticker.json -
b2bd73bb2026-07-26 auto-save: 2026-07-26T19:15:21 (3 files) — data/markets.json data/news.json data/ticker.json -
e572739d2026-07-26 auto-save: 2026-07-26T18:45:13 (3 files) — data/markets.json data/news.json data/ticker.json -
12be3d272026-07-26 auto-save: 2026-07-26T18:15:03 (3 files) — data/markets.json data/news.json data/ticker.json -
e4e7c9dd2026-07-26 auto-save: 2026-07-26T17:44:55 (3 files) — data/markets.json data/news.json data/ticker.json -
93277e042026-07-26 auto-save: 2026-07-26T17:14:46 (3 files) — data/markets.json data/news.json data/ticker.json -
20b462e42026-07-26 auto-save: 2026-07-26T16:44:36 (3 files) — data/markets.json data/news.json data/ticker.json -
bdf3fe3a2026-07-26 auto-save: 2026-07-26T16:14:26 (3 files) — data/markets.json data/news.json data/ticker.json -
6bea8cc22026-07-26 auto-save: 2026-07-26T15:44:17 (3 files) — data/markets.json data/news.json data/ticker.json -
9b4558f22026-07-26 auto-save: 2026-07-26T15:14:10 (3 files) — data/markets.json data/news.json data/ticker.json -
1567aff52026-07-26 auto-save: 2026-07-26T14:44:02 (3 files) — data/markets.json data/news.json data/ticker.json -
2ab2282f2026-07-26 auto-save: 2026-07-26T14:13:54 (3 files) — data/markets.json data/news.json data/ticker.json -
9cc6c2572026-07-26 auto-save: 2026-07-26T13:43:45 (3 files) — data/markets.json data/news.json data/ticker.json -
4a5f62312026-07-26 auto-save: 2026-07-26T13:13:36 (3 files) — data/markets.json data/news.json data/ticker.json -
ae31d7372026-07-26 auto-save: 2026-07-26T12:43:27 (3 files) — data/markets.json data/news.json data/ticker.json -
fd5f9bff2026-07-26 auto-save: 2026-07-26T12:13:19 (3 files) — data/markets.json data/news.json data/ticker.json -
10242e772026-07-26 auto-save: 2026-07-26T11:43:10 (3 files) — data/markets.json data/news.json data/ticker.json -
fde74c092026-07-26 auto-save: 2026-07-26T11:13:01 (3 files) — data/markets.json data/news.json data/ticker.json -
f05a5c582026-07-26 auto-save: 2026-07-26T10:42:53 (3 files) — data/markets.json data/news.json data/ticker.json -
052b12ff2026-07-26 auto-save: 2026-07-26T10:12:44 (3 files) — data/markets.json data/news.json data/ticker.json -
4e671a122026-07-26 auto-save: 2026-07-26T09:42:34 (3 files) — data/markets.json data/news.json data/ticker.json -
05acce752026-07-26 auto-save: 2026-07-26T09:12:24 (3 files) — data/markets.json data/news.json data/ticker.json -
e33ce4f72026-07-26 auto-save: 2026-07-26T08:41:50 (3 files) — data/markets.json data/news.json data/ticker.json -
4505a49e2026-07-26 auto-save: 2026-07-26T08:11:40 (3 files) — data/markets.json data/news.json data/ticker.json -
300756722026-07-26 auto-save: 2026-07-26T07:41:30 (3 files) — data/markets.json data/news.json data/ticker.json -
d2c4db942026-07-26 auto-save: 2026-07-26T07:11:20 (3 files) — data/markets.json data/news.json data/ticker.json -
932114c52026-07-26 auto-save: 2026-07-26T06:41:11 (3 files) — data/markets.json data/news.json data/ticker.json -
31fb87562026-07-26 auto-save: 2026-07-26T06:11:02 (3 files) — data/markets.json data/news.json data/ticker.json -
6aa9fe192026-07-26 auto-save: 2026-07-26T05:40:54 (3 files) — data/markets.json data/news.json data/ticker.json -
6bd6e7592026-07-26 auto-save: 2026-07-26T05:10:45 (3 files) — data/markets.json data/news.json data/ticker.json -
9b8a8a6b2026-07-26 auto-save: 2026-07-26T04:40:35 (3 files) — data/markets.json data/news.json data/ticker.json -
38da7deb2026-07-26 auto-save: 2026-07-26T04:10:27 (3 files) — data/markets.json data/news.json data/ticker.json -
637cd5712026-07-26 auto-save: 2026-07-26T03:40:20 (3 files) — data/markets.json data/news.json data/ticker.json -
5f9a9b462026-07-26 auto-save: 2026-07-26T03:10:13 (3 files) — data/markets.json data/news.json data/ticker.json -
6198c3722026-07-26 auto-save: 2026-07-26T02:40:05 (3 files) — data/markets.json data/news.json data/ticker.json -
644c5c8b2026-07-26 auto-save: 2026-07-26T02:09:57 (3 files) — data/markets.json data/news.json data/ticker.json -
8b1563db2026-07-26 auto-save: 2026-07-26T01:39:48 (3 files) — data/markets.json data/news.json data/ticker.json -
dc36adc12026-07-26 auto-save: 2026-07-26T01:09:40 (3 files) — data/markets.json data/news.json data/ticker.json -
baff56792026-07-26 auto-save: 2026-07-26T00:39:31 (3 files) — data/markets.json data/news.json data/ticker.json -
78c517952026-07-26 auto-save: 2026-07-26T00:09:22 (3 files) — data/markets.json data/news.json data/ticker.json -
f5f6900f2026-07-25 auto-save: 2026-07-25T23:39:14 (3 files) — data/markets.json data/news.json data/ticker.json -
5d34cebd2026-07-25 auto-save: 2026-07-25T23:09:06 (3 files) — data/markets.json data/news.json data/ticker.json -
1995657b2026-07-25 auto-save: 2026-07-25T22:38:58 (3 files) — data/markets.json data/news.json data/ticker.json -
e7922c9c2026-07-25 auto-save: 2026-07-25T22:08:51 (3 files) — data/markets.json data/news.json data/ticker.json -
cd696c672026-07-25 auto-save: 2026-07-25T21:38:42 (3 files) — data/markets.json data/news.json data/ticker.json -
0840144a2026-07-25 auto-save: 2026-07-25T21:08:35 (3 files) — data/markets.json data/news.json data/ticker.json -
3ca4bdfb2026-07-25 auto-save: 2026-07-25T20:38:27 (3 files) — data/markets.json data/news.json data/ticker.json -
97d5e1f82026-07-25 auto-save: 2026-07-25T20:08:18 (3 files) — data/markets.json data/news.json data/ticker.json -
46bc1ac22026-07-25 auto-save: 2026-07-25T19:38:10 (3 files) — data/markets.json data/news.json data/ticker.json -
2e3a247b2026-07-25 auto-save: 2026-07-25T19:08:03 (3 files) — data/markets.json data/news.json data/ticker.json -
8d11b70c2026-07-25 auto-save: 2026-07-25T18:37:55 (3 files) — data/markets.json data/news.json data/ticker.json -
bb5f251f2026-07-25 auto-save: 2026-07-25T18:07:45 (3 files) — data/markets.json data/news.json data/ticker.json -
fd8a5da22026-07-25 auto-save: 2026-07-25T17:37:37 (3 files) — data/markets.json data/news.json data/ticker.json -
4d7dea262026-07-25 auto-save: 2026-07-25T17:07:29 (3 files) — data/markets.json data/news.json data/ticker.json -
985db03c2026-07-25 auto-save: 2026-07-25T16:37:21 (3 files) — data/markets.json data/news.json data/ticker.json -
1bb6f42d2026-07-25 auto-save: 2026-07-25T16:07:12 (3 files) — data/markets.json data/news.json data/ticker.json -
98bafbca2026-07-25 auto-save: 2026-07-25T15:37:05 (3 files) — data/markets.json data/news.json data/ticker.json -
5baa7c7c2026-07-25 auto-save: 2026-07-25T15:06:58 (3 files) — data/markets.json data/news.json data/ticker.json -
87ef57472026-07-25 auto-save: 2026-07-25T14:36:51 (3 files) — data/markets.json data/news.json data/ticker.json -
7bb14be12026-07-25 auto-save: 2026-07-25T14:06:43 (3 files) — data/markets.json data/news.json data/ticker.json -
a0d212ed2026-07-25 auto-save: 2026-07-25T13:36:34 (3 files) — data/markets.json data/news.json data/ticker.json -
c4669a332026-07-25 auto-save: 2026-07-25T13:06:24 (3 files) — data/markets.json data/news.json data/ticker.json -
37c9fce22026-07-25 auto-save: 2026-07-25T12:36:15 (3 files) — data/markets.json data/news.json data/ticker.json -
83e43dd32026-07-25 auto-save: 2026-07-25T12:06:06 (3 files) — data/markets.json data/news.json data/ticker.json -
878e39e92026-07-25 auto-save: 2026-07-25T11:35:57 (3 files) — data/markets.json data/news.json data/ticker.json -
9eb660922026-07-25 auto-save: 2026-07-25T11:05:48 (3 files) — data/markets.json data/news.json data/ticker.json -
b314b3532026-07-25 auto-save: 2026-07-25T10:35:38 (3 files) — data/markets.json data/news.json data/ticker.json -
a1d6961e2026-07-25 auto-save: 2026-07-25T10:05:29 (3 files) — data/markets.json data/news.json data/ticker.json -
c4b16a292026-07-25 auto-save: 2026-07-25T09:35:20 (3 files) — data/markets.json data/news.json data/ticker.json -
281581fc2026-07-25 auto-save: 2026-07-25T09:05:11 (3 files) — data/markets.json data/news.json data/ticker.json -
514c5a7c2026-07-25 auto-save: 2026-07-25T08:35:01 (3 files) — data/markets.json data/news.json data/ticker.json -
78bf74402026-07-25 auto-save: 2026-07-25T08:04:52 (3 files) — data/markets.json data/news.json data/ticker.json -
0a8881ce2026-07-25 auto-save: 2026-07-25T07:34:42 (3 files) — data/markets.json data/news.json data/ticker.json -
fd30fc672026-07-25 auto-save: 2026-07-25T07:04:29 (3 files) — data/markets.json data/news.json data/ticker.json -
0da8c7592026-07-25 auto-save: 2026-07-25T06:34:19 (3 files) — data/markets.json data/news.json data/ticker.json -
30b61be42026-07-25 auto-save: 2026-07-25T06:04:08 (3 files) — data/markets.json data/news.json data/ticker.json -
1584c1512026-07-25 auto-save: 2026-07-25T05:33:58 (3 files) — data/markets.json data/news.json data/ticker.json -
b5ad310c2026-07-25 auto-save: 2026-07-25T05:03:47 (3 files) — data/markets.json data/news.json data/ticker.json -
cba466c12026-07-25 auto-save: 2026-07-25T04:33:37 (3 files) — data/markets.json data/news.json data/ticker.json -
7dce46732026-07-25 auto-save: 2026-07-25T04:03:25 (3 files) — data/markets.json data/news.json data/ticker.json -
fdfc3f872026-07-25 auto-save: 2026-07-25T03:33:15 (3 files) — data/markets.json data/news.json data/ticker.json -
1004cd3f2026-07-25 auto-save: 2026-07-25T03:03:06 (3 files) — data/markets.json data/news.json data/ticker.json -
2fd371002026-07-25 auto-save: 2026-07-25T02:32:56 (3 files) — data/markets.json data/news.json data/ticker.json -
96b28d532026-07-25 auto-save: 2026-07-25T02:02:37 (3 files) — data/markets.json data/news.json data/ticker.json -
36d1dcb52026-07-25 auto-save: 2026-07-25T01:32:27 (3 files) — data/markets.json data/news.json data/ticker.json -
384ed81f2026-07-25 auto-save: 2026-07-25T01:02:17 (3 files) — data/markets.json data/news.json data/ticker.json -
af6e61812026-07-25 chore: v0.8.0 (session close — CRE Market Pulse page + front-page embed) -
1fa0ad9d2026-07-25 auto-save: 2026-07-25T00:32:03 (3 files) — data/markets.json data/news.json data/ticker.json -
2a251feb2026-07-25 market-pulse: consolidate all nav into the single hamburger; left rail is Market Data only -
83c2c24c2026-07-25 market-pulse: pin full site nav into the persistent left rail (always shown) above the collapsed data categories -
ce438f642026-07-25 auto-save: 2026-07-25T00:01:48 (4 files) — data/markets.json data/news.json data/ticker.json public/market-pulse.html -
78d7b01d2026-07-24 Add CRE Market Pulse (rates terminal) page + front-page ticker link, nav, and live embed -
220feb942026-07-24 auto-save: 2026-07-24T23:30:18 (3 files) — data/markets.json data/news.json data/ticker.json -
07a11ce32026-07-24 auto-save: 2026-07-24T23:00:12 (3 files) — data/markets.json data/news.json data/ticker.json -
e7a0caf12026-07-24 auto-save: 2026-07-24T22:30:05 (3 files) — data/markets.json data/news.json data/ticker.json -
050458592026-07-24 auto-save: 2026-07-24T21:59:59 (3 files) — data/markets.json data/news.json data/ticker.json -
526f8dc52026-07-24 auto-save: 2026-07-24T21:29:51 (3 files) — data/markets.json data/news.json data/ticker.json -
3d86c2172026-07-24 auto-save: 2026-07-24T20:59:44 (3 files) — data/markets.json data/news.json data/ticker.json -
2137373d2026-07-24 auto-save: 2026-07-24T20:29:36 (3 files) — data/markets.json data/news.json data/ticker.json -
dfbb5f892026-07-24 auto-save: 2026-07-24T19:59:29 (3 files) — data/markets.json data/news.json data/ticker.json -
94c94a2f2026-07-24 auto-save: 2026-07-24T19:29:21 (3 files) — data/markets.json data/news.json data/ticker.json -
7b3dc4c82026-07-24 auto-save: 2026-07-24T18:59:11 (3 files) — data/markets.json data/news.json data/ticker.json -
451778dd2026-07-24 auto-save: 2026-07-24T18:29:03 (3 files) — data/markets.json data/news.json data/ticker.json -
867bf39c2026-07-24 auto-save: 2026-07-24T17:58:56 (3 files) — data/markets.json data/news.json data/ticker.json -
eedc92402026-07-24 auto-save: 2026-07-24T17:28:49 (3 files) — data/markets.json data/news.json data/ticker.json -
540c7d372026-07-24 auto-save: 2026-07-24T16:58:41 (3 files) — data/markets.json data/news.json data/ticker.json -
b74f23f92026-07-24 auto-save: 2026-07-24T16:28:36 (3 files) — data/markets.json data/news.json data/ticker.json -
d204b62c2026-07-24 auto-save: 2026-07-24T15:58:29 (3 files) — data/markets.json data/news.json data/ticker.json -
05184bda2026-07-24 auto-save: 2026-07-24T15:28:23 (3 files) — data/markets.json data/news.json data/ticker.json -
6bd546b42026-07-24 auto-save: 2026-07-24T14:58:16 (3 files) — data/markets.json data/news.json data/ticker.json -
f909bba22026-07-24 auto-save: 2026-07-24T14:28:09 (3 files) — data/markets.json data/news.json data/ticker.json -
8792614d2026-07-24 auto-save: 2026-07-24T13:58:01 (3 files) — data/markets.json data/news.json data/ticker.json -
119284ff2026-07-24 auto-save: 2026-07-24T13:27:55 (3 files) — data/markets.json data/pull.err data/ticker.json -
80c373852026-07-24 auto-save: 2026-07-24T12:57:48 (3 files) — data/markets.json data/pull.err data/ticker.json -
a617b8f22026-07-24 auto-save: 2026-07-24T12:27:43 (3 files) — data/markets.json data/pull.err data/ticker.json -
022e579e2026-07-24 auto-save: 2026-07-24T11:57:36 (3 files) — data/markets.json data/pull.err data/ticker.json -
745140c72026-07-24 auto-save: 2026-07-24T11:27:29 (3 files) — data/markets.json data/pull.err data/ticker.json -
1129ea312026-07-24 auto-save: 2026-07-24T10:57:22 (3 files) — data/markets.json data/pull.err data/ticker.json -
81717f502026-07-24 auto-save: 2026-07-24T10:27:15 (4 files) — data/markets.json data/news.json data/pull.err data/ticker.json -
752b276e2026-07-24 auto-save: 2026-07-24T09:57:07 (3 files) — data/markets.json data/news.json data/ticker.json -
2c35404d2026-07-24 auto-save: 2026-07-24T09:27:00 (3 files) — data/markets.json data/news.json data/ticker.json -
d54a52912026-07-24 auto-save: 2026-07-24T08:56:52 (3 files) — data/markets.json data/news.json data/ticker.json -
fcf025052026-07-24 fix(rentv-v1): stop review.html linking out to rentvreview.com -
7a8f75592026-07-24 fix(rentv-v1): guard non-array feed data in /api/search + /api/pulse + feeds (live crash) -
9ebf0cf92026-07-24 auto-save: 2026-07-24T08:26:42 (3 files) — data/markets.json data/news.json data/ticker.json -
95fdcd342026-07-24 fix(rentv-v1): repair search/feed article+post links, kill rentv.com deal hotlink, admin/desk bugs -
73b580202026-07-24 auto-save: 2026-07-24T07:56:29 (3 files) — data/markets.json data/news.json data/ticker.json -
3c14210a2026-07-24 syndicate: RSS 2.0 + JSON Feed for news (/feed.xml, /feed.json) + deals RSS (/deals.xml), internal links only; /syndicate page documents feeds with copy buttons + live preview; wired into Hub + nav -
52ea90e72026-07-24 tools: full 10-scene walkthrough spec (Hub + all 9 tools guided tour) -
1ada59982026-07-24 hub: RENTV Intelligence Hub (/hub) — single landing for the whole tool suite, grouped cards (Market Intelligence / Deal Tools / Directory & Search / Read & Share) + live stat strip (firms/brokers/markets/volume); home nav now leads with the hub -
bdc976b12026-07-24 auto-save: 2026-07-24T06:55:55 (3 files) — data/markets.json data/news.json data/ticker.json -
53d448912026-07-24 auto-save: 2026-07-24T06:25:47 (3 files) — data/markets.json data/news.json data/ticker.json -
64cf6d342026-07-24 auto-save: 2026-07-24T05:55:40 (3 files) — data/markets.json data/news.json data/ticker.json -
05a1e4162026-07-24 auto-save: 2026-07-24T05:25:33 (3 files) — data/markets.json data/news.json data/ticker.json -
fd427d222026-07-24 auto-save: 2026-07-24T04:55:26 (3 files) — data/markets.json data/news.json data/ticker.json -
3f3b46012026-07-24 auto-save: 2026-07-24T04:25:19 (3 files) — data/markets.json data/news.json data/ticker.json -
0707d8222026-07-24 auto-save: 2026-07-24T03:55:12 (3 files) — data/markets.json data/news.json data/ticker.json -
3698e15c2026-07-24 auto-save: 2026-07-24T03:25:06 (3 files) — data/markets.json data/news.json data/ticker.json -
f89c95722026-07-24 auto-save: 2026-07-24T02:54:59 (3 files) — data/markets.json data/news.json data/ticker.json -
294bd78e2026-07-24 auto-save: 2026-07-24T02:24:51 (3 files) — data/markets.json data/news.json data/ticker.json -
15656b882026-07-24 auto-save: 2026-07-24T01:54:44 (3 files) — data/markets.json data/news.json data/ticker.json -
a6cc5c8d2026-07-24 auto-save: 2026-07-24T01:24:37 (3 files) — data/markets.json data/news.json data/ticker.json -
407f6b812026-07-24 auto-save: 2026-07-24T00:54:30 (3 files) — data/markets.json data/news.json data/ticker.json -
d33dccf92026-07-24 auto-save: 2026-07-24T00:24:22 (3 files) — data/markets.json data/news.json data/ticker.json -
3c00c1ba2026-07-23 auto-save: 2026-07-23T23:54:14 (3 files) — data/markets.json data/news.json data/ticker.json -
735964d72026-07-23 auto-save: 2026-07-23T23:24:08 (3 files) — data/markets.json data/news.json data/ticker.json -
4a8767242026-07-23 auto-save: 2026-07-23T22:54:00 (3 files) — data/markets.json data/news.json data/ticker.json -
6efbe5c72026-07-23 auto-save: 2026-07-23T22:23:53 (3 files) — data/markets.json data/news.json data/ticker.json -
0f83c9422026-07-23 auto-save: 2026-07-23T21:53:45 (3 files) — data/markets.json data/news.json data/ticker.json -
bb87d61c2026-07-23 auto-save: 2026-07-23T21:23:39 (3 files) — data/markets.json data/news.json data/ticker.json -
8d63dd882026-07-23 auto-save: 2026-07-23T20:53:32 (3 files) — data/markets.json data/news.json data/ticker.json -
905ee1e82026-07-23 auto-save: 2026-07-23T20:23:25 (3 files) — data/markets.json data/news.json data/ticker.json -
be01700f2026-07-23 auto-save: 2026-07-23T19:53:19 (3 files) — data/markets.json data/news.json data/ticker.json -
2618c9702026-07-23 auto-save: 2026-07-23T19:23:13 (3 files) — data/markets.json data/news.json data/ticker.json -
35ee65ed2026-07-23 auto-save: 2026-07-23T18:53:06 (3 files) — data/markets.json data/news.json data/ticker.json -
a0ad97ec2026-07-23 sector: Sector Deep-Dives (/sector) — per-property-type page (Multifamily/Office/Industrial/Retail) with sector KPIs, % market share, top deals, keyword-matched news, and cross-links to Watchlist/Compare/Search; deep-linkable ?type= -
cbaea83a2026-07-23 fix(deals): correct city mis-assignment — shared parse-location.mjs prefers in-text asset cues over firm-HQ names (killed false 'Phoenix'), infers state for known cities; re-derived deals.json (23 fixed); repairs /pulse geography (Other $853M->$49M), /metros, /deals; future pulls use the fixed parser -
d3cb47ff2026-07-23 metros: Deal Flow by Metro (/metros) — metros ranked by volume/count with bars + sector-led tags, click-to-expand deals, deep-linkable (?open/?sort); city trusted only if it appears in the deal text, else 'Location unconfirmed' bucket (surfaces upstream pull-deals city mis-tag bug) -
592d2d9e2026-07-23 brief: The RENTV Brief (/brief) — shareable, print-ready CRE digest composing news+deals+pulse; masthead+date, snapshot strip, top story, headlines, biggest deals, print/share/subscribe; internal links only -
f73bbee32026-07-23 auto-save: 2026-07-23T16:52:38 (3 files) — data/markets.json data/news.json data/ticker.json -
7c7b84122026-07-23 compare: Deal Comparison (/compare) — side-by-side price/$per-unit/$per-SF/occupancy/vintage for up to 4 tracked deals, best-in-row highlight, shareable ?ids= link, compact scrollable picker -
5a5569542026-07-23 directory: searchable CRE Directory (/directory) over live firms (34.7k) + brokers (382k) — tabbed, debounced search, load-more pagination, deep-linkable, info-cards (no outbound links) -
82f30a9a2026-07-23 auto-save: 2026-07-23T16:22:30 (3 files) — data/markets.json data/news.json data/ticker.json -
04e9cb852026-07-23 watchlist: personalized Deal Watchlist (/watchlist) — pin property/txn/market, private localStorage + shareable URL params, matching deals, internal-only links -
b236f4872026-07-23 tools: CRE Toolkit (/tools) — cap rate, price per unit/SF, loan sizing (LTV vs DSCR) calculators, client-side + private -
24a3fedc2026-07-23 pulse: CRE Market Pulse dashboard (/pulse + /api/pulse) — KPIs, sector/txn/state bar charts, largest deals; hardened feature-video tool (free-port + verified health) -
f8414c0d2026-07-23 auto-save: 2026-07-23T15:52:21 (4 files) — public/index.html server.js public/pulse.html tools/specs/pulse.json -
80231abd2026-07-23 tools: reusable $0 local feature-video generator (Chrome shots + say TTS + ffmpeg) + search explainer spec -
4a4b2d182026-07-23 search: global site search across news, deals, videos, REview & LA firms (/search + /api/search, internal-only result links) -
2035105c2026-07-23 auto-save: 2026-07-23T15:22:12 (3 files) — data/markets.json data/news.json data/ticker.json -
bd4766562026-07-23 gitignore the access-users ledger -
89aa3b5b2026-07-23 auth: add Scott viewer login -
9e4b651a2026-07-23 auth: set Boomer password to rentfree911 -
987e4e2a2026-07-23 chore: v0.7.0 — section-filter feature (session close) -
b41691e22026-07-23 auth: add Daniel viewer login -
f934418a2026-07-23 Localize all rentv.com photos + drop link-outs (serve everything locally) -
214915362026-07-23 index: honor ?cat= so each hamburger section shows its own filtered feed -
65b2eece2026-07-23 auto-save: 2026-07-23T13:51:43 (3 files) — data/markets.json data/news.json data/ticker.json -
40316ce52026-07-23 audience/CRM: unify newsletter + sublease-broker contacts into /audience with auto-derived segments, contact profiles, and segment performance -
29ad92942026-07-23 auto-save: 2026-07-23T13:21:35 (3 files) — data/markets.json data/news.json data/ticker.json -
93db07442026-07-23 auto-save: 2026-07-23T12:51:13 (3 files) — data/markets.json data/news.json data/ticker.json -
a055ad6a2026-07-23 auto-save: 2026-07-23T12:20:57 (3 files) — data/markets.json data/news.json data/ticker.json -
6b8d34e62026-07-23 auto-save: 2026-07-23T11:50:46 (3 files) — data/markets.json data/news.json data/ticker.json -
10eec56a2026-07-23 auto-save: 2026-07-23T11:20:37 (3 files) — data/markets.json data/news.json data/ticker.json -
ca3e4d7f2026-07-23 auto-save: 2026-07-23T10:50:25 (3 files) — data/markets.json data/news.json data/ticker.json -
8568c2c02026-07-23 auto-save: 2026-07-23T10:20:16 (3 files) — data/markets.json data/news.json data/ticker.json -
30f1e52d2026-07-23 auto-save: 2026-07-23T09:50:03 (3 files) — data/markets.json data/news.json data/ticker.json -
2abd70a72026-07-23 auto-save: 2026-07-23T09:19:52 (3 files) — data/markets.json data/news.json data/ticker.json -
2d8bd5f22026-07-23 auto-save: 2026-07-23T08:49:44 (3 files) — data/markets.json data/news.json data/ticker.json -
73cbb0a02026-07-23 auto-save: 2026-07-23T08:19:35 (3 files) — data/markets.json data/news.json data/ticker.json -
a5236b652026-07-23 auto-save: 2026-07-23T07:49:27 (3 files) — data/markets.json data/news.json data/ticker.json -
00f5f8482026-07-23 auto-save: 2026-07-23T07:19:17 (3 files) — data/markets.json data/news.json data/ticker.json -
250f3ba02026-07-23 auto-save: 2026-07-23T06:49:07 (3 files) — data/markets.json data/news.json data/ticker.json -
b06862e42026-07-23 auto-save: 2026-07-23T06:19:01 (3 files) — data/markets.json data/news.json data/ticker.json -
7cf087542026-07-23 auto-save: 2026-07-23T05:48:54 (3 files) — data/markets.json data/news.json data/ticker.json -
48f599042026-07-23 auto-save: 2026-07-23T05:18:46 (3 files) — data/markets.json data/news.json data/ticker.json -
aab2ffb42026-07-23 auto-save: 2026-07-23T04:48:39 (3 files) — data/markets.json data/news.json data/ticker.json -
5067ca722026-07-23 auto-save: 2026-07-23T04:18:33 (3 files) — data/markets.json data/news.json data/ticker.json -
ee1e120f2026-07-23 auto-save: 2026-07-23T03:48:26 (3 files) — data/markets.json data/news.json data/ticker.json -
e9f6151b2026-07-23 auto-save: 2026-07-23T03:18:19 (3 files) — data/markets.json data/news.json data/ticker.json -
f29026d62026-07-23 auto-save: 2026-07-23T02:48:12 (3 files) — data/markets.json data/news.json data/ticker.json -
27551af72026-07-23 auto-save: 2026-07-23T02:18:05 (3 files) — data/markets.json data/news.json data/ticker.json -
359984142026-07-23 auto-save: 2026-07-23T01:47:57 (3 files) — data/markets.json data/news.json data/ticker.json -
0023b8162026-07-23 auto-save: 2026-07-23T01:17:50 (3 files) — data/markets.json data/news.json data/ticker.json -
0f318ef32026-07-23 auto-save: 2026-07-23T00:47:42 (3 files) — data/markets.json data/news.json data/ticker.json -
2ed260492026-07-23 auto-save: 2026-07-23T00:17:34 (3 files) — data/markets.json data/news.json data/ticker.json -
efd51ee12026-07-22 auto-save: 2026-07-22T23:47:26 (3 files) — data/markets.json data/news.json data/ticker.json -
a3a9a7bb2026-07-22 auto-save: 2026-07-22T23:17:18 (3 files) — data/markets.json data/news.json data/ticker.json -
67651c952026-07-22 auto-save: 2026-07-22T22:47:10 (3 files) — data/markets.json data/news.json data/ticker.json -
84a2cfe52026-07-22 auto-save: 2026-07-22T22:17:02 (3 files) — data/markets.json data/news.json data/ticker.json -
65d7eb772026-07-22 auto-save: 2026-07-22T21:46:55 (4 files) — data/markets.json data/news.json data/ticker.json package-lock.json -
16ef70d02026-07-22 chore: refactor (drop dead decode branch) + v0.6.0 (deals-listings feature, session close) -
49078ccf2026-07-22 Add real CRE deal listings: parse rentv.com transaction stories into structured deal cards (/deals page + /api/deals + pull-deals.mjs) -
4a206b7a2026-07-22 auto-save: 2026-07-22T20:46:37 (3 files) — data/markets.json data/news.json data/ticker.json -
6e2fe1312026-07-22 chore: harden sublease (listing_url XSS guard, DELETE id validation), refactor, v0.5.0 (session close) -
85dbfc622026-07-22 auto-save: 2026-07-22T20:16:30 (3 files) — data/markets.json data/news.json data/ticker.json -
e17a5f0d2026-07-22 desk UX streamline: scope-contextual views (kill dead Map/Command combos), remove redundant Command + fake-geo Map, add live result count -
9e29c2bb2026-07-22 auto-save: 2026-07-22T19:46:22 (3 files) — data/markets.json data/news.json data/ticker.json -
bed96bd72026-07-22 desk: Sublease scope (empty-honest, CRCP actions) + admin-gated entry form + /api/sublease proxy -
50c72c9a2026-07-22 auto-save: 2026-07-22T19:16:13 (4 files) — data/markets.json data/news.json data/ticker.json package-lock.json -
9ece2c0d2026-07-22 chore: v0.4.0 (session close) — homepage, intelligence desk, broker proxy, live search -
4bed42582026-07-22 auto-save: 2026-07-22T18:46:04 (3 files) — data/markets.json data/news.json data/ticker.json -
e6efe8342026-07-22 Link the Broker & Owner Intelligence Desk from the homepage hamburger nav -
eb6fd3d52026-07-22 Desk search now queries the full CA registry live (debounced /api/brokers?q= + /api/firms?q=) instead of filtering the loaded 500 -
a832ec342026-07-22 auto-save: 2026-07-22T18:15:55 (3 files) — data/markets.json data/news.json data/ticker.json -
aaeca1992026-07-22 auto-save: 2026-07-22T17:45:47 (3 files) — data/markets.json data/news.json data/ticker.json -
6f8a70622026-07-22 Wire /desk to the live CA broker registry via /api/brokers + /api/firms proxy (full 382,944 brokers) -
4645759d2026-07-22 Ship RENTV Intelligence Desk live at /desk — left-rail switcher (no tabs), Directory/Map/Analytics/Command over real CA broker data with LinkedIn/DRE/Maps click-outs -
35e4b4422026-07-22 Ship flagship homepage live — no tabs, bottom breaking bar, CRE data strip; robust loader fixes empty-data blanking -
365ef78b2026-07-22 auto-save: 2026-07-22T17:15:39 (3 files) — data/markets.json data/news.json data/ticker.json -
189f602a2026-07-22 auto-save: 2026-07-22T16:45:31 (3 files) — data/markets.json data/news.json data/ticker.json -
f5b9b4002026-07-22 auto-save: 2026-07-22T16:15:24 (3 files) — data/markets.json data/news.json data/ticker.json -
b990c03b2026-07-22 auto-save: 2026-07-22T15:45:17 (3 files) — data/markets.json data/news.json data/ticker.json -
4f8af59d2026-07-22 auto-save: 2026-07-22T15:15:08 (3 files) — data/markets.json data/news.json data/ticker.json -
edd2ccb22026-07-22 auto-save: 2026-07-22T14:44:58 (3 files) — data/markets.json data/news.json data/ticker.json -
874354372026-07-22 Add 10 unique back-office admin layouts (A01-A10) + refined flagship front page (bottom breaking bar, CRE data strip) -
819d5e042026-07-22 auto-save: 2026-07-22T14:14:43 (7 files) — data/markets.json data/news.json data/ticker.json mockups/assets/base.css mockups/admin/ -
5a1f12a02026-07-22 auto-save: 2026-07-22T13:44:34 (3 files) — data/markets.json data/news.json data/ticker.json -
70f6d4b02026-07-22 Add 10 numbered front-end layout concepts (mockups/) — shared hamburger-left/user-right chrome, live data, pick-tray -
f7a39cc62026-07-22 auto-save: 2026-07-22T13:14:23 (3 files) — data/markets.json data/news.json data/ticker.json -
5b318fbb2026-07-22 auto-save: 2026-07-22T12:44:11 (3 files) — data/markets.json data/news.json data/ticker.json -
73af2abf2026-07-22 auto-save: 2026-07-22T12:13:58 (3 files) — data/markets.json data/news.json data/ticker.json -
0af547052026-07-22 Fix RENTV Originals playback on rentv-v1 (contrarian catch): port review.html mp4 <video> branch + closeVideo box-clear + copy 4 mp4 + 4 jpg media. Verified end-to-end: video plays (readyState=4), 0 console errors. Prior 'superset' was data-only — player+media were missing. -
4355473d2026-07-22 Fork consolidation prep: port RENTV Originals feature into rentv-v1 (loss-free superset for gated cutover to canonical) -
84c41d432026-07-22 auto-save: 2026-07-22T11:13:33 (3 files) — data/markets.json data/news.json data/ticker.json -
308ed6542026-07-22 LA Commercial: syndicate usrealestate commercial intel into RENTV -
5767fb312026-07-22 auto-save: 2026-07-22T10:43:19 (3 files) — data/markets.json data/news.json data/ticker.json -
d7c428a92026-07-22 auto-save: 2026-07-22T10:13:11 (3 files) — data/markets.json data/news.json data/ticker.json -
0d1cfef32026-07-22 auto-save: 2026-07-22T09:43:01 (3 files) — data/markets.json data/news.json data/ticker.json -
bf388a642026-07-22 auto-save: 2026-07-22T09:12:53 (3 files) — data/markets.json data/news.json data/ticker.json -
190ef29b2026-07-22 auto-save: 2026-07-22T08:12:31 (3 files) — data/markets.json data/news.json data/ticker.json -
fcb2c4942026-07-22 auto-save: 2026-07-22T07:42:20 (3 files) — data/markets.json data/news.json data/ticker.json -
9d1d88c02026-07-22 auto-save: 2026-07-22T07:12:00 (3 files) — data/markets.json data/news.json data/ticker.json -
c66bd7052026-07-22 auto-save: 2026-07-22T06:41:50 (3 files) — data/markets.json data/news.json data/ticker.json -
de0355622026-07-22 auto-save: 2026-07-22T06:11:42 (3 files) — data/markets.json data/news.json data/ticker.json -
9e96c9d42026-07-22 auto-save: 2026-07-22T05:41:36 (3 files) — data/markets.json data/news.json data/ticker.json -
50316fa12026-07-22 auto-save: 2026-07-22T05:11:29 (3 files) — data/markets.json data/news.json data/ticker.json -
422d2a6e2026-07-22 auto-save: 2026-07-22T04:41:22 (3 files) — data/markets.json data/news.json data/ticker.json -
75b53b952026-07-22 auto-save: 2026-07-22T04:11:16 (3 files) — data/markets.json data/news.json data/ticker.json -
c6c5de9d2026-07-22 auto-save: 2026-07-22T03:41:10 (3 files) — data/markets.json data/news.json data/ticker.json -
7c29ec8a2026-07-22 auto-save: 2026-07-22T03:11:03 (3 files) — data/markets.json data/news.json data/ticker.json -
6df1b1be2026-07-22 auto-save: 2026-07-22T02:40:56 (3 files) — data/markets.json data/news.json data/ticker.json -
35dbff702026-07-22 auto-save: 2026-07-22T02:10:50 (3 files) — data/markets.json data/news.json data/ticker.json -
6d3d91652026-07-22 auto-save: 2026-07-22T01:40:44 (3 files) — data/markets.json data/news.json data/ticker.json -
aaa233282026-07-22 auto-save: 2026-07-22T01:10:37 (3 files) — data/markets.json data/news.json data/ticker.json -
687b25622026-07-22 auto-save: 2026-07-22T00:40:31 (3 files) — data/markets.json data/news.json data/ticker.json -
3edce0972026-07-22 auto-save: 2026-07-22T00:10:24 (3 files) — data/markets.json data/news.json data/ticker.json -
f6db00212026-07-21 auto-save: 2026-07-21T23:40:18 (3 files) — data/markets.json data/news.json data/ticker.json -
00afa8552026-07-21 auto-save: 2026-07-21T23:10:10 (3 files) — data/markets.json data/news.json data/ticker.json -
31afa40a2026-07-21 auto-save: 2026-07-21T22:40:04 (3 files) — data/markets.json data/news.json data/ticker.json -
962ad54e2026-07-21 auto-save: 2026-07-21T22:09:58 (3 files) — data/markets.json data/news.json data/ticker.json -
091a5d762026-07-21 auto-save: 2026-07-21T21:39:52 (3 files) — data/markets.json data/news.json data/ticker.json -
d716bb3f2026-07-21 auto-save: 2026-07-21T21:09:46 (3 files) — data/markets.json data/news.json data/ticker.json -
336ace2b2026-07-21 auto-save: 2026-07-21T20:39:40 (3 files) — data/markets.json data/news.json data/ticker.json -
008ddda82026-07-21 auto-save: 2026-07-21T20:09:34 (3 files) — data/markets.json data/news.json data/ticker.json -
c0ac43622026-07-21 auto-save: 2026-07-21T19:39:27 (3 files) — data/markets.json data/news.json data/ticker.json -
b033fd412026-07-21 auto-save: 2026-07-21T19:09:20 (3 files) — data/markets.json data/news.json data/ticker.json -
a5f4e3162026-07-21 auto-save: 2026-07-21T18:39:12 (3 files) — data/markets.json data/news.json data/ticker.json -
082bfe372026-07-21 auto-save: 2026-07-21T18:09:04 (3 files) — data/markets.json data/news.json data/ticker.json -
7e3d45ef2026-07-21 auto-save: 2026-07-21T17:38:50 (3 files) — data/markets.json data/news.json data/ticker.json -
6bd50ca72026-07-21 auto-save: 2026-07-21T17:08:42 (3 files) — data/markets.json data/news.json data/ticker.json -
adc26a372026-07-21 chore: v0.3.0 (session close — blog CMS, 10 versions/themes/admin, originals merge, nav) -
ff9b76e02026-07-21 rentv-v1 admin: add clean nav (Dashboards/Publish/Blog/Main site) + mobile hamburger to all 10 admin versions -
b28c3f182026-07-21 rentv-v1 versions: add clean nav + mobile hamburger to all 10 version previews (palette-aware, sticky; sections→/?cat=, franchises→routes) -
c5fcc4792026-07-21 rentv-v1: merge RENTV Originals into the homepage feed — published posts lead the wire, badged 'Original', link to /post/:id (category filter + most-read included) -
026bc4ee2026-07-21 rentv-v1: BLOG BACKEND — file-backed original articles (posts API create/edit/delete/publish), admin editor /admin/publish, public reader /post/:id, /blog index; Blog wired into nav; posts.json rsync-excluded so deploys never clobber published articles -
c7117dee2026-07-21 rentv-v1: 10 ADMIN dashboard versions (distinct layouts over real subscriber/feed/video/market data) + /admin picker -
3683dd112026-07-21 rentv-v1: add Versions to index nav (first-occurrence, nav not footer) -
176ceb9a2026-07-21 rentv-v1: wire /versions picker into the main nav (all pages + generator) -
6acf74cd2026-07-21 rentv-v1 versions picker: reset anchor styling (titles white, no underline) -
6b7158a32026-07-21 rentv-v1: 10 full site VERSIONS (distinct homepage layouts on live data) + /versions picker — Wire/Broadsheet/Terminal/Magazine/Digest/Grid/Split/Dashboard/Minimal/Feed for Boomer to pick a direction -
88ae7aa22026-07-21 rentv-v1: 10-theme live switcher (dropdown in util bar, localStorage-persisted) — 10 professional CRE-news themes from graphic-designer incl 3 dark, dark-surface overrides, Google Fonts loaded; Boomer toggles to pick -
6ca6f36c2026-07-21 rentv-v1 polish batch: wordmark 34→42px, mobile hamburger → upper-right, footer Sections → all 8 (from review) -
7444bb1f2026-07-21 rentv-v1 DTD-C: section routes 301→/?cat= filtered home (one consistent 'section=filtered feed' model, no thin pages); home honors ?cat= + activates nav; tighten nav padding to fix Conferences clip -
d11197b52026-07-21 rentv-v1: fix article breadcrumb dead link — only link cat when it's a real section (guards /rentv 404 when feed lookup misses); flagged by ui-ux review -
4587e5482026-07-21 auto-save: 2026-07-21T14:07:54 (3 files) — data/markets.json data/news.json data/ticker.json -
c037f6302026-07-21 refine all: unify chrome site-wide (DTD-A) — canonical util-bar (kill dead Log In + external leaks), 3-col footer, 12-link nav + hamburger on every page, add Markets to nav; fix review video-grid regression (guard dangling #src that nuked the rendered grid) -
e58b96912026-07-21 rentv-v1 deploy: exclude data/subscribers.jsonl from rsync so deploys never clobber prod's accumulated real signups -
255f35382026-07-21 rentv-v1: harden newsletter capture per contrarian — idempotent dedup (hot email Set), MAX_SUBS 50k ceiling, rightmost-XFF ip; honest CRE Talk grid framing (broader REview catalog, not implied interviews-only) -
59bb51bc2026-07-21 rentv-v1: add /cre-talk interview-series page (live REview video grid, guest+sponsor CTAs) wired into nav+footer; real newsletter capture (POST /api/subscribe → append-only JSONL, gated /api/subscribers admin read); wire homepage+subscribe forms; gitignore subscribers.jsonl -
6abac16f2026-07-21 auto-save: 2026-07-21T13:07:37 (3 files) — data/markets.json data/news.json data/ticker.json -
5e58ee5c2026-07-21 rentv.com full-site rebuild: article reader-proxy (live story+photo+body in our shell), /api/markets route, company pages (conferences/advertise/subscribe/about) via build.mjs, wired all dead nav/footer links, OPEN local-preview bypass -
71dae0e32026-07-21 auto-save: 2026-07-21T12:37:29 (3 files) — data/markets.json data/news.json data/ticker.json -
0643da5c2026-07-21 auto-save: 2026-07-21T12:07:22 (3 files) — data/markets.json data/news.json data/ticker.json -
20a689fc2026-07-21 auto-save: 2026-07-21T11:37:17 (3 files) — data/markets.json data/news.json data/ticker.json -
5d302c732026-07-21 auto-save: 2026-07-21T11:07:10 (3 files) — data/markets.json data/news.json data/ticker.json -
b6b3e9da2026-07-21 auto-save: 2026-07-21T10:37:02 (3 files) — data/markets.json data/news.json data/ticker.json -
830859a32026-07-21 auto-save: 2026-07-21T10:06:55 (3 files) — data/markets.json data/news.json data/ticker.json -
cbf1165b2026-07-21 auto-save: 2026-07-21T09:36:49 (3 files) — data/markets.json data/news.json data/ticker.json -
721c60352026-07-21 auto-save: 2026-07-21T09:06:42 (3 files) — data/markets.json data/news.json data/ticker.json -
b3b988ad2026-07-21 auto-save: 2026-07-21T08:36:34 (3 files) — data/markets.json data/news.json data/ticker.json -
30f216072026-07-21 auto-save: 2026-07-21T08:06:27 (3 files) — data/markets.json data/news.json data/ticker.json -
92d295682026-07-21 auto-save: 2026-07-21T07:36:20 (3 files) — data/markets.json data/news.json data/ticker.json -
9cbf6a8f2026-07-21 auto-save: 2026-07-21T07:06:14 (3 files) — data/markets.json data/news.json data/ticker.json -
3338c28e2026-07-21 auto-save: 2026-07-21T06:36:08 (3 files) — data/markets.json data/news.json data/ticker.json -
5d53dc862026-07-21 auto-save: 2026-07-21T06:06:01 (3 files) — data/markets.json data/news.json data/ticker.json -
3d73ee6d2026-07-21 auto-save: 2026-07-21T05:35:54 (3 files) — data/markets.json data/news.json data/ticker.json -
ad44786e2026-07-21 auto-save: 2026-07-21T05:05:47 (3 files) — data/markets.json data/news.json data/ticker.json -
cb6c7ae32026-07-21 auto-save: 2026-07-21T04:35:41 (3 files) — data/markets.json data/news.json data/ticker.json -
bfca50142026-07-21 auto-save: 2026-07-21T04:05:35 (3 files) — data/markets.json data/news.json data/ticker.json -
f337b6672026-07-21 auto-save: 2026-07-21T03:35:30 (3 files) — data/markets.json data/news.json data/ticker.json -
8bb1aa812026-07-21 auto-save: 2026-07-21T03:05:24 (3 files) — data/markets.json data/news.json data/ticker.json -
5aff48c32026-07-21 auto-save: 2026-07-21T02:35:18 (3 files) — data/markets.json data/news.json data/ticker.json -
fb1f7d1f2026-07-21 auto-save: 2026-07-21T02:05:11 (3 files) — data/markets.json data/news.json data/ticker.json -
f45884ae2026-07-21 auto-save: 2026-07-21T01:35:05 (3 files) — data/markets.json data/news.json data/ticker.json -
8cc972e12026-07-21 auto-save: 2026-07-21T01:04:59 (3 files) — data/markets.json data/news.json data/ticker.json -
4ff7a8e82026-07-21 auto-save: 2026-07-21T00:34:53 (3 files) — data/markets.json data/news.json data/ticker.json -
0b666e032026-07-21 auto-save: 2026-07-21T00:04:47 (3 files) — data/markets.json data/news.json data/ticker.json -
3e150cc42026-07-20 auto-save: 2026-07-20T23:34:42 (3 files) — data/markets.json data/news.json data/ticker.json -
f034fdf72026-07-20 auto-save: 2026-07-20T23:04:35 (3 files) — data/markets.json data/news.json data/ticker.json -
abed43d12026-07-20 auto-save: 2026-07-20T22:34:29 (3 files) — data/markets.json data/news.json data/ticker.json -
53abeed82026-07-20 auto-save: 2026-07-20T22:04:23 (3 files) — data/markets.json data/news.json data/ticker.json -
b76f94fc2026-07-20 auto-save: 2026-07-20T21:34:15 (3 files) — data/markets.json data/news.json data/ticker.json -
90c931b32026-07-20 auto-save: 2026-07-20T21:04:08 (3 files) — data/markets.json data/news.json data/ticker.json -
2be705462026-07-20 auto-save: 2026-07-20T20:34:02 (3 files) — data/markets.json data/news.json data/ticker.json -
fea1f5d62026-07-20 auto-save: 2026-07-20T20:03:55 (3 files) — data/markets.json data/news.json data/ticker.json -
1323429b2026-07-20 auto-save: 2026-07-20T19:33:48 (3 files) — data/markets.json data/news.json data/ticker.json -
9e65980f2026-07-20 auto-save: 2026-07-20T19:03:42 (3 files) — data/markets.json data/news.json data/ticker.json -
37c8d9092026-07-20 auto-save: 2026-07-20T18:33:36 (3 files) — data/markets.json data/news.json data/ticker.json -
695aa1d42026-07-20 auto-save: 2026-07-20T18:03:31 (3 files) — data/markets.json data/news.json data/ticker.json -
bc3625fd2026-07-20 auto-save: 2026-07-20T17:33:24 (3 files) — data/markets.json data/news.json data/ticker.json -
9ff4609d2026-07-20 auto-save: 2026-07-20T17:03:17 (3 files) — data/markets.json data/news.json data/ticker.json -
a0db96202026-07-20 auto-save: 2026-07-20T16:33:10 (3 files) — data/markets.json data/news.json data/ticker.json -
cf0c1b0d2026-07-20 auto-save: 2026-07-20T16:03:03 (3 files) — data/markets.json data/news.json data/ticker.json -
53e0efd72026-07-20 auto-save: 2026-07-20T15:32:55 (3 files) — data/markets.json data/news.json data/ticker.json -
2cc0f9ed2026-07-20 auto-save: 2026-07-20T15:02:48 (3 files) — data/markets.json data/news.json data/ticker.json -
e431d2ff2026-07-20 Markets: durable additive components (markets.html + pull-markets.mjs) + parity patch doc -
bda422482026-07-20 parity with rentv-website: real rentv images + full article-body scraping + mobile hamburger nav + centered masthead -
71395b462026-07-20 auto-save: 2026-07-20T14:32:39 (2 files) — data/news.json data/ticker.json -
e8f63f032026-07-20 Live Rates & Markets page (/markets.html): Treasury curve + REIT benchmarks + spreads via Yahoo; /api/markets -
d9ec1da52026-07-20 add in-shell article.html + section.html reader templates; wire homepage to /news/:id; robust title fallback via /api/news -
daf98cbe2026-07-20 rentv-website.agentabrams.com live: app-login-gated, latest news shell deployed -
a2941af42026-07-20 snapshot before rentv-website.agentabrams.com go-live -
978246722026-07-20 auto-save: 2026-07-20T14:02:31 (1 files) — data/news.json -
8a1ce7082026-07-20 auto-save: 2026-07-20T13:32:24 (1 files) — data/news.json -
1b5dff842026-07-20 auto-save: 2026-07-20T13:02:15 (1 files) — data/news.json -
683810fd2026-07-20 auto-save: 2026-07-20T12:32:08 (1 files) — data/news.json -
f94ea1702026-07-20 chore: lint (esc() XSS-guard on homepage feed), v0.1.0 → v0.2.0 (session close) -
f3c510202026-07-20 Fold The REview (rentvreview.com) into rentv-v1 as native video section -
bfda803a2026-07-20 auto-save: 2026-07-20T11:31:52 (1 files) — data/news.json -
a010c3822026-07-20 auto-save: 2026-07-20T11:01:36 (1 files) — data/news.json -
4ac9306b2026-07-20 auto-save: 2026-07-20T10:31:23 (1 files) — data/news.json -
020a53fd2026-07-20 auto-save: 2026-07-20T10:01:15 (1 files) — data/news.json -
8ab035122026-07-20 auto-save: 2026-07-20T09:31:09 (1 files) — data/news.json -
b8b072222026-07-20 auto-save: 2026-07-20T09:00:59 (1 files) — data/news.json -
7eccd83b2026-07-20 auto-save: 2026-07-20T08:30:53 (1 files) — data/news.json -
8e4b45622026-07-20 auto-save: 2026-07-20T08:00:46 (1 files) — data/news.json -
0d9809492026-07-20 auto-save: 2026-07-20T07:30:40 (1 files) — data/news.json -
87a1a4d32026-07-20 auto-save: 2026-07-20T07:00:33 (1 files) — data/news.json -
5606c80a2026-07-20 auto-save: 2026-07-20T06:30:25 (1 files) — data/news.json -
47a7464d2026-07-20 auto-save: 2026-07-20T06:00:16 (1 files) — data/news.json -
0d5093882026-07-20 auto-save: 2026-07-20T05:30:09 (1 files) — data/news.json -
53cee1ca2026-07-20 auto-save: 2026-07-20T04:59:59 (1 files) — data/news.json -
10bc93de2026-07-20 auto-save: 2026-07-20T04:29:52 (1 files) — data/news.json -
a64206c22026-07-20 auto-save: 2026-07-20T03:59:45 (1 files) — data/news.json -
133812ba2026-07-20 auto-save: 2026-07-20T03:29:38 (1 files) — data/news.json -
d18116ae2026-07-20 auto-save: 2026-07-20T02:59:32 (1 files) — data/news.json -
52b0861c2026-07-20 auto-save: 2026-07-20T02:29:25 (1 files) — data/news.json -
91bd400a2026-07-20 auto-save: 2026-07-20T01:59:19 (1 files) — data/news.json -
932251de2026-07-20 auto-save: 2026-07-20T01:29:12 (1 files) — data/news.json -
1d85b04e2026-07-20 auto-save: 2026-07-20T00:59:05 (1 files) — data/news.json -
3e5dd20f2026-07-20 auto-save: 2026-07-20T00:28:58 (1 files) — data/news.json -
a00062bf2026-07-19 auto-save: 2026-07-19T23:58:51 (1 files) — data/news.json -
aab03b3a2026-07-19 auto-save: 2026-07-19T23:28:44 (1 files) — data/news.json -
79f86bf82026-07-19 auto-save: 2026-07-19T22:58:36 (1 files) — data/news.json -
351997392026-07-19 auto-save: 2026-07-19T22:28:29 (1 files) — data/news.json -
0ff2fec52026-07-19 auto-save: 2026-07-19T21:58:21 (1 files) — data/news.json -
87cd09542026-07-19 auto-save: 2026-07-19T21:28:14 (1 files) — data/news.json -
6402a6a42026-07-19 auto-save: 2026-07-19T20:58:07 (1 files) — data/news.json -
3101f8072026-07-19 auto-save: 2026-07-19T20:27:58 (1 files) — data/news.json -
2cd83e6a2026-07-19 auto-save: 2026-07-19T19:57:51 (1 files) — data/news.json -
6f4baa762026-07-19 auto-save: 2026-07-19T19:27:44 (1 files) — data/news.json -
618bf43a2026-07-19 auto-save: 2026-07-19T18:57:38 (1 files) — data/news.json -
54a55d402026-07-19 auto-save: 2026-07-19T18:27:32 (1 files) — data/news.json -
84c396472026-07-19 auto-save: 2026-07-19T17:57:26 (1 files) — data/news.json -
8b662cf22026-07-19 auto-save: 2026-07-19T17:27:20 (1 files) — data/news.json -
7e2f5bac2026-07-19 auto-save: 2026-07-19T16:57:14 (1 files) — data/news.json -
a3bda33e2026-07-19 auto-save: 2026-07-19T16:27:08 (1 files) — data/news.json -
fbd40d842026-07-19 auto-save: 2026-07-19T15:57:02 (1 files) — data/news.json -
a0c55d812026-07-19 auto-save: 2026-07-19T15:26:55 (1 files) — data/news.json -
3db1c0382026-07-19 auto-save: 2026-07-19T14:56:49 (2 files) — data/news.json server.js -
846bfda32026-07-19 auto-save: 2026-07-19T14:26:43 (1 files) — data/news.json -
714ba6ad2026-07-19 auto-save: 2026-07-19T13:56:37 (1 files) — data/news.json -
a7276db02026-07-19 auto-save: 2026-07-19T13:26:30 (1 files) — data/news.json -
d1321d602026-07-19 auto-save: 2026-07-19T12:56:25 (1 files) — data/news.json -
7d6155b02026-07-19 auto-save: 2026-07-19T12:26:19 (1 files) — data/news.json -
9524c19b2026-07-19 auto-save: 2026-07-19T11:56:13 (1 files) — data/news.json -
2023bbaf2026-07-19 auto-save: 2026-07-19T11:26:07 (1 files) — data/news.json -
559f2e202026-07-19 auto-save: 2026-07-19T10:56:01 (1 files) — data/news.json -
78de4e812026-07-19 auto-save: 2026-07-19T10:25:55 (1 files) — data/news.json -
540dd7992026-07-19 auto-save: 2026-07-19T09:55:50 (1 files) — data/news.json -
c7cb7de42026-07-19 auto-save: 2026-07-19T09:25:44 (1 files) — data/news.json -
f0bfec112026-07-19 auto-save: 2026-07-19T08:55:38 (1 files) — data/news.json -
1e494a032026-07-19 auto-save: 2026-07-19T08:25:31 (1 files) — data/news.json -
787711112026-07-19 auto-save: 2026-07-19T07:55:24 (1 files) — data/news.json -
9a60ab812026-07-19 auto-save: 2026-07-19T07:25:16 (1 files) — data/news.json -
40626e852026-07-19 auto-save: 2026-07-19T06:55:10 (1 files) — data/news.json -
4f8aa1342026-07-19 auto-save: 2026-07-19T06:25:04 (1 files) — data/news.json -
8f369d242026-07-19 auto-save: 2026-07-19T05:54:59 (1 files) — data/news.json -
1709a7c92026-07-19 auto-save: 2026-07-19T05:24:52 (1 files) — data/news.json -
295c27b12026-07-19 auto-save: 2026-07-19T04:54:45 (1 files) — data/news.json -
eb4803212026-07-19 auto-save: 2026-07-19T04:24:38 (1 files) — data/news.json -
0de636152026-07-19 auto-save: 2026-07-19T03:54:31 (1 files) — data/news.json -
0a29a3562026-07-19 auto-save: 2026-07-19T03:24:25 (1 files) — data/news.json -
06a030a82026-07-19 auto-save: 2026-07-19T02:54:18 (1 files) — data/news.json -
097350bc2026-07-19 auto-save: 2026-07-19T02:24:11 (1 files) — data/news.json -
8ba903552026-07-19 auto-save: 2026-07-19T01:54:05 (1 files) — data/news.json -
ac7790a62026-07-19 auto-save: 2026-07-19T01:23:59 (1 files) — data/news.json -
4e6364be2026-07-19 auto-save: 2026-07-19T00:53:53 (1 files) — data/news.json -
92ebe3bf2026-07-19 auto-save: 2026-07-19T00:23:46 (1 files) — data/news.json -
13c254a52026-07-18 auto-save: 2026-07-18T23:53:39 (1 files) — data/news.json -
cb55da5a2026-07-18 auto-save: 2026-07-18T23:23:33 (1 files) — data/news.json -
57641b822026-07-18 auto-save: 2026-07-18T22:53:23 (1 files) — data/news.json -
5e5a32522026-07-18 auto-save: 2026-07-18T22:23:17 (1 files) — data/news.json -
b2d7c1122026-07-18 auto-save: 2026-07-18T21:53:10 (1 files) — data/news.json -
ad07ac152026-07-18 auto-save: 2026-07-18T21:23:03 (1 files) — data/news.json -
70d072622026-07-18 auto-save: 2026-07-18T20:52:57 (1 files) — data/news.json -
6aaf46d32026-07-18 auto-save: 2026-07-18T20:22:51 (1 files) — data/news.json -
0e626f392026-07-18 auto-save: 2026-07-18T19:52:44 (1 files) — data/news.json -
001a75702026-07-18 auto-save: 2026-07-18T19:22:39 (1 files) — data/news.json -
d8f13b7c2026-07-18 auto-save: 2026-07-18T18:52:32 (1 files) — data/news.json -
387788972026-07-18 auto-save: 2026-07-18T18:22:25 (1 files) — data/news.json -
a9a958082026-07-18 auto-save: 2026-07-18T17:52:20 (1 files) — data/news.json -
dc87e2f42026-07-18 auto-save: 2026-07-18T17:22:14 (1 files) — data/news.json -
324fb3db2026-07-18 auto-save: 2026-07-18T16:52:08 (1 files) — data/news.json -
4891e2d22026-07-18 auto-save: 2026-07-18T16:22:02 (1 files) — data/news.json -
b26947bf2026-07-18 auto-save: 2026-07-18T15:51:56 (1 files) — data/news.json -
27b9fb3b2026-07-18 auto-save: 2026-07-18T15:21:51 (1 files) — data/news.json -
7a200cc92026-07-18 auto-save: 2026-07-18T14:51:45 (1 files) — data/news.json -
e85107112026-07-18 auto-save: 2026-07-18T14:21:38 (1 files) — data/news.json -
5b2a176c2026-07-18 auto-save: 2026-07-18T13:51:32 (1 files) — data/news.json -
c8fda2342026-07-18 auto-save: 2026-07-18T13:21:27 (1 files) — data/news.json -
dbebee802026-07-18 auto-save: 2026-07-18T12:51:21 (1 files) — data/news.json -
3f8deaff2026-07-18 auto-save: 2026-07-18T12:21:15 (1 files) — data/news.json -
e13eda222026-07-18 auto-save: 2026-07-18T11:51:10 (1 files) — data/news.json -
bf23cb962026-07-18 auto-save: 2026-07-18T11:21:04 (1 files) — data/news.json -
abfdfa362026-07-18 snapshot: news.json -
10e999ac2026-07-18 auto-save: 2026-07-18T10:50:58 (1 files) — data/news.json -
1d782e202026-07-18 auto-save: 2026-07-18T10:20:51 (1 files) — data/news.json -
92205fae2026-07-18 auto-save: 2026-07-18T09:50:45 (1 files) — data/news.json -
73f108dc2026-07-18 auto-save: 2026-07-18T09:20:39 (1 files) — data/news.json -
f3fe00d62026-07-18 auto-save: 2026-07-18T08:50:32 (1 files) — data/news.json -
908a6d232026-07-18 auto-save: 2026-07-18T08:20:26 (1 files) — data/news.json -
ba82f4762026-07-18 auto-save: 2026-07-18T07:50:19 (1 files) — data/news.json -
615918872026-07-18 auto-save: 2026-07-18T07:20:11 (1 files) — data/news.json -
197894222026-07-18 auto-save: 2026-07-18T06:50:05 (1 files) — data/news.json -
bde1e2cc2026-07-18 auto-save: 2026-07-18T06:19:57 (1 files) — data/news.json -
ceaa6a702026-07-18 auto-save: 2026-07-18T05:49:50 (1 files) — data/news.json -
91916f1f2026-07-18 auto-save: 2026-07-18T05:19:43 (1 files) — data/news.json -
26c479ab2026-07-18 auto-save: 2026-07-18T04:49:36 (1 files) — data/news.json -
f830bad52026-07-18 auto-save: 2026-07-18T04:19:30 (1 files) — data/news.json -
a28df3e62026-07-18 auto-save: 2026-07-18T03:49:23 (1 files) — data/news.json -
81d7e40a2026-07-18 auto-save: 2026-07-18T03:19:16 (1 files) — data/news.json -
ed3032262026-07-18 auto-save: 2026-07-18T02:49:10 (1 files) — data/news.json -
261125852026-07-18 auto-save: 2026-07-18T02:19:03 (1 files) — data/news.json -
f490beb52026-07-18 auto-save: 2026-07-18T01:48:57 (1 files) — data/news.json -
c00200942026-07-18 auto-save: 2026-07-18T01:18:50 (1 files) — data/news.json -
3f210bf52026-07-18 auto-save: 2026-07-18T00:48:43 (1 files) — data/news.json -
930d21712026-07-18 auto-save: 2026-07-18T00:18:37 (1 files) — data/news.json -
2d791eff2026-07-17 auto-save: 2026-07-17T23:48:30 (1 files) — data/news.json -
235cc63a2026-07-17 auto-save: 2026-07-17T23:18:22 (1 files) — data/news.json -
b1b2363d2026-07-17 auto-save: 2026-07-17T22:48:14 (1 files) — data/news.json -
2c7efe432026-07-17 auto-save: 2026-07-17T22:18:08 (1 files) — data/news.json -
f7d7b2382026-07-17 auto-save: 2026-07-17T21:48:00 (1 files) — data/news.json -
c9fa183b2026-07-17 auto-save: 2026-07-17T21:17:52 (1 files) — data/news.json -
e8064f682026-07-17 auto-save: 2026-07-17T20:47:45 (1 files) — data/news.json -
6b7891a32026-07-17 auto-save: 2026-07-17T20:17:38 (1 files) — data/news.json -
32e7cd152026-07-17 auto-save: 2026-07-17T19:47:29 (1 files) — data/news.json -
7a069d502026-07-17 auto-save: 2026-07-17T19:17:25 (1 files) — data/news.json -
f52016b92026-07-17 auto-save: 2026-07-17T18:47:21 (1 files) — data/news.json -
ccc8ffc92026-07-17 auto-save: 2026-07-17T18:17:17 (1 files) — data/news.json -
954cc26a2026-07-17 auto-save: 2026-07-17T17:47:14 (1 files) — data/news.json -
b4f866f32026-07-17 auto-save: 2026-07-17T17:17:09 (1 files) — data/news.json -
8f2fd5412026-07-17 auto-save: 2026-07-17T16:47:06 (1 files) — data/news.json -
2abd67622026-07-17 auto-save: 2026-07-17T16:17:02 (1 files) — data/news.json -
c50c83062026-07-17 auto-save: 2026-07-17T15:46:58 (1 files) — data/news.json -
dc01ea952026-07-17 auto-save: 2026-07-17T15:16:54 (1 files) — data/news.json -
bb13a3452026-07-17 auto-save: 2026-07-17T14:46:50 (1 files) — data/news.json -
801932e52026-07-17 auto-save: 2026-07-17T14:16:47 (1 files) — data/news.json -
28e2d15b2026-07-17 auto-save: 2026-07-17T13:46:43 (1 files) — data/news.json -
53de97832026-07-17 auto-save: 2026-07-17T13:16:39 (1 files) — data/news.json -
258432222026-07-17 auto-save: 2026-07-17T12:46:34 (1 files) — data/news.json -
374fcffe2026-07-17 auto-save: 2026-07-17T12:16:30 (1 files) — data/news.json -
a23b73f12026-07-17 rentv-v1: gate behind Basic Auth (admin + Boomer) -
b143d4902026-07-17 rentv-v1: public live-data CRE-news site + 20-min news engine
Authors
- Steve1177
- auto-commit-fleet47
- steve21
- Steve (RENTV 2026)9
Agents used
- secrets-manager2
Skills used
- /news775
- /markets629
- /ticker537
- /deals111
- /deals-registry87
- /search-index-meta78
- /services18
- /social14
- /search13
- /consulting13
- /login10
- /broker10
- /map10
- /pr-intelligence10
- /review9
- /closings9
- /seller9
- /type8
- /topic8
- /people8
- /advertise7
- /subscribe7
- /pulse7
- /jobs7
- /videos7
- /pull7
- /user6
- /index6
- /firm6
- /feed6
Creative ideas + design notes
437aa93c · 2026-08-15 · TK-10569: port /api/advertise + /api/advertise-inquiries from rentv to rentv-2026
Lead-capture endpoint was missing from feature/2026-overhaul-adslots branch. Mirrors original rentv implementation; uses rentv-2026's existing writeThrottle (10/hr per IP) instead of the manual counter pattern.
5a59077e · 2026-08-15 · rentv: per-IP write-form rate limits on /api/subscribe + /api/ad/reserve (TK-10559)
TK-10559 approved 2026-08-14 by rentv-approver triage session. /api/subscribe: writeThrottle(10 req/hr per IP) — prevents JSONL list flooding; existing subSet.size cap still applies for dedup. /api/ad/reserve: adReserveThrottle(5 req/hr per IP) — prioritized (not idempotent; each inquiry appends to ad-reservations.jsonl and marks slot reserved). Both throttle with Retry-After header. No external dep (plain Map + Date.now). Co-Authored-By: 4am-fix-loop <noreply@anthropic.com>
f2bf7551 · 2026-08-15 · rentv: P1+P2+P3 public-launch hardening (TK-10564/10575, Steve-approved 2026-08-14)
P1 (critical): fix INTERNAL_STATIC %2f bypass — test decodeURIComponent(req.path) so
/admin%2f correctly 302→/login like /admin does. Closes live UI-shell info-disclosure.
P2: trust proxy (req.protocol=https, req.ip=real-client behind nginx TLS terminator);
brute-force throttle on POST /api/login (10 bad attempts/15 min → 429 Retry-After);
robots.txt Disallow: /api/ to block bulk API/CSV scraping.
P3: app.disable('x-powered-by'); baseline headers middleware (X-Content-Type-Options,
X-Frame-Options, Referrer-Policy, HSTS on secure connections).
Co-Authored-By: 4am-fix-loop <noreply@anthropic.com>
d5a4141e · 2026-08-15 · pr-intelligence: add CAN-SPAM List-Unsubscribe header + address footer to buildMime (TK-10578)
Before: buildMime emitted only From/To/Subject/MIME headers — no List-Unsubscribe header, no physical address footer injection. Sufficient for 1:1 outreach but non-compliant for bulk/programmatic sends. After: buildMime injects List-Unsubscribe + List-Unsubscribe-Post (RFC 8058 one-click) headers and physical address + opt-out footer into text/HTML bodies when PR_MAILING_ADDRESS / PR_UNSUBSCRIBE_URL env vars are set. Also adds PR_FROM_NAME for "Display Name <addr>" From header formatting. Backwards-compatible: env vars default to '' so 1:1 outreach path is unchanged if not configured. Co-Authored-By: 4am-fix-loop <noreply@anthropic.com>
fc7ec801 · 2026-08-10 · fix(adslots): 5 ad-system.cjs correctness fixes + regression guards (TK-10364)
Graph-engineering hardening of the marquee ad-slots module, each defect reproduced against real data and contrarian-gated before fixing: - summarize() now counts 'reserved' AND an 'other' catch-all, so sold+available+reserved+other === total for ANY status in ad-state.json (an admin board reconciling the header was silently short by soft-held and any legacy/hand-edited status). - originals uid strips the pre-existing 'orig-' prefix (data ids are already orig-brand/orig-deals/…) — was emitting 'orig-orig-brand', so admin overrides keyed by the logical id silently missed. Contained to the ad module; originals.json (read by the main site) is left untouched. - vimeo inventory concat is Array.isArray-guarded — vimeo-library.json ships episodes/clips as numeric COUNTS, not arrays; hardened + forward-compatible. - admin POST /api/ad/admin/video rejects a non-numeric price_monthly instead of persisting NaN (NaN passed the != null overlay test and served a misleading price:null over the heuristic). test/adslots/bugfixes.test.mjs adds regression guards for each. adslots suite 154 pass, full suite 224 pass, 0 fail. No deploy, no prod push. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
f709ec78 · 2026-08-10 · test(adslots): +124 coverage (buildInventory sources/dedup, reserve soft-hold lifecycle, exact price ladder, admin gating) + replace a pricing tautology with live-value asserts
Graph-engineering pass under TK-10364: 6 new zero-dep test files raise the ad-system.cjs adslots suite 23->147 (0 fail). No production code changed. Contrarian(Cody)-gated: fixed a false-confidence tautology in pricing (assert.ok(200<250) -> live suggested_price asserts), pinned the intentional admin-can-unsell vs public-reserve-cannot asymmetry, and clarified the quoted_monthly=0 known-bug guard. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
423cfa3d · 2026-08-08 · test(adslots): cover ad-system admin write paths (video/placement/site-template)
Completes src/ad-system.cjs coverage — admin state mutations (uid/id 400 guards, status-enum validation, Number coercion, persistence to ad-state.json), reservations read (reversed + empty-safe), and the site-template pick (enum guard + persistence + read-back + the 'going live is separately gated' note). No production code changed. Suite 84->93 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
adcaafca · 2026-08-08 · test(adslots): rate-card data contract + rate-card/slot endpoint coverage
Covers the half of src/ad-system.cjs cycle-1 left untested. Real-data contract on data/ad-slots.json (unique ids, required id/name/type, numeric price, valid status enum, created_at present) so a malformed hand-edit is caught in CI, not by an advertiser. Plus fake-Express coverage of /api/ad/rate-card creative merge and /api/ad/slot/:id known-id merge + unknown-id 404. No production code changed. Suite 77->84 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e15f5398 · 2026-08-08 · test(adslots): cover ad-system + fix filtered inventory summary mismatch
/api/ad/inventory summarized a fresh unfiltered buildInventory() instead of the filtered list it returns, so summary.total/by_source/sold/available disagreed with count/items on any ?source= / ?status= request. Summarize the returned list instead (also removes a redundant second inventory scan). Adds test/adslots/inventory.test.mjs: 7 tests via a zero-dep fake-Express harness over temp fixtures — suggestPrice per-source asks + plays bumps + $50 rounding, summarize source/status counts, reserve 400/200 validation, and a regression guard that fails against the old summarize(buildInventory()) call. Suite 70->77 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d71f0c89 · 2026-08-07 · fix(login): resolve /api/login against location.origin so Basic-Auth creds-in-URL access can't taint the fetch base
Page reached via https://user:pass@host/login inherits creds into the document
base URL; relative fetch('/api/login') then resolves to a credentialed URL and
the Fetch spec throws 'Request cannot be constructed from a URL that includes
credentials'. location.origin never carries userinfo. Matches the surgical
single-file hotfix already deployed to prod (/root/public-projects/rentv).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cfd849be · 2026-08-07 · selector: add Classic (original) as 6th option + rank all 6 + why-it-wins + CRE competitor landscape
- Classic = the current live site, now a first-class selectable card (iframe→/, chosen accepts 'classic'). - All 6 ranked (#1 Cinematic … #6 Classic) with a 'Why it wins' pitch + the CRE competitor each out-designs (Bisnow/The REview/The Real Deal/CoStar/Commercial Observer/current). - New 'The field' section: 6 real CRE news-wire/conference rivals (The Real Deal, Bisnow, Commercial Observer, GlobeSt, CoStar, Connect CRE) with links. - Cards sorted by rank; #1 gets a ★ Recommended tag. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
93172711 · 2026-08-07 · TK-10350: verify 5 distinct template variants + wire template D video cards into ad inventory (all 123 videos sponsorable)
- Verified /2026/{a,b,c,d,e}.html all render (HTTP 200, no JS errors — only
cosmetic favicon + prod-only news-thumbnail 404s) and are genuinely distinct
UI/UX directions: A Video Wall (dark, video-forward), B Editorial (serif
news river), C Cinematic (pure-black, red accent), D Magazine (navy serif
front page), E Dashboard (monospace CRE terminal).
- Confirmed all 123 vimeo-library videos are wired as sponsorable ad inventory
via src/ad-system.cjs (/api/ad/inventory: total 154, vimeo 123, 0 missing,
every item drillable via view_url/embed).
- FIX: template D had sponsoredFlag() helper + CSS defined but never called —
its /api/videos-driven cards showed no per-video sponsorship layer that
A/B/C/E have. Added loadSponsorMap() + sponsorForVideo() to merge
/api/ad/inventory sponsorship state onto D's review cards + Video-of-Week
hero. Verified headless: D now renders SPONSORED flags (Kidder Mathews, JLL)
+ Sponsor-this offers.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cf5c27a7 · 2026-08-07 · TK-10105: fix heygen 'Not logged in' auth wiring in buildloop
The heygen CLI authenticates from EITHER ~/.heygen/credentials OR $HEYGEN_API_KEY. Under launchd/sandbox the credentials file can be unreachable and the env var is empty, so any heygen call in a cycle dies with 'Not logged in' / 'no API key found'. Export the valid key (routed by secrets-manager into the heygen skill .env) before invoking claude so auth/list/whoami checks work. Renders stay gated (no spend tool; prompt forces HeyGen renders to a pending-approval memo). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e6e748c4 · 2026-08-07 · rentv 2026: admin front-end template toggle
Floating switcher (public/template-toggle.js) lets a logged-in admin/user flip the live front end between the original site + the 5 concepts (A-E) from the front end. Gating: live front page shows it only for an authed admin/user session (/api/whoami); concept pages (/2026/*, /advertise) always show it (demoable); ?tt=1 forces it on. Marks the chosen site with a ★ (reads site-template.json). Injected into index + all 5 templates + advertise. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
23094df1 · 2026-08-07 · rentv: re-gate site behind un/pw (reverse 2026-08-06 public launch)
Steve 2026-08-07: rentv.agentabrams.com should not be publicly live; ask for un/pw to enter. Reverses the TK-10284 public tier: anonymous visitors are now challenged at the app layer — browser navigations 302 to /login (login.html), assets/APIs get 401 + WWW-Authenticate (browser un/pw popup). Reuses the existing ROLE_CREDS (admin + user tiers) — no new secrets. PUBLIC=1 env restores open mode without a code edit. Verified locally: anon 302/401, valid creds 200, session + bad-creds paths correct. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
089da29b · 2026-08-07 · RENTV 2026: element-numbering overlay (all templates) + demo sold-sponsorship creatives
- public/2026/elements.js: shared drop-in that numbers every significant element
(stable DOM-order N + badge + searchable index panel), toggled by button / 'e' key / ?num=1.
Injected into all 5 templates + selector + advertise + ad-admin so any element is
referenceable as 'Template C · el N' in future feedback.
- public/ad-creatives/{jll-leaderboard,cbre-masthead,mm-rectangle}.svg: demo banner
creatives so the sold-slot creative-serving state is visible on the live templates
(data/ad-state.json seeds 3 sold banners + 3 sold video sponsorships; runtime, gitignored).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
827eb166 · 2026-08-07 · RENTV 2026: 5-template selector + ad-slots-for-sale system (all videos as sponsorable inventory)
- 5 distinct video-forward homepage templates (public/2026/{a..e}.html): Video Wall,
Editorial Lead, Cinematic, Magazine, Dashboard — each self-contained, live data,
sort+density on every grid, ad slots served in-context.
- Selector modal (public/2026/index.html): live iframe previews, full-screen switcher
with device toggle, 'Make this the site' -> data/site-template.json (admin-gated, local pick only).
- Ad-slots system (src/ad-system.cjs, one-line mount in server.js): banner/newsletter/video-surface
rate card (data/ad-slots.json) + ALL 154 RENTV videos pulled into sponsorable inventory live
(youtube+vimeo+originals+news-wire), monthly pricing, availability, reserve-inquiry flow (NO charge),
admin state, reservations queue.
- Rebuilt /advertise into a slots-for-sale marketplace; /ad-admin management surface
(created date+time chips, toggleable columns); /ad-slot.js on-page banner serving.
Local build in isolated worktree; prod deploy stays claude-rentv/Steve gated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0a9bf943 · 2026-08-07 · allstar: 5 firm-inspired themes with distinct UI per theme (toggle + persist)
Each theme is a different layout system, not a recolor — routed the remaining hardcoded colors/gradients/fonts through CSS vars, then per-theme structural overrides (hero arrangement, nav treatment, card shape, radius, light/dark): - Editorial (RENTV/Real Deal, red serif, ruled), Institutional (CBRE/M&M navy full-bleed band, boxed nav), Capital (Blackstone dark luxe, centered serif, gold hairlines), Brokerage (Cushman/JLL emerald, pill nav, soft cards), Summit (modern expo indigo→violet gradient, pill nav). Masthead theme switcher, localStorage-persisted, pre-paint FOUC guard. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
da2aa3f6 · 2026-08-07 · Add All Star Group section to RENTV backend — RENTV-style rebuild, 2026
Rebuilds allstargroup.com the way RENTV works: a self-contained backend page (public/allstar.html) served behind adminOnly at /allstar, with the site's real nav rebuilt as tabs (Home / Events / Income Property Lending), refreshed for 2026 (flagship CRELC — April 29 2026, Westin Long Beach). - Brings in real video: two YouTube embeds of Arnie Garfinkel on the events (oEmbed-verified embeddable). - Highlights Arnie Garfinkel + his full experience (IPL since 1995, Pacific Thrift & Loan, UCCI, Foothill Capital, CAMB/NAMB/CMBA speaker). - Wired all three RENTV touchpoints: adminOnly route, INTERNAL_PAGE (footer), and INTERNAL_STATIC (security gate so /allstar.html can't leak publicly). - Added an All Star Group card to the RENTV Backend hub. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4cf0c4ad · 2026-08-07 · consulting portal: sync refreshed CRCP growth page + daynight readability fix from consulting-rentv-com@55f002c (TK-10299/TK-10319)
Landed by claude-mac2 with Steve's explicit in-session authorization ("HELP DO IT", 2026-08-07).
Single-file scoped commit; triggers the auto-deploy hook to make prod durable (was on an interim rsync).
47c3761d · 2026-08-06 · polish(services): trade chips — specialty trades lead, General buckets trail muted
Cody #3: General Building (~91% of contractors) was swamping the trade-filter row and defeating its purpose. Now the specialty trades (Electrical/Plumbing/HVAC/Roofing/etc.) lead; General Building + General Engineering trail with a muted dashed style. Client-only, $0.
47cb4fdb · 2026-08-06 · feat(services): contractor trade filter (CSLB class) for Construction
Deal teams can filter 25.7k LA contractors by trade — General Building, Electrical (C-10), HVAC (C-20), Plumbing (C-36), Roofing, Concrete, Structural Steel, Fire Protection, Elevator, etc. — via a regex match on the CSLB class inside license_type. New /api/services/trades facet (counts DISTINCT firms so the chip count matches the deduped result), trade param on /api/services + CSV export, client trade-filter chips on Construction (deep-linkable). Cody gate (FIX FIRST) resolved: (1) general-building regex proven to NOT leak B-2 Residential Remodeling — 0 matches against 184 real B-2 rows, documented; (2) facet/filter count gap fixed by counting distinct firms (chip 1955 == result 1955). $0, existing data.
6574a4ff · 2026-08-06 · feat(services): Property Management now registry-backed (162 DRE-licensed PM firms)
SERVICE_CATS.property → role 'Property Manager' (was featured-only); serviceSpecialty surfaces the local-model descriptor; ca_dre_pm → 'CA DRE' source label. Real firms + featured majors, with verified DRE 'Licensed' status + official DRE public-record links.
8e0541c9 · 2026-08-06 · feat(services): CSV export + per-view SEO/JSON-LD + provider detail pages
Three sales/discoverability features: 1. CSV export — /api/services/export.csv streams the current category/metro/filter as a deduped one-row-per-firm prospect list (biggest-first, featured included), admin '⤓ Export CSV' button; Content-Disposition attachment. ~1,088 lender rows/click. 2. SEO — /services now server-injects per-metro/category <title>, meta description, canonical, OG tags, and JSON-LD (CollectionPage + BreadcrumbList + ItemList of featured firms) via a sendPage(transform) hook; /services + 6 category URLs added to sitemap.xml. Crawlable for 'LA commercial title companies' etc. 3. Provider detail pages — /services/:id + /api/services/provider/:id: full profile with the firm's complete branch-license roster (the value-add over the card), humanized specialties, official public-record links, 'Pairs well with' deal-team cross-links, and admin Solicit+note. Card firm names now link to the detail page (honors the all-data-points-href rule). Handles both registry (numeric) and featured (f-*) ids. Verified: export headers+attachment, per-cat <title>/JSON-LD types, detail page renders 37-branch roster + pairs, card names deep-link.
e393d66a · 2026-08-06 · feat(services): DTD-verdict guardrails on the Featured layer (keep-with-guardrails)
Panel voted 8/8 to KEEP the curated Featured layer, conditional on hardening the pay-to-play firewall. Implements the four attached conditions: 1. Disclosure banner above Featured cards: '★ Featured = unpaid editorial selection — no firm has paid for placement …' (public-facing, on every category with featured). 2. Published selection methodology in the banner (prominence + verifiable standing + metro coverage), sourced from services-featured.json selection_criteria. 3. Pay-to-play tripwire: seed 'policy' field + code — a paid slot MUST set paid:true, which renders 'Sponsored' (not '★ Featured'), visually distinct, with rel=sponsored on its link; editorial Featured stays rel=nofollow. Never silently mixed. 4. last_verified date (shown in banner) + verify_cadence_days:90 in the seed for a re-check cadence so a defunct firm is never shown as Featured. Verified: facets returns featured_meta; Title view renders the banner with the date + 'no firm has paid' line; featured rows carry paid:false / source_label 'Featured'.
e8a2e401 · 2026-08-06 · chore(services): localhost-only ?reset=outreach to clear the outreach basket
Dev/preview convenience — clears the rentv.growthLI.v1 localStorage bucket, but only when hostname is 127.0.0.1/localhost, so a shared or bookmarked link can never wipe a real outreach list on the live site. No-op on the production domain.
4c3bc491 · 2026-08-06 · feat(services): per-firm pitch note rides into the /social letter
Admin card gets a dashed 'Note for the pitch' field. On Solicit (single or bulk) the note is stored on the outreach item and — in social.html's letterFor — opens the generated sponsorship letter (capitalized, auto-punctuated) so each pitch is personalized (e.g. 'Met at ICSC Las Vegas — keen on industrial.'). Note is editable: re-soliciting a firm updates its stored note; the note also shows in the outreach rail sub-line. Verified E2E via Playwright: /services note → localStorage → /social letterFor output contains the note.
0250fee3 · 2026-08-06 · feat(services): 'Solicit all visible' bulk action (admin)
Adds a one-click 'Solicit all visible' button (admin-only, in the control bar) that queues every firm currently loaded on screen into the outreach basket at once — deduped, respecting the current category/metro/search/city filter and any Load-More pages already expanded. Refactored the single-Solicit path into a shared addToOutreach() helper; BYID is cleared on each reset so 'visible' means exactly the current view; button shows an 'Added N (M visible)' confirmation.
d3fe7c22 · 2026-08-06 · feat(services): admin-only 'Solicit' → pipes firm into /social outreach generator
Turns the ranked directory into a working lead-gen funnel for RENTV's sales. - services.html: each card gets a ✉ Solicit button (ADMIN-ONLY — /services is public, /social is admin, so the action only renders for logged-in staff via /api/whoami). Solicit appends the firm to the SAME localStorage bucket social.html reads, mapping our category → social's role vocabulary (Contractor→Construction/GCs, Lender→Lenders & Capital Sources, etc.), deduped. A floating ✉ Outreach basket shows the count + opens /social where the sponsorship-pitch letter generator loads. - server.js: /api/whoami honors OPEN=1 local-preview bypass so the admin UI is testable locally (prod has no OPEN → stays session-gated; public sees nothing).
427a4cf2 · 2026-08-06 · feat(services): rank big multi-location firms first (solicitation view) + add Arizona
Reframes /services as a ranked PROSPECT list — the large, multi-branch operators (the firms with ad budgets to solicit) surface first. - server.js: default sort 'Most locations' — normalized-name window count over branch licenses (regexp_replace(lower(name),'[^a-z0-9]+','')) → loc_count + city_count; the locations sort dedupes to one representative card per firm, biggest first; featured majors stay pinned above. Fixed count(DISTINCT) OVER (not allowed in PG) via a GROUP BY stats CTE joined back. - Added ARIZONA market (27,436 contractors + 9,467 developers — RENTV covers AZ). Honest coverage: featured firms now carry 'national' vs 'socal' tokens so nationally-present Title/Property majors (First American, CBRE) appear in AZ but SoCal-only law firms never falsely claim Arizona; AZ correctly shows only Construction/Developers/Title/Property (lenders/escrow/legal hidden — no AZ registry). - services.html: 'Most locations' default sort option, 📍 N-locations badge, Arizona in the metro switcher.
8d4a638e · 2026-08-06 · feat(services): guarantee >=1 vendor per category — curated Featured layer
Every service category now shows at least one vendor in every metro. The public license registries don't cover Title or Property Management and barely cover Legal (3 attorney rows statewide), so those are filled by a curated seed of REAL, verifiable major CRE firms (First American Title, CBRE, Allen Matkins, etc.), clearly badged ★ Featured and pinned above the registry rows — never fabricated data. - data/services-featured.json: curated real firms (Title/Property/Legal + a flagship for each registry category), markets:'all' = serves all SoCal metros. - server.js: Title + Property Management categories (role:null, featured-only); featuredFor() helper; /api/services pins featured on page 1 (skipped when a city filter is active); facets fold featured into per-cat counts so none render empty. - services.html: gold ★ Featured pill + card treatment, featured pinned above rows, meta shows 'N featured', note explains the curation. - build-services-content.mjs + services-content.json: blurbs for Title + Property (local Ollama, $0).
71ec8d49 · 2026-08-06 · fix(auth): bridge server-admin session into /api/pr so deals.html deal-notes work
deals.html is a server-realm page (session/Basic auth), but /api/pr only resolved Basic/service creds — a server-session admin got 401 on deal notes (deals.html deal drawer). Bridge ADMIN server sessions into the PR layer (prAuthCtx then treats them as tenant-1 admin); gate to role==='admin' so front-page user-tier logins still can't reach the internal CRM. authVia='session' keeps the CSRF gate active for mutations; deals.html now loads /csrf.js so its POSTs carry the double-submit token. Verified: server-admin session GET/POST notes 200 (POST 403 without CSRF); user-tier session /api/pr 401 (no leak); pr_session workspace unaffected. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0960554d · 2026-08-06 · consulting portal: remove dead theme-aware CSS (superseded by forced-black bg)
The theme-aware --gold/accent scheme + its html.rentv-night/body.theme-dark override never took effect once the page pinned a permanent black background (daynight doesn't touch the accent vars at all — only the bg needed pinning). Collapse the base :root to the bright values that actually render and drop the dead night-override rule + comment. Visually neutral: final computed accent values unchanged.
55129020 · 2026-08-06 · nav(services): add CRE Services to shared masthead drawer (rentv-nav.js) + homepage nav row
- rentv-nav.js: 'CRE Directory' + 'CRE Services' now in the injected masthead-chrome Explore drawer (benefits any header.mast page without its own drawer). - index.html: the fleet fan-out missed the homepage (emoji byte-mismatch on the 🏢 anchor); added 🛠️ CRE Services beside CRE Directory in the homepage nav row. Fleet coverage now 11/11 drawer-nav pages + shared masthead drawer.
bc6ded37 · 2026-08-06 · feat(services): metro switcher (LA/OC/SD/IE/Ventura) + fleet nav link
- services.html: Metro market <select> (Greater LA · Orange County · San Diego · Inland Empire · Ventura), persisted + deep-linkable (?market=). Hero headline/ kicker/dek/title + category counts + city chips all re-template per market. Zero-count categories (e.g. Legal outside LA) are hidden; empty selected cat falls back to the biggest non-empty one. City drill-links carry the market. - 10 masthead pages (brief/compare/hub/metros/syndicate/sector/topic/topics/ index/region): added 'CRE Services' link beside 'CRE Directory' in the drawer nav.
d72a1293 · 2026-08-06 · consulting portal: make gold + semantic accents theme-aware so text is readable in day mode
daynight.js flips --bg to white by default but never managed --gold, so all gold text (and the red/green/blue SWOT + teardown accents) washed out on white. Pinned --gold/--pos/--neg/--info to deep readable tones at :root (day) with bright tones under html.rentv-night/body.theme-dark (night).
f57a571a · 2026-08-06 · Move Regions + Market Snapshot into the right hamburger (Sections) drawer
Homepage: Market Snapshot markup relocated from left #drawer to right #drawerR; Regions now injected into the right drawer via a data-regions marker + data-regions-anchor (buildDrawerGroup targets [data-regions]). Masthead pages (buildMastNav): Regions clone moved from left to right drawer for parity. aria-labels updated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d7e04f05 · 2026-08-06 · feat(services): /services — Greater LA CRE services directory from real license registries
New public page + API listing licensed LA CRE service providers by category (Construction/GCs 25.7k · Lenders 1.3k · Escrow 499 · Developers 152 · Legal), sourced from the realestate DB (CSLB / DFPI / CA DRE / State Bar public records). - server.js: public /api/services (server-side sort/search/city filter, paginated) + /api/services/facets (counts + top cities + LLM copy) + /services route; CSLB license-code humanizer; empty-string coalescing; source-registry labels. - public/services.html: category chips w/ live counts + blurbs, real server-side Sort (Name/City) + density slider (persisted), city-filter chips, graceful cards (drill: role->tab, city->filter, license->public record, phone->tel:), Brokerage cross-links to /directory (no fabricated data). - scripts/build-services-content.mjs: LOCAL Ollama (qwen2.5, $0) category copy. - directory.html: cross-link to /services.
a8efed7c · 2026-08-06 · PR-intel: soft-delete (Discard) for outreach drafts
The outreach layer was append-only — POST /outreach/draft always inserts a
new row and there was no delete/void path, so regenerating a draft for the
same person left un-removable duplicates (Tim Jemal #3/#6/#7) that inflated
drafts_awaiting_review.
- migration 010: add 'discarded' to pr_outreach_status + a discarded_at
column (soft-delete, nothing sent is ever hard-deleted).
- outreach.discard(): status='discarded' + discarded_at; HARD rule — a row
with sent_at IS NOT NULL can never be discarded (audit trail); only
non-sent drafts (draft_generated/needs_review/provider_draft_created/
approved) are discardable; idempotent.
- outreach.list(): hide discarded rows unless ?status=discarded or
?include_discarded=1. drafts_awaiting_review already excludes them (it
only counts draft_generated/needs_review).
- DELETE /api/pr/outreach/:id (adminOnly) wired to outreach.discard.
- review.html Reply-history panel: a Discard button on each non-sent draft,
wired via PR.api('/outreach/'+id, {method:'DELETE'}); sent messages get no
button.
TK-10297. Migration + discard rules verified against throwaway
rentv_pr_test; full test suite 58/58. Live deploy + prod migration
Steve-gated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
46664637 · 2026-08-06 · PR-intel CA gate: count a verified general_press_email as a contact
The contact_coverage gate only counted an org as "covered" if it had a pr_people row in a comms/leadership role, so orgs reachable via a verified org-level press channel (e.g. Lockton's media@lockton.com) scored as "no PR contact" and held the CA gate under 70%. Extend the with_contact FILTER in settings.stateGate with an OR arm that also counts an org whose general_press_email is present AND backed by a pr_field_evidence row for field_name='general_press_email' — so only verified, evidence-backed press channels count, never an inferred or hand-typed address (mirrors the org_completeness has_evidence gate and the no_mislabeled_inferred rule). The stricter comms_only sub-metric is left untouched and still reported. Mirror the same definition in organizations.list's no_pr_contact filter and the dashboard's orgs_without_pr_contact count so all three agree. TK-10297. Verified against throwaway rentv_pr_test: an evidence-backed press-email org counts; an inferred one and a bare org do not. Live deploy Steve-gated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
30df559d · 2026-08-06 · PR CRM notes: attach to deals too (string entity_id) + deals.html wiring
- migration 009: widen pr_notes.entity_id bigint→text so notes attach to string-keyed entities (deal ids like 'md<ts>'/feed slugs), not just numeric org/person ids — keeps the widget truly generic - notes.js: entity_id treated as text; activity-timeline row only recorded for numeric ids (pr_activities.entity_id is bigint) - routes: pass entity_id through as text (no Number() coercion) - deals.html: load pr-shared.js, add a Notes section to the edit modal shown when editing a persisted deal; mount PR.notes(el,'deal',id) - verified: deal string-id add/list 200 + org numeric-id regression 200 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ce079996 · 2026-08-06 · nav: surface /market-pulse (charts) in map hamburger + site-wide Explore drawer
Post public-launch (TK-10284) the charts dashboard had no visible nav link. /market-pulse + /markets are public (200); /deals + /pulse stay admin-gated. TK-10296
6b792cc9 · 2026-08-06 · PR CRM: user-authored notes on any entity (org/broker/person/property/deal)
- migration 008: pr_notes table (tenant_id, entity_type, entity_id, body, author, pinned, created/updated) + RLS tenant policy + pr_app grants - notes service: list/add/update/pin/remove, author-stamped, records a note_added activity into the entity timeline; RLS scopes reads, insert sets tenant_id to satisfy WITH CHECK - 5 routes under /api/pr/notes (read for GET, write for mutations), mounted AFTER the router gate so db.tenantMiddleware binds them (RLS auto-scoped) - reusable PR.notes() widget in pr-shared.js (compose+list, pin/edit/delete, RBAC-aware via memoized /auth/me) wired into the person + org drawers - verified: RLS isolation (tenant 2 sees 0 of tenant 1's notes) + RBAC (read-only user 403) end-to-end over HTTP Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2837beed · 2026-08-06 · Split nav into TWO hamburgers: upper-left (Explore+Regions) + upper-right (Sections+Tools)
Steve: 'Split hamburger between upper right and left.' Both the map's own build AND the sitewide masthead build now render two hamburgers flanking a centered logo: • LEFT drawer (slides from left): Explore pages + Regions • RIGHT drawer (slides from right): Sections (+ the map's filters/legend/Near me/Reset on /map) Region/Section links split from the hidden strip (.rt-geo → left, .rt-cat → right). Verified markets/blog/map: 2 hamburgers, logo centered, correct split, 0 errors. TK-10284 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ba9f632d · 2026-08-06 · logo: make it genuinely LIQUID — animated specular sweep + flowing tint + frosted glass
Steve feedback: shipped logo read as a static glossy pill, 'no liquid'. Added real motion: - rentv-flow: slow flowing gradient tint (9s loop) - rentv-sweep: a specular light band glides across the capsule (5.5s loop) — the liquid signal - backdrop-filter frost + glass meniscus highlight; respects prefers-reduced-motion Centering preserved (a.brand.rentv-logo re-asserted; transform not animated). Verified via 3-frame + 12-frame GIF render. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9d3b82a9 · 2026-08-06 · Sitewide nav: collapse all tab strips into a hamburger + center the logo
Steve: 'all tabs on every page need hamburger for a cleaner look. Center logo on topline.' - rentv-nav.js: retire the horizontal region/section strip everywhere (kept hidden as the drawer data source). Masthead pages (blog/markets/article/review/about) now get an injected left hamburger + drawer (Explore + Regions/Sections) and their OWN horizontal nav bar is hidden; header.top pages keep their native burger+drawer. Wordmark centered on the top line across masthead pages (secondary edition/date text dropped so it truly centers). - map.html: center the wordmark on its top line too; mark its drawer data-own-nav so the sitewide nav doesn't double up. Verified across mast + top pages: one hamburger each, no horizontal nav, logo centered, 0 errors. TK-10284 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ea0ef6cd · 2026-08-06 · PR intel (b2 complete): tenant isolation via Postgres RLS
- migration 007: ENABLE + FORCE RLS + tenant policy on all 17 entity tables (NULLIF-guarded so an unset GUC = full system access, never a cast error). Auth tables excluded (login is pre-tenant). - db.js: AsyncLocalStorage — tenantMiddleware checks out one connection per web request, SET app.tenant_id, and every query auto-scopes to the caller's tenant. Worker/CLI run unscoped = full cross-tenant. - index.js: PR router mounts db.tenantMiddleware after the capability gate. - app connects as non-superuser pr_app (superusers bypass RLS); PR_DATABASE_URL. - retired the PR_MULTI_TENANT_READY guard — isolation is DB-enforced. - PROVEN end-to-end: a tenant-2 user sees ONLY tenant-2 data via HTTP; tenant-1 sees 0 tenant-2 rows; unset (worker) sees all.
0044e5f8 · 2026-08-06 · News map: collapse ALL controls into one LEFT hamburger; strip the busy top bar
Steve: 'do not show tabs across screen.. busy.. horrible. put into its own collapsed hamburger on left.' Removed the wide filter/tab row entirely; the top is now just a slim wordmark + story count. One hamburger (upper-LEFT) opens a left drawer holding the legend, all map filters (Show/Type/Years/Near me/Reset), and all nav (Explore + Regions/Sections). Map now starts at ~64px (was 310). Near me / Reset auto-close the drawer. TK-10284 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5c689bb6 · 2026-08-06 · News map: collapse nav into a hamburger + log all articles in sitemap
- Map chrome was eating 310px (393 on mobile) before the map. Hide the injected region/section tab strip and move ALL nav into a hamburger drawer (upper-right); collapse the filter controls to one compact scrollable row; hide util bar + legend on mobile. Map now starts at ~150px desktop / ~138px mobile. - sitemap.xml: log EVERY RENTV article (full corpus, ~4,466) individually, not just the 30 recent — deduped corpus + live-feed. TK-10284 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
108b7392 · 2026-08-06 · PR intel (b2 partial): scope outreach reads by tenant + completion checklist
Scoped outreach.list + route by tenant_id (joins the org/people lists already scoped). Added MULTITENANT_TODO.md: the exact remaining reads to scope (campaigns/tasks/sources/relationships/suppression/runs/letters/dashboard/ export) + an RLS alternative + the verification gate. The PR_MULTI_TENANT_READY guard stays until that pass is complete + verified, so no false isolation ships.
File tree
- .deploy.conf
- .gitignore
- DEPLOY-HANDOFF-toggle.md
- MARKETS-PATCH.md
- admin-versions.mjs
- admin/desk-admin.html
- admin/forsale.html
- assets/voice/boomer-vo-2026-07-31.m4a
- assets/voice/boomer-vo-2026-07-31.normalized.mp3
- build.mjs
- data/ad-slots.json
- data/closings-overrides.json
- data/consulting/ads.json
- data/consulting/audit-video/__pycache__/compose.cpython-314.pyc
- data/consulting/audit-video/capture.mjs
- data/consulting/audit-video/chips/00.png
- data/consulting/audit-video/chips/01.png
- data/consulting/audit-video/chips/02.png
- data/consulting/audit-video/chips/03.png
- data/consulting/audit-video/chips/04.png
- data/consulting/audit-video/chips/05.png
- data/consulting/audit-video/chips/06.png
- data/consulting/audit-video/chips/07.png
- data/consulting/audit-video/chips/08.png
- data/consulting/audit-video/chips/09.png
- data/consulting/audit-video/chips/10.png
- data/consulting/audit-video/chips/11.png
- data/consulting/audit-video/chips/12.png
- data/consulting/audit-video/chips/13.png
- data/consulting/audit-video/chips/14.png
- data/consulting/audit-video/chips/15.png
- data/consulting/audit-video/clean_final.mp4
- data/consulting/audit-video/compose.py
- data/consulting/audit-video/compose_noavatar.py
- data/consulting/audit-video/concat.txt
- data/consulting/audit-video/concat_clean.txt
- data/consulting/audit-video/final.mp4
- data/consulting/audit-video/main_clean.mp4
- data/consulting/audit-video/maptest.mjs
- data/consulting/audit-video/narration.json
- data/consulting/audit-video/narration.wav
- data/consulting/audit-video/outro.mp4
- data/consulting/audit-video/outro.png
- data/consulting/audit-video/rec/portal-walk.webm
- data/consulting/audit-video/shots/01-summary.png
- data/consulting/audit-video/shots/02-swot.png
- data/consulting/audit-video/shots/03-reputation.png
- data/consulting/audit-video/shots/04-empire.png
- data/consulting/audit-video/shots/05-competitors.png
- data/consulting/audit-video/shots/06-advertising.png
- data/consulting/audit-video/shots/07-timing.png
- data/consulting/audit-video/shots/08-audit.png
- data/consulting/audit-video/shots/09-teardown.png
- data/consulting/audit-video/shots/10-social.png
- data/consulting/audit-video/shots/11-suggested.png
- data/consulting/audit-video/shots/12-partners.png
- data/consulting/audit-video/shots/13-revenue.png
- data/consulting/audit-video/shots/14-videos.png
- data/consulting/audit-video/shots/15-dealdesk.png
- data/consulting/audit-video/shots/16-roadmap.png
- data/consulting/audit-video/steve-narration.mp4
- data/consulting/audit-video/timing.json
- data/consulting/audit-video/title.mp4
- data/consulting/audit-video/title.png
- data/consulting/audit-video/va-prompt.txt
- data/consulting/audit-video/verify/f_dealdesk.png
- data/consulting/audit-video/verify/f_empire.png
- data/consulting/audit-video/verify/maptest.png
- data/consulting/audit-video/verify/maptest2.png
- data/consulting/audit-video/verify/t_audit.png
- data/consulting/audit-video/verify/t_dealdesk.png
- data/consulting/audit-video/verify/t_outro.png
- data/consulting/audit-video/verify/t_title.png
- data/consulting/audit-video/words.json
- data/consulting/best-times.json
- data/consulting/client.json
- data/consulting/competitors.json
- data/consulting/content-calendar.json
- data/consulting/crm.json
- data/consulting/deals-sample.json
- data/consulting/directories.json
- data/consulting/enrichment.json
- data/consulting/intakes.json
- data/consulting/media.json
- data/consulting/socials.json
- data/consulting/suggestions.json
- data/deals-overrides.json
- data/deals-registry.json
- data/deals.json
- data/forsale.json
- data/geo-cache.json
- data/hubs.json
- data/la-commercial.json
- data/markets.json
- data/news-archive.json
- data/news-posting-playbook.json
- data/news-posting-playbook.md
- data/news-sources.json
- data/news.json
- data/originals.json
- data/pull.err
- data/regions.json
- data/search-index-meta.json
- data/search-index.jsonl
- data/services-content.json
- data/services-featured.json
- data/social-drafts.json
- data/ticker.json
- data/videos-pinned.json
- data/videos.json
- data/vimeo-library.json
- deploy.sh
- deploy/com.steve.re-search-index.plist
- deploy/com.steve.rentv-vimeo-refresh.plist
- deploy/rentv-regate.patch
- docs/CRE_PR_ADMIN_GUIDE.md
- docs/CRE_PR_COMPLIANCE.md
- docs/CRE_PR_DATA_SOURCES.md
- docs/CRE_PR_EMAIL_SETUP.md
- docs/CRE_PR_INTELLIGENCE_PLAN.md
- docs/CRE_PR_RESEARCH_OPERATIONS.md
- docs/FORSALE-OUTREACH.md
- docs/FORSALE-SCENARIOS.md
- docs/YOLOFOREVER-LEDGER.md
- docs/heygen-brandfilm-scripts.DRAFT.md
- docs/pr-intelligence-gate-and-discard-brief.md
- docs/tk-10350-evidence/tpl-a-videowall.png
- docs/tk-10350-evidence/tpl-c-cinematic.png
- docs/tk-10350-evidence/tpl-d-magazine-sponsored.png
- docs/tk-10350-evidence/tpl-e-dashboard.png
- mockups/L01.html
- mockups/L02.html
- mockups/L03.html
- mockups/L04.html
- mockups/L05.html
- mockups/L06.html
- mockups/L07.html
- mockups/L08.html
- mockups/L09.html
- mockups/L10.html
- mockups/admin/A01.html
- mockups/admin/A02.html
- mockups/admin/A03.html
- mockups/admin/A04.html
- mockups/admin/A05.html
- mockups/admin/A06.html
- mockups/admin/A07.html
- mockups/admin/A08.html
- mockups/admin/A09.html
- mockups/admin/A10.html
- mockups/admin/admin-core.js
- mockups/admin/admin.css
- mockups/admin/data/brokers.json
- mockups/admin/data/firms.json
- mockups/admin/data/la-commercial.json
- mockups/admin/data/news.json
- mockups/admin/data/ticker.json
- mockups/admin/data/videos.json
- mockups/admin/index.html
- mockups/assets/base.css
- mockups/assets/chrome.js
- mockups/data/la-commercial.json
- mockups/data/news.json
- mockups/data/ticker.json
- mockups/data/videos.json
- mockups/index.html
- mockups/rentv.html
- mockups/video/build-admin-video.js
- mockups/video/build-frontend-video.js
- mockups/video/build-rentv-video.js
- mockups/video/out/audio/ad-1.mp3
- mockups/video/out/audio/ad-intro.mp3
- mockups/video/out/audio/api-la.mp3
- mockups/video/out/audio/api-news.mp3
- mockups/video/out/audio/api-ticker.mp3
- mockups/video/out/audio/api-videos.mp3
- mockups/video/out/audio/arch.mp3
- mockups/video/out/audio/fe-intro.mp3
- mockups/video/out/audio/fe-outro.mp3
- mockups/video/out/audio/outro.mp3
- mockups/video/out/audio/s00.mp3
- mockups/video/out/audio/s1.mp3
- mockups/video/out/audio/s10.mp3
- mockups/video/out/audio/s11.mp3
- mockups/video/out/audio/s12.mp3
- mockups/video/out/audio/s2.mp3
- mockups/video/out/audio/s3.mp3
- mockups/video/out/audio/s4.mp3
- mockups/video/out/audio/s5.mp3
- mockups/video/out/audio/s6.mp3
- mockups/video/out/audio/s7.mp3
- mockups/video/out/audio/s8.mp3
- mockups/video/out/audio/s9.mp3
- mockups/video/out/concat-fe.txt
- mockups/video/out/concat.txt
- mockups/video/out/rentv-build-walkthrough.mp4
- mockups/video/out/rentv-frontend-walkthrough.mp4
- mockups/video/out/shots/L01-picks.png
- mockups/video/out/shots/L01-x.png
- mockups/video/out/shots/L02-ham.png
- mockups/video/out/shots/L02-x.png
- mockups/video/out/shots/L03-x.png
- mockups/video/out/shots/L04-x.png
- mockups/video/out/shots/L05-x.png
- mockups/video/out/shots/L06-x.png
- mockups/video/out/shots/L07-x.png
- mockups/video/out/shots/L08-x.png
- mockups/video/out/shots/L09-x.png
- mockups/video/out/shots/L10-x.png
- mockups/video/out/shots/ad-1.png
- mockups/video/out/slides/ad-1.mp4
- mockups/video/out/slides/ad-1.png
- mockups/video/out/slides/ad-intro.mp4
- mockups/video/out/slides/ad-intro.png
- mockups/video/out/slides/api-la.mp4
- mockups/video/out/slides/api-la.png
- mockups/video/out/slides/api-news.mp4
- mockups/video/out/slides/api-news.png
- mockups/video/out/slides/api-ticker.mp4
- mockups/video/out/slides/api-ticker.png
- mockups/video/out/slides/api-videos.mp4
- mockups/video/out/slides/api-videos.png
- mockups/video/out/slides/arch.mp4
- mockups/video/out/slides/arch.png
- mockups/video/out/slides/fe-intro.mp4
- mockups/video/out/slides/fe-intro.png
- mockups/video/out/slides/fe-outro.mp4
- mockups/video/out/slides/fe-outro.png
- mockups/video/out/slides/outro.mp4
- mockups/video/out/slides/outro.png
- mockups/video/out/slides/s00.mp4
- mockups/video/out/slides/s00.png
- mockups/video/out/slides/s01.png
- mockups/video/out/slides/s02.png
- mockups/video/out/slides/s03.png
- mockups/video/out/slides/s04.png
- mockups/video/out/slides/s05.png
- mockups/video/out/slides/s06.png
- mockups/video/out/slides/s07.png
- mockups/video/out/slides/s08.png
- mockups/video/out/slides/s09.png
- mockups/video/out/slides/s1.mp4
- mockups/video/out/slides/s10.mp4
- mockups/video/out/slides/s10.png
- mockups/video/out/slides/s11.mp4
- mockups/video/out/slides/s11.png
- mockups/video/out/slides/s12.mp4
- mockups/video/out/slides/s12.png
- mockups/video/out/slides/s2.mp4
- mockups/video/out/slides/s3.mp4
- mockups/video/out/slides/s4.mp4
- mockups/video/out/slides/s5.mp4
- mockups/video/out/slides/s6.mp4
- mockups/video/out/slides/s7.mp4
- mockups/video/out/slides/s8.mp4
- mockups/video/out/slides/s9.mp4
- ops/buildloop-cycle.sh
- ops/com.steve.rentv-buildloop.plist
- package-lock.json
- package.json
- public/2026/a.html
- public/2026/b.html
- public/2026/c.html
- public/2026/d.html
- public/2026/e.html
- public/2026/elements.js
- public/2026/index.html
- public/about.html
- public/ad-admin.html
- public/ad-creatives/cbre-masthead.svg
- public/ad-creatives/jll-leaderboard.svg
- public/ad-creatives/mm-rectangle.svg
- public/ad-slot.js
- public/admin/analytics.html
- public/admin/cards.html
- public/admin/classic.html
- public/admin/command.html
- public/admin/console.html
- public/admin/index.html
- public/admin/kanban.html
- public/admin/minimal.html
- public/admin/pr-intelligence/campaigns.html
- public/admin/pr-intelligence/content-drafts.html
- public/admin/pr-intelligence/content-studio.html
- public/admin/pr-intelligence/credentials.html
- public/admin/pr-intelligence/deal-desk.html
- public/admin/pr-intelligence/inbox.html
- public/admin/pr-intelligence/index.html
- public/admin/pr-intelligence/letters.html
- public/admin/pr-intelligence/linkedin-posting.html
- public/admin/pr-intelligence/linkedin.html
- public/admin/pr-intelligence/login.html
- public/admin/pr-intelligence/organizations.html
- public/admin/pr-intelligence/people.html
- public/admin/pr-intelligence/pr-shared.css
- public/admin/pr-intelligence/pr-shared.js
- public/admin/pr-intelligence/research.html
- public/admin/pr-intelligence/review.html
- public/admin/pr-intelligence/runs.html
- public/admin/pr-intelligence/settings.html
- public/admin/pr-intelligence/sources.html
- public/admin/pr-intelligence/tasks.html
- public/admin/publish.html
- public/admin/render.js
- public/admin/sidebar.html
- public/admin/split.html
- public/admin/table.html
- public/advertise.html
- public/allstar.html
- public/article.html
- public/audience.html
- public/backend.html
- public/blog.html
- public/brief.html
- public/closings.html
- public/compare.html
- public/conferences.html
- public/consulting/admin/index.html
- public/consulting/admin/lhf.js
- public/consulting/audit/advertise.png
- public/consulting/audit/archive.png
- public/consulting/audit/contact.png
- public/consulting/audit/index.png
- public/consulting/audit/jobworks.png
- public/consulting/audit/newsletter.png
- public/consulting/audit/providers.png
- public/consulting/audit/store.png
- public/consulting/audit/subscribe.png
- public/consulting/audit/subscriber.png
- public/consulting/deal-score.js
- public/consulting/intake.html
- public/consulting/portal.html
- public/consulting/signin.html
- public/consulting/slideshow.html
- public/consulting/versions/broadsheet.html
- public/consulting/versions/dispatch.html
- public/consulting/versions/marketplace.html
- public/consulting/versions/modern.html
- public/consulting/versions/observer.html
- public/consulting/versions/terminal.html
- public/consulting/versions/thewire.html
- public/consulting/videos/heygen-brandfilm.mp4
- public/cre-talk.html
- public/daynight.js
- public/deals-log.html
- public/deals.html
- public/desk-assets/admin-core.js
- public/desk-assets/boomer-headshot.jpg
- public/desk-assets/boomer-hero.jpg
- public/desk-assets/data/brokers.json
- public/desk-assets/data/firms.json
- public/desk-assets/data/la-commercial.json
- public/desk-assets/role-icons.js
- public/desk.html
- public/directory.html
- public/drill.js
- public/favicon.ico
- public/favicon.svg
- public/firm.html
- public/hub.html
- public/img/map-og.jpg
- public/img/news/.gitkeep
- public/img/vimeo/1012976399.jpg
- public/img/vimeo/101654810.jpg
- public/img/vimeo/1039101858.jpg
- public/img/vimeo/1056513923.jpg
- public/img/vimeo/1059913595.jpg
- public/img/vimeo/107204372.jpg
- public/img/vimeo/107762220.jpg
- public/img/vimeo/1079649123.jpg
- public/img/vimeo/1083187666.jpg
- public/img/vimeo/1083187746.jpg
- public/img/vimeo/1083187814.jpg
- public/img/vimeo/1083188249.jpg
- public/img/vimeo/1083190047.jpg
- public/img/vimeo/109994315.jpg
- public/img/vimeo/1106281388.jpg
- public/img/vimeo/1115700624.jpg
- public/img/vimeo/1138312637.jpg
- public/img/vimeo/1158999653.jpg
- public/img/vimeo/1178561985.jpg
- public/img/vimeo/117977696.jpg
- public/img/vimeo/1199114985.jpg
- public/img/vimeo/1200839794.jpg
- public/img/vimeo/125349744.jpg
- public/img/vimeo/135939853.jpg
- public/img/vimeo/142347178.jpg
- public/img/vimeo/142347291.jpg
- public/img/vimeo/142347515.jpg
- public/img/vimeo/142348009.jpg
- public/img/vimeo/142348532.jpg
- public/img/vimeo/142348827.jpg
- public/img/vimeo/142350083.jpg
- public/img/vimeo/142351726.jpg
- public/img/vimeo/142353259.jpg
- public/img/vimeo/143827823.jpg
- public/img/vimeo/144943180.jpg
- public/img/vimeo/149786738.jpg
- public/img/vimeo/157877482.jpg
- public/img/vimeo/157877500.jpg
- public/img/vimeo/157877501.jpg
- public/img/vimeo/157877502.jpg
- public/img/vimeo/157877503.jpg
- public/img/vimeo/157877504.jpg
- public/img/vimeo/162573796.jpg
- public/img/vimeo/162573927.jpg
- public/img/vimeo/162574294.jpg
- public/img/vimeo/162574320.jpg
- public/img/vimeo/162574338.jpg
- public/img/vimeo/162574358.jpg
- public/img/vimeo/162712456.jpg
- public/img/vimeo/162712493.jpg
- public/img/vimeo/162712517.jpg
- public/img/vimeo/167990145.jpg
- public/img/vimeo/167990176.jpg
- public/img/vimeo/167990218.jpg
- public/img/vimeo/167990238.jpg
- public/img/vimeo/167990250.jpg
- public/img/vimeo/167990282.jpg
- public/img/vimeo/171347069.jpg
- public/img/vimeo/172014042.jpg
- public/img/vimeo/172014125.jpg
- public/img/vimeo/172014837.jpg
- public/img/vimeo/188261706.jpg
- public/img/vimeo/188271441.jpg
- public/img/vimeo/208460446.jpg
- public/img/vimeo/227217030.jpg
- public/img/vimeo/227224358.jpg
- public/img/vimeo/228295912.jpg
- public/img/vimeo/232088787.jpg
- public/img/vimeo/242491490.jpg
- public/img/vimeo/308597317.jpg
- public/img/vimeo/31239971.jpg
- public/img/vimeo/315327378.jpg
- public/img/vimeo/316709134.jpg
- public/img/vimeo/32191299.jpg
- public/img/vimeo/33583429.jpg
- public/img/vimeo/35868287.jpg
- public/img/vimeo/38894517.jpg
- public/img/vimeo/39610422.jpg
- public/img/vimeo/42140576.jpg
- public/img/vimeo/429079440.jpg
- public/img/vimeo/434219208.jpg
- public/img/vimeo/44468806.jpg
- public/img/vimeo/46769758.jpg
- public/img/vimeo/48347303.jpg
- public/img/vimeo/493420423.jpg
- public/img/vimeo/503234116.jpg
- public/img/vimeo/50591120.jpg
- public/img/vimeo/507211620.jpg
- public/img/vimeo/52820750.jpg
- public/img/vimeo/55380262.jpg
- public/img/vimeo/565693580.jpg
- public/img/vimeo/56573116.jpg
- public/img/vimeo/65258106.jpg
- public/img/vimeo/69208165.jpg
- public/img/vimeo/71974003.jpg
- public/img/vimeo/721184140.jpg
- public/img/vimeo/739081927.jpg
- public/img/vimeo/763442741.jpg
- public/img/vimeo/763447786.jpg
- public/img/vimeo/77077219.jpg
- public/img/vimeo/771348410.jpg
- public/img/vimeo/795355693.jpg
- public/img/vimeo/811518445.jpg
- public/img/vimeo/812981342.jpg
- public/img/vimeo/812982818.jpg
- public/img/vimeo/82824854.jpg
- public/img/vimeo/830276773.jpg
- public/img/vimeo/830279080.jpg
- public/img/vimeo/831673533.jpg
- public/img/vimeo/85237519.jpg
- public/img/vimeo/852462696.jpg
- public/img/vimeo/862593366.jpg
- public/img/vimeo/865035925.jpg
- public/img/vimeo/868849453.jpg
- public/img/vimeo/886025667.jpg
- public/img/vimeo/906276616.jpg
- public/img/vimeo/90807750.jpg
- public/img/vimeo/911412212.jpg
- public/img/vimeo/931863337.jpg
- public/img/vimeo/95064851.jpg
- public/img/vimeo/953281926.jpg
- public/img/vimeo/978657040.jpg
- public/img/vimeo/989909369.jpg
- public/index.html
- public/la-commercial.html
- public/login.html
- public/map.html
- public/market-pulse.html
- public/markets.html
- public/media/originals/brand.jpg
- public/media/originals/brand.mp4
- public/media/originals/daily.jpg
- public/media/originals/daily.mp4
- public/media/originals/deals.jpg
- public/media/originals/deals.mp4
- public/media/originals/review.jpg
- public/media/originals/review.mp4
- public/metros.html