#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BACKEND_DIR="$ROOT_DIR/backend" FRONTEND_DIR="$ROOT_DIR/frontend" API_HOST="${API_HOST:-127.0.0.1}" API_PORT="${API_PORT:-8000}" FRONTEND_HOST="${FRONTEND_HOST:-0.0.0.0}" pids=() cleanup() { for pid in "${pids[@]}"; do kill "$pid" 2>/dev/null || true done wait 2>/dev/null || true } trap cleanup INT TERM EXIT if [ ! -x "$BACKEND_DIR/.venv/bin/uvicorn" ]; then echo "Backend dependencies missing. Run:" echo " cd backend && python -m venv .venv && .venv/bin/pip install -r requirements.txt" exit 1 fi if [ ! -d "$FRONTEND_DIR/node_modules" ]; then echo "Frontend dependencies missing. Run:" echo " cd frontend && npm install" exit 1 fi echo "Starting backend on http://$API_HOST:$API_PORT" ( cd "$BACKEND_DIR" .venv/bin/uvicorn app.main:app --host "$API_HOST" --port "$API_PORT" ) & pids+=("$!") echo "Starting frontend" ( cd "$FRONTEND_DIR" npm run dev -- --host "$FRONTEND_HOST" ) & pids+=("$!") echo echo "Prox Visualizer is starting." echo "Backend: http://$API_HOST:$API_PORT" echo "Frontend: use the Network URL printed by Vite from another device." echo "Stop both services with Ctrl+C." echo wait