This repository contains the script for the AccessBC interactive webmap application of the Boston College Campuses.
This project is a collaborative project between the BC Digital Scholarship Group, colleagues in Facilities, and feedback from BC's Council for Students with Disabilites. The purpose of this webmap is to make resources around the BC campuses more visible and findable as well as try to help users navigate campus.
Accessible directions
- Step-free routes on BC's mapped accessible paths, using accessible entrances, indoor routes and elevators
- Avoid steep slopes on by default (1:12, the ADA ramp limit), with one tap to turn it off, and an option to limit only uphill or only downhill
- Avoids stairs and footpaths not checked for accessibility (unless you allow them)
- Routes avoid elevators and entrances reported not working, and say so
- Up to five stops on the way, such as a restroom or a lactation room
- Time estimates at your pace (slower, gentle or brisk)
Walking directions, hands-free
- One tap to Start: follows your location, reads each step aloud, and finds a new route if you go off it
- Clock-face directions from the phone's compass ("at your 2 o'clock"), and Face the right way with a tone
- Sounds and vibration for each step, turns and arrival; the screen stays on
- Where am I?: the nearest building, your progress, and what's around you
- Works with VoiceOver, TalkBack, NVDA and JAWS, and doesn't talk over your screen reader
Beyond campus
- Between campuses (Chestnut Hill, Brighton, Newton) and from off campus, on city sidewalks from OpenStreetMap, with every street crossing as a step and whether its curb ramps are confirmed
- BC shuttles in routes when they're running and quicker: "take the Newton Eagle Direct to Stuart", with BC's schedules and the next shuttle when none is running
- MBTA Green Line stations, with wheelchair accessibility, live elevator and access alerts, and live next-train times
- Green Line trains in routes when quicker (walk, train, maybe a shuttle, walk), boarding only at wheelchair-accessible stations when you avoid stairs
- Plan for later, or arrive by a time: shuttles and trains are chosen for when you'll travel, and the route says when to leave
- Avoid crossings without confirmed curb ramps, an option for wheelchair users off campus
Finding things
- One Where to? box for buildings, offices and resources inside them, T stations, and kinds of thing
- Find nearby: single-stall restrooms, lactation rooms, food, printing, seating, elevators, shuttle stops, T stations and blue-light phones, by walking distance
- Your places: saved and recent destinations, one tap away
- Building information: accessible entrances (which side), elevators, and what's nearby
Safety
- Blue light: one button, always on screen, gives walking directions to the nearest working blue-light emergency phone
- Call BC Police (617-552-4444) and 911 buttons wherever blue lights appear
- A clear in-development notice: live directions aren't yet an assistive device to rely on
Seeing it your way
- Dark mode, high contrast, larger text, bigger map symbols, and a large step-by-step view
- Works at 400% zoom, with reduce motion, and fully by keyboard
- Everything on the map is also available as text
Reliable and shareable
- Works offline after the first visit: the whole map, directions and your places, with no signal
- Add to your home screen like an app
- Share a trip by link, or copy or email the directions as text
- Report a problem (elevator out, door broken, path blocked) from the map, a building, or while walking
Built to improve
- Automated accessibility checks (WCAG 2.2 AA) on every change
- Spreadsheets and a volunteer mapping guide to fill the data gaps (docs/data-collection/)
- Volunteers can add to the map (entrances, paths, building notes) on the contribute page; additions show at once as not verified, until the team verifies them and makes them permanent
- A roadmap of what's next
The site is plain static files with no build step and no external services. From the repository root, run:
python3 scripts/serve.pyThen open http://localhost:8000. Use this script rather than python3 -m http.server, which can't serve the
.pmtiles basemap and terrain files (they need HTTP Range requests).
The interface works like other map apps: one Where to? box (buildings, things in them, or kinds of thing like single-stall restrooms, with quick buttons and a More… list under it), a route preview from your location with one Start button, and walking directions with Mute, Repeat, More, and End. Trip details (start, stops, route options) are under Edit trip; settings, the map key, and help are in the ☰ menu. On computers it's a column down the left; on phones a search bar at the top and a sheet at the bottom.
- Directions between buildings on mapped accessible paths, with slope and climb, written steps, up to five stops, and options to allow stairs, prefer or avoid indoor routes, and limit the steepest slope.
- Find nearby: the nearest vending machine, restroom, seating, blue-light phone and so on, by walking distance from you, your starting building, or along your route.
- Step-by-step mode: one instruction at a time with turns and landmarks; the map follows, facing the direction
of travel in 3D. Follow my location advances steps by GPS, warns before turns, says which way the route is
when you leave it, and (by default) finds a new route from where you are, keeping stops not yet reached. The
trip, including the current step, is kept in the page address (
?from=…&stop=…&to=…&step=…&follow=1), so a reload doesn't lose it and a link shares it. Steps mention curb ramps, stairs that branch off, and seating. - Start begins walking directions read aloud and following your location; Preview the steps one by one goes through them without following.
- Hands free: the screen stays on during step-by-step mode (Screen Wake Lock), short sounds mark a new step (from the side of the turn), a turn coming up, leaving the route, and arriving, and vibration patterns tell left from right (Android). An I use a screen reader setting stops Access BC speaking over the screen reader.
- Orientation without the map (src/js/orientation.js): directions as clock positions from the phone's compass ("at your 2 o'clock"), Face the right way (a tone in the ear on the side to turn toward), Where am I? (nearest building, progress on the route, and what's around you), and each building's entrances, elevators, and nearby facilities in its information dialog.
- Accessibility settings (saved per device): read directions aloud, speaking speed, heading-up map, 3D in step-by-step mode, vibration, high contrast, larger text, reduce motion (both follow the device setting by default).
- Keyboard and screen reader support throughout: real buttons, labelled controls, dialogs that manage focus, live announcements of results and steps, a skip link, headings and landmarks, and building information reachable from search without the map.
- Low vision: dark mode (a dark basemap flavor plus dark panels), bigger map symbols and thicker lines, a large step-by-step view that fills the screen, and layouts that work at 200-400% zoom without sideways scrolling.
- Help: help.html is the user guide, including screen reader tips, with Listen buttons that read each section (or the whole guide) aloud. Keep it up to date when features change.
Routing tests (tests/routing/) cover the graph builder, routes on the real campus data, step
wording, shuttle schedules and rides, and slopes: node --test tests/routing/*.test.mjs (no packages needed). They
run in CI too (.github/workflows/routing-tests.yml).
Simulated walks (tests/accessibility/walks.mjs) test live walking directions
on the move, feeding GPS fixes along routes: a normal walk, a wrong turn (re-routing), poor signal, and a shuttle ride.
cd tests/accessibility && npm run walks, or npm run walks -- shuttle for one. Timings at phone speed
(npm run perf, with the preview server on port 8765) measure the first load, routes, a re-route and Find nearby
with the processor slowed 6x.
Testing. Automated accessibility checks run on every push to dev and every pull request into main
(.github/workflows/accessibility.yml; run them locally with
cd tests/accessibility && npm ci && npx playwright install chromium && npm run check). Testing with
students and an orientation and mobility instructor is planned in
docs/usability-testing/.
docs/data-collection/ has spreadsheets for collecting what the data doesn't yet record (automatic doors, intercom-only entrances, elevator details).
| Path | Contents |
|---|---|
index.html, src/js/, src/input.css |
The app |
help.html, src/help.css |
The user guide |
review.html, src/js/review.js, src/review.css |
The data review page: entrance links and gaps to check, with answers downloaded as a spreadsheet |
contribute.html, src/js/contribute.js, src/js/contributions.js, src/js/config.js |
Volunteers adding to the map, and verifying, through the contributions Sheet (setup; its script is scripts/contributions/Code.gs) |
sw.js, src/js/offline.js, src/manifest.webmanifest |
Working offline (the service worker, at the site root to cover it all) and the home screen app |
src/geojson/ |
Campus data layers (README) |
src/basemap/ |
Self-hosted basemap, terrain, fonts, and icons |
src/vendor/ |
MapLibre GL JS and PMTiles (README) |
src/js/routing/ |
Routing graph, route finder, slopes, shuttle rides, and step-by-step instructions, shared with scripts/routing/ (README) |
scripts/ |
Local preview server and data/basemap tooling. Not deployed. |
tests/accessibility/ |
Automated accessibility checks (axe-core and Playwright, used by CI only). Not deployed. |
tests/routing/ |
Routing tests (Node's built-in test runner). Not deployed. |
docs/ |
Data collection sheets and the usability testing plan |
See updatingdata.md for editing map data. See ROADMAP.md for what's planned next.
Pushing to main runs .github/workflows/deploy.yml, which publishes index.html,
help.html, and src/ to GitHub Pages.
Scripts written by Lester E. Carver Data Services Specialist O'Neill Library Boston College.
Significant data collection and processing contributions were made by interns under the Institute for the Liberal Arts' Boston College Summer Internship for PhD Students program. Many thanks to:
- Mehdi Hoseini
- Sean Henninger
- Jeehyun Lee
- Yinan Xu
- Duygun Ruben