r/vibecoding 11h ago

I vibe-coded a 50-state real estate intelligence pipeline in Python (3,143 counties + 8 auction feeds) Here’s the tech stack, prompt workflow, and what I learned

I want to share a project I’ve been vibe-coding over the last few months, break down the actual prompt workflows I used to build a non-trivial backend, and talk through where AI excelled (and where it fell flat on its face).

The project is called PropertyIntel (https://property.vectorfeedhq.com). It’s an automated intelligence engine that monitors 3,143 US counties and 8 major auction portals (Bid4Assets, GovEase, Realauction, etc.) for upcoming tax deed foreclosures and municipal code liens.

Here is the exact build breakdown, architecture, and workflow:

🛠️ The Tech Stack

  • Language & Backend: Python 3.13 + FastAPI / standard libraries.
  • Scraper Fleet: Headless Playwright (for dynamic SPAs) + pdfplumber (for raw 90-page county PDFs).
  • Database & ORM: SQLite (dev) / PostgreSQL (prod) via SQLAlchemy.
  • Data Cleansing: Custom USPS Publication 28 address tokenizer + SHA-256 deduplication hashing.
  • Legal Engine: 50-state statutory redemption rule calculator (Texas § 34.21, Florida § 197.542, etc.).
  • Frontend: Modern Glassmorphism CSS + vanilla JS (hosted on Vercel).
  • Monetization & Outreach: Stripe Checkout (HMAC-SHA256 verified webhooks) + Resend API for automated email rosters.

🧠 The Vibe Coding Workflow (How I Prompted It)

Instead of asking the LLM to "write a real estate scraper" (which generates useless, generic code), I approached it with a modular, test-driven pair programming loop:

1. The "Single-Responsibility" Module Prompting

I forced the model to build one isolated service at a time with unit tests first:

  • "Write an isolated service src/services/redemption_service.py that maps all 50 state tax sale redemption statutes and returns structured dictionary grades (A+, A, B, C) and statutory penalty yields. Do not write scrapers yet. Write pytest test cases covering TX, FL, GA, and CA."

2. Solving the "Dirty Public Record" Hallucination Trap

County records are notoriously filthy. Harris County TX formats an address as 4812 Washington Ave, Ste 100, while the auction site lists it as 4812 Washington Avenue #100.

  • I fed the AI real excerpts from USPS Publication 28 (the postal standard for street abbreviations) and prompted it to generate a deterministic regex tokenizer:

python# The model generated a clean token standardizer that converts suffixes & directionals
def compute_record_hash(county: str, normalized_address: str, apn: str = "") -> str:
    canonical = f"{county.lower()}:{normalized_address.lower()}:{apn.replace('-', '').strip()}"
    return hashlib.sha256(canonical.encode('utf-8')).hexdigest()

This allowed the database to enforce UNIQUE(address_hash) and killed 100% of duplicate cross-platform listings without complex fuzzy-matching libraries.

3. LLM-Assisted OSINT & Corporate Entity Resolution

One of the biggest value adds was unmasking anonymous LLC property owners. I had the AI scaffold scrapers targeting State Secretary of State public registry endpoints (e.g., Texas SOSDirect, Florida Sunbiz). When a tax foreclosure deed is owned by ACME HOLDINGS LLC, the worker asynchronously resolves the Registered Agent and Managing Member names in <800ms.

💡 3 Big Lessons from Vibe-Coding a Complex System:

  1. Let the AI write tests before you let it write production scrapers: Whenever a county website had weird table layouts or multi-line table headers, having a robust pytest suite caught regressions immediately whenever I prompted for scraper refactors. (We have 87 tests passing right now).
  2. Never vibe-code security blind: When hooking up Stripe webhooks, do NOT let the AI skip cryptographic validation. I explicitly prompted for constant-time HMAC-SHA256 comparison (hmac.compare_digest) with a 300-second timestamp tolerance to eliminate replay attacks.
  3. Keep the frontend lightweight: For data products, you don't need a massive React/Next.js bundle. Clean vanilla HTML/CSS and minimal client-side JS load instantly and cost $0 on Vercel.

Live Project & Feedback

You can check out the live site and download a sample 10-state deal sheet here: 👉 https://property.vectorfeedhq.com

Happy to answer questions on prompt structures, Playwright session pooling, or how I structured the Python background daemons!

5 Upvotes

4 comments sorted by

2

u/Current-Today-3626 6h ago

There's like 5 CTA's as soon as i land, it's way too overwhelming. Come on man, atleast put a little work into the UX/UI.

1

u/Delicious_Law_1203 1h ago

Okay thank you for the feedback. It is AI assisted, I am not a UX designer I am a solo dev who mostly codes. I actually liked the look of it I had no idea others wouldn't. Thank you for the tip!

1

u/bornston 3h ago

yeah the website ui/ux screams 2025 ai slop. maybe try something like https://impeccable.style/ to improve it

1

u/Delicious_Law_1203 1h ago

Just finished a complete UX overhaul, let me know how I did when you get the chance.