| # French Coach — custom UI frontend | |
| React + Vite app served by `app_custom.py` at `/custom/` (see | |
| `API_CONTRACT.md` for the backend contract and | |
| `../UI_UPGRADE_PLAN.md` for the overall plan). | |
| ## Dev | |
| ``` | |
| npm install | |
| npm run dev | |
| ``` | |
| `/api/...` calls are proxied to `http://localhost:7861` (run | |
| `python app_custom.py` or `docker compose up app-custom` for the backend). | |
| ## Build | |
| ``` | |
| npm run build | |
| ``` | |
| Outputs to `dist/`, which **is committed** — `app_custom.py` serves it as | |
| static files, and a Gradio-SDK Space build does not run `npm`. Rebuild and | |
| re-commit `dist/` whenever frontend source changes. | |