Columbus Dog Treat Trail ← Back to the map
Technical case study · July 2026

Behind the Build

How a handful of dog-walk discoveries became a neighborhood map—and how a static site, a spreadsheet, and a deliberately small technical system keep it useful.


A tiny observation with a map-shaped answer

The project started on foot: biscuit jars on porch rails, stick libraries under trees, and water bowls outside shops. The interesting part was not any one stop. It was that the network existed without a shared record.

The first product decision was also the most important: make the map the product. No account wall, no feed, no separate app to install. A walker should be able to open a link, see what is nearby, and understand which reports someone has actually checked.

The map looks simple because the complicated parts stay behind the walk.

A lightweight publishing pipeline

The app separates public suggestions from trusted map data. A Google Form collects reports into a submissions sheet. Review and verification happen before an approved stop reaches the published CSV consumed by the map.

01A neighbor suggests a stop
02The report enters a review queue
03The location is checked on foot
04The map refreshes from the Sheet

This design is intentionally modest. The spreadsheet is readable by a non-developer, the static site has no deployment server to maintain, and the verification state remains visible instead of being hidden behind a generic pin.

The useful trickery

Static site, live data

Leaflet renders the interface while Papa Parse turns a published Sheet into structured stop data in the browser. The map can change without rebuilding the site, but the production surface stays portable HTML, CSS, and JavaScript.

Progressive enhancement

Location, sharing, installation, subscriptions, and write-back endpoints are treated as enhancements. When an API or endpoint is unavailable, the core map still loads and several actions fall back to plain links or email.

Geospatial logic without a platform backend

The browser calculates distances, finds the nearest stop, groups neighborhood collections, builds suggested walks, and handles deep links. OpenStreetMap supplies the geographic canvas; the project’s own data supplies the local meaning.

Trust expressed as interface

Verified, unverified, and seasonal states are not back-office fields. They control pin rings, badges, filters, and copy. The data model and visual system say the same thing: a report is useful, but a checked report is different.

A field notebook over a stock map

The visual system uses parchment, near-black ink, hard offset shadows, and small radii. Fraunces carries the personality; Inter handles conversation; JetBrains Mono labels metadata like notes in the margin.

OpenStreetMap tiles are warmed and slightly desaturated so the base geography recedes. Stop colors and status rings remain clear above it. On small screens, interface text gives way to defined icons while accessible names and tooltips preserve meaning.

The voice follows the same rules as the verification model: casual, specific, and honest about what is automated, what is manual, and what still needs a walk.

What the build made clear

  • Small systems can still have real architecture; the best boundary here is between suggestion and publication.
  • A spreadsheet can be a sensible operational database when the scale, editor, and review process are explicit.
  • Graceful fallbacks matter more than feature count for a neighborhood utility opened outdoors on a phone.
  • Accessibility works best when it is structural: semantic buttons, keyboard-safe controls, readable contrast, and labels that survive icon-only layouts.
  • A visible “unverified” state is more trustworthy than pretending every crowdsourced point has equal certainty.

What it uses

Interface

Semantic HTML, custom CSS, and vanilla JavaScript. No framework and no build step.

Mapping

Leaflet with OpenStreetMap tiles, custom div icons, browser geolocation, and client-side distance calculations.

Data

Google Sheets published as CSV, parsed in the browser with Papa Parse; Google Forms for public submissions.

Automation

Google Apps Script for approval, verification, subscriptions, engagement, and reporting workflows.

Delivery

GitHub Pages, a web app manifest, service-worker caching, and responsive browser-first installation.

Identity

Fraunces, Inter, and JetBrains Mono; a purpose-built token system, SVG marks, icons, and Scout mascot assets.

Measurement

Google Analytics 4 and ScoutSights reporting, with anonymous location-interest pings where configured.

License & data

MIT-licensed project code; Leaflet under BSD-2-Clause; OpenStreetMap data under ODbL.