Apartments.com and Zillow show you photos and reviews. 4philly shows you the truth: open code violations, whether the rental license is active, and 311 complaints on any Philadelphia address. Apartmen
翻譯準備中
生活風格HTML · JavaScriptGitHub @thumpersecure上線中營運者未確認
試用過了嗎? 點一下就好,不需要登入。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證🦜 4philly.net - Know before you sign! Look up tool for Philadelphia property records — Easily checks licenses, violations, and 311 complaints — pulled live from the city’s own data. Eclipse and Carto are cross-checked side by side… into one APP you can trust. Free, open-source, made by tenants.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Open the app · Report a bug · Coverage gaps
One unified Philadelphia property record. Type any address or OPA number — get business licenses, open violations, violation history, 311 complaints, permits, building certifications, and your City Council district with councilmember contact info, all pulled live from the city's own data.
Every data point is pulled from Eclipse (the authoritative L&I backend behind li.phila.gov) and Carto (the historical open-data mirror at phl.carto.com). When they disagree, 4PHILLY flags it. Eclipse always wins.
[!NOTE] 4PHILLY runs entirely in your browser. No server of our own. No account. Your lookups don't leave your device except to hit the city's public APIs.
Drop any of these into the lookup bar at the top of the app:
| Input | What it pulls |
|---|---|
315 N 12th St | address-based lookup |
1900 Market St | high-rise example |
The Sterling | partial-name match |
| OPA account number | OPA-anchored (most reliable) |
[!TIP] OPA account numbers beat address strings for reliability — but they aren't permanent. Parcels can be re-numbered on splits, merges, or condo conversions. 4PHILLY stores coordinates from each successful lookup so it can automatically resolve re-numbered parcels via the DOR Parcel layer and coordinate proximity, then redirect you to the new OPA. You can also verify any property on Atlas.
| What it does | |
|---|---|
| Live data | Eclipse ArcGIS feature services + Carto SQL API, pulled at lookup time |
| Drift detection | Side-by-side compare; divergent rows highlighted red |
| Status decoding | OPEN, COMPLIED, CLOSED, CLOSEDCASE, RESOLVE — only COMPLIED is real compliance1 |
| Council resolution | District councilmember name, email, phone, committee assignments, L&I Committee flagging |
| OPA fallback | If a saved OPA goes stale, resolves via DOR Parcel geometry, coordinate proximity, or address |
| Atlas verification | Direct link to the city's Atlas tool for independent confirmation |
| OPA-anchored | Identity bound to OPA account, with lat/lng fallback for re-numbered parcels |
| PWA | Installable on iOS and Android; works on desktop; offline shell |
| No backend | Static site. Auditable. Forkable. Nothing between you and the city's APIs. |
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#1550e0','primaryTextColor':'#ffffff','primaryBorderColor':'#1550e0','lineColor':'#1550e0','secondaryColor':'#f6f7f9','tertiaryColor':'#fff'}}}%%
flowchart LR
A[Address or OPA #] --> B{OPA resolve}
B --> C[Eclipse ArcGIS<br/>authoritative]
B --> D[Carto SQL<br/>historical mirror]
C --> E[Drift comparator]
D --> E
E --> F[Unified record<br/>+ drift flags]
B --> G[Council district<br/>from OPA data]
G --> H[Councilmember<br/>+ L&I Committee flag]
Eclipse is what L&I inspectors actually use. Carto is what gets published to OpenDataPhilly. They drift. License expirations, violation status changes, and new complaints appear in Eclipse before — sometimes long before — Carto catches up.
4PHILLY shows you both.
OPA account numbers are not static. Parcels get split, merged, and re-numbered. When a saved or bookmarked OPA returns empty, 4PHILLY runs a three-tier fallback:
On success, the app redirects to the new OPA, updates saved bookmarks, and shows a banner with an Atlas verification link.
The app surfaces six views per property:
The Council tab resolves the property's OPA council_district_2024 field to the current councilmember and displays:
Roster data sourced from phlcouncil.com standing committees page (embedded 2026-05-20).
A standalone Node.js module is also available at council/ for backend/agent use with point-in-polygon district resolution from coordinates.
[!WARNING] Public data has limits. Some are city policy, some are technical, some are because the data simply doesn't exist in machine-readable form. Verify any claim before relying on it.
| Gap | Why |
|---|---|
| Inspector identity | Not published in public feeds |
| Inspector notes | Internal correspondence only |
| 311 complainant identity | Protected by policy |
| Re-inspection occurrence | Status updates don't require a physical visit to record |
| Pre-archive violations | Carto archive coverage varies; Eclipse retention varies |
| Sealed cases | Excluded from public feeds entirely |
See the Limits tab inside the app for the full list with source citations.
4philly/
├── index.html # single-file PWA — all HTML, CSS, JS inline
├── manifest.json # PWA manifest
├── sw.js # service worker (offline shell)
├── og-image.png # social card
├── icon.svg # app icon
├── 404.html # GitHub Pages fallback
├── council/ # Node.js council district resolution module
│ ├── src/
│ │ ├── index.js # main orchestrator — resolveCouncilMember()
│ │ ├── opa-client.js # OPA Property API client
│ │ ├── geo.js # point-in-polygon (ray-casting)
│ │ ├── district-resolver.js
│ │ ├── councilmember-lookup.js
│ │ ├── committee-flag.js
│ │ ├── cache.js # LRU cache with TTL
│ │ └── format.js # text + HTML output formatters
│ ├── data/
│ │ ├── districts.geojson # 10 geographic district boundaries
│ │ ├── councilmembers.json # full 17-member roster
│ │ └── committees.json # L&I Committee chair config
│ └── tests/
│ └── council.test.js # 12 unit tests (geo + cache)
├── tests/
│ └── opa-licenses.integration.test.mjs
├── tools/
│ ├── generate-property-pages.mjs # builds the static /p/ snapshot pages — see tools/README.md
│ └── README.md # exact run instructions for the generator
├── p/ # generated property-record snapshot pages (committed output)
└── README.md
No frameworks. No build step. Vanilla JS, fetch, and the city's public APIs. The entire frontend is a single index.html file with inline CSS and JS.
The council/ directory contains a standalone Node.js ESM module for server-side or agent use — same data, point-in-polygon resolution from coordinates instead of OPA field lookup.
.github/workflows/deploy-pages.yml.main pushes, the workflow publishes from the repository root (.)./docs, run the workflow manually and choose publish_source=docs.services.arcgis.com/fLeGjb7u4uXqeF9q — authoritative for current state (violations, licenses, permits, building certs)phl.carto.com — historical mirror (can lag Eclipse), also hosts 311 complaints (public_cases_fc)A short field guide to the L&I status codes you'll see:
Found drift the comparator missed? A status code that should decode differently? An edge case where Eclipse and Carto give the same answer but neither is correct? Council data out of date?
Open an issue with the OPA number and what you saw. PRs welcome.
MIT — see LICENSE.
Built by @thumpersecure.
Civic data is public. This tool makes it legible.
4PHILLY is an independent civic tool. Not affiliated with the City of Philadelphia, L&I, OPA, or City Council.
CLOSEDCASE in particular is ambiguous — a case can close without compliance being achieved. The COMPLIED status is the only one that means the underlying condition was resolved on inspection. ↩