尚未检测到更新。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.