BigBrainParking/app/package.json
Erik 148e1635d3
All checks were successful
build-apk / build (push) Successful in 10m38s
v0.6.0: city parking-map overlay + local time tracking, no IPS API
Adds the City of Sandpoint's printed "Downtown & Waterfront Public Parking"
map as a georeferenced overlay, and lets you track your time on any of its
areas without ever touching the ParkSmarter/IPS API.

Georeferencing (tools/citymap/)
- The PDF carries no geo metadata, so the page->WebMercator affine is
  recovered by fitting the drawing to OSM street centrelines.
- pdftocairo writes stroked street segments with per-path matrix()
  transforms in local coords while filled lots are absolute; both are
  handled. The five legend swatches share the real geometry's colours and
  are identified by stroke-width and position, then dropped.
- 49 areas, fitted to RMS 4.1 m (X) / 3.5 m (Y). On-street segments land a
  mean 4.0 m from the nearest OSM road. sp-039/040 sit further out because
  they are angled bays along the old rail corridor, on no named road at all.
- Sandpoint's grid jogs 38 m between N 2nd Ave and S 2nd Ave; the page shows
  the same jog at the fitted scale, which independently confirms the fit.

App
- Map tab: "City map" layer in the legend's colours, tappable.
- "Park here" pins the car from GPS and auto-detects the containing area
  (40 m snap). With no fix it asks you to tap the spot instead, so the pin
  never depends on GPS working.
- The pin lives in its own storage key, not inside the session: pinning the
  car without starting a timer must survive backing out of the screen.
- Durations cap at the posted limit — a 2-hour space is not offered a
  4-hour timer. Lots and no-limit spots get the long options.
- Reuses the existing foreground-service countdown. The second notification
  button reads "+1 hr" for a city area rather than "Extend": there is
  nothing to buy, so it edits the local timer and says so.
- Account -> Align city map: nudge/scale/rotate the whole overlay against a
  live GPS fix. Save-on-phone needs no admin token, since the person who can
  see the misalignment is the one standing on the street.

Server
- parking_areas + map_overlay tables, public read, admin replace-all. The
  areas come from one source document, so replacement is wholesale rather
  than an upsert.

Dropped geometryCenter from the geo module: on the real data it returns a
point in the water for the crescent City Beach lot and mid-block for
L-shaped runs. Nothing used it.

Tests: 8 geometry tests in app/, 5 area/overlay tests in server/.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 03:28:18 +00:00

44 lines
1.4 KiB
JSON

{
"name": "bigbrainparking-app",
"version": "0.1.0",
"private": true,
"main": "index.ts",
"scripts": {
"start": "expo start --dev-client",
"android": "expo run:android",
"prebuild": "expo prebuild --platform android --clean",
"typecheck": "tsc --noEmit",
"test": "node --import tsx --test test/*.test.ts",
"ios": "expo run:ios"
},
"dependencies": {
"parksmarter-client": "*",
"expo": "~53.0.0",
"expo-file-system": "~18.1.11",
"expo-sharing": "~13.1.5",
"expo-secure-store": "~14.0.0",
"expo-location": "~18.0.0",
"expo-notifications": "~0.29.0",
"expo-constants": "~17.0.0",
"expo-localization": "~16.0.0",
"expo-linking": "~7.0.0",
"expo-status-bar": "~2.0.0",
"@react-navigation/native": "^7.0.0",
"@react-navigation/native-stack": "^7.0.0",
"@react-navigation/bottom-tabs": "^7.0.0",
"react-native-screens": "~4.11.1",
"react-native-safe-area-context": "5.4.0",
"@react-native-async-storage/async-storage": "2.1.2",
"@maplibre/maplibre-react-native": "^10.0.0",
"react-native-vision-camera": "^4.6.0",
"react-native-unifiedpush-connector": "^0.4.0",
"react": "19.0.0",
"react-native": "0.79.0"
},
"devDependencies": {
"@types/react": "~19.0.0",
"babel-plugin-module-resolver": "^5.0.2",
"tsx": "^4.23.12",
"typescript": "~5.4.0"
}
}