open-navigator / website /docs /development /react-refactoring.md
jcbowyer's picture
Clean HuggingFace deployment without binary files
61d29fc
metadata
sidebar_position: 13

React + FastAPI Databricks App Refactoring

Executive Summary

The Oral Health Policy Pulse has been completely refactored from a CLI-based multi-agent system into a modern full-stack web application that deploys as a Databricks App.

What Changed

Before (v1.0) After (v2.0)
❌ CLI-only interface βœ… Modern React web UI
❌ Manual command execution βœ… Interactive dashboard
❌ Text-based outputs βœ… Visual charts & maps
❌ Local deployment only βœ… Cloud-native Databricks Apps
❌ Static HTML heatmap βœ… Interactive Leaflet map
❌ No user settings βœ… Configurable UI settings

New Architecture

Frontend (React + TypeScript)

Technology Stack:

  • React 18.2 with TypeScript
  • Vite for build tooling
  • Tailwind CSS for styling
  • React Router for navigation
  • TanStack Query for data fetching
  • Recharts for data visualization
  • Leaflet for interactive maps

Pages Created:

  1. Dashboard (frontend/src/pages/Dashboard.tsx)

    • Real-time statistics cards
    • Topic distribution bar/pie charts
    • Recent opportunities table
  2. Interactive Heatmap (frontend/src/pages/Heatmap.tsx)

    • Geographic visualization using Leaflet
    • State and topic filters
    • Color-coded urgency markers
    • Popup details for each opportunity
  3. Documents Browser (frontend/src/pages/Documents.tsx)

    • Full-text search
    • Pagination
    • Topic tags
    • Direct links to source documents
  4. Opportunities Manager (frontend/src/pages/Opportunities.tsx)

    • Filterable list view
    • Urgency-based sorting
    • One-click email generation
    • Talking points display
    • Confidence score visualization
  5. Settings Panel (frontend/src/pages/Settings.tsx)

    • Target state configuration
    • Policy topic selection
    • Confidence threshold slider
    • Email notification preferences
    • Agent status monitoring

Components:

  • Layout (frontend/src/components/Layout.tsx)
    • Sidebar navigation
    • Header with breadcrumbs
    • Responsive design

Backend (FastAPI Refactored)

New File: api/app.py

Completely rewritten FastAPI application optimized for:

  • βœ… Serving React static files (SPA routing)
  • βœ… REST API endpoints for all frontend interactions
  • βœ… Databricks Apps compatibility
  • βœ… Delta Lake integration
  • βœ… Background task processing
  • βœ… CORS support for local development

Key Endpoints:

GET  /api/health                    # Health check
GET  /api/dashboard                 # Dashboard stats
GET  /api/opportunities             # List opportunities
GET  /api/documents                 # Browse documents
POST /api/workflow/start            # Start analysis
POST /api/advocacy/email/{id}       # Generate email
GET  /api/settings                  # Get settings
PUT  /api/settings                  # Update settings
GET  /api/agents/status             # Agent status

Static File Serving:

  • React build output served from api/static/
  • SPA routing with catchall route
  • Automatic index.html fallback

Database Layer

New File: pipeline/delta_lake_queries.py

Added async query methods to support web app:

async def get_dashboard_stats()       # Dashboard statistics
async def query_opportunities()       # Filtered opportunity queries
async def query_documents()           # Document search/pagination
async def count_documents()           # Total count for pagination
async def get_opportunity()           # Single opportunity details

Databricks Apps Integration

Configuration Files

1. app.yaml (Databricks Apps manifest)

command:
  - "uvicorn"
  - "api.app:app"
  - "--host"
  - "0.0.0.0"
  - "--port"
  - "8000"

env:
  - name: DATABRICKS_HOST
    valueFrom:
      databricksSecret:
        key: host
        scope: oral-health-app
  - name: OPENAI_API_KEY
    valueFrom:
      databricksSecret:
        key: openai_key
        scope: oral-health-app

resources:
  - name: policy-classifier-endpoint
    modelServing:
      endpoint: policy-classifier-prod

port: 8000

2. Dockerfile.app (Container image for Databricks Apps)

  • Multi-stage build
  • Node.js for frontend build
  • Python 3.11 for backend
  • Optimized for CPU-only deployment

Deployment Scripts

1. scripts/deploy-databricks-app.sh

# Automated deployment script:
# 1. Build React frontend
# 2. Create Databricks secrets
# 3. Deploy to Databricks Apps
# 4. Provide access URL

2. scripts/setup-local.sh

# Local development setup:
# - Install Python deps
# - Install npm packages
# - Create .env file

3. scripts/test-app.py

# Test production build locally
# Simulates Databricks Apps environment

Project Structure

oral-health-policy-pulse/
β”œβ”€β”€ frontend/                      # NEW: React application
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   └── Layout.tsx        # Main layout component
β”‚   β”‚   β”œβ”€β”€ pages/
β”‚   β”‚   β”‚   β”œβ”€β”€ Dashboard.tsx     # Dashboard page
β”‚   β”‚   β”‚   β”œβ”€β”€ Heatmap.tsx       # Interactive map
β”‚   β”‚   β”‚   β”œβ”€β”€ Documents.tsx     # Document browser
β”‚   β”‚   β”‚   β”œβ”€β”€ Opportunities.tsx # Opportunity manager
β”‚   β”‚   β”‚   └── Settings.tsx      # Settings panel
β”‚   β”‚   β”œβ”€β”€ App.tsx               # Root component
β”‚   β”‚   β”œβ”€β”€ main.tsx              # Entry point
β”‚   β”‚   └── index.css             # Tailwind styles
β”‚   β”œβ”€β”€ package.json              # npm dependencies
β”‚   β”œβ”€β”€ vite.config.ts            # Vite configuration
β”‚   β”œβ”€β”€ tsconfig.json             # TypeScript config
β”‚   β”œβ”€β”€ tailwind.config.js        # Tailwind config
β”‚   └── index.html                # HTML template
β”‚
β”œβ”€β”€ api/
β”‚   β”œβ”€β”€ app.py                    # NEW: Refactored FastAPI app
β”‚   β”œβ”€β”€ main.py                   # LEGACY: Original API
β”‚   └── static/                   # Built React files (generated)
β”‚
β”œβ”€β”€ pipeline/
β”‚   β”œβ”€β”€ delta_lake.py             # Original Delta Lake pipeline
β”‚   └── delta_lake_queries.py     # NEW: Query methods for web app
β”‚
β”œβ”€β”€ scripts/                       # NEW: Deployment scripts
β”‚   β”œβ”€β”€ deploy-databricks-app.sh  # Deploy to Databricks
β”‚   β”œβ”€β”€ setup-local.sh            # Local development setup
β”‚   └── test-app.py               # Test production build
β”‚
β”œβ”€β”€ app.yaml                       # NEW: Databricks Apps config
β”œβ”€β”€ Dockerfile.app                 # NEW: Production Docker image
β”œβ”€β”€ DATABRICKS_APP_GUIDE.md        # NEW: Deployment documentation
└── README.md                      # UPDATED: Added React info

Features by Page

1. Dashboard

Statistics Cards:

  • Total documents analyzed
  • Advocacy opportunities found
  • States monitored

Charts:

  • Topic distribution (bar chart)
  • Topic distribution (pie chart)

Recent Activity:

  • Latest opportunities table
  • Sortable and filterable

2. Interactive Heatmap

Map Features:

  • OpenStreetMap tiles
  • Circle markers for opportunities
  • Color-coded by urgency:
    • πŸ”΄ Critical
    • 🟠 High
    • 🟑 Medium
    • 🟒 Low

Interactivity:

  • Click markers for details
  • Filter by state dropdown
  • Filter by topic dropdown
  • Real-time updates

3. Document Browser

Features:

  • Full-text search across all documents
  • Pagination (20 per page)
  • Topic tags for each document
  • Direct links to source
  • Meeting date display
  • State/municipality info

4. Opportunities Manager

Display:

  • Card-based layout
  • Urgency badge
  • Key talking points
  • Confidence score bar

Actions:

  • Generate advocacy email
  • Contact via email
  • Add to calendar
  • Copy talking points

Filters:

  • Critical only
  • High priority
  • Medium priority
  • Low priority

5. Settings Panel

Configuration Options:

  • Target states (multi-select)
  • Policy topics (checkboxes)
  • Confidence threshold (slider)
  • Email notifications (toggle)

System Status:

  • Agent health indicators
  • Uptime display
  • Real-time status

Development Workflow

Local Development

1. Backend (Hot Reload)

source venv/bin/activate
uvicorn api.app:app --reload
# Runs on http://localhost:8000

2. Frontend (Hot Reload)

cd frontend
npm run dev
# Runs on http://localhost:3000
# Proxies API calls to :8000

Production Build

1. Build Frontend

cd frontend
npm run build
# Outputs to api/static/

2. Test Locally

python scripts/test-app.py
# Serves at http://localhost:8000

3. Deploy to Databricks

./scripts/deploy-databricks-app.sh
# One-command deployment

Benefits of Refactoring

User Experience

Before After
Command-line only Beautiful web interface
Manual file management Automatic workflows
Static visualizations Interactive maps & charts
No configuration UI Full settings panel
Email via CLI One-click generation

Developer Experience

Before After
Python-only Full-stack (Python + TypeScript)
Local deployment Cloud-native (Databricks Apps)
Manual setup One-command deployment
Limited monitoring Built-in observability
No UI testing Component testing with Vitest

Operations

Before After
Single-user CLI Multi-user web app
Local storage Cloud Delta Lake
Manual scaling Auto-scaling
No authentication Databricks SSO
Basic logging Enterprise monitoring

Technology Choices

Why React?

  • βœ… Industry-standard UI framework
  • βœ… Rich ecosystem of libraries
  • βœ… TypeScript support for type safety
  • βœ… Excellent developer experience
  • βœ… Easy to maintain and extend

Why Vite?

  • βœ… Lightning-fast dev server
  • βœ… Instant hot module replacement
  • βœ… Optimized production builds
  • βœ… Native ES modules support
  • βœ… Built-in TypeScript support

Why Tailwind CSS?

  • βœ… Utility-first approach
  • βœ… Rapid prototyping
  • βœ… Consistent design system
  • βœ… Small production bundle
  • βœ… Highly customizable

Why Databricks Apps?

  • βœ… Integrated with workspace
  • βœ… Automatic authentication
  • βœ… Unity Catalog integration
  • βœ… Seamless data access
  • βœ… Enterprise-ready

Migration Path

For Existing Users

v1.0 (CLI) β†’ v2.0 (Web App)

  1. Keep using CLI - Original functionality preserved in api/main.py
  2. Gradually adopt web UI - Run both simultaneously
  3. Full migration - Switch to web-only when ready

Backward Compatibility:

  • All CLI commands still work
  • Original API endpoints unchanged
  • Can run standalone or web mode

For New Users

Start with Web UI:

  1. Deploy to Databricks Apps
  2. Access via browser
  3. No CLI needed!

Performance Optimizations

Frontend

  • βœ… Code splitting with React lazy loading
  • βœ… Query caching with TanStack Query
  • βœ… Optimized bundle size (~300KB gzipped)
  • βœ… Lazy-loaded charts and maps
  • βœ… Debounced search inputs

Backend

  • βœ… Async endpoints with FastAPI
  • βœ… Background task processing
  • βœ… Delta Lake query optimization
  • βœ… Static file caching
  • βœ… CORS preflight caching

Deployment

  • βœ… Scale-to-zero when idle
  • βœ… Auto-scaling under load
  • βœ… CDN for static assets
  • βœ… Connection pooling
  • βœ… Gzip compression

Next Steps

Planned Features

Phase 1: Enhanced Analytics

  • Historical trend charts
  • Predictive analytics
  • Custom report builder

Phase 2: Collaboration

  • User comments/notes
  • Shared dashboards
  • Team workspaces

Phase 3: Automation

  • Scheduled reports
  • Email alerts
  • Slack integration

Phase 4: Advanced AI

  • Document Q&A chatbot
  • Meeting video analysis
  • Speech-to-text integration

Deployment Examples

Example 1: Local Testing

# Setup
./scripts/setup-local.sh
source venv/bin/activate

# Run backend
uvicorn api.app:app --reload &

# Run frontend
cd frontend && npm run dev

Example 2: Production Deployment

# Configure
export DATABRICKS_HOST=https://your-workspace.cloud.databricks.com
export DATABRICKS_TOKEN=dapi...
export OPENAI_API_KEY=sk-...

# Deploy
./scripts/deploy-databricks-app.sh

# Monitor
databricks apps logs oral-health-policy-pulse --follow

Example 3: Docker Deployment

# Build
docker build -f Dockerfile.app -t oral-health-app .

# Run
docker run -p 8000:8000 \
  -e DATABRICKS_HOST=$DATABRICKS_HOST \
  -e OPENAI_API_KEY=$OPENAI_API_KEY \
  oral-health-app

Conclusion

The React + FastAPI refactoring transforms Oral Health Policy Pulse from a developer-focused CLI tool into an enterprise-ready web application that can be:

βœ… Deployed instantly to Databricks Apps
βœ… Used by non-technical users via web browser
βœ… Scaled automatically for any load
βœ… Monitored comprehensively with built-in observability
βœ… Secured enterprise-grade with Databricks SSO

The future of oral health advocacy is here! 🦷✨