Auto-draft neighborhood update emails from live civic data so block captains can inform without burnout
# Block Captain's Weekly Pulse Generator
## The Problem
Block captains and neighborhood association leaders are essential connectors in their communities, but the weekly grind of researching city announcements, tracking new businesses, finding free items, and summarizing service changes leads to predictable burnout. Most volunteer leaders last 6-18 months before the unpaid research hours overwhelm them. This tool transforms a 2-3 hour weekly task into a 10-minute review-and-send workflow, keeping experienced neighborhood voices active longer.
## Who Uses It
**Primary: Block Captains & Neighborhood Association Officers**
Volunteers who've committed to keeping 50-500 households informed. They know their neighbors' concerns (parking, safety, development) and have established trust. They need tools that respect their voice, not replace it.
**Secondary: Community Liaisons at City Offices**
Staff who support multiple neighborhood groups could use this to help struggling associations maintain communication without direct city takeover of messaging.
**Tertiary: HOA Board Members & Condo Association Presidents**
Similar communication burden, smaller geographic scope, often dealing with the same city service data.
## Core Features
1. **One-Click Data Pull Dashboard**
A single "Gather This Week's Updates" button fetches new businesses, free items, local news, and city service info for the captain's defined area. Results display in categorized cards they can preview before including.
2. **Drag-and-Drop Section Builder**
Captains see fetched items as draggable cards. They drag what matters to their block into an email template, reorder sections, and skip irrelevant items. No writing required for standard items.
3. **Voice-Matched Draft Generation**
After selecting items, the system generates a friendly email draft using ask_ody. Captains paste a sample of their previous emails during onboarding so the tone matches their established voice ("Hey neighbors!" vs. "Dear Residents of Oak Street").
4. **Personal Note Injection Points**
The draft includes clearly marked `[ADD YOUR NOTE HERE]` sections where captains insert hyperlocal context only they know—"The new coffee shop owner is Maria, she moved here from the Elm Street block" or "This pothole report is the one by the Hendersons' driveway."
5. **Copy-to-Clipboard Email Export**
One button copies the final HTML or plain-text email, ready to paste into Gmail, Mailchimp, Nextdoor, or whatever the captain already uses. No new email infrastructure to manage or deliverability to debug.
6. **Neighborhood Boundary Definition**
Simple setup flow where captains define their coverage area by zip code, neighborhood name, or (if available) portal area code. This filters all API calls to relevant geography.
7. **Weekly Digest Archive**
Past generated digests are saved locally so captains can reference "what did I tell folks about that business?" and avoid repeating stale news.
## WellSpr.ing Integration Points
### MCP Tools (via POST to `https://wellspr.ing/mcp` using JSON-RPC 2.0)
| Tool | Purpose in This Build |
|------|----------------------|
| `get_businesses` | Fetch new/recently added businesses in the captain's area for "New in the Neighborhood" section |
| `get_business_detail` | Pull hours, contact info, description when captain clicks to expand a business card |
| `get_local_news` | Surface relevant local news items for "What's Happening" section |
| `get_free_items` | Populate "Free & Available" section—curb alerts, giveaways, community fridge updates |
| `get_city_services` | List service changes, scheduled maintenance, comment periods for "City Updates" section |
| `get_civic_ideas` | Show active civic improvement proposals neighbors might want to support or discuss |
| `ask_ody` | Generate the email draft text, matching captain's voice profile with selected content items |
### REST Endpoints
| Endpoint | Purpose |
|----------|---------|
| `GET /api/officials` | Include "Your Representatives" footer with current contact info |
| `GET /api/geo/portals?area_code=NNN` | Validate neighborhood boundaries, connect to local civic portal data |
### Example MCP Call (JSON-RPC 2.0)
```json
{
"jsonrpc": "2.0",
"method": "get_businesses",
"params": {
"area": "North Loop",
"since": "2025-01-06"
},
"id": 1
}
```
### Not Yet Available (Roadmap Items)
- **Subscriber list management**: Captains will continue using their existing email tools (Gmail groups, Mailchimp, Nextdoor). *Future: covenant commerce may enable opt-in resident directories.*
- **Automated weekly send**: This version is review-then-send, not fire-and-forget. Automation would require email infrastructure outside current API surface.
- **Event calendar integration**: No event-specific endpoint exists yet. Captains can manually add events they know about.
## Data Model
```
┌─────────────────────────────────────────────────────────────┐
│ captains │
├─────────────────────────────────────────────────────────────┤
│ id (uuid, pk) │
│ name (string) │
│ email (string) │
│ neighborhood_name (string) │
│ area_codes (array of strings) -- for portal filtering │
│ voice_sample (text) -- pasted example email for tone match │
│ created_at (timestamp) │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ digests │
├─────────────────────────────────────────────────────────────┤
│ id (uuid, pk) │
│ captain_id (uuid, fk) │
│ generated_at (timestamp) │
│ content_json (jsonb) -- selected items before drafting │
│ draft_html (text) -- generated email content │
│ status (enum: draft, sent) │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ content_items (cached from API, refreshed on pull) │
├─────────────────────────────────────────────────────────────┤
│ id (uuid, pk) │
│ source (enum: business, news, free_item, city_service, idea)│
│ external_id (string) -- ID from WellSpr.ing │
│ title (string) │
│ summary (text) │
│ fetched_at (timestamp) │
│ raw_data (jsonb) -- full API response for detail expansion │
└─────────────────────────────────────────────────────────────┘
```
## Vibe Coding Prompt to Get Started
Paste this into Claude or Replit Agent:
---
**Build me a "Block Captain's Weekly Pulse Generator" web app with this stack:**
- **Frontend**: React with Tailwind CSS
- **Backend**: Express.js with a SQLite database (simple, no setup)
- **Deployment**: Replit (use their built-in hosting)
**
◎
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