Dry Stone Conservancy Map
Links
If there are ever sermons in stones, it is when they are built into a stone wall, turning your hindrances into helps, shielding your crops behind the obstacles to your husbandry.
The limestone country of central Kentucky's Bluegrass region is home to thousands of dry stone structures: field walls, cemetery enclosures, arched bridges, and farmstead foundations built without mortar. Despite appearances, these are not simple constructions. "Close examination reveals that the fences are complex and employ in subtle ways the physics of friction, angle, and gravity to maintain cohesion and stance."[1] They are cultural artifacts as much as agricultural infrastructure, shaped by the region's geology, the economics of antebellum and post-war Kentucky, and the craft knowledge passed (or, increasingly, not passed) from one generation of masons to the next.
The oral traditions of fence masonry are "largely obscured."[1] The Dry Stone Conservancy has been working to close that gap by systematically documenting the location, condition, age, and restoration history of dry stone structures across the eastern United States. What they needed was a structured way to collect that data in the field, and a tool to make sense of it.
What I Built
I came on as a technical partner and owned the project end to end: survey design, data pipeline, and front end.
The survey. I designed the field survey from scratch in KoboToolbox. Working with DSC staff to define what the data needed to capture, the form collects structure location (GPS, address, or general description), type, condition, stone material, age range, restoration history, mason attribution, and up to five photos per submission. Privacy was a first-class design constraint from the start: submitters choose whether their GPS coordinates are published exactly, generalized to a ~5-mile radius, or withheld entirely. That decision flows downstream through every layer of the system.
The pipeline. A TypeScript script fetches new submissions from KoboToolbox's API since the last run, downloads submitted photos, normalizes the raw survey JSON, and writes each entry to the repo as a structured file. An incremental manifest prevents redundant re-downloads. At build time, a prebuild script compiles all entries into a single walls.json. No database. No runtime queries.
The front end. The app has two primary views.
Wall Finder is a photo gallery paired with a Leaflet map. Filters let you narrow by state, stone type, condition, structure type, and project type (historic, restoration, new build). Each card links to a detail view with the full submission record, partner attribution, and all uploaded photos.
Story Map is a five-chapter scrollytelling narrative driven by Framer Motion. It moves from a national overview through the limestone-lined lanes of the Kentucky Bluegrass, back to the oldest pre-1800 structures, forward to active DSC restoration projects, and out to the expanding survey beyond Kentucky. Each chapter filters the map to the relevant wall subset, zooms to the right region, and highlights a featured structure with a pull quote from the submission record.
Submissions can be attributed to a partner organization, including the National Park Service, Olmsted Parks Conservancy, Maker's Mark, and the Kentucky Transportation Cabinet. Partner logos appear on wall detail cards when attribution is on record.
Architecture
Tech Stack
- Framework: Next.js 15, App Router, TypeScript strict
- Maps: Leaflet + React-Leaflet
- Animations: Framer Motion (scroll-scrubbed Story Map chapter transitions)
- Survey & data collection: KoboToolbox (custom XLSForm with branching logic)
- Hosting: Vercel
Data Pipeline
Survey submissions come in through KoboToolbox's API. A pull-kobo-data.ts script fetches new entries since the last run, downloads submitted photos, runs the raw KoboToolbox JSON through a normalizer, and writes each entry as a structured JSON file in src/data/entries/<kobo_id>/. A manifest.json tracks which IDs have been pulled, so incremental updates don't re-download the whole dataset.
At build time, a build-walls-json.ts prebuild script consolidates all entries into a single walls.json and applies any manual data corrections from apply-data-fixes.ts. The Next.js frontend reads this at build time. No database queries at runtime.
Frontend
The app is a Next.js static site. All wall data is loaded server-side at the page level, passed as props to client components, and filtered entirely in the browser.
- Leaflet + React-Leaflet handle the map rendering
- Framer Motion drives the Story Map scroll transitions and chapter navigation
- Location privacy is enforced at the data level: submissions marked
generalorno_sharehave their coordinates blurred or withheld before any client rendering
Location Privacy
Submitters choose their preferred privacy level when filling out the field survey: exact (full GPS), general (coordinates rounded to the nearest ~5 miles), or no_share (location withheld entirely). The blurring is applied in the build script, not the client. No precise coordinates ever leave the server for restricted entries.
Cultural and historical context for the dry stone fencing traditions of central Kentucky draws on Murray-Wooley and Raitz (1992), the foundational scholarly treatment of Bluegrass rock fences.
- Murray-Wooley, Carolyn, and Karl Raitz. (1992). Rock Fences of the Bluegrass. University Press of Kentucky (Perspectives on Kentucky's Past series).
