vite.config.ts hardcoded http://localhost:8899 across 14 proxy entries, ignoring the VITE_API_URL env that docker-compose.yml passes to the frontend service (http://vibe-trading:8899). Inside the frontend container, localhost resolves to the frontend's own network namespace, so all proxied requests (sessions, runs, skills, etc.) ECONNREFUSED. Read VITE_API_URL via loadEnv with the original localhost:8899 default, and DRY the per-route target into a single PROXY_PATHS list driven by Object.fromEntries. Closes #78