Behind the site

How this site keeps itself current

Two inputs drive every status on the Homes page: the MLS and the DHB Properties sheet. This page documents the design so it can be built on real hosting without re-deciding anything.

One record per house

Every home is one row with a status field, and the website is a view of that row. Changing the status moves the home between tabs; nothing is retyped.

StatusShows underSet by
Under constructionComing Soon, with est. completionDHB Properties sheet (field schedule)
Off marketOff Market (price shown, call for access)DHB Properties sheet
Active listingFor Sale, with MLS photos and descriptionMLS intake (MLS # emailed or entered)
PendingUnder Contract (greyed card)MLS status change, confirmed by sheet
ClosedSold (address, plan, sq ft, closing month)MLS status change, confirmed by sheet

MLS intake

  1. You send the MLS number to listings@dhbllc.net (subject or body), or type it in the admin form below. Address works too; MLS # is unambiguous.
  2. A worker looks the listing up in NTREIS through the brokerage's RESO Web API or IDX feed (Master Key Realty's data-access agreement), and pulls price, description, photos, beds/baths/sq ft and status.
  3. It writes the house record and re-publishes data/listings.json. The card appears under For Sale within minutes.
  4. Status changes follow automatically. The worker re-checks every active MLS # daily; Active → Pending → Closed moves the card to Under Contract, then Sold.
  5. The DHB Properties sheet is the checkpoint. If the sheet and the MLS disagree (sheet says off-market, MLS says active), the site shows the sheet's status and flags the conflict to you by email.
Why not scrape Zillow? Zillow's terms prohibit automated pulls and the page layout changes without notice; a feed breaks silently. NTREIS data through the brokerage is the reliable route, and Realtor.com/Homes.com public pages are the fallback for photos if a feed isn't available yet.

Add or update a home by MLS # (demo)

DHB Properties sheet

The Properties page is generated from the Google Sheet with tools/sheet_to_json.py. On real hosting this runs on a schedule (hourly) or on a webhook when the sheet changes. Keep editing the sheet exactly as today; the site follows.

Homeowner Portal

Each buyer's spec sheet is encrypted with a key derived from address + buyer name + initial offer date (PBKDF2, 200,000 rounds, AES-256-GCM) and published as a file. The site never holds a readable copy, so the page works on plain static hosting.

Adding a home takes two commands on the Specifications Schedule PDF you already produce: tools/spec_from_pdf.py turns the PDF into structured data (item, specification, color/finish, brand·source with SKU/serial, property details, material-matching note, disclaimer), then tools/make_spec.py encrypts it with the buyer's three details. In production this is one upload form in the admin area. Demo sign-in: address 5805 Barkridge Dr, buyer Demo Buyer, offer date 11/01/2026.

Moving to GoDaddy hosting

The site is plain HTML, CSS, JS and JSON. Upload the folder to the GoDaddy Web Hosting plan and point dhbllc.net at it; nothing else changes. The MLS worker and the sheet sync are small scheduled scripts that can run on the same hosting (PHP/cron) or on a free tier of any job runner, writing the JSON files into the site folder.

Demo build · Nov 2026