Cincinnati Public Stairs Explorer
Links
The City of Seven Hills
In June 1853, a writer for the West American Review named Cincinnati's defining feature: the seven hills that arc above the Ohio River. The comparison to ancient Rome was explicit: both cities rose from river valleys on seven hills, their streets forced to negotiate terrain that no grid could tame.[1] The name stuck. Cincinnati's seven hills (Mount Adams, Walnut Hills, Mount Auburn, Vine Street Hill, College Hill, Fairmount, and Price Hill) form a crescent above the Ohio basin, each neighborhood perched fifty to a hundred feet above the valley floor.
Charles Dickens, visiting in 1842, described the city as "lying in an amphitheatre of hills," forming a "picture of remarkable beauty."[4] He had few kind words for American cities on that tour. Cincinnati earned an exception.
Where there's hills, there's stairs.
Life on the Hills
Cincinnati's a city built on hills. Unlike most flat Midwestern cities, its neighborhoods climb steep valley walls carved by the Ohio River and its tributaries. For over a century, the city maintained a network of public stairways to help residents navigate those hills on foot: concrete and stone steps tucked between houses, cutting through green hillsides, and dropping down bluffs from neighborhoods like Price Hill, Mount Adams, and Fairmount.
At their peak, Cincinnati had more than 400 of these public rights-of-way.[2] They were how people got to streetcar stops, to work, to school.
Before the stairs, there were inclines. Between 1872 and the turn of the century, Cincinnati built five inclined-plane railways to haul passengers straight up the bluffs from the congested Basin below. The inclines closed one by one — replaced first by electric streetcars and eventually by the automobile. But their hillside corridors didn't disappear. In the 1940s, WPA crews poured concrete steps into some of the same rights-of-way the inclines had occupied, trading one hillside technology for a simpler, more enduring one.[4]
Most Cincinnatians outside the hillside neighborhoods don't know they exist, and those who use them daily mostly take them for granted. They're just the way you get down the hill. Some are pristine. Some are buried in bramble. Most are somewhere in between.
Spring in our Steps
Spring in our Steps is a Cincinnati-based advocacy organization dedicated to the preservation, repair, and celebration of these public stairways.[3] They've spent years surveying every public staircase in the city, cataloging each one's location, step count, condition, and neighborhood, and compiled it all into a publicly available dataset: a comprehensive record of Cincinnati's stair network.
Spring in our Steps organizes walks, advocates for repairs with the city, and publishes their data openly so others can build on it. Their work is the foundation this project is built on.
The Spring in our Steps dataset is free and publicly available. This project is one example of what becomes possible when civic organizations treat their survey data as a public good rather than an internal spreadsheet.
Cincinnati's Stairway Network
These numbers come directly from the Spring in our Steps public survey dataset.
The map below is the live application — filter by neighborhood or condition, click any staircase for its detail panel, or switch to the Routes tab to browse curated urban hikes.
Technical Approach
The app is built on Next.js 15 with the App Router and Supabase as the backend — handling the Postgres database, row-level security, auth, and object storage in one place.
Data Layer
The stair and route catalog lives in Supabase Postgres and is fetched server-side at render time. A client-side cache layer (useDataCache) backed by localStorage avoids redundant round-trips during a browsing session. Each staircase record includes a full coordinatePath array of lat/lng points so the Leaflet map can draw the actual path geometry rather than just a pin.
The Map
The interactive map uses React Leaflet 5 with OpenStreetMap tiles. Each staircase is rendered as a polyline overlay using its coordinate path data, with a click handler opening a detail panel. A virtualized list sidebar (react-window + react-window-infinite-loader) keeps scrolling smooth across 380+ entries without layout thrashing.
Community Photo Contributions
Signed-in users can submit photos of individual staircases. Every upload hits a Next.js API route that:
- Validates file type and size
- Processes the image through
sharp— strips EXIF metadata, resizes to 1920px max, converts to WebP at quality 82 - Writes to Supabase Storage under a
pending/path - Queues for admin review before becoming visible
Auth & Security
Auth is handled via Supabase's SSR client. A Next.js middleware function refreshes the session token on every request, so protected routes and upload endpoints stay secure without a separate auth service. Upload endpoints validate authentication before accepting any file.
Additional Features
- Favorites & saved routes — persisted to Supabase per user, synced across devices
- Per-staircase comments — threaded discussion for local knowledge and trip reports
- Curator badges — Hidden Treasure, Steepest Climb, Most Scenic, Historic Landmark, and more — filterable in the catalog
- Deployed on Vercel with Turbopack for local development
