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. ↩