FAB is one web product consumed directly and through the FABFG native shell.
Changes to routes, selection, or hosted assets can affect both.
bun install
bun run doctor
bun run startUse these gates:
bun run lintbun run testbun run buildbun run test:e2ebun run checkfor the release-quality local gate
Focused branches target main. Do not add integration, staging, promotion, or
tool-specific branch layers.
src/App.jsx: product route, selected record, and destination orchestrationsrc/app/routes.js: web/FABFG URL contractsrc/components/AppNavigation.jsx: the three web destinationssrc/features/map/MapView.jsx: the only imperative MapLibre lifecycle boundarysrc/features/map/mapStyle.js: sources, layers, hierarchy, and attributionsrc/features/locator/: worker search and burial delivery recordssrc/features/tours/: tour loading, matching, and derived metadatasrc/features/fab/: Albany-specific record values, ARCE links, and tour definitionssrc/shared/: domain-neutral helpers
Keep UI state out of mapStyle.js. Keep MapLibre calls out of record transforms.
Do not introduce a renderer abstraction while FAB has one renderer. Do not add
a UI framework for controls that semantic HTML and CSS already cover.
The canonical burial source is src/data/Geo_Burials.json. The browser never
imports that 31 MB file. scripts/precalculate-metadata.js produces the compact
runtime index at public/data/Search_Burials.json; the locator worker fetches,
prepares, and searches it off the main thread.
Boundary, road, and section GeoJSON are small enough to use directly in the MapLibre style. Do not add shapefile conversion, GeoParquet, or PMTiles paths without a measured runtime problem and a documented migration plan.
After source-data changes:
bun run build:data
bun run testPure .test.js files run with Bun. Component .test.jsx files run with
Vitest/jsdom. User flows live under e2e/ and run with Playwright.
Map or routing changes must cover:
- Tours default route and tour selection.
- Locator search and result selection.
- One MapLibre instance with hillshade and visible attribution.
- Close preserving a pin and Unpin clearing it.
- Desktop navigation, mobile navigation, and
embed=fabfgwithout duplicate tabs. recordandtourdeep-link restoration.
Source-data changes must preserve record counts, coordinates, tour matching, and generated-artifact shape.
Describe the user-visible result, any FABFG effect, generated artifacts, and the
commands run. Versions are SemVer values in package.json; tagged releases need
a matching CHANGELOG.md section. See docs/release-workflow.md.