# Research: Project Launch Script ## Decision: Bash Script with `trap` and Background Processes ### Rationale A bash script is the most portable and lightweight way to meet the requirement of a single command (`./run.sh`) without introducing additional process management dependencies like `pm2` or `concurrently` (unless we want to use `npm` to run everything, but the user asked for a script). ### Alternatives Considered 1. **`concurrently` (NPM package)**: - *Pros*: Easy to use, handles output well. - *Cons*: Requires `npm install` before it can even run. The goal is a script that *handles* the install. 2. **`docker-compose`**: - *Pros*: Perfect for multi-service orchestration. - *Cons*: Overkill for a simple local dev environment; requires Docker to be installed and configured. 3. **Python script**: - *Pros*: Better cross-platform support (Windows/Linux). - *Cons*: Slightly more verbose for process management than bash on Linux. ## Technical Findings ### 1. Concurrent Execution & Graceful Shutdown To run processes concurrently and handle Ctrl+C: ```bash #!/bin/bash # Cleanup function cleanup() { echo "Stopping services..." kill $BACKEND_PID $FRONTEND_PID exit } # Trap SIGINT (Ctrl+C) trap cleanup SIGINT # Start Backend cd backend && python3 -m uvicorn src.app:app --reload --port 8000 & BACKEND_PID=$! # Start Frontend cd frontend && npm run dev -- --port 5173 & FRONTEND_PID=$! # Wait for processes wait ``` ### 2. Dependency Checking - **Backend**: Check for `venv`. If missing, create it and install requirements. - **Frontend**: Check for `frontend/node_modules`. If missing, run `npm install`. ### 3. Environment Validation - Check `command -v python3` and `command -v npm`. ## Best Practices - Use colors for logs to distinguish between Backend and Frontend output. - Use `set -e` to exit on error during setup, but disable it or handle it carefully when starting background processes.