個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Snap what's broken in your NYC apartment. Get a dated, housing-code-classified evidence log and a ready-to-send repair notice. AI proposes, code disposes.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Snap what's broken in your NYC apartment. Get a dated, housing-code-classified evidence log and a ready-to-send repair notice.
Live app: https://habitable-blush.vercel.app · Demo video: 2:20 narrated walkthrough on YouTube (storyboard and script) · Try it in 30 seconds: open the link → Try the demo building (no account) → Snap a problem → pick the ceiling-leak sample → Yes, it's dripping → Class C, 24 hours.
Built for the Devpost Build With AI: Basics hackathon with the Devpost Learn skill pack. The planning documents are in devpost/.
| Welcome | AI proposes | Code disposes | Case file | Notice |
|---|---|---|---|---|
| Landlord track record | Ask the law | Message coach | Heat log | Dark mode |
|---|---|---|---|---|
Not legal advice. Habitable documents conditions and cites the rules HPD publishes. It doesn't represent you, and it never suggests withholding rent.
The same rule runs through all three: the model proposes, plain code checks.
/landlord, src/lib/portfolio.ts). Is it this building or this landlord? Starting from the building's HPD registration, Habitable finds every building registered under the same head officer or managing agent (same name and business address) or the same corporate owner name. It then scores the whole portfolio from seven NYC Open Data sets: HPD registrations and contacts, open violations, PLUTO residential units, 311 heat and hot water complaints last season, HPD litigation, and the Alternative Enforcement Program. The demo landlord: 4 buildings, 948 open violations, 17.8× the citywide rate of open Class B and C violations per apartment. Every number links to its dataset, and the method is shown on the page./ask, src/lib/law/). A local BM25 index over 65 verbatim passages of the Housing Maintenance Code (the city's April 2026 compilation) and HPD pages, with a renter-words synonym table, is searched inside the app. The AI may answer only with quotes. Code checks every quote word for word against the passage it cites, and drops any sentence whose quote isn't there. With no AI available, you get the passages themselves. Building the corpus caught a citation to a repealed section in our own rules table.src/lib/coach.ts). A text, an email or a phone-call script to the landlord or super, tuned to the exact hazard class: Class C asks for same-day action, Class A is a calm request. The AI writes the words around placeholders. Code fills in every date, class, window and citation, and rejects any draft that contains a digit, a banned phrase (withholding rent, threats, legal advice) or the wrong length. A rejected draft falls back to a template, and the screen says so.A New York City renter — often in an older, rent-stabilized building — with a leak, mold, no heat, pests, a broken lock or peeling paint, who usually complains by text, keeps no dated record, and doesn't know what the Housing Maintenance Code requires. Secondary: tenant organizers and legal-aid intake workers who need structured evidence.
The scale, from the same NYC Open Data set the app reads (HPD Housing Maintenance Code Violations, queried 2026-10-25): about 2.65 million open violations citywide — 587,952 Class C (immediately hazardous), 1,386,990 Class B and 676,016 Class A — and 85,096 buildings with at least one open Class C violation. Each one is a condition someone documented. Renters keep reporting more: 341,824 heat and hot water complaints to 311 in the last heating season (Oct 1, 2025 – May 31, 2026, 311 Service Requests), and about 1 million problems reported to HPD in the 12 months to Oct 25, 2026 (HPD Complaints and Problems).
flowchart LR
P["📷 Photo<br/>fingerprint · EXIF time · GPS stripped"] --> AI["AI proposes<br/>1 of 7 types + confidence<br/>(violet = tentative)"]
AI -->|"< 70% sure"| Q["One clarifying question"] --> AI
AI --> R["Rules table + engine<br/>src/lib/rules.json · rules.ts<br/>(no AI past this line)"]
F["Facts the photo can't show<br/>mold area · child under 6 · heat or hot water"] --> R
B["NYC Open Data<br/>year built · open violations"] --> R
R --> C["Class A/B/C · window · citation · source"]
C --> T["Dated timeline<br/>(IndexedDB, on device)"] --> N["Notice PDF · EN/ES · 311 text"]
src/lib/rules.test.ts checks that every combination of facts reaches a cited outcome).Verified 2026-10-24 against HPD's Clear Violations page, HPD's mold/pest, heat, lead-paint and self-closing-door pages, HPD's CY25 certification report, NYC311 articles and the enacted texts of Local Law 55 of 2018 and Local Law 86 of 2017. Full table with sources: devpost/spec.md → Rules Table and in the app at /how-it-works.
| Condition | What decides it | Class · window |
|---|---|---|
| Leak | actively dripping? | C · 24 h / B · 30 days |
| Mold (Local Law 55) | area in one room: < 10 / 10–29 / ≥ 30 sq ft | A · 90 d / B · 30 d / C · 21 d |
| Pests | mice, roaches, rats / bedbugs or other | C · 21 d / B · 30 d |
| Heat / hot water | hot water any time; heat Oct 1–May 31 | C · no time (notice asks 24 h) |
| Lock / door | can't lock / lock damaged / building entrance / not self-closing | C · 24 h / B · 30 d / C · 24 h / C · 14 d |
| Peeling paint | pre-1960 + child under 6 → presumed lead; plaster damage; paint only | C · 21 d / B · 30 d / A · 90 d |
/api/receipt returns receivedAt and an HMAC-SHA256 code over sha256|receivedAt. Anyone can check it at /verify — "Try a real receipt" signs a sample in one tap, "Change one character" shows a tampered one fail; every photo in the notice links to its own check. Production refuses to sign without RECEIPT_SECRET.Requirements: Node.js 20+ and npm.
npm install
npm run dev
Open http://localhost:3000 and choose Try the demo building. No keys are needed for the demo.
.env.local, see .env.example)| Variable | Needed for |
|---|---|
GOOGLE_GENERATIVE_AI_API_KEY | Live AI on your own photos (Gemini). Without it — and without the next option — real photos use the manual picker. |
AI_GATEWAY_API_KEY (or vercel env pull for OIDC) | Live AI through Vercel AI Gateway (Claude Haiku 5.5 → Gemini 3.5 Flash) instead of a Gemini key. |
RECEIPT_SECRET | Signing evidence receipts. Required in production; any long random string. |
SOCRATA_APP_TOKEN | Optional; raises NYC Open Data rate limits. |
npm test
npm run test:e2e
Planning and the build followed the Devpost Learn skill pack (.agents/skills/, MIT). The checklist tracks what is done and what is still open. The hands-on checkpoints and the final review are the builder's own, and they stay unchecked until the builder has done them.
| Step | Output |
|---|---|
1-start | learner profile (kept out of git) |
2-scope | devpost/scope.md · visual companion |
3-prd | devpost/prd.md · visual companion |
4-spec | devpost/spec.md · visual companion |
5-build | devpost/checklist.md (slices, checkpoints, revisions) · rendered · app map |
The commit history follows the plan: scope → PRD → spec → checklist → one commit per build slice. The slices were built in parallel by subagents and committed together after integration checks, so the intermediate slice commits were not each built and tested on their own; later work (palette and dark theme, heat log, landlord on record, next steps, case tools, offline, then the landlord track record, Ask the law and the message coach) landed as feature branches merged into main. That later work went beyond the approved PoC boundary. The spec records it as a scope change under Round 2 additions, awaiting the builder's review. What the build discovered that changed the plan is recorded under Revisions in the checklist.
Next.js 16 (App Router) · React 19 · TypeScript · Tailwind CSS 4 · AI SDK 7 (@ai-sdk/google, Vercel AI Gateway) · Zod 4 · exifr · idb-keyval · @react-pdf/renderer · Vitest · Playwright · Vercel. Visual identity: the "doodle" style (grid paper, hand-drawn ink) with a felt-tip palette — sunflower marker for actions and what the code decided, violet for everything the AI proposes, red / amber / sky for HPD Class C / B / A, mint for done — and a "night notebook" dark theme.
src/
├── app/ pages (/, /issue/[id], /notice, /heat, /landlord, /ask, /next-steps, /how-it-works,
│ /verify), API routes (classify, receipt, building, outdoor, landlord, ask, coach),
│ PWA manifest, service worker (public/sw.js), planning companions (public/plan/)
├── components/ doodle/ (hand-drawn UI kit), case/, snap/, issue/, heat/, notice/, site/
└── lib/ rules.json + rules.ts, heat.ts, law/verify.ts, coach.ts (the code that decides),
ai.ts (shared models, cooldowns, cache), rate-limit.ts, classify.ts, evidence.ts,
receipt.ts, building.ts, registration.ts, signals.ts, portfolio.ts, outdoor.ts,
law/ (corpus, BM25 retrieval), coach-ai.ts, geosearch.ts, countdown.ts,
notice-text.ts, next-step.ts, backup.ts, ics.ts, store.ts, demo/
scripts/law-corpus/ how the verbatim law corpus is built and checked
e2e/ Playwright suite
devpost/ planning documents
MIT — see LICENSE. Third-party notices (Devpost Learn skill pack, fonts, data sources, npm packages): THIRD-PARTY-NOTICES.md. Data: NYC Open Data (HPD Housing Maintenance Code Violations, Multiple Dwelling Registrations and Registration Contacts, Complaints and Problems, Litigations, Alternative Enforcement Program, PLUTO), NYC Planning Labs GeoSearch, the National Weather Service API, NYC HPD, NYC311, NYS HCR and NY Senate pages. Sample scenes are illustrations drawn for this project.