Full-stack real estate investing operations platform built around DataSift.ai.
Two things live in this repo:
- The REI skill library. 24 Claude skills that teach Claude to run a specific REI workflow: comp a property, estimate a rehab, find the heirs, score your phone numbers, grade your cold calls. Install them into Claude Code with one command, or upload them to a Claude Co-Work session. You do not need the platform to use these.
- The platform. The pipeline that pulls county distress data, enriches it through 10 steps, and pushes it into DataSift ready for sequential marketing. Requires a DataSift.ai account.
Start with the skills. Most people never need anything else.
# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/DataSift-Ty-Personal/SiftStack/main/install.py | python3 -
# Windows PowerShell
irm https://raw.githubusercontent.com/DataSift-Ty-Personal/SiftStack/main/install.py | python -That downloads all 22 current skills (24 packages counting the 2 plugins) into ~/.claude/skills/ and the 2 plugins into ~/.claude/plugins/. Restart Claude Code and they are live. No clone, no pip install, no virtualenv. Python 3.9 or newer, standard library only.
Prefer to read the script before running it? That is the right instinct:
curl -fsSL -o install.py https://raw.githubusercontent.com/DataSift-Ty-Personal/SiftStack/main/install.py
less install.py
python3 install.pypython3 install.py --list # the catalog, with descriptions
python3 install.py --only rehab-estimator comp-package # just these
python3 install.py --category "Deal Analysis" # a whole category
python3 install.py --dest .claude/skills # into a project, not your home dir
python3 install.py --dry-run # report, write nothingRe-running is safe. Anything already current is skipped, and a package is only swapped in after it downloads and unpacks cleanly, so a failed update cannot leave you with a half-written skill.
Co-Work takes the packaged file rather than a folder. Download the .skill you want from dist/ and upload it to your session or Project:
https://raw.githubusercontent.com/DataSift-Ty-Personal/SiftStack/main/dist/rehab-estimator.skill
Every package in the catalog below is at that same path with its own name. .plugin files work the same way.
If you are already in a Claude Code session, this is usually the fastest route:
Read https://raw.githubusercontent.com/DataSift-Ty-Personal/SiftStack/main/skills/manifest.json and install the Deal Analysis skills for me.
The manifest is the machine-readable index of the whole library: every package, its category, its description, its download URL, and a SHA-256 of the exact bytes. It is what install.py reads, and it is regenerated by CI on every push so it cannot drift from what is actually published.
24 current packages. python3 install.py --list prints this with full descriptions.
| Package | What it does |
|---|---|
comp-package |
Boundary-filtered comps for one property. Pulls sold and active listings live, buckets each comp by condition, and produces a dual-track ARV that prices the same-bedroom base case separately from a labeled reconfiguration upside. Ships an Excel workbook. |
rehab-estimator |
Room-by-room rehab costs across 4 tiers, with the locked Knox County master material list for exact SKU pricing. |
deep-prospecting-v5 |
Given a deceased owner, find the heirs and exactly who must sign to sell. SmartSkip relatives plus mandatory obituary research, about $0.24 per record. |
probate-property-finder |
Find the real property behind a probate filing when all you have is a case number and a decedent name. |
real-estate-comping |
The valuation method on its own: Two-Bucket ARV, adjustment tables, and disclosure vs non-disclosure state routing. |
deal-analyzer (plugin) |
Comps plus rehab plus MAO plus financing in one pass, with exit strategy comparison. |
| Package | What it does |
|---|---|
sift-market-research |
Zip code scoring off DataSift Market Finder, 6 weighted factors, delivered as a 7-sheet Excel report. |
first-market-county-data |
Where to actually pull county distress lists for any US county, across all 7 notice types, including the FOIA templates. |
buyer-prospector |
Build a cash buyer list for any county, categorize the LLCs and trusts, and resolve the humans behind them. |
| Package | What it does |
|---|---|
phone-validator |
Trestle scoring with 5 dial-priority tiers and a litigator risk check. |
text-touch-builder |
A four-touch pre-call SMS sequence per record, varied like cold email so no two reads as a form letter. Refuses any message that sounds machine-written. |
sequential-presets |
Design and build the sequential marketing filter presets in DataSift. |
caller-reputation-monitor |
Keep your outbound numbers out of carrier "Spam Likely" labels. |
playbook-creator |
Turn a transcript or a recording into a real SOP with process maps. |
candidate-intake |
Aggregate job applicants from Indeed, Gmail, and Facebook into one scored master list. |
team-hiring |
Who to hire next and what they own. The five roles with their daily tasks and one North Star KPI each, hiring geography and pay bands, job post templates, the interview, and the first two weeks. |
vendor-directory-builder |
Build a vetted contractor or vendor directory for any market: mine a local community for names people vouch for, verify every one against public records, sweep for geography and gaps, and ship a filterable Excel with top picks. Also the tool for vetting a found or AI-generated list. |
contractor-call-sheet |
Turn a finished directory into action: a printable one-page call sheet of the top picks by trade, personalized first-contact texts and voicemails, and the vetting-call question script. |
| Package | What it does |
|---|---|
cold-call-coach |
Pull your real call recordings, transcribe them with tonality notes, and grade every conversation against the cold-calling rubric. |
lead-manager-coach |
Same engine, graded on qualification: the 4 pillars, roadblocks, next-action discipline. |
closer-coach |
Same engine, graded on the money conversation, the offer stack, and commitment locking. |
kpi-engine |
Dials, connect rates, correct numbers, leads, and funnel pacing straight from your own DataSift account. |
| Package | What it does |
|---|---|
sift-sequences |
26 sequence templates and how to build them. |
sift-operations (plugin) |
The CRM operations encyclopedia: SiftLine boards, drip campaigns, tasks, filters, tags, skip trace workflows. |
Two superseded packages (deep-prospecting, deep-prospecting-v4) stay in the repo so old runs still resolve. The installer skips them unless you ask for one by name. Use deep-prospecting-v5, which is about 5x cheaper and returns relatives on records where v4 returned nothing.
Eleven of the 24 work the moment they are installed. No key, no login, no card. Ask the library where you stand:
python3 install.py --doctorIt reads your environment and a .env if you have one, then prints what works now, what needs you signed in somewhere, and what needs a credential. Every blocked skill prints its no-API alternative on the same line, so you are never told no without being told what to do instead. It sends no requests, spends nothing, and never prints a credential value.
| Tier | Count | What it means |
|---|---|---|
| No credentials | 11 | Works on install |
| A login you already have | 8 | DataSift, SmrtPhone, Google. Browser-driven, no API access needed |
| A metered API key | 5 | Faster and deeper, and every one has a free route |
Every paid step has a no-API route. Comping runs by browser, heir research runs off obituaries and free people-search, KPIs run off a CSV export, coaching runs off any dialer's recordings. The no-API playbook has the method for each, and is honest about the three things that have no substitute.
Skills degrade rather than fail: a missing key means that step is skipped and the run says so.
| Guide | |
|---|---|
| Getting started | Install, check readiness, add credentials, first runs |
| No-API playbook | The free route for every paid step |
| API contracts | What each API actually does, and the traps that cost real time |
.env.skills.example |
Every variable, what it unlocks, what it costs |
The platform is 76 agents across 9 divisions.
- The interactive map, searchable and filterable by division, status, and whether a human still signs off.
- docs/AGENT-MAP.md, the same thing as a document you can read in the repo or hand to Claude.
Both render from docs/agents.json, so they cannot disagree about what the system does.
Each agent carries a trigger, the steps it runs, where a person signs off, what comes out, and the trap it exists to avoid. That last field is the one worth reading: every one is a real production failure, and most of them failed silently for days or weeks before anyone noticed.
Web scrape (gated site) ──┐
Scanned PDF (OCR) ──┤
Courthouse photos ──┼──► Enrichment ──► DataSift ──► Sequential
Dropbox auto-poll ──┤ (10 steps) (API) marketing
CSV re-import ──┘
│
▼
Deal analysis ──► Dispo ──► Lender package
Divisions: Data Acquisition, Enrichment and Identity, Deal Analysis, Dispo and Buyers, Outreach and Marketing, CRM Operations, Market Intelligence, Coaching and Performance.
Every gated action routes to a human. Outreach identity is anchored to the assigned person rather than a company name, and no agent sends a dollar figure to a seller or a buyer without a person approving it.
Requires a DataSift.ai account. Works with any market, any county, any state.
git clone https://github.com/DataSift-Ty-Personal/SiftStack.git
cd SiftStack
pip install -r requirements.txt
playwright install chromium
cp .env.example .env # then fill in your keys
python src/main.py daily # new notices since last run
python src/main.py daily --upload-datasift # scrape, enrich, upload
python src/main.py daily --counties Knox --types foreclosure,probate| Method | How it works | Use case |
|---|---|---|
| Web scrape | Playwright plus a Cloudflare Turnstile solver | Public notice sites, county clerk portals |
| PDF import | pypdfium2 rendering plus Tesseract OCR | Scanned tax sale lists, legal documents |
| Photo import | OpenCV preprocessing, OCR, LLM parse | Phone photos of courthouse terminal screens |
| Dropbox watch | Polls a folder every 15 minutes | A runner uploads from the field, the system processes |
| CSV re-import | Re-enrich existing records | Refresh stale data, merge datasets |
All five produce the same records and flow through the same enrichment pipeline.
Deduplicate, filter vacant land, flag entity owners, resolve probate property, tax delinquency, address standardization (Smarty), property data (Zillow), obituary and heir research, skip trace (Tracerfy), phone scoring (Trestle).
Every API is optional. A missing key skips that step and the run reports it.
The county pull runs unattended on Fly.io rather than on a workstation. deploy/FTM_RUNBOOK.md is the runbook.
python src/ftm_runner.py --doctor # credentials, egress, state, saved searches
python src/ftm_runner.py --max-notices 2 # bounded dry run, writes nothing
python src/ftm_runner.py --commit # the real thing
python src/ftm_schedule.py --next # next 5 fire timesThe scrape is gated on egress IP, not on code. From an office IP the notice page carries no CAPTCHA at all, just a refusal to serve. From a datacenter IP it serves the normal challenge. A blocked run exits 3 rather than 1, because no retry fixes it and treating it as a normal failure sends you debugging the parser. Run --doctor before anything else.
Zero notices is a failure, not a quiet day. There is deliberately no inference that a missing challenge means a cleared gate. That exact reasoning reported 13 consecutive dead runs as successful over 19 days.
# Comps, ARV, rehab, buyers, into one workbook
python src/comp_package.py --address "158 Old State Rd" --zip 37914 \
--beds 2 --baths 1 --sqft 1946 --bbox "35.996,36.016,-83.895,-83.840"
# The hour after you walk a house: 9 sheets, anchored to the live CRM record
python src/post_walkthrough.py --walkthrough-template
python src/post_walkthrough.py --address "..." --walkthrough walk.json
# The 8-piece private lender package
python src/lender_package.py --spec deals/EXAMPLE_lender_spec.json
python src/lender_docs.py --spec deals/EXAMPLE_lender_spec.jsondeals/EXAMPLE_lender_spec.json is a scrubbed, working spec. Copy it and fill it in.
Every variable is documented in .env.example. The ones that matter most:
| Variable | Service | Cost |
|---|---|---|
DATASIFT_EMAIL / DATASIFT_PASSWORD |
DataSift.ai | Account required |
CAPTCHA_API_KEY |
2Captcha | about $3 per 1,000 solves |
SMARTY_AUTH_ID / SMARTY_AUTH_TOKEN |
Smarty | 250 free/month |
OPENWEBNINJA_API_KEY |
OpenWeb Ninja | 100 free/month |
ANTHROPIC_API_KEY |
Anthropic | about $0.001 per record |
TRACERFY_API_KEY |
Tracerfy | $0.02 per record |
TRESTLE_API_KEY |
Trestle | $0.015 per phone |
SLACK_WEBHOOK_URL |
Slack or Discord | Free |
Running one county daily costs roughly $40 per month in API spend.
The architecture is market-agnostic. Knox and Blount County, TN are what it is proven on.
- Edit
SAVED_SEARCHESinsrc/config.pyfor your county's notice site. - Add your county's tax API alongside Knox in
src/tax_enricher.py. - The parser handles 7 notice types already: foreclosure, tax sale, tax delinquent, probate, eviction, code violation, divorce.
- Photo import and the enrichment pipeline are county-independent and work nationwide.
The source of truth is the folder, not the ZIP. skills/<name>/ is what you edit and what gets reviewed; dist/<name>.skill is a build product.
# edit skills/rehab-estimator/SKILL.md, then
python tools/build_skills.py --build --manifest
python tools/build_skills.py --verify # CI runs thisCI blocks a merge if a distributed archive drifts from its source, if the manifest is stale, if any SKILL.md is missing its name or description frontmatter, or if anything that looks like a credential appears in a package.
That frontmatter check exists because a skill with no frontmatter is silently undiscoverable. Claude has nothing to match a request against, so it simply never fires and no error is ever raised. One skill shipped that way for months.
- Fork, branch, commit.
- Run
python tools/build_skills.py --build --manifestbefore you push. - Open a pull request.
MIT. See LICENSE.
Built by DataSift.ai for the REI community.