|
| 1 | +# ACCI Handoff |
| 2 | + |
| 3 | +Last updated: 2026-07-19 |
| 4 | + |
| 5 | +## Current state |
| 6 | + |
| 7 | +ACCI, the Austin Crash Context Interface, is live at [acci.handprotocol.org](https://acci.handprotocol.org). It is a standalone static Netlify app that renders recent fatal and suspected serious-injury crashes from the City of Austin Vision Zero crash-level dataset. |
| 8 | + |
| 9 | +The production Netlify project is `acci-handprotocol`, project ID `92b38e69-7254-4e2d-aed6-4f6795379b22`. The custom domain is managed through the existing `handprotocol.org` Netlify DNS zone and is covered by its wildcard TLS certificate. |
| 10 | + |
| 11 | +## Product behavior |
| 12 | + |
| 13 | +- The initial map loads the latest five calendar years of fatal and suspected serious-injury crashes. |
| 14 | +- WebGL terrain, point markers, and severity-weighted hexagonal columns show spatial concentrations of harm. |
| 15 | +- Year, travel mode, severity, and terrain controls update the map and totals. |
| 16 | +- Address and landmark search is bounded to Austin through Photon. |
| 17 | +- A selected address summarizes matching crashes within 80 meters. |
| 18 | +- “Show accidents near location” expands the investigation radius to one kilometer. |
| 19 | +- Double-clicking the map reverse-searches the selected point and shows a five-second “Search this pin” confirmation. |
| 20 | +- Top-harm arrows step through the 20 highest severity-weighted concentrations under the active filters. |
| 21 | +- The target control selects a random crash under the active filters. |
| 22 | +- Tapping a crash opens its date, harm, speed, involved units, location, and source-record link. |
| 23 | + |
| 24 | +## Mobile interaction rules |
| 25 | + |
| 26 | +Mobile uses one active surface at a time. Search results, Explore Data, location summaries, crash details, about content, and pin confirmation must not stack. |
| 27 | + |
| 28 | +- Explore Data opens from the bottom-left settings control. |
| 29 | +- Explore Data has an internal X close control. |
| 30 | +- Crash and location details open as bottom sheets with safe-area padding. |
| 31 | +- Crash markers retain their small visual dots but have 36 to 44 pixel invisible hit regions. |
| 32 | +- Opening a new surface closes competing surfaces. |
| 33 | +- Closing crash details restores the active location summary when one exists. |
| 34 | + |
| 35 | +## Files |
| 36 | + |
| 37 | +- `index.html`: semantic application shell, controls, summaries, prompts, and source notes. |
| 38 | +- `style.css`: full visual system, responsive layout, bottom sheets, and reduced-motion behavior. |
| 39 | +- `app.js`: map setup, City data query, filtering, spatial aggregation, search, reverse lookup, hotspot navigation, random targeting, and overlay state. |
| 40 | +- `netlify.toml`: static publish configuration, security headers, and revalidated asset caching. |
| 41 | +- `favicon.svg`: ACCI application mark. |
| 42 | +- `README.md`: short local-development and data-source guide. |
| 43 | + |
| 44 | +## External services |
| 45 | + |
| 46 | +- Crash data: `https://data.austintexas.gov/resource/y2wy-tgr5.geojson` |
| 47 | +- Geocoding and reverse lookup: `https://photon.komoot.io` |
| 48 | +- Basemap: `https://tiles.openfreemap.org/styles/dark` |
| 49 | +- Terrain tiles: AWS Terrain Tiles, Terrarium encoding |
| 50 | +- Map runtime: MapLibre GL JS 5.24.0 from unpkg |
| 51 | +- Fonts: Inter and JetBrains Mono from Google Fonts |
| 52 | + |
| 53 | +The app has no build step and no stored API secrets. External-service availability is a runtime dependency. |
| 54 | + |
| 55 | +## Local development |
| 56 | + |
| 57 | +```bash |
| 58 | +cd accispace |
| 59 | +python3 -m http.server 4173 |
| 60 | +``` |
| 61 | + |
| 62 | +Open `http://localhost:4173`. |
| 63 | + |
| 64 | +## Validation |
| 65 | + |
| 66 | +Run before deployment: |
| 67 | + |
| 68 | +```bash |
| 69 | +node --check app.js |
| 70 | +npx --yes html-validate@10 index.html |
| 71 | +git diff --check -- . |
| 72 | +``` |
| 73 | + |
| 74 | +The latest browser verification covered: |
| 75 | + |
| 76 | +- Loading 2,063 live crash records |
| 77 | +- Ranked hotspot navigation |
| 78 | +- Random crash targeting |
| 79 | +- Address and nearby-crash summaries |
| 80 | +- Double-click reverse lookup and countdown dismissal |
| 81 | +- Real crash-marker pointer selection |
| 82 | +- Exclusive mobile overlays at 390 by 844 pixels |
| 83 | +- Mobile Explore Data open and close behavior |
| 84 | +- No browser exceptions during the verified flows |
| 85 | + |
| 86 | +## Deploy |
| 87 | + |
| 88 | +The directory is linked locally to the Netlify project through `.netlify/state.json`, which is intentionally ignored by git. Deploy manually with: |
| 89 | + |
| 90 | +```bash |
| 91 | +netlify deploy --prod --dir . --message "Describe the ACCI update" |
| 92 | +``` |
| 93 | + |
| 94 | +After deployment, verify both `https://acci.handprotocol.org` and the browser-level live data load. JavaScript and CSS use `max-age=0, must-revalidate` because the filenames are not content-hashed. |
| 95 | + |
| 96 | +## Known constraints and next moves |
| 97 | + |
| 98 | +- There is no bundled crash-data fallback if the City API is unavailable. |
| 99 | +- Photon, OpenFreeMap, terrain tiles, fonts, and MapLibre are external runtime dependencies. |
| 100 | +- The word “accident” appears in user-facing discovery controls because that is the requested language. City data and explanatory copy otherwise use “crash.” |
| 101 | +- A future reliability pass could vendor MapLibre, self-host fonts, and create a scheduled crash-data snapshot. |
| 102 | +- A future analysis pass could add accessible crash lists and permalinked filter state. |
| 103 | + |
| 104 | +## Repository safety |
| 105 | + |
| 106 | +ACCI work is confined to `accispace/`. The adjacent `wxl/` working changes belong to a separate workstream and must not be staged or modified as part of ACCI work. |
0 commit comments