尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Map and search of Oklahoma businesses with estimated revenue and EBITDA, derived from public SBA PPP loan data.
etl/ Python pipeline: download PPP data → estimate → geocode → load into Postgres
db/ Postgres schema (works on Supabase)
web/ Next.js app: map + list explorer, business pages, JSON API, claim/removal form
loan ÷ 2.5 × 12, and payroll ÷ the industry payroll-to-revenue ratio gives a second revenue figure. More than 2× disagreement marks the estimate low confidence; businesses with no reported jobs use this method instead.The ranges and margins are set in etl/build.py and etl/benchmarks.py. The built-in sector ratios are rounded approximations. benchmarks.py --fetch replaces them with exact Census figures; run.sh does this automatically.
Option A — GitHub Actions (no local setup). Push this repo to GitHub and add the repository secret DATABASE_URL (the session pooler string). Then go to Actions → Load PPP data → Run workflow with state OK.
Option B — your machine:
python3 -m venv .venv && .venv/bin/pip install -r etl/requirements.txt
DATABASE_URL="postgresql://..." PYTHON=.venv/bin/python ./etl/run.sh OK --addresses
Drop --addresses for a quick run that uses ZIP centroids only. Street-level geocoding uses the free Census batch geocoder (10k addresses per request) and can take an hour or more.
If data.sba.gov is slow, download the CSVs from https://data.sba.gov/dataset/ppp-foia yourself and run python etl/download_ppp.py --state OK --local <dir>, followed by the remaining steps from run.sh.
web.DATABASE_URL (the transaction pooler string).Local dev: cd web && npm install && echo 'DATABASE_URL=...' > .env.local && npm run dev
The map uses free OpenFreeMap tiles. To change the look, set NEXT_PUBLIC_MAP_STYLE to another MapLibre style URL.
| Endpoint | Description |
|---|---|
GET /api/businesses | q, sector, city, min_rev, max_rev, bbox=w,s,e,n, sort (revenue_desc | revenue_asc | ebitda_desc | jobs_desc | name), limit (≤200), offset |
GET /api/businesses/:id | Business details, PPP loans and the benchmark used |
GET /api/points | GeoJSON for the map (same filters, top 5,000 by revenue) |
POST /api/claims | {business_id, contact_name, contact_email, reported_revenue?, reported_ebitda?, message?, request_removal?} |
DATABASE_URL=... PYTHON=.venv/bin/python etl/tests/smoke.sh runs the full ETL offline on fake fixture rows.
claims table regularly, and honor removal requests by deleting the business.