#!/usr/bin/env bash # Start local dev stack: node backend (sqlite) + react frontend, ws storage mode. # Usage: ./scripts/dev-start.sh # Stop: ./scripts/dev-stop.sh set -euo pipefail cd "$(dirname "$0")/.." mkdir -p tmp data # kill anything on the ports (zombies) for port in 3999 4001; do pids=$(lsof -ti :$port 2>/dev/null || true) if [ -n "$pids" ]; then echo "port $port in use by: $pids — leaving as-is." echo " (run ./scripts/dev-stop.sh first to restart clean)" fi done # backend: better-sqlite3, :4001 if ! lsof -ti :4001 >/dev/null 2>&1; then echo "starting backend :4001..." DB_PATH=$(pwd)/data/tracker.sqlite PORT=4001 \ nohup npm run server:dev > tmp/server.log 2>&1 & echo $! > tmp/server.pid else echo "backend already on :4001" fi # frontend: ws storage, :3999 if ! lsof -ti :3999 >/dev/null 2>&1; then echo "starting frontend :3999..." REACT_APP_STORAGE=ws \ REACT_APP_BACKEND_URL=http://127.0.0.1:4001 \ REACT_APP_BACKEND_WS=ws://127.0.0.1:4001/ws \ BROWSER=none PORT=3999 \ nohup npm start > tmp/fe.log 2>&1 & echo $! > tmp/fe.pid else echo "frontend already on :3999" fi # wait for ports to listen echo "waiting for ports..." for port in 4001 3999; do for i in {1..30}; do lsof -ti :$port >/dev/null 2>&1 && break sleep 1 done done echo "" echo "backend : http://127.0.0.1:4001 (curl http://127.0.0.1:4001/health)" echo "frontend : http://127.0.0.1:3999 (admin / player /display)" echo "logs : tmp/server.log tmp/fe.log" echo "stop : ./scripts/dev-stop.sh"