Find the public library near you and what it offers.
A library is not a restaurant. Nostos has no ratings, no stars, and no reviews. People can name a service, note hours or a closure, or say a book is at a location. Those proposals go to a moderation queue, never onto the page.
v0.1.0 covers every active IMLS public library outlet in New Jersey — 449 locations, 21 counties. Web, Android, and iOS share the same static UI.
ZIP, town, or device location → nearest outlets |
Contact first. Unpublished fields stay unpublished. |
Static HTML + JSON. From the repo root:
python3 -m http.server 8080
# open http://127.0.0.1:8080/src/| You type | You get |
|---|---|
ZIP 07030 or town Hoboken |
Nearest outlets, miles, phone, today’s hours (open now / opens at) |
| Device location (or deny it) | Same list, or ZIP/town fallback |
| A library name | Outlet page: contact the administration first, then a weekday schedule, then services |
- Publicly funded only. The universe is the IMLS Public Libraries Survey outlet file. Anything not in IMLS needs a citation before it goes in.
- Contact is first-class. Phone, email, contact form, director, and board belong above the fold. Unpublished fields say “Not published” — never guessed.
- Null beats guessed. Services stay empty until there is evidence. Daily hours come from the library’s own site (schema.org or a single unambiguous week); IMLS “hours per week” is not shown as a schedule.
- No comment threads.
| File | What |
|---|---|
data/imls-nj-outlets.json |
449 active outlets from IMLS PLS FY2023 (scripts/ingest_imls_nj.py) |
data/nj-libraries.json |
Merged list: website, legal-help flag, services, admin contact, outreach (scripts/merge.py) |
data/proposals/ |
Community queue. Accepted proposals are applied on merge; rejected ones keep a reason |
Each service is {name, evidence_url, verified_on}. Names: legal-help desk, lawyer-in-the-library, notary, passport, printing/scanning, meeting rooms, tax prep, language help, computer access, other.
Hours, when published, are {days: [{day, open, close}], source_url, verified_on} in America/New_York. IMLS hours_open_weekly is a yearly total, not a schedule, and is never shown. Refresh hours from library sites with npm run seed:hours. Seed services, admin contact, and extra hours from websites with npm run seed:sites (top ~40 systems for services; all unique sites for contact; remaining centrals for hours). Every outlet has a 4-digit DCA municipality_code from NJOGIS municipal boundaries.
npm install
npm test # builds www/, unit + mobile project checks
npm run check:data # JSON parse + http(s) URL schema
npm run test:e2e # Playwright
npm run test:allAndroid / iOS (Capacitor 7, com.jacobyoby.nostos):
npm run build:www && npx cap sync
npm run android:assemble # SDK + JDK
npm run ios:pod # macOS + XcodeCI runs on every push and PR. GitHub Pages deploys www/ from main. Intended long-term host is loam (with the other jacobrakai static sites). Locally, serve src/ + data/, or www/ after npm run build:www. See CHANGELOG.
Open work lives in issues. GitHub Pages deploys www/ from main; intended long-term host is loam.

