# Project export: CalTrack

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: TreeHacks 2026
- Tagline: Using mass surveillance to keep people safe - predicting impact, affected areas, and coordinating faster emergency response in disasters.
- Devpost: https://devpost.com/software/caltrack-i0pq3n
- GitHub: https://github.com/alangrewco/treehacks
- Video: https://www.youtube.com/embed/51RLdw6FQOg?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Result: winner ([NVIDIA] Edge AI Track)
- Team: 4 GitHub contributor(s) — Devon Knight (9 commits), Eric (9 commits), Bhavjot (8 commits), Jaeyoung Lee (7 commits)

## Devpost submission (written by the team)

### Inspiration

Disaster response today is fragmented. While emergency managers prepare evacuation and fire rescue plans, they often lack a unified system driven by real-time updates from 911 operators and population density signals to coordinate operational decisions effectively. We were influenced by recent research (https://arxiv.org/abs/2405.14975), which demonstrates how large-scale Apple Wi-Fi Positioning System (WPS) datasets can reveal infrastructure disruptions and population movement patterns over time. The paper highlights both the power and the privacy risks of connectivity-derived signals. This research shows that WPS signals can be used to infer device locations on a network, and that any system leveraging such signals must operate at an aggregated, privacy-conscious level. CalTrack applies these ideas ethically, focusing on community-level resilience modeling, not individual tracking.

### What it does

CalTrack is a disaster intelligence platform focused on forest fires in California. Our platform: Visualizes population density using aggregated WPS device signals Overlays real-time and predictive fire risk across geographic regions Provides data-driven recommendations for allocating emergency resources Keeps human operators in the loop with AI-assisted data extraction, including addresses, medical conditions, and triage levels Spins up an AI voice call center for emergency triage and coordination when demand exceeds available operators Instead of asking “Who is affected?”, CalTrack answers: Where should resources go first, and why?

### How we built it

We utilized the WPS API to retrieve aggregated location data for devices on the network. A majority of these devices are mobile devices such as phones and tablets. We use this data to estimate population density and provide critical situational awareness to emergency responders. We deployed NVIDIA’s DGX Spark systems to host NVIDIA open models, including the Nemotron-class Personaplex model and Earth-2. Our fire-risk overlay is powered by NVIDIA Earth-2, which provides predictive weather patterns that indicate conditions conducive to forest fires. For our demo, we mapped historical data over Palo Alto to demonstrate how predictive modeling enhances situational awareness. Our original plan was to power the AI voice 911 operator using the Personaplex model for natural, fluid emergency communication. However, due to onboarding and troubleshooting challenges with the DGX Spark systems in collaboration with NVIDIA and ASUS representatives, we prioritized successfully deploying Earth-2 within the 36-hour hackathon window. As a result, we integrated VAPI (https://vapi.ai/) for voice orchestration to meet our deadline. To deliver a data-driven experience for operators, we utilized CrewAI, an agent mesh framework that orchestrates specialized agents with defined tasks. During a 911 phone call, our agent mesh parses the conversation in real time and extracts critical information: Healthcare agents gather patient conditions and triage levels so ambulatory services and hospitals can prepare for surges. Geolocation agents, powered by HERE API, extract address information from the call and place a notification marker directly on the operator’s map interface. Together, these agents provide operators with structured, actionable intelligence to improve emergency response coordination.

### Challenges we ran into

Serializing and deserializing Protobuf headers for the WPS location system Onboarding and configuring NVIDIA DGX Spark systems within a tight timeframe Collaborating with NVIDIA and other participants during a productive Saturday feedback session to troubleshoot deployment issues Parsing and validating spoken address data from live 911-style phone calls

### Accomplishments we're proud of

Mapped 650,000 network devices within 6 hours, covering the greater Palo Alto region Integrated predictive disaster modeling using weather patterns associated with forest fire risk Prototyped a voice-based 911 operator integrated with an agentic framework that extracts critical details in real time Designed a system that balances AI automation with human-in-the-loop oversight during high-demand emergency scenarios

### What we learned

Connectivity and infrastructure-derived signals are powerful tools in emergency contexts Research like https://arxiv.org/abs/2405.14975 highlights both the opportunity and responsibility associated with infrastructure-derived data Emergency AI systems must be transparent, auditable, and privacy-conscious Ethical system design strengthens both real-world impact and public trust

### What's next

Add predictive outage modeling for electricity, blocked roads, and terrain accessibility Expand from single-county to statewide deployment Integrate hospital capacity and supply chain stress indicators by interfacing with healthcare systems Deploy a hardened multi-agent orchestration framework for production environments Build a public-facing transparency and accountability dashboard Long term, CalTrack can generalize globally wherever public alerting systems and infrastructure data feeds exist.

## README (from the GitHub repository)

# TreeHacks Monorepo: Hazard Map + Forecast + Voice + Data Harvester

This repo contains several hackathon-sized projects that work together (and can also be run independently):

- A **California hazard map frontend** (React + Vite + Mapbox) with hazard overlays + a hyper-local weather probe panel.
- A **hazard aggregator backend** (Flask) that normalizes public hazard feeds into GeoJSON endpoints for the map.
- A **GPU forecast API** (FastAPI) that runs NVIDIA Earth2Studio FCN3 forecasts and writes NetCDF outputs.
- A **Twilio call center voice bridge** (FastAPI) for NVIDIA PersonaPlex running on an NVIDIA DGX.
- A **WPS harvester** (Python) that crawls Apple `wloc` nearby responses into a resumable Postgres-backed dataset, plus an AWS load-test harness.

## Repo Layout

| Path | What it is | Default port |
| --- | --- | --- |
| `frontend/` | Map UI (Vite + React + Mapbox GL) | `5173` (Vite dev) |
| `backend/` | Flask API for hazards + weather probe | `5001` |
| `forecast/` | FastAPI forecast service + models/scripts | `8000` |
| `callcenter/` | Twilio Media Streams bridge to PersonaPlex | `5050` |
| `wps-harvester/` | Apple WPS crawler + exports + AWS tooling | (CLI) |

## Quickstart (Map + Hazard API)

### 1) Backend (Flask)

```bash
cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

cp .env.example .env
python run.py
```

Backend runs at `http://localhost:5001`.

Key endpoints:
- `GET /healthz`
- `GET /api/v1/hazards?...` (aggregated GeoJSON)
- `GET /api/v1/weather/probe?lat=...&lon=...&hours=72` (NWS-backed)

Notes:
- `backend/run.py` will also load a repo-root `.env` (at `./.env`) if present.
- `WEATHER_PROVIDER=earth2` in the backend is currently a stub (`provider_unavailable`).

### 2) Frontend (Vite)

```bash
cd frontend
npm install

cp .env.example .env
# set VITE_MAPBOX_TOKEN

npm run dev
```

Frontend defaults to `http://localhost:5173` and calls the backend via `VITE_API_BASE_URL` (default `http://localhost:5001`).

## GPU Forecast API (Optional)

The forecast service is a FastAPI app in `forecast/api.py` with endpoints:
- `GET /health`
- `POST /forecast` (writes NetCDF output under `forecast/outputs/`)
- `POST /forecast-fcn3` (Earth2Studio FCN3 ensemble forecast)
- `GET /storm-detection` (runs detection over a NetCDF path)

### Run via Docker (requires NVIDIA GPU + NVIDIA Container Toolkit)

Root `docker-compose.yml` builds and runs the service on port `8000`:

```bash
docker compose up --build
```

Then:

```bash
curl http://localhost:8000/health
```

Implementation details:
- Image is built from the repo-root `Dockerfile` and based on `nvcr.io/nvidia/pytorch`.
- Installs `earth2studio[fcn3]` and related dependencies.

## Call Center (Optional)

`callcenter/` is a Twilio Media Streams full-duplex audio bridge to NVIDIA PersonaPlex (typically running on a DGX).

See `callcenter/README.md` for the full setup:
- running PersonaPlex on DGX via Docker Compose
- running the FastAPI bridge locally
- exposing the bridge to Twilio (ngrok) and configuring the Twilio webhook

## WPS Harvester (Optional)

`wps-harvester/` is a Postgres-backed, resumable crawler that:
- seeds from local Wi-Fi scan BSSIDs
- expands using Apple `wloc` “nearby” responses
- exports a GeoJSON point set for visualization

Quick run (Postgres required):

```bash
cd wps-harvester
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

export DATABASE_URL='postgresql://localhost/postgres'
python3 harvest_ca.py --resume --summary-every-sec 10 --export-geojson ca_points.geojson
```

AWS tooling:
- `wps-harvester/aws/` contains a cost-capped load-test harness plus a small DynamoDB-backed dashboard.

## Tests

```bash
cd backend
source .venv/bin/activate
pytest -q
```



## Detected evidence (automated analysis)

Indexed codebase: 109 recognized source files, 493 KB.
- CrewAI (technology) — detected in the code
- CSS (language) — detected in the code
- FastAPI (technology) — detected in the code
- Flask (technology) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- OpenAI (technology) — detected in the code
- Python (language) — detected in the code
- React (technology) — detected in the code
- Tailwind CSS (technology) — detected in the code
- TypeScript (language) — detected in the code
- Docker (technology) — claimed on Devpost, not found in the code
- PyTorch (technology) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (120 of 170)

```
.DS_Store
.gitignore
backend/.DS_Store
backend/app/__init__.py
backend/app/.DS_Store
backend/app/cache.py
backend/app/config.py
backend/app/db.py
backend/app/hazards.py
backend/app/live_events.py
backend/app/phone_report.py
backend/app/providers/__init__.py
backend/app/providers/common.py
backend/app/providers/sources.py
backend/app/providers/weather/__init__.py
backend/app/providers/weather/adapter.py
backend/app/providers/weather/earth2_stub.py
backend/app/providers/weather/nws_gridpoint.py
backend/app/storm-clustering.py
backend/app/storm-filter.py
backend/app/visual.py
backend/app/voice_healthcare/__init__.py
backend/app/voice_healthcare/api.py
backend/app/voice_healthcare/crew_medical.py
backend/app/voice_healthcare/geolocator_agent.py
backend/app/voice_healthcare/here_geocode_tool.py
backend/app/voice_healthcare/prompts_config.yaml
backend/app/weather.py
backend/data/Symptom2Disease.csv
backend/README.md
backend/requirements.txt
backend/run.py
backend/tests/test_here_api.py
backend/tests/test_smoke.py
backend/tests/test_weather_probe.py
backend/VOICE_HEALTHCARE.md
callcenter/.env.example
callcenter/audio_utils.py
callcenter/call_center.py
callcenter/config.py
callcenter/docker-compose.yaml
callcenter/Dockerfile
callcenter/main.py
callcenter/README.md
callcenter/requirements.txt
callcenter/setup-native.sh
callcenter/url
docker-compose.yml
Dockerfile
forecast/__init__.py
forecast/api.py
forecast/forecast.py
forecast/forecastFCN3.py
forecast/outputs/fcn3_ensemble.nc
forecast/outputs/fcn3_ensemble2.nc
forecast/storm_data.json
forecast/stormDetection.py
forecast/visual.py
frontend/.gitignore
frontend/components.json
frontend/index.html
frontend/package.json
frontend/postcss.config.js
frontend/public/data/ca_points.geojson
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h00.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h01.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h02.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h03.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h04.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h05.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h06.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h07.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h08.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h09.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h10.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h11.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h12.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h13.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h14.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h15.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h16.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h17.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h18.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h19.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h20.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h21.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h22.csv
frontend/public/data/fire-risk-stanford/stanford_fire_2025-11-04_h23.csv
frontend/public/data/points.ca.geojson
frontend/public/data/stanford_bssid_points.json
frontend/public/data/weather/frame-0.geojson
frontend/public/data/weather/frame-1.geojson
frontend/public/data/weather/frame-2.geojson
frontend/public/data/weather/frame-3.geojson
frontend/public/data/weather/frame-4.geojson
frontend/public/data/weather/frame-5.geojson
frontend/README.md
frontend/src/adapters/flaskHazardAdapter.ts
frontend/src/adapters/flaskWeatherProbeAdapter.ts
frontend/src/adapters/hazardAdapter.ts
frontend/src/adapters/mockWeatherAdapter.ts
frontend/src/adapters/weatherAdapter.ts
frontend/src/App.tsx
frontend/src/components/ui/badge.tsx
frontend/src/components/ui/button.tsx
frontend/src/components/ui/card.tsx
frontend/src/components/ui/input.tsx
frontend/src/components/ui/label.tsx
frontend/src/components/ui/select.tsx
frontend/src/components/ui/slider.tsx
frontend/src/components/ui/switch.tsx
frontend/src/components/ui/tabs.tsx
frontend/src/index.css
frontend/src/lib/bssidDensity.ts
frontend/src/lib/fireRiskGrid.ts
frontend/src/lib/utils.ts
frontend/src/main.tsx
frontend/src/realtime/fireCoordinateStream.ts
frontend/src/types.ts
frontend/src/workers/populationGridWorker.ts
[50 more files omitted for size]
```

### Dependencies

- backend/requirements.txt: crewai@>=0.11.0, crewai-tools@>=0.14.0, Flask@==3.1.0, Flask-Cors@==5.0.0, openai@>=1.13.0, pymongo@>=4.0.0, python-dateutil@==2.9.0.post0, python-dotenv@==1.0.1, PyYAML@>=6.0, requests@==2.32.3, twilio@>=9.0.0
- callcenter/requirements.txt: fastapi@>=0.115.0, numpy@>=1.26,<2.2, python-dotenv@>=1.0.0, sphn@>=0.1.4,<0.2, twilio@>=9.0.0, uvicorn[standard]@>=0.32.0, websockets@>=14.0
- frontend/package.json: @radix-ui/react-label@^2.1.8, @radix-ui/react-select@^2.2.6, @radix-ui/react-slider@^1.3.6, @radix-ui/react-switch@^1.2.6, @radix-ui/react-tabs@^1.1.13, @types/geojson@^7946.0.16, @types/mapbox-gl@^2.7.21, @types/node@^25.2.3, @types/react@^18.3.18, @types/react-dom@^18.3.5, @vitejs/plugin-react@^4.3.4, autoprefixer@^10.4.24, class-variance-authority@^0.7.1, clsx@^2.1.1, lucide-react@^0.564.0, mapbox-gl@^3.11.0, postcss@^8.5.6, react@^18.3.1, react-dom@^18.3.1, tailwind-merge@^3.4.0, tailwindcss@^3.4.17, typescript@^5.7.3, vite@^6.0.5
- wps-harvester/aws/requirements.txt: aiohttp@>=3.9, boto3@>=1.28, psycopg[binary]
- wps-harvester/requirements.txt: aiohttp@==3.11.11, protobuf@==5.29.3, psycopg[binary]

### Recent commits (newest first)

- readme
- Ignore large generated geojson/html artifacts
- Merge branch 'main' of github.com:alangrewco/treehacks
- fatty
- Refactoring and major changes
- Merge pull request #5 from alangrewco/storm-analysis
- more analysis
- got rid of a graph that was not needed
- Output model
- Finished the forecast
- Adding the docker files
- Merge branch 'main' of github.com:alangrewco/treehacks
- anotha one
- Merge pull request #4 from alangrewco/HERE
- working vapi and hereapi
- Merge branch 'main' into HERE
- working hereapi
- Merge pull request #3 from alangrewco/feat/callcenter
- Merge branch 'main' into feat/callcenter
- Merge pull request #2 from alangrewco/phone-report

## Key source files (fetched from GitHub, selected and truncated for size)

### backend/VOICE_HEALTHCARE.md

```markdown
# Voice AI for Healthcare

Real-time Voice AI that listens during live calls, transcribes via Twilio, and uses CrewAI agentic workflows to extract clinically and operationally relevant information.

## Features

- **Twilio integration**: Record and transcribe inbound calls
- **CrewAI medical analysis**: Extract symptoms, medications, allergies, conditions, safety red flags
- **ESI triage**: Categorize callers using Emergency Severity Index (Level 1–5) per AHRQ handbook
- **MongoDB-ready output**: Flattened key-value document for direct upload
- **Configurable prompts**: Edit `app/voice_healthcare/prompts_config.yaml` to customize

## Setup

### 1. Environment variables

Add to `.env`:

```env
# Twilio (required for live calls)
TWILIO_ACCOUNT_SID=AC...
TWILIO_AUTH_TOKEN=...

# OpenAI (required for medical analysis)
OPENAI_API_KEY=sk-...

# MongoDB (required for persisting call analyses)
MONGO_URI=mongodb+srv://...
MONGO_DB_NAME=healthcare

# Optional: public URL for Twilio webhooks (use ngrok for local dev)
VOICE_WEBHOOK_BASE_URL=https://your-domain.com

# Optional: model overrides
CREWAI_MODEL=openai/gpt-4o
OPENAI_MODEL=gpt-4o
```

### 2. Twilio configuration

1. In [Twilio Console](https://console.twilio.com) → Phone Numbers → your number
2. Under "A CALL COMES IN": set to **Webhook**
3. URL: `https://your-domain.com/api/v1/voice/incoming` (POST)
4. Save

For local development, use [ngrok](https://ngrok.com) to expose your Flask server:
```bash
ngrok http 5001
# Use the https URL as VOICE_WEBHOOK_BASE_URL
```

## API Endpoints

### `POST /api/v1/voice/incoming`
Twilio webhook for incoming calls. Returns TwiML to record and transcribe.

### `POST /api/v1/voice/transcribe-callback`
Twilio webhook when transcription completes. Runs CrewAI medical analysis.

### `POST /api/v1/voice/analyze`
REST API to analyze a transcript.

**Request:**
```json
{
  "transcript": "Patient called about chest pain and missed their blood pressure medication..."
}
```

Or fetch by Twilio transcription SID:
```json
{
  "transcription_sid": "TR..."
}
```

**Response:**
```json
{
  "transcript": "...",
  "analysis": {
    "esi_triage": {
      "level": 2,
      "level_name": "Emergent",
      "rationale": "Chest pain - high risk, time-critical"
    },
    "clinical_extraction": {
      "symptoms": ["chest pain"],
      "medications": ["blood pressure medication"],
      "allergies": [],
      "conditions": [],
      "patient_concerns": ["missed medication"],
      "scheduling_info": [],
      "administrative_notes": []
    },
    "safety_analysis": {
      "red_flags": ["chest pain - consider urgent evaluation"],
      "medication_concerns": ["missed blood pressure medication"],
      "urgent_follow_up_needed": true,
      "recommended_actions": ["Schedule same-day callback", "Assess for cardiac symptoms"]
    },
    "summary": {
      "executive_summary": "Patient reported chest pain and missed BP medication...",
      "clinical_summary": "...",
      "action_items": ["Nu
[truncated — 1780 more characters]
```

### docker-compose.yml

```yaml
services:
  forecast-api:
    build:
      context: .
      network: host
    image: treehacks-forecast-api:latest
    container_name: treehacks-forecast-api
    gpus: all
    ipc: host
    ulimits:
      memlock: -1
      stack: 67108864
    ports:
      - "8000:8000"
    volumes:
      - ./forecast:/app/forecast
```

### Dockerfile

```
FROM nvcr.io/nvidia/pytorch:25.01-py3

WORKDIR /app

ENV PIP_CONSTRAINT=
ENV PATH="/root/.local/bin:${PATH}"
ENV FORCE_CUDA_EXTENSION=1

ARG E2STUDIO_REF=0.12.1

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        git \
        make \
        cmake \
        build-essential \
        python3-dev \
        libeccodes-tools \
        libeccodes-dev \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --break-system-packages --no-cache-dir \
        fastapi \
        "uvicorn[standard]" \
        pydantic \
        numpy \
        xarray \
        netCDF4 \
    && pip install --break-system-packages --no-build-isolation torch-harmonics==0.8.0 \
    && pip install --break-system-packages "makani @ git+https://github.com/NVIDIA/modulus-makani.git@28f38e3e929ed1303476518552c64673bbd6f722" \
    && pip install --break-system-packages "earth2studio[fcn3] @ git+https://github.com/NVIDIA/earth2studio.git@${E2STUDIO_REF}"

COPY forecast /app/forecast

EXPOSE 8000
CMD ["uvicorn", "forecast.api:app", "--host", "0.0.0.0", "--port", "8000", "--loop", "asyncio"]

```

### wps-harvester/requirements.txt

```
aiohttp==3.11.11
protobuf==5.29.3
psycopg[binary]

```

### callcenter/requirements.txt

```
# Call Center - PersonaPlex + Twilio
fastapi>=0.115.0
uvicorn[standard]>=0.32.0
websockets>=14.0
python-dotenv>=1.0.0
twilio>=9.0.0
numpy>=1.26,<2.2
sphn>=0.1.4,<0.2

```

### backend/requirements.txt

```
Flask==3.1.0
python-dotenv>=1.0.0
Flask-Cors==5.0.0
requests==2.32.3
python-dateutil==2.9.0.post0
pymongo==4.10.1
python-dotenv==1.0.1

# Voice AI for Healthcare
twilio>=9.0.0
crewai>=0.11.0
crewai-tools>=0.14.0
openai>=1.13.0
PyYAML>=6.0
pymongo>=4.0.0

```

### callcenter/docker-compose.yaml

```yaml
# PersonaPlex on NVIDIA DGX
# Copy this folder to the DGX, create .env with HF_TOKEN, then: docker compose up
services:
  personaplex:
    build:
      context: .
      dockerfile: Dockerfile
    gpus: all
    ports:
      - "8998:8998"
    environment:
      - NO_TORCH_COMPILE=1
      - HF_TOKEN=${HF_TOKEN}
    env_file:
      - .env
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    volumes:
      # Cache HF model downloads so they persist across restarts
      - hf-cache:/root/.cache
    restart: unless-stopped

volumes:
  hf-cache:

```

### callcenter/Dockerfile

```
ARG BASE_IMAGE="nvcr.io/nvidia/cuda"
ARG BASE_IMAGE_TAG="12.4.1-runtime-ubuntu22.04"

FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG} AS base

COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/

RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    pkg-config \
    libopus-dev \
    git \
 && rm -rf /var/lib/apt/lists/*

WORKDIR /app

# Clone PersonaPlex and install
RUN git clone --depth 1 https://github.com/ /personaplex.git /app/personaplex

WORKDIR /app/personaplex/moshi
RUN uv venv /app/personaplex/moshi/.venv --python 3.12
RUN uv sync
RUN uv pip install --python /app/personaplex/moshi/.venv/bin/python --force-reinstall --no-cache \
    torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

RUN mkdir -p /app/ssl

EXPOSE 8998

ENTRYPOINT []
CMD ["/app/personaplex/moshi/.venv/bin/python", "-m", "moshi.server", "--host", "0.0.0.0", "--port", "8998", "--ssl", "/app/ssl"]

```

### frontend/package.json

```
{
  "name": "california-map-overview",
  "private": true,
  "version": "0.0.1",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc --noEmit && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "@radix-ui/react-label": "^2.1.8",
    "@radix-ui/react-select": "^2.2.6",
    "@radix-ui/react-slider": "^1.3.6",
    "@radix-ui/react-switch": "^1.2.6",
    "@radix-ui/react-tabs": "^1.1.13",
    "class-variance-authority": "^0.7.1",
    "clsx": "^2.1.1",
    "lucide-react": "^0.564.0",
    "mapbox-gl": "^3.11.0",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "tailwind-merge": "^3.4.0"
  },
  "devDependencies": {
    "@types/geojson": "^7946.0.16",
    "@types/mapbox-gl": "^2.7.21",
    "@types/node": "^25.2.3",
    "@types/react": "^18.3.18",
    "@types/react-dom": "^18.3.5",
    "@vitejs/plugin-react": "^4.3.4",
    "autoprefixer": "^10.4.24",
    "postcss": "^8.5.6",
    "tailwindcss": "^3.4.17",
    "typescript": "^5.7.3",
    "vite": "^6.0.5"
  }
}

```

### wps-harvester/aws/requirements.txt

```
aiohttp>=3.9
boto3>=1.28
psycopg[binary]

```

[99 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]