This is the lookup tool on syr.gov where residents can type their address and find out who their Common Councilor is.
Live site: https://syr-common-councilor-lookup.netlify.app/
ex
First time:
git clone https://github.com/CityofSyracuse/common-council-searchable.git
cd common-council-searchableTo preview: double-click index.html.
If the lookup isn't matching anything when you preview locally, your browser is blocking the JS files. Run a quick local server from the folder:
python -m http.server 8000Then open http://localhost:8000.
Always hard-refresh after a change — Ctrl+F5 on Windows, Cmd+Shift+R on Mac. Otherwise the browser caches scripts.js and you'll swear nothing changed.
Netlify is hooked up to GitHub. Whatever you push to main is live in about a minute.
- Edit the file (see "When you need to change something" below)
- Open
index.html, hard-refresh, confirm it works - Commit and push:
git add <file> git commit -m "what you changed and why" git push
- Wait ~1 minute, check https://syr-common-councilor-lookup.netlify.app/
If something looks off after deploy, revert the commit and push — Netlify redeploys the previous version.
It's a plain HTML/CSS/JS site.
index.html— the page itselfstyles.css— all the stylingscripts.js— the search logicdata.js— residential street rangesdata2.js— residential exact addresses (the exceptions)parcel_lookup_data.js— every parcel in the city. This is what makes commercial addresses work — Destiny USA, City Hall, hotels, hospitals, all of it.Syracuse_Common_Council_Boundaries_(2023).geojson— the district boundaries.council_data.py— the Python script to build the JS data files.
When someone types an address, scripts.js checks three datasets in this order:
parcel_lookup_data.jsfirst. This catches commercial and government buildings.data.jsnext. Residential street ranges (covers the bulk of homes).data2.jsas a backup for residential exceptions.
It stops at the first hit.
The search updates live as you type:
- Just a number → list of streets where that number exists
- Number + part of a street → narrows down
- Full address → the spotlight card pops up with district, ward, councilor, and a contact link
- Just a street name → asks for a house number
The parser handles the stuff people actually type — uppercase, lowercase, "St" vs "Street", "Ave" vs "Avenue", "1st" vs "first", "N Salina" vs "Salina N". All gets normalized to the same thing before matching.
A councilor changed? Edit COUNCILOR_META_BY_DISTRICT at the top of scripts.js. Name and link for each district. That's it.
Need to refresh the data?
- Residential ranges → rebuild
data.jsfrom the City's street range source - Exact addresses →
data2.js - Parcel data (commercial, etc.) → rebuild
parcel_lookup_data.jsfrom the City Parcels dataset: https://data.syr.gov/datasets/6dabdd6add9443128c2adc9bd6609051_0 council_data.pyis a starting point for the regeneration
If you rebuild parcel_lookup_data.js yourself, the rows have to stay in this order:
[houseNumber, streetName, fullAddress, CC_DIST, CITY_WARD, LAT, LONG, landUse]
Owner info is left out on purpose — this file is public.
Visual change? Everything's in styles.css. No framework.
The code is fine. These are data gaps — they'd need to be fixed at the GIS source by NBD or the data team:
109 S Warren St(State Tower) — not in the parcel feed at that number401 Harrison St(Everson Museum)201 E Washington St(City Hall Commons) — that block is filed under Salina St in the feed- Anything outside city limits — OCC, Hancock, anywhere in DeWitt/Salina/Onondaga town. These won't show up and shouldn't, since they're not in a council district.
if you type a single letter after a space (like 233 E W), you'll see "no matches" for a second because S/N/E/W get read as directionals. Type the next letter and it comes back. Annoying but minor.
| Date | What changed |
|---|---|
| Feb 2026 | First release |
| Feb 2026 | UX + branding cleanup |
| May 2026 | Added the parcel lookup layer + suffix stripping. |