Cascade is a rail maintenance scheduling optimisation prototype built around the CAPO framework:
- Capture maintenance demand and available resources
- Assess time, space, resource, and safety constraints
- Prioritise work by urgency, trust, and operational value
- Optimise the nightly schedule against limited engineering hours and manpower
The app helps a duty manager turn competing maintenance requests into a conflict-aware nightly plan, understand why work was moved or deferred, and test whether adding resources would improve output.
- Maintenance request intake with trust and priority scoring
- Constraint and conflict detection across sectors, crews, equipment, and work compatibility
- Priority-weighted schedule optimisation for overnight engineering windows
- Interactive Gantt-style crew schedule
- Conflict warnings with suggested alternatives
- Resource management for crews, equipment, and sectors
- What-if simulator for extra crews, equipment, or engineering time
- Dashboard KPIs and bottleneck analysis
React + Vite frontend
|
| /api proxy
v
Express backend (Node.js)
|
v
SQLite local database
- Frontend: React 19, TypeScript, Vite, React Router, TanStack Query, Recharts, Tailwind CSS
- Backend: Express, TypeScript, built-in Node.js SQLite (
node:sqlite) - Database: generated locally in
backend/capo.dband seeded automatically on first run
- Node.js 24+
- npm
Install dependencies for both apps:
npm install
cd backend && npm install && cd ..Start frontend and backend together:
npm run dev:allOpen:
- Frontend:
http://localhost:5173 - Backend API:
http://localhost:3001/api
If port 3001 is already in use, stop the old backend process and run npm run dev:all again.
Root project:
npm run dev # start Vite frontend only
npm run dev:all # start backend + frontend together
npm run build # type-check and build frontend
npm run lint # run oxlint
npm run preview # preview frontend buildBackend:
cd backend
npm run dev # start backend in watch mode
npm run build # compile backend TypeScript
npm start # run compiled backendCascade uses a local SQLite database file under backend/. Runtime database files are intentionally ignored by git:
backend/*.db*
A fresh database is created and seeded automatically from backend/src/db/seed.ts when the backend starts and no requests exist.
GET /api/requests— list maintenance requestsPOST /api/requests— create a requestPOST /api/optimise— run scheduling optimisationGET /api/schedule— retrieve the current schedulePOST /api/what-if— simulate added resources or timeGET /api/crews— list crewsGET /api/equipment— list equipmentGET /api/sectors— list sectors
This is a hackathon/MVP prototype. It is designed for local demonstration rather than production deployment.