Let neighbors share the stories behind the benches where community actually happens
# Block Bench Storyteller: Capture Seat Memories
## The Problem
Neighborhood benches hold decades of unwritten history — first dates, daily chess matches, grief shared with strangers, proposals, protests planned in whispers. When benches get removed for "renovation" or new residents move in, this human geography disappears completely. There's no way to discover that the corner bench at Oak and 5th is where the neighborhood watch started, or that the bus stop seat is where three generations of the Martinez family waited for the 42.
## Who Uses It
**Long-time Residents (60+):** Want to preserve memories before they fade, share why certain spots matter, feel their neighborhood history is valued and recorded.
**New Neighbors:** Moving into an area and want to understand its texture — which corners have meaning, where community actually gathers, what stories live in public spaces.
**Urban Planners & Parks Departments:** Need evidence of where people actually linger vs. where they're "supposed to." Story density on a bench justifies keeping it; empty benches might get reallocated.
**Local Historians & Schools:** Teachers doing neighborhood walks, historical societies documenting vernacular history that never makes the archives.
**Grieving Families:** Want to mark the spot where someone spent their last good afternoons, without formal memorial processes.
## Core Features
1. **Pin a Bench Story:** Anyone can drop a pin on a map, upload a photo of a specific bench or seating spot, and write a memory (up to 500 words). Stories tagged with era ("1990s," "last month"), story type ("daily ritual," "one-time moment," "community gathering"), and optional mood.
2. **Browse the Story Map:** Interactive map shows bench locations with story density — benches with 5+ stories glow brighter. Tap any pin to read stories chronologically or by most-cherished (upvotes from neighbors).
3. **"I Know This Bench" Confirmations:** Neighbors can confirm they recognize a bench and add a one-line memory fragment ("My dad sat here every Sunday"). Builds credibility and community corroboration.
4. **Bench Report Card:** Any bench accumulates a simple summary — total stories, date range of memories, most common story types. Exportable as a one-page PDF for presenting to city council or parks department.
5. **Walking Story Routes:** System auto-generates walking paths connecting benches with stories. "The 20-minute Heritage Sit" connects 4 benches with the oldest memories in a walkable loop.
6. **Ask Ody About Local Lore:** Users can ask natural language questions about bench stories: "Are there any proposal stories near downtown?" or "Which benches have stories from the 1970s?" Ody searches and synthesizes.
7. **Notify When a Bench is Threatened:** If someone tags a story with "this bench might be removed," other contributors to that bench get notified. Provides spontaneous organizing surface.
## WellSpr.ing Integration Points
### MCP Tools (via POST to `https://wellspr.ing/mcp`, JSON-RPC 2.0)
| Tool | Usage |
|------|-------|
| `ask_ody` | Power the "Ask Ody About Local Lore" feature — pass user questions like "benches with love stories in 02139" and return synthesized narrative answers from story database |
| `get_businesses` | When displaying a bench, show nearby businesses for context ("This bench is outside Maria's Bakery — 3 stories mention waiting for pastries here") |
| `get_civic_ideas` | Cross-reference bench locations with existing civic improvement ideas — surface if someone's already proposed better seating or shade nearby |
| `get_local_news` | If a bench location appears in local news (park renovation, crime report, community event), surface that context alongside stories |
| `get_geo_portals` | Understand which civic portal/neighborhood zone a bench falls within for aggregation and routing stories to relevant community groups |
### REST Endpoints
| Endpoint | Usage |
|----------|-------|
| `GET /api/geo/portals?area_code=NNN` | Determine which neighborhood portal a pinned bench belongs to; enable filtering stories by civic boundary |
| `GET /api/notable-persons` | If a story mentions a notable local person by name, link to their profile for additional context |
### WCIB Integration
| Endpoint | Usage |
|----------|-------|
| `POST /api/wcib/ody-ask` | Alternative route for Ody queries if building within WCIB ecosystem |
| `GET /api/wcib/ideas` | Show related civic project ideas alongside bench stories ("Someone proposed a 'Neighborhood Memory Walk' — want to contribute?") |
### Future Capabilities (Roadmap: Not Yet Live)
- **Bench adoption/stewardship registry:** When covenant commerce rails are live, neighbors could pledge small amounts toward bench maintenance or memorial plaques.
- **Official memorial request routing:** Integration with city parks API to formally request memorial status for high-story-density benches.
## Data Model
### `benches`
| Field | Type | Notes |
|-------|------|-------|
| id | uuid | Primary key |
| lat, lng | float | GPS coordinates |
| location_description | text | "Corner of Oak & 5th, facing the bakery" |
| photo_url | text | Optional verification photo |
| area_code | string | From geo/portals lookup |
| status | enum | active, threatened, removed |
| created_at | timestamp | |
### `stories`
| Field | Type | Notes |
|-------|------|-------|
| id | uuid | Primary key |
| bench_id | uuid | Foreign key |
| author_name | text | Display name (no login required) |
| author_contact | text | Optional email for notifications |
| story_text | text | Up to 500 words |
| era_tag | string | "1970s", "2020s", "timeless" |
| story_type | enum | daily_ritual, one_moment, community, memorial, other |
| photo_url | text | Optional |
| cherish_count | int | Upvote equivalent |
| created_at | timestamp | |
### `confirmations`
| Field | Type | Notes |
|-------|------|-------|
| id | uuid | Primary key |
| bench_id | uuid | Foreign key |
| fragment | text | One-line memory, 100 chars max |
| created_at | timestamp | |
### `walking_routes`
| Field | Type | Notes |
|-------|------|-------|
| id | uuid | Primary key |
| name | text | "The Heritage Sit" |
| bench_ids | uuid[] | Ordered list |
| distance_meters | int | Calculated |
| generated_at | timestamp | |
## Vibe Coding Prompt to Get Started
Paste this into Claude or Replit Agent:
```
Build a civic memory mapping app called "Block Bench Storyteller" using React + Express on Replit, with SQLite for storage (easy to start, migrate later).
FIRST MILESTONE — "Pin and Read One Story" (2-3 hours):
1. Create a simple Express backend with these routes:
- POST /api/benches — create a bench pin (lat, lng, location_description, photo_url optional)
- GET /api/benches — return all benches with story counts
- POST /api/benches/:id/stories — add a story (author_name, story_text, era_tag, story_type)
- GET /api/benches/:id — return bench details with all its stories
2. Create a React frontend with:
- A Leaflet or Mapbox map
◎
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