Neighborhood investment momentum tracker for Seattle, WA. Aggregates building permits, business licenses, and other municipal data to create development momentum scores.
- Momentum Scoring: Combines permit activity, new business formation, and investment values into a 0-100 momentum score
- Interactive Map: Visualize momentum scores, permits, and business licenses on a map
- Time Slider: Animate through historical data to see how development patterns change
- Neighborhood Rankings: See which neighborhoods have the highest development activity
- Data Layers: Toggle between momentum heatmap, individual permits, and business licenses
development_pulse/
├── backend/ # FastAPI Python backend
│ ├── api/ # API route handlers
│ ├── models/ # SQLAlchemy database models
│ ├── schemas/ # Pydantic request/response schemas
│ ├── services/ # Business logic (data ingestion, scoring)
│ ├── config.py # Configuration management
│ ├── database.py # Database connection
│ ├── main.py # FastAPI application entry point
│ └── requirements.txt # Python dependencies
│
├── frontend/ # React TypeScript frontend
│ ├── src/
│ │ ├── components/ # React components
│ │ ├── api.ts # API client
│ │ ├── types.ts # TypeScript types
│ │ └── App.tsx # Main application
│ ├── package.json # Node dependencies
│ └── vite.config.ts # Vite configuration
│
└── README.md
- Python 3.10+
- Node.js 18+
- npm or pnpm
-
Navigate to the backend directory:
cd backend -
Create a virtual environment:
python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate
-
Install dependencies:
pip install -r requirements.txt
-
Copy the example environment file:
cp .env.example .env
-
Start the backend server:
python main.py
Or with uvicorn directly:
uvicorn main:app --reload --host 0.0.0.0 --port 8000
-
The API will be available at http://localhost:8000
- API docs: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
-
Navigate to the frontend directory:
cd frontend -
Install dependencies:
npm install
-
Start the development server:
npm run dev
-
Open http://localhost:3000 in your browser
Once both servers are running:
- Open the app in your browser
- Click the "Data" button in the top-left
- Click "Ingest Permits" to load Seattle permit data (takes a few minutes)
- Click "Ingest Licenses" to load business license data
- Click "Calculate Scores" to compute momentum scores
The data ingestion fetches 3 years of historical data from the Seattle Open Data Portal.
GET /api/momentum/current- Current momentum scores for all neighborhoodsGET /api/momentum/history/{neighborhood}- Historical scores for a neighborhoodGET /api/momentum/ranking- Neighborhoods ranked by momentum scoreGET /api/momentum/hot-spots- High-momentum neighborhoods
GET /api/permits- List permits with paginationGET /api/permits/geojson- Permits as GeoJSON for map displayGET /api/permits/clusters- Aggregated permit data by neighborhoodGET /api/permits/stats- Permit statistics
GET /api/licenses- List business licenses with paginationGET /api/licenses/geojson- Licenses as GeoJSON for map displayGET /api/licenses/stats- License statistics
GET /api/neighborhoods- List all Seattle neighborhoodsGET /api/neighborhoods/boundaries- Neighborhood boundaries as GeoJSON
POST /api/ingest/permits- Trigger permit data ingestionPOST /api/ingest/licenses- Trigger license data ingestionPOST /api/ingest/calculate-scores- Calculate momentum scoresGET /api/ingest/status- Current data ingestion status
The momentum score (0-100) is a weighted combination of:
| Component | Weight | Description |
|---|---|---|
| Permit Score | 40% | Based on number of building permits |
| Business Score | 30% | Based on new business licenses |
| Investment Score | 30% | Based on total permit values |
Each component is normalized using logarithmic scaling to handle the wide range of values across neighborhoods.
- Building Permits: Seattle Open Data Portal
- Business Licenses: Seattle Open Data Portal
- FastAPI - Modern Python web framework
- SQLAlchemy - Database ORM
- SQLite - Database (can swap for PostgreSQL/PostGIS)
- Pydantic - Data validation
- React 18 - UI framework
- TypeScript - Type safety
- Vite - Build tool
- react-map-gl - Mapbox GL JS wrapper
- TanStack Query - Data fetching
- Tailwind CSS - Styling
- Recharts - Charts
- Add historical comparison view
- Implement noise/soundscape layer
- Add 311 complaint data
- Restaurant/retail trend analysis
- Export reports as PDF
- User accounts and saved areas
- Email alerts for neighborhood changes
MIT