Inspiration
Caseworkers are the people who actually get homeless New Yorkers into housing, but the data they need is scattered across dozens of sites: shelter rules on DHS pages, lotteries on Housing Connect, listings on Craigslist, and fair-housing law in the city code. Piecing it together by hand for every client takes hours they don't have.
About 65,000 NYC households hold a CityFHEPS voucher, yet many stay in shelter for months because landlords illegally refuse them ("no programs," "must earn 40x the rent"). The city's political fight has been over how many vouchers to issue; almost nobody is working on whether the ones that exist actually get used. That's the gap Homeward NYC fills.
What it does
Homeward takes messy housing data, simplifies it, and then does the paperwork. Shelter Match finds the shelters a client is eligible for tonight and builds an Intake Ready Packet (intake door, documents, rights). Open Doors shows live Housing Connect lotteries and voucher-friendly listings and builds a Housing Plan with deadlines, a calendar file, and landlord letters. Voucher Guard flags listings that refuse vouchers, even from a photo of a flyer or a text to our Photon iMessage agent, and drafts a complaint in the format of the NYC Commission on Human Rights form.
Everything is grounded in real sources and the law. NYC Admin. Code ยง 8-107(5) bans source-of-income discrimination, and income requirements may only apply to the tenant's share, so "40x rent" on a \$2,200 unit demands $40 \times \$2{,}200 = \$88{,}000$ instead of the lawful $40 \times \$600 = \$24{,}000$. A rules engine (not AI) makes the legal call, a person reviews every draft before anything is sent, and no client data is stored.
How we built it
A Python engine (FastAPI, Pydantic) powers everything. The Gemini API reads listings, screenshots, and flyers in any language and translates packets, while a transparent rules engine decides what's illegal. jev, running on OpenJev, reads full listing pages with a built-in guard so it can never contact a landlord, and MongoDB stores scraped listings and their results.
Data comes from NYC Open Data, City Record notices, Housing Connect's live feed, and NYC's GeoSearch geocoder, shown on Google Maps. The iMessage agent uses Photon's Spectrum, the camera scanner uses Tesseract.js, and 52 tests plus 144 labeled listings keep it accurate. We used Claude Code for much of the development.
Challenges we ran into
NYC doesn't publish shelter addresses, so we pulled 287 from official city contract notices and verified them, resolving conflicts like two sources giving different intake addresses. The city's Open Data lottery feed was three weeks stale, so we switched to Housing Connect's live data.
Our first accuracy test was contaminated, so we wrote a new blind test set. Gemini hit rate limits and jev's original API was paused mid-hackathon, so we built fallbacks and moved jev to an open model.
Accomplishments that we're proud of
Every shelter is real and sourced: 287 addresses, each linked to an official record, and a random spot-check matched 12 of 12 word for word. On a blind test of 60 listings, Voucher Guard is right 93.9% of the time when it flags one, with a 3.8% false-alarm rate.
Most of all, Homeward finishes the work instead of just displaying it: an intake packet, a housing plan, and a complaint draft, each ready after a quick review and in the client's language.
What we learned
Being specific about the law is powerful: "income requirements apply only to the tenant's share" turns "40x rent feels unfair" into math a caseworker can file. Showing sources and steps builds more trust than any confidence score.
We also learned to use AI with restraint: AI reads, rules decide, and a person signs off. Simplifying data isn't enough; finishing the task is what saves caseworkers' time.
What's next for Homeward NYC
We want to run the scraper daily and publish citywide voucher-discrimination data, and link listings to building owners to catch repeat offenders hiding behind LLCs.
Then we want to pilot Homeward with shelter caseworkers and measure how much time it saves them.
Built With
- claude-code
- fastapi
- gemini-api
- git
- google-maps
- housing-connect
- javascript
- jev
- mongodb
- nyc-geosearch
- nyc-open-data
- pandas
- photon
- pydantic
- python
- scikit-learn
- tesseract.js
- uvicorn
Log in or sign up for Devpost to join the conversation.