Tap any shop window to hear who came before — the bakery that was a barbershop, the cafe that was a cobbler.
# Storefront History Whisperer
## The Problem
Every neighborhood loses its commercial memory when longtime residents move away or pass on. That corner that's now a bank was a beloved Italian deli for forty years — but only if someone remembers to tell you. This oral history of local commerce lives in scattered conversations and fading memories, with no shared place to collect it before it's gone forever.
## Who Uses It
**Memory Keepers**: Longtime residents (50+) who remember when Main Street had three shoe repair shops and a five-and-dime. They want to share these stories but have no obvious place to contribute them.
**Curious Newcomers**: Recent arrivals and young residents who notice "Est. 1987" plaques but want the full story — who built this place, what it replaced, why it matters.
**Local Business Owners**: Current shop operators who want to honor their building's history and connect with customers through the stories embedded in their walls.
**Walking Tour Enthusiasts**: Visitors, local history buffs, and urban explorers who want any commercial street to become a self-guided heritage walk.
## Core Features
1. **Tap-to-Explore Map**: Interactive map centered on the user's location showing all storefronts with submitted histories. Tapping a pin reveals a timeline of businesses at that address, from present day back through community memory.
2. **Memory Submission Flow**: Anyone can add a past business to any address — business name, approximate years active (even "sometime in the 80s" is valid), what they sold or did, and one personal memory or detail ("the owner kept a parrot named Chester").
3. **Photo Time Machine**: Upload old photos of storefronts — the faded Polaroid of your mom's hair salon, the newspaper clipping of a grand opening. Photos attach to specific time periods and addresses.
4. **Audio Story Capture**: Record a 60-second voice memory directly in the app. "My grandfather bought his first suit at this tailor in 1962..." Voice adds texture that text can't capture.
5. **Verification Nudges**: When multiple people remember the same past business, the entry gets a "Community Verified" badge. Conflicting memories are shown together, not hidden — memory is imperfect and that's okay.
6. **Current Business Link**: Each location shows the current business (pulled from WellSpr.ing) alongside its history, so the present is always connected to the past.
7. **"Before & After" Walk Mode**: Generate a walking route of 5-10 nearby storefronts with rich histories. Audio plays automatically as you approach each location, museum-style.
## WellSpr.ing Integration Points
### MCP Tools (via POST to `https://wellspr.ing/mcp`, JSON-RPC 2.0)
| Tool | Purpose in This Build |
|------|----------------------|
| `get_businesses` | Fetch current businesses in a neighborhood to populate the map's "present day" layer and give memory contributors autocomplete when selecting addresses |
| `get_business_detail` | When a user taps a current business, retrieve full details to display alongside historical entries |
| `submit_business` | Allow users to register historically-remembered businesses that may not exist in the current database (with a flag indicating "historical/no longer operating") |
| `ask_ody` | Power a "Ask about this street's history" conversational feature — users can ask "What was at 45 Main St in the 1970s?" and Ody synthesizes submitted memories |
| `get_adjacent_nodes` | For Walk Mode, discover connected neighborhood nodes to suggest cross-neighborhood history walks |
### REST Endpoints
| Endpoint | Purpose |
|----------|---------|
| `GET /api/notable-persons` | Cross-reference submitted memories — if someone mentions "the shop run by the Delgado family," check if any Delgados appear in notable persons to enrich the entry |
| `GET /api/geo/portals?area_code=NNN` | Retrieve neighborhood boundary data to scope the map view and organize histories by district |
### Future Capabilities (Roadmap: not yet live)
- **Historical business type taxonomy**: A standardized vocabulary for business categories (cobbler, five-and-dime, soda fountain) would help with search and filtering. Currently use free-text with community-emergent tags.
- **Memory contributor reputation/trust scores**: Covenant commerce patterns could eventually weight contributions from verified longtime residents.
## Data Model
### `storefronts`
| Field | Type | Notes |
|-------|------|-------|
| id | uuid | Primary key |
| address | string | Street address |
| lat, lng | float | For map placement |
| area_code | string | Links to WellSpr.ing geo/portals |
| current_business_id | string | WellSpr.ing business ID if known |
| created_at | timestamp | |
### `memories`
| Field | Type | Notes |
|-------|------|-------|
| id | uuid | Primary key |
| storefront_id | uuid | FK to storefronts |
| business_name | string | "Sal's Barbershop" |
| business_type | string | Free text: "barbershop", "deli", etc. |
| year_start | int | Nullable, approximate okay |
| year_end | int | Nullable |
| memory_text | text | The story/detail |
| audio_url | string | Optional voice recording |
| contributor_name | string | Optional, can be anonymous |
| created_at | timestamp | |
### `photos`
| Field | Type | Notes |
|-------|------|-------|
| id | uuid | Primary key |
| memory_id | uuid | FK to memories |
| image_url | string | Stored image |
| caption | string | Optional |
| estimated_year | int | When was this photo taken? |
### `verifications`
| Field | Type | Notes |
|-------|------|-------|
| id | uuid | Primary key |
| memory_id | uuid | FK to memories |
| contributor_hash | string | Anonymous dedup |
| note | string | "I remember this too!" or correction |
## Vibe Coding Prompt to Get Started
Paste this into Claude or Replit Agent:
---
**Build a "Storefront History Whisperer" web app using React + Express on Replit with PostgreSQL.**
**First milestone**: A working map view that shows storefronts and lets users submit memories.
**Stack**: React frontend with Leaflet for maps, Express backend, PostgreSQL database, Replit hosting.
**Step 1 - Database**: Create tables for `storefronts` (id, address, lat, lng, area_code, current_business_id), `memories` (id, storefront_id, business_name, business_type, year_start, year_end, memory_text, audio_url, contributor_name, created_at), and `photos` (id, memory_id, image_url, caption, estimated_year).
**Step 2 - Map View**: Build a React component using Leaflet centered on a default location (use 40.7128, -74.0060 for NYC as placeholder). On load, fetch storefronts from your Express API and render as map markers.
**Step 3 - Add Memory Flow**: When user clicks a location on the map, open a modal form: address (auto-filled from click coordinates via reverse geocoding), business name, business type, approximate years, memory text (textarea), optional contributor name. Submit creates a storefront (if new) and memory record.
**Step 4 - Timeline Display**: Tapping a marker shows a sidebar with all memories for that address, sorted by year_end descending (most recent first). Show business name, years
◎
This is your project thread with Ody. Ask questions, share screenshots, talk through the build. Anyone with this link can join the conversation.
Paste screenshots or upload images/PDFs · Shift+Enter for new line